架構概述
這個 Model Context Protocol (MCP) 概述討論了其範圍和核心概念,並提供一個展示每個核心概念的範例。
由於 MCP SDK 抽象化了許多關注點,大多數開發者可能會發現資料層協定章節最為有用。它討論了 MCP 伺服器如何為 AI 應用程式提供內容。
有關具體的實作細節,請參閱你的特定語言 SDK 文件。
範圍
Model Context Protocol 包含以下專案:
- MCP 規範:MCP 的規範 ,概述了客戶端和伺服器的實作要求。
- MCP SDK:實作 MCP 的不同程式語言 SDK。
- MCP 開發工具:開發 MCP 伺服器和客戶端的工具,包括 MCP Inspector
- MCP 參考伺服器實作:MCP 伺服器的參考實作。
⚠️ 注意:MCP 專注於內容交換的協定——它不規定 AI 應用程式如何使用 LLM 或管理提供的內容。
MCP 的概念
參與者
MCP 遵循客戶端 - 伺服器架構,其中 MCP 主機——像 Claude Code 或 Claude Desktop 這樣的 AI 應用程式——建立與一個或多個 MCP 伺服器的連線。MCP 主機通過為每個 MCP 伺服器建立一個 MCP 客戶端來達成這一點。每個 MCP 客戶端與其對應的 MCP 伺服器維持專用的一對一連線。
MCP 架構中的關鍵參與者有:
- MCP 主機:協調和管理一個或多個 MCP 客戶端的 AI 應用程式
- MCP 客戶端:維持與 MCP 伺服器連線並從 MCP 伺服器取得內容供 MCP 主機使用的元件
- MCP 伺服器:向 MCP 客戶端提供內容的程式
例如:Visual Studio Code 充當 MCP 主機。當 Visual Studio Code 建立與 MCP 伺服器(如 Sentry MCP server)的連線時,Visual Studio Code 執行階段會實例化一個 MCP 客戶端物件來維持與 Sentry MCP 伺服器的連線。 當 Visual Studio Code 隨後連線到另一個 MCP 伺服器(如 本地檔案系統伺服器)時,Visual Studio Code 執行階段會實例化額外的 MCP 客戶端物件來維持這個連線,因此維持 MCP 客戶端與 MCP 伺服器的一對一關係。
請注意,MCP 伺服器指的是提供內容資料的程式,無論它在哪裡執行。MCP 伺服器可以在本地或遠端執行。例如,當 Claude Desktop 啟動 檔案系統伺服器 時,伺服器在同一台機器上本地執行,因為它使用 STDIO 傳輸。這通常被稱為「本地」MCP 伺服器。官方的 Sentry MCP server 在 Sentry 平台上執行,並使用 Streamable HTTP 傳輸。這通常被稱為「遠端」MCP 伺服器。
層級
MCP 由兩個層級組成:
- 資料層:定義基於 JSON-RPC 的客戶端 - 伺服器通訊協定,包括生命週期管理、核心原語,如工具、資源、提示和通知。
- 傳輸層:定義通訊機制和通道,實現客戶端和伺服器之間的 資料交換,包括特定傳輸的連線建立、訊息框架和授權。
概念上,資料層是內層,而傳輸層是外層。
資料層
資料層實作基於 JSON-RPC 2.0 的交換協定,定義訊息結構和語義。 這個層級包括:
- 生命週期管理:處理客戶端和伺服器之間的連線初始化、能力協商和連線終止
- 伺服器特性:使伺服器能夠提供核心功能,包括 AI 動作的工具、內容資料的資源,以及從客戶端互動範本的提示
- 客戶端特性:使伺服器能夠要求客戶端從主機 LLM 採樣、從使用者那裡取得輸入,以及將訊息記錄到客戶端
- 實用特性:支援額外能力,如即時更新通知和長時間執行操作的進度追蹤
傳輸層
傳輸層管理客戶端和伺服器之間的通訊通道和身份驗證。它處理連線建立、訊息框架和 MCP 參與者之間的安全通訊。
MCP 支援兩種傳輸機制:
- Stdio 傳輸:使用標準輸入/輸出串流進行同一台機器上本地程序之間的直接程序通訊,提供最佳效能且無網路開銷。
- Streamable HTTP 傳輸:使用 HTTP POST 進行客戶端到伺服器的訊息,可選的 Server-Sent Events 用於串流功能。此傳輸啟用遠端伺服器通訊,並支援標準 HTTP 身份驗證方法,包括 bearer token、API 金鑰和自訂標頭。MCP 建議使用 OAuth 來取得身份驗證 token。
傳輸層從協定層抽象化通訊細節,使相同的 JSON-RPC 2.0 訊息格式能夠跨所有傳輸機制使用。
資料層協定
MCP 的核心部分是定義 MCP 客戶端和 MCP 伺服器之間的模式和語義。開發者可能會發現資料層——特別是原語集合——是 MCP 最有趣的部分。它是 MCP 中定義開發者可以從 MCP 伺服器向 MCP 客戶端共享內容方式的部分。
MCP 使用 JSON-RPC 2.0 作為其底層 RPC 協定。客戶端和伺服器相互發送請求並相應回應。當不需要回應時可以使用通知。
生命週期管理
MCP 是一個需要生命週期管理的有狀態協定。生命週期管理的目的是協商客戶端和伺服器都支援的能力。詳細資訊可以在規範中找到,範例展示了初始化序列。
原語
MCP 原語是 MCP 中最重要的概念。它們定義了客戶端和伺服器可以相互提供什麼。這些原語指定了可以與 AI 應用程式共享的內容資訊類型和可以執行的動作範圍。
MCP 定義了伺服器可以暴露的三個核心原語:
- 工 具:AI 應用程式可以呼叫以執行動作的可執行函式(例如,檔案操作、API 呼叫、資料庫查詢)
- 資源:為 AI 應用程式提供內容資訊的資料來源(例如,檔案內容、資料庫記錄、API 回應)
- 提示:幫助構建與語言模型互動的可重複使用範本(例如,系統提示、少量樣本範例)
每種原語類型都有相關的探索(*/list
)、檢索(*/get
)方法,在某些情況下還有執行(tools/call
)方法。
MCP 客戶端將使用 */list
方法來探索可用的原語。例如,客戶端可以首先列出所有可用工具(tools/list
),然後執行它們。此設計允許列表是動態的。
作為一個具體範例,考慮一個提供資料庫內容的 MCP 伺服器。它可以暴露用於查詢資料庫的工具、包含資料庫模式的資源,以及包含與工具互動的少量樣本範例的提示。
有關伺服器原語的更多詳情,請參閱伺服器概念。
MCP 也定義了客戶端可以暴露的原語。這些原語允許 MCP 伺服器作者建立更豐富的互動。
- 採樣:允許伺服器從客戶端的 AI 應用程式請求語言模型完成。這在伺服器作者想要存取語言模型,但想要保持模型獨立且不在其 MCP 伺服器中包含語言模型 SDK 時很有用。他們可以使用
sampling/complete
方法從客戶端的 AI 應用程式請求語言模型完成。 - 請求:允許伺服器從使用者請求額外資訊。這在伺服器作者想要從使用者那裡獲取更多資訊或要求確認動作時很有用。他們可以使用
elicitation/request
方法從使用者請求額外資訊。 - 記錄:使伺服器能夠向客戶端發送記錄訊息以進行除錯和監控。
有關客戶端原語的更多詳情,請參閱客戶端概念。
通知
協定支援即時通知以啟用伺服器和客戶端之間的動態更新。例如,當伺服器的可用工具發生變化時——如新功能變得可用或現有工具被修改——伺服器可以發送工具更新通知來通知連線的客戶端這些變化。通知作為 JSON-RPC 2.0 通知訊息發送(不期望回應),並使 MCP 伺服器能夠向連線的客戶端提供即時更新。
範例
資料層
本節提供 MCP 客戶端 - 伺服器互動的逐步演練,專注於資料層協定。我們將使用 JSON-RPC 2.0 訊息演示生命週期序列、工具操作和通知。
步驟 1:初始化(生命週期管理)
MCP 通過能力協商握手開始生命週期管理。如生命週期管理章節所述,客戶端發送 initialize
請求以建立連線並協商支援的特性。
請求
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {
"tools": {}
},
"clientInfo": {
"name": "example-client",
"version": "1.0.0"
}
}
}
回應
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"protocolVersion": "2025-06-18",
"capabilities": {
"tools": {
"listChanged": true
},
"resources": {}
},
"serverInfo": {
"name": "example-server",
"version": "1.0.0"
}
}
}
理解初始化交換
初始化程序是 MCP 生命週期管理的關鍵部分,並有幾個重要目的:
-
協定版本協商:
protocolVersion
欄位(例如 "2025-06-18")確保客戶端和伺服器都使用相容的協定版本。這防止不同版本嘗試互動時可能發生的通訊錯誤。如果無法協商到相互相容的版本,應該終止連線。 -
能力探索:
capabilities
物件允許各方宣告他們支援的特性,包括他們可以處理的原語(工具、資源、提示)以及他們是否支援如通知等特性。這通過避免不支援的操作來實現高效通訊。 -
身份交換:
clientInfo
和serverInfo
物件提供識別和版本資訊以進行除錯和相容性目的。
在此範例中,能力協商演示了如何宣告 MCP 原語:
客戶端能力:
"tools": {}
- 客戶端宣告它可以使用工具原語(可以呼叫tools/list
和tools/call
方法)
伺服器能力:
"tools": {"listChanged": true}
- 伺服器支援工具原語並且可以在其工具清單變化時發送tools/list_changed
通知"resources": {}
- 伺服器還支援資源原語(可以處理resources/list
和resources/read
方法)
成功初始化後,客戶端發送通知以表示已準備好:
通知
{
"jsonrpc": "2.0",
"method": "notifications/initialized"
}