mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-24 09:05:50 +00:00
384 lines
14 KiB
Markdown
384 lines
14 KiB
Markdown
# 第五章:扩展 Claude 的能力 -- MCP Server、插件、Skill
|
||
|
||
> 内置工具不够用时,用 MCP 接入外部服务,用插件扩展功能,用 Skill 沉淀工作流。
|
||
|
||
## MCP 是什么?什么时候该用它
|
||
|
||
MCP(Model Context Protocol)是一种标准化协议,让 Claude Code 能调用外部程序提供的工具和资源。你可以把它理解成一个"工具插件接口":任何实现了 MCP 协议的程序,都可以把自身能力暴露给 Claude Code 使用。
|
||
|
||
典型的使用场景包括:
|
||
|
||
- **数据库操作**:接入一个 MCP server,让 Claude Code 能直接查询和管理数据库
|
||
- **API 交互**:接入 Sentry、GitHub、Slack 等服务的 MCP server,让 Claude Code 能直接操作这些服务
|
||
- **文件系统扩展**:接入特定格式(比如 Figma 设计文件)的 MCP server
|
||
|
||
MCP server 通过三种传输方式与 Claude Code 通信:
|
||
|
||
| 传输方式 | 适合场景 | 典型命令 |
|
||
|----------|---------|---------|
|
||
| **stdio** | 本地命令行程序,如 `npx my-mcp-server` | `claude mcp add my-server -- npx my-mcp-server` |
|
||
| **SSE** | 远程服务,通过 Server-Sent Events 通信 | `claude mcp add --transport sse my-server https://example.com/sse` |
|
||
| **HTTP** | 远程 HTTP 端点 | `claude mcp add --transport http sentry https://mcp.sentry.dev/mcp` |
|
||
|
||
如果你只是想让 Claude Code 做一些固定的本地操作(比如跑测试、读日志),通常写一个 Skill(见本章后半部分)更轻量。MCP 更适合需要持续运行的外部服务或复杂的多工具场景。
|
||
|
||
## 用 `claude mcp add` 接入现成 MCP server
|
||
|
||
最常见的方式是通过 `claude mcp add` 命令,把一个现成的 MCP server 注册到 Claude Code。
|
||
|
||
### 添加 stdio 类型的 server
|
||
|
||
stdio 类型适用于本地可执行程序,比如通过 `npx` 运行的 Node.js 包:
|
||
|
||
```bash
|
||
# 添加一个 stdio server,自动以 -- 后面的内容为子命令
|
||
claude mcp add my-server -- npx my-mcp-server
|
||
|
||
# 带环境变量
|
||
claude mcp add -e API_KEY=xxx my-server -- npx my-mcp-server
|
||
|
||
# 带额外参数
|
||
claude mcp add my-server -- my-command --some-flag arg1
|
||
```
|
||
|
||
### 添加 HTTP 或 SSE 类型的 server
|
||
|
||
对于远程 MCP 服务,需要指定传输方式:
|
||
|
||
```bash
|
||
# HTTP server
|
||
claude mcp add --transport http sentry https://mcp.sentry.dev/mcp
|
||
|
||
# 带认证头的 HTTP server
|
||
claude mcp add --transport http corridor https://app.corridor.dev/api/mcp \
|
||
--header "Authorization: Bearer your-token"
|
||
|
||
# SSE server
|
||
claude mcp add --transport sse my-server https://example.com/sse
|
||
```
|
||
|
||
### 配置范围
|
||
|
||
`-s` 参数控制配置写入的位置,影响谁能看到这个 MCP server:
|
||
|
||
| 范围 | 说明 | 配置文件位置 |
|
||
|------|------|------------|
|
||
| `local`(默认) | 仅当前项目 | 项目目录下的配置文件 |
|
||
| `user` | 当前用户所有项目 | 用户主目录下的全局配置 |
|
||
| `project` | 项目级共享(可提交到 git) | 项目目录下的配置文件 |
|
||
|
||
例如,把一个数据库 MCP server 配置为整个团队可用:
|
||
|
||
```bash
|
||
claude mcp add -s project my-db -- npx my-db-mcp-server
|
||
```
|
||
|
||
## 管理已接入的 server
|
||
|
||
注册之后,你可以在对话内或通过 CLI 管理这些 MCP server。
|
||
|
||
### CLI 方式
|
||
|
||
```bash
|
||
# 列出所有已配置的 MCP server
|
||
claude mcp list
|
||
|
||
# 查看某个 server 的详情
|
||
claude mcp get my-server
|
||
|
||
# 移除一个 server
|
||
claude mcp remove my-server
|
||
|
||
# 从特定范围移除
|
||
claude mcp remove -s local my-server
|
||
```
|
||
|
||
### 对话内方式
|
||
|
||
在 REPL 中输入 `/mcp` 会打开 MCP 管理面板。你可以在这里:
|
||
|
||
- **启用/禁用 server**:`/mcp enable my-server` 或 `/mcp disable my-server`
|
||
- **批量操作**:`/mcp enable all` 或 `/mcp disable all`
|
||
- **重新连接**:`/mcp reconnect my-server`(当连接断开时)
|
||
- **查看 server 提供的工具和资源**:在面板中选择 server 查看详情
|
||
|
||
启用或禁用是会话级别的操作,不会删除配置。重启 Claude Code 后,之前禁用的 server 会恢复启用状态。
|
||
|
||
## 把 Claude Code 自己暴露为 MCP server
|
||
|
||
`claude mcp serve` 命令把 Claude Code 自身启动为一个 MCP server,让其他 MCP 客户端(比如 IDE、其他 AI 工具)能调用它的工具:
|
||
|
||
```bash
|
||
# 启动 Claude Code MCP server
|
||
claude mcp serve
|
||
|
||
# 带调试信息
|
||
claude mcp serve --debug
|
||
|
||
# 详细输出
|
||
claude mcp serve --verbose
|
||
```
|
||
|
||
这在你想把 Claude Code 的文件操作、搜索、代码编辑等能力暴露给外部工具时很有用。
|
||
|
||
## MCP server 连接了但工具看不到?排查要点
|
||
|
||
接入 MCP server 后,如果 Claude Code 似乎"不知道"新工具的存在,可能有以下原因:
|
||
|
||
1. **server 启动失败**:用 `claude mcp list` 检查 server 状态。stdio 类型的 server 如果命令路径不对或依赖缺失,会静默失败。
|
||
2. **工具是延迟加载的**:非核心工具(包括所有 MCP 工具)默认不会全部加载到上下文。Claude Code 使用 SearchExtraTools 机制,按需搜索和加载延迟工具。当你的请求需要用到 MCP 工具时,它会自动搜索并加载。
|
||
3. **OAuth 认证未完成**:需要 OAuth 的 HTTP/SSE server 如果认证未通过,工具虽然能被发现但调用会失败。
|
||
4. **scope 不对**:`claude mcp add -s local` 添加的 server 只在当前项目目录生效。切换到其他目录后该 server 不可用。
|
||
|
||
## 自己写一个 MCP server 的最小骨架
|
||
|
||
如果你找不到现成的 MCP server 来满足需求,可以自己写一个。核心步骤是:
|
||
|
||
1. 使用 MCP SDK 创建一个 Server 实例
|
||
2. 注册工具(ListTools + CallTool)
|
||
3. 通过 stdio 或 HTTP 暴露服务
|
||
|
||
下面是一个最简单的 stdio MCP server(TypeScript,使用官方 `@modelcontextprotocol/sdk`):
|
||
|
||
```typescript
|
||
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
||
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
||
import {
|
||
CallToolRequestSchema,
|
||
ListToolsRequestSchema,
|
||
} from "@modelcontextprotocol/sdk/types.js";
|
||
|
||
const server = new Server(
|
||
{ name: "my-mcp-server", version: "1.0.0" },
|
||
{ capabilities: { tools: {} } }
|
||
);
|
||
|
||
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
||
tools: [
|
||
{
|
||
name: "get_weather",
|
||
description: "Get the current weather for a city",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
city: { type: "string", description: "City name" },
|
||
},
|
||
required: ["city"],
|
||
},
|
||
},
|
||
],
|
||
}));
|
||
|
||
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
||
const { city } = request.params.arguments as { city: string };
|
||
return {
|
||
content: [{ type: "text", text: `Weather in ${city}: sunny, 22C` }],
|
||
};
|
||
});
|
||
|
||
const transport = new StdioServerTransport();
|
||
await server.connect(transport);
|
||
```
|
||
|
||
写好后注册到 Claude Code:
|
||
|
||
```bash
|
||
claude mcp add weather-server -- npx tsx my-mcp-server.ts
|
||
```
|
||
|
||
接下来在对话里让 Claude Code "查询北京的天气",它就会自动调用你的 `get_weather` 工具。
|
||
|
||
## 内置 MCP 能力:Computer Use、Chrome 控制、语音输入
|
||
|
||
除了接入外部 MCP server,Claude Code 本身也提供了几个内置的 MCP 功能,覆盖屏幕控制、浏览器操作和语音输入。
|
||
|
||
### Computer Use(屏幕控制)
|
||
|
||
通过 `--computer-use-mcp` 启动参数加载,提供截屏、键鼠控制和应用管理能力。支持 macOS、Windows、Linux 三大桌面平台,共 38 个工具。
|
||
|
||
```bash
|
||
claude --computer-use-mcp
|
||
```
|
||
|
||
启用后,Claude Code 可以看到你的屏幕、模拟鼠标键盘操作、管理应用窗口。比如你可以说"打开系统设置,把亮度调到 80%",它会截图、识别界面、操作完成。详见 [Computer Use 文档](../../features/external/computer-use.md)。
|
||
|
||
### Chrome 浏览器控制
|
||
|
||
通过 `--chrome-native-host` 或 `--claude-in-chrome-mcp` 启动参数加载。提供两种方案:
|
||
|
||
- **Chrome Use MCP**(社区开源):通过 MCP 扩展接入,适合自托管场景
|
||
- **Claude in Chrome**(原生集成):Anthropic 官方扩展,提供完整能力(截图、网络监控、JS 执行等)
|
||
|
||
详见 [Chrome 控制文档](../../features/external/chrome-control.md)。
|
||
|
||
### 语音输入
|
||
|
||
通过 `FEATURE_VOICE_MODE=1` 启用,支持 Push-to-Talk 语音输入。长按空格键录音,释放后自动转录并发送。支持 Anthropic STT 和豆包 ASR 两种后端。
|
||
|
||
```bash
|
||
FEATURE_VOICE_MODE=1 claude
|
||
```
|
||
|
||
在对话中用 `/voice` 切换语音模式,`/voice doubao` 切换到豆包后端。详见 [Voice Mode 文档](../../features/external/voice-mode.md)。
|
||
|
||
## 插件系统:安装和管理社区插件
|
||
|
||
插件(Plugin)是在 Claude Code 中扩展功能的另一种方式。与 MCP server 不同,插件可以包含工具、命令、设置项等多种能力,更像一个"功能包"。
|
||
|
||
### 浏览和安装插件
|
||
|
||
在 REPL 中输入 `/plugin`(或 `/plugins`、`/marketplace`)打开插件管理界面。你也可以用命令行子操作:
|
||
|
||
```bash
|
||
# 打开插件菜单
|
||
/plugin
|
||
|
||
# 安装插件
|
||
/plugin install plugin-name
|
||
|
||
# 从指定 marketplace 安装
|
||
/plugin install plugin-name@marketplace-url
|
||
|
||
# 管理已安装的插件
|
||
/plugin manage
|
||
|
||
# 启用/禁用/卸载
|
||
/plugin enable plugin-name
|
||
/plugin disable plugin-name
|
||
/plugin uninstall plugin-name
|
||
```
|
||
|
||
### 插件市场
|
||
|
||
插件通过 marketplace 分发。Claude Code 支持管理多个 marketplace 来源:
|
||
|
||
```bash
|
||
# 添加一个 marketplace
|
||
/plugin marketplace add https://my-marketplace.example.com/registry.json
|
||
|
||
# 列出已添加的 marketplace
|
||
/plugin marketplace list
|
||
|
||
# 更新 marketplace 索引
|
||
/plugin marketplace update
|
||
```
|
||
|
||
### 验证插件
|
||
|
||
安装前可以验证插件的完整性:
|
||
|
||
```bash
|
||
/plugin validate path/to/plugin
|
||
```
|
||
|
||
### 插件 vs MCP server
|
||
|
||
两者的界限有时模糊,但大致可以这样区分:
|
||
|
||
| 维度 | MCP Server | 插件 |
|
||
|------|-----------|------|
|
||
| 通信方式 | 标准协议(stdio/SSE/HTTP) | 直接集成到 Claude Code |
|
||
| 包含内容 | 工具和资源 | 工具 + 命令 + 设置 + UI 组件 |
|
||
| 来源 | 任何实现了 MCP 的程序 | Claude Code 插件市场 |
|
||
| 管理方式 | `claude mcp add/list/remove` | `/plugin install/manage` |
|
||
|
||
简单来说:MCP server 适合对接外部服务,插件适合扩展 Claude Code 自身的行为。
|
||
|
||
## Skill 是什么?
|
||
|
||
Skill 是一段 Markdown 文本,定义了 Claude Code 在特定场景下应该怎么行动。它不是"可执行代码",而是一份结构化的行为指南,被 Claude Code 读取后影响它的决策和操作方式。
|
||
|
||
你可以把 Skill 理解为给 Claude Code 的一份"操作手册":告诉它在遇到特定类型任务时,应该遵循什么步骤、用什么工具、注意什么事项。
|
||
|
||
### 查看可用 Skill
|
||
|
||
在 REPL 中输入 `/skills` 打开 Skill 列表面板。你会看到所有可用的 Skill 及其简要描述。每个 Skill 有一个名称和触发条件(whenToUse),Claude Code 会根据对话上下文自动匹配最相关的 Skill。
|
||
|
||
### Skill Store(远程 Skill 市场)
|
||
|
||
`/skill-store` 命令打开远程 Skill 市场,可以浏览和安装社区发布的 Skill。它需要 Anthropic API Key 或 workspace API key:
|
||
|
||
```bash
|
||
# 打开 Skill Store
|
||
/skill-store
|
||
|
||
# 列出可用 Skill
|
||
/skill-store list
|
||
|
||
# 查看某个 Skill 的详情
|
||
/skill-store get skill-id
|
||
|
||
# 查看版本历史
|
||
/skill-store versions skill-id
|
||
|
||
# 安装 Skill
|
||
/skill-store install skill-id
|
||
```
|
||
|
||
`/skill-store` 也叫 `/ss` 或 `/cloud-skills`,三个别名指向同一个命令。
|
||
|
||
### `/skills` 与 `/skill-store` 的区别
|
||
|
||
| 命令 | 作用 | 数据来源 |
|
||
|------|------|---------|
|
||
| `/skills` | 查看当前会话可用的所有 Skill(本地 + 远程 + 内置) | 本地 `.claude/skills/` 目录 + 内置 Skill |
|
||
| `/skill-store` | 浏览和安装远程社区的 Skill | Anthropic Skill 市场(需 API Key) |
|
||
|
||
简单说:`/skills` 看你"有什么",`/skill-store` 去"买新的"。
|
||
|
||
## 写一个自己的 Skill 并复用
|
||
|
||
自定义 Skill 是 Markdown 文件,放在 `.claude/skills/` 目录下(项目级)或 `~/.claude/skills/`(用户级)。
|
||
|
||
### Skill 文件结构
|
||
|
||
一个 Skill 文件就是一份结构化的 Markdown:
|
||
|
||
```markdown
|
||
---
|
||
name: my-code-review
|
||
description: Review code changes with security and performance focus
|
||
---
|
||
|
||
# Code Review Skill
|
||
|
||
When asked to review code, follow these steps:
|
||
|
||
1. Read the changed files using the Read tool
|
||
2. Check for common security issues (injection, auth bypass, data leaks)
|
||
3. Check for performance anti-patterns (N+1 queries, unnecessary allocations)
|
||
4. Verify error handling is complete
|
||
5. Report findings in a structured table format
|
||
```
|
||
|
||
把这个文件保存为 `.claude/skills/my-code-review.md` 后,Claude Code 在处理代码审查请求时就会参考这个 Skill 的指导。
|
||
|
||
### Skill 搜索与自动匹配
|
||
|
||
启用 Skill Search(`/skill-search start`)后,Claude Code 会在每轮对话中自动搜索并加载与当前任务最相关的 Skill。搜索基于 TF-IDF 向量余弦相似度算法,支持英文词干化和中文 bi-gram 分词。
|
||
|
||
```bash
|
||
/skill-search start # 启用自动匹配
|
||
/skill-search stop # 禁用自动匹配
|
||
/skill-search status # 查看当前状态
|
||
```
|
||
|
||
启用后,Skill Search 会索引 `.claude/skills/` 和 `~/.claude/skills/` 下的所有 Markdown 文件,根据对话内容自动匹配并注入相关 Skill 指导。
|
||
|
||
### 延迟工具加载:SearchExtraTools 与 ExecuteExtraTools
|
||
|
||
Claude Code 的工具系统采用延迟加载策略。核心工具(Read、Edit、Write、Bash、Glob、Grep 等 38 个)始终可用,其余工具(包括所有 MCP 工具)需要按需发现和加载。
|
||
|
||
当你让 Claude Code 执行一个需要非核心工具的操作时,它会自动完成两步:
|
||
|
||
1. **SearchExtraTools** -- 搜索并发现需要的工具
|
||
2. **ExecuteExtraTool** -- 加载并执行发现的工具
|
||
|
||
这个过程对用户完全透明。比如你说"帮我创建一个定时任务,每 5 分钟检查部署状态",Claude Code 会自动搜索 `CronCreate` 工具,然后执行它。你不需要手动触发任何操作。
|
||
|
||
## 下一步
|
||
|
||
- 想让 Claude Code 自动执行多步任务,看 [第六章:子代理、Plan 模式、Task 系统](./06-agents-plans-tasks.md)
|
||
- 想省钱和优化性能,看 [第九章:穷鬼模式、缓存、Hooks、配置文件](./09-budget-caches-hooks.md)
|
||
- 遇到 MCP server 连接问题,看 [第十章:可观测性与排错](./10-observability-troubleshooting.md)
|