副标题:通过一个简单的 MCP 示例,理解 Model Context Protocol 的核心原理
故事开场
"老板,我们的 AI 助手需要对接公司内部的知识库、飞书消息和高德地图 API。"
"好的,那你需要写三套不同的对接代码------一套给 Claude,一套给 GPT,一套给 DeepSeek。"
"......"
这是我去年遇到的真实场景。当时我们团队花了整整两周时间,为三个不同的大模型写了三套几乎一样的工具调用代码。代码重复率高达 80%,维护起来简直是噩梦。
直到我发现了 MCP------Model Context Protocol。它就像 AI 界的 USB-C 接口,让所有模型和工具都能统一连接。从此,一套代码,所有模型通用。
今天,我们就通过一个简单的 MCP 示例项目,来理解这个神奇协议的核心原理。
MCP 是什么?
钩子
你有没有想过,为什么电脑上的 USB 接口能插鼠标、键盘、U盘、打印机,甚至充电?因为它们都遵循同一个标准------USB 协议。
在 AI 领域,MCP 就是这个"USB 协议"。
问题
大模型本身只能处理文本,但现实世界有数据库、API、文件系统等各种资源。如何让模型统一访问这些资源?
解法
MCP(Model Context Protocol) 是 Anthropic 公司于 2024 年 11 月推出的协议,它定义了大模型与外部世界通信的标准方式。
拆解
MCP 由三部分组成:
scss
┌─────────────────────────────────────────────────────────────┐
│ MCP 架构图 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ MCP Host (智能体) │ │
│ │ Claude Code / Trae / Cursor │ │
│ └──────────────────────────────────────────────────────┘ │
│ │ │
│ │ 调用 │
│ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ MCP Client (客户端) │ │
│ │ Gitee / 高德地图 / 飞书 / 本地文件系统 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │ │
│ │ 访问 │
│ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ MCP Server (服务端) │ │
│ │ 提供上下文:数据库、API、文件、工具 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
| 组件 | 作用 | 示例 |
|---|---|---|
| MCP Host | AI 智能体,负责分析需求、调用工具 | Claude Code、Trae、Cursor |
| MCP Client | 插件式客户端,对接各种外部服务 | Gitee、高德地图、飞书 |
| MCP Server | 提供上下文服务的后端 | 文件系统、数据库、API |
核心价值
- 统一标准:一套代码,所有模型通用
- 安全可控:细粒度权限控制
- 无限扩展:接入任何外部服务
项目结构解析
钩子
让我们打开项目文件夹,看看一个最简单的 MCP 项目长什么样。
项目结构
bash
mcp/
├── readme.md # MCP 概念介绍
└── mcp-test/ # MCP 测试目录
├── .mcp.json # MCP Server 配置文件
└── test.js # 测试脚本
文件作用分析
| 文件 | 作用 | 重要性 |
|---|---|---|
readme.md |
MCP 概念介绍、架构说明 | 学习资料 |
.mcp.json |
MCP Server 配置文件,定义服务类型和参数 | 核心配置 |
test.js |
测试脚本,验证 MCP 是否正常工作 | 测试用途 |
小结
这个项目虽然简单,但包含了 MCP 的核心要素:配置文件 + 测试脚本。接下来我们深入分析配置文件。
核心配置详解
钩子
.mcp.json 是 MCP 的灵魂。它告诉 AI 智能体:"这里有一个工具,你可以这样用它。"
配置文件解析
json
{
"mcpServers": {
"filesystem": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"C:\\Users\\DMYX\\Desktop\\workspace\\lesson_zp\\ai\\mcp\\mcp-test"
]
}
}
}
字段解释
| 字段 | 值 | 说明 |
|---|---|---|
mcpServers |
对象 | 包含所有 MCP Server 配置 |
filesystem |
对象 | Server 名称,可以自定义 |
type |
"stdio" |
通信类型:stdio(标准输入输出)或 http |
command |
"npx" |
启动命令 |
args |
数组 | 命令参数 |
启动流程
vbscript
┌─────────────────────────────────────────────────────────────┐
│ MCP Server 启动流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 用户配置 .mcp.json │
│ │ │
│ ▼ │
│ AI 智能体读取配置 │
│ │ │
│ ▼ │
│ 执行命令:npx -y @modelcontextprotocol/server-filesystem │
│ │ │
│ ▼ │
│ 启动 MCP Server(文件系统服务) │
│ │ │
│ ▼ │
│ Server 监听 stdio 端口 │
│ │ │
│ ▼ │
│ AI 智能体通过 stdio 与 Server 通信 │
│ │ │
│ ▼ │
│ 提供文件读写能力给大模型 │
│ │
└─────────────────────────────────────────────────────────────┘
为什么选择 stdio 类型?
| 类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
stdio |
无需网络配置,本地运行 | 只能本地访问 | 本地工具、文件系统 |
http |
支持远程访问 | 需要配置网络 | 远程 API、云端服务 |
配置参数说明
json
"args": [
"-y", // 自动确认安装
"@modelcontextprotocol/server-filesystem", // MCP Server 包名
"C:\\Users\\...\\mcp-test" // 文件系统根目录(权限范围)
]
关键安全设计:最后一个参数指定了文件系统的根目录。AI 只能访问这个目录及其子目录,防止误删其他文件。
MCP 的工作原理
钩子
现在我们知道了配置文件怎么写,但 MCP 到底是怎么工作的?AI 怎么知道什么时候调用它?
完整工作流程
arduino
┌─────────────────────────────────────────────────────────────┐
│ MCP 完整工作流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 用户提问:"帮我读取 mcp-test 目录下的 test.js 文件" │
│ │ │
│ ▼ │
│ AI 分析需求:需要读取本地文件 │
│ │ │
│ ▼ │
│ AI 检查可用工具:发现 filesystem MCP Client │
│ │ │
│ ▼ │
│ AI 通过 MCP 协议发送请求: │
│ { │
│ "type": "read_file", │
│ "path": "test.js" │
│ } │
│ │ │
│ ▼ │
│ MCP Server 执行:读取文件内容 │
│ │ │
│ ▼ │
│ MCP Server 返回结果: │
│ { │
│ "content": "var i = 1;" │
│ } │
│ │ │
│ ▼ │
│ AI 整理回答:"test.js 文件内容是:var i = 1;" │
│ │
└─────────────────────────────────────────────────────────────┘
通信协议
MCP 使用 JSON-RPC 风格的通信:
css
请求:
{
"jsonrpc": "2.0",
"id": 1,
"method": "filesystem/read",
"params": {
"path": "test.js"
}
}
响应:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": "var i = 1;"
}
}
小结
MCP 的工作流程很简单:
- 用户提问 → AI 分析需求
- AI 判断需要调用工具 → 查找可用的 MCP Client
- 通过 MCP 协议发送请求 → Server 执行
- 返回结果 → AI 整理回答
MCP 的实际应用场景
场景1:文件操作
markdown
用户:"帮我创建一个 README.md 文件"
AI 通过 filesystem MCP:
1. 检查文件是否存在
2. 创建文件
3. 写入内容
4. 返回成功信息
场景2:代码搜索
markdown
用户:"搜索项目中所有使用 async/await 的文件"
AI 通过 filesystem MCP:
1. 遍历目录
2. 读取每个文件
3. 搜索关键词
4. 返回匹配结果
场景3:跨平台工具调用
markdown
用户:"在 Gitee 上创建一个仓库"
AI 通过 Gitee MCP:
1. 调用 Gitee API
2. 创建仓库
3. 返回仓库链接
实战总结
核心要点
- MCP 是协议,不是工具:它定义了 AI 与外部世界通信的标准方式
- 配置即接入 :通过
.mcp.json配置文件即可接入新工具 - 安全可控:细粒度权限控制,防止误操作
- 无限扩展:任何外部服务都可以封装为 MCP Server
为什么 MCP 重要?
在没有 MCP 之前:
- 每个模型有自己的工具调用方式
- 需要为每个模型写对接代码
- 工具维护成本高
有了 MCP 之后:
- 一套代码,所有模型通用
- 工具即插即用
- 快速扩展 AI 能力
如果是你,你会怎么做?
假设你要开发一个 AI 编程助手,需要支持:
- 代码搜索
- 文件读写
- Git 操作
- 代码执行
你会如何设计 MCP 配置?哪些功能适合用 stdio,哪些适合用 http?欢迎在评论区分享你的想法!
MCP 不仅仅是便利,它从根本上重构了 AI 的应用架构,把 AI 从 chatbot 推向了 Agentic AI 阶段。希望这篇文章能帮助你理解 MCP 的核心原理,开启 AI 智能体开发之旅!