MCP -Model Context Protocol-,一篇就夠了。
最近 MCP 這個關鍵詞逐漸活躍在我所瀏覽的一些文章及評論區中。突然發現我對它僅有粗糙的理解,我決定深入學習並記錄一下。
在閱讀這篇文章前,我也簡單地瀏覽了現有介紹 MCP 的文章。我發現大部分文章停留在 “翻譯” https://modelcontextprotocol.io/ 網站中的內容,或者花時間在絕大部分用戶不關心的技術細節上(還有一些純 AI 文)。
因此,我將從使用者的角度出發,分享實用內容,並以一個示例展示 MCP 的開發過程與實際應用作爲結尾。本篇旨在回答以下三個問題:
-
什麼是 MCP?
-
爲什麼需要 MCP?
-
作爲用戶,我們如何使用 / 開發 MCP?
當然,一篇文章遠遠不足以講透 MCP 的所有概念,只能盡力萃取最重要的內容供大家閱讀,歡迎討論。
1. What is MCP?
MCP 起源於 2024 年 11 月 25 日 Anthropic 發佈的文章:Introducing the Model Context Protocol[1]。
MCP (Model Context Protocol,模型上下文協議)定義了應用程序和 AI 模型之間交換上下文信息的方式。這使得開發者能夠以一致的方式將各種數據源、工具和功能連接到 AI 模型(一箇中間協議層),就像 USB-C 讓不同設備能夠通過相同的接口連接一樣。MCP 的目標是創建一個通用標準,使 AI 應用程序的開發和集成變得更加簡單和統一。
所謂一圖勝千言,我這裏引用一些製作的非常精良的圖片來幫助理解:
可以看出,MCP 就是以更標準的方式讓 LLM Chat 使用不同工具,更簡單的可視化如下圖所示,這樣你應該更容易理解 “中間協議層” 的概念了。Anthropic 旨在實現 LLM Tool Call 的標準。
💡 爲保證閱讀的流暢性,本文將 MCP Host / Client / Server 的定義後置。初學者 / 用戶可暫不關注這些概念,不影響對 MCP 的使用。
2. Why MCP?
我認爲 MCP 的出現是 prompt engineering 發展的產物。更結構化的上下文信息對模型的 performance 提升是顯著的。我們在構造 prompt 時,希望能提供一些更 specific 的信息(比如本地文件,數據庫,一些網絡實時信息等)給模型,這樣模型更容易理解真實場景中的問題。
想象一下沒有 MCP 之前我們會怎麼做?我們可能會人工從數據庫中篩選或者使用工具檢索可能需要的信息,手動的粘貼到 prompt 中。隨着我們要解決的問題越來越複雜,手工把信息引入到 prompt 中會變得越來越困難。
爲了克服手工 prompt 的侷限性,許多 LLM 平臺(如 OpenAI、Google)引入了 function call
功能。這一機制允許模型在需要時調用預定義的函數來獲取數據或執行操作,顯著提升了自動化水平。
但是 function call 也有其侷限性(我對於 function call vs MCP 的理解不一定成熟,歡迎大家補充),我認爲重點在於 function call 平臺依賴性強,不同 LLM 平臺的 function call API 實現差異較大。例如,OpenAI 的函數調用方式與 Google 的不兼容,開發者在切換模型時需要重寫代碼,增加了適配成本。除此之外,還有安全性,交互性等問題。
數據與工具本身是客觀存在的,只不過我們希望將數據連接到模型的這個環節可以更智能更統一。Anthropic 基於這樣的痛點設計了 MCP,充當 AI 模型的 "萬能轉接頭",讓 LLM 能輕鬆得獲取數據或者調用工具。更具體的說 MCP 的優勢在於:
-
生態 - MCP 提供很多現成的插件,你的 AI 可以直接使用。
-
統一性 - 不限制於特定的 AI 模型,任何支持 MCP 的模型都可以靈活切換。
-
數據安全 - 你的敏感數據留在自己的電腦上,不必全部上傳。(因爲我們可以自行設計接口確定傳輸哪些數據)
3. 用戶如何使用 MCP?
對於用戶來說,我們並不關心 MCP 是如何實現的,通常我們只考慮如何更簡單地用上這一特性。
具體的使用方式參考官方文檔:For Claude Desktop Users[2]。這裏不再贅述,配置成功後可以在 Claude 中測試:Can you write a poem and save it to my desktop?
Claude 會請求你的權限後在本地新建一個文件。
並且官方也提供了非常多現成的 MCP Servers,你只需要選擇你希望接入的工具,然後接入即可。
-
Awesome MCP Servers[3]
-
MCP Servers Website[4]
-
Official MCP Servers[5]
比如官方介紹的 filesystem
工具,它允許 Claude 讀取和寫入文件,就像在本地文件系統中一樣。
4. MCP Architecture 解構
這裏首先引用官方給出的架構圖。
MCP 由三個核心組件構成:Host、Client 和 Server。讓我們通過一個實際場景來理解這些組件如何協同工作:
假設你正在使用 Claude Desktop (Host) 詢問:"我桌面上有哪些文檔?"
-
Host:Claude Desktop 作爲 Host,負責接收你的提問並與 Claude 模型交互。
-
Client:當 Claude 模型決定需要訪問你的文件系統時,Host 中內置的 MCP Client 會被激活。這個 Client 負責與適當的 MCP Server 建立連接。
-
Server:在這個例子中,文件系統 MCP Server 會被調用。它負責執行實際的文件掃描操作,訪問你的桌面目錄,並返回找到的文檔列表。
整個流程是這樣的:你的問題 → Claude Desktop(Host) → Claude 模型 → 需要文件信息 → MCP Client 連接 → 文件系統 MCP Server → 執行操作 → 返回結果 → Claude 生成回答 → 顯示在 Claude Desktop 上。
這種架構設計使得 Claude 可以在不同場景下靈活調用各種工具和數據源,而開發者只需專注於開發對應的 MCP Server,無需關心 Host 和 Client 的實現細節。
5. 原理:模型是如何確定工具的選用的?
在學習的過程中,我一直好奇一個問題:Claude(模型)是在什麼時候確定使用哪些工具的呢?好在 Anthropic 爲我們提供了詳細的解釋 [6]:
當用戶提出一個問題時:
-
客戶端(Claude Desktop / Cursor)將你的問題發送給 Claude。
-
Claude 分析可用的工具,並決定使用哪一個(或多個)。
-
客戶端通過 MCP Server 執行所選的工具。
-
工具的執行結果被送回給 Claude。
-
Claude 結合執行結果構造最終的 prompt 並生成自然語言的迴應。
-
迴應最終展示給用戶!
MCP Server 是由 Claude 主動選擇並調用的。有意思的是 Claude 具體是如何確定該使用哪些工具呢?以及是否會使用一些不存在的工具呢(幻覺)?
6. 總結
MCP (Model Context Protocol) 代表了 AI 與外部工具和數據交互的標準建立。通過本文,我們可以瞭解到:
-
MCP 的本質:它是一個統一的協議標準,使 AI 模型能夠以一致的方式連接各種數據源和工具,類似於 AI 世界的 "USB-C" 接口。
-
MCP 的價值:它解決了傳統 function call 的平臺依賴問題,提供了更統一、開放、安全、靈活的工具調用機制,讓用戶和開發者都能從中受益。
-
使用與開發:對於普通用戶,MCP 提供了豐富的現成工具,用戶可以在不瞭解任何技術細節的情況下使用;對於開發者,MCP 提供了清晰的架構和 SDK,使工具開發變得相對簡單。
MCP 還處於發展初期,但其潛力巨大。更重要的是生態吧,基於統一標準下構築的生態也會正向的促進整個領域的發展。
以上內容已經覆蓋了 MCP 的基本概念、價值和使用方法。對於技術實現感興趣的讀者,以下附錄提供了一個簡單的 MCP Server 開發實踐,幫助你更深入地理解 MCP 的工作原理。
Appendix A:MCP Server 開發實踐
在瞭解 MCP 組件之後,很容易發現對絕大部分 AI 開發者來說,我們只需要關心 Server 的實現。因此,我這裏準備通過一個最簡單的示例來介紹如何實現一個 MCP Server。
MCP servers 可以提供三種主要類型的功能:
-
Resources(資源):類似文件的數據,可以被客戶端讀取(如 API 響應或文件內容)
-
Tools(工具):可以被 LLM 調用的函數(需要用戶批准)
-
Prompts(提示):預先編寫的模板,幫助用戶完成特定任務
本教程將主要關注工具(Tools)。
A.I 使用 LLM 構建 MCP 的最佳實踐
在開始之前,Anthropic 爲我們提供了一個基於 LLM 的 MCP Server 的最佳開發實踐 [7],總結如下:
-
引入 domain knowledge (說人話就是,告訴他一些 MCP Server 開發的範例和資料)
-
訪問 https://modelcontextprotocol.io/llms-full.txt 並複製完整的文檔文本。(實測這個太長了,可以忽略)
-
導航到 MCP TypeScript SDK[8] 或 Python SDK[9] Github 項目中並複製相關內容。
-
把這些作爲 prompt 輸入到你的 chat 對話中(作爲 context)。
-
-
描述你的需求
-
你的服務器會開放哪些資源
-
它會提供哪些工具
-
它應該給出哪些引導或建議
-
它需要跟哪些外部系統互動
-
給出一個 example prompt:
... (這裏是已經引入的 domain knowledge)
打造一個 MCP 服務器,它能夠:
- 連接到我公司的 PostgreSQL 數據庫
- 將表格結構作爲資源開放出來
- 提供運行只讀 SQL 查詢的工具
- 包含常見數據分析任務的引導
剩下的部分也很重要,但是偏重於方法論,實踐性較弱,我這裏就不展開了,推薦大家直接看官方文檔 [10]。
A.II 手動實踐
本節內容主要參考了官方文檔:Quick Start: For Server Developers[11]。你可以選擇直接跳過這部分內容或者進行一個速讀。
這裏我準備了一個簡單的示例,使用 Python 實現一個 MCP Server,用來統計當前桌面上的 txt 文件數量和獲取對應文件的名字(你可以理解爲一點用都沒有,但是它足夠簡單,主要是爲了難以配置環境的讀者提供一個足夠短的實踐記錄)。以下實踐均運行在我的 MacOS 系統上。
Step1. 前置工作
-
安裝 Claude Desktop。
-
Python 3.10+ 環境
-
Python MCP SDK 1.2.0+
Step2. 環境配置
由於我使用的是官方推薦的配置:
# 安裝 uv
curl -LsSf https://astral.sh/uv/install.sh | sh
# 創建項目目錄
uv init txt_counter
cd txt_counter
# 設置 Python 3.10+ 環境
echo "3.11" > .python-version
# 創建虛擬環境並激活
uv venv
source .venv/bin/activate
# Install dependencies
uv add "mcp[cli]" httpx
# Create our server file
touch txt_counter.py
Question: 什麼是
uv
呢和conda
比有什麼區別?Answer: 一個用 Rust 編寫的超快速 (100x) Python 包管理器和環境管理工具,由 Astral 開發。定位爲 pip 和 venv 的替代品,專注於速度、簡單性和現代 Python 工作流。
Step3. 構造一個 prompt
"""
... (這裏是已經引入的 domain knowledge)
"""
打造一個 MCP 服務器,它能夠:
- 功能:
- 統計當前桌面上的 txt 文件數量
- 獲取對應文件的名字
要求:
- 不需要給出 prompt 和 resource 相關代碼。
- 你可以假設我的桌面路徑爲 /Users/{username}/Desktop
- Domain Knowledge 複製於 MCP Python SDK 的 README 文件 [12]
Step4. 實現 MCP Server
以下代碼由 Claude 3.7 直接生成。當然,這主要是因爲我的需求足夠簡單,當你需要實現一個複雜的 MCP Server 時,你可能需要多步的引導和 Debug 才能得到最終的代碼。
import os
from pathlib import Path
from mcp.server.fastmcp import FastMCP
# 創建 MCP Server
mcp = FastMCP("桌面 TXT 文件統計器")
@mcp.tool()
defcount_desktop_txt_files() -> int:
"""Count the number of .txt files on the desktop."""
# Get the desktop path
username = os.getenv("USER") or os.getenv("USERNAME")
desktop_path = Path(f"/Users/{username}/Desktop")
# Count .txt files
txt_files = list(desktop_path.glob("*.txt"))
returnlen(txt_files)
@mcp.tool()
deflist_desktop_txt_files() -> str:
"""Get a list of all .txt filenames on the desktop."""
# Get the desktop path
username = os.getenv("USER") or os.getenv("USERNAME")
desktop_path = Path(f"/Users/{username}/Desktop")
# Get all .txt files
txt_files = list(desktop_path.glob("*.txt"))
# Return the filenames
ifnot txt_files:
return"No .txt files found on desktop."
# Format the list of filenames
file_list = "\n".join([f"- {file.name}"for file in txt_files])
returnf"Found {len(txt_files)} .txt files on desktransform: translateY(\n{file_list}"
if __name__ == "__main__":
# Initialize and run the server
mcp.run()
任務非常簡單,只需要調用非常基本的 os
就可以完成。
Step5. 測試 MCP Server
(官方沒有這一步,但是我非常推薦大家這麼做)
$ mcp dev txt_counter.py
Starting MCP inspector...
Proxy server listening on port 3000
🔍 MCP Inspector is up and running at http://localhost:5173 🚀
之後進入到給出的鏈接中,你大概能按下圖進行操作:
如果成功,你應該能像我一樣看到對應的輸出(Tool Result
)~
Step6. 接入 Claude
最後一步就是把我們寫好的 MCP 接入到 Claude Desktop 中。流程如下:
# 打開 claude_desktop_config.json (MacOS / Linux)
# 如果你用的是 cursor 或者 vim 請更換對應的命令
code ~/Library/Application\ Support/Claude/claude_desktop_config.json
在配置文件中添加以下內容,記得替換 /Users/{username}
爲你的實際用戶名,以及其他路徑爲你的實際路徑。
{
"mcpServers":{
"txt_counter":{
"command":"/Users/{username}/.local/bin/uv",
"args":[
"--directory",
"/Users/{username}/work/mcp-learn/code-example-txt",// 你的項目路徑(這裏是我的)
"run",
"txt_counter.py"// 你的 MCP Server 文件名
]
}
}
}
-
uv
最好是絕對路徑,推薦使用which uv
獲取。
配置好後重啓 Claude Desktop,如果沒問題就能看到對應的 MCP Server 了。
Step7. 實際使用
接下來,我們通過一個簡單的 prompt 進行實際測試:
能推測我當前桌面上 txt 文件名的含義嗎?
它可能會請求你的使用權限,如圖一所示,你可以點擊 Allow for This Chat
看起來我們 MCP Server 已經正常工作了!
A.III MCP Server Debug
Debug 是一個非常複雜的話題,這裏直接推薦官方的教程:
-
Official Tutorial: Debugging[13]
-
Official Tutorial: Inspector[14]
Reference
-
MCP Official Docs[15]
-
MCP Python SDK[16]
-
MCP Available Server[17]
-
Blog: 🔗What is Model Context Protocol? (MCP) Architecture Overview[18]
-
Blog: LLM Function-Calling vs. Model Context Protocol (MCP)[19]
引用鏈接
[1]
Introducing the Model Context Protocol:https://www.anthropic.com/news/model-context-protocol
[2]
For Claude Desktop Users:https://modelcontextprotocol.io/quickstart/user
[3]
Awesome MCP Servers:https://github.com/punkpeye/awesome-mcp-servers
[4]
MCP Servers Website:https://mcpservers.org/
[5]
Official MCP Servers:https://github.com/modelcontextprotocol/servers
[6]
解釋:https://modelcontextprotocol.io/quickstart/server#what%E2%80%99s-happening-under-the-hood
[7]
最佳開發實踐:https://modelcontextprotocol.io/tutorials/building-mcp-with-llms
[8]
TypeScript SDK:https://github.com/modelcontextprotocol/typescript-sdk
[9]
Python SDK:https://github.com/modelcontextprotocol/python-sdk
[10]
官方文檔:https://modelcontextprotocol.io/tutorials/building-mcp-with-llms
[11]
Quick Start: For Server Developers:https://modelcontextprotocol.io/quickstart/server
[12]
README 文件:https://raw.githubusercontent.com/modelcontextprotocol/python-sdk/refs/heads/main/README.md
[13]
Official Tutorial: Debugging:https://modelcontextprotocol.io/docs/tools/debugging
[14]
Official Tutorial: Inspector:https://modelcontextprotocol.io/docs/tools/inspector
[15]
MCP Official Docs:https://modelcontextprotocol.io/
[16]
MCP Python SDK:https://github.com/modelcontextprotocol/python-sdk
[17]
MCP Available Server:https://github.com/modelcontextprotocol/servers
[18]
Blog: 🔗What is Model Context Protocol? (MCP) Architecture Overview:https://medium.com/@tahirbalarabe2/what-is-model-context-protocol-mcp-architecture-overview-c75f20ba4498
[19]
Blog: LLM Function-Calling vs. Model Context Protocol (MCP):https://www.gentoro.com/blog/function-calling-vs-model-context-protocol-mcp
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/rmR8H6ocCd1E3hvbgb0__Q