MCP (Model Context Protocol) 详解
什么是 MCP?
MCP 是 Anthropic 开发的开放标准,让 AI 模型安全访问外部数据和系统。
传统 AI 只能处理对话中的文本信息,无法读取文件、查询数据库或调用 API。MCP 解决了这个限制,让 AI 能够:
- 读取本地文件和文档
- 查询数据库获取实时数据
- 调用外部API获取最新信息
- 执行系统操作
这相当于为 AI 提供了”手”和”眼”,让它能真正与现实世界交互。
MCP 数据流详解
完整的交互流程
想象你问 AI:“帮我分析一下今天的销售数据”,整个流程是这样的:
1. 用户提问
↓
2. AI 理解需求:需要访问销售数据库
↓
3. AI 通过 MCP 向数据库服务器发送请求
↓
4. MCP 服务器验证权限和参数
↓
5. 执行数据库查询
↓
6. 将查询结果返回给 AI
↓
7. AI 分析数据并生成报告
↓
8. 向用户展示分析结果
具体数据流示例
场景: AI 需要读取一个配置文件
第1步 - AI 发起请求:
{
"jsonrpc": "2.0",
"id": "req_001",
"method": "tools/call",
"params": {
"name": "read_file",
"arguments": {
"path": "/app/config/database.json"
}
}
}
第2步 - MCP 服务器验证和处理:
- 检查文件路径是否在允许范围内 ✓
- 验证文件是否存在 ✓
- 检查读取权限 ✓
- 读取文件内容
第3步 - 返回结果:
{
"jsonrpc": "2.0",
"id": "req_001",
"result": {
"content": [
{
"type": "text",
"text": "{\n \"host\": \"localhost\",\n \"port\": 5432\n}"
}
]
}
}
第4步 - AI 处理数据: AI 获得配置信息后,可以继续执行后续操作,比如连接数据库。
MCP 的核心价值
没有 MCP 的情况:
- 用户问:“今天销售额多少?“
- AI 回答:“我无法访问你的销售数据,请手动查询后告诉我”
有了 MCP 的情况:
- 用户问:“今天销售额多少?“
- AI 通过 MCP 查询数据库
- AI 回答:“今天销售额是 15.2 万元,比昨天增长了 8.3%“
关键差异:
- 实时性: 获取最新数据而非过时信息
- 自动化: AI 主动获取数据而非被动等待
- 准确性: 直接访问源数据而非依赖转述
- 效率: 一次对话解决问题而非多次交互
核心概念
1. 协议架构
MCP 采用客户端-服务器架构,通过标准化协议连接AI和外部系统:
┌─────────────┐ MCP Protocol ┌─────────────┐ Direct Access ┌─────────────┐
│ Claude │ ←──────────────→ │ MCP Server │ ←────────────────→ │ Database │
│ (Client) │ JSON-RPC 2.0 │ (Proxy) │ Native Calls │ Files │
│ │ │ │ │ APIs │
└─────────────┘ └─────────────┘ └─────────────┘
各组件职责:
- MCP Client (AI): 发起请求,处理响应,生成用户答案
- MCP Server: 验证安全性,执行操作,返回结果
- External Resources: 实际的数据源(数据库、文件系统、API等)
数据流向:
- AI 需要外部数据时,向 MCP Server 发送请求
- MCP Server 验证请求合法性和安全性
- MCP Server 访问实际数据源获取数据
- 数据经过处理后返回给 AI
- AI 基于获得的数据生成回答
这种架构的好处:
- 解耦: AI 不需要了解每个系统的具体API
- 安全: 统一的安全验证和权限控制
- 标准化: 所有外部系统都通过相同的协议接入
2. 主要组件
Resources(资源)
可读取的数据,如文件内容、数据库记录、网页内容等。
Tools(工具)
可执行的操作,如读写文件、查询数据库、调用API等。
Prompts(提示词)
预定义的对话模板,可重复使用并传入参数。
技术实现原理
消息格式(JSON-RPC 2.0)
MCP 基于 JSON-RPC 2.0 协议,这是一种轻量级的远程过程调用协议:
为什么选择 JSON-RPC?
- 简单易懂:基于JSON,人类可读
- 语言无关:任何支持JSON的语言都可以实现
- 成熟稳定:已被广泛使用和验证
消息结构:
{
"jsonrpc": "2.0", // 协议版本
"id": 1, // 请求唯一标识
"method": "tools/call", // 调用的方法
"params": { // 方法参数
"name": "read_file",
"arguments": {"path": "/tmp/data.txt"}
}
}
TypeScript 实现示例
下面是一个简洁的MCP客户端和服务端实现示例:
/**
* MCP 核心类型定义
*/
interface JsonRpcRequest {
/** JSON-RPC 协议版本 */
jsonrpc: "2.0";
/** 请求唯一标识符 */
id: string | number;
/** 调用方法名 */
method: string;
/** 方法参数 */
params?: Record<string, unknown>;
}
/**
* MCP 工具定义
*/
interface McpTool {
/** 工具名称 */
name: string;
/** 工具描述 */
description: string;
/** 参数结构定义 */
inputSchema: {
type: "object";
properties: Record<string, { type: string; description: string }>;
required?: string[];
};
}
/**
* MCP 客户端
*/
class McpClient {
/** 请求ID计数器 */
private requestId = 0;
/**
* 发送请求到服务器
* @param method - 方法名
* @param params - 参数
* @returns 响应结果
*/
async request(method: string, params?: Record<string, unknown>): Promise<any> {
const request: JsonRpcRequest = {
jsonrpc: "2.0",
id: ++this.requestId,
method,
params
};
// 实际实现中这里会发送HTTP/WebSocket请求
console.log('发送请求:', request);
return this.mockResponse(request);
}
/**
* 调用MCP工具
* @param toolName - 工具名称
* @param args - 工具参数
*/
async callTool(toolName: string, args: Record<string, unknown>) {
return this.request('tools/call', { name: toolName, arguments: args });
}
/**
* 获取工具列表
*/
async listTools() {
return this.request('tools/list');
}
/**
* 模拟服务器响应
*/
private async mockResponse(request: JsonRpcRequest) {
await new Promise(resolve => setTimeout(resolve, 100));
return { jsonrpc: "2.0", id: request.id, result: "模拟响应" };
}
}
/**
* MCP 服务器
*/
class McpServer {
/** 工具注册表 */
private tools = new Map<string, {
/** 工具定义 */
definition: McpTool;
/** 处理函数 */
handler: Function
}>();
/**
* 注册工具
* @param definition - 工具定义
* @param handler - 处理函数
*/
registerTool(definition: McpTool, handler: Function) {
this.tools.set(definition.name, { definition, handler });
}
/**
* 处理客户端请求
* @param request - JSON-RPC请求
*/
async handleRequest(request: JsonRpcRequest) {
try {
switch (request.method) {
case 'tools/list':
const tools = Array.from(this.tools.values()).map(t => t.definition);
return { jsonrpc: "2.0", id: request.id, result: { tools } };
case 'tools/call':
const { name, arguments: args } = request.params as any;
const tool = this.tools.get(name);
if (!tool) throw new Error(`工具不存在: ${name}`);
const result = await tool.handler(args);
return { jsonrpc: "2.0", id: request.id, result };
default:
throw new Error(`未知方法: ${request.method}`);
}
} catch (error: any) {
return {
jsonrpc: "2.0",
id: request.id,
error: { code: -32000, message: error.message }
};
}
}
}
/**
* 使用示例
*/
async function example() {
// 创建服务器并注册工具
const server = new McpServer();
server.registerTool({
name: 'calculate',
description: '数学计算工具',
inputSchema: {
type: 'object',
properties: {
expression: { type: 'string', description: '数学表达式' }
},
required: ['expression']
}
}, async (args: any) => {
const result = eval(args.expression); // 生产环境请使用安全的计算库
return { content: [{ type: 'text', text: `结果: ${result}` }] };
});
// 创建客户端并调用
const client = new McpClient();
// 获取工具列表
const tools = await client.listTools();
console.log('可用工具:', tools);
// 调用计算工具
const result = await client.callTool('calculate', { expression: '2 + 3 * 4' });
console.log('计算结果:', result);
}
// 运行示例
example().catch(console.error);
这个简化版本演示了MCP的核心概念:
- JSON-RPC协议:标准化的请求响应格式
- 工具系统:可注册和调用的功能模块
- 类型安全:完整的TypeScript类型定义
- 错误处理:统一的异常处理机制
主要方法说明
客户端方法:
request()
: 发送JSON-RPC请求callTool()
: 调用指定工具listTools()
: 获取可用工具列表
服务端方法:
registerTool()
: 注册新工具handleRequest()
: 处理客户端请求
传输层选择
MCP 支持多种通信方式,适应不同的部署场景:
stdio(标准输入输出)
- 最简单的通信方式,通过命令行程序的输入输出
- 适合本地开发和简单集成
- AI 启动一个 MCP 服务器进程,通过管道通信
HTTP
- 基于 Web 标准的通信方式
- 适合跨网络部署和云服务集成
- 支持负载均衡和横向扩展
WebSocket
- 支持双向实时通信
- 适合需要推送通知或流式数据的场景
- 比如实时监控、聊天机器人等
应用场景详解
文件系统操作
功能: 让 AI 能够读写本地文件系统 场景举例:
- 代码审查:AI 读取代码文件,分析潜在问题
- 文档处理:批量处理Word、PDF文档,提取关键信息
- 日志分析:读取服务器日志,发现异常模式
- 配置管理:修改配置文件,自动化部署
数据库查询
功能: 让 AI 直接查询各种数据库 场景举例:
- 业务分析:查询销售数据,生成报表和洞察
- 用户支持:查询用户信息,快速解决客服问题
- 运维监控:查询系统指标,分析性能瓶颈
- 数据清理:识别重复或异常数据
外部API调用
功能: 让 AI 调用第三方服务获取实时信息 场景举例:
- 智能助手:获取天气、新闻、股价等实时信息
- 内容创作:调用翻译、图片生成、语音合成API
- 社交媒体:自动发布内容,监控品牌提及
- 支付处理:查询交易状态,处理退款
安全机制详解
MCP 内置多层安全机制,确保 AI 访问外部系统的安全性:
权限控制(沙箱机制)
原理: 使用白名单机制限制访问范围 实现:
- 文件访问:只允许访问指定目录,禁止访问系统文件
- 网络访问:限制可访问的域名和端口
- 命令执行:禁止执行危险的系统命令
示例: AI 只能读取 /home/user/documents/
目录,无法访问 /etc/passwd
输入验证(防注入攻击)
原理: 严格验证所有输入参数 实现:
- SQL注入防护:只允许SELECT查询,过滤特殊字符
- 路径穿越防护:检查
../
等危险路径 - 命令注入防护:禁止执行系统命令
示例: SELECT * FROM users WHERE id='; DROP TABLE users; --
会被直接拒绝
速率限制(防滥用)
原理: 限制请求频率和资源使用 实现:
- 时间窗口限制:每分钟最多 60 次请求
- 并发限制:同时最多 5 个活跃连接
- 资源配额:限制文件大小、查询结果数量
示例: 超过限制时返回 429 Too Many Requests
错误
技术对比
特性 | MCP | OpenAI Function Calling | LangChain Tools |
---|---|---|---|
标准化 | 开放协议 | OpenAI 专有 | 框架特定 |
传输方式 | stdio/HTTP/WS | HTTP API | Python 内存 |
安全性 | 内置机制 | API 密钥 | 自实现 |
扩展性 | 高度可扩展 | 受限于 API | 框架内扩展 |
MCP 的优势与未来
核心优势
标准化带来的好处:
- 一次开发,多处使用:MCP服务器可以被不同AI应用复用
- 生态互操作:不同厂商的工具可以无缝集成
- 降低学习成本:统一的API设计模式
安全性优势:
- 内置安全机制,而非事后补救
- 多层防护,从协议层到应用层
- 细粒度权限控制,最小化风险
开发效率:
- 丰富的SDK和工具链支持
- 清晰的错误处理和调试信息
- 完善的文档和示例
总结
MCP 为 AI 模型与外部系统集成提供了标准化、安全的解决方案。它不仅解决了AI访问外部数据的技术问题,更为构建可信、可扩展的AI应用生态奠定了基础。
通过本文你可以:
- 理解 MCP 的核心概念和技术原理
- 掌握安全机制和最佳实践
- 了解实际应用场景和发展前景
MCP 正在成为 AI 应用开发的重要基础设施,值得开发者深入学习和实践。