返回市场
伯纳空间

伯纳空间

作者:bernerspace7 星标更新:2025-08-17

项目介绍

Bernerspace

一台MCP服务器 · 所有集成 · 零烦恼

GitHub stars Issues License: MIT Docs Contact

<p align="center"> <img src="assets/banner.jpg" alt="Bernerspace Banner" width="800"> </p> <p align="center"> 🚀 <b>统一所有OAuth启用集成的MCP服务器</b><br> <i>一台服务器 · 一个JWT · 多种工具</i> </p> <p align="center"> ✅ <b>当前实时集成:</b> Slack — <b>47种工具</b>已测试并可用<br> 🔜 <b>即将推出:</b> Gmail · Google Calendar · Notion<br> 🎯 <b>目标:</b> 超过100种集成 </p>

为什么

目前使用或集成MCP服务器很痛苦,因为:

  • 大多数MCP服务器缺乏OAuth功能,限制了用户体验。
  • 每个MCP服务器都需要单独部署和管理,增加了操作负担。
  • 集成混乱:不同MCP服务器上的不同身份验证层使得统一集成几乎不可能。

你能得到什么

  • 通过中间件在服务之间实现单一JWT(HS256或RS256通过JWKS;发行人/受众验证)。
  • 每个集成的OAuth中间件(Slack实时;更多即将推出),带有数据库支持的令牌存储。
  • 每个服务的一致MCP工具界面。
  • 可以自托管的统一端点,例如:

当前状态

  • 当前实时集成:Slack,有47种完全测试过的工具可用。
    → 更多关于Slack工具的信息:docs/slack/tools.md
  • 即将推出:GmailGoogle CalendarNotion

📖 文档

所有设置说明、集成指南和示例都在我们的Notion文档中:

🔗 Bernerspace 快速开始文档

文档定期更新,包括:

  • 新集成的快速开始指南
  • 分步安装说明
  • 每个工具的使用示例
  • 发展路线图和贡献指南

快速开始

  1. 环境

创建一个.env文件(参考.env.example),包含以下变量:

# 数据库
DATABASE_URL=postgresql://localhost:5432/mcp_server

# 认证(选择一种)
# 选项A:HS256
JWT_SECRET=your-jwt-signing-secret
# 选项B:RS256通过JWKS
# JWT_JWKS_URL=https://your-auth-domain/.well-known/jwks.json
# JWT_ISSUER=https://your-auth-domain/
# JWT_AUDIENCE=my-api

# Slack OAuth
SLACK_CLIENT_ID=<slack_client_id>
SLACK_CLIENT_SECRET=<slack_client_secret>
SLACK_REDIRECT_URI=http://localhost:8000/slack/oauth/callback

# 可选:加密静态令牌(逗号分隔的MultiFernet密钥)
# TOKEN_ENCRYPTION_KEYS=
  1. 安装依赖项(选择一种)
  • 使用pip
    • python3 -m venv .venv && source .venv/bin/activate
    • pip install -e .
  • 使用uv
    • uv venv && source .venv/bin/activate
    • uv pip install -e .
  1. 运行服务器
  • 使用Python
  • 使用Docker
    • docker build -t bernerspace-mcp .
    • docker run --env-file .env -p 8000:8000 bernerspace-mcp
    • 服务器将在http://localhost:8000监听
  • 使用Docker Compose
    • docker compose up -d
  1. 创建JWT调用MCP服务器
  • python generate_jwt.py --user-id <your_user_id>
  • 使用打印出的令牌作为:Authorization: Bearer TOKEN

OAuth流程(Slack)

  • GET /slack 返回 oauth_url 和授权工作区的说明。
  • Slack重定向到 SLACK_REDIRECT_URI(默认为 /slack/oauth/callback)。
  • 服务器交换代码,丰富令牌详情,并将其持久化到Postgres中。
  • 令牌存储在表 oauth_tokens 中,复合键为 (client_id, integration_type),其中 client_id = 你的JWT主体(sub)。

数据库

  • 架构由Alembic管理(包含迁移)。
  • 表:oauth_tokens(client_id, integration_type, token_json, stored_at)
  • 通过 DATABASE_URL 配置Postgres。
  • TOKEN_ENCRYPTION_KEYS 设置时,令牌可以被加密存储。

MCP客户端配置

示例客户端条目(mcp.json):

{
  "servers": {
    "slack": {
      "url": "http://localhost:8000/mcp/slack",
      "type": "http",
      "headers": {
        "Authorization": "Bearer YOUR_JWT"
      }
    }
  }
}

如果用户尚未完成OAuth,工具调用将返回一个对象,其中 requires_auth: true 并且有一个 oauth_url,你可以打开它来完成授权。

VS Code MCP客户端设置

在VS Code用户设置中使用此 mcp.json(将 JWT 替换为你生成的令牌):

{
  "servers": {
    "slack": {
      "url": "http://localhost:8000/mcp/slack",
      "type": "http",
      "headers": {
        "Authorization": "Bearer JWT"
      }
    }
  },
  "inputs": []
}

LangChain 示例

from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.prebuilt import create_react_agent

client = MultiServerMCPClient(
    {
        "slack": {
            "transport": "streamable_http",
            "url": "http://localhost:8000/mcp/slack",
            "headers": {
                "Authorization": "Bearer YOUR_TOKEN"
            },
        }
    }
)

tools = await client.get_tools()
agent = create_react_agent("openai:gpt-4.1", tools)
response = await agent.ainvoke({"messages": "Can you send hello message to my #general groups?"})

Docker

你可以使用Docker运行Bernerspace MCP:

docker build -t bernerspace-mcp .
docker run --env-file .env -p 8000:8000 bernerspace-mcp

🚀 发展路线图

我们才刚刚开始。我们的目标是支持超过100种集成,让你可以轻松地将任何第三方服务连接到你的MCP服务器。

即将推出

  • 📧 Gmail
  • 📅 Google Calendar
  • 📂 Google Drive
  • 🗂️ Notion
  • 💻 GitHub
  • 💬 Discord
  • 📊 Airtable
  • 🔍 ElasticSearch
  • 📝 Confluence

…以及更多的即将推出。

🤝 贡献

我们欢迎各种形式的贡献——无论是修复一个bug、建议一个特性、改进文档,还是仅仅分享反馈。

贡献方式

  • 给仓库点赞,展示你的支持,并帮助他人发现Bernerspace。
  • 🐛 报告一个bug,以便我们能迅速修复它。
  • 💡 请求一个特性 或提出改进建议。
  • 🛠️ 提交包含代码更改、文档更新或测试的Pull Request。

保持联系

无论你是第一次贡献者还是经验丰富的开发者,我们都期待听到你的声音并与你合作!

许可证

本项目根据MIT许可证发布。