2.2 三大原语——Resources、Prompts、Tools
小周理解了三层架构,现在想知道:Server 到底暴露什么给 AI? 他看到一个 GitHub MCP Server 的配置,里面有 Tools、Resources、Prompts 三种东西——它们各管什么?
一句话总结
| 原语 | 类比 | 谁控制 | 一句话 |
|---|---|---|---|
| Resources | GET 请求 | 应用(Host) | 「这是数据,你自己决定要不要看」 |
| Prompts | 函数定义 | 用户 | 「这是模板,我选择用哪个」 |
| Tools | POST 请求 | 模型(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/list | Client → Server | 列出可用资源 |
resources/read | Client → Server | 读取资源内容 |
resources/subscribe | Client → Server | 订阅资源变更(v2+) |
notifications/resources/updated | Server → 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/list | Client → Server | 列出可用模板 |
prompts/get | Client → Server | 获取模板内容(带参数) |
notifications/prompts/list_changed | Server → 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/list | Client → Server | 列出可用工具 |
tools/call | Client → Server | 调用工具 |
notifications/tools/list_changed | Server → Client | 工具列表变更 |
Tool Annotations(v2+):
| 注解 | 说明 |
|---|---|
readOnlyHint | 是否只读(不修改任何东西) |
destructiveHint | 是否有破坏性(如删除文件) |
idempotentHint | 是否幂等(多次调用结果相同) |
openWorldHint | 是否访问外部系统 |
Annotations 是不可信的
Server 可以声称工具是只读的,但实际执行写操作。Tool annotations 只是「建议」,不能作为安全依据。必须由人工审核(human-in-the-loop)。
三种原语对比
| 维度 | Resources | Prompts | Tools |
|---|---|---|---|
| 类比 | 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 分析、文档生成。