Claude Code 进阶:让 Skill 调用 MCP 服务,打造专属自动化工作流

前面两篇文章,我们分别讲了 Skills 和 MCP。Skills 让 Claude 学会了各种专业技能,MCP 让 Claude 能够访问外部工具和服务。
但如果只是单独使用它们,你只用到了 Claude Code 50% 的威力。
真正的魔法,发生在 Skills 和 MCP 结合的时候。
我第一次把两者结合起来,是做一个 GitHub Issue 分析的工作流。以前我的流程是:打开 GitHub 看 Issue,复制错误信息,去 Stack Overflow 搜,再回来写分析。整个过程要在三四个标签页之间来回切换。写完 Skill 之后,我只需要说”分析 Issue #123”,它自己去拿数据、自己搜文档、自己生成报告。第一次跑通的时候,我盯着输出看了好一会儿,有点不敢相信这是一句话触发的。
为什么要在 Skill 中调用 MCP
先搞清楚一个问题:Skills 和 MCP 有什么区别?
**Skills 是”知识”**。它告诉 Claude 应该怎么做事,遵循什么流程,注意哪些细节。就像一本操作手册。
**MCP 是”能力”**。它给 Claude 提供实际的工具,让它能够访问数据库、调用 API、操作外部服务。就像一套工具箱。
单独的 Skills 只能指导 Claude 用它自带的工具(读文件、写代码、执行命令)。单独的 MCP 只是提供了工具,但 Claude 不知道什么时候该用、怎么用。
但当你把它们结合起来,就能创建完整的自动化工作流。
举个真实的例子。
Sentry(一个错误监控平台)创建了一个 sentry-code-review Skill。这个 Skill 做的事情是:
- 从 GitHub 获取 PR 信息(调用 GitHub MCP)
- 从 Sentry 获取相关的错误日志(调用 Sentry MCP)
- 分析代码是否修复了这些错误
- 生成审查报告
- 在 PR 中添加评论(调用 GitHub MCP)
整个流程,用户只需要说”审查 PR #123”。Claude 会按照 Skill 定义的流程,自动调用各个 MCP 工具,完成所有步骤。
这就是 Skills + MCP 的威力:把复杂的多步骤工作流,变成一句话的指令。
Skills 和 MCP 的协作模式
在深入实践之前,我们需要理解 Skills 和 MCP 是如何协作的。
模式一:Skill 指导,MCP 执行
这是最常见的模式。Skill 定义工作流程,在流程中明确指出应该调用哪些 MCP 工具。
1 | # 数据分析 Skill |
Claude 读到这个 Skill 后,就知道应该先调用数据库 MCP 查询数据,然后分析,最后用 Slack MCP 发送报告。
模式二:MCP 提供能力,Skill 提供上下文
有些 MCP 工具功能很强大,但需要特定的使用方式。Skill 可以提供这些上下文信息。
比如,你有一个公司内部的 API MCP 服务器。Skill 可以告诉 Claude:
1 | # 内部 API 使用规范 |
这样,Claude 在使用这个 MCP 服务器时,就会遵循你定义的规范。
模式三:条件触发
Skill 可以定义在什么情况下应该使用哪个 MCP 工具。
1 | # 智能部署 Skill |
这种模式让你的自动化工作流更加智能和安全。
实战:创建一个调用 MCP 的 Skill
让我们从一个实际案例开始:创建一个”GitHub Issue 分析”Skill,它会自动获取 Issue 信息、搜索相关代码、生成分析报告。
第一步:确认需要的 MCP 服务器
这个 Skill 需要两个 MCP 服务器:
- GitHub MCP:获取 Issue 信息
- Brave Search MCP:搜索相关的技术文档
如果你还没有安装这些 MCP 服务器,先安装:
1 | # 安装 GitHub MCP |
验证安装:
1 | claude mcp list |
你应该能看到这两个服务器的状态为 connected。
第二步:创建 Skill 目录
1 | mkdir -p ~/.claude/skills/github-issue-analyzer |
第三步:编写 SKILL.md
创建 SKILL.md 文件,这是 Skill 的核心:
1 | --- |
Issue 概览
- 标题:
- 仓库:
- 状态:
- 标签:
问题分析
[根本原因分析]
解决方案
方案一:[方案名称]
- 实现步骤:
- 优点:
- 缺点:
- 参考资料:
方案二:[方案名称]
…
推荐方案
[推荐哪个方案及原因]
相关资源
[搜索到的有用链接]
1 |
|
分析 facebook/react 仓库的 Issue #12345
1 |
|
保存这个文件。
第四步:测试 Skill
重启 Claude Code,然后测试:
1 | claude |
在对话中输入:
1 | 用 github-issue-analyzer 分析 vercel/next.js 仓库的 Issue #50000 |
Claude 会按照你定义的流程:
- 调用 GitHub MCP 获取 Issue 信息
- 调用 Brave Search MCP 搜索相关文档
- 生成详细的分析报告
高级技巧:让 Skill 更智能
技巧一:条件判断和错误处理
在 Skill 中加入条件判断,让工作流更健壮:
1 | ## 执行流程 |
这种方式让 Skill 能够处理异常情况,不会因为一个步骤失败就卡住。
技巧二:参数化配置
如果你的 Skill 需要一些可配置的参数,可以在 Skill 中定义:
1 | ## 配置参数 |
分析 Issue #123 –depth=shallow –language=zh
1 | ``` |
这个 Skill 串联了 GitHub、Vercel、Sentry、Slack 四个服务,实现了完整的部署流程自动化。
技巧四:动态工具选择
有时候,你不确定应该用哪个 MCP 工具。可以让 Claude 根据情况动态选择:
1 | ## 搜索策略 |
最佳实践
1. 明确指定 MCP 工具名称
在 Skill 中调用 MCP 工具时,使用完整的工具名称:
好的做法:
1 | 调用 `mcp__github__get_issue` 获取 Issue 信息 |
不好的做法:
1 | 使用 GitHub API 获取 Issue 信息 |
明确的工具名称让 Claude 知道应该调用哪个 MCP 工具,避免混淆。
2. 提供使用示例
在 Skill 中包含具体的使用示例,让 Claude 理解预期的输入输出:
1 | ## 使用示例 |
分析 facebook/react 的 Issue #12345
1 |
|
Issue 概览
- 标题:useEffect cleanup not called on unmount
- 仓库:facebook/react
…1
2
3
4
5
6
7
8
9
10
11
12
13```
### 3. 定义清晰的工作流
把复杂的任务分解成清晰的步骤:
```markdown
## 工作流程
1. 获取数据(调用 MCP A)
2. 处理数据(本地分析)
3. 存储结果(调用 MCP B)
4. 发送通知(调用 MCP C)
每个步骤做什么,用哪个工具,一目了然。
4. 处理敏感信息
如果 MCP 工具返回的数据可能包含敏感信息,在 Skill 中明确说明如何处理:
1 | ## 安全注意事项 |
5. 设置超时和重试
对于可能失败的 MCP 调用,定义重试策略:
1 | ## 错误处理 |
常见问题排查
问题 1:Skill 没有调用 MCP 工具
症状:Claude 理解了你的 Skill,但没有调用你指定的 MCP 工具。
可能原因:
- MCP 服务器未连接
检查:
1 | claude mcp list |
确保相关的 MCP 服务器状态为 connected。
- 工具名称写错了
MCP 工具的命名格式是:mcp__服务器名__工具名
检查你的 MCP 服务器名称:
1 | claude mcp list |
然后在 Skill 中使用正确的格式。比如,如果服务器名是 github,工具名是 get_issue,完整名称应该是 mcp__github__get_issue。
- Skill 的描述不够明确
Claude 可能不确定什么时候应该使用这个 Skill。在 description 中加入更多关键词:
1 |
|
问题 2:MCP 调用失败
症状:Claude 尝试调用 MCP 工具,但返回错误。
排查步骤:
- 检查 MCP 服务器日志
1 | claude mcp logs github |
查看具体的错误信息。
- 测试 MCP 工具
1 | claude mcp test github |
手动测试 MCP 工具是否正常工作。
- 检查环境变量
很多 MCP 服务器需要 API Key 或 Token。确认环境变量已正确设置:
1 | echo $GITHUB_TOKEN |
- 检查权限
确保你的 API Token 有足够的权限。比如 GitHub Token 需要 repo 权限才能访问私有仓库。
问题 3:Skill 执行到一半就停了
症状:Skill 执行了前几步,然后就不继续了。
可能原因:
- 上下文窗口满了
如果 MCP 工具返回的数据太大,可能会占满上下文窗口。
解决方法:在 Skill 中限制返回的数据量:
1 | 调用 `mcp__github__list_issues`,限制返回最近 10 条 Issue |
- 遇到了需要用户确认的操作
某些 MCP 工具(比如删除、部署)可能需要用户确认。检查 Claude 是否在等待你的确认。
- Skill 的步骤定义不清晰
确保每个步骤都有明确的输出,让 Claude 知道何时进入下一步。
实际应用场景
场景一:自动化代码审查
创建一个 Skill,结合 GitHub MCP 和 Sentry MCP:
- 获取 PR 的代码变更
- 检查是否修复了 Sentry 中报告的错误
- 分析代码质量
- 在 PR 中添加审查评论
场景二:智能客服
创建一个 Skill,结合 Slack MCP 和数据库 MCP:
- 监听 Slack 中的客户问题
- 从数据库查询相关信息
- 生成回复
- 在 Slack 中发送回复
场景三:数据分析报告
创建一个 Skill,结合 PostgreSQL MCP 和 Slack MCP:
- 从数据库查询销售数据
- 分析趋势和异常
- 生成可视化报告
- 定时发送到 Slack 频道
场景四:文档同步
创建一个 Skill,结合 Notion MCP 和 GitHub MCP:
- 从 Notion 获取产品需求文档
- 在 GitHub 创建对应的 Issue
- 同步更新状态
- 保持两边的信息一致
写在最后
Skills 和 MCP 的结合,把 Claude Code 从一个”代码助手”变成了一个”工作流自动化平台”。
但我用了一段时间之后,发现一个问题:工作流越复杂,出错的地方就越多。一个五步的 Skill,任何一步的 MCP 调用失败,整个流程就卡住了。我花了不少时间在 Skill 里加错误处理逻辑,这本身也是一种学习成本。
创建 Skill 的过程,其实是在逼你把工作流程想清楚:哪些步骤是必需的?哪些可以自动化?哪些需要人工判断?这个梳理过程本身就有价值,即使最后 Skill 没写好,你对自己工作流的理解也更清晰了。
我现在还没解决的一个问题是:当 Skill 调用多个 MCP 工具时,怎么控制它的执行顺序和中间状态?有时候它会跳过某个步骤,或者用错工具。如果你有好的解决方案,我很想知道。