MCP代理服务
一种代理服务器,允许多个租户通过模型上下文协议使用自己的隔离凭据和访问工具连接到集成应用程序的MCP服务器。
服务介绍
多租户MCP服务器
一个多租户模型上下文协议(MCP)服务器,允许多个租户使用自己的凭证连接到集成应用程序的MCP服务器。
特性
- 支持多租户并具有隔离连接
- 数据库持久化存储租户信息
- 从集成应用程序实时发现工具
- 审计日志
- 速率限制和安全中间件
- 健康检查端点
- 优雅关闭处理
前提条件
- Node.js >= 18.0.0
- PostgreSQL数据库
- 集成应用程序账户和凭证
环境变量
创建一个.env文件,并包含以下变量:
env
服务器配置
PORT=3000
NODE_ENV=development
数据库
DATABASE_URL="postgresql://user:password@localhost:5432/mcp_service"
安全
ADMIN_API_KEY="your-admin-api-key"
安装
-
克隆仓库:
bash
git clone
cd mcp-service -
安装依赖项:
bash
npm install -
运行数据库迁移:
bash
npm run migrate -
启动服务器:
bash
npm start
开发模式下运行:
bash
npm run dev
API端点
健康检查
GET /health
创建租户
POST /api/tenants
Authorization: Bearer
{
"integrationKey": "hubspot|notion|etc",
"integrationAppToken": "your-integration-app-token"
}
列出工具
POST /api/tenant/:tenantId/tool
Authorization: Bearer
{
"method": "listTools"
}
执行工具
POST /api/tenant/:tenantId/tool
Authorization: Bearer
{
"method": "tool-name",
"params": {
// 工具参数
}
}
部署
Heroku
-
创建一个新的Heroku应用:
bash
heroku create -
添加PostgreSQL插件:
bash
heroku addons:create heroku-postgresql:hobby-dev -
设置环境变量:
bash
heroku config:set NODE_ENV=production
heroku config:set ADMIN_API_KEY=your-admin-api-key -
部署:
bash
git push heroku main
Docker
-
构建镜像:
bash
docker build -t mcp-service . -
运行容器:
bash
docker run -p 3000:3000
-e DATABASE_URL=postgresql://user:password@host.docker.internal:5432/mcp_service
-e ADMIN_API_KEY=your-admin-api-key
mcp-service
开发
数据库迁移
创建新的迁移:
bash
npx prisma migrate dev --name migration-name
应用迁移:
bash
npm run migrate
测试
运行测试:
bash
npm test
运行代码检查器:
bash
npm run lint
架构
服务器作为多租户代理,位于MCP客户端和集成应用程序的MCP服务器之间:
MCP Client -> 多租户服务器 -> 集成应用程序MCP服务器
(代理/路由器)
每个租户获得:
- 独立的MCP客户端连接
- 单独的集成应用程序凭证
- 独立的工具发现
- 审计日志
安全
- 每个租户的速率限制
- CORS保护
- Helmet安全头
- 请求ID跟踪
- 审计日志
- 基于令牌的身份验证
监控
/health端点提供:
- 服务器状态
- 活跃租户数量
- 数据库连接状态
- 内存使用情况
- 运行时间
许可证
MIT
MCP服务文档
概述
此服务通过模型上下文协议(MCP)提供一个多租户API来管理集成和工具。每个租户都是隔离的,只能访问他们自己的工具和数据。
1. 创建租户
要创建新租户,您必须拥有管理员令牌。请按照以下步骤操作:
第一步:获取管理员令牌
发送POST请求到/api/auth/token,并附上您的管理员API密钥:
bash
curl -X POST https:///api/auth/token
-H "Content-Type: application/json"
-d {"key": "<ADMIN_API_KEY>"}
响应:
json
{"token": "<ADMIN_JWT_TOKEN>"}
第二步:创建租户
发送POST请求到/api/tenants,并在Authorization头部中附上管理员令牌:
bash
curl -X POST https:///api/tenants
-H "Content-Type: application/json"
-H "Authorization: Bearer <ADMIN_JWT_TOKEN>"
-d {
"name": "",
"integrationKey": "",
"integrationAppToken": ""
}响应:
json
{
"tenantId": "tenant-xxxxxxx",
"apiKey": "<TENANT_API_KEY>",
...
}
2. 生成租户令牌
要以租户身份与 API 交互,您需要一个租户 JWT 令牌。使用租户的 API 密钥生成它:
bash
curl -X POST https:///api/auth/tenant-token
-H "Content-Type: application/json"
-H "x-api-key: <TENANT_API_KEY>"
响应:
json
{"token": "<TENANT_JWT_TOKEN>"}
3. 列出租户可用的工具
要列出租户可用的工具,请使用以下端点,并同时提供租户 API 密钥和 JWT 令牌:
bash
curl -X POST https:///api/tenant//tool
-H "Content-Type: application/json"
-H "x-api-key: <TENANT_API_KEY>"
-H "Authorization: Bearer <TENANT_JWT_TOKEN>"
-d {"method": "listTools"}
响应:
json
{
"tools": [
{ "name": "create-contact", ... },
...
]
}
4. 作为租户执行工具
要执行一个工具(例如,创建联系人):
bash
curl -X POST https:///api/tenant//tool
-H "Content-Type: application/json"
-H "x-api-key: <TENANT_API_KEY>"
-H "Authorization: Bearer <TENANT_JWT_TOKEN>"
-d {
"method": "create-contact",
"params": {
"email": "test.user@example.com",
"fullName": "Test User"
}
}
响应:
json
{
"content": [
{ "type": "text", "text": "{"id":"120688589560"}" }
],
"isError": false
}
5. 连接 MCP 客户端应用程序
要将 MCP 客户端连接为租户:
- 使用租户的
integrationKey和integrationAppToken(来自租户创建响应)来初始化客户端。 - 如上所示,使用租户 API 密钥和租户 JWT 令牌对 API 请求进行身份验证。
示例客户端初始化:
js
const client = new IntegrationAppClient({
token:
});
const integration = await client.integration( ).get();
// ...
6. 故障排除
- 确保在数据库外键引用中使用正确的租户
id而不是tenantId。 - 所有特定于租户的 API 调用都需要租户 API 密钥和 JWT 令牌。
- 如果遇到外键错误,请检查您的数据库模式和迁移。
- 对于速率限制问题,如果您在代理后面运行,请考虑设置
app.set('trust proxy', 1)(参见 Express 速率限制文档)。
7. 示例 .env 文件
DATABASE_URL=postgresql://user:password@host:port/dbname
ADMIN_API_KEY=your_admin_api_key
8. 有用的端点
POST /api/auth/token— 获取管理员令牌POST /api/tenants— 创建租户(仅限管理员)POST /api/auth/tenant-token— 获取租户 JWT 令牌POST /api/tenant/:tenantId/tool— 作为租户列出或执行工具
有关更多详细信息,请参阅 src/server.ts 和 src/api/auth.ts 中的代码。