在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文解析Anthropic MCP協(xié)議

OSC開源社區(qū) ? 來源:OSC開源社區(qū) ? 2024-12-04 11:09 ? 次閱讀

正如 LSP 成為了 IDE 的通用標(biāo)準(zhǔn)一樣,Anthropic 正在將 MCP 打造成 LLM 集成的開放標(biāo)準(zhǔn)。

前段時(shí)間 OpenAI 發(fā)布了一個實(shí)時(shí)訪問第三方應(yīng)用的功能來為 ChatGPT 提供上下文(ChatGPT 升級為實(shí)時(shí)協(xié)作助手),沒想到 Claude 這么快就帶來了一個 LLM 協(xié)議標(biāo)準(zhǔn),直接將 AI 能力拉滿(現(xiàn)在下結(jié)論為時(shí)尚早)。不過當(dāng)我看完整個協(xié)議以及簡單上手體驗(yàn)后,我想說:“真牛逼,它以一種非入侵方式最大限度獲取到系統(tǒng)權(quán)限來拓展 AI 的能力邊界”!

模型上下文協(xié)議(MCP)是 Anthropic 推出的開放標(biāo)準(zhǔn),旨在通過統(tǒng)一的客戶端-服務(wù)器架構(gòu)解決 LLM 應(yīng)用與數(shù)據(jù)源連接的難題。它支持通過同一協(xié)議訪問本地資源(如數(shù)據(jù)庫、文件)和遠(yuǎn)程資源(如 Slack、GitHub API),無需定制集成。MCP 不僅共享數(shù)據(jù),還可公開工具和交互模板,且內(nèi)置安全性,確保資源由服務(wù)器完全掌控。目前 MCP 支持本地運(yùn)行,未來將引入企業(yè)級認(rèn)證的遠(yuǎn)程支持,實(shí)現(xiàn)團(tuán)隊(duì)間的安全共享。通過 Claude 桌面應(yīng)用,開發(fā)者可在短時(shí)間內(nèi)集成 MCP,快速連接多種數(shù)據(jù)源,推動 AI 集成的標(biāo)準(zhǔn)化發(fā)展。

MCP 簡介

近日,Model Context Protocol[1](MCP,模型上下文協(xié)議)正式開源。作為一項(xiàng)連接 AI 助手與數(shù)據(jù)系統(tǒng)的新標(biāo)準(zhǔn),MCP 的誕生旨在解決當(dāng)前 AI 模型因數(shù)據(jù)孤島限制而無法充分發(fā)揮潛力的難題。這項(xiàng)由 Claude 推動的技術(shù)創(chuàng)新為開發(fā)者提供了一個開放的、統(tǒng)一的解決方案,使 AI 系統(tǒng)能夠與多種內(nèi)容存儲庫、業(yè)務(wù)工具和開發(fā)環(huán)境高效對接,顯著提升模型的響應(yīng)質(zhì)量與相關(guān)性。

背景

解決碎片化問題,為 AI 打開數(shù)據(jù)大門。

當(dāng)前,AI 助手已成為主流工具,模型能力的進(jìn)步使推理和質(zhì)量得以迅速提升。然而,數(shù)據(jù)訪問的瓶頸依然存在。每個數(shù)據(jù)源需要獨(dú)立的定制集成,這種碎片化的方式不僅效率低下,還限制了 AI 的可擴(kuò)展性。

MCP 的出現(xiàn)就是為了改變現(xiàn)狀。它作為一個通用的開放協(xié)議,為數(shù)據(jù)源與 AI 系統(tǒng)之間的連接提供了統(tǒng)一標(biāo)準(zhǔn),替代復(fù)雜的多源整合方式。這種設(shè)計(jì)極大簡化了數(shù)據(jù)接入過程,降低開發(fā)者的工作量,同時(shí)讓 AI 系統(tǒng)能夠更加全面和準(zhǔn)確地訪問數(shù)據(jù),推動系統(tǒng)從孤立走向協(xié)同。

MCP 核心

MCP 的架構(gòu)清晰且開放,開發(fā)者可以通過 MCP 服務(wù)器對外提供數(shù)據(jù),或構(gòu)建 MCP 客戶端,將 AI 應(yīng)用與這些服務(wù)器連接。為推動開發(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ù)代碼庫:包含 Google Drive、Slack、GitHub 等流行系統(tǒng)的預(yù)構(gòu)建實(shí)現(xiàn),便于直接部署和測試。訪問鏈接 https://github.com/modelcontextprotocol/servers

此外,Claude 3.5 Sonnet 模型還支持快速開發(fā) MCP 服務(wù)器,使個人和企業(yè)能夠以最低的門檻實(shí)現(xiàn)與重要數(shù)據(jù)集的對接。

行業(yè)動態(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ā)工具平臺。這些公司通過 MCP 增強(qiáng) AI 對上下文的理解能力,使 AI 能夠在編碼任務(wù)中高效檢索相關(guān)信息,生成更準(zhǔn)確、更具功能性的代碼。

1edb1c8a-ac99-11ef-93f3-92fbcf53809c.png

