MCP 协议发布了最新的 2025-11-25 版本。在新的协议版本中,增加了新的试验性功能“任务”。提供了对 url 模式的 Elicitation 的支持。在进行取样时,增加对工具调用的支持。在认证方面也有一些改进。还有一些比较小的改动。
下面具体介绍一下这些改动。
01
任务
任务是 MCP 协议新增的试验性功能。在 MCP 协议中,客户端和服务器之间使用的是请求 - 响应的模式。对于处理比较耗时的请求,请求方必须一直等待接收方的响应,直到处理完成或超时。任务提供了一种新的解决方案。请求方可以要求处理方创建一个任务来处理请求,请求方会得到该任务的 id。请求方通过这个 id 可以查询任务的状态,并获取任务的结果。
任务的出现,为 MCP 协议中的客户端和服务器之间增加了一种新的交互模式,不再是完全的同步调用,也可以异步完成。
MCP 协议中的任务功能,设计的出发点是由请求方来主导。请求方创建任务之后,根据任务的 id 来查询状态和获取结果。查询任务状态的频率,以及获取结果的时间点,由请求方来决定。
目前有 3 种请求支持创建任务,分别是服务器端的工具调用、客户端的取样和 Elicitation。下面是使用任务的基本流程。
对于支持任务的请求,添加 task 字段来创建任务。属性 ttl 表示任务信息的保存时间。对于超过保存时间的任务,接收方会进行清理。
接收方返回一个 Task 对象,其中包含了任务的 id。请求方使用 tasks/get 方法来查询任务的状态。当任务完成之后,请求方使用 tasks/result 方法来获取任务的结果。tasks/result 是一个同步方法,会等待任务完成。
02
Elicitation
在 Elicitation 方面,有两个较大的改动。第一个是对 url 模式 elicitation 的支持,第二个是改进了 ElicitRequest 中枚举类型的 schema。
在之前的协议版本中,服务器发送的 elicit 请求中,包含了期望客户端提供的数据的格式。根据数据的格式,客户端展示界面给用户。等用户完成输入之后,客户端把输入结果返回给服务器。在新的协议版本中,这种请求模式被称为 form 模式,也就是表单模式。
除了 form 模式之外,新增了一种 url 模式。服务器会提供一个 url,客户端打开浏览器并访问该 url。用户在打开的网页中完成数据的输入。数据的传输不经过 MCP 客户端。新的 url 模式解决了敏感数据的传输问题。API Key、密码和私钥这样的敏感数据,通过 MCP 客户端来传输可能存在一些安全隐患。url 模式提供了一种更安全的方式来传输这些信息。
在 ElicitRequest 中,如果是表单模式,会在请求中包含数据的 schema。在之前的版本中,表单 schema 使用的是自定义的格式。在新版本中,schema 统一改成使用 JSON schema 2020-12 规范。
对枚举类型 EnumSchema 做了增强,除了保留之前版本的格式之外,增加了单选和多选两种模式,方便 MCP 客户端选择合适的 UI 控件来展示。对于单选和多选模式,又各自分成带标题和不带标题两种。
下面的代码展示了带标题的多选模式的 EnumSchema。items 中包含了全部的备选项。anyOf 表示为多选,单选用的是 oneOf。const 表示枚举项的值,title 表示标题,用于界面展示。minItems 和 maxItems 分别表示选择项的最小和最大数量。
{ "type": "array", "title": "颜色选择", "description": "选择你喜欢的颜色", "minItems": 1, "maxItems": 2, "items": { "anyOf": [ { "const": "#FF0000", "title": "红" }, { "const": "#00FF00", "title": "绿" }, { "const": "#0000FF", "title": "蓝" } ] }, "default": ["#FF0000", "#00FF00"]}03
取样请求中的工具调用
对于取样功能,取样请求中可以包含工具的定义,从而允许大模型使用工具来完成取样请求。这一改进是很自然的,因为大模型本来就支持对工具的调用。在取样请求中,使用 tools 表示可供使用的工具,toolChoice 表示工具调用的模式。模式有 auto、required 和 none 三种。
auto 是默认值,表示由大模型自主选择所调用的工具。
required 表示大模型必须调用所提供的工具。
none 则表示不允许大模型调用任何工具。
在经过用户的审核之后,取样请求被发送给大模型。大模型则返回需要调用的工具和相应的参数。大模型的返回结果,由用户进行审核。审核通过之后,工具的调用信息被返回给服务器,由服务器完成工具的实际调用。工具的调用结果和消息的历史记录,被发送回客户端。经过用户审核之后,再发送给大模型,完成最后的生成。生成的结果,经过用户的审核之后,发送回服务器,完成整个取样的流程。
从上述描述可以看出来,这个过程实际上就是 AI 应用在与大模型交互时,工具调用的标准实现流程。只不过在取样的实现中,有 MCP 服务器、客户端和用户这 3 个实体的参加。整个过程被划分成了若干个阶段,每个阶段都需要用户的审核。整个过程也变得更加复杂和冗长。
04
认证机制
新版本对服务器的认证也做了较大的修改。主要有如下几个部分。
在服务器的认证方面,为了方便客户端发现服务器的认证机制,MCP 协议之前仅提供了对 OAuth 2.0 Authorization Server Metadata 的支持。新版本中增加了对 OpenID Connect Discovery 1.0 的支持。服务器可以任选一种方式来实现。MCP 客户端会首先尝试使用 OAuth 2.0 Authorization Server Metadata,再尝试使用 OpenID Connect Discovery 1.0。
如果服务器地址中包含了路径,比如,对于服务器的地址: https://auth.example.com/tenant1, MCP客户端应该依次尝试访问如下地址:
https://auth.example.com/.well-known/oauth-authorization-server/tenant1
https://auth.example.com/.well-known/openid-configuration/tenant1
https://auth.example.com/tenant1/.well-known/openid-configuration
如果服务器地址中不包含路径,比如,对于服务器的地址:https://auth.example.com,MCP客户端应该依次尝试访问如下地址:
https://auth.example.com/.well-known/oauth-authorization-server
https://auth.example.com/.well-known/openid-configuration
当客户端进行认证时,需要提供请求的 scope。MCP 服务器会在 401 响应的 WWW-Authenticate 头中添加 scope 参数,指定客户端在请求时应该使用的 scope。如下面的代码所示。
HTTP/1.1 401 UnauthorizedWWW-Authenticate: Bearer resource_metadata="https://mcp.example.com/.well-known/oauth-protected-resource", scope="files:read"如果服务器没有提供该 scope,客户端应该使用服务器的 Protected Resource Metadata 中定义的 scopes_supported 中包含的全部 scope。如果服务器没有提供 scopes_supported,则省略 scope 参数。
对于 MCP 客户端在认证时的注册机制进行了重新的规范。新版本中声明了对 3 种客户端注册机制的支持。
第一种是动态客户端注册,使用的是 OAuth 2.0 Dynamic Client Registration Protocol,这也是早期版本的 MCP 规范中支持的注册机制。
第二种是新版本中增加的 OAuth Client ID Metadata Documents。客户端使用 HTTPS URL 作为标识符,URL 所指向的 JSON 文档中包含了客户端的元数据。
第三种是使用预先注册好的客户端信息。
如果客户端支持这 3 种机制,它们之间的优先级顺序依次为:预先注册的客户端信息、OAuth Client ID Metadata Documents 和 Dynamic Client Registration。
05
其他改动
除了上述几个较大的改动之外,还有一些小的改动。
为 MCP 实现、资源、提示模板和工具增加更多的元数据。新的类型 Icon 描述图标。可以指定图标的 src,mimeType,sizes 和 theme。图标的作用是方便界面的展示。
MCP 实现中增加了额外的属性 description、icons 和 websiteUrl,分别表示 MCP实现的描述、图标和网址。
资源、提示模板和工具增加了 icons 属性,表示图标。
MCP 协议对工具的名称进行了规范。工具的名称应该满足如下要求:
长度是 1 到 128 个字符。
工具名称是大小写敏感的。
工具名称仅包含这些字符:大小写 ASCII 字母、数字、下划线、短横线和点。
工具名称中不能包含空格、逗号和其他特殊字符。
服务器中提供的工具的名称是唯一的。
新的 MCP 协议发布之后,不同语言的 SDK 需要一段时间来完成对新版本的支持。等到 SDK 提供了对新版本的支持,就可以在应用中使用这些新功能。