第五章:MCP(模型上下文协议)
MCP(Model Context Protocol)是 Anthropic 推出的开放协议,让 Claude 能够通过标准化接口连接外部数据源和工具。配置好 MCP 服务器后,Claude 可以直接操作 GitHub、数据库、文件系统等外部系统,大幅扩展其能力边界。
5.1 MCP 是什么
MCP 定义了 AI 模型与外部工具之间通信的标准协议,可以理解为 AI 世界的"USB 接口"——任何实现了 MCP 协议的服务器,都可以被任何支持 MCP 的 AI 客户端调用。
核心概念
| 概念 | 说明 |
|---|---|
| MCP Server | 提供工具和资源的服务端进程,可以是本地进程或远程 HTTP 服务 |
| MCP Client | 调用 MCP 服务的客户端,Claude Code 就是一个 MCP Client |
| Tool | 服务器暴露的可调用函数(如 search_issues、run_query) |
| Resource | 服务器暴露的可读取数据(如文件内容、数据库表结构) |
| Prompt | 服务器提供的预设提示模板 |
两种传输模式
| 模式 | 通信方式 | 适用场景 |
|---|---|---|
| stdio | 通过标准输入输出通信 | 本地进程,最常用 |
| SSE | HTTP Server-Sent Events | 远程服务器、多客户端共享 |
Claude Code 内置的 Read/Write/Bash 等工具是硬编码实现;MCP 工具是通过协议动态注册的,任何人都可以开发和分发 MCP 服务器。MCP 让 Claude 的能力可以无限扩展,而无需修改 Claude Code 本身。
5.2 配置 MCP 服务器
在 settings.json 的 mcpServers 字段中配置 MCP 服务器:
stdio 模式(本地进程)
{
"mcpServers": {
"服务器名称": {
"command": "启动命令",
"args": ["参数1", "参数2"],
"env": {
"ENV_VAR": "值"
}
}
}
}
SSE 模式(远程服务)
{
"mcpServers": {
"remote-service": {
"type": "sse",
"url": "https://your-mcp-server.com/sse",
"headers": {
"Authorization": "Bearer $YOUR_API_TOKEN"
}
}
}
}
在 env 和 headers 中可以用 $VAR_NAME 引用系统环境变量,避免将密钥硬编码到配置文件中。配置文件通常会提交到 Git,务必使用环境变量引用。
5.3 GitHub MCP
GitHub MCP 服务器让 Claude 可以直接操作 GitHub:读取 Issue、提交 PR 评论、搜索代码、管理 Workflow 等。
配置
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_TOKEN": "$GITHUB_TOKEN"
}
}
}
}
获取 GitHub Token:GitHub 设置 → Developer settings → Personal access tokens → 勾选 repo、issues、pull_requests 权限。
可用工具
| 工具 | 功能 |
|---|---|
search_repositories | 搜索 GitHub 仓库 |
get_file_contents | 读取仓库中的文件内容 |
list_issues | 列出仓库 Issue |
create_issue | 创建新 Issue |
create_pull_request | 创建 Pull Request |
create_review | 提交 PR Code Review |
push_files | 向仓库推送文件 |
search_code | 在 GitHub 上搜索代码 |
使用场景示例
# 分析项目 Issue
列出 anthropics/claude-code 仓库最新的 10 个 open Issue,
按优先级分类,并总结主要问题集中在哪些方面
# 自动化 Code Review
对 PR #123 的每个文件变更进行 Code Review,
重点检查安全漏洞和性能问题,以行级评论的方式提交
# 跨仓库搜索
在 GitHub 上搜索使用 @anthropic-ai/sdk 的 Node.js 项目,
找出最常见的错误处理模式
5.4 文件系统 MCP
文件系统 MCP 提供了对本地文件系统更精细的控制,可以设置允许访问的目录白名单。
配置
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/me/projects",
"/Users/me/documents"
]
}
}
}
args 中列出的路径即为允许访问的目录白名单,Claude 只能读写这些目录下的文件。
实用场景
- 跨项目文件搜索:在多个项目目录中查找特定代码模式
- 文档批量处理:对
~/documents中的 Markdown 文件批量格式化 - 配置文件管理:集中管理多个项目的配置文件
5.5 数据库 MCP
SQLite
{
"mcpServers": {
"sqlite": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-sqlite",
"--db-path", "/path/to/database.db"
]
}
}
}
PostgreSQL
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"env": {
"POSTGRES_URL": "$DATABASE_URL"
}
}
}
}
数据库 MCP 使用场景
# 数据探索
查看数据库中所有表的结构,找出 users 表和 orders 表的关联关系,
画出 ER 图(用 Mermaid 语法)
# SQL 优化
分析这个查询的执行计划并给出优化建议:
SELECT * FROM orders WHERE user_id IN (SELECT id FROM users WHERE status = 'active')
# 数据分析
统计过去 30 天每天的新注册用户数和订单数,
找出转化率最高的星期几
不要将生产数据库直接连接到 MCP。建议连接只读副本,或在 settings.json 的 permissions 中明确禁止 DELETE、DROP、TRUNCATE 等破坏性操作。
5.6 自定义 MCP 服务器
用 Node.js 实现一个最简 MCP 服务器,暴露一个"查询公司内部 API"的工具:
mkdir my-mcp-server && cd my-mcp-server
npm init -y
npm install @modelcontextprotocol/sdk
// index.js
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-internal-api', version: '1.0.0' },
{ capabilities: { tools: {} } }
);
// 注册工具列表
server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: [
{
name: 'get_employee_info',
description: '根据员工 ID 查询员工信息',
inputSchema: {
type: 'object',
properties: {
employee_id: { type: 'string', description: '员工 ID' },
},
required: ['employee_id'],
},
},
],
}));
// 实现工具逻辑
server.setRequestHandler(CallToolRequestSchema, async (request) => {
if (request.params.name === 'get_employee_info') {
const { employee_id } = request.params.arguments;
// 调用内部 API(此处用模拟数据演示)
const data = await fetchInternalAPI(`/employees/${employee_id}`);
return {
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
};
}
throw new Error(`Unknown tool: ${request.params.name}`);
});
async function fetchInternalAPI(path) {
// 替换为真实的内部 API 调用
return { id: 'E001', name: '张三', department: '工程部', title: '高级工程师' };
}
// 启动服务器
const transport = new StdioServerTransport();
await server.connect(transport);
{
"mcpServers": {
"internal-api": {
"command": "node",
"args": ["/path/to/my-mcp-server/index.js"]
}
}
}
重启 Claude Code 后,即可在会话中直接调用:
查询员工 E001 的信息,并生成一份简短的工作介绍