国产日韩欧美-97在线观看免费-亚洲欧洲日韩-亚洲free性xxxx护士白浆-国产精品网站在线观看-日韩有码一区-日本大片在线观看-欧美精品一区二区性色a+v-97在线精品-亚洲久草视频-天天操人人爽-你懂的国产精品-国产国语对白-就去干成人网-亚洲美女色视频

?? MCP生態(tài)

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

發(fā)布時(shí)間:2026-05-30 分類(lèi): MCP生態(tài)
摘要:MCP 四層架構(gòu)深度拆解:告別 Function Calling 的“單次調(diào)用”困境想讓你的 AI Agent 真正“記住”上下文,并能像調(diào)用本地函數(shù)一樣安全、穩(wěn)定地調(diào)用外部工具嗎?如果你正在開(kāi)發(fā)復(fù)雜的 AI Agent,一定遇到過(guò)這些痛點(diǎn):Function Calling 每次調(diào)用都是“一次性”的,缺乏狀態(tài)管理;多工具集成時(shí),上下文窗口被工具描述塞滿;不同模型的 Function Call...

封面

MCP 四層架構(gòu)深度拆解:告別 Function Calling 的“單次調(diào)用”困境

想讓你的 AI Agent 真正“記住”上下文,并能像調(diào)用本地函數(shù)一樣安全、穩(wěn)定地調(diào)用外部工具嗎?

如果你正在開(kāi)發(fā)復(fù)雜的 AI Agent,一定遇到過(guò)這些痛點(diǎn):Function Calling 每次調(diào)用都是“一次性”的,缺乏狀態(tài)管理;多工具集成時(shí),上下文窗口被工具描述塞滿;不同模型的 Function Calling 格式互不兼容,遷移成本巨大。Model Context Protocol (MCP) 正是為了解決這些問(wèn)題而生的硬核協(xié)議。本文將首次系統(tǒng)披露其四層分層架構(gòu)與 JSON-RPC 2.0 通信機(jī)制,并結(jié)合生產(chǎn)級(jí)開(kāi)發(fā)實(shí)踐,帶你徹底搞懂 MCP 的技術(shù)突破。

一、MCP 不是另一個(gè) Function Calling:四層架構(gòu)解析

很多人將 MCP 簡(jiǎn)單理解為“更好的 Function Calling”,這是一個(gè)巨大的誤解。Function Calling 是模型廠商定義的單次、無(wú)狀態(tài)的函數(shù)調(diào)用接口,而 MCP 是一個(gè)完整的、有狀態(tài)的客戶端-服務(wù)器通信協(xié)議。它的核心是四層分層架構(gòu):

  1. 協(xié)議層 (Protocol Layer):基于 JSON-RPC 2.0,定義了 requestresponsenotification 三種消息類(lèi)型。這是通信的“語(yǔ)言規(guī)則”。
  2. 傳輸層 (Transport Layer):負(fù)責(zé)實(shí)際的數(shù)據(jù)傳輸。支持 stdio(標(biāo)準(zhǔn)輸入輸出,適合本地進(jìn)程通信)和 HTTP with SSE(服務(wù)器發(fā)送事件,適合遠(yuǎn)程服務(wù))兩種方式。
  3. 能力層 (Capability Layer):這是 MCP 的核心。它定義了 Server 可以提供的四大能力:

    • Tools (工具):可執(zhí)行的函數(shù),如 read_filequery_database
    • Resources (資源):只讀的數(shù)據(jù)源,如文件內(nèi)容、數(shù)據(jù)庫(kù)快照。
    • Prompts (提示詞模板):預(yù)定義的交互模板。
    • Sampling (采樣):允許 Server 請(qǐng)求 Client(即 AI 模型)進(jìn)行一次推理,實(shí)現(xiàn) Server 端的智能邏輯。
  4. 會(huì)話層 (Session Layer):管理客戶端與服務(wù)器之間的連接狀態(tài)、能力協(xié)商和生命周期。這是實(shí)現(xiàn)“有狀態(tài)”交互的關(guān)鍵。

