OmniRoute MCP Server 全解析:内置智能工具库、作用域认证与三种传输方式的模型上下文协议服务端
【免费下载链接】OmniRouteNever stop coding. Free MIT AI gateway: one endpoint, 352 providers (150+ free), 1200+ models Kimi, Claude, GPT, Gemini, GLM, DeepSeek, MiniMax. Works with Claude Code, Codex, Cursor, OpenCode, Cline & Copilot. Quota-aware auto-fallback, RTK+Caveman compression saves 15-95% tokens, MCP/A2A, Desktop/PWA. Built by 550+ contributors项目地址: https://gitcode.com/GitHub_Trending/om/OmniRoute
OmniRoute 将 Model Context Protocol(MCP)Server 直接内置于网关进程,开箱即用。它向 Claude Desktop、Cursor、Claude Code 等 MCP 客户端暴露一组以
omniroute_为前缀的智能工具,覆盖路由、组合(Combo)、配额、成本、模型目录、搜索等运维能力;工具调用全部经由 API Key 作用域(scope)鉴权,并记录到 SQLite 审计表。阅读本文后,你将掌握如何启动 MCP Server、配置 IDE 客户端、理解每个工具及其所需 scope、按需裁剪工具清单,以及如何在远程环境安全暴露/api/mcp/*端点。
本文以仓库 docs/i18n/ja/docs/frameworks/MCP-SERVER.md(日语版文档)为骨架,并结合英文主文档 docs/frameworks/MCP-SERVER.md 与open-sse/mcp-server/源码展开。
1. 架构总览:MCP Server 与路由网关同进程运行
OmniRoute 的 MCP Server 不是一个独立部署的服务,而是内置于网关主进程中的一套 MCP 工具注册层。其核心入口是 open-sse/mcp-server/server.ts 中的createMcpServer()工厂函数:它创建一个官方@modelcontextprotocol/sdk的McpServer实例,依次注册「45 个核心定义工具 + 内存/技能/插件/Notion/Obsidian/本地语料/压缩等扩展工具组」,最终由 toolCount.ts 中的countUniqueMcpTools()对全部工具集合按工具名去重,得出唯一工具总数(英文主文档标注当前为 110 个;日语版文档描述的是其中 16 个核心智能工具)。
// open-sse/mcp-server/server.ts#L111-L124(节选) const TOTAL_MCP_TOOL_COUNT = countUniqueMcpTools({ MCP_TOOLS, memoryTools, skillTools, agentSkillTools, githubSkillTools, poolTools, gamificationTools, pluginTools, notionTools, obsidianTools, localCorpusTools, compressionTools, });每个工具在注册时都会被withScopeEnforcement()(server.ts)包裹一层作用域校验:调用前解析调用者的 scope 上下文,不满足则拒绝调用并写入scope_denied:<reason>审计记录。这一机制保证「网关内部 API 操作」与「MCP 客户端可见面」之间始终有鉴权边界。
2. 安装与启动
MCP Server 随 OmniRoute 内置,无需单独安装。两种启动方式:
# 方式一:独立 stdio 进程(供 IDE / 本地 MCP 客户端拉起) omniroute --mcp# 方式二:随 open-sse 传输层自动启动(HTTP) # MCP 自动挂载在 /mcp 端点(端口 20130 为 --dev 开发模式) omniroute --devstdio 入口对应 server.ts 的startMcpStdio():先初始化数据库(ensureDbInitialized),再创建StdioServerTransport,并启动运行时心跳(每 5 秒写入mcp-heartbeat.json),进程退出/SIGINT/SIGTERM时停止心跳并关闭审计数据库。
3. 三种传输方式(Transport)
所有传输方式都基于同一个createMcpServer()工厂,仅接入的传输层不同:
| 传输方式 | 位置 | 适用场景 |
|---|---|---|
stdio | open-sse/mcp-server/server.ts | Claude Desktop、Cursor 等 IDE 本地集成 |
sse | POST/GET /api/mcp/sse(httpTransport) | 需要事件流的浏览器 / Agent 客户端 |
streamable-http | POST/GET/DELETE /api/mcp/stream | 多会话 HTTP 客户端(依赖mcp-session-id头) |
活跃的 HTTP 传输类型由设置项mcpTransport决定(sse或streamable-http),切换传输会关闭另一传输上的既有会话。HTTP 传输层实现在 httpTransport.ts:SSE 采用单例服务器(每次initialize重置),Streamable HTTP 则为每个会话维护独立的McpServer+WebStandardStreamableHTTPServerTransport,并有 5 分钟空闲回收(MCP_SESSION_IDLE_MS)与未知会话 404 / 过期会话自动重建等容错逻辑(httpTransport.ts)。
3.1 远程访问(manage-scope 旁路)
/api/mcp/*默认属于 LOCAL_ONLY 网络层级(见 docs/security/ROUTE_GUARD_TIERS.md),仅回环地址(localhost、127.0.0.1、::1)可访问。自 v3.8.2 起,非回环客户端只要携带Authorization: Bearer <api-key>且该 Key 具有managescope,即可通过隧道、反向代理或公网域名访问远程 MCP Server:
# 先为 API Key 授予 manage scope(Dashboard「API Keys」页面开启 Management Access, # 或创建时指定 scopes:["manage"]),然后从远程 MCP 客户端连接: curl -i \ -H "Host: your-public-host.example" \ -H "Authorization: Bearer sk-…" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"my-client","version":"0"}}}' \ https://your-public-host.example/api/mcp/stream使用非manageKey(或缺失 Bearer 头)将返回403 LOCAL_ONLY。需要说明的是,同级前缀/api/cli-tools/runtime/*刻意不提供该旁路。
3.2mcp:connect窄权限替代方案
对于只需要访问 MCP 的远程调用方,全量managescope 过于宽泛。src/shared/constants/managementScopes.ts导出了窄权限 scopemcp:connect:它仅授权/api/mcp/的 LOCAL_ONLY 旁路,不授予任何其他管理路由访问权,且刻意不包含在MANAGEMENT_API_KEY_SCOPES中。持有manage/admin的 Key 行为不变,mcp:connect是更低权限的远程 MCP 专用选项。
3.3 按 Key 的 HTTP 作用域绑定
在 HTTP/SSE 上,httpTransport.ts 通过resolveMcpCallerAuthInfo()解析调用方真实api_keys.scopes,并将其作为authInfo传给 MCP SDK 的transport.handleRequest(req, { authInfo }),从而让每个工具调用收到的extra.authInfo.scopes反映 Bearer Key 自身的 scope(取代OMNIROUTE_MCP_SCOPES环境变量回退)。当无法解析到有效 Key(无头、Key 无效)时authInfo保持undefined,回退链不变;stdio 没有每调用方身份,仍走_meta/环境变量回退链(见 mcpCallerIdentity.ts)。
4. 核心工具清单
4.1 基础工具(Essential Tools,8 个)
| 工具 | 说明 |
|---|---|
omniroute_get_health | 网关健康状态:熔断器、运行时长等 |
omniroute_list_combos | 所有已配置组合(Combo)及其模型 |
omniroute_get_combo_metrics | 指定组合的性能指标 |
omniroute_switch_combo | 按 ID/名称切换激活的组合 |
omniroute_check_quota | 按 Provider(或全部)查询配额状态 |
omniroute_route_request | 通过 OmniRoute 智能路由发送一次补全请求 |
omniroute_cost_report | 指定时间段的成本分析 |
omniroute_list_models_catalog | 完整模型目录(含能力标签) |
以omniroute_get_health为例,其处理函数(server.ts)并行拉取/api/monitoring/health、/api/resilience、/api/rate-limits三个内部端点,聚合出运行时长、内存、熔断器、限流、缓存命中率、自适应准入(adaptive admission)等字段;任一内部源失败时不会静默伪装为「零数据」,而是显式返回degraded数组,便于 Agent 判断数据可信度。
4.2 高级工具(Advanced Tools,8 个)
| 工具 | 说明 |
|---|---|
omniroute_simulate_route | 路由 dry-run 模拟,输出回退树 |
omniroute_set_budget_guard | 会话预算,支持 degrade/block/alert 三种动作 |
omniroute_set_resilience_profile | 套用 conservative/balanced/aggressive 预设 |
omniroute_test_combo | 通过真实上游请求实测组合内全部模型 |
omniroute_get_provider_metrics | 单个 Provider 的详细指标 |
omniroute_best_combo_for_task | 任务适配度推荐(含备选方案) |
omniroute_explain_route | 解释历史路由决策 |
omniroute_get_session_snapshot | 完整会话快照:成本、Token、错误 |
omniroute_route_request(server.ts)的内部实现展示了「MCP 工具 → 网关 API」的调用链:工具固定以非流式方式请求/v1/chat/completions,并带上x-combo头指定组合;由于该跳转要等待上游 Provider(以及 auto-combo 候选探测),它使用独立的 upstream 超时预算(OMNIROUTE_MCP_UPSTREAM_TIMEOUT_MS,默认 60s),而不是管理读操作的 10s 预算。返回结果同时携带routing(provider、combo、回退触发次数、成本、延迟)与响应内容,让 Agent 一次调用即可获得「答了什么 + 路由怎么走」。
4.3 扩展工具组
日语版文档之外,英文主文档与源码还展示了更完整的工具面(均可在tools/list中看到):
- 缓存工具(2):
omniroute_cache_stats、omniroute_cache_flush; - 压缩工具(13):压缩状态/配置/引擎切换,以及 CCR(Caller-Isolated Content Retrieval,内存态、按调用方隔离的内容块)的
omniroute_ccr_store/retrieve/inspect/list/delete/stats生命周期工具和omniroute_rtk_discover/learn; - 1Proxy 工具(3):
omniroute_oneproxy_fetch/rotate/stats(免费代理池); - 内存工具(3):
omniroute_memory_search/add/clear(memoryTools.ts); - 技能工具(4):
omniroute_skills_list/enable/execute/executions(skillTools.ts); - Agent 技能目录工具(3):
omniroute_agent_skills_list/get/coverage(agentSkillTools.ts); - Notion 上下文源(6)、Obsidian(22)、本地语料(3)、插件(8)、游戏化(8)、搜索类(
omniroute_web_search、omniroute_x_search、omniroute_web_fetch、omniroute_tool_search)与Radar(omniroute_radar_catalog)等。
另外,已启用的技能还会被动态注册为skill_<name>形式的工具(见 server.ts),与RESERVED_MCP_NAMES冲突的名称会被跳过。
5. 认证与作用域(Scopes)
MCP 工具全部通过 API Key scope 鉴权。scope 评估集中实现在 open-sse/mcp-server/scopeEnforcement.ts,调用者的 scope 来源优先级为:authInfo(HTTP 上由 Bearer Key 解析)→_meta(SDK 元数据)→OMNIROUTE_MCP_SCOPES环境变量 → 空集(scopeEnforcement.ts)。
16 个核心工具对应的 scope 映射如下(与日语版文档一致):
| Scope | 工具 |
|---|---|
read:health | get_health、get_provider_metrics |
read:combos | list_combos、get_combo_metrics |
write:combos | switch_combo |
read:quota | check_quota |
write:route | route_request、simulate_route、test_combo |
read:usage | cost_report、get_session_snapshot、explain_route |
write:config | set_budget_guard、set_resilience_profile |
read:models | list_models_catalog、best_combo_for_task |
注:英文主文档中的最新映射粒度更细(如
route_request归入execute:completions、set_budget_guard归入write:budget、set_resilience_profile归入write:resilience),完整映射见 docs/frameworks/MCP-SERVER.md。以你安装版本的tools/list返回为准。
关键行为要点:
- 通配符 scope:
read:*授予全部读类 scope,*授予全部权限(scopeMatches()支持前缀通配,见 scopeEnforcement.ts)。 - 强制开关:
OMNIROUTE_MCP_ENFORCE_SCOPES默认false(仅字符串"true"才开启)。开启后缺失 scope 的调用会被拒绝,并以scope_denied:<reason>记录审计。 - 默认可用 scope:
OMNIROUTE_MCP_SCOPES(逗号分隔)作为调用方未自带 scope 时的默认可用集。 - 拒绝响应:被拒绝的工具调用返回
isError: true的文本结果,附上缺失 scope 清单与调用方标识(callerId、source),并写入_scopeCheck审计字段(server.ts)。
6. 审计日志
每一次工具调用都会被记录到 SQLite 的mcp_tool_audit表(实现见 open-sse/mcp-server/audit.ts 的logToolCall()):
- 工具名、输入 SHA-256 哈希(绝不落盘明文提示词)、输出摘要(截断为 200 字符);
- 耗时(ms)、成功/失败标记与错误码;
- API Key 哈希(
OMNIROUTE_API_KEY_ID)、时间戳; - scope 拒绝记录为
scope_denied:<reason>。
审计写入失败不会影响工具执行(try/catch 吞掉并打印告警)。数据库驱动优先better-sqlite3,不可用时自动回退到 Node 22.5+ 内置的node:sqlite。可通过 Dashboard 或 REST 端点/api/mcp/audit、/api/mcp/audit/stats查询(后者聚合 24 小时内的调用总数、成功率、平均耗时与 Top 10 工具)。
7. 环境变量参考
| 变量 | 默认值 | 说明 |
|---|---|---|
OMNIROUTE_BASE_URL | http://localhost:20128 | MCP Server 调用 OmniRoute 内部 API 的基地址 |
OMNIROUTE_API_KEY | (空) | 作为Authorization: Bearer转发给内部 API 调用(仅回退用,调用方身份优先) |
OMNIROUTE_MCP_ENFORCE_SCOPES | false(仅"true"开启) | 开启后缺失 scope 拒绝工具调用并记录scope_denied:<reason> |
OMNIROUTE_MCP_SCOPES | (空) | 逗号分隔的默认可用 scope 白名单 |
OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS | 未设置 = 开启 | 设为0/false/off/no时禁用 MCP 描述压缩 |
OMNIROUTE_MCP_DESCRIPTION_COMPRESSION | 未设置 = 开启 | 同上开关的别名 |
OMNIROUTE_MCP_FETCH_TIMEOUT_MS | 10000 | 内部管理读操作(health/resilience/combos/quota/usage)的终止预算 |
OMNIROUTE_MCP_UPSTREAM_TIMEOUT_MS | 60000 | 等待 Provider 的跳转(route_request、web_search、web_fetch)的终止预算 |
MCP_TOOL_DENY | 未设置 = 不过滤 | 逗号分隔、从tools/list中剔除的工具名 |
MCP_TOOL_ALLOW | 未设置 = 不过滤 | 逗号分隔、仅保留的工具名(白名单模式) |
DATA_DIR | ~/.omniroute | 心跳文件写入${DATA_DIR}/runtime/mcp-heartbeat.json |
8. 描述压缩与工具基数缩减
8.1 描述压缩(Description Compression)
MCP 的工具/提示词/资源注册表会在注册或列表时压缩描述文本,以减小暴露给客户端(进而计入模型提示词上下文)的元数据体积。实现在 descriptionCompressor.ts,通过createMcpServer()内的compressMcpRegistryMetadata挂入注册循环(server.ts)。
- 压缩基于 Caveman 规则集(
getRulesForContext("all", "full")),并保留代码片段、围栏块等结构内容; - 部署级开关:
key_value设置表中的compression.mcpDescriptionCompressionEnabled(默认开启,UI 上位于Analytics → MCP description compression); - 进程级开关:
OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS=false或OMNIROUTE_MCP_DESCRIPTION_COMPRESSION=false; - 实时统计通过
omniroute_compression_status的analytics.mcpDescriptionCompression暴露,并标记source: "mcp_metadata_estimate"以区别于真实 Provider 用量单据。
8.2 工具基数缩减(Tool Cardinality Reduction)
描述压缩缩减的是「每个工具的元数据」,而工具基数缩减进一步缩减「对外公布的工具数量」——tools/list清单越短,客户端模型为工具目录付出的每请求 Token 成本越低(「第 5 层」压缩)。实现是 toolCardinality.ts 中无状态的reduceToolManifest,同样挂入 server.ts 的注册循环。
默认关闭,需显式开启:只有设置了下列任一环境变量才生效,否则全部工具原样公布。
# 黑名单模式:从目录中剔除两个工具 MCP_TOOL_DENY="omniroute_get_health,omniroute_list_combos" omniroute --mcp # 白名单模式:只公布路由 + 配额工具 MCP_TOOL_ALLOW="omniroute_route_request,omniroute_check_quota" omniroute --mcpdeny优先于allow;名称以逗号分隔、自动 trim、忽略空项。被过滤的工具并非不注册,而是在注册成功后调用 MCP SDK 句柄的.disable(),使其不出现在tools/list中但注册接线保持完整(可干净地启停、无需重新注册)。另外,ToolProfile内部还支持按 scope 交集过滤(allowScopes,含read:*通配)和确定性maxTools上限,但这两个旋钮目前未通过环境变量暴露。
9. 运行时心跳
stdio 传输每 5 秒将存活状态写入${DATA_DIR}/runtime/mcp-heartbeat.json(实现见 runtimeHeartbeat.ts);Dashboard 的/api/mcp/status结合该文件与 PID 存活判断online。HTTP 传输则由进程内getMcpHttpStatus()上报(不写文件)。心跳快照示例:
{ "pid": 12345, "startedAt": "2026-05-13T12:34:56.000Z", "lastHeartbeatAt": "2026-05-13T12:35:01.000Z", "version": "1.8.1", "transport": "stdio", "scopesEnforced": false, "allowedScopes": [], "toolCount": 110 }10. REST API 端点
除 MCP 协议本身外,OmniRoute 还提供一组配套 REST 端点(源文件位于src/app/api/mcp/{status,tools,sse,stream,audit,audit/stats}/route.ts):
| 端点 | 方法 | 说明 | 认证 |
|---|---|---|---|
/api/mcp/status | GET | 服务状态:心跳、HTTP 传输状态、审计活动摘要 | 管理(会话/管理员) |
/api/mcp/tools | GET | 工具目录(名称、描述、scope、阶段、来源端点) | 管理 |
/api/mcp/sse | GET/POST | SSE 传输端点(受mcpEnabled+mcpTransport === "sse"门控) | API Key + scope |
/api/mcp/stream | POST/GET/DELETE | Streamable HTTP 传输(使用mcp-session-id头;DELETE结束会话) | API Key + scope |
/api/mcp/audit | GET | 审计日志查询(过滤:limit、offset、tool、success、apiKeyId) | 管理 |
/api/mcp/audit/stats | GET | 聚合审计统计(totalCalls、successRate、avgDurationMs、Top 工具) | 管理 |
注意:SSE 与 Streamable HTTP 传输都必须在设置中开启mcpEnabled并选中对应mcpTransport后才可用;配置错误的传输会使路由返回 HTTP 400 并附带切换设置的提示。
11. 相关框架与排障提示
与 MCP 工具清单(路由/缓存/压缩/内存/技能/代理/上下文源操作)相邻,v3.8.0 还随附两个独立框架,均不在MCP 工具目录内:
- Cloud Agents(docs/frameworks/CLOUD_AGENT.md):进程外的 AI 编码 Agent(codex-cloud、cursor-cloud、devin、jules),通过独立 REST 面
/api/v1/agents/*接入,调用不消耗 MCP scope; - Guardrails(docs/security/GUARDRAILS.md):聊天管线内的前置/后置过滤器(vision-bridge、pii-masker、prompt-injection),先于 MCP 工具/路由层执行。
排查「MCP 调用被拦截」时,应同时检查 MCP 审计日志(scope_denied:*条目)与 guardrails 审计轨迹——请求可能在到达 MCP scope 强制层之前就被 guardrail 拒绝。
12. 源码文件导航
| 文件 | 职责 |
|---|---|
| open-sse/mcp-server/server.ts | MCP Server 工厂、stdio 入口、scoped 工具注册 |
| open-sse/mcp-server/httpTransport.ts | SSE + Streamable HTTP 传输(会话管理) |
| open-sse/mcp-server/scopeEnforcement.ts | 工具 scope 评估与调用方解析 |
| open-sse/mcp-server/audit.ts | 工具调用审计日志(mcp_tool_audit) |
| open-sse/mcp-server/runtimeHeartbeat.ts | stdio 心跳写入(mcp-heartbeat.json) |
| open-sse/mcp-server/descriptionCompressor.ts | 工具/提示词/资源注册表的描述压缩 |
| open-sse/mcp-server/toolCardinality.ts | reduceToolManifest工具基数缩减 |
| open-sse/mcp-server/schemas/tools.ts | Zod 模式 + 工具注册表(MCP_TOOLS) |
| open-sse/mcp-server/tools/advancedTools.ts | Phase 2 + 缓存 + 1Proxy 工具处理函数 |
| open-sse/mcp-server/tools/compressionTools.ts | 压缩工具处理函数 |
| open-sse/mcp-server/tools/memoryTools.ts | 内存工具定义(3 个) |
| open-sse/mcp-server/tools/skillTools.ts | 技能工具定义(4 个) |
| open-sse/mcp-server/tools/notionTools.ts | Notion 上下文源工具定义(6 个) |
| open-sse/mcp-server/tools/obsidianTools.ts | Obsidian 上下文源工具定义(22 个) |
13. 总结
OmniRoute MCP Server 的价值在于「用一套工具面把网关的全部运维能力交给 Agent」:从get_health到route_request,从simulate_route到set_budget_guard,每个操作都经过 scope 鉴权、全程审计,并可对客户端做描述压缩与工具基数裁剪。无论你是在 Claude Desktop / Cursor 中直接拉起omniroute --mcp,还是通过/api/mcp/stream做远程接入,理解其工具注册、scope 强制与传输切换机制,都能让 MCP 集成更安全、更省 Token。
【免费下载链接】OmniRouteNever stop coding. Free MIT AI gateway: one endpoint, 352 providers (150+ free), 1200+ models Kimi, Claude, GPT, Gemini, GLM, DeepSeek, MiniMax. Works with Claude Code, Codex, Cursor, OpenCode, Cline & Copilot. Quota-aware auto-fallback, RTK+Caveman compression saves 15-95% tokens, MCP/A2A, Desktop/PWA. Built by 550+ contributors项目地址: https://gitcode.com/GitHub_Trending/om/OmniRoute
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考