Audience: 对技术感兴趣的普通用户 + Python 开发者
承接上文: 第三章《把大模型变成“职场老油条”的智能体》
上一章我们讲完了 Agent(智能体)。我们知道了 Agent 之所以强大,是因为它长了手(Tools),能调用搜索、计算、写代码。
但是,这里有个很尴尬的问题:
Agent 的手,和工具之间,是没有“通用接口”的。
这就导致了一个局面:
你给 Cursor 写的工具,在 Claude Desktop 里用不了;
你给 Windows 写的工具,在 Mac 上跑不起来。
直到 Anthropic 提出了 MCP(Model Context Protocol,模型上下文协议)。
它的目标只有一个:让 AI 工具像 USB-C 一样通用。
01 为什么我们需要 MCP?
技术名词:MCP(Model Context Protocol,模型上下文协议)
没有 MCP 的世界(战国时代)
想象一下你的电脑:
打印机要用 Printer Cable
显示器要用 HDMI
硬盘要用 USB
这时候你想换个电脑,所有的线都得换。
这就是现在的 AI 生态:每个 Agent 都要单独适配一套工具。
有了 MCP 的世界(大一统)
现在,你的电脑全是 USB-C。
打印机插 USB-C
显示器插 USB-C
硬盘插 USB-C
这就是 MCP。它定义了一套标准,让 Agent(客户端) 和 Tools(服务端) 可以无障碍对话。
通俗解释:
MCP 就是那个强迫所有厂家都用同一种充电口的欧盟标准。以后买手机不用挑充电器了,随便插。
02 MCP 的核心架构
技术名词:MCP Host、MCP Client、MCP Server
MCP 采用的是经典的 客户端-服务器(C/S)架构。
┌─────────────────────┐│ AI Application │ ← 你的应用 (Host)│ (Claude, Cursor) │└─────────┬───────────┘│ MCP Protocol (JSON-RPC)┌─────────▼───────────┐│ MCP Client │ ← 连接器└─────────┬───────────┘│ stdio / HTTP┌─────────▼───────────┐│ MCP Server │ ← 工具提供者│ (Filesystem, Git) │└─────────────────────┘
MCP Host(宿主): 运行 AI 的地方(比如 Cursor 编辑器)。
MCP Client(客户端): 负责跟 Server 握手、发请求。
MCP Server(服务端): 提供具体能力(比如读取文件、查数据库)。
03 MCP 能提供什么?
技术名词:Resources(资源)、Tools(工具)、Prompts(提示词)
MCP Server 主要对外暴露三种东西:
1️⃣ Resources(资源)
定义: 静态或半静态的数据源。
例子: 本地文件、数据库记录、Git 仓库。
特点: 只读。就像你给 AI 看你的简历,但不能让它改。
2️⃣ Tools(工具)
定义: 可以被调用的函数。
例子:grep搜索、git commit、发邮件。
特点: 有副作用(会改变世界)。这就是 Agent 的手。
3️⃣ Prompts(提示词)
定义: 预置的指令模板。
例子: “你是一个资深 Java 工程师,请 Review 这段代码。”
04 开发者时间:Python 实现 MCP Server
Anthropic 官方提供了 Python SDK。我们来写一个简单的 File Reader MCP Server(让 AI 读本地文件)。
1. 安装依赖
bash
pip install mcppip install mcp
2. 编写 MCP Server (filesystem_server.py)
python
from mcp.server.fastmcp import FastMCPimport os# 1. 创建 MCP Server 实例mcp = FastMCP("FileSystemServer")# 2. 定义一个 Resource(资源)# 让 AI 能查看特定目录下的文件列表@mcp.resource("file://{path}")def read_file_resource(path: str) -> str:"""读取文件内容"""print(f"📄 [Resource] 正在读取: {path}")try:with open(path, 'r', encoding='utf-8') as f:return f.read()except Exception as e:return f"Error reading file: {e}"# 3. 定义一个 Tool(工具)# 让 AI 能列出目录@mcp.tool()def list_directory(path: str) -> list:"""列出目录下的所有文件和文件夹"""print(f"📁 [Tool] 正在列出目录: {path}")if not os.path.exists(path):return ["Path does not exist"]return os.listdir(path)# 4. 定义一个 Prompt(提示词)@mcp.prompt()def review_code_prompt(code: str) -> str:"""生成代码 Review 的提示词"""return f"请作为资深工程师,Review 以下代码,指出潜在 Bug:\n\n{code}"# 5. 启动 Serverif __name__ == "__main__":print("🚀 启动 FileSystem MCP Server...")mcp.run()
3. 配置 MCP Client(以 Cursor 为例)
在你的 Cursor 配置文件 (mcp.json) 中添加:
{"mcpServers": {"filesystem": {"command": "python","args": ["/path/to/filesystem_server.py"]}}}
4. 发生了什么?
当你在 Cursor 里问:
“帮我看看 main.py里有什么?”
Cursor (Host) 收到请求。
MCP Client 发现
filesystemServer 注册了file://资源。MCP Server 执行
read_file_resource("main.py")。文件内容通过 MCP 协议 传回 Cursor。
AI 拿到了文件内容,开始回答。
05 MCP 为什么是革命性的?
维度 | 传统 Function Calling | MCP |
|---|---|---|
通用性 | 厂商锁定(OpenAI 格式 / Anthropic 格式) | 通用标准(一次编写,到处运行) |
安全性 | 需要把 API Key 给 AI | 本地运行(Server 跑在你电脑上,不用传 Key) |
发现机制 | 硬编码在代码里 | 动态发现(Agent 可以问 Server:你有啥工具?) |
通俗解释:
以前是“我给你一把钥匙,你只能开我家的门”。
现在是“我给你一个万能插座,你插谁家的电器都能用”。
06 工程上的坑
权限控制: MCP Server 跑在本地,能读你的所有文件。一定要做好路径白名单(
chroot或sandbox)。性能: 每次调用都要起一个子进程,冷启动会有延迟。
调试: JSON-RPC 的报错信息极其晦涩,建议先写好单元测试。
07 总结
MCP 的出现,标志着 AI 从 “玩具” 走向 “生产力工具”。
Router 解决了“谁干活”的问题。
Agent 解决了“怎么干”的问题。
MCP 解决了“在哪干、用什么干”的问题。
下期预告:
既然 MCP 能让 AI 读取本地文件了,那如果文件太多(比如整个代码仓库),AI 读不过来怎么办?
这就需要 RAG(检索增强生成) 技术了。
《别让 AI 瞎编!RAG 外挂知识库实战》,我们将深入向量数据库的黑盒。
夜雨聆风