全網最細,一文帶你弄懂 MCP 的核心原理!

MCP 是如何做到統一工具調用方式的?

MCP 客戶端和 MCP Server 到底是怎麼交互的?

爲什麼有的 MCP 客戶端支持所有模型,有的確不行?

大家好,歡迎來到 code 祕密花園,我是花園老師(ConardLi)。

爲了方便大家更深度的理解 MCP ,在今天這一期,我們用幾個例子來一起學習 MCP 的核心原理。

在上一期 《MCP + 數據庫:一種提高結構化數據檢索效果的新方式》,我們一起學習了 MCP 的基礎知識,包括

還沒學習的同學建議先閱讀完上一期再回來看這一期,今天我們的學習大綱如下:

下面我們先回顧一下 MCP 的基礎知識:

一、MCP 基礎回顧

MCP(Model Context Protocol,模型上下文協議)是由 Anthropic 公司(也就是開發 Claude 模型的公司)推出的一個開放標準協議,就像是一個 “通用插頭” 或者 “USB 接口”,制定了統一的規範,不管是連接數據庫、第三方 API,還是本地文件等各種外部資源,目的就是爲了解決 AI 模型與外部數據源、工具交互的難題。

MCP 大概的工作方式:MCP Host,比如 Claude Desktop、Cursor 這些工具,在內部實現了 MCP Client,然後MCP Client 通過標準的 MCP 協議和 MCP Server 進行交互,由各種三方開發者提供的 MCP Server 負責實現各種和三方資源交互的邏輯,比如訪問數據庫、瀏覽器、本地文件,最終再通過 標準的 MCP 協議返回給 MCP Client,最終在 MCP Host 上展示。

開發者按照 MCP 協議進行開發,無需爲每個模型與不同資源的對接重複編寫適配代碼,可以大大節省開發工作量,另外已經開發出的 MCP Server,因爲協議是通用的,能夠直接開放出來給大家使用,這也大幅減少了開發者的重複勞動。

首先一步,我們先從 MCP Server 的配置講起,弄懂 MCP Server 的配置爲什麼是這樣設計的。

二、MCP Server 的配置爲何長這樣?

我們使用 Cherry Studio 中的 MCP 服務配置來舉例,最前面的名稱和描述比較好理解,都是用於展示的。

2.1 通信協議

下面我們發現有兩個類型,STDIO 和 SSE

MCP 協議中的 STDIO 和 SSE 其實就是是兩種不同的(MCP Server 與 MCP Client)通信模式:

簡單理解,STDIO 調用方式是將一個 MCP Server 下載到你的本地,直接調用這個工具,而 SSE 則是通過 HTTP 服務調用託管在遠程服務器上的 MCP Server

這就是一個 SSE MCP Server 的配置示例,非常簡單,我們直接使用網絡協議和工具進行通信:

{
  "mcpServers": {
    "browser-use-mcp-server": {
      "url""http://localhost:8000/sse"
    }
  }
}

而我們之前用到的 FileSystem、Mongodb 都屬於典型的 STDIO 調用:

{
  "mcpServers": {
    "mongodb": {
      "command""npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "~/Downloads"
      ]
    }
  }
}

STDIO 爲程序的輸入輸出提供了一種統一的標準方式,無論是什麼類型的程序,只要遵循 STDIO 協議,就可以方便地進行數據的輸入和輸出,並且可以很容易地與其他程序或系統組件進行交互。

在命令行中,使用 STDIO 通信是非常常見的,比如 Linux 系統中的 cat 命令就是一個極爲簡單且能體現 STDIO 通信的例子。cat 命令通常用於連接文件並打印到標準輸出。當你不指定任何文件時,它會從標準輸入讀取內容,並將其輸出到標準輸出。

打開終端,輸入 cat 命令,然後按下回車鍵。此時,cat 命令開始等待你從標準輸入(通常是鍵盤)輸入內容。你可以輸入任意文本,每輸入一行並按下回車鍵,cat 會立即將這行內容輸出到標準輸出。

