MCP Model Context Protocol 完全指南

随着大语言模型(LLM)的快速发展,如何让AI助手安全、高效地连接外部数据源和工具,成为构建实用AI应用的关键挑战。Model Context Protocol(MCP)应运而生,它正在重新定义AI应用与外部世界的交互方式。

什么是 MCP?

MCP(Model Context Protocol) 是由 Anthropic 推出的开源标准协议,旨在为AI应用提供一种标准化的方式来连接外部数据源、工具和工作流。

简单来说,MCP 就像是 AI 应用的 USB-C 接口 —— 无论是什么AI助手(Claude、ChatGPT等),只要支持 MCP,就能无缝连接任何实现了该协议的数据源或工具。

为什么需要 MCP?

在 MCP 出现之前,每个 AI 应用都需要为不同的数据源编写专门的集成代码:

1
2
3
4
5
6
7
8
9
❌ 传统方式(每个集成都是定制开发):
Claude ←→ 定制代码 ←→ GitHub API
Claude ←→ 定制代码 ←→ 数据库
Claude ←→ 定制代码 ←→ 文件系统

✅ MCP 方式(一次构建,到处使用):
Claude ←→ MCP 协议 ←→ [GitHub MCP Server]
←→ [Database MCP Server]
←→ [Filesystem MCP Server]

MCP 核心架构

MCP 采用客户端-服务器架构,包含三个核心角色:

1. Host(主机)

发起连接并使用 MCP 访问数据和工具的 AI 应用程序。

示例:Claude Desktop、ChatGPT、Cursor IDE、自定义 AI 应用

2. Client(客户端)

在 Host 内部运行,负责管理与 MCP 服务器的连接、协议协商和消息路由。

职责

  • 服务器能力发现
  • 消息路由和转发
  • 连接生命周期管理

3. Server(服务器)

提供实际的数据访问和工具执行能力。

类型

  • 资源服务器:提供只读数据(文件、数据库查询结果)
  • 工具服务器:提供可执行操作(API调用、命令执行)
  • 提示服务器:提供预定义的工作流和模板

架构层次图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
┌─────────────────────────────────────────────────────────┐
│ 应用层 │
│ (Claude, ChatGPT, Cursor, 自定义应用) │
└─────────────────────────────────────────────────────────┘

MCP Client
(能力发现、路由、连接管理)

┌─────────────────────────────────────────────────────────┐
│ 传输层 │
│ (stdio / HTTP+SSE / WebSocket) │
└─────────────────────────────────────────────────────────┘

┌────────────┼────────────┐
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ MCP │ │ MCP │ │ MCP │
│ Server │ │ Server │ │ Server │
│ (GitHub)│ │ (DB) │ │ (Files) │
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
┌────┴────┐ ┌────┴────┐ ┌────┴────┐
│ GitHub │ │Database │ │Filesystem│
│ API │ │ │ │ │
└─────────┘ └─────────┘ └─────────┘

MCP 核心概念

资源(Resources)

资源是 MCP 中的只读数据,可以被 AI 应用读取和引用。

特点

  • 通过 URI 唯一标识
  • 支持订阅变更通知
  • 可以是结构化数据或二进制数据

示例

1
2
3
4
5
6
{
"uri": "file:///home/user/documents/report.pdf",
"mimeType": "application/pdf",
"name": "年度报告",
"description": "公司2025年度财务报告"
}

工具(Tools)

工具是可执行的功能,AI 应用可以调用它们来完成特定任务。

特点

  • 有明确的输入参数定义(JSON Schema)
  • 返回执行结果
  • 可能产生副作用(如创建文件、发送邮件)

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"name": "create_issue",
"description": "在GitHub仓库创建Issue",
"inputSchema": {
"type": "object",
"properties": {
"repo": {"type": "string", "description": "仓库名称"},
"title": {"type": "string", "description": "Issue标题"},
"body": {"type": "string", "description": "Issue内容"}
},
"required": ["repo", "title"]
}
}

提示(Prompts)

提示是预定义的工作流模板,帮助用户完成特定任务。

特点

  • 可参数化
  • 支持多步骤工作流
  • 可以引用资源和工具

MCP 实战:构建一个文件系统服务器

下面是一个使用 TypeScript 实现的简单文件系统 MCP 服务器示例:

1. 项目初始化

1
2
3
4
5
mkdir mcp-filesystem-server
cd mcp-filesystem-server
npm init -y
npm install @modelcontextprotocol/sdk zod
npm install -D typescript @types/node

2. 实现 MCP 服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// server.ts
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import {
CallToolRequestSchema,
ListToolsRequestSchema,
ListResourcesRequestSchema,
ReadResourceRequestSchema,
} from '@modelcontextprotocol/sdk/types.js';
import * as fs from 'fs/promises';
import * as path from 'path';
import { z } from 'zod';

// 定义工具参数模式
const ReadFileSchema = z.object({
path: z.string().describe('文件路径'),
});

const WriteFileSchema = z.object({
path: z.string().describe('文件路径'),
content: z.string().describe('文件内容'),
});

