第五章: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通过标准输入输出通信本地进程,最常用
SSEHTTP Server-Sent Events远程服务器、多客户端共享
ℹ️
MCP vs 内置工具的区别

Claude Code 内置的 Read/Write/Bash 等工具是硬编码实现;MCP 工具是通过协议动态注册的,任何人都可以开发和分发 MCP 服务器。MCP 让 Claude 的能力可以无限扩展,而无需修改 Claude Code 本身。

5.2 配置 MCP 服务器

settings.jsonmcpServers 字段中配置 MCP 服务器:

stdio 模式(本地进程)

json
{
  "mcpServers": {
    "服务器名称": {
      "command": "启动命令",
      "args": ["参数1", "参数2"],
      "env": {
        "ENV_VAR": "值"
      }
    }
  }
}

SSE 模式(远程服务)

json
{
  "mcpServers": {
    "remote-service": {
      "type": "sse",
      "url": "https://your-mcp-server.com/sse",
      "headers": {
        "Authorization": "Bearer $YOUR_API_TOKEN"
      }
    }
  }
}
💡
环境变量引用

envheaders 中可以用 $VAR_NAME 引用系统环境变量,避免将密钥硬编码到配置文件中。配置文件通常会提交到 Git,务必使用环境变量引用。

5.3 GitHub MCP

GitHub MCP 服务器让 Claude 可以直接操作 GitHub:读取 Issue、提交 PR 评论、搜索代码、管理 Workflow 等。

配置

json
{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_TOKEN": "$GITHUB_TOKEN"
      }
    }
  }
}

获取 GitHub Token:GitHub 设置 → Developer settings → Personal access tokens → 勾选 repoissuespull_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 上搜索代码

使用场景示例

text
# 分析项目 Issue
列出 anthropics/claude-code 仓库最新的 10 个 open Issue,
按优先级分类,并总结主要问题集中在哪些方面

# 自动化 Code Review
对 PR #123 的每个文件变更进行 Code Review,
重点检查安全漏洞和性能问题,以行级评论的方式提交

# 跨仓库搜索
在 GitHub 上搜索使用 @anthropic-ai/sdk 的 Node.js 项目,
找出最常见的错误处理模式

5.4 文件系统 MCP

文件系统 MCP 提供了对本地文件系统更精细的控制,可以设置允许访问的目录白名单。

配置

json
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/Users/me/projects",
        "/Users/me/documents"
      ]
    }
  }
}

args 中列出的路径即为允许访问的目录白名单,Claude 只能读写这些目录下的文件。

实用场景

  • 跨项目文件搜索:在多个项目目录中查找特定代码模式
  • 文档批量处理:对 ~/documents 中的 Markdown 文件批量格式化
  • 配置文件管理:集中管理多个项目的配置文件

5.5 数据库 MCP

SQLite

json
{
  "mcpServers": {
    "sqlite": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-sqlite",
        "--db-path", "/path/to/database.db"
      ]
    }
  }
}

PostgreSQL

json
{
  "mcpServers": {
    "postgres": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres"],
      "env": {
        "POSTGRES_URL": "$DATABASE_URL"
      }
    }
  }
}

数据库 MCP 使用场景

text
# 数据探索
查看数据库中所有表的结构,找出 users 表和 orders 表的关联关系,
画出 ER 图(用 Mermaid 语法)

# SQL 优化
分析这个查询的执行计划并给出优化建议:
SELECT * FROM orders WHERE user_id IN (SELECT id FROM users WHERE status = 'active')

# 数据分析
统计过去 30 天每天的新注册用户数和订单数,
找出转化率最高的星期几
🔴
生产数据库安全警告

不要将生产数据库直接连接到 MCP。建议连接只读副本,或在 settings.json 的 permissions 中明确禁止 DELETEDROPTRUNCATE 等破坏性操作。

5.6 自定义 MCP 服务器

用 Node.js 实现一个最简 MCP 服务器,暴露一个"查询公司内部 API"的工具:

初始化项目
bash
mkdir my-mcp-server && cd my-mcp-server
npm init -y
npm install @modelcontextprotocol/sdk
实现服务器
javascript
// 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);
注册到 Claude Code
json
{
  "mcpServers": {
    "internal-api": {
      "command": "node",
      "args": ["/path/to/my-mcp-server/index.js"]
    }
  }
}

重启 Claude Code 后,即可在会话中直接调用:

text
查询员工 E001 的信息,并生成一份简短的工作介绍