正如 LSP 成為了 IDE 的通用標(biāo)準(zhǔn)一樣,Anthropic 正在將 MCP 打造成 LLM 集成的開放標(biāo)準(zhǔn)。
前段時(shí)間 OpenAI 發(fā)布了一個(gè)實(shí)時(shí)訪問第三方應(yīng)用的功能來(lái)為 ChatGPT 提供上下文(ChatGPT 升級(jí)為實(shí)時(shí)協(xié)作助手),沒想到 Claude 這么快就帶來(lái)了一個(gè) LLM 協(xié)議標(biāo)準(zhǔn),直接將 AI 能力拉滿(現(xiàn)在下結(jié)論為時(shí)尚早)。不過當(dāng)我看完整個(gè)協(xié)議以及簡(jiǎn)單上手體驗(yàn)后,我想說(shuō):“真牛逼,它以一種非入侵方式最大限度獲取到系統(tǒng)權(quán)限來(lái)拓展 AI 的能力邊界”!
模型上下文協(xié)議(MCP)是 Anthropic 推出的開放標(biāo)準(zhǔn),旨在通過統(tǒng)一的客戶端-服務(wù)器架構(gòu)解決 LLM 應(yīng)用與數(shù)據(jù)源連接的難題。它支持通過同一協(xié)議訪問本地資源(如數(shù)據(jù)庫(kù)、文件)和遠(yuǎn)程資源(如 Slack、GitHub API),無(wú)需定制集成。MCP 不僅共享數(shù)據(jù),還可公開工具和交互模板,且內(nèi)置安全性,確保資源由服務(wù)器完全掌控。目前 MCP 支持本地運(yùn)行,未來(lái)將引入企業(yè)級(jí)認(rèn)證的遠(yuǎn)程支持,實(shí)現(xiàn)團(tuán)隊(duì)間的安全共享。通過 Claude 桌面應(yīng)用,開發(fā)者可在短時(shí)間內(nèi)集成 MCP,快速連接多種數(shù)據(jù)源,推動(dòng) AI 集成的標(biāo)準(zhǔn)化發(fā)展。
MCP 簡(jiǎn)介
近日,Model Context Protocol[1](MCP,模型上下文協(xié)議)正式開源。作為一項(xiàng)連接 AI 助手與數(shù)據(jù)系統(tǒng)的新標(biāo)準(zhǔn),MCP 的誕生旨在解決當(dāng)前 AI 模型因數(shù)據(jù)孤島限制而無(wú)法充分發(fā)揮潛力的難題。這項(xiàng)由 Claude 推動(dòng)的技術(shù)創(chuàng)新為開發(fā)者提供了一個(gè)開放的、統(tǒng)一的解決方案,使 AI 系統(tǒng)能夠與多種內(nèi)容存儲(chǔ)庫(kù)、業(yè)務(wù)工具和開發(fā)環(huán)境高效對(duì)接,顯著提升模型的響應(yīng)質(zhì)量與相關(guān)性。
背景
解決碎片化問題,為 AI 打開數(shù)據(jù)大門。
當(dāng)前,AI 助手已成為主流工具,模型能力的進(jìn)步使推理和質(zhì)量得以迅速提升。然而,數(shù)據(jù)訪問的瓶頸依然存在。每個(gè)數(shù)據(jù)源需要獨(dú)立的定制集成,這種碎片化的方式不僅效率低下,還限制了 AI 的可擴(kuò)展性。
MCP 的出現(xiàn)就是為了改變現(xiàn)狀。它作為一個(gè)通用的開放協(xié)議,為數(shù)據(jù)源與 AI 系統(tǒng)之間的連接提供了統(tǒng)一標(biāo)準(zhǔn),替代復(fù)雜的多源整合方式。這種設(shè)計(jì)極大簡(jiǎn)化了數(shù)據(jù)接入過程,降低開發(fā)者的工作量,同時(shí)讓 AI 系統(tǒng)能夠更加全面和準(zhǔn)確地訪問數(shù)據(jù),推動(dòng)系統(tǒng)從孤立走向協(xié)同。
MCP 核心
MCP 的架構(gòu)清晰且開放,開發(fā)者可以通過 MCP 服務(wù)器對(duì)外提供數(shù)據(jù),或構(gòu)建 MCP 客戶端,將 AI 應(yīng)用與這些服務(wù)器連接。為推動(dòng)開發(fā)者快速上手,MCP 開源了以下三大核心工具:
MCP 規(guī)范及 SDK:幫助開發(fā)者輕松理解和實(shí)現(xiàn)協(xié)議功能。
MCP 官網(wǎng):https://modelcontextprotocol.io
MCP GitHub:https://github.com/modelcontextprotocol
本機(jī) MCP 服務(wù)支持:通過 Claude 桌面應(yīng)用快速實(shí)現(xiàn)本地化數(shù)據(jù)連接,應(yīng)用安裝鏈接 https://claude.ai/download。
開源服務(wù)代碼庫(kù):包含 Google Drive、Slack、GitHub 等流行系統(tǒng)的預(yù)構(gòu)建實(shí)現(xiàn),便于直接部署和測(cè)試。訪問鏈接 https://github.com/modelcontextprotocol/servers。
此外,Claude 3.5 Sonnet 模型還支持快速開發(fā) MCP 服務(wù)器,使個(gè)人和企業(yè)能夠以最低的門檻實(shí)現(xiàn)與重要數(shù)據(jù)集的對(duì)接。
行業(yè)動(dòng)態(tài)
目前,MCP 已被 Block 和 Apollo 等企業(yè)率先應(yīng)用,并逐步融入 Zed[2](Zed MCP 源碼實(shí)現(xiàn) context_server/protocol.rs[3])、Replit[4]、Codeium[5] 和 Sourcegraph[6] 等開發(fā)工具平臺(tái)。這些公司通過 MCP 增強(qiáng) AI 對(duì)上下文的理解能力,使 AI 能夠在編碼任務(wù)中高效檢索相關(guān)信息,生成更準(zhǔn)確、更具功能性的代碼。
Block 的首席技術(shù)官 Dhanji R. Prasanna 表示:“在 Block,開源不僅僅是一種開發(fā)模式,它是我們工作的基石,更是一種承諾——致力于創(chuàng)造能夠推動(dòng)深遠(yuǎn)變革、造福公眾的技術(shù)。像 Model Context Protocol 這樣的開源技術(shù),是將 AI 與現(xiàn)實(shí)應(yīng)用連接起來(lái)的橋梁,確保創(chuàng)新以開放、透明和協(xié)作為核心。我們非常高興能參與這一協(xié)議的開發(fā),并借助它構(gòu)建自主化系統(tǒng),讓人們擺脫機(jī)械性任務(wù)的束縛,專注于更具創(chuàng)造性的工作?!?/p>
通過 MCP,開發(fā)者不再需要為每個(gè)數(shù)據(jù)源維護(hù)獨(dú)立的連接器,而是可以基于標(biāo)準(zhǔn)協(xié)議構(gòu)建一套通用的解決方案。隨著生態(tài)系統(tǒng)的不斷完善,AI 系統(tǒng)將能夠在不同工具和數(shù)據(jù)集之間保持上下文一致性,為企業(yè)和開發(fā)者帶來(lái)更具前景的技術(shù)架構(gòu)。
未來(lái)展望
Claude 團(tuán)隊(duì)表示,他們致力于將 MCP 打造成一個(gè)協(xié)作性的開源生態(tài)系統(tǒng),鼓勵(lì)開發(fā)者、企業(yè)以及早期技術(shù)探索者共同參與,推動(dòng)具有上下文感知能力的 AI 工具走向更廣闊的未來(lái)。
開發(fā)者目前可以通過 Claude 桌面應(yīng)用快速部署 MCP 服務(wù),也可以根據(jù)官方提供的快速入門指南構(gòu)建自己的 MCP 解決方案。同時(shí),開源社區(qū)已開放了連接器和實(shí)現(xiàn)的代碼庫(kù),支持開發(fā)者貢獻(xiàn)自己的擴(kuò)展功能。
隨著 MCP 的普及,AI 系統(tǒng)將更好地突破數(shù)據(jù)隔離的限制,真正實(shí)現(xiàn)與現(xiàn)實(shí)環(huán)境的無(wú)縫對(duì)接。對(duì)于技術(shù)領(lǐng)域而言,這無(wú)疑是一次重要的里程碑,也為 AI 生態(tài)的可持續(xù)發(fā)展帶來(lái)了全新可能。
lencx 演示
我自己根據(jù)文檔幾分鐘就跑通了本地?cái)?shù)據(jù)庫(kù)連接,在開始前需要做一些額外準(zhǔn)備:
打開桌面應(yīng)用的開發(fā)者模式,方便進(jìn)行日志調(diào)試(菜單 Help → Enable Developer Mode -> 點(diǎn)擊彈窗 Enable 按鈕)。
啟用開發(fā)者模式后,會(huì)在菜單中多一個(gè) Developer 菜單項(xiàng),點(diǎn)擊 Open MCP Log File 可以打開日志文件,查看到操作日志,方便排查問題。
前置條件
macOS 或 Windows 系統(tǒng)
已安裝最新版本的 Claude 桌面應(yīng)用(當(dāng)前為 0.7.1 版本)
uv[7] 0.4.18 或更高版本(可通過 uv --version 檢查)
Git(git --version 檢查)
SQLite(sqlite3 --version 檢查)
如果系統(tǒng)環(huán)境不存在 uv、Git、SQLite,可通過以下方式在命令行中進(jìn)行安裝:
macOS 安裝
# Using Homebrew brew install uv git sqlite3 # Or download directly: # uv: https://docs.astral.sh/uv/ # Git: https://git-scm.com # SQLite: https://www.sqlite.org/download.html
Windows 安裝
# Using winget winget install --id=astral-sh.uv -e winget install git.git sqlite.sqlite # Or download directly: # uv: https://docs.astral.sh/uv/ # Git: https://git-scm.com # SQLite: https://www.sqlite.org/download.html
操作步驟
設(shè)置本地 SQLite 數(shù)據(jù)庫(kù)
通過 MCP 將 Claude 桌面應(yīng)用連接到該數(shù)據(jù)庫(kù)
安全地查詢和分析數(shù)據(jù)
Step 1:創(chuàng)建測(cè)試數(shù)據(jù)庫(kù)
macOS 請(qǐng)執(zhí)行以下命令(路徑:/Users/YOUR_USERNAME/test.db):
sqlite3 ~/test.db <
Windows 用戶執(zhí)行以下命令(路徑:C:\Users\YOUR_USERNAME\test.db):
$sql = @' CREATE TABLE products ( id INTEGER PRIMARY KEY, name TEXT, price REAL ); INSERT INTO products (name, price) VALUES ('Widget', 19.99), ('Gadget', 29.99), ('Gizmo', 39.99), ('Smart Watch', 199.99), ('Wireless Earbuds', 89.99), ('Portable Charger', 24.99), ('Bluetooth Speaker', 79.99), ('Phone Stand', 15.99), ('Laptop Sleeve', 34.99), ('Mini Drone', 299.99), ('LED Desk Lamp', 45.99), ('Keyboard', 129.99), ('Mouse Pad', 12.99), ('USB Hub', 49.99), ('Webcam', 69.99), ('Screen Protector', 9.99), ('Travel Adapter', 27.99), ('Gaming Headset', 159.99), ('Fitness Tracker', 119.99), ('Portable SSD', 179.99); '@ cd ~ & sqlite3 test.db $sql
Step 2:配置 Claude 應(yīng)用
配置文件路徑:
macOS:~/Library/Application Support/Claude/claude_desktop_config.json
Windows:%APPDATA%Claudeclaude_desktop_config.json
文件可通過命令打開,也可以通過 Claude 設(shè)置界面打開(點(diǎn)擊 編輯配置(Edit Config) 按鈕)。
用自己喜歡的編輯器將以下內(nèi)容復(fù)制到 claude_desktop_config.json 中。注意將 /Users/lencx/test.db 路徑改為自己的本機(jī)文件路徑。
{ "mcpServers": { "sqlite": { "command": "uvx", "args": [ "mcp-server-sqlite", "--db-path", "/Users/lencx/test.db" ] } } }
這里告訴 Claude 桌面應(yīng)用:
有一個(gè)名為 “sqlite” 的 MCP 服務(wù)器
通過運(yùn)行 uvx mcp-server-sqlite 命令來(lái)啟動(dòng)它
將其連接到你的測(cè)試數(shù)據(jù)庫(kù)(即本地創(chuàng)建的 test.db 文件)
保存文件后,重新啟動(dòng) Claude 桌面應(yīng)用
Step 3:測(cè)試一下
將以下 Prompt 發(fā)送給 Claude,來(lái)驗(yàn)證一切是否正常:
Can you connect to my SQLite database and tell me what products are available, and their prices?
如果一切正常,Claude 將連接到 SQLite MCP 服務(wù)器,然后查詢本地?cái)?shù)據(jù)庫(kù),使用格式化方式呈現(xiàn)出結(jié)果。
你還可以測(cè)試這些 Prompt:
基本查詢:What's the average price of all products in the database?
數(shù)據(jù)分析:Can you analyze the price distribution and suggest any pricing optimizations?
復(fù)雜操作:Could you help me design and create a new table for storing customer orders?
運(yùn)行原理
當(dāng)你通過 MCP 與 Claude 桌面應(yīng)用交互時(shí),會(huì)經(jīng)過以下步驟:
服務(wù)器發(fā)現(xiàn):Claude 桌面應(yīng)用在啟動(dòng)時(shí)會(huì)連接到你配置的 MCP 服務(wù)器。
協(xié)議握手:當(dāng)你詢問數(shù)據(jù)時(shí),Claude 桌面應(yīng)用會(huì):
確定哪個(gè) MCP 服務(wù)器可以提供幫助(例如,本例中的 SQLite 服務(wù)器)。
通過協(xié)議協(xié)商服務(wù)器的功能和權(quán)限。
向 MCP 服務(wù)器請(qǐng)求數(shù)據(jù)或執(zhí)行操作。
交互流程:
Claude 桌面應(yīng)用通過 MCP 服務(wù)器與本地資源交互。
所有操作均嚴(yán)格限制在服務(wù)器允許的范圍內(nèi)。
在安全性方面:
受控能力:MCP 服務(wù)器僅暴露特定且受控的功能。
本地運(yùn)行:MCP 服務(wù)器運(yùn)行在本地計(jì)算機(jī)上,訪問的資源不會(huì)暴露在互聯(lián)網(wǎng)中。
用戶確認(rèn):對(duì)于敏感操作,Claude 桌面應(yīng)用需要用戶確認(rèn)后才能執(zhí)行。
這一設(shè)計(jì)確保了在使用 Claude 分析或交互本地?cái)?shù)據(jù)時(shí),用戶始終保持對(duì)數(shù)據(jù)訪問和操作的完全控制權(quán),同時(shí)最大限度保障數(shù)據(jù)安全性。
常見問題
如果 Claude 桌面應(yīng)用中沒有顯示內(nèi)容,可以通過以下步驟排查問題:首先,檢查是否啟用了 MCP,點(diǎn)擊聊天框旁的 圖標(biāo),展開“已安裝的 MCP 服務(wù)器”(Installed MCP Servers)確認(rèn)配置的服務(wù)器是否顯示。然后導(dǎo)航到 Claude > Settings… 打開“開發(fā)者(Developer)”標(biāo)簽頁(yè)驗(yàn)證配置。最后完全退出并重啟 Claude 桌面應(yīng)用以確保更改生效。
如果遇到 MCP 或數(shù)據(jù)庫(kù)錯(cuò)誤,可以檢查 Claude 桌面應(yīng)用的日志,運(yùn)行命令 tail -n 20 -f ~/Library/Logs/Claude/mcp*.log 查看最近的日志信息。也可以測(cè)試數(shù)據(jù)庫(kù)連接,例如運(yùn)行 sqlite3 ~/test.db ".tables" 確認(rèn)數(shù)據(jù)庫(kù)是否正常工作。常見的修復(fù)方法包括檢查配置文件中的文件路徑、驗(yàn)證數(shù)據(jù)庫(kù)文件的權(quán)限,以及確保 SQLite 已正確安裝。通過這些步驟,可以有效解決大部分問題。
MCP 協(xié)議詳解
官方文檔內(nèi)容很長(zhǎng),為了方便大家對(duì) MCP 有一個(gè)全面了解,我對(duì)文檔做了簡(jiǎn)單梳理。需要注意:目前文檔主要適配macOS,其他系統(tǒng)指南將在晚些時(shí)候給出。
快速開始
目前 MCP 有三種方式可以幫助你快速開始,Python 或 TypeScript 選一個(gè)自己比較熟悉的構(gòu)建服務(wù)即可。
快速入門(MCP Quickstart[8]):不到 5 分鐘即可開始使用 MCP,可在 Claude 桌面應(yīng)用和本地服務(wù)之間建立安全連接(以上的 “l(fā)encx 演示” 就是基于該部分文檔實(shí)現(xiàn))。
構(gòu)建第一個(gè) Python 服務(wù) (MCP Python[9]):15 分鐘內(nèi)用 Python 創(chuàng)建一個(gè)簡(jiǎn)單的 MCP 服務(wù)器。
構(gòu)建第一個(gè) TypeScript 服務(wù)(MCP TypeScript[10]):15 分鐘內(nèi)用 TypeScript 創(chuàng)建一個(gè)簡(jiǎn)單的 MCP 服務(wù)器。
開發(fā)工具
開發(fā) MCP 服務(wù)器或?qū)⑵渑c應(yīng)用程序集成時(shí),有效的調(diào)試至關(guān)重要。所以 MCP 提供了幾種不同層次的調(diào)試工具:
MCP 檢查器(MCP Inspector[11])
交互式調(diào)試界面
直接服務(wù)器測(cè)試
Claude 桌面開發(fā)工具(Claude Desktop Developer Tools)
集成測(cè)試
日志收集
Chrome DevTools 集成
服務(wù)器日志(Server Logging)
自定義日志記錄實(shí)現(xiàn)
錯(cuò)誤追蹤
性能監(jiān)控
概念:核心架構(gòu)(Core architecture)
MCP 遵循客戶端-服務(wù)器架構(gòu)(client-server),其中:
MCP 主機(jī)(MCP Hosts):希望通過 MCP 訪問資源的程序(例如 Claude Desktop、IDE 或 AI 工具),用于發(fā)起連接。
MCP 客戶端(MCP Clients):與服務(wù)器保持 1:1 連接的協(xié)議客戶端。
MCP 服務(wù)器(MCP Servers):輕量級(jí)程序,每個(gè)程序都通過標(biāo)準(zhǔn)化模型上下文協(xié)議公開特定功能。為客戶端提供上下文、工具和 prompt 信息。
本地資源(Local Resources):你的計(jì)算機(jī)資源中可供 MCP 服務(wù)器安全訪問的資源(數(shù)據(jù)庫(kù)、文件、服務(wù))。
遠(yuǎn)程資源(Remote Resources):MCP 服務(wù)器可以連接到的互聯(lián)網(wǎng)資源(例如通過 API)。
核心組件
協(xié)議層(Protocol layer)
協(xié)議層負(fù)責(zé)消息的封裝、請(qǐng)求/響應(yīng)的關(guān)聯(lián),以及高層通信模式的管理。主要類包括:Protocol 、Client 、 Server 等。以 Protocol 類為例(TypeScript 版):
class Protocol{ // Handle incoming requests setRequestHandler (schema: T, handler: (request: T, extra: RequestHandlerExtra) => Promise ): void // Handle incoming notifications setNotificationHandler (schema: T, handler: (notification: T) => Promise ): void // Send requests and await responses request (request: Request, schema: T, options?: RequestOptions): Promise // Send one-way notifications notification(notification: Notification): Promise }
傳輸層(Transport layer)
傳輸層負(fù)責(zé)客戶端和服務(wù)器之間的實(shí)際通信。MCP 支持多種傳輸機(jī)制:
Stdio 傳輸
使用標(biāo)準(zhǔn)輸入/輸出進(jìn)行通信
適合本地進(jìn)程間通信
基于 HTTP 和 SSE 的傳輸
使用 Server-Sent Events(SSE) 進(jìn)行服務(wù)器到客戶端的消息傳遞
使用 HTTP POST 進(jìn)行客戶端到服務(wù)器的消息傳遞
所有傳輸機(jī)制都采用 JSON-RPC 2.0 協(xié)議進(jìn)行消息交換。詳細(xì)的 MCP 消息格式規(guī)范可參考相關(guān)文檔。
消息類型(Message types)
MCP 定義了以下主要消息類型:
請(qǐng)求(Request):需要另一方提供響應(yīng)
interface Request { method: string; params?: { ... }; }
通知(Notification):?jiǎn)蜗蛳?,不需要響?yīng)
interface Notification { method: string; params?: { ... }; }
結(jié)果(Result):成功響應(yīng)請(qǐng)求的消息
interface Result { [key: string]: unknown; }
錯(cuò)誤(Error):表示請(qǐng)求失敗的消息
interface Error { code: number; message: string; data?: unknown; }
Connection 生命周期
初始化(Initialization)
客戶端發(fā)送 initialize 請(qǐng)求,包含協(xié)議版本和能力信息
服務(wù)器響應(yīng)其協(xié)議版本和能力信息
客戶端發(fā)送 initialized 通知以確認(rèn)
正常消息交換開始
消息交換(Message exchange)
初始化后,支持以下通信模式:
請(qǐng)求-響應(yīng)模式(Request-Response):客戶端或服務(wù)器發(fā)送請(qǐng)求,另一方響應(yīng)
通知模式(Notifications):任一方發(fā)送單向消息
終止連接(Termination)
任一方可以終止連接:
通過 close() 進(jìn)行正常關(guān)閉
通過傳輸層斷開連接
因錯(cuò)誤條件導(dǎo)致中斷
錯(cuò)誤處理(Error handling)
錯(cuò)誤通過以下方式傳播:
請(qǐng)求的錯(cuò)誤響應(yīng)
傳輸中的錯(cuò)誤事件
協(xié)議級(jí)錯(cuò)誤處理程序
enum ErrorCode { // Standard JSON-RPC error codes ParseError = -32700, InvalidRequest = -32600, MethodNotFound = -32601, InvalidParams = -32602, InternalError = -32603 }
SDK 和應(yīng)用程序可以自定義 -32000 以上的錯(cuò)誤碼。
代碼示例
以下是實(shí)現(xiàn) MCP 服務(wù)器的基本代碼示例:
import { Server } from "@modelcontextprotocol/sdk/server/index.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; const server = new Server({ name: "example-server", version: "1.0.0" }, { capabilities: { resources: {} } }); // Handle requests server.setRequestHandler(ListResourcesRequestSchema, async () => { return { resources: [ { uri: "example://resource", name: "Example Resource" } ] }; }); // Connect transport const transport = new StdioServerTransport(); await server.connect(transport);
概念:資源(Resources)
資源是模型上下文協(xié)議(MCP)的核心組件之一,允許服務(wù)器將數(shù)據(jù)和內(nèi)容暴露給客戶端,以便用作 LLM 交互的上下文信息。MCP 資源設(shè)計(jì)為由應(yīng)用程序控制,這意味著客戶端應(yīng)用程序可以決定資源的使用方式和時(shí)機(jī)。例如:
某些應(yīng)用可能需要用戶顯式選擇資源。
另一些應(yīng)用可能基于啟發(fā)式算法或 AI 模型自身的判斷自動(dòng)選擇資源。
所以資源代表 MCP 服務(wù)器希望向客戶端提供的任何類型的數(shù)據(jù),包括:
文件內(nèi)容(File contents)
數(shù)據(jù)庫(kù)記錄(Database records)
API 響應(yīng)(API responses)
實(shí)時(shí)系統(tǒng)數(shù)據(jù)(Live system data)
屏幕截圖和圖像(Screenshots and images)
日志文件(Log files)
...
每個(gè)資源通過唯一的 URI 標(biāo)識(shí),可以包含文本或二進(jìn)制數(shù)據(jù)。
資源 URI
資源通過以下格式的 URI 進(jìn)行標(biāo)識(shí)([協(xié)議]://[主機(jī)]/[路徑]):
[protocol]://[host]/[path]
示例:
file:///home/user/documents/report.pdf
postgres://database/customers/schema
screen://localhost/display1
協(xié)議和路徑結(jié)構(gòu)由 MCP 服務(wù)器實(shí)現(xiàn)定義,服務(wù)器也可以自定義 URI 方案。
資源類型
資源可以包含以下兩種內(nèi)容類型:
文本資源:文本資源包含 UTF-8 編碼的文本數(shù)據(jù),適用于:源代碼、配置文件、日志文件、JSON/XML 數(shù)據(jù)、純文本等。
二進(jìn)制資源:二進(jìn)制資源包含以 Base64 編碼的原始二進(jìn)制數(shù)據(jù),適用于:圖像、PDF 文件、音頻文件、視頻文件、其他非文本格式等。
資源發(fā)現(xiàn)
客戶端主要通過兩種方式發(fā)現(xiàn)可用資源:
直接資源(Direct resources):服務(wù)器通過端點(diǎn)公開具體資源的列表 resources/list。
{ uri: string; // Unique identifier for the resource name: string; // Human-readable name description?: string; // Optional description mimeType?: string; // Optional MIME type }
資源模板(Resource templates):對(duì)于動(dòng)態(tài)資源,服務(wù)器可以公開 URI 模板[12],客戶端可以使用它來(lái)構(gòu)建有效的資源 URI。
{ uriTemplate: string; // URI template following RFC 6570 name: string; // Human-readable name for this type description?: string; // Optional description mimeType?: string; // Optional MIME type for all matching resources }
閱讀資源(Reading resources):要讀取資源,客戶端 resources/read 需要使用資源 URI 發(fā)出請(qǐng)求。服務(wù)器以資源內(nèi)容列表進(jìn)行響應(yīng)。
{ contents: [ { uri: string; // The URI of the resource mimeType?: string; // Optional MIME type // One of: text?: string; // For text resources blob?: string; // For binary resources (base64 encoded) } ] }
資源更新
MCP 通過兩種機(jī)制支持資源的實(shí)時(shí)更新:
列出更改(List changes):當(dāng)可用資源列表發(fā)生變化時(shí),服務(wù)器可以通過 notifications/resources/list_changed 通知客戶端
內(nèi)容變更(Content changes):用戶可以訂閱特定資源的更新
客戶端發(fā)送 resources/subscribe 資源 URI
notifications/resources/updated 資源發(fā)生變化時(shí)服務(wù)器發(fā)送
客戶端可以使用 resources/read
客戶端可以取消訂閱 resources/unsubscribe
最佳實(shí)踐
使用清晰且具有描述性的資源名稱和 URI,提供有助于 LLM 理解的資源描述,并為已知資源設(shè)置合適的 MIME 類型。動(dòng)態(tài)內(nèi)容可以通過資源模板實(shí)現(xiàn),而對(duì)于頻繁變化的資源,建議使用訂閱機(jī)制。此外,應(yīng)優(yōu)雅地處理錯(cuò)誤,提供明確的錯(cuò)誤信息,對(duì)于大規(guī)模資源列表可以使用分頁(yè),并在適當(dāng)情況下對(duì)資源內(nèi)容進(jìn)行緩存。URI 在處理前需要驗(yàn)證,同時(shí)記錄任何自定義的 URI 方案以便后續(xù)參考。
在暴露資源時(shí),安全性至關(guān)重要。必須驗(yàn)證所有資源 URI,實(shí)施適當(dāng)?shù)脑L問控制,并清理文件路徑以防止目錄遍歷攻擊。對(duì)二進(jìn)制數(shù)據(jù)的處理需特別謹(jǐn)慎,可以考慮為資源讀取操作設(shè)置速率限制并對(duì)資源訪問進(jìn)行審計(jì)。傳輸中的敏感數(shù)據(jù)應(yīng)加密,MIME 類型需要驗(yàn)證,同時(shí)為長(zhǎng)時(shí)間運(yùn)行的讀取操作設(shè)置超時(shí)機(jī)制。最后,資源的清理操作也應(yīng)妥善處理,確保系統(tǒng)穩(wěn)定性和安全性。
代碼實(shí)現(xiàn)
以下是在 MCP 服務(wù)器中實(shí)現(xiàn)資源支持的簡(jiǎn)單示例:
const server = new Server({ name: "example-server", version: "1.0.0" }, { capabilities: { resources: {} } }); // List available resources server.setRequestHandler(ListResourcesRequestSchema, async () => { return { resources: [ { uri: "file:///logs/app.log", name: "Application Logs", mimeType: "text/plain" } ] }; }); // Read resource contents server.setRequestHandler(ReadResourceRequestSchema, async (request) => { const uri = request.params.uri; if (uri === "file:///logs/app.log") { const logContents = await readLogFile(); return { contents: [ { uri, mimeType: "text/plain", text: logContents } ] }; } throw new Error("Resource not found"); });
概念:Prompts
Prompts 允許服務(wù)器定義可重用的 prompt 模板和工作流,方便客戶端呈現(xiàn)給用戶和 LLM。這是一種強(qiáng)大的方法,可以標(biāo)準(zhǔn)化并共享常見的 LLM 交互。Prompts 設(shè)計(jì)為由用戶控制,這意味著它們從服務(wù)器暴露給客戶端,供用戶顯式選擇使用。
MCP 中的 Prompts 是預(yù)定義的模板,具備以下功能:
接受動(dòng)態(tài)參數(shù)
包含來(lái)自資源的上下文
鏈接多個(gè)交互
引導(dǎo)特定工作流
以用戶界面(UI)元素形式呈現(xiàn)(如斜杠命令)
Prompt 結(jié)構(gòu)定義
{ name: string; // Unique identifier for the prompt description?: string; // Human-readable description arguments?: [ // Optional list of arguments { name: string; // Argument identifier description?: string; // Argument description required?: boolean; // Whether argument is required } ] }
發(fā)現(xiàn) Prompts
客戶端可以通過 prompts/list 端點(diǎn)發(fā)現(xiàn)可用的 prompt:
// Request(請(qǐng)求) { method: "prompts/list" } // Response(響應(yīng)) { prompts: [ { name: "analyze-code", description: "Analyze code for potential improvements", arguments: [ { name: "language", description: "Programming language", required: true } ] } ] }
使用 Prompts
要使用 prompts,客戶端需要發(fā)出 prompts/get 請(qǐng)求:
// Request(請(qǐng)求) { method: "prompts/get", params: { name: "analyze-code", arguments: { language: "python" } } } // Response(響應(yīng)) { description: "Analyze Python code for potential improvements", messages: [ { role: "user", content: { type: "text", text: "Please analyze the following Python code for potential improvements: ```python def calculate_sum(numbers): total = 0 for num in numbers: total = total + num return total result = calculate_sum([1, 2, 3, 4, 5]) print(result) ```" } } ] }
動(dòng)態(tài) Prompts
Prompts 可以是動(dòng)態(tài)的,主要有兩種:
嵌入資源上下文(Embedded resource context)
{ "name": "analyze-project", "description": "Analyze project logs and code", "arguments": [ { "name": "timeframe", "description": "Time period to analyze logs", "required": true }, { "name": "fileUri", "description": "URI of code file to review", "required": true } ] }
多步驟工作流程(Multi-step workflows)
const debugWorkflow = { name: "debug-error", async getMessages(error: string) { return [ { role: "user", content: { type: "text", text: `Here's an error I'm seeing: ${error}` } }, { role: "assistant", content: { type: "text", text: "I'll help analyze this error. What have you tried so far?" } }, { role: "user", content: { type: "text", text: "I've tried restarting the service, but the error persists." } } ]; } };
最佳實(shí)踐
在實(shí)現(xiàn) prompts 功能時(shí),應(yīng)使用清晰且具有描述性的 prompt 名稱,為 prompt 及其參數(shù)提供詳細(xì)說(shuō)明,并驗(yàn)證所有必需參數(shù)的完整性。同時(shí),應(yīng)優(yōu)雅地處理缺失參數(shù)的情況,并考慮為 prompt 模板實(shí)現(xiàn)版本控制。在適當(dāng)情況下,可以緩存動(dòng)態(tài)內(nèi)容,記錄參數(shù)的預(yù)期格式,并考慮 prompt 的可組合性。此外,需實(shí)現(xiàn)錯(cuò)誤處理機(jī)制,并使用多種輸入場(chǎng)景對(duì) prompt 進(jìn)行充分測(cè)試。
prompt 可通過多種方式集成到客戶端用戶界面,包括斜杠命令、快捷操作、上下文菜單項(xiàng)、命令面板入口、引導(dǎo)式工作流和交互式表單。對(duì)于 prompt 的更新和變更,服務(wù)器可以通過 prompts.listChanged 能力通知客戶端,通過 notifications/prompts/list_changed 類型發(fā)送通知,客戶端則需重新獲取 prompt 列表。
在安全性方面,需驗(yàn)證所有參數(shù)的合法性并清理用戶輸入以防止惡意內(nèi)容,同時(shí)考慮對(duì) prompt 調(diào)用進(jìn)行速率限制,實(shí)施訪問控制并審計(jì) prompt 使用情況。對(duì)于敏感數(shù)據(jù),應(yīng)適當(dāng)加密和保護(hù),驗(yàn)證生成內(nèi)容的安全性,并為 prompt 處理設(shè)置超時(shí)機(jī)制。此外,需注意 prompt 注入攻擊的風(fēng)險(xiǎn),并記錄和公開安全需求文檔以保障 prompt 的可靠性和安全性。
代碼示例
以下是在 MCP 服務(wù)器中實(shí)現(xiàn) prompts 的完整示例:
import { Server } from "@modelcontextprotocol/sdk/server"; import { ListPromptsRequestSchema, GetPromptRequestSchema } from "@modelcontextprotocol/sdk/types"; const PROMPTS = { "git-commit": { name: "git-commit", description: "Generate a Git commit message", arguments: [ { name: "changes", description: "Git diff or description of changes", required: true } ] }, "explain-code": { name: "explain-code", description: "Explain how code works", arguments: [ { name: "code", description: "Code to explain", required: true }, { name: "language", description: "Programming language", required: false } ] } }; const server = new Server({ name: "example-prompts-server", version: "1.0.0" }, { capabilities: { prompts: {} } }); // List available prompts server.setRequestHandler(ListPromptsRequestSchema, async () => { return { prompts: Object.values(PROMPTS) }; }); // Get specific prompt server.setRequestHandler(GetPromptRequestSchema, async (request) => { const prompt = PROMPTS[request.params.name]; if (!prompt) { throw new Error(`Prompt not found: ${request.params.name}`); } if (request.params.name === "git-commit") { return { messages: [ { role: "user", content: { type: "text", text: `Generate a concise but descriptive commit message for these changes: ${request.params.arguments?.changes}` } } ] }; } if (request.params.name === "explain-code") { const language = request.params.arguments?.language || "Unknown"; return { messages: [ { role: "user", content: { type: "text", text: `Explain how this ${language} code works: ${request.params.arguments?.code}` } } ] }; } throw new Error("Prompt implementation not found"); });
概念:工具(Tools)
工具是模型上下文協(xié)議(MCP)中的一項(xiàng)強(qiáng)大功能,允許服務(wù)器向客戶端暴露可執(zhí)行的功能。通過工具,LLM 可以與外部系統(tǒng)交互、執(zhí)行計(jì)算并在現(xiàn)實(shí)世界中采取行動(dòng)。
工具設(shè)計(jì)為由模型控制,這意味著工具從服務(wù)器暴露給客戶端,供 AI 模型自動(dòng)調(diào)用(通常需要人類介入進(jìn)行授權(quán))。MCP 中的工具允許服務(wù)器暴露可被客戶端調(diào)用的可執(zhí)行功能,這些功能可供 LLM 用于執(zhí)行動(dòng)作。工具的關(guān)鍵特性包括:
發(fā)現(xiàn)(Discovery):客戶端可以通過 tools/list 接口列出可用工具。
調(diào)用(Invocation):工具通過 tools/call 接口被調(diào)用,服務(wù)器執(zhí)行請(qǐng)求的操作并返回結(jié)果。
靈活性(Flexibility):工具的功能范圍可以從簡(jiǎn)單的計(jì)算擴(kuò)展到復(fù)雜的 API 交互。
與資源類似,工具通過唯一的名稱標(biāo)識(shí),并可以包含描述以指導(dǎo)其使用。然而,與資源不同的是,工具代表動(dòng)態(tài)操作,可以修改狀態(tài)或與外部系統(tǒng)交互。
工具結(jié)構(gòu)定義
{ name: string; // Unique identifier for the tool description?: string; // Human-readable description inputSchema: { // JSON Schema for the tool's parameters type: "object", properties: { ... } // Tool-specific parameters } }
工具模式
以下是服務(wù)器可以提供的一些工具類型的示例。
系統(tǒng)操作(System operations):與本地系統(tǒng)交互的工具
{ name: "execute_command", description: "Run a shell command", inputSchema: { type: "object", properties: { command: { type: "string" }, args: { type: "array", items: { type: "string" } } } } }
API 集成(API integrations):包裝外部 API 的工具
{ name: "github_create_issue", description: "Create a GitHub issue", inputSchema: { type: "object", properties: { title: { type: "string" }, body: { type: "string" }, labels: { type: "array", items: { type: "string" } } } } }
數(shù)據(jù)處理(Data processing):轉(zhuǎn)換或分析數(shù)據(jù)的工具
{ name: "analyze_csv", description: "Analyze a CSV file", inputSchema: { type: "object", properties: { filepath: { type: "string" }, operations: { type: "array", items: { enum: ["sum", "average", "count"] } } } } }
代碼示例
以下是在 MCP 服務(wù)器中實(shí)現(xiàn)基本工具的示例:
const server = new Server({ name: "example-server", version: "1.0.0" }, { capabilities: { tools: {} } }); // Define available tools server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: [{ name: "calculate_sum", description: "Add two numbers together", inputSchema: { type: "object", properties: { a: { type: "number" }, b: { type: "number" } }, required: ["a", "b"] } }] }; }); // Handle tool execution server.setRequestHandler(CallToolRequestSchema, async (request) => { if (request.params.name === "calculate_sum") { const { a, b } = request.params.arguments; return { toolResult: a + b }; } throw new Error("Tool not found"); });
概念:采樣(Sampling)
采樣是 MCP 的一項(xiàng)強(qiáng)大功能,允許服務(wù)器通過客戶端請(qǐng)求 LLM 完成,從而實(shí)現(xiàn)復(fù)雜的代理行為,同時(shí)保持安全性和隱私性。目前 Claude 桌面客戶端尚未支持此功能。
采樣流程包括以下步驟:
服務(wù)器向客戶端發(fā)送 sampling/createMessage 請(qǐng)求
客戶端審查請(qǐng)求內(nèi)容,并可以對(duì)其進(jìn)行修改
客戶端向 LLM 請(qǐng)求補(bǔ)全內(nèi)容
客戶端對(duì)生成的補(bǔ)全內(nèi)容進(jìn)行審查
客戶端將結(jié)果返回給服務(wù)器
這種“人類參與”的設(shè)計(jì)確保用戶對(duì) LLM 可訪問的數(shù)據(jù)和生成的內(nèi)容保持控制權(quán)。
消息格式定義
采樣請(qǐng)求使用標(biāo)準(zhǔn)化的消息格式:
{ messages: [ { role: "user" | "assistant", content: { type: "text" | "image", // For text: text?: string, // For images: data?: string, // base64 encoded mimeType?: string } } ], modelPreferences?: { hints?: [{ name?: string // Suggested model name/family }], costPriority?: number, // 0-1, importance of minimizing cost speedPriority?: number, // 0-1, importance of low latency intelligencePriority?: number // 0-1, importance of capabilities }, systemPrompt?: string, includeContext?: "none" | "thisServer" | "allServers", temperature?: number, maxTokens: number, stopSequences?: string[], metadata?: Record}
請(qǐng)求參數(shù)
消息(Messages)
messages 數(shù)組包含需要發(fā)送給 LLM 的對(duì)話歷史。每條消息包括:
role:消息角色,值可以是 "user"(用戶)或 "assistant"(助手)
content:消息內(nèi)容,可以是:
文本內(nèi)容:包含 text 字段
圖像內(nèi)容:包含 data(Base64 編碼)和 mimeType 字段
模型偏好(Model preferences)
modelPreferences 對(duì)象允許服務(wù)器指定模型選擇偏好:
hints:模型名稱建議的數(shù)組,客戶端可以使用這些建議選擇合適的模型:
name:字符串,可匹配完整或部分模型名稱(如 "claude-3" 或 "sonnet")
客戶端可能會(huì)將提示映射到不同提供商的等效模型
多個(gè)提示按照優(yōu)先順序進(jìn)行評(píng)估
優(yōu)先級(jí)(0-1 范圍內(nèi)歸一化):
costPriority:最小化成本的優(yōu)先級(jí)權(quán)重
speedPriority:低延遲響應(yīng)的優(yōu)先級(jí)權(quán)重
intelligencePriority:高模型能力的優(yōu)先級(jí)權(quán)重
客戶端根據(jù)這些偏好和可用模型最終決定模型選擇。
系統(tǒng)提示(System prompt)
systemPrompt 是一個(gè)可選字段,允許服務(wù)器請(qǐng)求特定的系統(tǒng)提示??蛻舳丝梢孕薷幕蚝雎源俗侄?。
上下文包含(Context inclusion)
includeContext 參數(shù)指定 MCP 上下文的包含范圍:
none:不包含額外上下文
thisServer:僅包含來(lái)自請(qǐng)求服務(wù)器的上下文
allServers:包含所有連接的 MCP 服務(wù)器的上下文
客戶端最終決定實(shí)際包含的上下文內(nèi)容。
采樣參數(shù)(Sampling parameters)
可以使用以下參數(shù)微調(diào) LLM 的采樣行為:
temperature:控制生成的隨機(jī)性(范圍:0.0 到 1.0)
maxTokens:生成的最大標(biāo)記數(shù)
stopSequences:停止生成的序列數(shù)組
metadata:附加提供商特定參數(shù)
響應(yīng)格式
客戶端返回完成結(jié)果結(jié)構(gòu)體定義:
{ model: string, // Name of the model used stopReason?: "endTurn" | "stopSequence" | "maxTokens" | string, role: "user" | "assistant", content: { type: "text" | "image", text?: string, data?: string, mimeType?: string } }
以下是向客戶請(qǐng)求采樣的示例:
{ "method": "sampling/createMessage", "params": { "messages": [ { "role": "user", "content": { "type": "text", "text": "What files are in the current directory?" } } ], "systemPrompt": "You are a helpful file system assistant.", "includeContext": "thisServer", "maxTokens": 100 } }
最佳實(shí)踐
在實(shí)現(xiàn)采樣功能時(shí),應(yīng)提供清晰且結(jié)構(gòu)良好的提示,恰當(dāng)?shù)靥幚砦谋竞蛨D像內(nèi)容,并設(shè)置合理的標(biāo)記數(shù)限制(token limits)。通過 includeContext 參數(shù)包含相關(guān)上下文,并在使用響應(yīng)前進(jìn)行驗(yàn)證,同時(shí)優(yōu)雅地處理錯(cuò)誤。此外,應(yīng)考慮對(duì)采樣請(qǐng)求實(shí)施速率限制,記錄預(yù)期的采樣行為,使用多種模型參數(shù)進(jìn)行測(cè)試,并監(jiān)控采樣成本。
采樣功能設(shè)計(jì)考慮了人類監(jiān)督。對(duì)于提示,客戶端應(yīng)向用戶展示擬定的提示內(nèi)容,用戶可以修改或拒絕提示,系統(tǒng)提示則可以被過濾或修改,上下文包含由客戶端控制。對(duì)于生成結(jié)果,客戶端應(yīng)向用戶展示結(jié)果,用戶可以修改或拒絕生成結(jié)果,客戶端也可以過濾或修改結(jié)果,并由用戶決定使用的模型。
在安全性方面,需要驗(yàn)證消息內(nèi)容的合法性,清理敏感信息,并實(shí)施速率限制和數(shù)據(jù)傳輸加密。同時(shí),妥善處理用戶數(shù)據(jù)隱私,審計(jì)采樣請(qǐng)求,控制成本暴露風(fēng)險(xiǎn),設(shè)置超時(shí)機(jī)制,并優(yōu)雅地處理模型錯(cuò)誤。
采樣支持多種代理式工作流模式,例如讀取和分析資源、基于上下文決策、生成結(jié)構(gòu)化數(shù)據(jù)、處理多步驟任務(wù)以及提供交互式協(xié)助。上下文管理應(yīng)請(qǐng)求最小必要的上下文,清晰組織其結(jié)構(gòu),處理大小限制,根據(jù)需要更新上下文并清理過期內(nèi)容??煽康腻e(cuò)誤處理需要捕獲采樣失敗、處理超時(shí)錯(cuò)誤、管理速率限制、驗(yàn)證響應(yīng)內(nèi)容、提供備用行為并記錄錯(cuò)誤日志。
需要注意的是,采樣功能存在一些限制,例如依賴客戶端能力、用戶控制行為、上下文大小限制、速率限制和成本控制。此外,模型的可用性和響應(yīng)時(shí)間可能會(huì)有所不同,并非所有內(nèi)容類型都被支持。
概念:傳輸(Transports)
傳輸是模型上下文協(xié)議(MCP)的核心組件之一,為客戶端和服務(wù)器之間的通信提供基礎(chǔ)。傳輸機(jī)制負(fù)責(zé)處理消息的發(fā)送和接收的底層邏輯。
MCP 使用 JSON-RPC 2.0 作為傳輸格式。傳輸層負(fù)責(zé)將 MCP 協(xié)議消息轉(zhuǎn)換為 JSON-RPC 格式進(jìn)行傳輸,并將接收到的 JSON-RPC 消息還原為 MCP 協(xié)議消息。
JSON-RPC 使用三種類型的消息:
請(qǐng)求消息(Requests)
{ jsonrpc: "2.0", id: number | string, method: string, params?: object }
響應(yīng)消息(Responses)
{ jsonrpc: "2.0", id: number | string, result?: object, error?: { code: number, message: string, data?: unknown } }
通知消息(Notifications)
{ jsonrpc: "2.0", method: string, params?: object }
內(nèi)置傳輸類型
MCP 包括以下兩種標(biāo)準(zhǔn)傳輸實(shí)現(xiàn):
標(biāo)準(zhǔn)輸入/輸出(Input/Output,stdio)
stdio 傳輸通過標(biāo)準(zhǔn)輸入和輸出流實(shí)現(xiàn)通信,特別適合本地集成和命令行工具。適用場(chǎng)景:
構(gòu)建命令行工具
實(shí)現(xiàn)本地集成
需要簡(jiǎn)單的進(jìn)程間通信
與 Shell 腳本協(xié)作
const server = new Server({ name: "example-server", version: "1.0.0" }, { capabilities: {} }); const transport = new StdioServerTransport(); await server.connect(transport);
服務(wù)器發(fā)送事件(SSE:Server-Sent Events)
SSE 傳輸通過 HTTP POST 實(shí)現(xiàn)客戶端到服務(wù)器的通信,同時(shí)支持服務(wù)器到客戶端的流式傳輸。適用場(chǎng)景:
僅需要服務(wù)器到客戶端的流式傳輸
在受限網(wǎng)絡(luò)環(huán)境中工作
實(shí)現(xiàn)簡(jiǎn)單的更新機(jī)制
const server = new Server({ name: "example-server", version: "1.0.0" }, { capabilities: {} }); const transport = new SSEServerTransport("/message", response); await server.connect(transport);
自定義傳輸(Custom Transports)
MCP 支持輕松實(shí)現(xiàn)自定義傳輸,以滿足特定需求。任何傳輸實(shí)現(xiàn)只需符合 Transport 接口即可。你可以為以下場(chǎng)景實(shí)現(xiàn)自定義傳輸:
自定義網(wǎng)絡(luò)協(xié)議
專用通信通道
與現(xiàn)有系統(tǒng)集成
性能優(yōu)化
interface Transport { // Start processing messages start(): Promise; // Send a JSON-RPC message send(message: JSONRPCMessage): Promise ; // Close the connection close(): Promise ; // Callbacks onclose?: () => void; onerror?: (error: Error) => void; onmessage?: (message: JSONRPCMessage) => void; }
錯(cuò)誤處理(Error Handling)
傳輸實(shí)現(xiàn)需要處理各種錯(cuò)誤場(chǎng)景,包括:
連接錯(cuò)誤(Connection errors)
消息解析錯(cuò)誤(Message parsing errors)
協(xié)議錯(cuò)誤(Protocol errors)
網(wǎng)絡(luò)超時(shí)(Network timeouts)
資源清理(Resource cleanup)
通過設(shè)計(jì)健壯的錯(cuò)誤處理機(jī)制,可以確保傳輸?shù)姆€(wěn)定性和可靠性。參考示例:
class ExampleTransport implements Transport { async start() { try { // Connection logic } catch (error) { this.onerror?.(new Error(`Failed to connect: ${error}`)); throw error; } } async send(message: JSONRPCMessage) { try { // Sending logic } catch (error) { this.onerror?.(new Error(`Failed to send message: ${error}`)); throw error; } } }
最佳實(shí)踐
在實(shí)現(xiàn)或使用 MCP 傳輸機(jī)制時(shí),需要正確管理連接生命周期,確保在連接關(guān)閉時(shí)清理資源,并使用合適的超時(shí)時(shí)間。同時(shí),應(yīng)實(shí)現(xiàn)適當(dāng)?shù)腻e(cuò)誤處理機(jī)制,在發(fā)送前驗(yàn)證消息內(nèi)容,并記錄傳輸事件以便調(diào)試。在適當(dāng)情況下,添加重連邏輯,處理消息隊(duì)列中的回壓?jiǎn)栴},并持續(xù)監(jiān)控連接的健康狀態(tài)。此外,還需要實(shí)施必要的安全措施以保證傳輸?shù)目煽啃浴?/p>
在安全方面,需要重點(diǎn)關(guān)注身份驗(yàn)證與授權(quán),包括實(shí)現(xiàn)可靠的身份驗(yàn)證機(jī)制、驗(yàn)證客戶端憑證、使用安全的令牌處理方法以及執(zhí)行授權(quán)檢查。在數(shù)據(jù)安全層面,應(yīng)使用 TLS 加密網(wǎng)絡(luò)傳輸,保護(hù)敏感數(shù)據(jù),驗(yàn)證消息完整性,限制消息大小,并清理輸入數(shù)據(jù)以防止惡意內(nèi)容。在網(wǎng)絡(luò)安全層面,需實(shí)施速率限制、設(shè)置合適的超時(shí)時(shí)間、處理拒絕服務(wù)(DoS)攻擊場(chǎng)景、監(jiān)控異常通信模式,并制定合適的防火墻規(guī)則。
為有效調(diào)試傳輸問題,可啟用調(diào)試日志記錄、監(jiān)控消息流量、檢查連接狀態(tài)并驗(yàn)證消息格式,同時(shí)測(cè)試各種錯(cuò)誤場(chǎng)景。使用網(wǎng)絡(luò)分析工具和錯(cuò)誤跟蹤工具有助于發(fā)現(xiàn)問題。此外,可以通過健康檢查和資源使用監(jiān)控,驗(yàn)證系統(tǒng)在邊緣情況和高負(fù)載條件下的穩(wěn)定性,從而確保傳輸機(jī)制的健壯性和安全性。
LSP 簡(jiǎn)介
因 LSP 一定程度上影響了 MCP 的設(shè)計(jì)理念,所以感覺有必要介紹一下 LSP(非編程人士大概率都沒聽說(shuō)過)。
概述
語(yǔ)言服務(wù)器協(xié)議(LSP[13]:Language Server Protocol)是一種開放的、基于 JSON-RPC 的通信協(xié)議,用于在編輯器或集成開發(fā)環(huán)境(IDE)與語(yǔ)言服務(wù)器之間進(jìn)行交互。它提供了編程語(yǔ)言的核心功能,如自動(dòng)補(bǔ)全、跳轉(zhuǎn)到定義、查找所有引用、懸停文檔提示等。這一協(xié)議通過標(biāo)準(zhǔn)化通信方式,使語(yǔ)言服務(wù)器和開發(fā)工具之間的協(xié)作更加高效。
背景 & 目標(biāo)
為特定編程語(yǔ)言提供功能(如自動(dòng)補(bǔ)全、跳轉(zhuǎn)到定義、查找引用)需要耗費(fèi)大量資源,尤其是傳統(tǒng)方式需要針對(duì)每種開發(fā)工具分別開發(fā)插件。這導(dǎo)致重復(fù)勞動(dòng)并增加了開發(fā)成本。LSP 的目標(biāo)是通過標(biāo)準(zhǔn)化協(xié)議,解決這一復(fù)雜性問題。具體來(lái)說(shuō):
減少重復(fù)工作:語(yǔ)言社區(qū)只需開發(fā)一個(gè)高性能的語(yǔ)言服務(wù)器,而工具社區(qū)可以構(gòu)建一個(gè)支持 LSP 的通用擴(kuò)展模塊。
實(shí)現(xiàn)互操作性:一個(gè)語(yǔ)言服務(wù)器可以被多個(gè)支持 LSP 的工具使用,而工具也可以支持多種語(yǔ)言。
降低開發(fā)成本:開發(fā)者可以專注于語(yǔ)言或工具本身,而無(wú)需為每個(gè)工具或語(yǔ)言重復(fù)適配工作。
語(yǔ)言服務(wù)器 & 客戶端
語(yǔ)言服務(wù)器(Language Server):提供編程語(yǔ)言的語(yǔ)義分析能力,例如代碼補(bǔ)全、跳轉(zhuǎn)到定義等。
客戶端(Client,編輯器或 IDE):與語(yǔ)言服務(wù)器通信,展示語(yǔ)言功能并為開發(fā)者提供界面交互。
通過 LSP,客戶端和語(yǔ)言服務(wù)器之間的交互基于 JSON-RPC 格式的消息。
核心功能
自動(dòng)補(bǔ)全(Auto Complete):提供基于上下文的代碼建議。
跳轉(zhuǎn)到定義(Go to Definition):快速跳轉(zhuǎn)到變量、函數(shù)或類的定義位置。
查找所有引用(Find All References):搜索代碼中變量或函數(shù)的所有使用位置。
懸停提示(Hover Documentation):在光標(biāo)懸停時(shí)顯示相關(guān)的文檔或注釋。
代碼重構(gòu)(Code Refactoring):支持重命名、提取函數(shù)等代碼優(yōu)化操作。
協(xié)議基礎(chǔ):JSON-RPC
LSP 的基礎(chǔ)是 JSON-RPC 協(xié)議,這種協(xié)議定義了請(qǐng)求和響應(yīng)的結(jié)構(gòu)。在一次典型交互中,客戶端會(huì)發(fā)送請(qǐng)求給語(yǔ)言服務(wù)器,例如請(qǐng)求代碼補(bǔ)全建議,而語(yǔ)言服務(wù)器則根據(jù)請(qǐng)求返回執(zhí)行結(jié)果或錯(cuò)誤信息。這種基于輕量級(jí) JSON 數(shù)據(jù)格式的通信方式,不僅使協(xié)議實(shí)現(xiàn)簡(jiǎn)單高效,還能適配多種開發(fā)環(huán)境。
無(wú)狀態(tài):每個(gè)請(qǐng)求都是獨(dú)立的,不依賴于先前的交互。
輕量級(jí):協(xié)議簡(jiǎn)單,使用 JSON 格式,易于解析和實(shí)現(xiàn)。
傳輸靈活:可以通過 HTTP、WebSocket 或其他傳輸協(xié)議實(shí)現(xiàn)。
雙向通信:支持服務(wù)器向客戶端發(fā)送通知(沒有響應(yīng)的請(qǐng)求)。
請(qǐng)求 & 響應(yīng)
請(qǐng)求格式:
jsonrpc:協(xié)議版本號(hào)(目前固定為 2.0)。
method:要調(diào)用的方法名稱。
params:調(diào)用方法所需的參數(shù)(可以是數(shù)組或?qū)ο螅?/p>
id:唯一標(biāo)識(shí)請(qǐng)求的 ID,用于匹配響應(yīng)。
響應(yīng)格式:
jsonrpc:協(xié)議版本號(hào)。
result:請(qǐng)求成功時(shí)返回的結(jié)果。
error:請(qǐng)求失敗時(shí)返回的錯(cuò)誤對(duì)象,包含錯(cuò)誤碼和錯(cuò)誤信息。
id:對(duì)應(yīng)請(qǐng)求的 ID,用于區(qū)分多個(gè)響應(yīng)。
代碼示例
以下是一個(gè)使用 JSON-RPC 進(jìn)行交互的完整示例:
客戶端發(fā)送請(qǐng)求
{ "jsonrpc": "2.0", "method": "add", "params": [5, 3], "id": 1 }
服務(wù)器成功響應(yīng)
{ "jsonrpc": "2.0", "result": 8, "id": 1 }
服務(wù)器錯(cuò)誤響應(yīng):如果請(qǐng)求的方法不存在或參數(shù)錯(cuò)誤,返回以下結(jié)構(gòu)
{ "jsonrpc": "2.0", "error": { "code": -32601, "message": "Method not found" }, "id": 1 }
LSIF
LSIF(語(yǔ)言服務(wù)器索引格式)是 LSP 的補(bǔ)充協(xié)議(發(fā)音類似 “else if”),用于以圖結(jié)構(gòu)存儲(chǔ)編程工件信息。它的目標(biāo)是支持在開發(fā)工具或 Web 界面中進(jìn)行離線代碼導(dǎo)航,無(wú)需本地源代碼(了解更多區(qū)別 LSP vs LSIF[14])。
LSP 的優(yōu)勢(shì)
統(tǒng)一的語(yǔ)言支持:一個(gè)語(yǔ)言服務(wù)器可以被多種編輯器復(fù)用。
高效的開發(fā)協(xié)作:語(yǔ)言社區(qū)專注于語(yǔ)言服務(wù)器開發(fā),工具社區(qū)專注于客戶端擴(kuò)展開發(fā)。
擴(kuò)展性強(qiáng):易于支持新語(yǔ)言和新工具,降低成本。
例如 CSS LSP 服務(wù)器支持 Atom 和 Eclipse 中的 CSS 自動(dòng)補(bǔ)全。Python、Java 等語(yǔ)言都實(shí)現(xiàn)了各自的語(yǔ)言服務(wù)器,且已被廣泛應(yīng)用于主流開發(fā)工具中。
當(dāng)前規(guī)范與實(shí)現(xiàn)
最新 LSP 規(guī)范為 3.17 版本。
LSIF 的規(guī)范正在逐步完善。
已有許多編程語(yǔ)言(如 Python、Java、JavaScript 等)實(shí)現(xiàn)了 LSP,并被集成到多個(gè)編輯器(如 VSCode、Sublime Text、Eclipse 等)。
微軟在核心 LSP 倉(cāng)庫(kù)中維護(hù)了一份語(yǔ)言服務(wù)器實(shí)現(xiàn)列表,同時(shí)社區(qū)站點(diǎn)(如 langserver.org[15])提供了關(guān)于各語(yǔ)言服務(wù)器和客戶端功能的更多信息。
總結(jié)
語(yǔ)言服務(wù)器協(xié)議(LSP)通過標(biāo)準(zhǔn)化語(yǔ)言服務(wù)器與開發(fā)工具的通信方式,極大地提升了開發(fā)效率和工具生態(tài)的擴(kuò)展性。它是語(yǔ)言社區(qū)和工具社區(qū)之間的橋梁,使開發(fā)者能夠以更低成本享受高級(jí)編程功能。LSP 的出現(xiàn)標(biāo)志著現(xiàn)代開發(fā)工具在互操作性和用戶體驗(yàn)上的一次重要飛躍。而 MCP 的出現(xiàn),就是要做 LLM 界的 LSP 標(biāo)準(zhǔn)(野心挺大的)。
-
協(xié)議
+關(guān)注
關(guān)注
2文章
604瀏覽量
39280 -
LSP
+關(guān)注
關(guān)注
0文章
13瀏覽量
9808 -
MCP
+關(guān)注
關(guān)注
0文章
254瀏覽量
13930
原文標(biāo)題:深度解析:Anthropic MCP 協(xié)議
文章出處:【微信號(hào):OSC開源社區(qū),微信公眾號(hào):OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論