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

cover

前面两篇文章,我们分别讲了 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 做的事情是:

  1. 从 GitHub 获取 PR 信息(调用 GitHub MCP)
  2. 从 Sentry 获取相关的错误日志(调用 Sentry MCP)
  3. 分析代码是否修复了这些错误
  4. 生成审查报告
  5. 在 PR 中添加评论(调用 GitHub MCP)

整个流程,用户只需要说”审查 PR #123”。Claude 会按照 Skill 定义的流程,自动调用各个 MCP 工具,完成所有步骤。

这就是 Skills + MCP 的威力:把复杂的多步骤工作流,变成一句话的指令。

Skills 和 MCP 的协作模式

在深入实践之前,我们需要理解 Skills 和 MCP 是如何协作的。

模式一:Skill 指导,MCP 执行

这是最常见的模式。Skill 定义工作流程,在流程中明确指出应该调用哪些 MCP 工具。

1
2
3
4
5
6
7
# 数据分析 Skill

## 分析流程

1. 使用 `mcp__database__query` 从数据库查询数据
2. 分析数据,找出关键指标
3. 使用 `mcp__slack__send_message` 发送分析报告

Claude 读到这个 Skill 后,就知道应该先调用数据库 MCP 查询数据,然后分析,最后用 Slack MCP 发送报告。

模式二:MCP 提供能力,Skill 提供上下文

有些 MCP 工具功能很强大,但需要特定的使用方式。Skill 可以提供这些上下文信息。

比如,你有一个公司内部的 API MCP 服务器。Skill 可以告诉 Claude:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 内部 API 使用规范

## 认证方式

所有 API 调用都需要在请求头中包含 `X-Team-ID`

## 常用端点

- 用户信息:`mcp__internal_api__get_user`
- 项目列表:`mcp__internal_api__list_projects`

## 注意事项

- 查询用户信息时,必须先检查权限
- 批量操作时,每次最多处理 100 条记录

这样,Claude 在使用这个 MCP 服务器时,就会遵循你定义的规范。

模式三:条件触发

Skill 可以定义在什么情况下应该使用哪个 MCP 工具。

1
2
3
4
5
6
7
8
9
10
11
12
# 智能部署 Skill

## 部署前检查

1. 如果是生产环境,使用 `mcp__sentry__check_errors` 检查最近的错误率
2. 如果错误率 > 1%,停止部署并通知团队
3. 如果是测试环境,直接部署

## 部署后验证

1. 使用 `mcp__monitoring__check_health` 检查服务健康状态
2. 如果健康检查失败,自动回滚

这种模式让你的自动化工作流更加智能和安全。

实战:创建一个调用 MCP 的 Skill

让我们从一个实际案例开始:创建一个”GitHub Issue 分析”Skill,它会自动获取 Issue 信息、搜索相关代码、生成分析报告。

第一步:确认需要的 MCP 服务器

这个 Skill 需要两个 MCP 服务器:

  1. GitHub MCP:获取 Issue 信息
  2. Brave Search MCP:搜索相关的技术文档

如果你还没有安装这些 MCP 服务器,先安装:

1
2
3
4
5
6
7
8
9
# 安装 GitHub MCP
claude mcp add github -s user \
--env GITHUB_PERSONAL_ACCESS_TOKEN=$GITHUB_TOKEN \
-- npx -y @modelcontextprotocol/server-github

# 安装 Brave Search MCP
claude mcp add brave-search -s user \
--env BRAVE_API_KEY=$BRAVE_API_KEY \
-- npx -y @modelcontextprotocol/server-brave-search

验证安装:

1
claude mcp list

你应该能看到这两个服务器的状态为 connected

第二步:创建 Skill 目录

1
2
mkdir -p ~/.claude/skills/github-issue-analyzer
cd ~/.claude/skills/github-issue-analyzer

第三步:编写 SKILL.md

创建 SKILL.md 文件,这是 Skill 的核心:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
---
name: github-issue-analyzer
description: 分析 GitHub Issue,搜索相关技术文档,生成详细的分析报告和解决方案建议
---

# GitHub Issue 分析器

当用户要求分析 GitHub Issue 时,按以下流程执行。

## 前置条件

确保已连接以下 MCP 服务器:
- GitHub MCP(用于获取 Issue 信息)
- Brave Search MCP(用于搜索技术文档)

## 分析流程

### 1. 获取 Issue 信息

使用 GitHub MCP 工具获取 Issue 详情:

- 调用 `mcp__github__get_issue` 获取 Issue 标题、描述、标签
- 调用 `mcp__github__list_issue_comments` 获取讨论内容
- 提取关键信息:错误信息、复现步骤、环境信息

### 2. 搜索相关技术文档

根据 Issue 内容,使用 Brave Search MCP 搜索相关资料:

- 提取 Issue 中的技术关键词(框架名、错误类型等)
- 调用 `mcp__brave_search__web_search` 搜索相关文档
- 优先搜索官方文档、Stack Overflow、GitHub Issues

搜索查询格式:
- `{框架名} {错误信息} solution`
- `{技术栈} {问题描述} best practice`

