1. 什么是补全? #
补全(Completions)是 MCP 服务器为 提示 和 资源 的参数提供的自动建议,类似 IDE 的代码补全。用户填写参数时,服务器根据当前输入和已填参数,返回上下文相关的候选值。
协议版本:2025-11-25
| 通俗理解 | 说明 |
|---|---|
| 参数建议 | 用户输入「py」→ 服务器建议 python、pytorch、pyside 等 |
| 上下文感知 | 可结合已填参数(如 language: python)给出更精准建议 |
| 交互式 | 通常以下拉菜单、弹出列表等形式展示,协议不强制 UI 形态 |
2. 本章你将学到 #
- 补全的能力声明与协议消息
- 如何请求补全(单参数、多参数上下文)
- 引用类型(提示 vs 资源)
- 补全结果、错误处理与实现建议
3. 典型流程 #
用户选择 code_review 提示,在「语言」参数框输入「py」→ 客户端发 completion/complete,指定 ref/prompt + code_review,argument: { name: "language", value: "py" } → 服务器返回 ["python", "pytorch", "pyside"] → 客户端以下拉列表展示,用户选「python」。若还有「框架」参数,用户输入「fla」时,客户端在 context.arguments 中带上 language: "python",服务器据此返回 ["flask"]。
4. 能力 #
服务器必须声明 completions 能力:
{
"capabilities": {
"completions": {}
}
}5. 协议消息 #
5.1 请求补全(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
}
}
}多参数上下文示例:
用户已选 language: "python",正在填「框架」参数,输入「fla」:
{
"jsonrpc": "2.0",
"id": 2,
"method": "completion/complete",
"params": {
"ref": { "type": "ref/prompt", "name": "code_review" },
"argument": { "name": "framework", "value": "fla" },
"context": {
"arguments": { "language": "python" }
}
}
}响应:
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"completion": {
"values": ["flask"],
"total": 1,
"hasMore": false
}
}
}5.2 引用类型 #
| 类型 | 说明 | 示例 |
|---|---|---|
ref/prompt |
按名称引用 提示 | {"type": "ref/prompt", "name": "code_review"} |
ref/resource |
引用 资源 URI 模板 | {"type": "ref/resource", "uri": "file:///{path}"} |
5.3 补全结果 #
| 字段 | 说明 |
|---|---|
values |
建议数组,最多 100 项,按相关性排序 |
total |
可选,匹配总数 |
hasMore |
是否存在更多结果 |
6. 流程示意 #
sequenceDiagram
participant U as 用户
participant C as 客户端
participant S as 服务器
U->>C: 输入参数 "py"
C->>S: completion/complete
S-->>C: ["python", "pytorch", "pyside"]
C-->>U: 下拉展示
U->>C: 选 "python",再输入 "fla"
C->>S: completion/complete (context: language=python)
S-->>C: ["flask"]
C-->>U: 下拉展示
7. 数据结构 #
7.1 请求(CompleteRequest) #
| 字段 | 要求 | 说明 |
|---|---|---|
ref |
必须 | PromptReference 或 ResourceReference |
argument |
必须 | { name, value },当前正在补全的参数 |
context.arguments |
可选 | 已填参数名到值的映射,用于多参数上下文 |
7.2 响应(CompleteResult) #
| 字段 | 说明 |
|---|---|
completion.values |
建议数组,最多 100 项 |
completion.total |
可选,匹配总数 |
completion.hasMore |
是否有更多结果 |
8. 错误处理 #
| 错误码 | 情况 |
|---|---|
-32601 |
方法未找到(未声明补全能力) |
-32602 |
无效提示名、无效 URI、缺少必需参数 |
-32603 |
内部错误 |
9. 实现建议 #
| 角色 | 建议 |
|---|---|
| 服务器 | 按相关性排序;实现模糊匹配;速率限制;验证输入 |
| 客户端 | 对快速连续请求防抖;适当缓存结果;妥善处理缺失/不完整结果 |
10. 安全要点 #
| 要点 | 说明 |
|---|---|
| 验证输入 | 必须验证所有补全请求参数 |
| 速率限制 | 必须实施适当限制 |
| 敏感建议 | 必须控制对敏感建议的访问 |
| 信息泄露 | 必须防止基于补全的信息泄露 |