补全

ℹ️
协议修订版: 2024-11-05

Model Context Protocol (MCP) 提供了一种标准化的方式,供服务器为提示和资源 URI 提供参数自动补全建议。这使得用户可以在输入参数值时获得上下文建议,从而实现类似 IDE 的丰富体验。

用户交互模型

MCP 中的补全旨在支持类似于 IDE 代码补全的交互式用户体验。

例如,应用程序可以在用户输入时以下拉菜单或弹出菜单的形式显示补全建议,并能够从可用选项中进行过滤和选择。

然而,实现可以自由地通过任何适合其需求的界面模式暴露补全——协议本身并不强制要求任何特定的用户交互模型。

协议消息

请求补全

要获取补全建议,客户端发送 completion/complete 请求,通过引用类型指定正在补全的内容:

请求:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "completion/complete",
  "params": {
    "ref": {
      "type": "ref/prompt",
      "name": "code_review"
    },
    "argument": {
      "name": "language",
      "value": "py"
    }
  }
}

响应:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "completion": {
      "values": ["python", "pytorch", "pyside"],
      "total": 10,
      "hasMore": true
    }
  }
}

引用类型

协议支持两种补全引用类型:

类型描述示例
ref/prompt通过名称引用提示{"type": "ref/prompt", "name": "code_review"}
ref/resource引用资源 URI{"type": "ref/resource", "uri": "file:///{path}"}

补全结果

服务器返回按相关性排序的补全值数组,其中包含:

  • 每次响应最多 100 个项目
  • 可选的可用匹配总数
  • 布尔值指示是否存在更多结果

消息流

sequenceDiagram
    participant Client
    participant Server

    Note over Client: 用户输入参数
    Client->>Server: completion/complete
    Server-->>Client: 补全建议

    Note over Client: 用户继续输入
    Client->>Server: completion/complete
    Server-->>Client: 精炼的建议

数据类型

CompleteRequest

  • ref: PromptReferenceResourceReference
  • argument: 包含以下内容的对象:
    • name: 参数名称
    • value: 当前值

CompleteResult

  • completion: 包含以下内容的对象:
    • values: 建议数组(最多 100 个)
    • total: 可选的匹配总数
    • hasMore: 更多结果标志

实现注意事项

  1. 服务器

    • 按相关性排序返回建议
    • 在适当的地方实现模糊匹配
    • 对补全请求进行速率限制
    • 验证所有输入
  2. 客户端

    • 对快速补全请求进行防抖处理
    • 在适当的地方缓存补全结果
    • 优雅地处理缺失或不完整的结果

安全

实现 必须

  • 验证所有补全输入
  • 实施适当的速率限制
  • 控制对敏感建议的访问
  • 防止基于补全的信息泄露