// 创建 MCP 服务器
const server = new Server(
{
name: 'filesystem-server',
version: '1.0.0',
},
{
capabilities: {
tools: {},
resources: {},
},
}
);

// 列出可用工具
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
{
name: 'read_file',
description: '读取文件内容',
inputSchema: {
type: 'object',
properties: {
path: {
type: 'string',
description: '要读取的文件路径',
},
},
required: ['path'],
},
},
{
name: 'write_file',
description: '写入文件内容',
inputSchema: {
type: 'object',
properties: {
path: {
type: 'string',
description: '要写入的文件路径',
},
content: {
type: 'string',
description: '文件内容',
},
},
required: ['path', 'content'],
},
},
],
};
});

// 处理工具调用
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;

try {
if (name === 'read_file') {
const { path: filePath } = ReadFileSchema.parse(args);
const content = await fs.readFile(filePath, 'utf-8');
return {
content: [
{
type: 'text',
text: content,
},
],
};
}

if (name === 'write_file') {
const { path: filePath, content } = WriteFileSchema.parse(args);
await fs.writeFile(filePath, content, 'utf-8');
return {
content: [
{
type: 'text',
text: `文件已成功写入: ${filePath}`,
},
],
};
}

throw new Error(`未知工具: ${name}`);
} catch (error) {
return {
content: [
{
type: 'text',
text: `错误: ${error instanceof Error ? error.message : String(error)}`,
},
],
isError: true,
};
}
});

// 启动服务器
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error('MCP Filesystem Server running on stdio');
}

main().catch(console.error);

3. 配置 Claude Desktop

在 Claude Desktop 配置文件中添加 MCP 服务器:

1
2
3
4
5
6
7
8
9
10
11
{
"mcpServers": {
"filesystem": {
"command": "node",
"args": ["/path/to/mcp-filesystem-server/dist/server.js"],
"env": {
"NODE_ENV": "production"
}
}
}
}

MCP 生态系统

官方 SDK

语言 SDK 状态
TypeScript @modelcontextprotocol/sdk 官方维护
Python mcp 官方维护
Rust mcp-rs 社区维护
Go go-mcp 社区维护

流行 MCP 服务器

服务器 功能 星标
filesystem 本地文件系统访问 2,500+
github GitHub API 集成 1,800+
postgres PostgreSQL 查询 1,200+
sqlite SQLite 数据库访问 900+
fetch HTTP 请求 800+

MCP 最佳实践

1. 设计原则

  • 单一职责:每个 MCP 服务器只做一件事,做好一件事
  • 清晰命名:工具和资源名称要直观易懂
  • 完整文档:为每个工具提供详细的参数说明和示例

2. 安全考虑

  • 输入验证:严格验证所有输入参数
  • 权限控制:实施最小权限原则
  • 错误处理:优雅处理错误,不暴露敏感信息

3. 性能优化

  • 连接复用:保持长连接,避免频繁建立连接
  • 流式响应:对于长时间运行的操作,使用流式输出
  • 资源订阅:支持变更通知,避免轮询

MCP 的应用场景

1. 开发环境增强

1
2
3
4
5
AI 助手 + MCP 可以:
- 直接读取和修改项目文件
- 执行终端命令
- 与 Git 仓库交互
- 查询数据库

2. 数据分析工作流

1
2
3
4
5
AI 助手 + MCP 可以:
- 连接 SQL/NoSQL 数据库
- 访问云存储(S3、GCS)
- 调用数据分析 API
- 生成可视化报告

3. DevOps 自动化

1
2
3
4
5
AI 助手 + MCP 可以:
- 管理 Kubernetes 集群
- 监控云资源状态
- 执行部署流水线
- 处理告警响应

MCP 与其他协议的对比

特性 MCP Function Calling Plugins
标准化 ✅ 开放标准 ❌ 各厂商不同 ❌ 平台特定
可移植性 ✅ 跨平台 ❌ 模型绑定 ❌ 应用绑定
生态系统 🟡 快速发展 ✅ 成熟 ✅ 成熟
安全性 ✅ 内置认证 🟡 依赖实现 🟡 依赖实现
易用性 ✅ 简单直观 ✅ 简单 🟡 需要开发

未来展望

MCP 正在快速发展,未来可能支持:

  • 多模态数据:图像、音频、视频处理
  • 分布式部署:远程 MCP 服务器、边缘计算
  • 联邦网络:MCP 服务器之间的互连
  • 标准化市场:MCP 服务器的应用商店

总结

MCP 代表了 AI 应用开发范式的转变:

  1. 解耦:AI 模型与数据源分离
  2. 标准化:统一的接口协议
  3. 可组合:灵活组合不同能力
  4. 安全:内置安全机制
  5. 开放:开源生态,社区驱动

对于构建 AI 原生应用的开发者来说,掌握 MCP 已成为必备技能。它不仅能加速开发,还能让你的应用无缝接入不断增长的 MCP 生态系统。


参考资料