Block 的首席技術(shù)官 Dhanji R. Prasanna 表示:“在 Block,開源不僅僅是一種開發(fā)模式,它是我們工作的基石,更是一種承諾——致力于創(chuàng)造能夠推動深遠(yuǎn)變革、造福公眾的技術(shù)。像 Model Context Protocol 這樣的開源技術(shù),是將 AI 與現(xiàn)實(shí)應(yīng)用連接起來的橋梁,確保創(chuàng)新以開放、透明和協(xié)作為核心。我們非常高興能參與這一協(xié)議的開發(fā),并借助它構(gòu)建自主化系統(tǒng),讓人們擺脫機(jī)械性任務(wù)的束縛,專注于更具創(chuàng)造性的工作。”

通過 MCP,開發(fā)者不再需要為每個數(shù)據(jù)源維護(hù)獨(dú)立的連接器,而是可以基于標(biāo)準(zhǔn)協(xié)議構(gòu)建一套通用的解決方案。隨著生態(tài)系統(tǒng)的不斷完善,AI 系統(tǒng)將能夠在不同工具和數(shù)據(jù)集之間保持上下文一致性,為企業(yè)和開發(fā)者帶來更具前景的技術(shù)架構(gòu)。

未來展望

Claude 團(tuán)隊(duì)表示,他們致力于將 MCP 打造成一個協(xié)作性的開源生態(tài)系統(tǒng),鼓勵開發(fā)者、企業(yè)以及早期技術(shù)探索者共同參與,推動具有上下文感知能力的 AI 工具走向更廣闊的未來。

開發(fā)者目前可以通過 Claude 桌面應(yīng)用快速部署 MCP 服務(wù),也可以根據(jù)官方提供的快速入門指南構(gòu)建自己的 MCP 解決方案。同時(shí),開源社區(qū)已開放了連接器和實(shí)現(xiàn)的代碼庫,支持開發(fā)者貢獻(xiàn)自己的擴(kuò)展功能。

隨著 MCP 的普及,AI 系統(tǒng)將更好地突破數(shù)據(jù)隔離的限制,真正實(shí)現(xiàn)與現(xiàn)實(shí)環(huán)境的無縫對接。對于技術(shù)領(lǐng)域而言,這無疑是一次重要的里程碑,也為 AI 生態(tài)的可持續(xù)發(fā)展帶來了全新可能。

lencx 演示

我自己根據(jù)文檔幾分鐘就跑通了本地?cái)?shù)據(jù)庫連接,在開始前需要做一些額外準(zhǔn)備:

打開桌面應(yīng)用的開發(fā)者模式,方便進(jìn)行日志調(diào)試(菜單 Help → Enable Developer Mode -> 點(diǎn)擊彈窗 Enable 按鈕)。

1efb70d4-ac99-11ef-93f3-92fbcf53809c.png

啟用開發(fā)者模式后,會在菜單中多一個 Developer 菜單項(xiàng),點(diǎn)擊 Open MCP Log File 可以打開日志文件,查看到操作日志,方便排查問題。

1f24b5f2-ac99-11ef-93f3-92fbcf53809c.png

前置條件

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ù)庫

通過 MCP 將 Claude 桌面應(yīng)用連接到該數(shù)據(jù)庫

安全地查詢和分析數(shù)據(jù)

1f40c2b0-ac99-11ef-93f3-92fbcf53809c.png

Step 1:創(chuàng)建測試數(shù)據(jù)庫

macOS 請執(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) 按鈕)。

1f525674-ac99-11ef-93f3-92fbcf53809c.png

用自己喜歡的編輯器將以下內(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)用:

有一個名為 “sqlite” 的 MCP 服務(wù)器

通過運(yùn)行 uvx mcp-server-sqlite 命令來啟動它

將其連接到你的測試數(shù)據(jù)庫(即本地創(chuàng)建的 test.db 文件)

保存文件后,重新啟動 Claude 桌面應(yīng)用

Step 3:測試一下

將以下 Prompt 發(fā)送給 Claude,來驗(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ù)庫,使用格式化方式呈現(xiàn)出結(jié)果。

1f7b746e-ac99-11ef-93f3-92fbcf53809c.png

你還可以測試這些 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í),會經(jīng)過以下步驟:

服務(wù)器發(fā)現(xiàn):Claude 桌面應(yīng)用在啟動時(shí)會連接到你配置的 MCP 服務(wù)器。

協(xié)議握手:當(dāng)你詢問數(shù)據(jù)時(shí),Claude 桌面應(yīng)用會:

確定哪個 MCP 服務(wù)器可以提供幫助(例如,本例中的 SQLite 服務(wù)器)。

通過協(xié)議協(xié)商服務(wù)器的功能和權(quán)限。

向 MCP 服務(wù)器請求數(shù)據(jù)或執(zhí)行操作。

交互流程

Claude 桌面應(yīng)用通過 MCP 服務(wù)器與本地資源交互。

所有操作均嚴(yán)格限制在服務(wù)器允許的范圍內(nèi)。

1fb1d07c-ac99-11ef-93f3-92fbcf53809c.png

在安全性方面:

受控能力:MCP 服務(wù)器僅暴露特定且受控的功能。

本地運(yùn)行:MCP 服務(wù)器運(yùn)行在本地計(jì)算機(jī)上,訪問的資源不會暴露在互聯(lián)網(wǎng)中。

用戶確認(rèn):對于敏感操作,Claude 桌面應(yīng)用需要用戶確認(rèn)后才能執(zhí)行。

這一設(shè)計(jì)確保了在使用 Claude 分析或交互本地?cái)?shù)據(jù)時(shí),用戶始終保持對數(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àn)證配置。最后完全退出并重啟 Claude 桌面應(yīng)用以確保更改生效。