### 3. 分析问题

综合 Issue 信息和搜索结果,分析:

- 问题的根本原因
- 可能的解决方案(至少提供 2-3 个)
- 每个方案的优缺点
- 推荐方案及理由

### 4. 生成报告

生成结构化的分析报告,包含:

Issue 概览

  • 标题:
  • 仓库:
  • 状态:
  • 标签:

问题分析

[根本原因分析]

解决方案

方案一:[方案名称]

  • 实现步骤:
  • 优点:
  • 缺点:
  • 参考资料:

方案二:[方案名称]

推荐方案

[推荐哪个方案及原因]

相关资源

[搜索到的有用链接]

1
2
3
4

## 使用示例

**输入:**

分析 facebook/react 仓库的 Issue #12345

1
2
3
4
5
6
7
8
9
10
11
12
13

**执行流程:**
1. 调用 GitHub MCP 获取 Issue #12345 的详细信息
2. 提取关键词,如 "useEffect cleanup memory leak"
3. 调用 Brave Search MCP 搜索相关文档
4. 综合分析,生成报告

## 注意事项

- 如果 Issue 包含敏感信息(API Key、密码),不要在报告中包含
- 搜索时优先使用英文关键词,结果更准确
- 如果搜索结果不相关,尝试调整关键词重新搜索
- 生成的解决方案应该是可执行的,不要只是理论分析

保存这个文件。

第四步:测试 Skill

重启 Claude Code,然后测试:

1
claude

在对话中输入:

1
用 github-issue-analyzer 分析 vercel/next.js 仓库的 Issue #50000

Claude 会按照你定义的流程:

  1. 调用 GitHub MCP 获取 Issue 信息
  2. 调用 Brave Search MCP 搜索相关文档
  3. 生成详细的分析报告

高级技巧:让 Skill 更智能

技巧一:条件判断和错误处理

在 Skill 中加入条件判断,让工作流更健壮:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
## 执行流程

### 1. 获取 Issue 信息

尝试调用 `mcp__github__get_issue`

**如果失败:**
- 检查 Issue 编号是否正确
- 检查仓库名称格式(应为 owner/repo)
- 提示用户检查 GitHub Token 权限

**如果成功:**
- 继续下一步

### 2. 搜索相关文档

调用 `mcp__brave_search__web_search`

**如果搜索结果少于 3 条:**
- 尝试使用更通用的关键词重新搜索
- 或者提示用户手动提供关键词

**如果搜索结果充足:**
- 筛选最相关的 5 条结果
- 继续分析

这种方式让 Skill 能够处理异常情况,不会因为一个步骤失败就卡住。

技巧二:参数化配置

如果你的 Skill 需要一些可配置的参数,可以在 Skill 中定义:

1
2
3
4
5
6
7
8
9
10
11
## 配置参数

用户可以通过以下方式自定义行为:

- `--depth=shallow`:只分析 Issue 本身,不搜索外部文档
- `--depth=deep`:深度分析,搜索更多相关资料(默认)
- `--language=zh`:用中文生成报告
- `--language=en`:用英文生成报告(默认)

## 使用示例

分析 Issue #123 –depth=shallow –language=zh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
```

Claude 会识别这些参数,并按照你的定义调整行为。

### 技巧三:多 MCP 协同

一个 Skill 可以调用多个 MCP 服务器,创建复杂的工作流:

```markdown
# 全栈部署 Skill

## 部署流程

### 1. 代码检查
- 调用 `mcp__github__get_pull_request` 获取 PR 信息
- 调用 `mcp__github__list_pr_files` 查看修改的文件

### 2. 运行测试
- 调用 `mcp__github__create_check_run` 触发 CI/CD

### 3. 部署到测试环境
- 调用 `mcp__vercel__create_deployment` 部署到 Vercel

### 4. 监控部署状态
- 调用 `mcp__vercel__get_deployment_status` 检查部署状态
- 调用 `mcp__sentry__check_errors` 检查是否有新错误

### 5. 通知团队
- 调用 `mcp__slack__send_message` 发送部署通知

这个 Skill 串联了 GitHub、Vercel、Sentry、Slack 四个服务,实现了完整的部署流程自动化。

技巧四:动态工具选择

有时候,你不确定应该用哪个 MCP 工具。可以让 Claude 根据情况动态选择:

1
2
3
4
5
6
7
8
9
## 搜索策略

根据问题类型选择搜索工具:

- 如果是技术问题:使用 `mcp__brave_search__web_search`
- 如果是代码示例:使用 `mcp__github__search_code`
- 如果是 API 文档:使用 `mcp__context7__query_docs`

Claude 会根据 Issue 的内容,自动判断应该用哪个工具。

最佳实践

1. 明确指定 MCP 工具名称

在 Skill 中调用 MCP 工具时,使用完整的工具名称:

好的做法:

1
调用 `mcp__github__get_issue` 获取 Issue 信息

不好的做法:

1
使用 GitHub API 获取 Issue 信息

明确的工具名称让 Claude 知道应该调用哪个 MCP 工具,避免混淆。

2. 提供使用示例

