提示

協議版本: 2024-11-05

模型上下文協議(MCP)為服務器向客戶端公開提示模板提供了標準化方式。提示允許服務器提供與語言模型交互的結構化消息和指令。客戶端可以發現可用的提示,檢索其內容,並提供參數以自定義它們。

用戶交互模型

提示被設計為用戶控制,這意味著它們從服務器公開給客戶端,目的是讓用戶能夠明確地選擇它們使用。

通常,提示會通過用戶界面中的用戶發起命令觸發,這使用戶能夠自然地發現和調用可用的提示。

例如,作為斜槓命令:

作為斜槓命令公開的提示示例

然而,實現者可以通過任何適合其需求的接口模式公開提示—協議本身不強制任何特定的用戶交互模型。

能力

支持提示的服務器必須初始化期間聲明 prompts 能力:

{
  "capabilities": {
    "prompts": {
      "listChanged": true
    }
  }
}

listChanged 表示服務器是否會在可用提示列表更改時發出通知。

協議消息

列出提示

要檢索可用的提示,客戶端發送 prompts/list 請求。此操作支持分頁

請求:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "prompts/list",
  "params": {
    "cursor": "可選的遊標值"
  }
}

響應:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "prompts": [
      {
        "name": "code_review",
        "description": "要求 LLM 分析代碼質量並提出改進建議",
        "arguments": [
          {
            "name": "code",
            "description": "要審查的代碼",
            "required": true
          }
        ]
      }
    ],
    "nextCursor": "下一頁遊標"
  }
}

獲取提示

要檢索特定提示,客戶端發送 prompts/get 請求。參數可以通過補全 API自動補全。

請求:

{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "prompts/get",
  "params": {
    "name": "code_review",
    "arguments": {
      "code": "def hello():\n    print('world')"
    }
  }
}

響應:

{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "description": "代碼審查提示",
    "messages": [
      {
        "role": "user",
        "content": {
          "type": "text",
          "text": "請審查這段 Python 代碼:\ndef hello():\n    print('world')"
        }
      }
    ]
  }
}

列表更改通知

當可用提示列表更改時,聲明瞭 listChanged 能力的服務器應該發送通知:

{
  "jsonrpc": "2.0",
  "method": "notifications/prompts/list_changed"
}

消息流程

  sequenceDiagram
    participant Client
    participant Server

    Note over Client,Server: 發現
    Client->>Server: prompts/list
    Server-->>Client: 提示列表

    Note over Client,Server: 使用
    Client->>Server: prompts/get
    Server-->>Client: 提示內容

    opt listChanged
      Note over Client,Server: 更改
      Server--)Client: prompts/list_changed
      Client->>Server: prompts/list
      Server-->>Client: 更新的提示
    end

數據類型

提示

提示定義包括:

  • name:提示的唯一標識符
  • description:可選的人類可讀描述
  • arguments:用於自定義的可選參數列表

提示消息

提示中的消息可以包含:

  • role:表示發言者的"user"或"assistant"
  • content:以下內容類型之一:

文本內容

文本內容表示純文本消息:

{
  "type": "text",
  "text": "消息的文本內容"
}

這是自然語言交互中最常用的內容類型。

圖像內容

圖像內容允許在消息中包含視覺信息:

{
  "type": "image",
  "data": "base64編碼的圖像數據",
  "mimeType": "image/png"
}

圖像數據必須是 base64 編碼的,幷包含有效的 MIME 類型。這使得視覺上下文重要的多模態交互成為可能。

嵌入資源

嵌入資源允許在消息中直接引用服務器端資源:

{
  "type": "resource",
  "resource": {
    "uri": "resource://example",
    "mimeType": "text/plain",
    "text": "資源內容"
  }
}

資源可以包含文本或二進制(blob)數據,並且必須包括:

  • 有效的資源 URI
  • 適當的 MIME 類型
  • 文本內容或 base64 編碼的 blob 數據

嵌入資源使提示能夠將服務器管理的內容(如文檔、代碼示例或其他參考材料)無縫合併到對話流中。

錯誤處理

服務器應該為常見的失敗情況返回標準 JSON-RPC 錯誤:

  • 無效的提示名稱:-32602(無效參數)
  • 缺少必需參數:-32602(無效參數)
  • 內部錯誤:-32603(內部錯誤)

實現考慮

  1. 服務器應該在處理前驗證提示參數
  2. 客戶端應該處理大型提示列表的分頁
  3. 雙方應該尊重能力協商

安全

實現必須仔細驗證所有提示輸入和輸出,以防止注入攻擊或未授權訪問資源。