使用说明
mcp继电器套件
一个MCP服务器,用于所有工具。两个工具。约2000个代币。
您添加的每个MCP服务器都会将其完整的工具列表转储到您的AI上下文中。仅官方的Asana MCP就使用了25000多个代币。添加Sentry、GitHub、Linear和PostHog,在对话开始之前,你已经销毁了10万多个代币。
MCP Relay Kit位于您的AI工具和服务之间,通过以下方式公开所有内容 2工具 — search 和 execute --固定成本约为2000个代币。增加5项服务或50项;上下文成本保持不变。
运作原理
Your AI tool
│
├─ search("post comment to asana")
│ → returns: asana.post_comment schema + params
│
└─ execute("asana", "post_comment", {"task_id": "123", "text": "Done"})
→ calls Asana API, returns result
你的AI呼叫 search 那么,去发现什么是可用的 execute 使用它。
为什么采用这种方法
上下文成本。 每个MCP服务器都将其完整的工具列表注入上下文窗口。一台配备20个工具的服务器可能需要15000个令牌。五台服务器,仅在代码、对话或文件之前,就有75000多个令牌因工具定义而丢失。中继将所有这些压缩为2个工具定义,大约2000个令牌,无论背后有多少服务。
更少的错误。 加载了5+MCP服务器后,您的AI有100多种工具可供选择。它经常选择错误的参数或产生幻觉。通过中继,AI首先进行搜索(search("create issue")),返回确切的模式,然后调用它。更少的猜测,更少的重试。
一个配置,一个进程。 您可以管理一个中继配置,而不是管理5个单独的MCP服务器配置。一个开始的过程,一个添加凭据的地方,一个在出现故障时进行调试的地方。
开始
从npm安装
npm install -g mcp-relay-kit
# or: npm install -g @clockwork-is/mcp-relay-kit
交互式设置
配置所有内容的最快方法:
npx mcp-relay-kit --setup
这将引导您完成选择服务、输入凭据和配置AI工具(Claude Code、Gemini CLI、Cursor、Windsurf或Codex)的过程。
手动设置
1.克隆和构建
git clone https://github.com/SGudbrandsson/mcp-relay-kit.git
cd mcp-relay-kit
npm install && npm run build
2.创建配置文件
{
"services": {
"asana": {
"token": "${ASANA_TOKEN}",
"workspace": "your-workspace-gid"
},
"sentry": {
"token": "${SENTRY_AUTH_TOKEN}",
"organization": "your-org",
"project": "your-project"
}
}
}
将此另存为 ~/.config/mcp-relay-kit/config.json (或你喜欢的任何一条路)。
价值观包裹在 ${VAR} 在启动时从环境变量中解析。
3.将AI工具指向继电器
将此添加到您的项目 .mcp.json:
{
"mcpServers": {
"relay": {
"command": "mcp-relay-kit",
"env": {
"GATEWAY_CONFIG": "/path/to/your/config.json"
}
}
}
}
如果全局安装, mcp-relay-kit 可作为命令使用。否则使用 npx mcp-relay-kit 或完整路径 node_modules/.bin/mcp-relay-kit.
代理任何MCP服务器
已经在GitHub、Slack或其他任何平台上使用MCP服务器了吗?将其添加到中继中,而不是直接加载它——功能相同,只是上下文成本的一小部分。
{
"services": {
"asana": { "token": "..." }
},
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": { "GITHUB_TOKEN": "ghp_..." }
}
}
}
中继将每个MCP服务器作为子进程生成,在启动时发现其工具,并通过相同的方式公开它们 search 和 execute 界面。一台拥有20多种工具的服务器仍然只需要大约2000个代币。
这 mcpServers 格式与Claude Code、Cursor和其他AI工具使用的格式相同,因此您通常可以从您的 .mcp.json 进入继电器配置。
工具
继电器恰好暴露了2个MCP工具:
search(query)
发现所有已配置服务中的可用操作。
- 查询 (string):搜索文本--匹配服务名称、操作名称和描述
- 返回:具有参数模式的匹配操作数组
search("task comment")
→ [
{ service: "asana", action: "post_comment", params: { task_id: {...}, text: {...} } },
{ service: "asana", action: "get_task", params: { task_id: {...} } }
]
传递一个空字符串以列出所有可用操作。
execute(service, action, params)
对服务调用特定操作。
- 服务 (string):服务名称(例如“asana”)
- 行动 (string):动作名称(例如“post_comment”)
- 参数 (string):JSON参数字符串(例如。,
{"task_id": "123", "text": "Done"})
execute("asana", "post_comment", '{"task_id": "123", "text": "PR merged"}')
→ { success: true, data: { gid: "456", text: "PR merged" } }
内置服务
阿萨纳
项目管理——任务、评论和项目跟踪。
| 动作 | 描述 |
|---|---|
get_task |
通过GID获取任务详细信息 |
update_task |
更新任务名称、注释、状态、截止日期、受让人 |
create_task |
在项目中创建新任务 |
post_comment |
对任务发表评论 |
search_tasks |
按文本查询搜索任务 |
list_project_tasks |
列出项目中的任务(默认情况下不完整) |
配置:
{
"token": "your-personal-access-token",
"workspace": "your-workspace-gid"
}
哨兵
错误跟踪--列出、检查和管理问题和事件。
| 动作 | 描述 |
|---|---|
list_issues |
使用可选的Sentry搜索查询列出项目的问题 |
get_issue |
按ID获取特定问题的详细信息 |
get_issue_events |
获取问题的事件(事件) |
get_event_details |
获取完整的事件详细信息,包括堆栈跟踪 |
resolve_issue |
将问题标记为已解决 |
unresolve_issue |
重新打开已解决的问题 |
update_issue |
更新问题(分配、更改状态、设置优先级) |
配置:
{
"token": "your-sentry-auth-token",
"organization": "your-org-slug",
"project": "your-project-slug"
}
线性
问题跟踪——通过GraphQL创建、更新、搜索和管理问题和项目。
| 动作 | 描述 |
|---|---|
search_issues |
按文本查询搜索问题 |
get_issue |
通过标识符获取问题的详细信息(例如“ENG-123”) |
create_issue |
创建新问题 |
update_issue |
更新现有问题 |
delete_issue |
存档问题 |
list_teams |
列出所有团队(用于查找团队ID) |
list_projects |
列出项目,可选择按团队筛选 |
list_workflow_states |
列出团队的工作流状态 |
add_comment |
向问题添加评论 |
list_labels |
列出可用的问题标签 |
配置:
{
"token": "your-linear-api-key"
}
后霍格
产品分析——查询事件、人员、会话记录和见解。
| 动作 | 描述 |
|---|---|
query_events |
查询最近发生的事件,可按类型、人员和日期范围进行筛选 |
get_person |
通过ID或distinct_ID获取人员 |
search_persons |
通过电子邮件或房产搜索人员 |
get_person_events |
获取一个人的所有事件(活动时间线) |
query_insights |
通过ID获取保存的洞察(趋势、漏斗等) |
list_cohorts |
列出所有队列 |
get_session_recordings |
查找会话记录,可按人和日期过滤 |
get_session_recording |
获取包含事件和详细信息的特定会话记录 |
配置:
{
"token": "your-posthog-personal-api-key",
"project_id": "your-project-id"
}
Figma
设计平台——检查文件、导出图像、管理评论和浏览团队库。
| 动作 | 描述 |
|---|---|
get_file |
按关键字(文档结构、组件、元数据)获取Figma文件 |
get_file_nodes |
通过ID从文件中获取特定节点 |
get_images |
将节点渲染为图像(PNG、JPG、SVG或PDF) |
get_comments |
获取文件的评论 |
post_comment |
在文件上发表评论(支持线程回复) |
get_file_components |
在文件中获取已发布的组件 |
get_file_styles |
在文件中获取已发布的样式 |
get_image_fills |
获取用作填充的所有图像(照片、纹理、背景)的下载URL |
get_team_projects |
列出团队的项目 |
get_project_files |
列出项目中的文件 |
get_team_components |
获取团队库的已发布组件 |
get_team_styles |
获取团队库的已发布样式 |
get_file_versions |
获取文件的版本历史记录 |
配置:
{
"token": "your-figma-personal-access-token",
"team_id": "your-team-id"
}
添加您自己的服务
- 创建
src/services/your-service.ts:
import type { ServiceAdapter, ServiceAction } from '../types.js';
const actions: ServiceAction[] = [
{
name: 'do_something',
description: 'What this action does',
params: {
id: { type: 'string', description: 'Resource ID', required: true },
optional_field: { type: 'string', description: 'Optional', required: false },
},
execute: async (params, config) => {
const token = config.token as string;
// Call your API...
return result;
},
},
];
export const yourServiceAdapter: ServiceAdapter = {
name: 'your-service',
description: 'What this service does',
actions,
};
- 注册于
src/services/index.ts:
import { yourServiceAdapter } from './your-service.js';
export const availableAdapters: Record<string, ServiceAdapter> = {
asana: asanaAdapter,
'your-service': yourServiceAdapter, // add here
};
- 在项目的网关配置中添加配置:
{
"services": {
"asana": { "token": "..." },
"your-service": { "token": "...", "other_config": "..." }
}
}
中继会自动注册适配器注册表和配置文件中出现的任何服务。
同一服务的多个实例
您可以使用以下命令使用不同的配置多次注册同一服务 service:label 配置键中的语法:
{
"services": {
"sentry:production": {
"token": "${SENTRY_PROD_TOKEN}",
"organization": "my-org",
"project": "prod-backend"
},
"sentry:staging": {
"token": "${SENTRY_STAGING_TOKEN}",
"organization": "my-org",
"project": "staging-backend"
},
"supabase": {
"token": "${SUPABASE_TOKEN}",
"service_role_key": "${SUPABASE_SERVICE_ROLE_KEY}",
"project_ref": "abcdefghij"
}
}
}
- 使用
service:label创建命名实例(例如。,"sentry:production","supabase:app-db") - 普通按键,如
"supabase"仍然适用于单个实例 - 每个实例都有自己的配置,并在搜索结果中单独显示
- 调用execute时使用完整实例名:
execute("sentry:production", "list_issues", "{}") - 搜索与服务类型和标签都匹配,因此搜索“生产”可以找到所有生产实例
按项目配置
不同的项目可以使用指向不同服务的不同配置:
~/.config/mcp-relay-kit/
├── project-a.json → asana + slack + sentry
├── project-b.json → asana + github
└── personal.json → asana
每个项目的 .mcp.json 通过指向其自己的配置 GATEWAY_CONFIG.
测试
npm test # run all tests
npm run test:watch # watch mode
测试涵盖了服务注册表(搜索、执行、验证)、配置加载(环境变量插值、错误处理)、每个内置适配器(模拟HTTP)以及启动真正的MCP服务器进程并通过stdio通信的E2E测试。
许可证
麻省理工学院