1fd79208-ac99-11ef-93f3-92fbcf53809c.png

如果遇到 MCP 或數(shù)據(jù)庫錯誤,可以檢查 Claude 桌面應(yīng)用的日志,運(yùn)行命令 tail -n 20 -f ~/Library/Logs/Claude/mcp*.log 查看最近的日志信息。也可以測試數(shù)據(jù)庫連接,例如運(yùn)行 sqlite3 ~/test.db ".tables" 確認(rèn)數(shù)據(jù)庫是否正常工作。常見的修復(fù)方法包括檢查配置文件中的文件路徑、驗(yàn)證數(shù)據(jù)庫文件的權(quán)限,以及確保 SQLite 已正確安裝。通過這些步驟,可以有效解決大部分問題。

MCP 協(xié)議詳解

官方文檔內(nèi)容很長,為了方便大家對 MCP 有一個全面了解,我對文檔做了簡單梳理。需要注意:目前文檔主要適配macOS,其他系統(tǒng)指南將在晚些時(shí)候給出。

快速開始

目前 MCP 有三種方式可以幫助你快速開始,Python 或 TypeScript 選一個自己比較熟悉的構(gòu)建服務(wù)即可。

快速入門(MCP Quickstart[8]):不到 5 分鐘即可開始使用 MCP,可在 Claude 桌面應(yīng)用和本地服務(wù)之間建立安全連接(以上的 “l(fā)encx 演示” 就是基于該部分文檔實(shí)現(xiàn))。

構(gòu)建第一個 Python 服務(wù) (MCP Python[9]):15 分鐘內(nèi)用 Python 創(chuàng)建一個簡單的 MCP 服務(wù)器。

構(gòu)建第一個 TypeScript 服務(wù)(MCP TypeScript[10]):15 分鐘內(nèi)用 TypeScript 創(chuàng)建一個簡單的 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ù)器測試

Claude 桌面開發(fā)工具(Claude Desktop Developer Tools)

集成測試

日志收集

Chrome DevTools 集成

服務(wù)器日志(Server Logging)

自定義日志記錄實(shí)現(xiàn)

錯誤追蹤

性能監(jiān)控

概念:核心架構(gòu)(Core architecture)

2001f836-ac99-11ef-93f3-92fbcf53809c.png

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):輕量級程序,每個程序都通過標(biāo)準(zhǔn)化模型上下文協(xié)議公開特定功能。為客戶端提供上下文、工具和 prompt 信息。

本地資源(Local Resources):你的計(jì)算機(jī)資源中可供 MCP 服務(wù)器安全訪問的資源(數(shù)據(jù)庫、文件、服務(wù))。

遠(yuǎn)程資源(Remote Resources):MCP 服務(wù)器可以連接到的互聯(lián)網(wǎng)資源(例如通過 API)。

202b6f18-ac99-11ef-93f3-92fbcf53809c.png

核心組件

協(xié)議層(Protocol layer)

協(xié)議層負(fù)責(zé)消息的封裝、請求/響應(yīng)的關(guān)聯(lián),以及高層通信模式的管理。主要類包括:ProtocolClientServer 等。以 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 定義了以下主要消息類型:

請求(Request):需要另一方提供響應(yīng)

interface Request {
  method: string;
  params?: { ... };
}

通知(Notification):單向消息,不需要響應(yīng)

interface Notification {
  method: string;
  params?: { ... };
}

結(jié)果(Result):成功響應(yīng)請求的消息

interface Result {
  [key: string]: unknown;
}

錯誤(Error):表示請求失敗的消息

interface Error {
  code: number;
  message: string;
  data?: unknown;
}

Connection 生命周期

初始化(Initialization)

203f401a-ac99-11ef-93f3-92fbcf53809c.png

客戶端發(fā)送 initialize 請求,包含協(xié)議版本和能力信息

服務(wù)器響應(yīng)其協(xié)議版本和能力信息

客戶端發(fā)送 initialized 通知以確認(rèn)

正常消息交換開始

消息交換(Message exchange)

初始化后,支持以下通信模式:

請求-響應(yīng)模式(Request-Response):客戶端或服務(wù)器發(fā)送請求,另一方響應(yīng)

通知模式(Notifications):任一方發(fā)送單向消息

終止連接(Termination)

任一方可以終止連接:

通過 close() 進(jìn)行正常關(guān)閉

通過傳輸層斷開連接

因錯誤條件導(dǎo)致中斷

錯誤處理(Error handling)

錯誤通過以下方式傳播:

請求的錯誤響應(yīng)

傳輸中的錯誤事件

協(xié)議級錯誤處理程序

enum ErrorCode {
  // Standard JSON-RPC error codes
  ParseError = -32700,
  InvalidRequest = -32600,
  MethodNotFound = -32601,
  InvalidParams = -32602,
  InternalError = -32603
}

SDK 和應(yīng)用程序可以自定義 -32000 以上的錯誤碼。

代碼示例

