乐于分享
好东西不私藏

AI 的 USB-C 接口:MCP 协议详解

AI 的 USB-C 接口:MCP 协议详解

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)│  (ClaudeCursor)   │└─────────┬───────────┘          │ MCP Protocol (JSON-RPC)┌─────────▼───────────┐│   MCP Client        │  ← 连接器└─────────┬───────────┘          │ stdio / HTTP┌─────────▼───────────┐│   MCP Server        │  ← 工具提供者│  (FilesystemGit)  │└─────────────────────┘
  • 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 mcp
pip 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里有什么?”

  1. Cursor (Host) 收到请求。

  2. MCP Client 发现 filesystemServer 注册了 file://资源。

  3. MCP Server 执行 read_file_resource("main.py")

  4. 文件内容通过 MCP 协议 传回 Cursor。

  5. 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 外挂知识库实战》,我们将深入向量数据库的黑盒。