什么是 MCP 提示词(MCP Prompt)?
MCP 提示词(MCP Prompt)是由 Server 编写、用户控制使用时机的消息模板,MCP Client 可发现并携带字符串参数请求,由 Server 渲染消息,而模型、上下文、策略与执行权仍归 Host。
快速了解
| 规范文档 | 官方规范 |
|---|
工作原理
MCP Prompt 是 Model Context Protocol 中面向可复用指令的 Primitive。Server 编写并暴露命名模板,Client 负责发现和获取,用户显式选择何时使用,Host 决定返回的 Message 如何进入模型请求。User-controlled 指的是选择权,不代表内容由用户编写或天然可信。获取 Prompt 不会调用模型,也不会执行 Tool;MCP 定义 prompts/list 与 prompts/get,没有标准 prompts/execute Method。
它与相邻概念的边界不同。通用 Prompt 是任意模型输入,应用内 Prompt Template 没有 MCP Discovery 或 Transport Contract;System Prompt 属于 Host 或模型供应商的 Policy Layer。MCP Prompt 只能返回 user 或 assistant Role,因此把 Assistant Message 写成「系统指令」不会使它获得 System Role 权限。Chat Template 是 Host 组装对话后,由 Tokenizer 把 Role 与 Content 序列化为模型 Token 的规则。MCP Tool 执行动作,MCP Resource 暴露 URI 数据;Prompt 可以指导其使用,但不能授予权限。
在 MCP 2026-07-28 中,每个 prompts/list 与 prompts/get Request 都是 Stateless,并在 _meta 中携带 Protocol Version 与相关 Client Capabilities。支持 Prompt 的 Server 通过 server/discover 声明 prompts Capability,可选开启 listChanged。列表可以为空,也可按当前 Request 的 Credential 过滤,但不能仅因另一个 Request 复用了同一 Connection 而变化。多个 Server 可能使用相同 Prompt Name,聚合它们的 Host 应以稳定的 Configured Server Identity 限定名称空间。
prompts/list 返回 Descriptor,包括程序化 name、可选显示 title、Description、Icon 和 Argument Metadata。它支持 Opaque Cursor Pagination,Complete Result 携带 resultType、非负 ttlMs 与 cacheScope。只有所有调用方得到相同目录时才使用 public;按 User、Tenant、Role 或 Token 过滤的列表必须使用 private,并隔离 Authorization Context。Pagination 不保证跨页 Snapshot 一致;Change Notification 会使 Cache Page 失效,但没有收到通知不能证明之后渲染的正文没有变化。
Prompt Argument 比 Tool Input 更窄。每个 Argument Descriptor 只有 Name、可选 Title 与 Description,以及可选 required;prompts/get.params.arguments 是 String Map。核心协议没有为 Prompt Argument 定义 JSON Schema、Number Type、Enum、Secret Type 或 Nested Object。Server 必须检查 Required Field,按契约拒绝 Unknown 或 Oversized Value,确定性解析领域格式,并授权参数引用的 Repository、Record、File 或 Tenant。Description 与 UI Control 只改善输入体验,不等于 Validation。
Client 可以通过 ref/prompt 调用 completion/complete 获取 Argument Suggestion。Suggestion 同样是授权敏感数据:应按当前 Principal 与 Tenant 过滤,执行 Rate Limit 与 Debounce,遵守协议数量上限,并防止 Prefix 与 Match Count 泄露私有 Project Name 或 Record ID。Completion 只缩小输入范围,不能校验最终 Value,也不能授权渲染结果。
prompts/get 将选定 Name 与 String 渲染为 Complete Result,包含 Description 和一个或多个 Prompt Message。每条 Message 只有 user 或 assistant Role,并携带一个 Content Block:Text、Base64 Image、Base64 Audio、Resource Link 或 Embedded Resource。Client 在 Preview 或加入模型前必须校验 Content Shape、MIME Type、Encoded Byte、Resource Access 与 Size。大型或敏感上下文优先使用 Scoped Resource Link,并保留 Provenance,让用户知道 Message 来自哪个 Server 与 Data Source。
Rendered Prompt 不属于协议缓存对象:MCP 的 Cacheable Operation 列表没有 prompts/get,其 Complete Result 也不包含 ttlMs 或 cacheScope。不能把 Prompt Catalog TTL 当作 Body TTL。应用若自行增加 Render Cache,Key 必须覆盖精确 Prompt Name、全部 Argument、Authorization Context、Server Build、Template Revision 与相关 Policy;MRTR Retry 不得使用该 Cache。当前协议没有标准 Prompt Version Field 或 Content-changed Notification,高影响部署应固定 Immutable Server Build,并比较 Descriptor 与 Rendered-content Hash。
List Change 通过长连接 subscriptions/listen Request 传递,Filter 使用 promptsListChanged: true。Server 确认接受的 Filter,并以 io.modelcontextprotocol/subscriptionId 标记 notifications/prompts/list_changed,Client 随后重新获取列表。HTTP Client 关闭 SSE Stream 取消,stdio 则针对 Listen Request 发送 notifications/cancelled;重连后必须重新订阅。它替代 Connection-wide Legacy Notification,并且只表示 Catalog 失效,不会传递新的 Rendered Prompt Body。
只有 prompts/get 而非 prompts/list 可以通过 MRTR 返回 resultType: "input_required",请求受支持的 Elicitation、Roots 或 Legacy Sampling 输入。重试是带新 JSON-RPC ID、inputResponses 与可选不透明 requestState 的独立 Request。State 必须按攻击者可控输入处理;若影响 Prompt Selection、Resource Access、Argument 或 Policy,需要保护完整性,并绑定 Principal、Method、关键 Parameter Digest、Policy Revision 与短 TTL。Client 必须原样回传,不得检查或修改。
无效 Prompt Name 与缺少 Required Argument 使用 JSON-RPC -32602 Invalid Params,内部故障使用 -32603。这些错误要与合法空 Message,以及 Host 决定不把结果发送给模型区分。错误应提供稳定分类,但不得暴露 Template Source、Hidden Policy、Resource 是否存在、Secret 或原始 Argument。Timeout 或 Transport Loss 也不能授权系统静默降级到另一个 Prompt 或过期 Body。
Prompt Content 跨越语义供应链边界。恶意或被攻陷的 Server 可以在 Descriptor 或 Rendered Text 中放置 Prompt Injection;Argument Text 可形成 Direct Injection,Resource 可携带 Indirect Injection,Image 或 Audio 可形成 Cross-modal Injection。系统应把 Instruction 与 Untrusted Data 分隔,执行 Byte 与 Token Budget、内容扫描和分类,保留 Least-privilege Tool Permission,并对高影响调用单独审批。Escaping 或更强 System Prompt 可以降低歧义,却不能证明模型解释是安全的。
Prompt 变更应像代码变更一样治理。Trace 应记录 Immutable Server Build、Prompt 与 Template Revision 或 Hash、Argument Digest 而非原始 Secret、Resource Provenance、用户选择与 Preview Decision、Model 与 Chat Template Version、Enabled Tool、Policy Revision、Token Usage、Error Class 和 Downstream Outcome。发布前要覆盖代表性、对抗性、多语言、Long-context 与 Multimodal Case,验证是否泄露数据、覆盖策略、选择不必要 Tool 或降低任务质量。成功的 prompts/get 只证明 Server 返回合法 Message,不能证明它可信、有效或已获执行批准。
主要特点
- 用户控制选择:用户决定何时使用 Server 编写的 Prompt,Host 控制模型提交与策略
- 可发现消息契约:prompts/list 声明 Name 与 String Argument Metadata,prompts/get 渲染 User 或 Assistant Message
- 富媒体但有边界:Text、Image、Audio、Resource Link 与 Embedded Resource 需要 MIME、Byte、Token 与 Provenance 控制
- 仅列表可协议缓存:Catalog Result 携带 TTL 与 Public/Private Scope,Rendered prompts/get Result 不属于协议缓存对象
- 无状态续传:prompts/get 可用 MRTR input_required 和受完整性保护的 requestState 代替 Server-initiated Request
- 指令供应链表面:Descriptor、Argument、Resource、Rendered Message、Model Mapping 与 Template Revision 都需审查和评测
常见用途
- 提供用户显式选择的代码审查流程,引用已授权 Diff,并让 Tool Execution 保持独立审批
- 渲染带受限 Log Resource、明确 Evidence Instruction 和严格 Context Budget 的事故分析对话
- 提供多语言文档模板,在 Message Generation 前校验 Locale 与 Audience String
- 用经过权限过滤的 Schema Suggestion 引导数据库排查,同时不把 Prompt 变成 Query-execution Tool
- 跨兼容 Client 分发版本化团队工作流,并记录评测所用的精确 Template、Model 与 Policy
示例
Loading code...常见问题
MCP Prompt 与 System Prompt、Chat Template 有什么区别?
MCP Prompt 是用户显式选择后,由 Server 返回 User 或 Assistant Message 的模板;System Prompt 属于 Host 或模型供应商的 Policy Layer,MCP PromptMessage 没有 System Role。Chat Template 随后把组装好的 Role 与 Content 序列化为模型 Token。Assistant Message 与序列化模板都不能静默替换 Host Policy。
MCP Prompt Argument 有类型或 JSON Schema 校验吗?
没有。核心协议只为 Argument 定义 Name、可选 Title 与 Description,以及 Required Flag;prompts/get 携带 String Map。Server 必须自行实施 Length、Enum-like Choice、Identifier Syntax、Authorization 与 Domain Rule。Completion Suggestion 和 UI Control 可以改善输入,但不能校验或授权最终 Value。
prompts/get 会执行 Prompt 或调用 LLM 吗?
不会。prompts/get 只把结构化 Message 和可选 Resource 返回 Client。Host 负责 Preview、转换受支持内容、应用 System Policy 与 Context Limit、选择模型,并决定是否发送模型请求。MCP 没有 prompts/execute Method,后续任何 Tool Call 仍是单独授权的动作。
MCP Prompt 可以缓存和版本化吗?
只有 prompts/list 有标准 TTL 与 cacheScope Hint,prompts/get 不属于协议缓存对象;MCP 也没有标准 Prompt Version Field。生产系统应固定 Immutable Server Build,记录 Descriptor 与 Rendered-content Hash,在 List-changed Notification 后失效 Catalog,并联合评测实际发布的 Prompt、Model、Tool、Resource 与 Host Policy。
如何降低 MCP Prompt 的 Prompt Injection 风险?
应把 Server Text、Argument、Linked Resource、Embedded Content、Image 与 Audio 都视为不可信输入,分隔 Instruction 与 Data,读取 Resource 前验证权限,限制 Byte 与 Token,并把 Tool Permission 放在模型控制之外。高影响模板需要 Preview,并测试 Direct、Indirect、多语言和 Multimodal Attack;不能把 Escaping 或 System Prompt 当作完整防御。