前言
在进阶指南的第六节里,我用大约 45 行介绍了 MCP 的基本概念:配置 settings.json,列了 5 个常用 Server,给了两个使用场景。
但 MCP 的深度远不止于此。它是 Claude Code 从"代码助手"进化为"全栈开发平台"的关键拼图。通过 MCP,Claude Code 可以直接操作 GitHub、查询数据库、调用 Figma 设计稿、管理 Firebase 后端——所有这些都在同一个终端会话里完成。
这篇文章把 MCP 讲透。
一、MCP 是什么
1.1 一句话定义
MCP(Model Context Protocol)是一个开放协议,定义了 AI 应用(客户端)与外部工具/数据源(服务端)之间的标准通信方式。
类比:MCP 之于 AI 应用,就像 USB-C 之于硬件设备。 有了统一接口,任何 AI 应用都能接入任何工具,不需要为每个工具写专门的集成代码。
1.2 架构模型
┌─────────────┐ JSON-RPC 2.0 ┌─────────────┐
│ Claude Code │ ◄──────────────────► │ MCP Server │
│ (客户端) │ stdio / HTTP │ (服务端) │
└─────────────┘ └─────────────┘
│ │
│ 发现工具、调用工具、获取结果 │ 连接外部系统
│ │ GitHub / DB / API...
MCP 采用客户端-服务端架构:
- 客户端(Claude Code):发现可用工具,决定何时调用,处理返回结果
- 服务端(MCP Server):暴露工具能力,连接外部系统,执行实际操作
- 通信协议:JSON-RPC 2.0,结构化的请求-响应模式
1.3 三大核心原语
MCP 定义了三种能力类型:
| 原语 | 控制方 | 说明 | 示例 |
|---|---|---|---|
| Tools | 模型调用 | 可执行的操作,类似 API 端点 | 创建 GitHub Issue、查询数据库 |
| Resources | 客户端控制 | 只读数据源,类似 GET 端点 | 读取文件内容、获取配置信息 |
| Prompts | 用户触发 | 预定义的提示词模板 | 代码审查模板、SQL 生成模板 |
在 Claude Code 中,Tools 是最常用的原语。当你配置一个 MCP Server 后,Claude 会自动发现它提供的所有工具,并在合适的时机调用。
1.4 传输机制
MCP 支持两种传输方式:
| 传输方式 | 适用场景 | 特点 |
|---|---|---|
| stdio | 本地 Server | Server 作为子进程运行,通过标准输入/输出通信。最常用 |
| Streamable HTTP | 远程 Server | 通过 HTTP 端点通信,支持 SSE 流式传输。适合云端部署 |
Claude Code 两种都支持。本地开发场景下,绝大多数 Server 使用 stdio。
二、配置方式
2.1 三个配置层级
MCP Server 可以在三个层级配置,优先级从高到低:
| 层级 | 文件路径 | 作用域 | 提交到 Git? |
|---|---|---|---|
| 项目本地 | .claude.json(项目根目录) | 当前项目,仅自己 | ❌ 已在 .gitignore |
| 项目共享 | .claude/settings.json | 当前项目,团队共享 | ✅ 团队统一 |
| 用户全局 | ~/.claude/settings.json | 所有项目 | ❌ 个人配置 |
经验法则:
- 包含个人 Token 的配置 → 项目本地(
.claude.json)或用户全局 - 团队都需要的 Server → 项目共享(
.claude/settings.json) - 个人常用的通用 Server → 用户全局(
~/.claude/settings.json)
2.2 JSON 配置格式
{
"mcpServers": {
"server-name": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_TOKEN": "ghp_xxxxxxxxxxxx"
}
}
}
}字段说明:
| 字段 | 必填 | 说明 |
|---|---|---|
command | ✅ | 启动命令(npx、uvx、node、python 等) |
args | ✅ | 命令参数数组 |
env | ❌ | 环境变量,用于传递 Token、密钥等 |
type | ❌ | 传输类型,默认 stdio,远程用 url |
url | ❌ | 远程 Server 的 HTTP 端点(type: "url" 时必填) |
2.3 CLI 命令添加
除了手动编辑 JSON,还可以用命令行:
# 添加 stdio 类型的 Server
claude mcp add github -e GITHUB_TOKEN=ghp_xxx -- npx -y @modelcontextprotocol/server-github
# 添加远程 Server
claude mcp add remote-server --transport http --url https://example.com/mcp
# 指定配置层级
claude mcp add github --scope user -e GITHUB_TOKEN=ghp_xxx -- npx -y @modelcontextprotocol/server-github
claude mcp add github --scope project -- npx -y @modelcontextprotocol/server-github
# 查看已配置的 Server
claude mcp list
# 删除 Server
claude mcp remove github2.4 交互式管理
在 Claude Code 会话中输入 /mcp,可以交互式查看和管理所有已配置的 MCP Server:
- 查看每个 Server 的连接状态
- 查看每个 Server 提供的工具列表
- 重启出错的 Server
三、常用 MCP Server
MCP 生态已经非常丰富。以下按来源分类介绍最实用的 Server。
3.1 官方参考实现
这些由 Anthropic 或 MCP 官方维护,质量和稳定性有保障:
| Server | 用途 | 安装命令 |
|---|---|---|
| Filesystem | 访问指定目录外的文件(安全沙箱) | npx -y @modelcontextprotocol/server-filesystem /path |
| GitHub | Issues、PR、仓库操作、代码搜索 | npx -y @modelcontextprotocol/server-github |
| PostgreSQL | 只读查询 PostgreSQL 数据库 | npx -y @modelcontextprotocol/server-postgres |
| Brave Search | 网络搜索(需要 API Key) | npx -y @modelcontextprotocol/server-brave-search |
| Puppeteer | 浏览器自动化、截图、爬取 | npx -y @modelcontextprotocol/server-puppeteer |
| Fetch | HTTP 请求,获取网页/API 内容 | npx -y @modelcontextprotocol/server-fetch |
配置示例——GitHub + Brave Search:
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_TOKEN": "ghp_xxxxxxxxxxxx"
}
},
"brave-search": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-brave-search"],
"env": {
"BRAVE_API_KEY": "BSA_xxxxxxxxxxxx"
}
}
}
}3.2 第一方 Server(公司官方维护)
这些由各产品公司官方开发和维护:
| Server | 用途 | 安装方式 |
|---|---|---|
| Figma | 读取设计稿、提取组件和样式 | npx -y figma-developer-mcp --figma-api-key=xxx |
| Supabase | 数据库操作、Auth、Storage | npx -y @supabase/mcp-server-supabase |
| Stripe | 支付管理、订阅、发票 | npx -y @stripe/mcp |
| Notion | 页面读写、数据库查询 | npx -y @notionhq/notion-mcp-server |
| Slack | 发送消息、管理频道 | npx -y @anthropic/mcp-server-slack |
| Firebase | Firestore、Auth、App Hosting | npx -y firebase-tools@latest |
| Sentry | 错误追踪、性能监控 | npx -y @sentry/mcp-server-sentry |
| Playwright | 端到端测试、浏览器自动化 | npx -y @anthropic/mcp-server-playwright |
3.3 社区热门 Server
| Server | 用途 | 安装方式 |
|---|---|---|
| Context7 | 获取最新库文档(解决训练数据过时问题) | npx -y @upstash/context7-mcp |
| Sequential Thinking | 结构化思考,分步推理复杂问题 | npx -y @anthropic/mcp-sequential-thinking |
| Firecrawl | 网页爬取、转 Markdown | npx -y firecrawl-mcp |
3.4 配置建议
不要一次性配置太多 Server。每个 Server 都会增加 Claude 的工具发现开销。建议:
- 核心开发:GitHub + Filesystem(几乎所有项目都需要)
- 按需添加:根据项目技术栈添加对应 Server
- 临时使用:用
.claude.json配置临时需要的 Server,用完删除
四、安全最佳实践
MCP 赋予了 Claude Code 强大的外部访问能力,但也引入了新的安全风险。
4.1 主要攻击向量
| 攻击类型 | 描述 | 风险等级 |
|---|---|---|
| 工具投毒 | 恶意 Server 在工具描述中注入隐藏指令 | 🔴 高 |
| 输出注入 | Server 返回结果中包含 prompt injection | 🔴 高 |
| Rug Pull | Server 更新后行为改变,之前安全的工具变得危险 | 🟡 中 |
| 凭证泄露 | Token 硬编码在配置文件中,意外提交到 Git | 🟡 中 |
| 权限过大 | Server 获得超出需要的访问权限 | 🟡 中 |
4.2 防护措施
| 措施 | 做法 | 原因 |
|---|---|---|
| 环境变量 | Token 放 env 字段,不硬编码 | 避免意外提交到 Git |
| 锁定版本 | @modelcontextprotocol/server-github@1.2.3 | 防止 rug pull 攻击 |
| 最小权限 | GitHub Token 只给需要的 scope | 限制爆炸半径 |
| 审查工具描述 | 用 /mcp 查看 Server 暴露的工具列表 | 发现可疑的隐藏工具 |
| 人工确认 | 保持 Claude Code 的权限提示开启 | 敏感操作前人工审批 |
| 来源可信 | 优先使用官方和知名社区 Server | 降低供应链风险 |
| 定期审计 | 定期检查已配置的 Server 列表 | 清理不再使用的 Server |
4.3 安全配置示例
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github@2.2.0"],
"env": {
"GITHUB_TOKEN": "${GITHUB_TOKEN}"
}
}
}
}关键点:
- 锁定版本号(
@2.2.0),不用latest - 引用环境变量(
${GITHUB_TOKEN}),不硬编码 Token - 配置在
.claude.json(不提交到 Git),而非.claude/settings.json
五、构建自定义 MCP Server
当现有 Server 不能满足需求时,你可以自己构建。
5.1 官方 SDK
MCP 提供了多语言 SDK:
| 语言 | 包名 | 成熟度 |
|---|---|---|
| TypeScript | @modelcontextprotocol/sdk | ✅ 稳定 |
| Python | mcp[cli](FastMCP) | ✅ 稳定 |
| Java | io.modelcontextprotocol:sdk | ✅ 稳定 |
| Kotlin | io.modelcontextprotocol:kotlin-sdk | ✅ 稳定 |
| C# | ModelContextProtocol | ✅ 稳定 |
| Go | github.com/mark3labs/mcp-go | 🟡 社区 |
| Dart | package:dart_mcp | 🟡 社区 |
| Rust | mcp-server | 🟡 社区 |
5.2 TypeScript 示例
用 @modelcontextprotocol/sdk 构建一个简单的天气查询 Server:
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const server = new McpServer({
name: "weather-server",
version: "1.0.0",
});
// 定义一个工具
server.tool(
"get-weather",
"获取指定城市的天气信息",
{
city: z.string().describe("城市名称,如 Beijing"),
},
async ({ city }) => {
// 实际项目中调用天气 API
const response = await fetch(
`https://api.weatherapi.com/v1/current.json?key=${process.env.WEATHER_API_KEY}&q=${city}`
);
const data = await response.json();
return {
content: [
{
type: "text",
text: JSON.stringify(data, null, 2),
},
],
};
}
);
// 启动 Server
const transport = new StdioServerTransport();
await server.connect(transport);5.3 Python 示例(FastMCP)
Python 的 FastMCP 框架更简洁:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("my-server")
@mcp.tool()
def query_inventory(product_id: str) -> str:
"""查询产品库存信息"""
# 实际项目中查询数据库
return f"产品 {product_id} 库存: 42 件"
@mcp.tool()
def update_price(product_id: str, new_price: float) -> str:
"""更新产品价格"""
# 实际项目中更新数据库
return f"产品 {product_id} 价格已更新为 {new_price}"
if __name__ == "__main__":
mcp.run(transport="stdio")5.4 注册到 Claude Code
构建完成后,在配置中注册:
{
"mcpServers": {
"weather": {
"command": "node",
"args": ["./mcp-servers/weather/index.js"]
},
"inventory": {
"command": "python",
"args": ["./mcp-servers/inventory/server.py"]
}
}
}也可以用 CLI:
claude mcp add weather -- node ./mcp-servers/weather/index.js
claude mcp add inventory -- python ./mcp-servers/inventory/server.py5.5 开发调试
MCP 官方提供了 Inspector 工具,方便调试:
# 安装 MCP Inspector
npx @modelcontextprotocol/inspector
# 测试你的 Server
npx @modelcontextprotocol/inspector node ./mcp-servers/weather/index.jsInspector 提供一个 Web UI,可以:
- 查看 Server 暴露的所有工具
- 手动调用工具并查看返回结果
- 检查 JSON-RPC 通信日志
六、实战示例:Flutter 全栈开发
这是 MCP 真正发光的场景。通过组合多个 MCP Server,Claude Code 可以覆盖 Flutter 项目从设计到部署的完整流程。
6.1 技术栈与 MCP 配置
假设我们要开发一个 Flutter ���商应用,技术栈:
- 前端:Flutter(Dart)
- 后端:Firebase(Firestore + Auth + Hosting)
- 设计:Figma
- 版本控制:GitHub
对应的 MCP 配置:
{
"mcpServers": {
"dart": {
"command": "dart",
"args": ["tooling-daemon", "--mcp"]
},
"figma": {
"command": "npx",
"args": ["-y", "figma-developer-mcp", "--figma-api-key=fig_xxx"]
},
"firebase": {
"command": "npx",
"args": ["-y", "firebase-tools@latest"],
"env": {
"FIREBASE_TOKEN": "your-firebase-token"
}
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_TOKEN": "ghp_xxxxxxxxxxxx"
}
}
}
}6.2 Dart & Flutter MCP Server
Dart SDK 内置了 MCP Server 支持(通过 dart tooling-daemon --mcp),提供以下工具:
| 工具 | 功能 |
|---|---|
dart_fix | 自动修复 Dart 代码问题(lint 建议) |
dart_format | 格式化 Dart 代码 |
pub_search | 搜索 pub.dev 包 |
pub_add | 添加依赖到 pubspec.yaml |
pub_outdated | 检查过时的依赖 |
analyze | 静态分析,报告错误和警告 |
实际使用场景:
你:搜索 pub.dev 上最流行的状态管理库,比较 riverpod 和 bloc 的最新版本
Claude:[调用 pub_search] 搜索结果...
- riverpod: ^2.6.1, 5892 likes
- flutter_bloc: ^8.1.6, 4521 likes
让我比较一下两者的特点...
你:用 riverpod,帮我添加依赖
Claude:[调用 pub_add] 已添加 flutter_riverpod: ^2.6.1 到 pubspec.yaml
6.3 Figma MCP:设计到代码
Figma MCP Server 让 Claude 直接读取设计稿:
你:读取 Figma 设计稿 https://figma.com/file/xxx,提取产品卡片组件的设计规范
Claude:[调用 figma/get_file] 分析设计稿...
产品卡片组件规范:
- 圆角: 12px
- 阴影: 0 2px 8px rgba(0,0,0,0.1)
- 图片区域: 宽高比 4:3
- 标题: 16px, FontWeight.w600
- 价格: 20px, Color(0xFFE53935)
- 内边距: 16px
我来生成对应的 Flutter Widget...
然后 Claude 会基于提取的设计规范,直接生成 Flutter 代码:
class ProductCard extends StatelessWidget {
final String imageUrl;
final String title;
final double price;
const ProductCard({
super.key,
required this.imageUrl,
required this.title,
required this.price,
});
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
boxShadow: [
BoxShadow(
color: Colors.black.withValues(alpha: 0.1),
blurRadius: 8,
offset: const Offset(0, 2),
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AspectRatio(
aspectRatio: 4 / 3,
child: Image.network(imageUrl, fit: BoxFit.cover),
),
Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(title,
style: const TextStyle(
fontSize: 16, fontWeight: FontWeight.w600)),
const SizedBox(height: 4),
Text('¥${price.toStringAsFixed(2)}',
style: const TextStyle(
fontSize: 20, color: Color(0xFFE53935))),
],
),
),
],
),
);
}
}6.4 Firebase MCP:后端操作
Firebase MCP Server 让 Claude 直接管理后端:
你:在 Firestore 创建 products 集合,添加几个测试商品数据
Claude:[调用 firebase/firestore_add_document]
已创建 products 集合,添加了 3 个测试文档:
- product_001: Flutter 入门指南, ¥59.00
- product_002: Dart 编程实战, ¥79.00
- product_003: Firebase 全栈开发, ¥99.00
你:配置 Firebase Auth,启用邮箱登录
Claude:[调用 firebase/auth_configure]
已启用 Email/Password 认证方式。
6.5 完整工作流
把所有 MCP Server 串联起来,一个完整的开发流程:
第一步:设计 → 代码
你:读取 Figma 设计稿,把首页的产品列表页面转成 Flutter 代码
第二步:添加依赖
你:这个页面需要网络请求和状态管理,帮我选择合适的库并添加依赖
第三步:后端集成
你:创建 Firestore 数据模型,写一个 Repository 层连接 Firebase
第四步:功能完善
你:添加用户认证功能,登录后才能查看购物车
第五步:代码质量
你:分析整个项目的代码质量,修复所有 lint 警告
第六步:提交代码
你:创建一个 PR,标题是 "feat: add product listing page"
每一步 Claude 都会调用对应的 MCP 工具,而你只需要用自然语言描述需求。
七、MCP vs 其他扩展方式
Claude Code 有多种扩展机制,各有适用场景:
| 特性 | MCP Server | Hooks | Slash Commands | CLAUDE.md |
|---|---|---|---|---|
| 本质 | 外部工具协议 | Shell 命令 | 提示词模板 | 自然语言指令 |
| 执行方式 | Claude 决定何时调用 | 系统自动触发 | 用户手动触发 | Claude 理解后遵守 |
| 确定性 | Claude 判断 | 100% 确定 | 100% 确定 | 建议性 |
| 能力范围 | 连接外部系统 | 本地 Shell 操作 | 复用提示词 | 行为约束 |
| 典型场景 | GitHub、数据库、API | 格式化、lint、安全拦截 | 代码审查、测试生成 | 编码风格、架构约定 |
| 配置位置 | settings.json | settings.json | .claude/commands/ | CLAUDE.md |
何时用哪个?
- 需要访问外部系统(GitHub、数据库、Figma)→ MCP
- 需要确定性执行本地操作(每次保存后 lint)→ Hooks
- 需要复用复杂提示词(代码审查模板)→ Slash Commands
- 需要约束 Claude 的行为(编码风格、禁止某些操作)→ CLAUDE.md
它们不是互斥的,最佳实践是组合使用:
CLAUDE.md:定义项目规范和编码风格
Hooks:保证代码质量(自动格式化、lint)
Slash Commands:封装常用工作流(/review、/test)
MCP:连接外部工具和数据源
八、常见问题
Q1:MCP Server 没有出现在工具列表中?
检查步骤:
- 运行
/mcp查看 Server 状态 - 确认 JSON 配置格式正确(注意逗号、引号)
- 确认
command指向的程序已安装(如npx、uvx) - 检查
env中的 Token 是否有效 - 尝试
claude mcp remove xxx后重新添加
Q2:Server 启动后报错怎么调试?
# 用 Inspector 调试
npx @modelcontextprotocol/inspector npx -y @modelcontextprotocol/server-github
# 手动运行 Server 查看错误输出
npx -y @modelcontextprotocol/server-github 2>&1Q3:多个 Server 会影响性能吗?
会。每个 Server 都是一个独立进程,Claude 在每次会话开始时需要发现所有工具。建议:
- 常用 Server 保持 3-5 个
- 临时需要的 Server 用
.claude.json配置,用完删除 - 不用的 Server 及时清理
Q4:如何在团队中共享 MCP 配置?
把不含敏感信息的配置放在 .claude/settings.json(提交到 Git):
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_TOKEN": "${GITHUB_TOKEN}"
}
}
}
}团队成员各自在本地设置 GITHUB_TOKEN 环境变量。
Q5:自定义 Server 如何处理错误?
在工具实现中返回 isError: true:
server.tool("risky-operation", "执行风险操作", {}, async () => {
try {
const result = await doSomething();
return { content: [{ type: "text", text: result }] };
} catch (error) {
return {
content: [{ type: "text", text: `错误: ${error.message}` }],
isError: true,
};
}
});Q6:MCP 和 Claude Code 的内置工具有什么区别?
Claude Code 内置了文件读写、Bash 执行、搜索等工具。MCP 扩展的是 Claude Code 无法直接访问的外部系统。两者互补:
- 内置工具:本地文件系统、Shell 命令、代码搜索
- MCP 工具:GitHub API、数据库、第三方服务、浏览器自动化
Q7:远程 MCP Server 安全吗?
远程 Server 通过 HTTP 通信,需要额外注意:
- 确保使用 HTTPS
- 验证 Server 的身份(域名、证书)
- 不要在 URL 中传递敏感信息
- 优先使用官方托管的远程 Server
总结
MCP 是 Claude Code 最强大的扩展机制。核心要点:
- MCP = AI 的 USB-C — 标准化协议,让 Claude Code 接入任何外部工具
- 安全第一 — 锁定版本、环境变量、最小权限,不要为了方便牺牲安全
- 组合使用 — MCP + Hooks + Slash Commands + CLAUDE.md,各司其职
从 GitHub 操作到数据库查询,从 Figma 设计稿到 Firebase 后端,MCP 让 Claude Code 真正成为一个全栈开发平台。
推荐阅读
- Claude Code 进阶指南 — 全面了解 Claude Code 的核心能力
- CLAUDE.md 编写指南 — 让 Claude 理解你的项目
- Claude Code Hooks 指南 — 确定性自动化
- 上下文管理指南 — 管好上下文,让 MCP 工具调用更精准
- 多 Agent 并行指南 — MCP + 多 Agent 实现团队级效率
- 自定义 Slash Commands 指南 — 封装常用工作流
- MCP 官方文档 — 协议规范和 Server 目录
- MCP Server 仓库 — 官方参考实现