Skip to content

Version Packages - #2959

Merged
felixweinberger merged 1 commit into
mainfrom
changeset-release/main
Oct 23, 2026
Merged

felixweinberger merged 1 commit into
mainfrom
changeset-release/main

Conversation

@github-actions

@github-actions github-actions Bot commented Oct 5, 2026 •

Copy link
Copy Markdown
Contributor

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and publish to npm yourself or setup this action to publish automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

@modelcontextprotocol/client@2.4.0

Minor Changes

  • #3085 a633756 Thanks @claude! - Add an opt-in for sending scope on refresh-token requests, for authorization servers that reject a refresh without it (Microsoft Entra ID answers AADSTS90009 when the client and the resource are the same app registration, [v2] Incompatibility with refresh_tokens from Azure when client_id=resource_id #2718). OAuthClientProvider gains an optional scopeForRefresh(tokens): auth(), and so the transports and withOAuth, sends the string it returns. refreshAuthorization() gains an optional scope. 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 46d9c99 Thanks @KKonstantinov, @tobi-oye, @mattzcarey! - Add the Skills extension (SEP-2640), reachable through new ext/skills subpaths; package root exports are unchanged.

    • @modelcontextprotocol/server/ext/skills: SkillsExtension (attach(server) serves skills/list, skills/get, resources/directory/read and a skill://{+path} resource template), SkillsExtension.load(files) returning a SkillCatalog with entries and reload(), the SkillFiles storage adapter with memorySkillFiles, SkillSource for generated catalogs, skillEntry, and SkillCatalogError. Invalid skills are skipped with a warning (onWarning), or fail under strict. A file whose bytes are valid UTF-8 is served as text, whatever its MIME type; any other file as a base64 blob.
    • @modelcontextprotocol/server/ext/skills/node: loadSkills(folder) and nodeSkillFiles(folder).
    • @modelcontextprotocol/client/ext/skills: SkillsClient with list() (throws on an invalid entry; skipInvalid: true keeps the valid ones and returns the rest in invalid), get(), read(skill, path?) (size, digest and SKILL.md frontmatter verified, SkillVerificationError on a mismatch; a copy from the response cache that fails a check is fetched once more with cacheMode: 'refresh' first) and readDirectory().
    • @modelcontextprotocol/core/ext/skills: schemas, types and constants, including SKILL_LIMITS. The result schemas follow the stable spec, so ttlMs and cacheScope are required.

    SkillsExtension.attach is @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), and SkillsClient requires them and returns them from list(), get() and readDirectory().

Patch Changes

  • #3083 ef38c67 Thanks @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 $id or $ref whose 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 $ref into #/$defs/... or #/definitions/... are not affected.

  • #2762 b022522 Thanks @pcarleton! - x-mcp-header on a number-typed tool parameter is now rejected, matching the 2026-07-28 spec ("Parameters with type number are not permitted"; clients MUST exclude such tools from tools/list). Previously number was accepted only to satisfy an older conformance fixture that has since been corrected. integer, string and boolean are unaffected.

  • Updated dependencies [46d9c99]:

    • @modelcontextprotocol/core@2.4.0

@modelcontextprotocol/core@2.4.0

Minor Changes

  • #3047 46d9c99 Thanks @KKonstantinov, @tobi-oye, @mattzcarey! - Add the Skills extension (SEP-2640), reachable through new ext/skills subpaths; package root exports are unchanged.

    • @modelcontextprotocol/server/ext/skills: SkillsExtension (attach(server) serves skills/list, skills/get, resources/directory/read and a skill://{+path} resource template), SkillsExtension.load(files) returning a SkillCatalog with entries and reload(), the SkillFiles storage adapter with memorySkillFiles, SkillSource for generated catalogs, skillEntry, and SkillCatalogError. Invalid skills are skipped with a warning (onWarning), or fail under strict. A file whose bytes are valid UTF-8 is served as text, whatever its MIME type; any other file as a base64 blob.
    • @modelcontextprotocol/server/ext/skills/node: loadSkills(folder) and nodeSkillFiles(folder).
    • @modelcontextprotocol/client/ext/skills: SkillsClient with list() (throws on an invalid entry; skipInvalid: true keeps the valid ones and returns the rest in invalid), get(), read(skill, path?) (size, digest and SKILL.md frontmatter verified, SkillVerificationError on a mismatch; a copy from the response cache that fails a check is fetched once more with cacheMode: 'refresh' first) and readDirectory().
    • @modelcontextprotocol/core/ext/skills: schemas, types and constants, including SKILL_LIMITS. The result schemas follow the stable spec, so ttlMs and cacheScope are required.

    SkillsExtension.attach is @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), and SkillsClient requires them and returns them from list(), get() and readDirectory().

