架構

模型上下文協議 (MCP) 遵循客戶端-主機-服務器架構,其中每個 主機可以運行多個客戶端實例。這種架構使用戶能夠跨應用程序集成 AI 功能,同時保持明確的安全邊界並隔離關注點。MCP 基於 JSON-RPC 構建,提供專注於 客戶端和服務器之間上下文交換和採樣協調的有狀態會話協議。

核心組件

  graph LR
    subgraph "應用程序主機進程"
        H[主機]
        C1[客戶端 1]
        C2[客戶端 2]
        C3[客戶端 3]
        H --> C1
        H --> C2
        H --> C3
    end

    subgraph "本地機器"
        S1[服務器 1<br>文件和Git]
        S2[服務器 2<br>數據庫]
        R1[("本地<br>資源 A")]
        R2[("本地<br>資源 B")]

        C1 --> S1
        C2 --> S2
        S1 <--> R1
        S2 <--> R2
    end

    subgraph "互聯網"
        S3[服務器 3<br>外部 API]
        R3[("遠程<br>資源 C")]

        C3 --> S3
        S3 <--> R3
    end

主機

主機進程充當容器和協調器:

  • 創建和管理多個客戶端實例
  • 控制客戶端連接權限和生命週期
  • 執行安全策略和同意要求
  • 處理用戶授權決策
  • 協調 AI/LLM 集成和採樣
  • 管理跨客戶端的上下文聚合

客戶端

每個客戶端由主機創建並維護隔離的服務器連接:

  • 為每個服務器建立一個有狀態會話
  • 處理協議協商和能力交換
  • 雙向路由協議消息
  • 管理訂閱和通知
  • 維護服務器之間的安全邊界

主機應用程序創建和管理多個客戶端,每個客戶端與特定服務器具有 1:1 關係。

服務器

服務器提供專業的上下文和能力:

  • 通過 MCP 原語公開資源、工具和提示
  • 獨立運行,職責集中
  • 通過客戶端接口請求採樣
  • 必須尊重安全約束
  • 可以是本地進程或遠程服務

設計原則

MCP 基於幾個關鍵設計原則,這些原則指導其架構和實現:

  1. 服務器應該非常容易構建

    • 主機應用程序處理複雜的編排責任
    • 服務器專注於具體、明確定義的功能
    • 簡單接口最小化實現開銷
    • 明確分離使代碼可維護
  2. 服務器應該高度可組合

    • 每個服務器獨立提供集中功能
    • 多個服務器可以無縫組合
    • 共享協議實現互操作性
    • 模塊化設計支持可擴展性
  3. 服務器不應能夠讀取整個對話,也不應"看到"其他服務器

    • 服務器只接收必要的上下文信息
    • 完整對話歷史保留在主機
    • 每個服務器連接保持隔離
    • 跨服務器交互由主機控制
    • 主機進程執行安全邊界
  4. 功能可以逐步添加到服務器和客戶端

    • 核心協議提供最小所需功能
    • 可以根據需要協商額外能力
    • 服務器和客戶端獨立發展
    • 協議設計為未來可擴展
    • 保持向後兼容性

消息類型

MCP 定義了基於 JSON-RPC 2.0 的三種核心消息類型:

  • 請求:雙向消息,帶有方法和參數,期望響應
  • 響應:成功結果或與特定請求 ID 匹配的錯誤
  • 通知:不需要響應的單向消息

每種消息類型遵循 JSON-RPC 2.0 規範的結構和傳遞語義。

能力協商

模型上下文協議使用基於能力的協商系統,客戶端和服務器在初始化期間明確聲明其支持的功能。能力決定了會話期間可用的協議功能和原語。

  • 服務器聲明資源訂閱、工具支持和提示模板等能力
  • 客戶端聲明採樣支持和通知處理等能力
  • 雙方必須在整個會話中尊重已聲明的能力
  • 可以通過協議擴展協商額外能力
  sequenceDiagram
    participant Host
    participant Client
    participant Server

    Host->>+Client: 初始化客戶端
    Client->>+Server: 使用能力初始化會話
    Server-->>Client: 響應支持的能力

    Note over Host,Server: 具有協商功能的活動會話

    loop 客戶端請求
        Host->>Client: 用戶或模型發起的操作
        Client->>Server: 請求(工具/資源)
        Server-->>Client: 響應
        Client-->>Host: 更新UI或響應模型
    end

    loop 服務器請求
        Server->>Client: 請求(採樣)
        Client->>Host: 轉發到AI
        Host-->>Client: AI響應
        Client-->>Server: 響應
    end

    loop 通知
        Server--)Client: 資源更新
        Client--)Server: 狀態變化
    end

    Host->>Client: 終止
    Client->>-Server: 結束會話
    deactivate Server

每種能力都會在會話期間解鎖特定的協議功能。例如:

  • 實現的服務器功能必須在服務器的能力中通告
  • 發出資源訂閱通知需要服務器聲明訂閱支持
  • 工具調用需要服務器聲明工具能力
  • 採樣需要客戶端在其能力中聲明支持

這種能力協商確保客戶端和服務器對支持的功能有清晰的理解,同時保持協議可擴展性。