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 分两步:
- 发现阶段:只暴露工具名 + 一行描述(轻量 list)
- 执行阶段:用户意图明确后,再加载完整 inputSchema 与文档
// 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-mcp | list_files, blame | 只读 token |
| db-mcp | run_readonly_sql | 读库账号 |
| obs-mcp | query_metrics | 监控 API key |
Host 合并工具列表时建议加前缀:git/list_files、db/run_readonly_sql,避免 search 重名。
编排模式:
- Agent 路由:模型自选工具(灵活,需 Harness)
- Workflow 固定链:先 git 再 db(可控,见 5.6)
第 4 步:Resource URI 与上下文注入
Resources 通过 URI 标识,例如 repo://main/README.md。Host 可在 system 或 tool result 中注入:
参考资源:
- repo://main/docs/architecture.md(架构说明)
- openapi://payments/v2(支付 API 摘要)模型需要细节时,Host 调用 resources/read 拉取内容,而非让模型「猜测」文件内容。大资源应摘要或分块,避免一次性塞满窗口。
第 5 步:服务链观测与失败隔离
每条链路透传 trace_id,日志记录:
{ "trace_id": "abc", "server": "git-mcp", "tool": "blame", "latency_ms": 120, "ok": true }某一 Server 超时时不应拖垮整个 Host:Circuit breaker 跳过该域工具,并告知模型「Git 服务暂不可用,请基于已有信息回答」。
动手练习
- 为你熟悉的一个业务设计 3 个 MCP Server 边界图,标注 Tools/Resources/Prompts 各至少 1 项。
- 设计工具名前缀规范(如 domain/action),并解释如何避免与 legacy REST 路由混淆。
- 模拟 15 个工具的 Deferred Loading:写 Host 伪代码,比较全量加载与按需加载的 Token 估算差。
- 为一个 Resource URI 设计版本策略(main vs v1.2),说明模型引用时如何注明版本。
- 编写多 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 负责编排与安全。