@modelcontextprotocol/server@2.4.0

Minor Changes

  • #3057 c05225a Thanks @steipete! - ServerEvent takes optional params, which the subscriptions/listen router delivers with its own subscription ID, so a gateway can forward change notifications with their _meta and extension params.

  • #3047 46d9c99 Thanks @KKonstantinov, @tobi-oye, @mattzcarey! - Add the Skills extension (SEP-2640), reachable through new ext/skills subpaths; package root exports are unchanged.

    • @modelcontextprotocol/server/ext/skills: SkillsExtension (attach(server) serves skills/list, skills/get, resources/directory/read and a skill://{+path} resource template), SkillsExtension.load(files) returning a SkillCatalog with entries and reload(), the SkillFiles storage adapter with memorySkillFiles, SkillSource for generated catalogs, skillEntry, and SkillCatalogError. Invalid skills are skipped with a warning (onWarning), or fail under strict. A file whose bytes are valid UTF-8 is served as text, whatever its MIME type; any other file as a base64 blob.
    • @modelcontextprotocol/server/ext/skills/node: loadSkills(folder) and nodeSkillFiles(folder).
    • @modelcontextprotocol/client/ext/skills: SkillsClient with list() (throws on an invalid entry; skipInvalid: true keeps the valid ones and returns the rest in invalid), get(), read(skill, path?) (size, digest and SKILL.md frontmatter verified, SkillVerificationError on a mismatch; a copy from the response cache that fails a check is fetched once more with cacheMode: 'refresh' first) and readDirectory().
    • @modelcontextprotocol/core/ext/skills: schemas, types and constants, including SKILL_LIMITS. The result schemas follow the stable spec, so ttlMs and cacheScope are required.

    SkillsExtension.attach is @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), and SkillsClient requires them and returns them from list(), get() and readDirectory().

Patch Changes

  • #3083 ef38c67 Thanks @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 $id or $ref whose 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 $ref into #/$defs/... or #/definitions/... are not affected.

  • #2960 43c45f4 Thanks @claude! - A server whose tool puts x-mcp-header on a number-typed parameter keeps checking that tool's Mcp-Param-* headers on tools/call, as 2.3.0 does: a header that is missing for a value in the body, or that disagrees with the body, is answered 400 with JSON-RPC error -32020. Clients on a 2026-07-28 connection other than stdio no longer list such a tool and send no Mcp-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 5820f79 Thanks @claude! - A tool outputSchema whose root is a $ref to a type: "object" entry of its own $defs or definitions (what zod writes for z.object({...}).meta({ id })), or a union of such refs, is now treated as an object schema. On 2025-era connections the tool's schema and structuredContent are no longer wrapped in { result: ... }, so a 2025-era client that read structuredContent.result for such a tool now reads structuredContent. On every era the advertised schema gains type: "object" at its root.

  • #3057 c05225a Thanks @steipete! - Connecting a Server or McpServer to a PerRequestHTTPServerTransport classified at a modern revision that supportedProtocolVersions lists and the SDK implements now binds that revision, instead of answering -32022.

  • #3005 b381559 Thanks @chaeyn! - Reflect resource and resource template update({ title }) changes in list responses. Preserve other metadata and individual resource titles when a template supplies list entries.

  • #3002 895007f Thanks @Hugo-DDT! - createMcpHandler now sends Allow: POST on every 405 it answers to a non-POST request, with legacy: 'stateless' (the default) and with legacy: 'reject'.

  • #2762 b022522 Thanks @pcarleton! - x-mcp-header on a number-typed tool parameter is now rejected, matching the 2026-07-28 spec ("Parameters with type number are not permitted"; clients MUST exclude such tools from tools/list). Previously number was accepted only to satisfy an older conformance fixture that has since been corrected. integer, string and boolean are unaffected.

  • Updated dependencies [46d9c99]:

    • @modelcontextprotocol/core@2.4.0

@modelcontextprotocol/node@2.1.2

Patch Changes

@modelcontextprotocol/server-legacy@2.4.0

Patch Changes

  • Updated dependencies [46d9c99]:
    • @modelcontextprotocol/core@2.4.0

@modelcontextprotocol/codemod@2.4.0

@modelcontextprotocol/core-internal@2.0.5

