MCP四層架構(gòu)深度解析:解決AI Agent上下文記憶與工具調(diào)用難題

MCP 四層架構(gòu)深度拆解:告別 Function Calling 的“單次調(diào)用”困境
想讓你的 AI Agent 真正“記住”上下文,并能像調(diào)用本地函數(shù)一樣安全、穩(wěn)定地調(diào)用外部工具嗎?
如果你正在開發(fā)復雜的 AI Agent,一定遇到過這些痛點:Function Calling 每次調(diào)用都是“一次性”的,缺乏狀態(tài)管理;多工具集成時,上下文窗口被工具描述塞滿;不同模型的 Function Calling 格式互不兼容,遷移成本巨大。Model Context Protocol (MCP) 正是為了解決這些問題而生的硬核協(xié)議。本文將首次系統(tǒng)披露其四層分層架構(gòu)與 JSON-RPC 2.0 通信機制,并結(jié)合生產(chǎn)級開發(fā)實踐,帶你徹底搞懂 MCP 的技術突破。
一、MCP 不是另一個 Function Calling:四層架構(gòu)解析
很多人將 MCP 簡單理解為“更好的 Function Calling”,這是一個巨大的誤解。Function Calling 是模型廠商定義的單次、無狀態(tài)的函數(shù)調(diào)用接口,而 MCP 是一個完整的、有狀態(tài)的客戶端-服務器通信協(xié)議。它的核心是四層分層架構(gòu):
- 協(xié)議層 (Protocol Layer):基于 JSON-RPC 2.0,定義了
request、response、notification三種消息類型。這是通信的“語言規(guī)則”。 - 傳輸層 (Transport Layer):負責實際的數(shù)據(jù)傳輸。支持
stdio(標準輸入輸出,適合本地進程通信)和HTTP with SSE(服務器發(fā)送事件,適合遠程服務)兩種方式。 能力層 (Capability Layer):這是 MCP 的核心。它定義了 Server 可以提供的四大能力:
- Tools (工具):可執(zhí)行的函數(shù),如
read_file、query_database。 - Resources (資源):只讀的數(shù)據(jù)源,如文件內(nèi)容、數(shù)據(jù)庫快照。
- Prompts (提示詞模板):預定義的交互模板。
- Sampling (采樣):允許 Server 請求 Client(即 AI 模型)進行一次推理,實現(xiàn) Server 端的智能邏輯。
- Tools (工具):可執(zhí)行的函數(shù),如
- 會話層 (Session Layer):管理客戶端與服務器之間的連接狀態(tài)、能力協(xié)商和生命周期。這是實現(xiàn)“有狀態(tài)”交互的關鍵。
關鍵區(qū)別:Function Calling 是“你問我答,答完即忘”。MCP 是“我們建立了一個持久連接,我知道你能做什么,你可以隨時調(diào)用我(模型)的推理能力”。
二、通信機制實戰(zhàn):JSON-RPC 2.0 如何驅(qū)動一切
所有 MCP 通信都嚴格遵循 JSON-RPC 2.0 規(guī)范。我們通過一個生產(chǎn)級 FilesystemServer 的開發(fā)來透視其機制。
1. 初始化握手 (Handshake)
當客戶端(如 Claude Desktop)連接到你的 MCP Server 時,首先進行能力協(xié)商:
// 客戶端 -> 服務器
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {},
"clientInfo": { "name": "Claude", "version": "1.0" }
}
}
// 服務器 -> 客戶端 (響應)
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"protocolVersion": "2024-11-05",
"capabilities": {
"tools": { "listChanged": true }, // 聲明支持工具列表動態(tài)更新
"resources": { "subscribe": true } // 聲明支持資源訂閱
},
"serverInfo": { "name": "FilesystemServer", "version": "1.0" }
}
}2. 工具發(fā)現(xiàn)與調(diào)用
客戶端會主動發(fā)現(xiàn)服務器提供了哪些工具:
// 客戶端 -> 服務器:列出所有工具
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list"
}
// 服務器 -> 客戶端:返回工具列表
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"tools": [
{
"name": "read_file",
"description": "讀取指定路徑的文件內(nèi)容",
"inputSchema": {
"type": "object",
"properties": {
"path": { "type": "string", "description": "文件路徑" }
},
"required": ["path"]
}
}
// ... 其他工具定義
]
}
}當模型決定調(diào)用 read_file 工具時,客戶端會發(fā)送一個 tools/call 請求。服務器執(zhí)行后,返回結(jié)果。關鍵點:這個連接是持久的,服務器可以記住之前的調(diào)用狀態(tài)(例如,記住用戶的工作目錄)。
三、MCP vs Function Calling vs Agent:一張對比表講清關系
| 維度 | Function Calling | Agent (如 AutoGPT) | MCP |
|---|---|---|---|
| 本質(zhì) | 模型廠商定義的單次調(diào)用接口 | 基于 LLM 的自主決策循環(huán)框架 | 客戶端與服務器間的有狀態(tài)通信協(xié)議 |
| 狀態(tài) | 無狀態(tài),每次調(diào)用獨立 | 有狀態(tài),依賴 Prompt 工程管理 | 有狀態(tài),由協(xié)議層和會話層保障 |
| 上下文 | 工具描述擠占上下文窗口 | 歷史記錄和工具描述都擠占窗口 | 工具描述在 Server 端,不占用模型上下文 |
| 集成 | 需為每個模型適配不同格式 | 框架耦合度高,難以標準化 | 一次開發(fā),多端通用 (Claude, 龍蝦, OpenClaw) |
| 安全性 | 調(diào)用邏輯在客戶端,風險高 | 自主執(zhí)行,風險不可控 | Server 掌控執(zhí)行環(huán)境,可設權限沙箱 |
協(xié)同關系:一個強大的 AI Agent(如基于 LangChain 構(gòu)建的),其底層可以使用 MCP 作為標準化的工具集成層。Agent 負責“決策循環(huán)”,MCP 負責“穩(wěn)定、安全地執(zhí)行工具調(diào)用并管理上下文”。
四、生產(chǎn)級開發(fā):一個“數(shù)據(jù)庫查詢 MCP Server”的核心代碼
下面是一個簡化但生產(chǎn)可用的 MCP Server 核心片段(Node.js/TypeScript),用于安全地查詢 PostgreSQL 數(shù)據(jù)庫:

