MCP + Skills 实战:从搭一个 MCP Server 到让 AI Agent 真正干活
MCP 解决了一个根本问题:Agent 如何连接真实世界的数据和系统。没有这个连接,Agent 就只是一个沙盒里的玩具。
最近 Anthropic 发布了工程博客《Code execution with MCP: Building more efficient agents》(2025-11-04),系统阐述了 MCP 协议如何让 Agent 更高效地接入生产系统。网上已有不少解读文章,但大多是”官方说了什么”的搬运。
这篇文章不一样。我用一个真实的公司内部运维诊断系统作为案例,手把手展示 MCP 和 Skills 怎么配合——将官方思路落地到我们的实践中,看看每一步到底对不对。
一、MCP 30 秒理解
先解决一个基本问题:MCP 到底是什么?
一句话:MCP 是一个标准协议,让任何 AI Agent 都能用同一套接口连接任何外部系统。
一张图:

根据 Anthropic 官方博客和 MCP 协议的设计意图,Agent 连接外部系统有三条路径:
| 路径 | 特点 | 适用场景 |
|---|---|---|
| 直接 API 调用 | 最简单,但每个 Agent × 每个系统 = 独立集成 | 1:1 简单场景 |
| CLI 命令行 | 轻量快速,但无法穿透到移动端和云端 | 本地调试 |
| MCP | 标准化协议,一次实现处处可用 | 生产环境,规模化 |
我们的实践验证:在公司内部,我们选择了 MCP 路径来构建运维诊断系统——Agent 通过 MCP 协议连接监控数据平台,而不是为每个 Agent 写一套独立的 API 集成代码。
二、动手:搭一个 MCP Server
理解了 MCP 是什么,接下来动手。以我们内部的运维诊断 MCP Server 为例。
2.1 一行命令安装
在 Claude Code 中,安装一个远程 MCP Server 只需要一行命令:
1 | claude mcp add --transport http ai-ops-mcp https://内部域名/ai-ops/streamablehttp |
关键参数说明:
--transport http:使用 HTTP 传输协议(远程服务器必须用 HTTP 或 SSE,不能用 stdio)--header "apikey:xxxx":自定义请求头,用于内部网关鉴权
2.2 连通性验证
安装后,Claude Code 自动检测 MCP 工具。在对话中直接问 Claude:
1 | "帮我看看有哪些 ai-ops 相关的工具" |
Claude 会列出所有 mcp__ai-ops-mcp__ 开头的工具:
1 | mcp__ai-ops-mcp__getAppCpuUsageLastHour → Pod 级别 CPU 使用率 |
13 个工具,覆盖了运维诊断的全部核心指标。
2.3 对照官方:远程优先
官方核心思路:构建远程 MCP Server,让 Agent 通过标准化协议连接,而非直连每个系统的 API。
我们的实践完全吻合:ai-ops-mcp 就是纯远程服务器,使用 HTTP Streamable HTTP 传输协议,部署在内网网关上。所有 Agent(Claude Code、QoderCLI 等)通过 HTTP 连接,不需要本地安装任何额外依赖。
验证结论:我们的 MCP Server 是远程部署的,与官方核心思路一致。
三、动手:让 Agent 真正干活
装好 MCP Server 后,Agent 已经能拿到数据了。但问题来了——
3.1 有数据≠会诊断
试试直接让 Claude 诊断一个问题:
1 | "帮我诊断 trade 应用,最近响应很慢" |
没有 Skill 的情况下,Claude 会怎么做?
- 先调用
getAppQps看请求量 - 再调用
getAppResponseTime看响应时间 - 再调用
getAppCpuUsageLastHour看 CPU - 再调用
getAppDruidActiveCount看连接池 - 再调用
getAppDruidPoolingCount看池大小 - … 还要调 GC、线程、日志?
Agent 有数据,但它不知道什么时候该看什么指标、怎么看、怎么关联分析、什么值算正常什么值算异常。就像一个新手医生——有血压计、心电图、血检报告,但不知道该先测什么、哪些指标相关、什么数值意味着什么。
3.2 引入 Skill:给 Agent 一套 SOP
我们开发了 ai-ops-troubleshoot Skill,它提供了一套完整的诊断流程知识:
1 | ┌─────────────────────────────────────────────────────────────┐ |
现在再试一次:
1 | "帮我诊断 trade 应用,最近响应很慢" |
有了 Skill 后,Claude 的行为变了:
- 症状识别:”响应很慢” → 性能问题类别
- 精准调用:并行调用
getAppQps+getAppResponseTime+getAppCpuUsageLastHour(只调 3 个,不再盲调 13 个) - 阈值判定:响应时间 > 500ms → 严重,CPU 70-85% → 警告
- 跨维度关联:发现 CPU 高 → 自动调用 GC 工具检查是否 GC 导致
- 生成报告:概要 + 异常指标 + 根因分析 + 建议措施
这就是 Anthropic 说的:MCP 给 Agent「能力」,Skills 给 Agent「知识」。
| 只有 MCP | MCP + Skills | |
|---|---|---|
| 类比 | 有血压计但不会诊断的新手 | 有血压计且有诊断 SOP 的医生 |
| 行为 | 盲调所有工具,逐一猜测 | 精准调用,阈值判定,关联分析 |
| 结果 | 可能找到答案,但效率低 | 快速定位根因,结构化输出 |
四、MCP + Skills 最佳实践
通过这次实战,我们提炼出 MCP 和 Skills 配合的几条最佳实践。
实践一:远程部署,从一开始就做对的决策
很多人用 stdio 传输跑本地 MCP Server,开发调试很方便:
1 | claude mcp add my-server node ./my-server.js |
但一旦 Agent 跑在云端(Claude Managed Agents、Claude Cowork),本地 MCP Server 就完全不可用。正确的做法是从第一天就构建远程 MCP Server。
我们的 ai-ops-mcp 就是纯远程部署——HTTP Streamable HTTP 传输协议,部署在内部网关上。所有 Agent(Claude Code、QoderCLI)通过一行 claude mcp add 连接,无需本地安装任何依赖。
为什么远程优先? 因为生产环境的 Agent 跑在云端,你的服务器也必须能跑在云端。只有远程服务器才能覆盖 Web、移动端和云端 Agent 的所有场景。本地服务器只能给本地开发环境用,无法触达真正的生产用户。
实践二:MCP 做原子能力,Skill 做意图编排
很多人在构建 MCP Server 时会犯一个错误:围绕 API 端点一对一翻译工具。结果是 Agent 要调几十次才能完成一个任务,每次都要从上下文里重新理解”现在在哪一步”。
更好的做法是分两层思考:
- MCP 层:围绕「指标意图」设计原子工具——
getAppCpuUsageLastHour获取一类指标数据,而非直译 Prometheus 的查询 API - Skill 层:围绕「业务意图」编排组合——用户说”诊断响应慢”,Skill 知道该并行调用 QPS + 响应时间 + CPU,而非让 Agent 自行猜测
以我们的运维诊断系统为例:
1 | 用户意图:"诊断响应慢" |
如果把”诊断响应慢”做成一个 MCP 工具 diagnoseSlowResponse,也能解决问题,但会失去灵活性——当诊断逻辑变化时,需要重新发布 MCP Server。而 Skill 只是一个 Markdown 文件,修改后即时生效。
最佳实践:MCP 提供原子能力(稳定、可复用),Skill 承担意图编排(灵活、易迭代)。两者配合覆盖从原子到意图的完整链路。
实践三:大面积 API 用「代码编排」模式
如果你的 MCP Server 要对接一个拥有几千个端点的超级平台(AWS、Cloudflare、Kubernetes),光工具定义本身就会吃掉大量上下文 Token,Agent 的推理能力会被严重稀释。
最佳做法:只暴露两个薄工具:
1 | 1. search(搜索)→ 让 Agent 发现它需要的操作 |
Cloudflare 的 MCP 服务器就是标杆案例:通过 code execution 模式,**2 个工具覆盖大量 API 端点,工具定义的 Token 消耗从约 150,000 降至约 2,000,节省 98.7%**(Anthropic 官方工程博客数据)。极简的表面,强大的内核。
我们的运维监控 API 只有 13 个端点,暂时不需要代码编排模式。但这个设计思路值得记住——如果未来监控平台扩展到几百个端点,暴露 searchMetrics + executeQuery 两个工具就能覆盖全部能力。
实践四:认证标准化,让云端 Agent 能持握令牌
当 MCP Server 需要连接有 OAuth 认证的外部系统时,一个核心问题是:云端运行的 Agent 怎么持有和复用用户的认证令牌?
传统痛点:
- Agent 每次连接都要重新授权 → 用户体验差
- OAuth 令牌存储在本地 → 云端 Agent 无法复用
- 令牌过期后需要手动刷新 → 维护成本高
标准方案(MCP 规范方向):
- CIMD(Client ID Metadata Documents):MCP 规范正在推进的快速首次认证流程,用户体验更顺滑,避免反复弹窗
- Vaults(令牌保险库):Claude Managed Agents 的能力——注册一次 OAuth 令牌,运行时自动注入到每个 MCP 连接,并自动刷新
我们的内部场景暂未涉及 OAuth,用 --header "noSign:true" 的网关鉴权方式简化了认证。但接入外部系统时,CIMD + Vaults 是标准路径——你不需要自己搭密钥存储系统。
实践五:返回丰富语义,而非纯文本
MCP 社区正在推进一个协议扩展方向——让工具返回可交互界面而非纯文本:
- 返回一个图表而不是一串数字
- 返回一个表单让用户填写而不是让 Agent 猜参数
- 返回一个内嵌仪表盘而不是一行状态文字
直观来看,当用户能看到清晰的可视化结果时,他们更信任这个工具,也更愿意继续用它。这是 MCP 协议演进的自然方向——从”返回数据”到”返回体验”。
我们的 ai-ops-mcp 目前返回 JSON 格式的指标数据,纯文本呈现。这是下一步的改进方向——诊断报告可以返回可视化仪表盘而非纯文字。
最佳实践总结
| # | 最佳实践 | 说明 |
|---|---|---|
| 1 | 远程部署优先 | 从第一天就构建远程 MCP Server,不要走 stdio 本地捷径 |
| 2 | MCP 做原子能力,Skill 做意图编排 | MCP 提供稳定可复用的原子工具,Skill 提供灵活易迭代的编排逻辑 |
| 3 | 大面积 API 用代码编排 | 只暴露 search + execute,极简表面覆盖全部能力 |
| 4 | 认证标准化 | 内部场景可简化鉴权,外部系统走 CIMD + Vaults |
| 5 | 返回丰富语义 | 让工具返回可交互界面而非纯文本,从”返回数据”到”返回体验” |
五、踩坑实战:Token 消耗与客户端优化
5.1 问题:13 个工具定义吃掉多少 Token?
当 MCP Server 提供了 13 个工具时,Claude Code 在初始化时会把所有工具定义加载到上下文中。每个工具定义包含工具名、参数说明、返回值描述——13 个工具的定义本身就占了不少 Token。
如果做全面健康检查(并行调用 13 个工具),加上每次调用的参数和返回结果,一次完整诊断的 Token 消耗量可能达到数万级别。
5.2 Anthropic 的优化方案
官方工程博客给出了一个核心优化方向:Code execution with MCP。
核心思路:Tool Search — 按需加载
不预先加载所有工具定义,而是运行时动态搜索工具目录,只在需要时拉入上下文。Anthropic 给出了数据:将工具作为代码文件组织在文件系统中,Agent 通过浏览目录发现需要的工具,工具定义的 Token 消耗从 **150,000 降至 2,000,节省 98.7%**。
延伸思路:Programmatic Tool Calling — 代码沙盒处理结果
把工具调用结果交给代码执行沙盒处理(循环、过滤、聚合),只把最终总结传入上下文,而非把每个原始结果都塞进对话。例如获取 10,000 行数据后,在沙盒中过滤为 5 行再返回给模型——Agent 只看 5 行而非 10,000 行。
5.3 我们的实践:Skill 就是天然的”Tool Search”
回看我们的 ai-ops-troubleshoot Skill,它的诊断流程天然实现了”按需加载”的逻辑:
- 用户说”响应慢” → Skill 只选择 QPS + 响应时间 + CPU 三个工具
- 用户说”CPU 高” → Skill 只选择 CPU + 线程 + GC 工具
- 用户说”定时任务失败” → Skill 只选择 ElasticJob 工具
不是盲调 13 个工具,而是根据症状精准选择 3-6 个。这和官方 Tool Search 的理念一致——只在需要时才加载和使用相关工具。
验证结论:Skill 的症状→工具选择映射,自然实现了 Tool Search 的理念。
六、MCP 是「会复利」的层
前面讲的都是技术和实操。最后想分享一个更深层的认知。
MCP 是一个「会复利」的层。什么叫”复利”?今天你写了一个远程 MCP Server,它可以被所有兼容客户端在任何部署环境下使用——认证、交互性和丰富语义都由协议本身处理。随着更多客户端采用规范、更多扩展进入协议,同一个服务器不需要你重新发布任何东西,就能变得越来越强。
你写的每一个 MCP Server,都在为整个生态系统贡献力量。边缘情况变少了,定制化集成变少了,整个行业的基础设施变强了。这是一种典型的网络效应——用得越多,价值越大。
在我们的实践中也感受到了这一点:ai-ops-mcp 最初只为 Claude Code 设计,但 MCP 协议的标准化让它天然兼容 QoderCLI 和未来的更多 Agent 平台——一次构建,多处受益。
七、行动清单
根据这次实战经验,给不同阶段的读者一个清晰的下一步建议:
给刚接触 MCP 的读者
- 先理解核心:MCP 不是又一个 API 协议,它是消除 Agent×系统 M×N 问题的标准化层
- 一行命令开始:用
claude mcp add安装一个远程 MCP Server,感受连通性 - 验证连通:让 Claude 列出已安装的 MCP 工具,确认数据可达
给正在构建 MCP Server 的开发者
- 远程优先:从第一天就构建远程 MCP Server,不要走 stdio 本地捷径
- MCP 做原子,Skill 做编排:MCP 提供稳定可复用的原子工具,Skill 提供灵活易迭代的编排逻辑
- 大面积 API 用代码编排:只暴露 search + execute,极简表面覆盖全部能力
给想让 Agent 真正干活的实践者
- MCP + Skills 组合:MCP 给能力,Skills 给知识。只装 MCP 不够——Agent 需要一套 SOP 才能高效使用工具
- Token 优化:Skill 的精准工具选择天然实现 Tool Search 理念,减少无谓调用
- 认证标准化:内部场景可简化鉴权,外部系统走 CIMD + Vaults
给想深入 MCP 生态的建设者
- 丰富语义返回:返回图表和表单而非纯文本,从”返回数据”到”返回体验”
- Skill 从 MCP Server 分发:社区正在推进标准扩展,让 Skills 和 MCP Server 版本同步
- 你的每个 MCP Server 都在贡献复利:网络效应——用得越多,价值越大
本文参考 Anthropic 官方工程博客:Code execution with MCP: Building more efficient agents