Patch Changes

  • #2762 b022522 Thanks @pcarleton! - x-mcp-header on a number-typed tool parameter is now rejected, matching the 2026-07-28 spec ("Parameters with type number are not permitted"; clients MUST exclude such tools from tools/list). Previously number was accepted only to satisfy an older conformance fixture that has since been corrected. integer, string and boolean are unaffected.

  • Updated dependencies [46d9c99]:

    • @modelcontextprotocol/core@2.4.0

@github-actions
github-actions Bot requested a review from a team as a code owner October 5, 2026 14:40

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nothing blocking. The comments below are optional suggestions. There is no need to push a fix for them before merging.

Beyond the inline note, I also checked the empty core and codemod 2.3.2 entries and the lockstep bump of all five public packages — that is the expected output of the fixed group in .changeset/config.json, not a stray changeset. Inter-package dependencies all use workspace:* / workspace:^, so the version bumps leave no range to drift.

Extended reasoning...

Automated Version Packages commit: deletes one changeset and bumps versions plus CHANGELOG entries across six packages, with no source changes and no security-sensitive surface. The lockstep bump and empty headings follow from the fixed-group config, and workspace protocol dependencies make the bump self-consistent; the only open point is the inline changelog-wording finding.

Comment thread packages/server/CHANGELOG.md
@claude claude Bot added the v2 Ideas, requests and plans for v2 of the SDK which will incorporate major changes and fixes label Oct 6, 2026
@github-actions
github-actions Bot force-pushed the changeset-release/main branch from e1e7024 to 229ad5c Compare October 12, 2026 09:55

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — mechanical Changesets release commit, now also carrying the #3005 entry since the last push.

What was reviewed:

  • Both consumed changesets match the generated CHANGELOG entries verbatim, and the #3005 entry's commit link points at the actual merge commit (b381559).
  • Version bumps follow .changeset/config.json: the fixed group (core, client, server, server-legacy, codemod) moves together to 2.3.2, so core and codemod correctly get empty headings; core-internal is outside the group and goes 2.0.4 -> 2.0.5 on its own changeset.
  • Inter-package ranges are all workspace:* / workspace:^, so no range edits were needed; core-internal does depend on core, so its "Updated dependencies" line is accurate. Middleware packages reference server only as peer/dev deps with ^, which stays in range for a patch bump, matching onlyUpdatePeerDependentsWhenOutOfRange and the previous release commit (fcef852).
Extended reasoning...

The diff is the github-actions Version Packages commit: it deletes two changeset files, bumps version fields in six package.json files (five fixed-group packages 2.3.1 -> 2.3.2, private core-internal 2.0.4 -> 2.0.5) and prepends generated CHANGELOG entries; no source code changes and no security-sensitive surface. The file set and structure are identical to the prior release commit fcef852, and the version/dependency bookkeeping was checked against .changeset/config.json and each package's dependency declarations. The only open thread is my own earlier optional nit on the server changelog wording, which remains unchanged text and does not affect correctness of the release mechanics; the bug hunt ran dry with no new findings.

Still open from earlier reviews (1):

  • Unresolved: 1 minor or pre-existing.

@github-actions
github-actions Bot force-pushed the changeset-release/main branch from 229ad5c to d85acb7 Compare October 12, 2026 16:12

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I reviewed the updated Version Packages PR and found no bugs; since this is the release commit and every path is CODEOWNER-owned, a maintainer should still decide when to merge and publish.

What was reviewed:

  • The three consumed changesets against the new CHANGELOG sections — each entry is a verbatim copy, and the package lists match which CHANGELOGs received entries.
  • The 2.3.2 bump across core, client, server, server-legacy and codemod matches the fixed group in .changeset/config.json; core-internal moves to 2.0.5 on its own changeset. Middleware packages are correctly untouched (workspace:^ peers, onlyUpdatePeerDependentsWhenOutOfRange).
  • The new #2960 entry in packages/server/CHANGELOG.md against commit 43c45f4: the scanner now returns declarations for a number-only fault and createMcpHandler.ts keeps validating Mcp-Param-* for that tool, so the entry describes what the server does.
Extended reasoning...

The commit is Changesets output only: three changeset files deleted, six package.json version bumps, and six CHANGELOG.md additions, with no source changes. It touches no auth, injection or data-exposure surface. The version bumps follow the fixed-group configuration and all internal dependencies use the workspace: protocol, so ranges resolve. Since my prior review, commit 43c45f4 added the #2960 changeset whose text now states the server-side behavior accurately, which is what the earlier inline nit asked for. The .github/CODEOWNERS file assigns every path to a team, and a release PR is merged by a maintainer by design, so defer rather than approve.

