MCP 2026-07-28:不用先办入住
🏨
2026-07-28 的 MCP 像一家不发房卡的旅店:每次来办事,都把自己是谁、会什么、要做什么说清楚。
先记住一句话
以前先握手、记住彼此。
现在每个请求自己带齐资料。
旧版:住店 🛎️
initialize → 领取 Session → 后面一直带着房卡。
新版:办事 ✉️
没有核心 Session。每封信都能独立处理。
一封信带什么?
🤖 Client → ✉️ 版本 + 身份 + 能力 → 🧰 任意 Server 实例
POST /mcp
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: search
{
"method": "tools/call",
"params": {
"name": "search",
"arguments": { "q": "小海獭" },
"_meta": { "...": "Client 身份与能力" }
}
}
Mcp-Method 是什么?
它是信封外面的“办事类型” 🏷️
Mcp-Method 和 Body 里的 method 是同一件事,两边必须一致。网关不用拆信,就知道该把信送去哪里。
| Method | 做什么 |
|---|---|
server/discover |
🔭 先认识这台 Server |
tools/list、tools/call |
🧰 看工具、用工具 |
resources/list、resources/read |
📚 看资源、读资源 |
prompts/list、prompts/get |
💬 看 Prompt、取 Prompt |
这不是一张永远不变的菜单。正式扩展和自定义能力还可以带来更多 Method。
第一次见面怎么办?
答案是:server/discover 🔭
🙋 你支持什么? → 🪪 版本、能力、身份 → 📖 使用说明
它发到已经知道的同一个 /mcp 地址。
它不是用来寻找 MCP URL,而是询问这个 URL 后面的 Server 会什么。
以前的 instructions 去哪了?
| 版本 | 位置 |
|---|---|
| 以前 | initialize.result.instructions |
| 现在 | server/discover.result.instructions |
instructions 是 Server 写给模型的“总说明书”。
每个 Tool 自己的说明,仍然放在 Tool 的 description 和 schema 里。
如果 Client 不调用 Discover,就不会提前拿到这份总说明。不过,知道要调用什么时,Client 仍然可以直接办事。
Discover 要每次都问吗?
不用,它可以给出缓存提示 ⏳
{
"result": {
"supportedVersions": ["2026-07-28"],
"capabilities": {
"tools": {}
},
"instructions": "先搜索,再读取详情",
"ttlMs": 300000,
"cacheScope": "private"
}
}
ttlMs
表示这份回答多久算新鲜。
300000 毫秒就是 5 分钟。
TTL 只是新鲜度提示,不是 Server 保证“5 分钟内绝对不会变化”。
cacheScope
public:内容不因用户而变化,可以共享缓存。private:只能在同一授权上下文中复用,例如绑定同一个 Access Token。
如果不同用户看到的 capabilities 或 instructions 不一样,就应该使用 private。
别和 OAuth 的发现搞混
| 发现方式 | 回答的问题 |
|---|---|
OAuth .well-known 🔑 |
去哪里登录?去哪里换 Token? |
MCP server/discover 🧰 |
支持哪个版本?有哪些能力?怎么使用? |
一个找门卫,一个问工具箱。
为什么要这样改?
- ⚖️ 更容易扩容:请求可以落到任意 Server 实例。
- 🚦 更容易路由:网关从 Header 就能看懂请求。
- 🧊 更容易缓存:列表和发现结果能提示新鲜时间及范围。
- 🧳 更少隐藏状态:处理请求需要的资料跟着请求走。
但要注意:无 Session 不等于无业务状态。
长任务、分页或多轮交互,仍然可以使用明确的 task、cursor、requestState 等句柄。
最后记住三句话
不先办入住。
每封信自带资料。
Discover 是说明书,也能缓存。
参考资料
文中的旅店、房卡和寄信是为了帮助理解的类比,具体协议要求以正式规范为准。

浙公网安备 33010602011771号