Atlassian代理服务

一个为LibreChat提供Atlassian OAuth 2.0认证和MCP请求转发的HTTP代理服务,简化了与Atlassian MCP服务器的集成。

  • by laurentpaprika
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 laurentpaprika/mcp-atlassian-proxy

使用说明

MCP Atlassian代理

Atlassian模型上下文协议(MCP)服务器的一个小型HTTP代理,它:

  • 手柄 Atlassian OAuth 2.0(3LO) 每个librechat用户
  • 商店 访问/刷新令牌 在Redis中
  • 注射用户的 承载令牌+云ID 转化为发送到上游的请求 mcp-atlassian 服务器
  • 规范化 可流式传输http (SSE风格)MCP响应,以便简单的前端(或LibreChat)可以使用它们

目标是保持LibreChat的MCP集成简单,同时将所有Atlassian特定的身份验证复杂性卸载到此代理中。


1.高层架构

组件

  • LibreChat(UI+MCP客户端)

    • 通过HTTP与此代理进行对话(/mcp/forward)
    • 可选地使用小型前端触发Atlassian登录
  • MCP Atlassian代理(本项目)

    • 暴露:
      • /oauth/atlassian/start –启动基于浏览器的Atlassian 3LO
      • /oauth/atlassian/callback –OAuth重定向类型
      • /auth/status –检查给定用户的令牌是否存在
      • /mcp/forward –将MCP JSON-RPC请求转发到 mcp-atlassian
    • 用途 瑞迪斯 用于令牌存储
  • Atlassian MCP服务器(mcp-atlassian)

    • 官方 ghcr.io/sooperset/mcp-atlassian 图像
    • 暴露 /mcp 具有可流式传输的http(SSE over http POST)
    • 接受:
      • Authorization: Bearer <access_token>
      • Atlassian-Cloud-Id: <cloud_id>
  • 瑞迪斯

    • 由LibreChat键入的共享令牌存储 user_id

典型流量

1.用户身份验证(3LO)

  1. 用户点击 “连接Atlassian” 在一个简单的前端
  2. 前端呼叫:
    GET /oauth/atlassian/start?user_id=<LIBRECHAT_USER_ID>
  3. 代理重定向到Atlassian授权URL: https://auth.atlassian.com/authorize?...
  4. 用户认证+同意
  5. Atlassian重定向回: GET /oauth/atlassian/callback?code=...&state=...
  6. 代理:
    • 交易所 code 对于代币(access_token, refresh_token, expires_in, scope)
    • 呼叫Atlassian discovery查找 cloud_id
    • 坚持一切 瑞迪斯 根据给定 user_id
  7. Proxy显示一个简单的确认页面:
    “Atlassian已连接✅ 你可以回到LibreChat。”

2.来自LibreChat的MCP呼叫

  1. LibreChat通过HTTP POST将MCP JSON-RPC发送到:
    POST /mcp/forward
    标题包括以下内容:

    • X-User-ID: <LIBRECHAT_USER_ID>
  2. 代理:

    • 为此在Redis中查找令牌 user_id
    • 如果丢失→ 返回HTTP 401 使用JSON正文:
      {
        "error": "ATLASSIAN_AUTH_REQUIRED",
        "message": "No tokens stored for user",
        "user_id": "<LIBRECHAT_USER_ID>"
      }
      
    • 如果存在且已过期→ 使用Atlassian 3LO令牌端点刷新令牌
    • 将MCP主体转发到 mcp-atlassian:
      POST http://mcp-atlassian:8000/mcp
      Authorization: Bearer <access_token>
      Atlassian-Cloud-Id: <cloud_id>
      MCP-Session-ID: <proxy-generated-or-forwarded>
      Content-Type: text/event-stream
      
  3. mcp-atlassian 响应为 上海证券交易所 (服务器发送的事件)包含一个或多个 data: 线。

  4. 代理解析SSE流,提取 最后一个MCP JSON payload,并将其作为单个JSON响应返回给客户端:

     {
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/list",
       "params": {}
     }
    
    {
      "jsonrpc": "2.0",
      "id": 1,
      "method": "tools/call",
      "params": {
        "name": "confluence_search",
        "arguments": {
          "query": "title ~ \"Theophile\" AND type=page",
          "limit": 10,
          "spaces_filter": null
        }
      }
    }
    

2.配置

所有行为都是通过环境变量控制的。

Atlassian OAuth(3LO)

必需变量

  • ATLASSIAN_CLIENT_ID
  • ATLASSIAN_CLIENT_SECRET
  • ATLASSIAN_REDIRECT_URI

必须与Atlassian开发人员控制台中注册的重定向URI匹配。
例子: https://your-domain.example.com/oauth/atlassian/callback

可选变量

  • ATLASSIAN_AUTH_BASE_URL (默认值: https://auth.atlassian.com)
  • ATLASSIAN_API_BASE_URL (默认值: https://api.atlassian.com)
  • ATLASSIAN_SCOPE (空格分隔的范围),示例:
read:confluence-space.summary
read:confluence-props
read:confluence-content.all
read:confluence-content.summary
search:confluence
read:jira-work
offline_access

瑞迪斯

变量:

REDIS_URL

例子:

redis://redis:6379/0

典型密钥格式:

atlassian:tokens:<user_id>

存储JSON示例:

{
  "access_token": "...",
  "refresh_token": "...",
  "expires_at": 1763895800,
  "scope": "read:confluence-content.all read:jira-work offline_access",
  "cloud_id": "e2adebfa-67ae-44fc-97c8-4dba48249464"
}

代理/MCP

  • MCP_ATLASSIAN_URL --上游MCP Atlassian服务器的URL
  • FLASK_ENV — development 或 production
  • APP_HOST --默认值: 0.0.0.0
  • APP_PORT --默认值: 9100