Repository navigation
Releases: modelcontextprotocol/typescript-sdk
Release list
2.4.0
| Package | Version |
|---|---|
@modelcontextprotocol/client |
2.4.0 |
@modelcontextprotocol/server |
2.4.0 |
@modelcontextprotocol/core |
2.4.0 |
@modelcontextprotocol/server-legacy |
2.4.0 |
@modelcontextprotocol/codemod |
2.4.0 |
@modelcontextprotocol/node |
2.1.2 |
@modelcontextprotocol/express, hono, fastify |
unchanged |
Upgrade notes
x-mcp-headeron anumberparameter is rejected, as the 2026-07-28 spec requires: the client does not list such a tool, and the server answers a call to it with-32020. Usez.int()or remove the annotation. (#2762, #2960)outputSchemafromz.object(...).meta({ id }). On a 2025-11-25 connection the result is no longer wrapped in{ result }: readstructuredContent, notstructuredContent.result. (#3081)- The bundled Ajv validator uses fast-uri 3.1.8. It rejects a
$idor$refwith an invalid URI scheme, such asmy_tool:output. (#3083)
New
- Skills over MCP (SEP-2640). A server publishes a folder of skills with
loadSkills(folder)andskills.attach(server); a client lists, reads and verifies them withSkillsClient. It works on 2025-11-25 and 2026-07-28.attachis experimental and may change in a minor release. (#3047, #3080) - Opt-in
scopeon token refresh. ImplementscopeForRefresh(tokens)on yourOAuthClientProviderfor an authorization server that rejects a refresh withoutscope(Microsoft Entra ID,AADSTS90009). The default request does not change. (#3085) ServerEventtakes optionalparams, so a gateway can forward change notifications with their_meta. (#3057)- The v1 to v2 upgrade guide is also an installable agent skill. (#2968)
Fixes
update({ title })on a resource or resource template shows up in list responses. (#3005)- A
Serverconnected to a per-request transport at a modern revision binds that revision instead of answering-32022. (#3057) createMcpHandlersendsAllow: POSTon every405. (#3002)@modelcontextprotocol/nodeaccepts@hono/node-server1.x or 2.x; a new install resolves 2.x. (#3084)
1.32.2
What's Changed
- fix: add explicit | undefined to Transport optional properties (v1.x backport of #1766) by @kishormorol in #2814
- [v1.x] fix: allow registering after connect() when the capability was declared by @claude[bot] in #2958
- chore: bump version to 1.32.2 by @claude[bot] in #3089
New Contributors
- @kishormorol made their first contribution in #2814
Full Changelog: 1.32.1...1.32.2
@modelcontextprotocol/server@2.4.0
Minor Changes
-
#3057
c05225aThanks @steipete! -ServerEventtakes optionalparams, which thesubscriptions/listenrouter delivers with its own subscription ID, so a gateway can forward change notifications with their_metaand extension params. -
#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. -
#2960
43c45f4Thanks @claude! - A server whose tool putsx-mcp-headeron anumber-typed parameter keeps checking that tool'sMcp-Param-*headers ontools/call, as 2.3.0 does: a header that is missing for a value in the body, or that disagrees with the body, is answered400with JSON-RPC error-32020. Clients on a 2026-07-28 connection other than stdio no longer list such a tool and send noMcp-Param-*headers for it, so a call that carries a value for a declared parameter is rejected the same way; the server logs a warning each time tools are listed. Use an integer (z.int()) or remove the annotation. -
#3081
5820f79Thanks @claude! - A tooloutputSchemawhose root is a$refto atype: "object"entry of its own$defsordefinitions(what zod writes forz.object({...}).meta({ id })), or a union of such refs, is now treated as an object schema. On 2025-era connections the tool's schema andstructuredContentare no longer wrapped in{ result: ... }, so a 2025-era client that readstructuredContent.resultfor such a tool now readsstructuredContent. On every era the advertised schema gainstype: "object"at its root. -
#3057
c05225aThanks @steipete! - Connecting aServerorMcpServerto aPerRequestHTTPServerTransportclassified at a modern revision thatsupportedProtocolVersionslists and the SDK implements now binds that revision, instead of answering-32022. -
#3005
b381559Thanks @chaeyn! - Reflect resource and resource templateupdate({ title })changes in list responses. Preserve other metadata and individual resource titles when a template supplies list entries. -
#3002
895007fThanks @Hugo-DDT! -createMcpHandlernow sendsAllow: POSTon every405it answers to a non-POST request, withlegacy: 'stateless'(the default) and withlegacy: 'reject'. -
#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/server-legacy@2.4.0
Patch Changes
- Updated dependencies [
46d9c99]:- @modelcontextprotocol/core@2.4.0
@modelcontextprotocol/node@2.1.2
Patch Changes
-
#3084
10c26b0Thanks @claude! - The@hono/node-serverdependency range widens from^1.19.9to^1.19.9 || ^2.1.3, so a new install resolves to 2.x and an install that cannot get 2.x keeps 1.x. -
Updated dependencies [
ef38c67,c05225a,43c45f4,5820f79,c05225a,b381559,46d9c99,895007f,b022522]:- @modelcontextprotocol/server@2.4.0
@modelcontextprotocol/core@2.4.0
Minor Changes
-
#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().
@modelcontextprotocol/codemod@2.4.0
@modelcontextprotocol/codemod@2.4.0
@modelcontextprotocol/client@2.4.0
Minor 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
2.3.1
| Package | Version |
|---|---|
@modelcontextprotocol/client |
2.3.1 |
@modelcontextprotocol/server |
2.3.1 |
@modelcontextprotocol/core |
2.3.1 |
@modelcontextprotocol/server-legacy |
2.3.1 |
@modelcontextprotocol/codemod |
2.3.1 |
@modelcontextprotocol/node, express, hono, fastify |
unchanged |
Changes
requireBearerAuthin@modelcontextprotocol/server-legacytakes the optionalexpectedResourcethat@modelcontextprotocol/server2.3.0 added: it accepts only tokens issued for this server (the token's audience). Off unless you set it. (#2952)- The npm pages of
@modelcontextprotocol/serverand@modelcontextprotocol/clientnow open with one note that links the documentation, the migration guide and the issue form. (#2955)