Skip to content

MCP 服务链

🎯 学习目标

  • 为 Tools / Resources / Prompts 划分清晰边界,避免职责混用
  • 设计多 MCP Server 组合时的命名空间与权限隔离
  • 理解 Deferred Loading 如何节省上下文 Token
  • 能描述一个 Git + DB + 监控三 Server 协作的典型链路

引言

单个 echo Server 只能验证协议。真实项目往往是多条 MCP 服务链并行:读代码、查数据、拉监控。本节关注「怎么拆 Server」和「怎么编排」,而不是再讲一遍 RPC 语法。

章节正文

第 1 步:职责边界:何时用 Tool,何时用 Resource

决策口诀:

  • 会改变状态或触发计算 → Tool(写库、发请求、执行脚本)
  • 供模型阅读引用 → Resource(规范、schema、只读配置)
  • 固定流程的话术骨架 → Prompt(审查清单、Incident 报告模板)

反模式:把 500 页 PDF 做成「download_pdf」Tool 每次全量返回;应预处理为 Resource URI 或向量索引 + 检索 Tool。

第 2 步:Deferred Loading(按需加载)

工具很多时,全量 Schema 会占满上下文。Deferred Loading 分两步:

  1. 发现阶段:只暴露工具名 + 一行描述(轻量 list)
  2. 执行阶段:用户意图明确后,再加载完整 inputSchema 与文档
javascript
// Host 伪逻辑
const catalog = await mcp.listTools({ detail: 'summary' })
// 模型或路由器选中 'audit_dependencies' 后
const fullTool = await mcp.getToolSchema('audit_dependencies')
const toolsForLlm = [toOpenAITool(fullTool)]

这在 20+ 工具的场景能显著降低每轮 Prompt 体积,并减少误调用。

第 3 步:多 Server 编排与命名冲突

三 Server 示例:

Server工具示例权限
git-mcplist_files, blame只读 token
db-mcprun_readonly_sql读库账号
obs-mcpquery_metrics监控 API key

Host 合并工具列表时建议加前缀git/list_filesdb/run_readonly_sql,避免 search 重名。

编排模式:

  • Agent 路由:模型自选工具(灵活,需 Harness)
  • Workflow 固定链:先 git 再 db(可控,见 5.6)

第 4 步:Resource URI 与上下文注入

Resources 通过 URI 标识,例如 repo://main/README.md。Host 可在 system 或 tool result 中注入:

text
参考资源:
- repo://main/docs/architecture.md(架构说明)
- openapi://payments/v2(支付 API 摘要)

模型需要细节时,Host 调用 resources/read 拉取内容,而非让模型「猜测」文件内容。大资源应摘要或分块,避免一次性塞满窗口。

第 5 步:服务链观测与失败隔离

每条链路透传 trace_id,日志记录:

json
{ "trace_id": "abc", "server": "git-mcp", "tool": "blame", "latency_ms": 120, "ok": true }

某一 Server 超时时不应拖垮整个 Host:Circuit breaker 跳过该域工具,并告知模型「Git 服务暂不可用,请基于已有信息回答」。

动手练习

  1. 为你熟悉的一个业务设计 3 个 MCP Server 边界图,标注 Tools/Resources/Prompts 各至少 1 项。
  2. 设计工具名前缀规范(如 domain/action),并解释如何避免与 legacy REST 路由混淆。
  3. 模拟 15 个工具的 Deferred Loading:写 Host 伪代码,比较全量加载与按需加载的 Token 估算差。
  4. 为一个 Resource URI 设计版本策略(main vs v1.2),说明模型引用时如何注明版本。
  5. 编写多 Server 失败场景测试用例:git 可用、db 不可用,期望模型行为是什么?

常见问题

Q:一个 Host 连接太多 MCP Server 会慢吗?

启动与 list 阶段有固定成本。实践上合并同域工具、懒连接、并行 list、缓存工具目录。生产环境对冷启动慢的 Server 做预热或常驻进程。

Q:Prompts 原语和项目里的 Prompt 模板仓库重复吗?

可以互补:Prompt 仓库做版本管理与 CI;MCP Prompts 暴露「运行时可选模板」给 Host 一键加载。团队规范应明确哪一层是 source of truth。

Q:Deferred Loading 对模型透明吗?

对模型应透明:它看到的仍是完整 Schema,只是 Host 分阶段注入。若模型需要「浏览工具目录」,可提供 meta 工具 list_available_tools 返回摘要列表。

本节小结

服务链设计的核心是边界清晰、命名不冲突、按需加载、失败隔离。Tools 做事,Resources 供料,Prompts 定式;Host 负责编排与安全。