在這個例子中,你輸入了 你好,這裏是 code祕密花園! 和 我是花園老師cat 命令將這些內容從標準輸入讀取後,馬上輸出到標準輸出。

我們還能借助一些操作符,比如重定向操作符 > 將標準輸出重定向到文件。下面的例子會把你輸入的內容保存到 test.txt 文件裏:

上述命令執行後,test.txt 文件裏會包含你輸入的兩行內容:

在這個過程中,cat 命令從標準輸入讀取內容,接着將輸出重定向到文件,這就是一個最簡單的 STDIO 通信案例。

2.2 命令和參數

下面再來說說配置裏的命令,對應 JSON 配置中的 command 參數,在沒有填寫時,這裏默認推薦的是 uvx 和 npx:

在之前 mongodb 的例子中, command 使用的就是 npx ,之前我們提到了,只要安裝了 Node.js 環境,就可以使用,那爲什麼這裏不寫 node,而要用  npx 命令呢?

npx 是 Node.js 生態系統中的一個命令行工具,它本質上是 npm的一個擴展。npx 的名字可以理解爲 “運行一個包”(npm execute package)的縮寫。

npm 是 Node.js 的包管理工具,我們編寫了一些通用的工具,就可以將其發佈爲一個 npm 包,這樣所有具備 Node.js 的環境都可以下載並且運行這個包

簡單來說,npx 的主要功能就是幫助我們快速運行一些通過 npm 安裝的工具,而不需要我們手動去下載安裝這些工具到全局環境。

{
  "mcpServers": {
    "mongodb": {
      "command""npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "~/Downloads"
      ]
    }
  }
}

在這個配置中,args 裏第一個參數 "-y" 其實就等同於 --yes,其作用是在執行命令時自動同意所有提示信息,可以避免交互式的確認步驟。

而第二個參數其實就是這個 npm 包的名字,比如 @modelcontextprotocol/server-filesystem 這個包:

args 裏的第三個參數其實就是傳遞給這個包的一個必備參數:允許讀取的本機路徑。

這樣理解其實就能說得通了,這幾個信息,再加上大模型分析用戶輸入後得出的參數,通過 STDIO 協議傳遞給這個包,其實就可以構成一條在終端直接可以運行的一條命令:

npx -y @modelcontextprotocol/server-filesystem ~/Downloads  <<< '{"method":"tools/call","params":{"name":"list_directory","arguments":{"path":"~/Downloads"}},"jsonrpc":"2.0","id":1}'

我們測試執行一下:

我們把輸入內容格式化一下:

<<<(Here 字符串操作符)的主要用途是將一個字符串作爲標準輸入(STDIN)傳遞給前面的命令。

在這個命令中,我們通過 <<< 操作符,把後面的字符串傳遞給前面的命令(也就是 @modelcontextprotocol/server-filesystem 這個包)當作輸入數據。

後面的字符串中包含了需要調用的函數(list_directory),以及傳遞給這個函數的參數(~/Downloads),

前面的部分都是我們在 MCP Server 中配置的內容,屬於固定的部分。而大模型做的,就是根據用戶當前的輸入,以及當前支持的 MCP 工具列表,判斷出要不要調用這個工具,如果要調用,生成結構化的工具參數,最後 MCP Client 通過  STDIO 協議將這個結構化的參數再傳遞給 MCP Server

在上面的命令中,還有一個選項是 uvx,和 npx 類似,它也可以直接讓你臨時執行某個工具包,而無需全局安裝。不過 uvx:是 uv 工具鏈的一部分,主要聚焦於 Python 生態系統,它會創建一個臨時的隔離 Python 環境來運行 Python 工具包。

2.3 傳輸格式

我們再來看看剛剛的命令執行的結果:

也是一段格式化好的內容,裏面返回了當前目錄下的所有文件,而模型在接收到這段格式化的輸出後,會將其變成口語化的內容再返回到 MCP 客戶端。

這個輸入、輸出的參數格式,遵循的是 JSON-RPC 2.0 傳輸格式,它有一套自己的規則,規定了請求和響應的格式、如何處理錯誤等,官方文檔的中的描述:

2.4 Windows 下的配置

在實際使用中,大家可能會發現,下面的配置在 Windows 下可能不會生效

{
  "mcpServers": {
    "mongodb": {
      "command""npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "~/Downloads"
      ]
    }
  }
}

需要改成下面的方式:

{
  "mcpServers": {
    "mongodb": {
      "command""cmd",
      "args": [
        "/c",
        "npx",
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "~/Downloads"
      ]
    }
  }
}

這是因爲在不同操作系統下 默認命令解釋器(Shell)的工作機制不同

macOS 的終端(如 bash/zsh)是 Unix shell,支持直接執行可執行文件(如 npx)。

Windows 的默認命令解釋器是 cmd.exe,而非直接執行程序。即使 npx 已安裝(如通過全局 npm install -g npx),也需要通過 cmd.exe 來調用,因爲:

args 中的 /c 是 cmd.exe 的參數,表示 “執行後續命令後關閉窗口”。完整的執行流程是:

cmd.exe /c npx -y @modelcontextprotocol/server-filesystem "~/Downloads"

這裏 cmd.exe 先解析 /c,再將 npx ... 作爲子命令執行,確保 Windows 能正確調用 Node.js 腳本(npx)。

通過分析 MCP Server 的配置,我們瞭解了 MCP Clinet 和 MCP Server  的通信協議、執行的命令和參數,以及兩者數據傳輸的標準格式,這樣 MCP Clinet 和 MCP Server 的交互方式我們基本上就弄清楚了。

那執行 MCP Server 我們一定要通過 npx 或 uvx 運行一個包嗎?

當然不是,實際上任何能夠在命令行執行代碼的方式,都是可以的,比如我們可以直接把一個 MCP Server 的倉庫拉取到本地,然後通過 node 或 python 命令直接執行裏面的代碼文件,這樣就可以實現完全斷網運行(前提是 MCP Server 中不會調用遠程 API)。

{
  "mcpServers": {
    "mongodb": {
      "command""node",
      "args": [
        "/path/mcp-server.js"
      ]
    }
  }
}

下面,我們在本地實現一個最簡單的例子,來教大家如何構建一個 MCP Server。

三、MCP Server 是如何開發和調試的?

3.1 基於 AI 輔助編寫 MCP Server

