MCP Python SDK · 第 5 章 资源、模板与提示词 章节摘要:第 4 章讲了模型驱动的工具,本章讲另外两类原语——应用控制的资源与用户控制的提示词。它们不像工具那样有副作用、由模型决定调用,而是各自服务于不同的交互模式:资源是「宿主按需加载进模型上下文的只读数据」(类比 GET),提示词是「用户主动触发的命名消息模板」(类比保存的查询)。我们会先讲资源与资源模板(URI 带参数)的注册与读取机制,再用「为什么不直接用工具」这个追问讲透它的设计动机;然后展开提示词——它的参数只能是扁平字符串列表,返回的是消息而非数据;最后介绍补全(Completions),这一让资源模板与提示词参数获得自动建议的能力。读完本章,你将能精准地区分三类原语的边界,各得其所地使用它们。
章节摘要:第 4 章讲了模型驱动的工具,本章讲另外两类原语——应用控制的资源与用户控制的提示词。它们不像工具那样有副作用、由模型决定调用,而是各自服务于不同的交互模式:资源是「宿主按需加载进模型上下文的只读数据」(类比 GET),提示词是「用户主动触发的命名消息模板」(类比保存的查询)。我们会先讲资源与资源模板(URI 带参数)的注册与读取机制,再用「为什么不直接用工具」这个追问讲透它的设计动机;然后展开提示词——它的参数只能是扁平字符串列表,返回的是消息而非数据;最后介绍补全(Completions),这一让资源模板与提示词参数获得自动建议的能力。读完本章,你将能精准地区分三类原语的边界,各得其所地使用它们。
阅读完本章,你应当能够:
@mcp.resource("config://app"))与资源模板(@mcp.resource("greeting://{name}"))在注册、列举、读取上的差异。@mcp.prompt()),理解它的参数为何只能是扁平字符串列表,以及返回的消息如何被宿主当作用户消息注入。整章逻辑可浓缩为一句话:资源与提示词的存在,让 MCP 能表达「不只是模型主动干活」的交互——资源让宿主按需喂数据,提示词让用户一键注入预设指令,三者合起来覆盖了 LLM 应用的三类控制权归属。
讲清资源的注册(@mcp.resource(uri))与两种形态:具体资源(URI 无参数,可直接列举)与资源模板(URI 带 {param},需提供参数实例化)。用一个「读配置」「读用户资料」的例子说明它如何像 GET 一样提供只读数据。
一个关键追问。工具也能返回数据,为什么要单独造资源?答案在控制权——资源由应用决定加载(可在模型发言前预载),工具由模型决定调用(每次都消耗一轮)。这一节用「文件树展示」「上下文预载」等场景讲透分工。
提示词是「用户主动触发的命名调用」。讲清它的注册(@mcp.prompt())、参数模型(只能是扁平字符串列表,无 JSON Schema)、返回值(字符串变成一条用户消息)。用「代码评审」「生成提交信息」等场景说明它为何是「保存的查询」的最佳类比。
资源模板与提示词的参数经常有固定候选值(如「项目名」「语言」)。补全(Completions)让宿主在用户输入时获得自动建议。讲清它的注册(需单独处理器)、能力声明(注册才声明 completions 能力)、与资源/提示词的协作。
本章遵循「认识资源 → 追问动机 → 转向提示词 → 补全收尾」的认知路径,用「为什么」串联每一节:
资源与模板 (01) ── 应用控制的只读数据,URI 即接口 │ ▼ 设计动机 (02) ── 为什么不直接用工具?控制权与成本 │ ▼ 提示词 (03) ── 用户控制的命名消息模板 │ ▼ 补全 (04) ── 为模板/提示词参数提供自动建议 │ ▼ 第 6 章:深入「一次请求的内部」——上下文、依赖与生命周期
认识资源是前提,追问动机让你理解协议设计的深度(避免把所有交互都塞进工具),提示词补上「用户控制」的最后一类,补全则是资源与提示词的体验增强。理解了这四节,你就能在「该用哪个原语」的纠结里基于控制权归属果断取舍。
前置知识:
@mcp.resource / @mcp.prompt 装饰器基本用法本章为后续章节奠定的基础:
read_resource)的直接操作对象