在 Skill 中包含具体的使用示例,让 Claude 理解预期的输入输出:

1
2
3
## 使用示例

**输入:**

分析 facebook/react 的 Issue #12345

1
2

**预期输出:**

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
2
3
4
5
6
## 安全注意事项

- 从数据库查询的结果可能包含用户邮箱、手机号
- 在生成报告前,必须脱敏处理
- 使用 `***` 替换敏感字段的中间部分
- 示例:`user@example.com``u***@example.com`

5. 设置超时和重试

对于可能失败的 MCP 调用,定义重试策略:

1
2
3
4
5
6
7
## 错误处理

如果 MCP 调用失败:
1. 等待 2 秒后重试
2. 最多重试 3 次
3. 如果仍然失败,记录错误并继续下一步
4. 在最终报告中说明哪些步骤失败了

常见问题排查

问题 1:Skill 没有调用 MCP 工具

症状:Claude 理解了你的 Skill,但没有调用你指定的 MCP 工具。

可能原因:

  1. MCP 服务器未连接

检查:

1
claude mcp list

确保相关的 MCP 服务器状态为 connected

  1. 工具名称写错了

MCP 工具的命名格式是:mcp__服务器名__工具名

检查你的 MCP 服务器名称:

1
claude mcp list

然后在 Skill 中使用正确的格式。比如,如果服务器名是 github,工具名是 get_issue,完整名称应该是 mcp__github__get_issue

  1. Skill 的描述不够明确

Claude 可能不确定什么时候应该使用这个 Skill。在 description 中加入更多关键词:

1
2
3
4
---
name: github-issue-analyzer
description: 分析 GitHub Issue,获取 Issue 详情,搜索相关技术文档,生成解决方案。适用于 bug 分析、功能请求分析、技术问题诊断。关键词:GitHub、Issue、分析、调试
---

问题 2:MCP 调用失败

症状:Claude 尝试调用 MCP 工具,但返回错误。

排查步骤:

  1. 检查 MCP 服务器日志
1
claude mcp logs github

查看具体的错误信息。

  1. 测试 MCP 工具
1
claude mcp test github

手动测试 MCP 工具是否正常工作。

  1. 检查环境变量

很多 MCP 服务器需要 API Key 或 Token。确认环境变量已正确设置:

1
2
echo $GITHUB_TOKEN
echo $BRAVE_API_KEY
  1. 检查权限

确保你的 API Token 有足够的权限。比如 GitHub Token 需要 repo 权限才能访问私有仓库。

问题 3:Skill 执行到一半就停了

症状:Skill 执行了前几步,然后就不继续了。

可能原因:

  1. 上下文窗口满了

如果 MCP 工具返回的数据太大,可能会占满上下文窗口。

解决方法:在 Skill 中限制返回的数据量:

1
调用 `mcp__github__list_issues`,限制返回最近 10 条 Issue
  1. 遇到了需要用户确认的操作

某些 MCP 工具(比如删除、部署)可能需要用户确认。检查 Claude 是否在等待你的确认。

  1. Skill 的步骤定义不清晰

确保每个步骤都有明确的输出,让 Claude 知道何时进入下一步。

实际应用场景

场景一:自动化代码审查

创建一个 Skill,结合 GitHub MCP 和 Sentry MCP:

  1. 获取 PR 的代码变更
  2. 检查是否修复了 Sentry 中报告的错误
  3. 分析代码质量
  4. 在 PR 中添加审查评论

场景二:智能客服

创建一个 Skill,结合 Slack MCP 和数据库 MCP:

  1. 监听 Slack 中的客户问题
  2. 从数据库查询相关信息
  3. 生成回复
  4. 在 Slack 中发送回复

场景三:数据分析报告

创建一个 Skill,结合 PostgreSQL MCP 和 Slack MCP:

  1. 从数据库查询销售数据
  2. 分析趋势和异常
  3. 生成可视化报告
  4. 定时发送到 Slack 频道

场景四:文档同步

创建一个 Skill,结合 Notion MCP 和 GitHub MCP:

  1. 从 Notion 获取产品需求文档
  2. 在 GitHub 创建对应的 Issue
  3. 同步更新状态
  4. 保持两边的信息一致

写在最后

Skills 和 MCP 的结合,把 Claude Code 从一个”代码助手”变成了一个”工作流自动化平台”。

但我用了一段时间之后,发现一个问题:工作流越复杂,出错的地方就越多。一个五步的 Skill,任何一步的 MCP 调用失败,整个流程就卡住了。我花了不少时间在 Skill 里加错误处理逻辑,这本身也是一种学习成本。

创建 Skill 的过程,其实是在逼你把工作流程想清楚:哪些步骤是必需的?哪些可以自动化?哪些需要人工判断?这个梳理过程本身就有价值,即使最后 Skill 没写好,你对自己工作流的理解也更清晰了。

我现在还没解决的一个问题是:当 Skill 调用多个 MCP 工具时,怎么控制它的执行顺序和中间状态?有时候它会跳过某个步骤,或者用错工具。如果你有好的解决方案,我很想知道。