在官方文檔(https://modelcontextprotocol.io/quickstart/server)中,我們可以找到 MCP Server 的開發方式,以及官方提供的各個語言的 SDK 的示例代碼:

寫的挺清晰的,如果你懂代碼,仔細看一遍很快就能上手,但在 AI 時代,從零自己去寫肯定不可能了,官方其實也建議通過 AI 來幫我們實現 MCP,所以在文檔中單獨還提供了一個 Building MCP with LLMs 的章節。

大概思路如下:

在開始之前,收集必要的文檔,以幫助 AI 瞭解 MCP:

提供了相關文檔之後,向 AI 清晰地描述你想要構建的服務器類型:

比如這是一個例子:構建一個 MCP 服務器,該服務器:

在實際測試中我發現,上面提到的 https://modelcontextprotocol.io/llms-full.txt 這個文檔就是整個文檔站的內容,裏面包含了很多構建 MCP Server 不需要的內容,反而會給模型造成干擾,大家可以直接參考我的提示詞:

## 需求

基於提供的 MCP 相關資料,幫我構建一個 MCP Server,需求如下:

- 提供一個獲取當前時間的工具
- 接收時區作爲參數(可選)
- 編寫清晰的註釋和說明
- 要求功能簡潔、只包含關鍵功能
- 使用 TypeScript 編寫

請參考下面四個資料:

## [參考資料 1] MCP 基礎介紹

- 粘貼 https://modelcontextprotocol.io/introduction 裏的內容。

## [參考資料 2] MCP 核心架構

- 粘貼 https://modelcontextprotocol.io/docs/concepts/architecture 裏的內容。

## [參考資料 3] MCP Server 開發指引

- 粘貼 https://modelcontextprotocol.io/quickstart/server 裏的內容。

## [參考資料 4] MCP Typescript SDK 文檔

- 粘貼 https://github.com/modelcontextprotocol/typescript-sdk/blob/main/README.md 裏的內容。

下面是一個 AI 幫我生成好的 MCP Server 的關鍵代碼:

import { McpServer } from"@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from"@modelcontextprotocol/sdk/server/stdio.js";
import { z } from"zod";

const server = new McpServer({
name: "TimeServer", // 服務器名稱
version: "1.0.0", // 服務器版本
});


server.tool(
"getCurrentTime", // 工具名稱,
"根據時區(可選)獲取當前時間", // 工具描述
  {
    timezone: z
      .string()
      .optional()
      .describe(
        "時區,例如 'Asia/Shanghai', 'America/New_York' 等(如不提供,則使用系統默認時區)"
      ),
  },
async ({ timezone }) => {
     // 具體工具實現,這裏省略
  }
);

/**
 * 啓動服務器,連接到標準輸入/輸出傳輸
 */
asyncfunction startServer() {
try {
    console.log("正在啓動 MCP 時間服務器...");
    // 創建標準輸入/輸出傳輸
    const transport = new StdioServerTransport();
    // 連接服務器到傳輸
    await server.connect(transport);
    console.log("MCP 時間服務器已啓動,等待請求...");
  } catch (error) {
    console.error("啓動服務器時出錯:", error);
    process.exit(1);
  }
}

startServer();

其實代碼非常簡單,我們可以拆分爲三部分來理解:

第一步:使用官方提供的 @modelcontextprotocol/sdk/server/mcp.js 包,創建一個 McpServer 實例:

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";

/**
 * 創建 MCP 服務器實例
 */
const server = new McpServer({
  name: "TimeServer", // 服務器名稱
  version: "1.0.0", // 服務器版本
});

第二步:使用 server.tool 定義提供的工具方法,包括工具方法的名稱、工具方法的描述、工具方法的參數、工具方法的具體實現邏輯。

另外使用了 "zod" 這個包定義了方法參數的類型以及描述。

import { z } from"zod";

server.tool(
"getCurrentTime", // 工具名稱,
"根據時區(可選)獲取當前時間", // 工具描述
  {
    timezone: z
      .string()
      .optional()
      .describe(
        "時區,例如 'Asia/Shanghai', 'America/New_York' 等(如不提供,則使用系統默認時區)"
      ),
  },
async ({ timezone }) => {
     // 具體工具實現,這裏省略
  }
);

第三步:啓動 Server,並且使用 SDK 中導出的 StdioServerTransport 來定義工具使用 STDIO 通信協議,等待外部的標準輸入,並且把工具的執行結果轉化爲標準輸出反饋到外部。

import { StdioServerTransport } from"@modelcontextprotocol/sdk/server/stdio.js";

/**
 * 啓動服務器,連接到標準輸入/輸出傳輸
 */
asyncfunction startServer() {
try {
    console.log("正在啓動 MCP 時間服務器...");
    // 創建標準輸入/輸出傳輸
    const transport = new StdioServerTransport();
    // 連接服務器到傳輸
    await server.connect(transport);
    console.log("MCP 時間服務器已啓動,等待請求...");
  } catch (error) {
    console.error("啓動服務器時出錯:", error);
    process.exit(1);
  }
}

startServer();

就是這麼簡單,我們只需要按照這個模板來添加更多的工具實現就可以了,另外 Resources、Prompt 的編寫方式其實都是類似的,大家只需要按照這套提示詞模板,定義好自己的需求,AI(Claude 的準確性最高)基本上都能比較完整的實現。

3.2 使用 inspector 調試 MCP Server

開發完成後,我們可以直接使用官方提供的 MCP Server 調試工具(@modelcontextprotocol/inspector)來進行調試。

我們也可以直接通過 npx 運行 @modelcontextprotocol/inspector

npx @modelcontextprotocol/inspector <command> <arg1> <arg2>

比如我們可以調試我們剛剛開發好的工具,這裏直接使用 node 運行我們本地構建好的代碼:

npx @modelcontextprotocol/inspector node dist/index.js

啓動成功後,它會在我們的本地監聽 6274 端口,我們點擊 Connect

連接成功後,我們點擊 List Tools

然後可以看到當前 MCP Server 定義的所有工具,我們這裏定義了一個獲取當前時間的工具,我們點擊這個工具,可以對它進行調試:

我們可以在下方所有交互產生的請求和響應的具體數據:

基於這樣的思路,我們可以使用 @modelcontextprotocol/inspector 調試任意的 MCP Server, 在你想要使用,但是還不知道怎麼使用一個 MCP Server 時,都可以使用它進行調試:

npx @modelcontextprotocol/inspector npx -y @modelcontextprotocol/server-filesystem  ~/Downloads

3.3 在 Cline 中測試 MCP Server

下面我們在 Cline 中配置測試一下我們剛剛開發好的 MCP Server,這裏我們直接使用 node 執行:

測試結果:

四、MCP Client 是如何和 Server 通信的?

看到這,可能很多同學還會有疑問,MCP Clinet 是怎麼知道 MCP Server 都提供了哪些工具列表的?模型又怎麼從這些工具中選擇出合適的工具?在後續的問答中兩者又是如何配合的呢?

下面我們用抓包工具來分別對 Cherry Studio 、Cline 兩個工具進行抓包,使用我們剛剛開發好 MCP Server,分析整個交互過程。

4.1 配置抓包工具

我們使用 Charles 這個工具來抓包。

在 Cherry Studio 中,僅有一部分模型支持 MCP ,這裏我們選擇阿里雲百鍊的 qwen-max,實測在 Cherry Studio 中工具調用是非常穩定的:

然後我們在 Charles 中過濾一下阿里雲百鍊的請求,就可以過濾出後續的請求包了:

在 Cline 中,所有模型都支持 MCP,這裏我們選擇的是 Openrouter 下免費的 DeepseekV3 。這裏需要注意的是, Charles 並不能直接抓取到 VsCode 的請求,我們需要在 VsCode 下配置代理:

點擊 VsCode 左上角的 “文件” 菜單,選擇 “首選項 > 設置”,搜索 http.proxy,然後在其中填寫 http://127.0.0.1:8888,則可以將 vsCode 後續的請求都代理到 Charles 下:

然後在 Charles 中過濾一下 Openrouter 的請求,就可以過濾後續的請求包了:

還有一點需要注意,這些軟件一般是都採用的是流式輸出,所以在響應報文裏不會展示完整的 JSON 內容,

我們可以藉助 AI 幫我們還原原始的響應報文 “

4.2 Cherry Studio 抓包分析

當我們在 Cherry Studio 中開啓我們剛剛開發的 Time MCP Server,然後詢問 “紐約時間” :

我們發現軟件實際調用了兩次 LLM API

下面我們直接來看我已經處理好的請求報文(省略了一些無關內容,只保留關鍵信息):

4.3 Cline 抓包分析

我們在 Cline 中配置好 Time MCP Server ,並且詢問同樣的問題:

然後我們發現 Charles 中同樣抓到兩條請求:

同樣的,我們把請求報文處理好,並保存到本地查看:

然後,我對這段系統提示詞進行了處理了分析,提取出了關鍵的部分,我們來具體分析一下:

提示詞第一部分:身份設定:

提示詞第二部分:工具使用相關:

提示詞第三部分:MCP Server 相關:

提示詞第四部分:一些約束信息:

提示詞第五部分:目標工作流程:

這就是 Cline 系統提示詞的關鍵部分,當前這裏省略了一些和 MCP 不相關的信息,比如 Cline 本身提供的一些讀取文件、編寫代碼的工具等等。

我們格式化一下,發現和系統提示詞裏要求的工具調用格式是相同的:

這裏依然按照系統提示詞中約定的標準格式返回:

4.4 MCP 的核心流程總結

看到這裏,大家應該比較明確了,Cherry Studio 實際上是通過將 MCP Server 中提供的工具、響應結果,轉換爲 Function Call 的標準格式來和模型進行交互。

Cline 將 MCP Server 中提供的工具、響應結果轉換未一套自己約定的輸入、輸出的標準數據格式,通過系統提示詞來聲明這種約定,再和模型進行交互。

這也解釋了,爲什麼在 Cherry Studio 中只有一部分模型支持 MCP,前提是選擇的模型需要支持 Function Call 的調用,並且在客戶端進行了特殊適配;而 Cline 則使用的是系統提示詞,所以所有模型都支持。

  1. 初始化與工具列表獲取
    用戶首先對 MCP 客戶端進行初始化操作,隨後 MCP 客戶端向 MCP 服務器發送請求以獲取可用的工具列表,MCP 服務器將工具列表返回給客戶端。

  2. 用戶輸入與提示詞構建
    用戶在客戶端完成初始化後,向 MCP 客戶端輸入具體請求。客戶端將此前獲取的工具列表與用戶輸入內容相結合,共同組成用於詢問 LLM 的提示詞。

  3. 工具傳遞方式選擇
    MCP 客戶端通過兩種方式之一將提示詞傳遞給 LLM:

  1. LLM 判斷與響應
    LLM 接收到提示詞後,返回判斷結果:
  1. 工具命令生成與執行
    若需要工具,MCP 客戶端根據 LLM 提供的參數格式,以及 MCP Server 配置的命令模板進行拼接,生成完整的可執行命令,並在本地環境(Local_Env)中執行該命令。

  2. 結果處理與輸出
    本地環境執行命令後,將結果返回給 MCP 客戶端。客戶端將執行結果提交給 LLM,由 LLM 對技術化的執行結果進行處理,最終以人性化的語言形式輸出給用戶。

五、使用 mcp-client-nodejs 展示 MCP 交互流程

爲了方便大家更好的學習和 MCP ,我使用 Node.js 開發了一個基礎版的 MCP Clinet(基於 Function Call 實現),項目地址:https://github.com/ConardLi/mcp-client-nodejs

MCP Clinet 的開發還是稍微有點門檻的,所以不在這期教程裏演示具體的代碼細節,主要用此工具來幫助大家更深入的理解 MCP Clinet 和 MCP Server 的整個交互流程,至於開發者們如果感興趣可以直接基於我的項目進行二次開發。

5.1 基於 LLM 構建 MCP Client

同樣的,這個客戶端的核心邏輯也是基於 AI 編寫的,大家可以直接使用我這個提示詞:

## 需求
我想開發一個 Node.js 版的 MCP Clinet ,下面有一些參考材料,包括 MCP 基礎介紹、MCP 核心架構介紹、MCP Clinet 開發教程,請你根據這些參考材料幫我開發一個 MCP Client,注意增加完善的中文註釋,以及在開發完成後編寫一個完善的中文 Readme 說明文檔。

## MCP 基礎介紹
粘貼 https://modelcontextprotocol.io/introduction 的內容。

## MCP 核心架構介紹
粘貼 https://modelcontextprotocol.io/docs/concepts/architecture 的內容。

## MCP Client 開發教程
粘貼 https://modelcontextprotocol.io/quickstart/client 的內容。

## 注意點
- 使用 openai 的 SDK 替換 @anthropic-ai/sdk ,這樣可以支持更多的模型,兼容性更好
- 你不要指定依賴的版本,如果遇到安裝依賴讓我自己來安裝,你只負責編寫代碼

5.2 mcp-client-nodejs 項目介紹

核心特性

安裝和配置

  1. 克隆倉庫
git clone https://github.com/yourusername/mcp-client.git
cd mcp-client
  1. 安裝依賴
npm install
  1. 配置環境變量

複製示例環境變量文件並設置你的 LLM API 密鑰:

cp .env.example .env

然後編輯 .env 文件,填入你的 LLM API 密鑰、模型提供商 API 地址、以及模型名稱:

OPENAI_API_KEY=your_api_key_here
MODEL_NAME=xxx
BASE_URL=xxx
  1. 編譯項目
npm run build

使用方法

要啓動 MCP 客戶端,你可以使用以下幾種方式:

  1. 直接指定服務器腳本路徑
node build/index.js <服務器腳本路徑>

其中 <服務器腳本路徑> 是指向 MCP 服務器腳本的路徑,可以是 JavaScript (.js) 或 Python (.py) 文件。

  1. 使用配置文件
node build/index.js <服務器標識符> <配置文件路徑>

其中 <服務器標識符> 是配置文件中定義的服務器名稱,<配置文件路徑> 是包含服務器定義的 JSON 文件的路徑。

{
  "mcpServers": {
    "time": {
      "command""node",
      "args": [
        "/Users/xxx/Desktop/github/mcp/dist/index.js"
      ],
      "description""自定義 Node.js MCP服務器"
    },
    "mongodb": {
      "command""npx",
      "args": [
        "mcp-mongo-server",
        "mongodb://localhost:27017/studentManagement?authSource=admin"
      ]
    }
  },
"defaultServer""mongodb",
"system""自定義系統提示詞"
}
  1. 使用 npm 包(npx)

你可以直接通過 npx 運行這個包,無需本地克隆和構建:

# 直接連接腳本
$ npx mcp-client-nodejs /path/to/mcp-server.js

# 通過配置文件連接
$ npx mcp-client-nodejs mongodb ./mcp-servers.json

注意:需要在當前運行目錄的 .env 配置模型相關信息

5.3 分析 MCP 詳細交互流程

MCP Client 包含一個全面的日誌系統,詳細記錄所有關鍵操作和通信。日誌文件保存在 logs/ 目錄中,以 JSON 格式存儲,方便查詢和分析。

日誌文件連統命名爲 [index] [log_type] YYYY-MM-DD HH:MM:SS.json,包含序號、日誌類型和時間戳,方便按時間順序查看整個會話。

下面我們使用 mcp-mongo-server 來演示整個流程,首先在項目目錄新建 mcp-servers.json,並填寫下面的配置:

{
  "mcpServers": {
    "mongodb": {
      "command""npx",
      "args": [
        "mcp-mongo-server",
        "mongodb://localhost:27017/studentManagement?authSource=admin"
      ]
    }
  },
  "system""使用中文回覆。\n\n當用戶提問中涉及學生、教師、成績、班級、課程等實體時,需要使用 MongoDB MCP 進行數據查詢和操作,表結構說明如下:xxx"
}

然後執行 node build/index.js mongodb ./mcp-servers.json,客戶端成功啓動:

然後我們輸入一個問題:張老師教哪門課? ,因爲教師信息、課程信息分別存儲在兩個表:

所以這個任務 AI 也需要分兩步完成,第一步先去檢索教室表中姓張的老師,我們輸入繼續:

下面檢索課程表,得出最終信息:

然後我們發現,整個過程一共產生了 13 調日誌:

我們逐個來看一下:

5.4 最終流程總結

以上的過程,非常清晰的展示了整個 MCP 的交互流程,下面我們最後再總結一下:

一、初始化階段

  1. 客戶端啓動與工具列表獲取

二、交互階段

1. 用戶輸入與提示詞構建

2. 工具描述傳遞方式(二選一)

3. 模型決策與響應解析

4. 工具調用分支(需要工具時)

5. 直接回復分支(無需工具時)

三、最終輸出
無論是否經過工具調用,MCPClient 最終將處理後的 自然語言結果 呈現給用戶,完成整個交互流程。

六、最後

關注《code 祕密花園》從此學習 AI 不迷路,code 祕密花園 AI 教程完整的學習資料彙總在這個飛書文檔:https://rncg5jvpme.feishu.cn/wiki/U9rYwRHQoil6vBkitY8cbh5tnL9

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/yP6D_mnxwFsL3SbC4qZnYg