import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
import { Pool } from 'pg';
// 1. 初始化數(shù)據(jù)庫連接池
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
// 2. 創(chuàng)建 MCP Server 實例
const server = new Server(
{ name: "postgres-query-server", version: "1.0.0" },
{ capabilities: { tools: {} } }
);
// 3. 實現(xiàn)工具列表
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [{
name: "query_database",
description: "執(zhí)行只讀 SQL 查詢(僅支持 SELECT)",
inputSchema: {
type: "object",
properties: {
sql: { type: "string", description: "要執(zhí)行的 SQL 查詢語句" }
},
required: ["sql"]
}
}]
};
});
// 4. 實現(xiàn)工具調(diào)用邏輯(關鍵:安全與錯誤處理)
server.setRequestHandler(CallToolRequestSchema, async (request) => {
if (request.params.name === "query_database") {
const sql = request.params.arguments?.sql as string;
// 安全檢查:強制只讀
if (!sql.trim().toLowerCase().startsWith('select')) {
throw new Error("安全限制:僅允許執(zhí)行 SELECT 查詢");
}
try {
const result = await pool.query(sql);
// 返回結(jié)構(gòu)化數(shù)據(jù),便于模型理解
return {
content: [{
type: "text",
text: JSON.stringify({
rows: result.rows,
rowCount: result.rowCount,
fields: result.fields.map(f => f.name)
}, null, 2)
}]
};
} catch (error) {
throw new Error(`查詢執(zhí)行失敗: ${(error as Error).message}`);
}
}
throw new Error(`未知工具: ${request.params.name}`);
});
// 5. 啟動服務器
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("PostgreSQL MCP Server 已啟動");
}
main().catch(console.error);部署步驟:
- 將上述代碼保存為
server.ts。 npm init -y && npm install @modelcontextprotocol/sdk pg。- 編譯:
npx tsc server.ts。 在 Claude Desktop 或龍蝦客戶端的配置文件中添加:
{ "mcpServers": { "postgres": { "command": "node", "args": ["server.js"], "env": { "DATABASE_URL": "postgresql://user:pass@localhost:5432/mydb" } } } }
五、硬技術突破:MCP 解決了什么根本問題?
- 上下文窗口解放:工具的詳細描述(JSON Schema)存儲在 MCP Server 端,僅在初始化時同步。模型只需知道工具名和簡短描述,節(jié)省了 70% 以上的工具相關 Token 消耗。
- 狀態(tài)持久化:Server 可以維護會話狀態(tài)(如數(shù)據(jù)庫連接、當前工作目錄、API 限流計數(shù)器),實現(xiàn)真正的多輪工具交互。
- 安全沙箱:工具執(zhí)行在獨立的 Server 進程中,與主模型進程隔離。你可以輕松實現(xiàn)權限控制(如上面的只讀 SQL 檢查)、速率限制和審計日志。
- 生態(tài)統(tǒng)一:一次開發(fā),即可在 Claude、龍蝦 (m.gsdl.org.cn)、OpenClaw 等所有支持 MCP 的客戶端中運行,徹底告別為每個平臺重寫插件的歷史。
下一步行動
- 立即體驗:在你的龍蝦或 Claude Desktop 中,配置一個現(xiàn)成的 MCP Server(如官方提供的
filesystem或sqlite服務器),感受有狀態(tài)工具調(diào)用的不同。 - 動手開發(fā):復制上面的數(shù)據(jù)庫查詢 Server 代碼,將其改為連接你自己的 MySQL 或 API,10 分鐘內(nèi)打造你的第一個私有化工具。
- 深入生態(tài):訪問龍蝦官網(wǎng)的 MCP 生態(tài)板塊,查看其他開發(fā)者發(fā)布的 Server,學習他們的架構(gòu)設計,或者將你開發(fā)的 Server 發(fā)布到生態(tài)中。
MCP 不是未來,它已經(jīng)是現(xiàn)在進行時。掌握它,你的 AI Agent 開發(fā)將進入一個全新的、工程化的階段。