ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Claude MCP 服务端原语进阶:Resources 与 Prompts 的选型、实现与源码级解析(claude-plugins-official 实践指南)

2026/10/1 9:19:14 拓冰建站 浏览量
Claude MCP 服务端原语进阶:Resources 与 Prompts 的选型、实现与源码级解析(claude-plugins-official 实践指南) AI 插件开发工具插件系统【免费下载链接】claude-plugins-officialOfficial, Anthropic-managed directory of high quality Claude Code Plugins.项目地址https://gitcode.com/GitHub_Trending/cl/claude-plugins-official点击查看免费下载本指南以官方 Claude 插件仓库 claude-plugins-official 中 build-mcp-server 技能 的参考文档 resources-and-prompts.md 为主体系统讲解 MCPModel Context Protocol除工具Tools之外的两大服务端原语——资源Resources与提示Prompts。读完本文你将掌握资源适合被主机浏览读取、提示适合被用户以斜杠命令触发的完整判断模型能在 TypeScript SDK 与 FastMCPPython两套框架中落地静态资源、动态资源模板、订阅通知与参数化提示并依据决策表在 Tool / Resource / Prompt / Elicitation 之间做出正确选型。一、三大原语谁触发谁读取MCP 规范定义了三种服务端原语其中只有Tools工具是模型控制的——Claude 自行决定何时调用某个工具、传入什么参数。而另外两种原语的触发权完全不在模型手里原语谁触发触发形态心智模型Tools工具模型Claude函数调用Claude 调用一个函数Resources资源宿主应用Host浏览、拉取入上下文宿主读取一份数据Prompts提示用户斜杠命令 / 菜单项用户点一个模板这一点在 resources-and-prompts.md 中被反复强调资源是 application-controlled提示是 user-controlled。绝大多数 MCP 服务器只需要工具只有当你的集成形态不再适配Claude 调用函数这个模型时才应该考虑引入资源与提示。build-mcp-server 技能在 Phase 5 之外也专门提醒开发者Most servers start with tools and never need the others, but knowing they exist prevents reinventing wheelsSKILL.md 的 Beyond tools 小节即知道它们的存在能避免重复造轮子。二、Resources被读取而非被调用的数据资源Resource是由 URI 标识的数据。它与工具的本质区别在于工具是被call的资源是被read的。宿主应用会先浏览服务器暴露了哪些资源再决定把哪些加载进上下文。2.1 什么时候资源优于工具参考文档给出了非常清晰的取舍标准resources-and-prompts.md资源占优的场景大型参考数据文档、Schema、配置文件——Claude 应当能够浏览而不是一次性取回独立于对话而变化的内容日志文件、实时数据——内容随时间漂移不适合作为工具返回快照任何由 Claude 决定去取都是错误心智模型的场景。工具占优的场景操作有副作用写库、发请求、改状态结果依赖 Claude 选择的参数你希望Claude而非宿主 UI决定何时拉取。一句话概括资源是读语义工具是做语义。前者关注数据的可浏览性与实时性后者关注动作的可执行性与参数化。2.2 静态资源两种框架的注册写法TypeScript SDKresources-and-prompts.mdserver.registerResource( config, config://app/settings, { name: App Settings, description: Current configuration, mimeType: application/json }, async (uri) ({ contents: [{ uri: uri.href, mimeType: application/json, text: JSON.stringify(config) }], }), );注意四个参数的次序资源名逻辑 ID→ URI协议config:// 路径→ 元数据对象 → 读取回调。元数据中的mimeType声明内容类型读取回调返回contents[]数组每个元素包含uri、mimeType与text。宿主按需调用该回调把文本内容注入上下文。FastMCPPythonresources-and-prompts.mdmcp.resource(config://app/settings) def get_settings() - str: Current application configuration. return json.dumps(config)FastMCP 采用装饰器语法函数返回值即资源内容一行装饰器完成注册。build-mcp-server 技能在 Phase 4 中将 FastMCPfastmcpPyPI 包与官方 TypeScript SDK 并列为主推框架TS SDK best spec coverage, first to get new featuresFastMCP decorator-based, very low boilerplateSKILL.md 的 Phase 4 表格。2.3 动态资源RFC 6570 URI 模板静态资源每个 URI 需要一次注册当资源是一整族动态数据如任意路径下的文件、数据库中的任意表时用RFC 6570 URI 模板让一次注册服务无数 URI。TypeScript SDKresources-and-prompts.mdimport { ResourceTemplate } from modelcontextprotocol/sdk/server/mcp.js; server.registerResource( file, new ResourceTemplate(file:///{path}, { list: undefined }), { name: File, description: Read a file from the workspace }, async (uri, { path }) ({ contents: [{ uri: uri.href, text: await fs.readFile(path, utf8) }], }), );关键点模板file:///{path}中的{path}会作为第二个参数的解构项传入回调ResourceTemplate的第二个参数{ list: undefined }控制是否允许宿主枚举该资源族此处禁用列表。回调内部执行真实读取fs.readFile把文件内容以文本形式返回。FastMCPPythonresources-and-prompts.mdmcp.resource(file:///{path}) def read_file(path: str) - str: return Path(path).read_text()装饰器路径中的{path}自动绑定为函数参数。动态资源是暴露一整个命名空间的利器例如文档中提到的db://{table}这类场景。2.4 订阅Subscriptions资源变更主动通知静态与动态资源解决的是读取订阅解决的是变更感知resources-and-prompts.md在服务器 capabilities 中声明subscribe: true资源内容变化时服务器发出notifications/resources/updated通知宿主收到通知后重新读取该资源。典型适用场景日志尾部log tails、实时仪表盘live dashboards、被监控的文件。这让资源从一次性快照进化为可持续跟踪的数据流。注意订阅功能属于服务器能力server capabilities体系的一部分——该参考文件列出了其余可选能力instructions系统提示注入、sampling 采样委托、roots 工作区边界、logging 结构化日志、progress 进度上报、cancellation 取消、completion 自动补全并明确指出部分能力需要客户端配合如 Logging 由服务端声明logging: {}、无客户端支持时退化为 stderrSampling、Elicitation、Roots 则必须先检查clientCapabilities再使用。三、Prompts用户触发的参数化消息模板提示Prompt是一个参数化的消息模板。宿主把它暴露为斜杠命令或菜单项用户主动挑选、填写参数随后生成的 messages 落入当前对话。3.1 适用场景与 UX 价值参考文档给出的判断非常直接resources-and-prompts.mdWhen to use:canned workflows users run repeatedly —/summarize-thread,/draft-reply,/explain-error. Near-zero code, high UX leverage.即用户会反复执行的固化工作流如总结本线程、起草回复、解释这个报错。提示几乎不写逻辑却带来极高的用户体验杠杆——用户不需要背工具名只需要点一个菜单项。3.2 注册一个带参数与参数校验的提示TypeScript SDKresources-and-prompts.mdserver.registerPrompt( summarize, { title: Summarize document, description: Generate a concise summary of the given text, argsSchema: { text: z.string(), max_words: z.string().optional() }, }, ({ text, max_words }) ({ messages: [{ role: user, content: { type: text, text: Summarize in ${max_words ?? 100} words:\n\n${text} }, }], }), );argsSchema使用 zod 描述参数约束z.string()max_words可选并带默认值兜底?? 100回调接收参数、返回messages[]消息体遵循 MCP 内容类型规范{ type: text, text: ... }。FastMCPPythonresources-and-prompts.mdmcp.prompt def summarize(text: str, max_words: str 100) - str: Generate a concise summary of the given text. return fSummarize in {max_words} words:\n\n{text}Python 版通过函数签名声明参数、默认值即模板占位装饰器mcp.prompt完成注册——与 TS 版是同一套 wire protocol 的两种写法。3.3 三条硬性约束参考文档明确列出提示的三条约束resources-and-prompts.md参数只能是字符串string-only——没有 number、boolean、object需要类型转换时在 handler 内部做返回messages[]数组——不仅可以包含纯文本还可以内嵌资源resources与图片不限于 text无副作用——handler 只负责构建一条消息不执行任何实际操作。最后一条与工具形成鲜明对比工具可以写数据、调外部 API提示永远只产出文本注入对话。如果提示 handler 里出现真实动作那就是设计错误应当把动作放回工具。3.4 提示参数的自动补全进阶能力如果你的提示参数存在大量合法取值可以进一步为它注册自动补全。同目录的 server-capabilities.md 给出了completable()示例当用户输入部分值时服务器实时返回以该前缀过滤的候选值。文档同时提醒这是低优先级能力Low priority unless your prompts have many valid values提示参数只有有限枚举时才值得实现。四、快速决策表Tool / Resource / Resource Template / Prompt / Elicitation参考文档以一张决策表收尾resources-and-prompts.md这是整篇的选型精华你的诉求应选方案让 Claude 按需取某样东西、且带参数Tool工具暴露可浏览的上下文文件、文档、SchemaResource资源暴露一整个动态资源族如db://{table}Resource template资源模板给用户一个一键工作流Prompt提示在工具执行中途向用户提问Elicitation详见 elicitation.md决策背后的底层逻辑结合 SKILL.md 的 Beyond tools 小节这张表可以进一步归纳为触发权的四象限模型触发→工具宿主触发→资源用户触发→提示服务器中途触发→ Elicitation / Sampling。四个原语各管一段触发权互不重叠。关于Elicitation表末第五行elicitation.md 给出了规范级说明它让服务器在工具调用中途暂停、向用户索要结构化输入宿主渲染原生表单无需 iframe/HTML。但宿主支持还很新——Claude Code 自 v2.1.76 起支持form与url两种模式Claude Desktop 未确认claude.ai 未知SDK 在客户端未声明该能力时会直接抛出CapabilityNotSupported。因此标准做法是先检查caps.elicitation再调用并提供文本回退让 Claude 转述问题、用户答复后重试。此外安全红线是不得通过 Elicitation 索取密码、API Key 或令牌规范要求这些必须走 OAuth 或敏感配置项。五、在 build-mcp-server 技能工作流中的定位把本指南放回上下文build-mcp-server是 mcp-server-dev 插件的入口技能完整路径为 plugins/mcp-server-dev/skills/build-mcp-server/SKILL.md它通过五个阶段引导开发者——询问用例连接对象、使用者、动作数量、是否需要中途输入与展示、上游认证方式→ 推荐部署模型远程流式 HTTP / MCP App / MCPB / 本地 stdio→ 选择工具设计模式小表面一动作一工具大表面 search execute→ 选择框架TS SDK 或 FastMCP→ 脚手架搭建与交接。Resources 与 Prompts 是这条主流程之外的第二层原语该技能在 Phase 5 与 Phase 6 之间专门列出 Beyond tools 小节并显式指向本参考文件references/resources-and-prompts.md。技能文档给出的定位建议与参考文件完全一致需要给 Claude 暴露可浏览的文档/文件/Schema→ 资源需要给用户提供固化工作流/summarize-thread之类→ 提示需要中途结构化提问→ Elicitation需要在工具逻辑里做LLM 推理→ Samplingreferences/server-capabilities.md。一个值得记住的实践结论多数服务器从工具起步、终其一生不需要资源和提示资源与提示是形状不对时才伸手去够的备用件——一旦用对能省掉大量重复的取数据/拼提示词工具逻辑同时把触发权交还给最合适的一方宿主与用户。六、小结与延伸阅读本文完整继承了参考文档的全部内容三大原语的触发权模型、资源优于/劣于工具的六条标准、静态资源与动态资源模板的 TS/Python 双版本代码、订阅机制、提示的适用场景与三条硬约束以及五选一决策表并补充了来自同仓库其他参考文件的源码级证据Elicitation 能力检查与回退模式、sampling 委托、completion 补全、logging 退化策略等。若需继续深入可在当前仓库按以下顺序阅读resources-and-prompts.md本文主体server-capabilities.mdinstructions / sampling / roots / logging / progress / cancellation / completionelicitation.md中途结构化提问能力检查 回退 安全红线SKILL.mdbuild-mcp-server 入口技能五阶段决策流tool-design.md工具描述与 Schema 编写指南插件总览 README三个技能的协作关系赞分享AI 插件开发工具插件系统【免费下载链接】claude-plugins-officialOfficial, Anthropic-managed directory of high quality Claude Code Plugins.项目地址https://gitcode.com/GitHub_Trending/cl/claude-plugins-official点击查看免费下载相关推荐OpenMetadata Connector 可靠性审计P6从分散审计报告到优先级重构计划与 PR 拆分的完整方法OpenMetadata Connector 可靠性审计P6从分散审计报告到优先级重构计划与 PR 拆分的完整方法 导读 本文基于 OpenMetadatAI 插件开发工具插件系统Claude Code MCP 服务器推荐与配置实战指南基于 claude-plugins-official 官方技能文档Claude Code MCP 服务器推荐与配置实战指南基于 claude plugins official 官方技能文档 MCPModel ContextAI 插件开发工具插件系统在 Claude Code 中接入 Asana V2 MCP 服务器完整配置指南claude-plugins-official在 Claude Code 中接入 Asana V2 MCP 服务器完整配置指南claude plugins official 本指南讲解如何将 ClauAI 插件开发工具插件系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考