關(guān)鍵區(qū)別:Function Calling 是“你問(wèn)我答,答完即忘”。MCP 是“我們建立了一個(gè)持久連接,我知道你能做什么,你可以隨時(shí)調(diào)用我(模型)的推理能力”。

二、通信機(jī)制實(shí)戰(zhàn):JSON-RPC 2.0 如何驅(qū)動(dòng)一切

所有 MCP 通信都嚴(yán)格遵循 JSON-RPC 2.0 規(guī)范。我們通過(guò)一個(gè)生產(chǎn)級(jí) FilesystemServer 的開(kāi)發(fā)來(lái)透視其機(jī)制。

1. 初始化握手 (Handshake)
當(dāng)客戶端(如 Claude Desktop)連接到你的 MCP Server 時(shí),首先進(jìn)行能力協(xié)商:

// 客戶端 -> 服務(wù)器
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "initialize",
  "params": {
    "protocolVersion": "2024-11-05",
    "capabilities": {},
    "clientInfo": { "name": "Claude", "version": "1.0" }
  }
}

// 服務(wù)器 -> 客戶端 (響應(yīng))
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "protocolVersion": "2024-11-05",
    "capabilities": {
      "tools": { "listChanged": true }, // 聲明支持工具列表動(dòng)態(tài)更新
      "resources": { "subscribe": true } // 聲明支持資源訂閱
    },
    "serverInfo": { "name": "FilesystemServer", "version": "1.0" }
  }
}

2. 工具發(fā)現(xiàn)與調(diào)用
客戶端會(huì)主動(dòng)發(fā)現(xiàn)服務(wù)器提供了哪些工具:

// 客戶端 -> 服務(wù)器:列出所有工具
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/list"
}

// 服務(wù)器 -> 客戶端:返回工具列表
{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "tools": [
      {
        "name": "read_file",
        "description": "讀取指定路徑的文件內(nèi)容",
        "inputSchema": {
          "type": "object",
          "properties": {
            "path": { "type": "string", "description": "文件路徑" }
          },
          "required": ["path"]
        }
      }
      // ... 其他工具定義
    ]
  }
}

當(dāng)模型決定調(diào)用 read_file 工具時(shí),客戶端會(huì)發(fā)送一個(gè) tools/call 請(qǐng)求。服務(wù)器執(zhí)行后,返回結(jié)果。關(guān)鍵點(diǎn):這個(gè)連接是持久的,服務(wù)器可以記住之前的調(diào)用狀態(tài)(例如,記住用戶的工作目錄)。

三、MCP vs Function Calling vs Agent:一張對(duì)比表講清關(guān)系

維度Function CallingAgent (如 AutoGPT)MCP
本質(zhì)模型廠商定義的單次調(diào)用接口基于 LLM 的自主決策循環(huán)框架客戶端與服務(wù)器間的有狀態(tài)通信協(xié)議
狀態(tài)無(wú)狀態(tài),每次調(diào)用獨(dú)立有狀態(tài),依賴 Prompt 工程管理有狀態(tài),由協(xié)議層和會(huì)話層保障
上下文工具描述擠占上下文窗口歷史記錄和工具描述都擠占窗口工具描述在 Server 端,不占用模型上下文
集成需為每個(gè)模型適配不同格式框架耦合度高,難以標(biāo)準(zhǔn)化一次開(kāi)發(fā),多端通用 (Claude, 龍蝦, AI Agent平臺(tái))
安全性調(diào)用邏輯在客戶端,風(fēng)險(xiǎn)高自主執(zhí)行,風(fēng)險(xiǎn)不可控Server 掌控執(zhí)行環(huán)境,可設(shè)權(quán)限沙箱

協(xié)同關(guān)系:一個(gè)強(qiáng)大的 AI Agent(如基于 LangChain 構(gòu)建的),其底層可以使用 MCP 作為標(biāo)準(zhǔn)化的工具集成層。Agent 負(fù)責(zé)“決策循環(huán)”,MCP 負(fù)責(zé)“穩(wěn)定、安全地執(zhí)行工具調(diào)用并管理上下文”。

四、生產(chǎn)級(jí)開(kāi)發(fā):一個(gè)“數(shù)據(jù)庫(kù)查詢 MCP Server”的核心代碼