以下是實(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 模型自身的判斷自動選擇資源。

所以資源代表 MCP 服務(wù)器希望向客戶端提供的任何類型的數(shù)據(jù),包括:

文件內(nèi)容(File contents)

數(shù)據(jù)庫記錄(Database records)

API 響應(yīng)(API responses)

實(shí)時(shí)系統(tǒng)數(shù)據(jù)(Live system data)

屏幕截圖和圖像(Screenshots and images)

日志文件(Log files)

...

每個資源通過唯一的 URI 標(biāo)識,可以包含文本或二進(jìn)制數(shù)據(jù)。

資源 URI

資源通過以下格式的 URI 進(jìn)行標(biāo)識([協(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):對于動態(tài)資源,服務(wù)器可以公開 URI 模板[12],客戶端可以使用它來構(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ā)出請求。服務(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 類型。動態(tài)內(nèi)容可以通過資源模板實(shí)現(xiàn),而對于頻繁變化的資源,建議使用訂閱機(jī)制。此外,應(yīng)優(yōu)雅地處理錯誤,提供明確的錯誤信息,對于大規(guī)模資源列表可以使用分頁,并在適當(dāng)情況下對資源內(nèi)容進(jìn)行緩存。URI 在處理前需要驗(yàn)證,同時(shí)記錄任何自定義的 URI 方案以便后續(xù)參考。

在暴露資源時(shí),安全性至關(guān)重要。必須驗(yàn)證所有資源 URI,實(shí)施適當(dāng)?shù)脑L問控制,并清理文件路徑以防止目錄遍歷攻擊。對二進(jìn)制數(shù)據(jù)的處理需特別謹(jǐn)慎,可以考慮為資源讀取操作設(shè)置速率限制并對資源訪問進(jìn)行審計(jì)。傳輸中的敏感數(shù)據(jù)應(yīng)加密,MIME 類型需要驗(yàn)證,同時(shí)為長時(shí)間運(yùn)行的讀取操作設(shè)置超時(shí)機(jī)制。最后,資源的清理操作也應(yīng)妥善處理,確保系統(tǒng)穩(wěn)定性和安全性。

代碼實(shí)現(xiàn)

以下是在 MCP 服務(wù)器中實(shí)現(xià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ù)定義的模板,具備以下功能:

接受動態(tài)參數(shù)

包含來自資源的上下文

鏈接多個交互

引導(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(請求)
{
  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 請求:

// Request(請求)
{
  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)
```"
      }
    }
  ]
}

動態(tài) Prompts

Prompts 可以是動態(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ì)說明,并驗(yàn)證所有必需參數(shù)的完整性。同時(shí),應(yīng)優(yōu)雅地處理缺失參數(shù)的情況,并考慮為 prompt 模板實(shí)現(xiàn)版本控制。在適當(dāng)情況下,可以緩存動態(tài)內(nèi)容,記錄參數(shù)的預(yù)期格式,并考慮 prompt 的可組合性。此外,需實(shí)現(xiàn)錯誤處理機(jī)制,并使用多種輸入場景對 prompt 進(jìn)行充分測試。

prompt 可通過多種方式集成到客戶端用戶界面,包括斜杠命令、快捷操作、上下文菜單項(xiàng)、命令面板入口、引導(dǎo)式工作流和交互式表單。對于 prompt 的更新和變更,服務(wù)器可以通過 prompts.listChanged 能力通知客戶端,通過 notifications/prompts/list_changed 類型發(fā)送通知,客戶端則需重新獲取 prompt 列表。

在安全性方面,需驗(yàn)證所有參數(shù)的合法性并清理用戶輸入以防止惡意內(nèi)容,同時(shí)考慮對 prompt 調(diào)用進(jìn)行速率限制,實(shí)施訪問控制并審計(jì) prompt 使用情況。對于敏感數(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í)世界中采取行動。

工具設(shè)計(jì)為由模型控制,這意味著工具從服務(wù)器暴露給客戶端,供 AI 模型自動調(diào)用(通常需要人類介入進(jìn)行授權(quán))。MCP 中的工具允許服務(wù)器暴露可被客戶端調(diào)用的可執(zhí)行功能,這些功能可供 LLM 用于執(zhí)行動作。工具的關(guān)鍵特性包括:

發(fā)現(xiàn)(Discovery):客戶端可以通過 tools/list 接口列出可用工具。

調(diào)用(Invocation):工具通過 tools/call 接口被調(diào)用,服務(wù)器執(zhí)行請求的操作并返回結(jié)果。

靈活性(Flexibility):工具的功能范圍可以從簡單的計(jì)算擴(kuò)展到復(fù)雜的 API 交互。

與資源類似,工具通過唯一的名稱標(biāo)識,并可以包含描述以指導(dǎo)其使用。然而,與資源不同的是,工具代表動態(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ù)器通過客戶端請求 LLM 完成,從而實(shí)現(xiàn)復(fù)雜的代理行為,同時(shí)保持安全性和隱私性。目前 Claude 桌面客戶端尚未支持此功能。

采樣流程包括以下步驟:

服務(wù)器向客戶端發(fā)送 sampling/createMessage 請求

客戶端審查請求內(nèi)容,并可以對其進(jìn)行修改

客戶端向 LLM 請求補(bǔ)全內(nèi)容

客戶端對生成的補(bǔ)全內(nèi)容進(jìn)行審查

客戶端將結(jié)果返回給服務(wù)器

這種“人類參與”的設(shè)計(jì)確保用戶對 LLM 可訪問的數(shù)據(jù)和生成的內(nèi)容保持控制權(quán)。

消息格式定義

采樣請求使用標(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
}

請求參數(shù)

消息(Messages)

messages 數(shù)組包含需要發(fā)送給 LLM 的對話歷史。每條消息包括:

role:消息角色,值可以是 "user"(用戶)或 "assistant"(助手)

content:消息內(nèi)容,可以是:

文本內(nèi)容:包含 text 字段

圖像內(nèi)容:包含 data(Base64 編碼)和 mimeType 字段

模型偏好(Model preferences)

modelPreferences 對象允許服務(wù)器指定模型選擇偏好:

hints:模型名稱建議的數(shù)組,客戶端可以使用這些建議選擇合適的模型:

name:字符串,可匹配完整或部分模型名稱(如 "claude-3" 或 "sonnet")

客戶端可能會將提示映射到不同提供商的等效模型

多個提示按照優(yōu)先順序進(jìn)行評估

優(yōu)先級(0-1 范圍內(nèi)歸一化):

costPriority:最小化成本的優(yōu)先級權(quán)重

speedPriority:低延遲響應(yīng)的優(yōu)先級權(quán)重

intelligencePriority:高模型能力的優(yōu)先級權(quán)重

客戶端根據(jù)這些偏好和可用模型最終決定模型選擇。

系統(tǒng)提示(System prompt)

systemPrompt 是一個可選字段,允許服務(wù)器請求特定的系統(tǒng)提示。客戶端可以修改或忽略此字段。

上下文包含(Context inclusion)

includeContext 參數(shù)指定 MCP 上下文的包含范圍:

none:不包含額外上下文

thisServer:僅包含來自請求服務(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
  }
}

以下是向客戶請求采樣的示例:

{
  "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)雅地處理錯誤。此外,應(yīng)考慮對采樣請求實(shí)施速率限制,記錄預(yù)期的采樣行為,使用多種模型參數(shù)進(jìn)行測試,并監(jiān)控采樣成本。

采樣功能設(shè)計(jì)考慮了人類監(jiān)督。對于提示,客戶端應(yīng)向用戶展示擬定的提示內(nèi)容,用戶可以修改或拒絕提示,系統(tǒng)提示則可以被過濾或修改,上下文包含由客戶端控制。對于生成結(jié)果,客戶端應(yīng)向用戶展示結(jié)果,用戶可以修改或拒絕生成結(jié)果,客戶端也可以過濾或修改結(jié)果,并由用戶決定使用的模型。

在安全性方面,需要驗(yàn)證消息內(nèi)容的合法性,清理敏感信息,并實(shí)施速率限制和數(shù)據(jù)傳輸加密。同時(shí),妥善處理用戶數(shù)據(jù)隱私,審計(jì)采樣請求,控制成本暴露風(fēng)險(xiǎn),設(shè)置超時(shí)機(jī)制,并優(yōu)雅地處理模型錯誤。

采樣支持多種代理式工作流模式,例如讀取和分析資源、基于上下文決策、生成結(jié)構(gòu)化數(shù)據(jù)、處理多步驟任務(wù)以及提供交互式協(xié)助。上下文管理應(yīng)請求最小必要的上下文,清晰組織其結(jié)構(gòu),處理大小限制,根據(jù)需要更新上下文并清理過期內(nèi)容。可靠的錯誤處理需要捕獲采樣失敗、處理超時(shí)錯誤、管理速率限制、驗(yàn)證響應(yīng)內(nèi)容、提供備用行為并記錄錯誤日志。

需要注意的是,采樣功能存在一些限制,例如依賴客戶端能力、用戶控制行為、上下文大小限制、速率限制和成本控制。此外,模型的可用性和響應(yīng)時(shí)間可能會有所不同,并非所有內(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 使用三種類型的消息:

請求消息(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)通信,特別適合本地集成和命令行工具。適用場景:

構(gòu)建命令行工具

實(shí)現(xià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ù)器到客戶端的流式傳輸。適用場景:

僅需要服務(wù)器到客戶端的流式傳輸

在受限網(wǎng)絡(luò)環(huán)境中工作

實(shí)現(xià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 接口即可。你可以為以下場景實(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;
}

錯誤處理(Error Handling)

傳輸實(shí)現(xiàn)需要處理各種錯誤場景,包括:

連接錯誤(Connection errors)

消息解析錯誤(Message parsing errors)

協(xié)議錯誤(Protocol errors)

網(wǎng)絡(luò)超時(shí)(Network timeouts)

資源清理(Resource cleanup)

通過設(shè)計(jì)健壯的錯誤處理機(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誤處理機(jī)制,在發(fā)送前驗(yàn)證消息內(nèi)容,并記錄傳輸事件以便調(diào)試。在適當(dāng)情況下,添加重連邏輯,處理消息隊(duì)列中的回壓問題,并持續(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)攻擊場景、監(jiān)控異常通信模式,并制定合適的防火墻規(guī)則。

為有效調(diào)試傳輸問題,可啟用調(diào)試日志記錄、監(jiān)控消息流量、檢查連接狀態(tài)并驗(yàn)證消息格式,同時(shí)測試各種錯誤場景。使用網(wǎng)絡(luò)分析工具和錯誤跟蹤工具有助于發(fā)現(xiàn)問題。此外,可以通過健康檢查和資源使用監(jiān)控,驗(yàn)證系統(tǒng)在邊緣情況和高負(fù)載條件下的穩(wěn)定性,從而確保傳輸機(jī)制的健壯性和安全性。

LSP 簡介

因 LSP 一定程度上影響了 MCP 的設(shè)計(jì)理念,所以感覺有必要介紹一下 LSP(非編程人士大概率都沒聽說過)。

概述

語言服務(wù)器協(xié)議(LSP[13]:Language Server Protocol)是一種開放的、基于 JSON-RPC 的通信協(xié)議,用于在編輯器或集成開發(fā)環(huán)境(IDE)與語言服務(wù)器之間進(jìn)行交互。它提供了編程語言的核心功能,如自動補(bǔ)全、跳轉(zhuǎn)到定義、查找所有引用、懸停文檔提示等。這一協(xié)議通過標(biāo)準(zhǔn)化通信方式,使語言服務(wù)器和開發(fā)工具之間的協(xié)作更加高效。

20581892-ac99-11ef-93f3-92fbcf53809c.png

背景 & 目標(biāo)

為特定編程語言提供功能(如自動補(bǔ)全、跳轉(zhuǎn)到定義、查找引用)需要耗費(fèi)大量資源,尤其是傳統(tǒng)方式需要針對每種開發(fā)工具分別開發(fā)插件。這導(dǎo)致重復(fù)勞動并增加了開發(fā)成本。LSP 的目標(biāo)是通過標(biāo)準(zhǔn)化協(xié)議,解決這一復(fù)雜性問題。具體來說:

減少重復(fù)工作:語言社區(qū)只需開發(fā)一個高性能的語言服務(wù)器,而工具社區(qū)可以構(gòu)建一個支持 LSP 的通用擴(kuò)展模塊。

實(shí)現(xiàn)互操作性:一個語言服務(wù)器可以被多個支持 LSP 的工具使用,而工具也可以支持多種語言。

降低開發(fā)成本:開發(fā)者可以專注于語言或工具本身,而無需為每個工具或語言重復(fù)適配工作。

語言服務(wù)器 & 客戶端

語言服務(wù)器(Language Server):提供編程語言的語義分析能力,例如代碼補(bǔ)全、跳轉(zhuǎn)到定義等。

客戶端(Client,編輯器或 IDE):與語言服務(wù)器通信,展示語言功能并為開發(fā)者提供界面交互。

通過 LSP,客戶端和語言服務(wù)器之間的交互基于 JSON-RPC 格式的消息。

核心功能

自動補(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é)議定義了請求和響應(yīng)的結(jié)構(gòu)。在一次典型交互中,客戶端會發(fā)送請求給語言服務(wù)器,例如請求代碼補(bǔ)全建議,而語言服務(wù)器則根據(jù)請求返回執(zhí)行結(jié)果或錯誤信息。這種基于輕量級 JSON 數(shù)據(jù)格式的通信方式,不僅使協(xié)議實(shí)現(xiàn)簡單高效,還能適配多種開發(fā)環(huán)境。

無狀態(tài):每個請求都是獨(dú)立的,不依賴于先前的交互。

輕量級:協(xié)議簡單,使用 JSON 格式,易于解析和實(shí)現(xiàn)。

傳輸靈活:可以通過 HTTP、WebSocket 或其他傳輸協(xié)議實(shí)現(xiàn)。

雙向通信:支持服務(wù)器向客戶端發(fā)送通知(沒有響應(yīng)的請求)。

請求 & 響應(yīng)

請求格式

jsonrpc:協(xié)議版本號(目前固定為 2.0)。

method:要調(diào)用的方法名稱。

params:調(diào)用方法所需的參數(shù)(可以是數(shù)組或?qū)ο螅?/p>

id:唯一標(biāo)識請求的 ID,用于匹配響應(yīng)。

響應(yīng)格式

jsonrpc:協(xié)議版本號。

result:請求成功時(shí)返回的結(jié)果。

error:請求失敗時(shí)返回的錯誤對象,包含錯誤碼和錯誤信息。

id:對應(yīng)請求的 ID,用于區(qū)分多個響應(yīng)。

代碼示例

以下是一個使用 JSON-RPC 進(jìn)行交互的完整示例:

客戶端發(fā)送請求

{
  "jsonrpc": "2.0",
  "method": "add",
  "params": [5, 3],
  "id": 1
}

服務(wù)器成功響應(yīng)

{
  "jsonrpc": "2.0",
  "result": 8,
  "id": 1
}

服務(wù)器錯誤響應(yīng):如果請求的方法不存在或參數(shù)錯誤,返回以下結(jié)構(gòu)

{
  "jsonrpc": "2.0",
  "error": {
    "code": -32601,
    "message": "Method not found"
  },
  "id": 1
}

LSIF

LSIF(語言服務(wù)器索引格式)是 LSP 的補(bǔ)充協(xié)議(發(fā)音類似 “else if”),用于以圖結(jié)構(gòu)存儲編程工件信息。它的目標(biāo)是支持在開發(fā)工具或 Web 界面中進(jìn)行離線代碼導(dǎo)航,無需本地源代碼(了解更多區(qū)別 LSP vs LSIF[14])。

LSP 的優(yōu)勢

統(tǒng)一的語言支持:一個語言服務(wù)器可以被多種編輯器復(fù)用。

高效的開發(fā)協(xié)作:語言社區(qū)專注于語言服務(wù)器開發(fā),工具社區(qū)專注于客戶端擴(kuò)展開發(fā)。

擴(kuò)展性強(qiáng):易于支持新語言和新工具,降低成本。

例如 CSS LSP 服務(wù)器支持 Atom 和 Eclipse 中的 CSS 自動補(bǔ)全。Python、Java 等語言都實(shí)現(xiàn)了各自的語言服務(wù)器,且已被廣泛應(yīng)用于主流開發(fā)工具中。

當(dāng)前規(guī)范與實(shí)現(xiàn)

最新 LSP 規(guī)范為 3.17 版本。

LSIF 的規(guī)范正在逐步完善。

已有許多編程語言(如 Python、Java、JavaScript 等)實(shí)現(xiàn)了 LSP,并被集成到多個編輯器(如 VSCode、Sublime Text、Eclipse 等)。

微軟在核心 LSP 倉庫中維護(hù)了一份語言服務(wù)器實(shí)現(xiàn)列表,同時(shí)社區(qū)站點(diǎn)(如 langserver.org[15])提供了關(guān)于各語言服務(wù)器和客戶端功能的更多信息。

總結(jié)

語言服務(wù)器協(xié)議(LSP)通過標(biāo)準(zhǔn)化語言服務(wù)器與開發(fā)工具的通信方式,極大地提升了開發(fā)效率和工具生態(tài)的擴(kuò)展性。它是語言社區(qū)和工具社區(qū)之間的橋梁,使開發(fā)者能夠以更低成本享受高級編程功能。LSP 的出現(xiàn)標(biāo)志著現(xiàn)代開發(fā)工具在互操作性和用戶體驗(yàn)上的一次重要飛躍。而 MCP 的出現(xiàn),就是要做 LLM 界的 LSP 標(biāo)準(zhǔn)(野心挺大的)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 協(xié)議
    +關(guān)注

    關(guān)注

    2

    文章

    606

    瀏覽量

    39343
  • LSP
    LSP
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    9822
  • MCP
    MCP
    +關(guān)注

    關(guān)注

    0

    文章

    254

    瀏覽量

    13982

原文標(biāo)題:深度解析:Anthropic MCP 協(xié)議

文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    谷歌擬向Anthropic投資10億美元

    近日,據(jù)外媒最新報(bào)道,谷歌正計(jì)劃向人工智能(AI)領(lǐng)域的初創(chuàng)公司Anthropic進(jìn)行新輪投資,投資金額預(yù)計(jì)超過10億美元。此舉將使谷歌成為Anthropic的重要股東,并加強(qiáng)雙方在AI基礎(chǔ)模型
    的頭像 發(fā)表于 01-23 14:38 ?310次閱讀

    谷歌再投10億美元于人工智能公司Anthropic

    位知情人士透露,此次投資是谷歌對Anthropic持續(xù)看好的體現(xiàn)。在此之前,谷歌已經(jīng)向Anthropic投入了超過20億美元的資金。此次追加投資,無疑將進(jìn)步鞏固谷歌在人工智能領(lǐng)域的布局和影響力。 除了資金支持外,谷歌還與
    的頭像 發(fā)表于 01-23 10:57 ?346次閱讀

    亞馬遜追加40億美元投資,深化與Anthropic戰(zhàn)略合作

    近日,亞馬遜宣布與人工智能公司Anthropic進(jìn)步深化戰(zhàn)略合作,以推動雙方在人工智能領(lǐng)域的共同發(fā)展。 作為合作的重要環(huán),Anthropic選擇了亞馬遜云科技作為其模型訓(xùn)練的首要合
    的頭像 發(fā)表于 11-26 11:13 ?439次閱讀

    亞馬遜或追加投資Anthropic

    據(jù)最新報(bào)道,亞馬遜正考慮對生成式AI初創(chuàng)公司Anthropic進(jìn)行額外投資。此前,亞馬遜已經(jīng)向Anthropic投資了40億美元,顯示出其對這家AI公司的濃厚興趣。
    的頭像 發(fā)表于 11-12 15:39 ?353次閱讀

    微軟GitHub與Anthropic和谷歌合作

    近日,微軟旗下的GitHub宣布了項(xiàng)重要合作,將Anthropic和谷歌的AI模型整合到其代碼助理中,為數(shù)百萬軟件開發(fā)者提供新的AI模型選項(xiàng)。
    的頭像 發(fā)表于 10-30 16:25 ?228次閱讀

    Anthropic擬進(jìn)行新輪融資

    人工智能領(lǐng)域再掀波瀾,初創(chuàng)公司Anthropic正緊鑼密鼓地籌備新輪融資,市場預(yù)計(jì)其估值將躍升至400億美元大關(guān)。此次融資吸引了包括谷歌、亞馬遜等科技巨頭的青睞,彰顯了Anthropic在AI賽道上的強(qiáng)勁競爭力和市場潛力。目前
    的頭像 發(fā)表于 09-24 15:19 ?395次閱讀

    OpenAI與Anthropic新模型將受美政府評估

    近日,美國政府宣布了項(xiàng)重要合作,旨在加強(qiáng)人工智能安全監(jiān)管。根據(jù)協(xié)議,OpenAI與Anthropic兩大AI領(lǐng)軍企業(yè)同意,在推出新的AI模型之前,先將其提交給美國人工智能安全問題研究所進(jìn)行評估。這
    的頭像 發(fā)表于 08-30 15:35 ?382次閱讀

    plc協(xié)議解析網(wǎng)關(guān)是什么

    PLC協(xié)議解析網(wǎng)關(guān)是種專門用于工業(yè)自動化領(lǐng)域的設(shè)備,它的主要功能是實(shí)現(xiàn)不同通信協(xié)議之間的轉(zhuǎn)換和解析,以便于不同類型的PLC、傳感器、執(zhí)行器
    的頭像 發(fā)表于 07-12 15:41 ?398次閱讀
    plc<b class='flag-5'>協(xié)議</b><b class='flag-5'>解析</b>網(wǎng)關(guān)是什么

    Anthropic發(fā)布Claude 3.5 Sonnet,AI領(lǐng)域再掀波瀾

    近日,人工智能領(lǐng)域的競爭格局再次發(fā)生重要變化。OpenAI的強(qiáng)勁競爭對手Anthropic公司發(fā)布了其迄今為止最強(qiáng)大的AI模型——Claude 3.5 Sonnet。這創(chuàng)新成果不僅展示了Anthropic在AI技術(shù)領(lǐng)域的深厚實(shí)
    的頭像 發(fā)表于 06-24 15:14 ?716次閱讀

    Anthropic加速AI擴(kuò)張,任命資深財(cái)務(wù)官

    人工智能初創(chuàng)公司Anthropic宣布,已聘請愛彼迎資深員工Krishna Rao出任首任財(cái)務(wù)官。Rao將助力Anthropic制定財(cái)務(wù)戰(zhàn)略和運(yùn)營計(jì)劃,以推動公司業(yè)務(wù)的增長。
    的頭像 發(fā)表于 05-23 09:24 ?460次閱讀

    Anthropic在歐洲推出Claude聊天機(jī)器人

    AI初創(chuàng)公司Anthropic在歐洲市場邁出了重要步伐,成功推出了Claude聊天機(jī)器人及其相應(yīng)的訂閱計(jì)劃。此舉旨在進(jìn)步增加用戶數(shù)量和提升公司收入。Anthropic公司表示,其基礎(chǔ)軟件產(chǎn)品已經(jīng)在歐洲的金融、酒店等行業(yè)吸引了眾
    的頭像 發(fā)表于 05-15 09:36 ?384次閱讀

    Anthropic推出Claude iOS版App

    人工智能領(lǐng)域的創(chuàng)新不斷,Anthropic公司近日宣布推出Claude的iOS移動應(yīng)用,這是其大模型產(chǎn)品的首次移動端亮相。該應(yīng)用的推出,為用戶提供了在移動設(shè)備上體驗(yàn)先進(jìn)AI技術(shù)的機(jī)會。
    的頭像 發(fā)表于 05-08 10:32 ?480次閱讀

    Anthropic推出iPhone應(yīng)用程序和業(yè)務(wù)層

    Anthropic 推出 iPhone 應(yīng)用程序和業(yè)務(wù)層,支持使用Claude 3 Opus、Sonnet 和 Haiku 模型
    的頭像 發(fā)表于 05-07 10:22 ?496次閱讀

    亞馬遜加碼投資Anthropic,AI競賽再掀波瀾

    亞馬遜正在掀起其30年歷史中最大規(guī)模的外部投資風(fēng)暴,以在人工智能領(lǐng)域的競賽中搶占先機(jī)。據(jù)最新消息,這家科技巨頭已決定再向初創(chuàng)公司Anthropic投入27.5億美元。Anthropic作為生成人工智能領(lǐng)域的領(lǐng)跑者,其大型模型Claude與OpenAI的ChatGPT形成激
    的頭像 發(fā)表于 03-28 14:16 ?543次閱讀

    亞馬遜云科技與Anthropic合作,Amazon Bedrock再添Claude 3模型

    亞馬遜云科技近日宣布,與專注于AI安全和研究的公司Anthropic達(dá)成合作,Anthropic的領(lǐng)先AI模型Claude 3系列將基于亞馬遜云科技的Amazon Bedrock平臺提供服務(wù)。這
    的頭像 發(fā)表于 03-06 09:52 ?699次閱讀
    主站蜘蛛池模板: 黄的三级在线播放 | 欧美日韩一级视频 | 亚洲婷婷在线视频 | 在线天堂中文官网 | 美女黄18以下禁止观看的网站 | 一级视频在线 | 一级片免费在线播放 | 日韩精品一卡二卡三卡四卡2021 | 一级特黄特色的免费大片视频 | 亚洲第一视频在线 | 日本一卡二卡3卡四卡网站精品 | 欧洲不卡一卡2卡三卡4卡网站 | 狠狠干免费视频 | 一区二区三区国模大胆 | 婷婷月 | 天天爱天天爽 | 天天插天天射 | 色综合久久98天天综合 | 天堂在线视频网站 | 最近国语剧情视频在线观看 | 91啪在线视频 | 91网站在线播放 | 天堂在线观看中文字幕 | 精品成人在线观看 | 国产精品美女久久久 | 日日干日日爽 | 亚洲影视自拍揄拍愉拍 | 婷婷影院在线综合免费视频 | www操| 日韩精品免费一区二区三区 | 天天天天天操 | 老师下面好湿好紧好滑好想要 | 欧美色图综合 | 性欧美zoz0另类xxxx | 一级欧美在线的视频 | 欧美精品综合一区二区三区 | www.欧美色图 | 一区二区三区四区在线免费观看 | 在线观看免费av网站 | 亚洲人成网站色在线观看 | 91美女啪啪 |