MCP 协议概述
MCP(Model Context Protocol)是一种开放标准协议,旨在为大型语言模型(LLM)提供统一、安全的外部工具与数据源接入方式。它由 Anthropic 提出并率先在 Claude 中实现,核心目标是解决传统 LLM 与外部系统交互时的碎片化问题——每个工具需要定制 API、认证方式与上下文传递格式,导致开发成本高、扩展性差。
MCP 借鉴了 LSP(Language Server Protocol)的设计哲学,将“工具能力”与“模型调用”解耦:Claude 作为客户端(Client),通过 MCP 协议与服务器(Server)通信,服务器负责封装实际的数据源或工具逻辑(如数据库查询、文件系统操作、第三方 API 调用等)。Claude 只需理解 MCP 标准消息格式,无需关心底层实现细节。
核心架构与通信流程
MCP 采用客户端-服务器架构,通信基于 JSON-RPC 2.0 协议,支持同步请求和异步通知。典型交互流程如下:
- 初始化:Claude 客户端向 MCP Server 发送
initialize请求,获取服务器支持的 capabilities(如工具列表、资源类型)。 - 能力协商:双方确认协议版本与功能集,例如是否支持“流式响应”或“文件资源”。
- 工具调用:Claude 根据用户意图,通过
tools/call请求调用服务器上的具体工具,服务器执行后返回结果。 - 资源访问:若需要读取外部数据源(如数据库表、文件内容),使用
resources/read请求。
下图是一个简化示例(用文本表示交互逻辑):
Claude (Client) MCP Server (e.g., Database)
| |
|--- initialize (capabilities) ------->|
|<--- server_info (tools list) --------|
| |
|--- tools/call (query_users) -------->|
|<--- result (user data JSON) ---------|
| |
|--- resources/read (config.json) ---->|
|<--- content (file content) ----------|
关键参数与配置示例
MCP 的可配置项集中在服务器端,以下为 claude_desktop_config.json 中的典型配置(该文件用于 Claude Desktop 客户端注册 MCP 服务器):
{
"mcpServers": {
"local-file-server": {
"command": "node",
"args": ["/path/to/mcp-server.js"],
"env": {
"ALLOWED_PATHS": "/data",
"MAX_FILE_SIZE": "10485760"
}
},
"remote-api-server": {
"url": "http://localhost:3000/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
关键参数说明:
| 参数 | 类型 | 说明 | 示例值 |
|---|---|---|---|
command | string | 本地服务器的启动命令 | "node", "python" |
args | array | 命令参数列表 | ["server.js"] |
url | string | 远程服务器的 HTTP 端点 | "http://localhost:3000/mcp" |
env | object | 环境变量配置 | {"API_KEY": "xxx"} |
headers | object | 自定义 HTTP 请求头 | {"Authorization": "Bearer xxx"} |
实战:构建一个简单的 MCP 文件服务器
下面是一个基于 Node.js 的最小化 MCP 文件服务器示例,它实现两个工具:read_file 和 list_files。
// mcp-file-server.js
const { Server } = require('@modelcontextprotocol/sdk/server');
const { StdioServerTransport } = require('@modelcontextprotocol/sdk/server/stdio');
const fs = require('fs').promises;
const path = require('path');
const server = new Server(
{ name: 'file-server', version: '1.0.0' },
{ capabilities: { tools: {} } }
);
// 定义工具
server.setRequestHandler('tools/list', async () => ({
tools: [
{
name: 'read_file',
description: '读取指定文件内容',
inputSchema: {
type: 'object',
properties: { filePath: { type: 'string' } },
required: ['filePath']
}
},
{
name: 'list_files',
description: '列出目录内容',
inputSchema: {
type: 'object',
properties: { dirPath: { type: 'string' } },
required: ['dirPath']
}
}
]
}));
// 处理工具调用
server.setRequestHandler('tools/call', async (request) => {
const { name, arguments: args } = request.params;
if (name === 'read_file') {
const content = await fs.readFile(args.filePath, 'utf-8');
return { content: [{ type: 'text', text: content }] };
} else if (name === 'list_files') {
const files = await fs.readdir(args.dirPath);
return { content: [{ type: 'text', text: files.join('\n') }] };
}
throw new Error(Unknown tool: ${name});
});
const transport = new StdioServerTransport();
await server.connect(transport);
启动命令(在 claude_desktop_config.json 中配置):
node mcp-file-server.jsClaude 收到用户请求“读取 /data/notes.txt”后,会通过 MCP 协议调用 read_file 工具,服务器返回文本内容,Claude 即可基于该内容进行后续推理或回答。
与传统 API 集成的对比
| 特性 | 传统 API 集成 | MCP 协议 |
|---|---|---|
| 工具发现 | 需预定义所有 API 端点 | 动态 tools/list 发现 |
| 认证方式 | 每个 API 独立实现 | 统一在 Server 层处理 |
| 上下文传递 | 需手动拼接历史 | 协议自带 context 字段 |
| 扩展性 | 每新增工具需修改客户端 | 仅需部署新 Server |
| 安全性 | 依赖应用层过滤 | 支持 scope 限制 |
小结
MCP 协议通过标准化的客户端-服务器架构,为 Claude 等 LLM 提供了一种高效、可扩展的外部工具集成方案。它解决了传统 API 集成中工具发现困难、认证分散、上下文传递混乱等问题,让开发者只需专注于实现 MCP Server 的业务逻辑,而 Claude 客户端自动处理协议交互。对于进阶开发者,理解 MCP 的 JSON-RPC 消息格式、Server 能力声明机制以及环境变量配置,是构建生产级 AI Agent 的关键。随着生态发展,MCP 有望成为 LLM 与外部世界交互的基础设施标准。