在 AI 编程工具(如 Trae, Cursor, Windsurf)爆发的今天,你可能听说过 MCP (Model Context Protocol) 这个词。它是 Anthropic 推出的一个开放标准,被称为 AI 时代的 "USB 接口"。
但它具体是如何工作的?当你在 Trae 里安装了一个插件(比如 trae-mem),当你对 AI 说“帮我保存这段记忆”时,底层到底发生了什么?
本文将通过 trae-mem 的实际代码,带你深入解构 Trae(宿主/客户端)、Agent(大模型/大脑) 和 MCP Server(服务端/工具手) 之间的交互原理。
一、 核心角色:谁在做什么?
在一个典型的 MCP 工作流中,有三个关键角色,它们的关系类似于操作系统、CPU 和 应用程序。
1. MCP Host (Trae IDE) —— “总线与连接器”
Trae 是整个系统的宿主(Host)。
- 它的职责:负责启动 MCP Server 进程,管理标准输入/输出(Stdio)通道,并将 Server 提供的工具清单(Tools List)“喂”给大模型。
- 类比:它是电脑的主板和操作系统,负责把外设(MCP Server)接入进来,并让 CPU(Agent)能看到它们。
2. MCP Server (服务端) —— “能力提供者”
这是一个独立运行的进程(例如我们的 python -m trae_mem.mcp_server)。
- 它的职责:它不知道 Agent 是谁,也不懂自然语言。它只懂 JSON-RPC 协议。它暴露了一组具体的工具(Tools)、资源(Resources) 或 提示词(Prompts)。
- 类比:它就像一个 USB 键盘或打印机驱动。它有具体的功能(打印、按键),但需要有人来调用。
- 代码实例:
trae-mem暴露了trae_mem_log,trae_mem_search等工具。
3. Agent (大模型) —— “决策大脑”
这是运行在云端(或本地)的 LLM(如 Claude 3.5 Sonnet, GPT-4)。
- 它的职责:它负责理解用户的自然语言意图,查看 Trae 给它的“工具菜单”,并决定是否调用以及如何调用某个工具。
- 注意:Agent 不能直接运行代码,它只能输出一个“我想调用工具 X”的文本指令。
二、 交互四部曲:从启动到执行
让我们看看这三者是如何通过 MCP 协议舞动起来的。我们将流程分为四个阶段。
流程图总览
sequenceDiagram
participant Agent as 🧠 Agent (Model)
participant Host as 🖥️ Trae (MCP Client)
participant Server as ⚙️ MCP Server (trae-mem)
Note over Host, Server: 阶段一:握手与发现
Host->>Server: 启动进程 (spawn process)
Host->>Server: JSON-RPC: initialize
Server-->>Host: return capabilities (我支持 Tools!)
Host->>Server: JSON-RPC: tools/list (你有啥工具?)
Server-->>Host: return [trae_mem_log, hook_event...] (Schema定义)
Note over Agent, Host: 阶段二:思考与决策
Host->>Agent: User Prompt + Tools Schema (菜单)
Agent->>Agent: 思考:"用户想存记忆,我要用 trae_mem_log"
Agent-->>Host: Output: Tool Call Request (我想调用这个!)
Note over Host, Server: 阶段三:调用与执行
Host->>Server: JSON-RPC: tools/call {name: "trae_mem_log", args: {...}}
Server->>Server: 执行 Python 代码 (写入 SQLite)
Server-->>Host: return Result (成功/失败信息)
Note over Agent, Host: 阶段四:反馈与响应
Host->>Agent: Tool Output (这是工具的运行结果)
Agent-->>Agent: 整合信息
Agent-->>Host: Final Response (自然语言回复用户)
阶段一:握手与发现 (Handshake & Discovery)
当你在 Trae 的 mcp.json 中配置好服务并重启 IDE 时:
-
启动:Trae 在后台悄悄运行了
python3 -m trae_mem.mcp_server。 -
初始化 (
initialize): Trae 发送一个 JSON 包给 Server,说:“你好,我是客户端,协议版本 2024-11-05”。 Server 回复:“你好,我是trae-mem,版本 0.1.0,我支持 Tools 能力”。 -
列出工具 (
tools/list): Trae 问:“请把你支持的所有工具列表发给我。” Server 会返回一个巨大的 JSON 列表,其中包含了每个工具的inputSchema。关键代码 (
mcp_server.py):{ "name": "trae_mem_hook_event", "description": "适配生命周期事件...", "inputSchema": { "type": "object", "properties": { "event": {...}, "payload": {...} }, "required": ["event", "payload"] } }这段 JSON 就是 Agent 后来能读懂的“说明书”。
阶段二:思考与决策 (Reasoning)
现在,用户在聊天框输入:“我刚修复了登录 bug,帮我记录一下。”
- 构建上下文:Trae 将用户的这句话,连同刚才 Server 发来的“工具说明书”,一起打包发给 Agent(大模型)。
- 模型思考:
Agent 读到说明书,发现有一个工具叫
trae_mem_log,描述是“写入一条观测...”。 Agent 认为:“这个工具符合用户的需求。” - 生成调用请求:
Agent 不会直接执行 Python 代码,它只是返回一段特定的文本(通常是 XML 或 JSON 格式),告诉 Trae:
“请帮我调用
trae_mem_log,参数是text='修复登录bug', kind='user'。”
阶段三:中转与执行 (Execution)
Trae 拦截到了 Agent 的这个请求。
- 协议转换:Trae 将 Agent 的意图转换为标准的 MCP JSON-RPC 请求,通过 Stdin 管道发给 Server。
{ "jsonrpc": "2.0", "method": "tools/call", "id": 10, "params": { "name": "trae_mem_log", "arguments": { "session": "current", "kind": "user", "text": "修复登录bug" } } } - Server 干活:
mcp_server.py的主循环收到这行 JSON,解析出name和arguments,然后调用对应的 Python 函数操作 SQLite 数据库。 - 返回结果:
操作完成后,Server 打印结果到 Stdout:
{ "jsonrpc": "2.0", "id": 10, "result": { "content": [{ "type": "text", "text": "observation_id_12345" }] } }
阶段四:闭环 (Loop Closure)
Trae 收到这个结果,把它通过 Prompt 再次喂回给 Agent。 Agent 看到结果:“哦,工具执行成功了,返回了 ID。” Agent 最终回复用户:“已为您记录该修复操作(ID: ...)。”
三、 为什么这种架构很牛?
理解了这个原理,你就明白了 MCP 的三大优势:
-
安全性 (Security): Agent 永远无法直接触碰你的硬盘或网络。它只能请求 Trae 调用 Server 暴露出来的有限的几个工具。如果 Server 没写“删除文件”的工具,Agent 就算想删也删不掉。
-
通用性 (Universality):
trae-mem只需要写一次 MCP Server,就可以同时被 Trae、Claude Desktop、Zed Editor 等任何支持 MCP 的客户端使用。就像 USB 键盘插哪台电脑都能用。 -
本地化 (Local Control): Agent 可以在云端(OpenAI/Anthropic),但 MCP Server 跑在你本地。这意味着云端的大脑可以通过这个“本地手脚”来操作你本地的数据库、文件,实现了端云协同。
四、 总结
- Trae 是路由器,负责转发消息。
- Agent 是指挥官,负责下达指令。
- MCP Server 是工兵,负责干脏活累活。
当你下一次在 Trae 里看到 AI 帮你查数据库、写文件时,请记得:这背后是一场精密的三方接力赛,而 MCP 协议 就是它们共同的接力棒。