多服务集成中继工具

一个用于集成和管理多个AI工具服务的中间件,通过统一的搜索和执行接口减少上下文开销。

  • by SGudbrandsson
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 SGudbrandsson/mcp-gateway

使用说明

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"
}

添加您自己的服务

  1. 创建 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,
};
  1. 注册于 src/services/index.ts:
import { yourServiceAdapter } from './your-service.js';

export const availableAdapters: Record<string, ServiceAdapter> = {
  asana: asanaAdapter,
  'your-service': yourServiceAdapter,  // add here
};
  1. 在项目的网关配置中添加配置:
{
  "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测试。

许可证

麻省理工学院