下面是一個(gè)簡(jiǎn)化但生產(chǎn)可用的 MCP Server 核心片段(Node.js/TypeScript),用于安全地查詢 PostgreSQL 數(shù)據(jù)庫(kù):


![配圖](http://www.nhjb.com.cn/usr/uploads/covers/cover_mcp_20260530_081735.jpg)

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ù)庫(kù)連接池
const pool = new Pool({ connectionString: process.env.DATABASE_URL });

// 2. 創(chuàng)建 MCP Server 實(shí)例
const server = new Server(
  { name: "postgres-query-server", version: "1.0.0" },
  { capabilities: { tools: {} } }
);

// 3. 實(shí)現(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 查詢語(yǔ)句" }
        },
        required: ["sql"]
      }
    }]
  };
});

// 4. 實(shí)現(xiàn)工具調(diào)用邏輯(關(guān)鍵:安全與錯(cuò)誤處理)
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  if (request.params.name === "query_database") {
    const sql = request.params.arguments?.sql as string;
    
    // 安全檢查:強(qiáng)制只讀
    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. 啟動(dòng)服務(wù)器
async function main() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.error("PostgreSQL MCP Server 已啟動(dòng)");
}
main().catch(console.error);

部署步驟

  1. 將上述代碼保存為 server.ts
  2. npm init -y && npm install @modelcontextprotocol/sdk pg
  3. 編譯:npx tsc server.ts
  4. 在 Claude Desktop 或龍蝦客戶端的配置文件中添加:

    {
      "mcpServers": {
        "postgres": {
          "command": "node",
          "args": ["server.js"],
          "env": {
            "DATABASE_URL": "postgresql://user:pass@localhost:5432/mydb"
          }
        }
      }
    }

五、硬技術(shù)突破:MCP 解決了什么根本問(wèn)題?

  1. 上下文窗口解放:工具的詳細(xì)描述(JSON Schema)存儲(chǔ)在 MCP Server 端,僅在初始化時(shí)同步。模型只需知道工具名和簡(jiǎn)短描述,節(jié)省了 70% 以上的工具相關(guān) Token 消耗
  2. 狀態(tài)持久化:Server 可以維護(hù)會(huì)話狀態(tài)(如數(shù)據(jù)庫(kù)連接、當(dāng)前工作目錄、API 限流計(jì)數(shù)器),實(shí)現(xiàn)真正的多輪工具交互。
  3. 安全沙箱:工具執(zhí)行在獨(dú)立的 Server 進(jìn)程中,與主模型進(jìn)程隔離。你可以輕松實(shí)現(xiàn)權(quán)限控制(如上面的只讀 SQL 檢查)、速率限制和審計(jì)日志。
  4. 生態(tài)統(tǒng)一:一次開(kāi)發(fā),即可在 Claude、龍蝦 (www.nhjb.com.cn)、AI Agent平臺(tái) 等所有支持 MCP 的客戶端中運(yùn)行,徹底告別為每個(gè)平臺(tái)重寫(xiě)插件的歷史。

下一步行動(dòng)

  1. 立即體驗(yàn):在你的龍蝦或 Claude Desktop 中,配置一個(gè)現(xiàn)成的 MCP Server(如官方提供的 filesystemsqlite 服務(wù)器),感受有狀態(tài)工具調(diào)用的不同。
  2. 動(dòng)手開(kāi)發(fā):復(fù)制上面的數(shù)據(jù)庫(kù)查詢 Server 代碼,將其改為連接你自己的 MySQL 或 API,10 分鐘內(nèi)打造你的第一個(gè)私有化工具。
  3. 深入生態(tài):訪問(wèn)www.nhjb.com.cn的 MCP 生態(tài)板塊,查看其他開(kāi)發(fā)者發(fā)布的 Server,學(xué)習(xí)他們的架構(gòu)設(shè)計(jì),或者將你開(kāi)發(fā)的 Server 發(fā)布到生態(tài)中。

MCP 不是未來(lái),它已經(jīng)是現(xiàn)在進(jìn)行時(shí)。掌握它,你的 AI Agent 開(kāi)發(fā)將進(jìn)入一個(gè)全新的、工程化的階段。

返回首頁(yè)