MCP
让 Claude Code 的能力扩展到 GitHub、数据库、知识库等外部系统
不用手动复制粘贴 — 在对话中直接访问外部数据手动搬运
你有没有发现,每次需要外部数据都要在应用间来回切换?
查 PR 信息
想看看当前仓库的 open PR 有哪些。你打开浏览器 → 登录 GitHub → 找到 PR → 复制内容 → 粘贴给 Claude。来回切了三次。
查数据库
需要确认线上某个用户的订单状态。你连上数据库 → 跑查询 → 导出结果 → 粘贴给 Claude。查一次两分钟,查十次二十分钟。
发通知
Claude 做完代码审查,你想把结果发到团队频道。手动复制 → 打开 Slack → 粘贴发送。每次都是纯手工操作。
开始之前
适合谁
- 希望让 Claude 接入 GitHub、数据库、内部平台等外部能力的开发者
- 厌倦了在工具之间手动复制粘贴的人
- 理解命令和 Skill 的基本用法,想进一步扩展 Claude 的能力边界
读完后你应该已经能
- 说清 MCP 的定位和三层架构
- 配置和使用一个 MCP server
- 判断"什么时候用 MCP,什么时候用 Memory 就够了"
- 掌握最关键的安全注意事项
首次设置
从零开始接入一个 MCP Server,只需五步
确定要接入的
外部系统
HTTP(远程)
或 Stdio(本地)
环境变量
或 Token
CLI 命令
或 .mcp.json
claude mcp list
确认可用
前置条件
- Claude Code — 已安装并可用
- MCP Server — 对应服务的 server 包(如
@modelcontextprotocol/server-github) - 认证信息 — API Token、OAuth 凭据或数据库连接字符串
快速验证清单
# 1. 添加 server
$ claude mcp add my-db -- npx @mcp/server-db
# 2. 确认已注册
$ claude mcp list
# 3. 查看暴露的工具
$ claude mcp get my-db
# 4. 在对话中试用
> "用 my-db 查一下用户表有多少行"
三层架构
MCP 不是什么神秘的东西——它就是一套标准化的"工具连接方式"
MCP(Model Context Protocol)是 Claude Code 访问外部工具、服务和 API 的标准协议。
说白了,它就是一个"翻译器"——Claude 不需要知道每个外部系统怎么调用,MCP 把不同的外部系统统一翻译成同一种"工具"格式。这个比喻只是为了帮你建立直观感受。在技术上,MCP 实际上是一个基于 JSON-RPC 的通信协议,Claude 通过它向 MCP Server 发送请求,Server 再把请求转发给外部系统。
调用者
发起工具请求
工具提供者
翻译请求
GitHub / DB /
Slack / API
三个概念
Server、Tool、Schema——理解这三个就够了
| 概念 | 说明 | 例子 |
|---|---|---|
| MCP Server | 一个独立服务进程,提供一组工具 | GitHub MCP Server |
| Tool | Server 暴露的具体功能 | list_prs、create_issue |
| Schema | 工具的参数和返回值定义 | {"repo": string, "state": "open"} |
就像一个餐厅——Server 是餐厅本身,Tool 是菜单上的菜品,Schema 是每道菜的配料表(你不能给素食菜加牛肉)。
这个比喻只是为了帮你建立直观感受。实际上 Tool 就是一个函数签名,Schema 定义了它接收什么参数、返回什么结构。
/ 菜单中,格式是 /mcp__<server>__<prompt>。比如 /mcp__github__list_prs。
请求响应
每次 MCP 调用都遵循三步模式
根据上下文判断需要
调用哪个工具,传入参数
MCP Server 验证参数
转发给外部系统执行
外部系统返回数据
Server 按 Schema 格式化后回传
# 对话中的实际流程
用户: "列出仓库 open 的 PR"
Claude → MCP Server:
调用 mcp__github__list_prs({ repo: "my-project", state: "open" })
MCP Server → GitHub API → MCP Server → Claude:
返回 [{ title: "Fix login bug", number: 42, author: "alice" }, ...]
Claude → 用户:
"当前有 3 个 open PR,最新的是 alice 的 #42 Fix login bug"
传输方式
两种连接 MCP Server 的方式
HTTP(推荐远程)
通过 HTTP 连接远程服务。适合第三方服务和企业内网。
# 添加 HTTP MCP server
$ claude mcp add my-server --transport http \
--url https://api.example.com/mcp
Stdio(本地进程)
通过标准输入输出连接本地进程。适合本地运行的工具。
# 添加本地 MCP server
$ claude mcp add my-local \
-- npx my-mcp-server
.mcp.json 中配置 ws:// URL 即可连接支持 WebSocket 的 MCP Server。适合需要实时双向通信的场景。
Windows 注意事项
- Shell 差异:Windows 上 Stdio 模式使用的 shell 与 Unix 不同,
command字段要写完整路径或确保命令在 PATH 中 - 环境变量:使用
${VAR}语法,实际变量在 Windows 系统环境变量中设置 - 路径写法:配置文件中路径使用正斜杠
/,或使用转义的反斜杠\\
OAuth 2.0 认证
- 部分 MCP Server 支持 OAuth,Claude 可通过交互式浏览器流程完成授权
- 也可以在配置中预配置凭据(Client ID / Secret),跳过交互步骤
- 适合需要安全接入的企业级服务(如 Google Workspace、Azure DevOps)
服务器生态
常见的 MCP Server 都能干什么
| MCP Server | 能力 | 典型工具 | 认证方式 |
|---|---|---|---|
| GitHub | 仓库管理 | list_prs, create_issue, push | OAuth / Token |
| Database | SQL 查询 | query, insert, update | 连接字符串 |
| Filesystem | 文件操作 | read, write, search | OS 权限 |
| Slack | 团队通信 | send_message, list_channels | Token |
| Google Docs | 文档访问 | read, write, share | OAuth |
| Context7 | 库文档查询 | latest_docs | 内置 |
组合使用
一个项目可以同时接入多个 MCP Server。比如"每日报告"工作流:GitHub 拉取 PR 统计 → Database 查询销售数据 → Slack 发送报告——全在对话中完成。
Elicitation
有些 MCP Server 在运行时需要用户提供额外信息。Claude 会把 Server 的问题转发给你,你回答后 Claude 再把结果传回去——不需要提前配置所有参数。
动态工具更新
MCP Server 增加或移除工具时,Claude 可以在运行时感知变化,不需要重启会话。比如你中途更新了 Server 版本,新工具立即可用。
工具自动搜索
Claude 会根据当前上下文自动查找可用的 MCP 工具。你不需要记住工具名——只要描述清楚需求,Claude 自动匹配合适的工具。
@ 提及资源
除了工具调用,MCP 还提供资源引用。你可以在 prompt 中用 @ 直接提及某个 MCP 资源(如一份远程文档),Claude 会自动读取其内容。
Subagent 作用域
你可以限制某些 MCP Server 只允许特定 subagent 使用。比如数据库 MCP 只给数据分析 agent 开放,不让代码审查 agent 接触。
插件自带 MCP
插件可以把 MCP Server 打包分发。安装一个插件 = 自动获得它提供的所有 MCP 工具,不需要单独配置 server。
实战示例
配置好 GitHub MCP 后,在对话中直接操作 GitHub
能做什么
- PR 管理:列出、查看、审查、合并 PR
- Issue 管理:创建、搜索、更新、关闭 Issue
- 仓库信息:查看状态、分支、标签
- Commit 操作:查看提交历史、比较差异
实际对话
用户: "列出这个仓库的 open PR"
Claude: 调用 mcp__github__list_prs
→ 返回 PR 列表
用户: "审查 PR #42"
Claude: 调用 mcp__github__pr_review(42)
→ 返回审查结果 + 建议
数据库实战
配置好 Database MCP 后,在对话中直接查询数据库
配置方式
// .mcp.json 中添加数据库 server
{
"mcpServers": {
"my-db": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"env": {
"DATABASE_URL": "${DATABASE_URL}"
}
}
}
}
实际对话
用户: "查一下最近 7 天的新增用户数"
Claude: 调用 mcp__my-db__query(
"SELECT COUNT(*) FROM users
WHERE created_at > NOW() - INTERVAL '7 days'"
)
→ 返回结果: [{ count: 1284 }]
用户: "按天分组呢?"
Claude: 调用 mcp__my-db__query(
"SELECT DATE(created_at) AS day,
COUNT(*) AS cnt
FROM users
WHERE created_at > NOW() - INTERVAL '7 days'
GROUP BY day ORDER BY day"
)
→ 返回每日数据,Claude 生成趋势分析
report.csv"——Claude 直接调用文件系统工具完成,不需要你手动导出。
输出限制
MCP 工具返回数据太大?有办法控制
问题场景
- 数据库查询返回几千行结果,撑爆上下文窗口
- GitHub API 返回完整的 diff 内容,token 消耗暴增
- 文件系统读取超大日志文件,对话卡住
控制手段
- 限制 token 数:在工具调用中指定返回上限
- 分页获取:使用
limit和offset参数分批拉取 - 增大上限:需要完整结果时,可增大最大输出到 50,000 tokens
# 增大 MCP 输出上限
$ claude config set mcpMaxOutputTokens 50000
安全实践
MCP 接入外部系统时,安全是第一优先级
应该做的
- 只授权必要的工具
- 优先使用最小权限
- 检查输出是否可信
- 用环境变量存认证信息
- 把项目级配置版本化
不要做的
- 把 API key 写死在仓库里
- 默认开放所有工具
- 忽视网络和认证风险
- 一次性拉回过多数据
mcp__github(整个 server)、mcp__github__*(所有工具)、mcp__github__get_issue(特定工具)。从最具体的开始授权,不要一上来就给 *。
上下文膨胀
数据量大时,把 MCP 当代码 API 来用,减少来回传输
问题:传统方式
- 把大量数据全量塞进上下文 → token 浪费严重
- 每个 round-trip 都要重新传输数据 → 效率低下
- 两个信息源(上下文 + 外部数据)同时在耗 token
方案:MCP + 代码执行
- 用 MCP 工具做实时查询,只取需要的数据
- 在代码中循环处理,不做 round-trip → 减少 token
- 只把最终结果传回给 Claude 的上下文
示例:过滤大数据集
# 不要这样(全量拉取)
> "查出所有用户给我看"
→ 返回 10000 行,上下文爆了
# 应该这样(精确查询)
> "查出活跃度前 10 的用户"
→ MCP 只返回 10 条,token 可控
示例:循环处理
# 不要来回对话(每轮都传数据)
> "处理第 1 批" → 返回结果
> "处理第 2 批" → 返回结果(又要传上下文)
# 应该:让 Claude 写代码循环
> "写个脚本遍历所有批次,
用 MCP 查询并汇总"
→ 一次完成,无 round-trip
MCP vs Memory
什么时候该接外部系统,什么时候写规则就够了
| 维度 | Memory | MCP |
|---|---|---|
| 数据类型 | 长期规则、偏好 | 实时数据、外部操作 |
| 更新频率 | 手动更新 | 实时同步 |
| 适合场景 | 编码规范、项目架构 | GitHub 操作、数据库查询 |
| token 消耗 | 每次加载 | 按需调用 |
CLAUDE.md)。如果需要"实时操作或数据"用 MCP(接入外部系统)。
Claude 作服务端
Claude Code 自身也可以作为 MCP Server 运行
# 启动 Claude Code 作为 MCP Server(stdio 模式)
$ claude mcp serve
工作方式
- 运行
claude mcp serve后,Claude Code 暴露一组 MCP 工具 - 其他应用(如 Claude Desktop、IDE 插件)可以通过 MCP 协议调用 Claude Code 的能力
- 适合把 Claude Code 嵌入已有工具链中
典型场景
- IDE 集成:让编辑器通过 MCP 直接调用 Claude Code 的文件编辑、代码分析能力
- 工具链串联:把 Claude Code 作为"代码智能"节点接入自动化流水线
- 多 Agent 协作:其他 Agent 通过 MCP 协议调用 Claude Code 完成编码任务
配置管理
两种方式:CLI 命令或直接写配置文件
方式 1:CLI 命令
# 添加 MCP server
$ claude mcp add github --transport http --url https://...
# 列出所有 MCP servers
$ claude mcp list
# 查看特定 server 详情
$ claude mcp get github
# 移除 MCP server
$ claude mcp remove github
方式 2:配置文件
// 文件:.mcp.json(项目级)
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_TOKEN": "${GITHUB_TOKEN}"
}
},
"database": {
"command": "npx",
"args": ["@modelcontextprotocol/server-database"],
"env": {
"DATABASE_URL": "${DATABASE_URL}"
}
}
}
}
| 作用域 | 配置文件 | 适合 |
|---|---|---|
| 项目级 | .mcp.json | 团队共享的 server,随 Git 同步 |
| 用户级 | ~/.claude.json | 个人常用 server,不进 Git |
${GITHUB_TOKEN} 引用环境变量。实际值在运行时读取,这样同一份配置在不同机器上自动使用各自的凭据——不用把密钥写进文件。
更多管理命令
# 重置项目级审批选择(重新询问权限)
$ claude mcp reset
# 从 Claude Desktop 导入已有配置
$ claude mcp import
已经在 Claude Desktop 里配好了 MCP?用 import 一键导入到 Claude Code,不用重复配置。
企业受管配置
企业可以通过受管设置(Managed Settings)统一向团队分发 MCP 配置。管理员指定允许的 Server 清单和认证方式,团队成员无需单独配置——开箱即用。
- 统一管控:哪些 Server 可以用、权限边界在哪
- 集中认证:由管理员统一维护 Token 和凭据
- 合规审计:所有 MCP 调用可追溯
排错指南
Schema 不匹配
症状:工具调用报错,提示参数类型不对。
修复:检查参数类型定义。工具期望 JSON 对象但你传了字符串?用 claude mcp get <server> 查看工具的完整 Schema。
权限不足
症状:Server 能连接,但工具调用被拒。
修复:检查 OAuth/Token 配置。确认环境变量中的认证信息有效。试试 claude mcp get <server> 看工具列表。
网络超时
症状:外部服务响应慢,工具调用卡住。
修复:设置超时和重试策略。检查网络连接和代理配置。
返回数据过大
症状:查询结果太多,上下文被撑爆。
修复:在工具调用时使用过滤和分页参数。限制返回的条目数。避免 SELECT * 式的全量查询。
找不到 MCP Server
症状:claude mcp list 里看不到刚添加的 server,或调用时报"server not found"。
修复:确认 server 包已安装(npm list -g 检查)、配置文件路径正确、command 字段的命令可以正常执行。
认证失败
症状:Server 能连接,但每次调用都报 401/403。
修复:检查环境变量是否设置(echo $GITHUB_TOKEN)、确认 Token 权限范围是否足够、重新 export 变量后再启动 Claude Code。
Server 崩溃
症状:调用工具后 Server 无响应或直接退出。
修复:查看 Server 的 stderr 日志、降低并发请求数、简化参数重试。如果 Server 是 Node.js 进程,检查内存是否足够。
动手练习
为一个常见需求设计"工具接口"
不用写代码,只设计接口。重点是想清楚"输入什么、输出什么、出错怎么办"。
- 定义输入参数(项目名、环境)
- 定义输出格式(状态、版本、最后部署时间)
- 定义错误类型(项目不存在、环境无效、连接失败)
参考答案
{
"name": "get_deployment_status",
"description": "查询指定项目在指定环境的部署状态",
"inputSchema": {
"type": "object",
"properties": {
"project": {
"type": "string",
"description": "项目名称"
},
"environment": {
"type": "string",
"enum": ["dev", "staging", "production"],
"description": "目标环境"
}
},
"required": ["project", "environment"]
},
"outputSchema": {
"status": "deployed | deploying | failed | not_found",
"version": "v2.3.1",
"lastDeployedAt": "2025-01-15T10:30:00Z",
"deployedBy": "ci-pipeline"
},
"errors": {
"PROJECT_NOT_FOUND": "项目不存在",
"INVALID_ENVIRONMENT": "环境参数无效",
"CONNECTION_FAILED": "无法连接到部署平台"
}
}
本章回顾
到这里,你已经能
- 说清 MCP 的定位和三层架构
- 理解 Server / Tool / Schema 的关系
- 配置和使用 MCP server
- 掌握最关键的安全注意事项
- 判断"何时用 MCP vs Memory"
*。