【MCP协议】服务端特性:提示词模版

168 阅读4分钟

模型上下文协议(MCP)为服务器向客户端暴露提示词模板提供了标准化方式。提示词模板使服务器能够提供结构化消息和指令,用于与语言模型交互。客户端可以发现可用提示词模板、检索其内容,并通过提供参数来自定义模板。

用户交互模型

提示词模板的设计遵循用户可控原则,即服务器向客户端暴露提示词模板时,旨在让用户能够明确选择并使用它们。

通常,提示词模板会通过用户在界面中主动触发的命令来激活,这种设计使用户能够自然地发现并调用可用的提示词模板。

例如,斜杠命令:

slash-command.png

但具体实现者可根据需求自由选择提示词模板的暴露方式——协议本身并不强制规定任何特定的用户交互模型。

能力声明

支持提示词模板的服务器必须在初始化时声明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": "要求大语言模型分析代码质量并提出改进建议",
        "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"
}

消息交互流程

mcp_prompts.png

数据类型

Prompt

Prompt 包含以下字段:

  • name: 提示词模板的唯一标识符
  • description: 面向开发者的可读说明(可选)
  • arguments: 可定制参数列表(可选)

PromptMessage

提示词模板中的消息可包含以下元素:

  • role:取值为"user"或"assistant",用于标识发言者身份
  • content:支持下列任意一种内容类型:
文本内容

用于表示纯文本消息:

{
  "type": "text",
  "text": "The text content of the message"
}

这是自然语言交互中最常用的内容类型。

图片内容

支持在消息中嵌入视觉信息:

{
  "type": "image",
  "data": "Base64编码的图片数据",
  "mimeType": "image/png"
}

图片数据必须采用Base64编码并包含有效的MIME类型,这对于需要视觉上下文的多模态交互至关重要。

音频内容

支持在消息中嵌入音频信息:

{
  "type": "audio",
  "data": "Base64编码的音频数据",
  "mimeType": "audio/wav"
}

音频数据必须采用Base64编码并包含有效的MIME类型,这对于需要听觉上下文的多模态交互至关重要。

嵌入式资源 (Embedded Resources)

支持直接引用服务器端资源:

{
  "type": "resource",
  "resource": {
    "uri": "resource://example",
    "mimeType": "text/plain",
    "text": "资源内容"
  }
}

资源必须包含以下要素:

  • 有效的资源URI
  • 正确的MIME类型
  • 文本内容或Base64编码的二进制数据

该特性允许提示词模板无缝集成服务器托管的内容(如文档、代码示例等参考材料),直接融入对话流程。

错误处理

服务器对于常见错误情况应返回标准JSON-RPC错误码:

  • 无效提示名称:-32602(参数无效)
  • 缺少必要参数:-32602(参数无效)
  • 内部错误:-32603(内部错误)

实现注意事项

  • 服务器应在处理前验证提示参数
  • 客户端应对大型提示列表实现分页处理
  • 双方应遵守能力协商约定

安全规范

实现方必须严格验证所有提示输入输出,防止注入攻击或未授权资源访问。