
2026 年 7 月 28 日,MCP 正式发布 2026-07-28 版规范。最核心的变化,是将协议核心从“依赖长连接和会话的双向有状态模式”,调整为“每次请求都可独立处理的无状态请求/响应模式”。这让 MCP 更接近 PHP 开发者熟悉的 Web 请求生命周期,也让使用 PHP 构建、部署和扩展 MCP Server 变得更加自然。
最近,Laravel MCP 核心维护者 Marcel Pociot 分享了一条颇有意思的观点:
MCP 协议变成了请求/响应模型,这会让使用 PHP,尤其是 Laravel,构建 MCP Server 变得更容易。
这句话点出了新版 MCP 与 PHP 的天然契合点。
无论是经典的 PHP-FPM,还是 Laravel、Symfony,以及常驻内存的 Webman、Workerman、Swoole、OpenSwoole 和 RoadRunner,PHP 生态都已经具备成熟的 HTTP 请求处理能力。
乍看之下,这似乎只是一次通信方式调整。但对真正部署过远程 MCP Server 的 PHP 开发者来说,它解决的是协议适配、扩容、负载均衡、容错和 Serverless 部署中的一系列实际问题。
按照 MCP 官方的说法,这是该协议自发布以来规模最大的一次修订。
在此前的 Streamable HTTP 模式中,客户端不能直接调用工具,而是要先完成初始化握手:
客户端
│
├─ initialize
│
├─ notifications/initialized
│
└─ tools/call(携带 Mcp-Session-Id)
服务器在初始化后返回 Mcp-Session-Id,客户端后续请求必须继续携带这个会话标识。
这意味着服务端需要知道:
单机运行时,这些问题并不明显。一旦进入生产环境,情况就复杂了:
换句话说,旧版 MCP 的能力很强,但协议层对“连接”和“会话”的依赖,让远程 MCP Server 不太像一个普通 Web 服务。
在 2026-07-28 规范中,MCP 正式将协议核心改为无状态模型:
客户端
│
└─ tools/call(请求中包含版本、能力及客户端信息)
│
├─ 实例 A 可以处理
├─ 实例 B 可以处理
└─ 实例 C 也可以处理
每次请求都带有处理它所需要的协议上下文,服务端不能依赖此前请求中隐含的协议状态。于是,任意一个兼容的 MCP Server 实例都可以接管当前请求。
官方示例中的一次工具调用大致变成这样:
POST /mcp HTTP/1.1
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: search
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search",
"arguments": {
"q": "PHP MCP Server"
},
"_meta": {
"io.modelcontextprotocol/clientInfo": {
"name": "my-app",
"version": "1.0"
}
}
}
}
请注意,MCP 仍然使用 JSON-RPC 2.0,并没有退化成随意设计的普通 REST API。变化发生在协议的状态管理和传输方式上。
新版规范主要移除了三项协议级机制:
旧版的 initialize 和 notifications/initialized 流程被取消。
协议版本、客户端能力和客户端信息改为随请求传递。客户端如果希望在正式调用前了解服务器支持的版本和能力,可以调用新的 server/discover 方法。
Streamable HTTP 不再使用 Mcp-Session-Id。服务器也不应通过连接或此前的调用推断当前请求的处理上下文。
这让请求可以被普通的轮询负载均衡器分发到任意实例,不再天然依赖粘性会话或共享 Session 存储。
过去,一些“服务端反过来向客户端提问”的能力依赖持续打开的双向通道。新版通过 Multi Round-Trip Requests,也就是 MRTR,重新组织这类交互。
例如,一个工具执行到一半需要用户补充参数时,可以返回 InputRequiredResult;客户端收集答案后,再携带补充信息重新发起请求。整个过程不再要求一直占用一条长连接。
这是本次升级最容易被误解的地方。
MCP 无状态,指的是“协议层无状态”,不是要求应用本身不能有状态。
购物车、审批流程、AI 任务、文件处理进度以及多步骤业务流程,仍然可以保存到:
区别在于,状态必须显式存在于应用数据模型中。例如服务器可以返回一个 task_id、workflow_id 或状态句柄,客户端后续再将它作为普通工具参数传回来。
这种设计实际上更加清晰:
协议状态:由 MCP 请求本身完整携带
业务状态:由应用通过明确的 ID 持久化
它避免了把重要业务流程偷偷绑定在某个连接、某台服务器或某段易丢失的内存 Session 上。
PHP 最经典、最成熟的运行模型,就是一次请求对应一次完整的应用生命周期:
HTTP 请求进入
↓
Nginx / Apache / 网关
↓
PHP-FPM 或 PHP 应用服务器
↓
路由、中间件、认证与授权
↓
调用 MCP Tool / Resource / Prompt
↓
返回 MCP 响应
处理结束后,请求级变量自然释放;需要长期保存的数据则显式写入 MySQL、Redis、文件、队列或其他持久化设施。
而新版 MCP 的设计恰好遵循同一种思路:每次请求带齐协议版本、客户端能力和调用参数,任意兼容的服务实例都可以独立完成处理。
过去为了实现 MCP Server,PHP 开发者往往要额外处理初始化握手、协议 Session、长连接以及跨请求上下文。这些机制并非 PHP 不能实现,但会迫使传统 PHP 项目偏离已经非常成熟的请求/响应模型。
协议核心无状态化之后,PHP 不再需要为了适配 MCP 而刻意变成一个长期维护连接状态的服务。它可以继续发挥自己最擅长的部分:接收请求、执行业务、访问数据库,然后返回结果。
PHP-FPM 的 Worker 可以独立处理请求,应用无需在进程内保存 MCP 会话。一个请求落到哪个 Worker,原则上不再影响协议正确性。
这对已有 PHP 项目尤其重要:开发者可以把 MCP Server 看作现有业务系统新增的一组 AI 能力入口,而不是重新维护一套独立的常驻连接服务。
例如,一个电商系统可以直接把已有能力包装为 MCP Tools:
底层仍然复用原有 Service、Repository、ORM、权限控制和审计日志。
以 Laravel MCP 为例,一个远程 MCP Server 可以继续按照熟悉的路由方式注册:
use App\Mcp\Servers\OrderServer;
use Laravel\Mcp\Facades\Mcp;
Mcp::web('/mcp/orders', OrderServer::class)
->middleware(['auth', 'throttle:mcp']);
Laravel 的路由、中间件、认证、授权、限流、验证、日志、缓存、队列和异常处理,都可以参与 MCP 请求生命周期。
Symfony、Slim、Hyperf 等框架也可以采用类似思路:协议适配层负责解析和输出 MCP 消息,业务逻辑继续由框架已有的 Controller、Service、事件和消息系统承载。
无状态 MCP 并不意味着常驻内存 PHP 框架失去价值。
Webman、Workerman、Swoole、OpenSwoole、RoadRunner 等运行模式仍然适合:
变化在于,开发者不再被迫把“协议会话状态”绑定到某个 Worker。即使采用常驻内存架构,也应尽量让请求能够被任意 Worker 独立处理;真正需要跨调用的数据,则通过显式 ID 和持久化存储传递。
同一个 PHP MCP Server 可以部署多个实例,通过普通轮询策略分发请求。理论上不再需要因为 MCP 协议 Session 而将某个客户端固定到同一台服务器或同一个 Worker。
无状态请求适合短生命周期计算环境。PHP 实例启动、回收、重启或迁移,不再直接破坏某个隐式协议会话。
这让 PHP MCP Server 更容易部署到:
Mcp-Method 与 Mcp-Name HTTP Header 让 API Gateway 或反向代理可以在不解析 JSON 请求体的情况下,根据 MCP 方法名和工具名执行:
例如,可以对查询类工具和写入类工具应用不同的权限与限流策略。
每次请求都携带足够的协议上下文,日志与 Trace 不再必须拼接一整段连接历史,才能解释一次工具调用。
对 PHP 开发者而言,这正是熟悉的“一次请求对应一条完整处理链路”。
不会,但部分能力被重新安排了位置。
新版 MCP 并非只能进行“一问一答”:
subscriptions/listen 订阅;因此,更准确的描述不是“MCP 取消了双向能力”,而是:
MCP 不再把长期双向连接和隐式 Session 作为协议核心的默认前提,而是把多轮交互、订阅和长任务拆分成更明确的机制。
2026-07-28 不只是传输层升级,还包括:
server/discover,用于发现服务器版本、能力和身份;Mcp-Method 和 Mcp-Name HTTP Header;由于此次升级包含破坏性变化,旧版客户端和服务端不能仅凭“都是 MCP”就假设可以直接互通。升级时需要同步检查 SDK 版本、协议版本、废弃能力以及客户端支持情况。
如果你的 MCP Server 仍处于开发阶段,可以优先关注:
2026-07-28;initialize、Mcp-Session-Id 或连接级状态;如果项目使用 Laravel,还应检查 laravel/mcp 的版本与迁移说明;如果使用其他 PHP SDK,则需要确认其实现的是最终版 2026-07-28 规范,而不只是此前各家行为不一致的“stateless”配置。
生产项目不建议只修改协议版本字符串就直接上线。更稳妥的方式是先建立兼容性测试,分别验证:
早期 MCP 更像一个强调“客户端与服务器持续连接”的智能体协议;而 2026-07-28 版本开始明显吸收成熟 Web 架构的经验:
这次升级不会让 MCP 变成普通 REST API,但它确实让 MCP Server 更像一种能够运行在标准 HTTP 基础设施上的现代服务。
对 PHP 开发者来说,最大的意义也正在这里:未来构建 MCP Server,不必先围绕长连接和协议 Session 重新设计一套运行模型,而是可以更自然地复用 PHP 生态已经成熟的 HTTP 生命周期、框架路由、中间件、认证、数据库、缓存、队列和持久化能力。
PHP-FPM 可以继续发挥简单、稳定和易部署的优势;Webman、Workerman、Swoole、OpenSwoole 和 RoadRunner 则可以在无状态协议之上进一步提供常驻内存、连接复用、异步 I/O 与高并发能力。
MCP 正在从“能连接 AI 与工具”,进一步走向“能够可靠地承载生产级 AI 工具生态”。