chore(deps-dev): bump @modelcontextprotocol/client from 2.0.0 to 2.4.0
Bumps @modelcontextprotocol/client from 2.0.0 to 2.4.0.
Release notes
Sourced from @modelcontextprotocol/client's releases.
@modelcontextprotocol/client@2.4.0Minor Changes
#3085
a633756Thanks@claude! - Add an opt-in for sendingscopeon refresh-token requests, for authorization servers that reject a refresh without it (Microsoft Entra ID answersAADSTS90009when the client and the resource are the same app registration, #2718).OAuthClientProvidergains an optionalscopeForRefresh(tokens):auth(), and so the transports andwithOAuth, sends the string it returns.refreshAuthorization()gains an optionalscope. When a scope is sent and the response has none, the sent scope is kept on the returned tokens. Without either option the refresh request and the saved tokens are unchanged.#3047
46d9c99Thanks@KKonstantinov,@tobi-oye,@mattzcarey! - Add the Skills extension (SEP-2640), reachable through newext/skillssubpaths; package root exports are unchanged.
@modelcontextprotocol/server/ext/skills:SkillsExtension(attach(server)servesskills/list,skills/get,resources/directory/readand askill://{+path}resource template),SkillsExtension.load(files)returning aSkillCatalogwithentriesandreload(), theSkillFilesstorage adapter withmemorySkillFiles,SkillSourcefor generated catalogs,skillEntry, andSkillCatalogError. Invalid skills are skipped with a warning (onWarning), or fail understrict. A file whose bytes are valid UTF-8 is served astext, whatever its MIME type; any other file as a base64blob.@modelcontextprotocol/server/ext/skills/node:loadSkills(folder)andnodeSkillFiles(folder).@modelcontextprotocol/client/ext/skills:SkillsClientwithlist()(throws on an invalid entry;skipInvalid: truekeeps the valid ones and returns the rest ininvalid),get(),read(skill, path?)(size, digest andSKILL.mdfrontmatter verified,SkillVerificationErroron a mismatch; a copy from the response cache that fails a check is fetched once more withcacheMode: 'refresh'first) andreadDirectory().@modelcontextprotocol/core/ext/skills: schemas, types and constants, includingSKILL_LIMITS. The result schemas follow the stable spec, sottlMsandcacheScopeare required.
SkillsExtension.attachis@experimental: how an extension is wired to a server may change in a minor release. The rest of the Skills API is stable.Works on 2025-11-25 and 2026-07-28. On 2026-07-28 only, the server sends the caching fields (
ttlMs,cacheScope), andSkillsClientrequires them and returns them fromlist(),get()andreadDirectory().Patch Changes
#3083
ef38c67Thanks@claude! - The bundled Ajv validator is now built with fast-uri 3.1.8 (was 3.1.0). fast-uri 3.1.6 and later reject a$idor$refwhose text before the first colon is not a valid URI scheme (my_tool:output), or whose URN namespace is not valid (urn:my_tool:output): a schema that uses one no longer compiles, and a tool that carries it fails with an invalid-schema error. An underscore without a colon (my_tool_output) and a$refinto#/$defs/...or#/definitions/...are not affected.#2762
b022522Thanks@pcarleton! -x-mcp-headeron anumber-typed tool parameter is now rejected, matching the 2026-07-28 spec ("Parameters with typenumberare not permitted"; clients MUST exclude such tools fromtools/list). Previouslynumberwas accepted only to satisfy an older conformance fixture that has since been corrected.integer,stringandbooleanare unaffected.Updated dependencies [
46d9c99]:
@modelcontextprotocol/core@2.4.0
@modelcontextprotocol/client@2.3.1Patch Changes
- Updated dependencies []:
@modelcontextprotocol/core@2.3.1
@modelcontextprotocol/client@2.3.0Minor Changes
- #2901
433eb41Thanks@claude! - The HTTP client transports and the OAuth client helpers now follow a redirect only when it stays within the origin of the request (same scheme, host and port, or http to https on the same host with default ports) and keeps the method (a 307 or 308, or any redirect of a GET). Any other redirect is not followed. A transport then fails the request with an error that names the target; the session is kept and later messages still send. OAuth metadata discovery moves on to the next well-known URL, and any other OAuth request fails with an error that gives the status. Same-origin redirects that keep the method keep working on Node, up to five in a row, and no code changes are needed there. If your endpoint redirects to another origin, configure the transport with the URL it redirects to. ArequestInit.redirectof'error'or'manual'is passed to fetch as it is for the requests a transport sends to the server (POST, GET and DELETE of the Streamable HTTP transport, POST of the SSE transport); for its OAuth requests, and for any other value,requestInit.redirectis not consulted by default. Browsers do not expose the target of a redirect to a page, so there a redirected request fails instead of being followed. SettingredirectPolicy: 'follow'on a transport leaves its redirects to the fetch implementation, as before this change.Patch Changes
#2599
5238fbaThanks@freya0926! - A server can now serve, and a client can now call,tasks/getandtasks/cancelof the Tasks extension (SEP-2663) on a 2026-07-28 connection, when the handler is registered and the request is sent with an explicit schema. Every other method that a protocol revision removed is still refused. If one server factory serves both eras and such a handler is meant for 2025-era clients only, register it only whenctx.era === 'legacy'.#2846
63c0fcaThanks@Sthreal! - Receiving a large message as a single SSE event over Streamable HTTP, such as a tool result of tens of megabytes, is now fast: a 50 MB result that took about 13 seconds arrives in under a second. The client now requireseventsource-parser3.0.8 or later.SSEClientTransportreads through theeventsourcepackage and gets the same speed-up once that also resolveseventsource-parser3.0.8 or later.#2908
633dd3eThanks@claude! - Thelicensefield of the package manifests is nowApache-2.0; theLICENSEfile shipped in each package carries the full terms, including the MIT text for earlier contributions. No code change.#2903
e765b3bThanks@claude! - WithversionNegotiationin'auto'or pin mode, aserver/discoverprobe answered with a 2xx that carries no usable reply (a body that is not JSON underapplication/json, a bare204, a missing or unaccepted content type) still rejectsconnect()withEraNegotiationFailed; an empty SSE stream or a202surfaces as the probe timeout instead. The message now saysthe server answered with an unusable reply (...)instead of reading like a network failure. To connect to a 2025 server behind a front that answers the probe this way, passconnect(transport, { prior: { kind: 'legacy' } })or usemode: 'legacy'.#2905
c0cd01aThanks@claude! -SSEClientTransportnow retries the SSE connection once afteronUnauthorized()resolves, as documented. If the retry is also answered with 401,start()rejects withSdkHttpError(ClientHttpAuthentication) instead of callingonUnauthorized()again. A 401 on a later reconnect of a stream that had opened still gets one refresh.
... (truncated)
Commits
951fe56Version Packages (#2959)895007ffix(server): set Allow: POST on stateless legacy 405 responses (#3002)28124dbfix(docs): use relative POSIX package entry globs (#3016)f7289b3docs: say that a spec handler's params drop members the spec does not define ...a633756feat(client): add an opt-in for sending scope on token refresh (#3085)10c26b0chore(node): accept@hono/node-server1.x or 2.x (#3084)ef38c67chore(deps): build the bundled ajv with fast-uri 3.1.8 (#3083)5820f79fix(server): treat an outputSchema root $ref to an object definition as an ob...a513cfedocs: close the v1 to v2 quick path with the 2026-07-28 serving decision (#3086)c822443docs(server): mark SkillsExtension.attach as experimental (#3080)- Additional commits viewable in compare view
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore this major versionwill close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this minor versionwill close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this dependencywill close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Summary by cubic
Bumps the @modelcontextprotocol/client dev dependency from 2.0.0 to 2.4.0, with no code changes needed — only package.json and pnpm-lock.yaml update.
- Transports only follow same-origin redirects that keep the method; cross-origin redirects now fail the request.
- The bundled Ajv validator now rejects schemas whose
$id/$refuses an invalid URI scheme. x-mcp-headeronnumber-typed tool parameters is rejected.- Large single SSE events over Streamable HTTP now arrive much faster.
- The update pulls in
@modelcontextprotocol/core2.4.0,jose6.2.13, andzod4.6.5.