@github-actions
github-actions Bot force-pushed the changeset-release/main branch from d85acb7 to 1f40998 Compare October 13, 2026 12:13
@github-actions
github-actions Bot force-pushed the changeset-release/main branch from 1f40998 to 29d0812 Compare October 20, 2026 14:33

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I reviewed the regenerated 2.4.0 release commit and found no bugs; since merging this is what publishes the Skills extension as a minor release, a maintainer's look is still worthwhile before merging.

What was reviewed:

  • Each CHANGELOG entry against the changeset it consumed — the text is reproduced verbatim, and the four linked commits (46d9c99, 43c45f4, b381559, b022522) exist with matching PR numbers.
  • Bump levels — core/client/server/server-legacy/codemod all go to 2.4.0 because they form the fixed group in .changeset/config.json; core-internal is outside it and gets the 2.0.5 patch.
  • The ext/skills and ext/skills/node subpaths named in the Skills entry are exported by the core, client and server package.json files at this commit.
Extended reasoning...

The commit is the changesets "Version Packages" output: it deletes four pending .changeset files, appends their text to six packages' CHANGELOG.md, and bumps package.json versions (five public packages 2.3.1 -> 2.4.0, private core-internal 2.0.4 -> 2.0.5). No source code changes, so no security-sensitive surface is touched. The changelog prose matches the changeset sources exactly, the commit links resolve, and the bump levels follow from the fixed group configuration. Deferring rather than approving because .github/CODEOWNERS assigns every path to a default owner team and this PR is the release gate for a minor version, which is a maintainer decision rather than a correctness question.

@github-actions
github-actions Bot force-pushed the changeset-release/main branch from 29d0812 to c24e866 Compare October 20, 2026 22:11

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code review found no issues

No high-confidence issues detected in this change.

@github-actions
github-actions Bot force-pushed the changeset-release/main branch 2 times, most recently from e3cbdf7 to 29ee4ff Compare October 23, 2026 17:02

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code review found no issues

No high-confidence issues detected in this change.

@github-actions
github-actions Bot force-pushed the changeset-release/main branch 2 times, most recently from 3782bda to 1f86ce8 Compare October 23, 2026 17:13

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code review found no issues

No high-confidence issues detected in this change.

@github-actions
github-actions Bot force-pushed the changeset-release/main branch from 1f86ce8 to 61f48e8 Compare October 23, 2026 17:18

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code review found no issues

No high-confidence issues detected in this change.

@github-actions
github-actions Bot force-pushed the changeset-release/main branch from 61f48e8 to 879a831 Compare October 23, 2026 17:23

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code review found no issues

No high-confidence issues detected in this change.

@github-actions
github-actions Bot force-pushed the changeset-release/main branch from 879a831 to a13efe6 Compare October 23, 2026 17:26

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code review found no issues

No high-confidence issues detected in this change.

@github-actions
github-actions Bot force-pushed the changeset-release/main branch 2 times, most recently from 92c4d92 to 9b2d734 Compare October 23, 2026 17:36
@github-actions
github-actions Bot force-pushed the changeset-release/main branch from 9b2d734 to bd148bc Compare October 23, 2026 17:59

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code review found no issues

No high-confidence issues detected in this change.

@pkg-pr-new

pkg-pr-new Bot commented Oct 23, 2026

Copy link
Copy Markdown

Open in StackBlitz

@modelcontextprotocol/client

npm i https://pkg.pr.new/@modelcontextprotocol/client@2959

@modelcontextprotocol/codemod

npm i https://pkg.pr.new/@modelcontextprotocol/codemod@2959

@modelcontextprotocol/core

npm i https://pkg.pr.new/@modelcontextprotocol/core@2959

@modelcontextprotocol/server

npm i https://pkg.pr.new/@modelcontextprotocol/server@2959

@modelcontextprotocol/server-legacy

npm i https://pkg.pr.new/@modelcontextprotocol/server-legacy@2959

@modelcontextprotocol/express

npm i https://pkg.pr.new/@modelcontextprotocol/express@2959

@modelcontextprotocol/fastify

npm i https://pkg.pr.new/@modelcontextprotocol/fastify@2959

@modelcontextprotocol/hono

npm i https://pkg.pr.new/@modelcontextprotocol/hono@2959

@modelcontextprotocol/node

npm i https://pkg.pr.new/@modelcontextprotocol/node@2959

commit: bd148bc

@felixweinberger
felixweinberger merged commit 951fe56 into main Oct 23, 2026
20 checks passed
@felixweinberger
felixweinberger deleted the changeset-release/main branch October 23, 2026 18:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

v2 Ideas, requests and plans for v2 of the SDK which will incorporate major changes and fixes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant