MCP(Model Context Protocol)学习分享:从理论到实践
一、MCP 是什么?
MCP 不是工具,不是应用,不是 API SDK,也不是一个产品------它是一个协议。
2024 年 11 月 25 日,Anthropic 公司推出了 MCP(Model Context Protocol),被誉为 "AI 界的 USB-C 接口协议" 。它的核心目标是:让任何一个 AI 模型,都能以统一的方式去访问外部资源和工具。
在 MCP 出现之前,想让大模型对接不同的数据源(数据库、API、文件系统、SaaS 服务等),开发者需要为每个模型、每个数据源分别写适配代码------这就是 RAG(检索增强生成)和 Function Calling 时代"零散适配"的痛点。MCP 的诞生,从根本上改变了这一局面。
二、MCP 的三大角色
MCP 的架构可以类比为电脑的 USB 生态,由三个核心部分组成:
arduino
┌──────────────────────────────────────────────┐
│ MCP Host(宿主) │
│ Claude Code / Cursor / Trae / Codex │
│ │ │
│ ┌───────┴───────┐ │
│ │ MCP Client │ │
│ │ (插件式配置) │ │
│ └───────┬───────┘ │
│ │ │
│ stdio / HTTP 通信 │
│ │ │
│ ┌────────────────┼────────────────┐ │
│ │ │ │ │
│ ┌──┴──┐ ┌───┴───┐ ┌───┴───┐ │
│ │文件 │ │ 网盘 │ │ 邮件 │ │
│ │Server│ │Server │ │Server │ │
│ └─────┘ └───────┘ └───────┘ │
│ MCP Servers(服务端) │
└──────────────────────────────────────────────┘
| 角色 | 说明 | 举例 |
|---|---|---|
| MCP Host | AI 应用程序宿主 | Claude Code、Cursor、Trae |
| MCP Client | 客户端,以插件形式配置 | 高德地图 client、Gmail client |
| MCP Server | 提供上下文和工具的服务端 | 文件系统服务、数据库服务、飞书 |
工作流程:Host 通过 prompt 与大模型推理交互 → 大模型发现任务需要外部上下文 → 查看 Host 中配置了哪些 MCP Client → 选中对应的 Client 调用 → Client 通过标准协议与 Server 通信 → 返回结果给大模型生成最终回答。
三、核心价值:从 Chatbot 到 Agentic AI
MCP 最大的意义不在于"便利",而在于它从根本上重构了 AI 的应用架构 ,真正将 AI 从 Chatbot(聊天机器人) 推到了 Agentic AI(智能体 AI) 阶段。
MCP 为 Context Engineering(上下文工程)提供了标准化的通信底座,让大模型能够调用的上下文来源得到极大扩充。它统一了两大类能力:
| 类别 | 含义 | 例子 |
|---|---|---|
| Resources(资源) | 模型想知道的数据 | 数据库、API、文件、飞书文档、高德地图 |
| Tools(工具) | 模型能执行的操作 | 创建日历、发邮件、执行命令、远程控制 |
这些资源和工具,就是让大模型变得真正有用的上下文和能力。
四、实战:配置 MCP Server(以文件系统为例)
4.1 客户端配置 .mcp.json
在项目根目录下创建 .mcp.json,告诉 MCP Host 该项目需要哪些 MCP Server:
perl
{
"mcpServers": {
"filesystem": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/liaojie/Desktop/workspace/lj-ai/ai/mcp/mcp-test"
]
}
}
}
关键字段解读:
type: "stdio"--- 通信方式为标准输入/输出流(另一种是 HTTP)command: "npx"--- 通过 npx 启动(无需全局安装)args--- 传递包名和允许访问的目录路径,实现安全沙箱式的文件访问控制
当你用 Claude Code 打开这个项目时,它会自动加载这份配置,大模型就拥有了安全读写指定目录的能力。
4.2 手写一个 MCP Server
光会用还不够,我们来手写一个最简单的 MCP Server,理解底层原理。以下是 simple-read-mcp/server.js 的逐段解析:
javascript
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import fs from 'fs/promises';
核心依赖:
| 包 | 作用 |
|---|---|
@modelcontextprotocol/sdk |
MCP 协议的官方 SDK,封装了通信细节 |
zod |
数据验证库,用于声明工具的参数 schema(替代手写 JSON Schema) |
arduino
// 实例化 MCP Server
const server = new McpServer({
name: 'simple-read-mcp',
version: '1.0.0'
});
每个 MCP Server 需要有名称 和版本号,这是协议规范的要求,方便 MCP Client 发现和识别。
javascript
// 注册一个 Tool
server.tool(
"read_file", // 工具名称
"读取指定路径的本地文件内容", // 工具描述(LLM 据此判断该选哪个工具)
{
path: z.string().describe("文件的绝对或相对路径") // 参数 schema
},
async ({ path }) => { // 工具的实际执行逻辑
try {
const content = await fs.readFile(path, 'utf-8');
return {
content: [{ type: "text", text: content }]
};
} catch (err) {
return {
isError: true,
content: [{ type: "text", text: `读取文件失败:${err.message}` }]
};
}
}
);
server.tool() 的四个参数:
- 工具名 --- MCP Client 通过这个名字调用工具
- 描述 --- LLM 根据这段描述理解工具的用途,判断何时应该使用它
- 参数 Schema --- 用 Zod 定义,SDK 会自动转换为 JSON Schema 并进行校验
- 处理函数 --- 实际执行业务逻辑,返回
{ content: [...] }格式的结果
javascript
// 启动服务
async function main() {
const transport = new StdioServerTransport(); // 使用 stdio 传输层
await server.connect(transport); // 连接 Server 和 Transport
console.error("MCP read_file 服务已启动(stdio模式)");
}
main().catch(console.error);
StdioServerTransport 是 MCP 最基础的传输方式。通信通过**标准输入/输出流(stdin/stdout)**进行,无需监听网络端口,天然安全隔离。
五、通信全链路:一次 MCP 调用的完整过程
把整个流程串起来看,就是下面这条完整的链路:
arduino
用户输入 Prompt
│
▼
Claude Code(MCP Host)
│
▼
LLM 推理分析 → 判断需要读取文件
│
▼
选中 "read_file" MCP Client
│
▼
StdioServerTransport → stdin 发送请求
│
▼
simple-read-mcp Server 收到请求
│
▼
Zod 校验参数 → 执行 fs.readFile()
│
▼
返回结果 → stdout
│
▼
StdioServerTransport 接收 → Claude Code
│
▼
LLM 基于文件内容生成最终回答 → 返回给用户
整个过程对开发者来说是透明 的------SDK 封装了 stdio 通信、JSON-RPC 协议、错误处理等底层细节,开发者只需要关注注册什么工具、工具做什么事。
六、总结
| 要点 | 说明 |
|---|---|
| 本质 | MCP 是 LLM 与外部世界的通信协议,类比 USB-C |
| 三大角色 | Host(宿主应用)→ Client(配置层)→ Server(能力提供方) |
| 两种能力 | Resources(数据资源)+ Tools(可执行工具) |
| 配置方式 | .mcp.json 声明式配置,即插即用 |
| 开发三要素 | Schema 声明工具签名 + Zod 校验参数 + 协议 SDK 处理通信 |
| 传输方式 | stdio(标准流)或 HTTP,stdio 模式天然安全隔离 |
| 核心价值 | 统一标准,终结零散适配;推动 AI 从 Chatbot 进入 Agentic AI 时代 |
一句话记住 MCP: 如果你把大模型比作一台电脑的 CPU,那 MCP 就是主板上的 USB-C 接口------不管插上去的是 U 盘、键盘、网卡还是显示器,都能即插即用,无需写驱动。