三种原语:工具、资源与提示词
服务器对外暴露的能力被归纳为三种原语:工具(Tools)、资源(Resources)、提示词(Prompts)。它们回答同一个问题——"模型需要什么",但触发方式与控制权完全不同,本节先给总览,再各配最小 JSON 示例。
三原语总览
| 原语 | 是什么 | 谁触发 | 控制权 |
|---|---|---|---|
| Tools 工具 | 可执行的动作(写文件、发请求) | 模型按用户意图自主调用 | 需要用户授权语境 |
| Resources 资源 | 可读的数据/文档(文件、日志) | 客户端按需读取注入 | application-controlled,由应用决定 |
| Prompts 提示词 | 可复用模板/工作流入口 | 用户主动选择 | 用户启动,客户端组装 |
一句话记忆:工具让模型"做事",资源给模型"喂料",提示词替用户"起手"。
Tools:模型可执行的"手"
服务器用 tools/list 声明工具,模型端到端调用走 tools/call:
{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}
{"jsonrpc": "2.0", "id": 1, "result": {"tools": [
{"name": "get_weather", "description": "查询城市天气",
"inputSchema": {"type": "object", "properties": {"city": {"type": "string"}}}}]}}
{"jsonrpc": "2.0", "id": 2, "method": "tools/call",
"params": {"name": "get_weather", "arguments": {"city": "上海"}}}
Resources:给模型"喂"的上下文
资源用 URI 寻址(如 file:///、log://),先列后读:
{"jsonrpc": "2.0", "id": 3, "method": "resources/list"}
{"jsonrpc": "2.0", "id": 4, "method": "resources/read",
"params": {"uri": "file:///logs/app.log"}}
{"jsonrpc": "2.0", "id": 4, "result": {"contents": [
{"uri": "file:///logs/app.log", "mimeType": "text/plain",
"text": "2026-01-01 10:00 启动成功"}]}}
资源不会自动进上下文:由客户端判断"这次任务要不要读",读完把内容注入对话。
Prompts:给用户的工作流入口
提示词先列后取,客户端把取回的模板消息拼进对话:
{"jsonrpc": "2.0", "id": 5, "method": "prompts/get",
"params": {"name": "code-review", "arguments": {"language": "python"}}}
{"jsonrpc": "2.0", "id": 5, "result": {"messages": [
{"role": "user", "content": {"type": "text",
"text": "请以资深工程师身份审查下面代码……"}}]}}
原语与宿主、模型的分工
- 模型自己"看见"并主动使用的,主要是工具与已注入的资源文本;
- 资源是否读取、何时读取由宿主/客户端控制,模型不能越权直接读;
- 提示词由用户挑选触发,客户端负责把结果消息与真实任务上下文合并。 选型建议:会改变外部世界的用工具,静态信息用资源,重复操作沉淀成提示词。
小结
Tools 做事、Resources 喂料、Prompts 起手,三者合起来覆盖"模型需要什么"的全部入口。下一章讲一次连接从建立到关闭的生命周期与初始化握手。