Skip to content

2.2 三大原语——Resources、Prompts、Tools

小周理解了三层架构,现在想知道:Server 到底暴露什么给 AI? 他看到一个 GitHub MCP Server 的配置,里面有 Tools、Resources、Prompts 三种东西——它们各管什么?


一句话总结

原语类比谁控制一句话
ResourcesGET 请求应用(Host)「这是数据,你自己决定要不要看」
Prompts函数定义用户「这是模板,我选择用哪个」
ToolsPOST 请求模型(LLM)「这是动作,AI 决定什么时候调用」

Resources——暴露数据

Resources 像 GET 请求,Server 把数据暴露出来,由 Host(应用)决定何时读取。

📄Resources应用控制
每个 Resource 有一个 URI(如 file:///project/README.md),Host 可以列出和读取这些资源。支持文本和二进制数据。
{ "uri": "file:///project/src/main.ts", "name": "Main TypeScript file", "mimeType": "text/typescript" }

协议消息

消息方向说明
resources/listClient → Server列出可用资源
resources/readClient → Server读取资源内容
resources/subscribeClient → Server订阅资源变更(v2+)
notifications/resources/updatedServer → Client资源变更通知

实际例子

  • 文件系统 Server 暴露项目文件列表
  • 数据库 Server 暴露表结构信息
  • 天气 API Server 暴露实时天气数据

Prompts——提示词模板

Prompts 像函数定义,用户选择使用哪个模板,模板可以接受参数。

📝Prompts用户控制
Prompt 是带参数的提示词模板,用户(不是 AI)选择何时使用。Server 定义模板和参数 Schema,用户填入参数后获取生成的消息序列。
{ "name": "code-review", "title": "Code Review", "description": "Review code for potential issues", "arguments": [ { "name": "code", "description": "要审查的代码", "required": true }, { "name": "focus", "description": "关注点", "required": false } ] }

协议消息

消息方向说明
prompts/listClient → Server列出可用模板
prompts/getClient → Server获取模板内容(带参数)
notifications/prompts/list_changedServer → Client模板列表变更

实际例子

  • code-review 模板——用户选中代码后一键发起审查
  • bug-report 模板——用户填入错误信息,生成标准化的 Bug 报告
  • summarize 模板——用户选择文件,生成摘要

Tools——可执行动作

Tools 像 POST 请求,由 AI(模型)自主决定何时调用。这是三种原语中最重要的。

🔧Tools模型控制
Tool 是 AI 可以调用的动作,有明确的输入/输出 Schema(JSON Schema)。AI 根据上下文自主决定调用哪个工具、传什么参数。Tools 直接决定了 AI 能做什么。
{ "name": "search-files", "title": "Search Files", "description": "Search for files matching a pattern", "inputSchema": { "type": "object", "properties": { "pattern": { "type": "string" }, "path": { "type": "string" } }, "required": ["pattern"] }, "annotations": { "readOnlyHint": true, "destructiveHint": false } }

协议消息

消息方向说明
tools/listClient → Server列出可用工具
tools/callClient → Server调用工具
notifications/tools/list_changedServer → Client工具列表变更

Tool Annotations(v2+)

注解说明
readOnlyHint是否只读(不修改任何东西)
destructiveHint是否有破坏性(如删除文件)
idempotentHint是否幂等(多次调用结果相同)
openWorldHint是否访问外部系统

Annotations 是不可信的

Server 可以声称工具是只读的,但实际执行写操作。Tool annotations 只是「建议」,不能作为安全依据。必须由人工审核(human-in-the-loop)。


三种原语对比

维度ResourcesPromptsTools
类比GET 端点函数定义POST 端点
控制方应用(Host)用户模型(LLM)
用途暴露数据/上下文提示词模板可执行操作
输入URI命名参数JSON Schema 参数
输出文本或二进制消息序列结构化内容
对 Agent 最重要提供上下文提供模板核心——决定 AI 能做什么

小周的理解

小周用文件系统 MCP Server 来验证他的理解:

1AI 列出项目文件 → 调用 tools/list,找到 read_file 工具
2AI 决定读取 README → 调用 tools/call,参数 {path: "README.md"}
3用户点击"代码审查" → 触发 prompts/get,参数 {code: "选中代码"}
4Host 显示文件列表resources/list,作为上下文给 AI

关键洞察:Tools 是 Agent 的「手」,Resources 是「眼睛」,Prompts 是「快捷操作」。


本节核心要点

  • 三种原语:Resources(数据,应用控制)、Prompts(模板,用户控制)、Tools(动作,模型控制)
  • Tools 最重要——它直接决定 AI 能做什么
  • Tool Annotations 是「建议」而非安全保证
  • 每种原语都支持变更通知和分页

思考题:如果让你给自己的项目设计一个 MCP Server,你会暴露哪些 Resources(数据)、Prompts(模板)和 Tools(动作)?

参考思路

从你的项目出发:数据层面(Resources)——哪些信息 AI 经常需要查看?如项目配置、数据库表结构、API 文档。操作层面(Tools)——AI 需要执行哪些动作?如搜索代码、运行测试、查询数据库。模板层面(Prompts)——用户经常重复的提示词模式?如代码审查、Bug 分析、文档生成。


← 上一节:三层架构 | 目录 | 下一节:JSON-RPC 与消息流 →