Model Context Protocol Release Notes

Follow

100 release notes curated from 4 sources by the Releasebot Team. Last updated: Oct 6, 2026

Get this feed:

Model Context Protocol Products

  • Oct 5, 2026
    • Date parsed from source:
      Oct 5, 2026
    • First seen by Releasebot:
      Oct 6, 2026
    Model Context Protocol logo

    MCP TypeScript SDK by Model Context Protocol

    1.32.1

    MCP TypeScript SDK ships v1.x docs updates and a 1.32.1 version bump, with README now pointing users to v2.

    What's Changed

    • [v1.x] docs: state the principles in CLAUDE.md by @claude[bot] in #2939
    • [v1.x] docs: point the README at v2 and say what v1.x supports by @claude[bot] in #2942
    • chore: bump version to 1.32.1 by @claude[bot] in #2954

    Full Changelog: 1.32.0...1.32.1

    Original source
  • Oct 5, 2026
    • Date parsed from source:
      Oct 5, 2026
    • First seen by Releasebot:
      Oct 6, 2026
    Model Context Protocol logo

    MCP TypeScript SDK by Model Context Protocol

    2.3.1

    MCP TypeScript SDK ships updates to client, server, core, server-legacy, and codemod packages, adding optional audience-based requireBearerAuth support in server-legacy and a cleaner npm landing page with links to docs, migration guide, and issue form.

    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

    requireBearerAuth in @modelcontextprotocol/server-legacy takes the optional expectedResource that @modelcontextprotocol/server 2.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/server and @modelcontextprotocol/client now open with one note that links the documentation, the migration guide and the issue form. (#2955)

    Original source
  • All of your release notes in one feed

    Join Releasebot and get updates from Model Context Protocol and hundreds of other software products.

    Create account
  • Oct 5, 2026
    • Date parsed from source:
      Oct 5, 2026
    • First seen by Releasebot:
      Oct 6, 2026
    Model Context Protocol logo

    MCP TypeScript SDK by Model Context Protocol

    @modelcontextprotocol/[email protected]

    MCP TypeScript SDK adds expected resource checks to requireBearerAuth in server-legacy, aligning token validation with newer MCP server middleware while keeping the package otherwise frozen.

    Patch Changes

    #2952 5a18673 Thanks @claude! - requireBearerAuth in @modelcontextprotocol/server-legacy takes the optional expectedResource that @modelcontextprotocol/server 2.3.0 and @modelcontextprotocol/sdk 1.32.0 added: the resource the token must be issued for (its audience), usually the server's URL. When it is set, a token is accepted only if the verifier reports that value in AuthInfo.resource; the two are compared as strings, ignoring a fragment and one trailing slash. A token reported for another value, or for none, is answered 401 invalid_token with the usual WWW-Authenticate challenge. When it is not set, nothing changes. The package stays frozen otherwise; this option is added so that its requireBearerAuth matches the 1.x middleware it is a copy of.

    Updated dependencies []

    Original source
  • Oct 5, 2026
    • Date parsed from source:
      Oct 5, 2026
    • First seen by Releasebot:
      Sep 23, 2026
    • Modified by Releasebot:
      Oct 6, 2026
    Model Context Protocol logo

    MCP TypeScript SDK by Model Context Protocol

    @modelcontextprotocol/[email protected]

    MCP TypeScript SDK ships a patch update with updated dependencies, including @modelcontextprotocol/core 2.3.1.

    Patch Changes

    Updated dependencies []:

    Original source
  • Oct 2, 2026
    • Date parsed from source:
      Oct 2, 2026
    • First seen by Releasebot:
      Oct 2, 2026
    Model Context Protocol logo

    MCP Python SDK by Model Context Protocol

    v2.3.0

    MCP Python SDK releases a polished update with mostly fixes plus new options for streamable HTTP clients, including larger SSE event support and improved tool-call retries. It also tightens header validation, trims empty request fields, refines OAuth timing, and refreshes docs and translations.

    pip install -U mcp. Docs: https://py.sdk.modelcontextprotocol.io/

    Mostly fixes, plus three new options. A few things behave differently, so skim these first:

    Behaviour changes

    httpx2>=2.10.0 is now required (#3600)

    It was >=2.5.0. The new max_sse_event_size option needs it.

    Nothing to do unless you pin httpx2 below 2.10.

    A tool with an invalid x-mcp-header annotation fails at registration (#3620)

    @mcp.tool(), add_tool and Tool.from_function raise InvalidSignature, naming the tool and the problem.

    Until now the server started, and 2026-07-28 clients silently dropped the tool from their listing.

    Refused: anything other than a plain str, int or bool parameter (so also str | None, float, lists and enums), a header name that isn't a valid token, and two names that differ only by case.

    For an optional header parameter, give the schema directly: Annotated[str | None, WithJsonSchema({"type": "string", "x-mcp-header": "Region"})] = None.

    Empty _meta and params are no longer sent (#3628)

    On 2025-11-25 and earlier connections, 2.x sent "_meta": {} on every request. Some servers reject that. It is now left out, as in v1.

    ping and list requests without a cursor go out with no params member.

    On the receiving side ctx.meta is None rather than {}, and middleware sees ctx.params as None for a request without params.

    2026-07-28 connections are unchanged.

    initialize leaves out experimental when none is configured (#3614)

    It used to send "experimental": {}. server/discover already left it out.

    Client code reading capabilities.experimental on a legacy connection should handle None.

    Mcp-Param-* validation looks the tool up by name (#3630)

    MCPServer no longer runs tools/list for every tools/call, so middleware no longer sees that extra request.

    The registered schema is what gets checked. Middleware that filters or rewrites tools/list no longer affects it.

    An interactive OAuth login no longer counts against request timeouts (#3635)

    The timeout pauses while OAuthClientProvider waits on redirect_handler and callback_handler.

    This fixes Client(mode="auto") settling on 2025-11-25 when the login took longer than 10 seconds.

    A request timeout no longer ends a login nobody finishes. Put a limit inside callback_handler if you need one.

    New

    max_sse_event_size= on streamable_http_client and StreamableHttpParameters. The default stays 1 MiB per SSE event; raise it, or pass None, for larger tool results (#3600).

    MCPServer(subscriptions=False) stops serving subscriptions/listen and advertises listChanged and subscribe as false (#3626).

    Server(get_tool_input_schema=...) lets a low-level server supply a tool's schema for header validation without running its tools/list handler (#3630).

    Client.call_tool re-lists the tools and retries once after a HeaderMismatch (-32020) rejection (#3627).

    Fixes

    ctx: Context[AppState] works on prompts and resource templates, not only on tools (#3624).

    An explicit "structuredContent": null is checked against the output schema instead of being treated as missing (#3621).

    A progress_callback that raises no longer fails the call on an in-process Client(server) (#3623).

    Client OpenTelemetry spans record JSON-RPC error responses. With mode="auto", connecting to a server without server/discover now shows one ERROR span for the probe (#3629).

    stdio_client resolves the executable off the event loop on Windows (#3510).

    Docs

    New pages: Cancellation and Header parameters, plus a middleware tutorial.

    All twelve translations are refreshed (#3636).

    What's Changed

    • Detect event-loop blocking in tests by @Kludex in #3510
    • Bump httpcore2 from 2.5.0 to 2.10.0 by @dependabot[bot] in #3482
    • Ask cubic for a review when the intake gate lets a PR back in by @maxisbey in #3489
    • docs: remove v2 notice from top of README by @claude[bot] in #3604
    • Bump anyio from 4.10.0 to 4.14.2 by @dependabot[bot] in #3547
    • Make the deeply nested body test independent of stack size by @maxisbey in #3610
    • Fall back to an NTFS junction when the symlink escape test can't create a symlink by @maxisbey in #3609
    • Group Dependabot security updates for uv dependencies by @Kludex in #3611
    • Expose an SSE event size limit in Streamable HTTP clients by @Kludex in #3600
    • Bump the github-actions group with 5 updates by @dependabot[bot] in #3612
    • docs: add a middleware tutorial that refuses tool calls by @maxisbey in #3613
    • Omit an unset experimental capability from the initialize result by @maxisbey in #3614
    • Document when a caller-supplied request id can be minted again by @maxisbey in #3619
    • Document the timeout a hand-built httpx2 client needs by @maxisbey in #3618
    • Reject a tool with an invalid x-mcp-header annotation at registration by @maxisbey in #3620
    • Validate an explicit null structuredContent against the output schema by @maxisbey in #3621
    • Contain a raising progress callback on the in-process dispatcher by @maxisbey in #3623
    • Keep the live Context when a prompt or template annotates Context[T] by @maxisbey in #3624
    • Describe the ID-JAG confidential-client rule as SDK policy, not a SEP-990 requirement by @maxisbey in #3622
    • Let MCPServer opt out of serving subscriptions/listen by @maxisbey in #3626
    • Document how a handler deals with cancellation by @maxisbey in #3625
    • Omit an empty _meta and empty params from outbound requests by @maxisbey in #3628
    • Record JSON-RPC error responses on the client OpenTelemetry span by @maxisbey in #3629
    • Retry a tool call once after a HeaderMismatch rejection by @maxisbey in #3627
    • Look the tool schema up by name for Mcp-Param-* validation instead of running tools/list by @maxisbey in #3630
    • Bump urllib3 from 2.7.0 to 2.8.0 by @dependabot[bot] in #3607
    • Let a newer Deploy Docs run cancel the one in progress by @maxisbey in #3633
    • Link What's new to the Header parameters page by @maxisbey in #3632
    • Keep inline-snapshot disabled when pytest runs in a terminal by @maxisbey in #3634
    • Stop counting an interactive OAuth login against request timeouts by @maxisbey in #3635
    • docs: refresh translations for recent English changes by @maxisbey in #3636

    Full Changelog: v2.2.0...v2.3.0

    Original source
  • Similar to Model Context Protocol with recent updates:

  • Oct 2, 2026
    • Date parsed from source:
      Oct 2, 2026
    • First seen by Releasebot:
      Oct 2, 2026
    Model Context Protocol logo

    MCP TypeScript SDK by Model Context Protocol

    1.32.0

    MCP TypeScript SDK ships 1.32.0 with tighter redirect handling, new server limits for tool input size, and stronger bearer auth checks. It also fixes client, task store, and request handling behavior while updating docs and examples.

    Upgrade notes

    Redirects: the HTTP client transports now follow a redirect only when it stays on the same origin (same scheme, host and port; http to https on the same host is allowed). A deployment whose endpoint redirects to another host or port either configures the final URL or sets redirectPolicy: 'follow' on StreamableHTTPClientTransport or SSEClientTransport. In browsers, a redirected request fails unless that option is set.

    New options, both off unless you set them: maxToolInputElements on McpServer limits the number of array elements and object members in a tool call's arguments. expectedResource on requireBearerAuth accepts only tokens issued for this server (the token's audience).

    What's Changed

    • [v1.x] fix(client): follow redirects only within the endpoint's origin by @claude[bot] in #2902
    • docs: point SECURITY.md at GitHub Security Advisories (v1.x) by @claude[bot] in #2910
    • [v1.x] examples: close idle sessions and cap the session map by @maxisbey in #2914
    • [v1.x] fix(tasks): keep tasks of the in-memory task store within the session that created them by @claude[bot] in #2925
    • [v1.x] feat(server): add maxToolInputElements option to limit the number of elements in tool-call arguments by @claude[bot] in #2927
    • [v1.x] fix(server): accept tools/call and prompts/get requests that omit arguments by @raashish1601 in #2045
    • [v1.x] feat(auth): add expectedResource to requireBearerAuth by @claude[bot] in #2930
    • [v1.x] test(e2e): cover tools/call and prompts/get without arguments by @claude[bot] in #2931
    • chore: bump version to 1.32.0 by @claude[bot] in #2935

    New Contributors

    @raashish1601 made their first contribution in #2045

    Full Changelog: 1.31.0...1.32.0

    Original source
  • Oct 2, 2026
    • Date parsed from source:
      Oct 2, 2026
    • First seen by Releasebot:
      Oct 2, 2026
    Model Context Protocol logo

    MCP TypeScript SDK by Model Context Protocol

    2.3.0

    MCP TypeScript SDK releases 2.3.0 across core client, server, and tooling packages, adding per-request server handling, safer redirect rules, new auth and input limits, faster SSE message handling, browser-extension origin support, and several fixes.

    Package

    Version

    @modelcontextprotocol/client

    2.3.0

    @modelcontextprotocol/server

    2.3.0

    @modelcontextprotocol/core

    2.3.0

    @modelcontextprotocol/server-legacy

    2.3.0

    @modelcontextprotocol/codemod

    2.3.0

    @modelcontextprotocol/node

    2.1.1

    @modelcontextprotocol/express, hono

    2.0.2

    @modelcontextprotocol/fastify

    2.0.1

    Upgrade notes

    One server per request. Server.connect() now rejects while the instance is already connected, and a stateless Streamable HTTP transport handles one request. Create the McpServer and the transport inside the request handler (or in the createMcpHandler factory) instead of sharing one instance across requests. Creating a server is cheap since #2889. (#2918)

    Redirects stay on the same origin. The HTTP client transports now follow a redirect only when it stays on the same origin (same scheme, host and port; http to https on the same host is allowed). A deployment whose endpoint redirects to another host or port either configures the final URL or sets redirectPolicy: 'follow' on the transport. In browsers, a redirected request fails unless that option is set. (#2901)

    New options, both off unless you set them. maxToolInputElements on McpServer limits the number of array elements and object members in a tool call's arguments. expectedResource on requireBearerAuth / verifyBearerToken accepts only tokens issued for this server (the token's audience); with Express, upgrade @modelcontextprotocol/express together with @modelcontextprotocol/server. (#2926, #2929)

    prompts/get without arguments is validated as {}, as tools/call already is. A top-level .optional() or .default(...) on a prompt's argsSchema no longer sees undefined. (#2107)

    The client requires eventsource-parser 3.0.8 or later. It cuts the time and memory needed to receive a large message sent as a single SSE event: in our test a 100 MB tool result went from about a minute and 1.7 GB of peak memory to under a second and about 0.5 GB. (#2846)

    New

    validateOriginHeader and the allowedOrigins option of the Express, Fastify and Hono app helpers accept <scheme>://* entries such as moz-extension://*, so a server can admit MCP clients that run as a browser extension. (#2907)

    tasks/get and tasks/cancel of the Tasks extension can be served and called on a 2026-07-28 connection. (#2599)

    Fixes

    A large message received as a single SSE event over Streamable HTTP is fast again: a 50 MB tool result that took about 13 seconds arrives in under a second. (#2846)

    prompts/get without arguments no longer fails when every argument of the prompt is optional. (#2107)

    SSEClientTransport refreshes once after a 401 on connect instead of retrying without limit. (#2905, #2934)

    registerTool no longer converts tool schemas up front, so a server built per request stops converting every tool on every request. (#2889)

    hono is a regular dependency of @modelcontextprotocol/node, so installs with strict peer-dependency checking no longer fail. (#2897)

    A server/discover probe answered with an unusable 2xx reply now says so instead of reading like a network failure. (#2903)

    McpServer.registerPrompt() types the callback correctly when no argsSchema is given. (#2841)

    The license field of the package manifests is Apache-2.0. (#2908)

    Original source
  • Oct 2, 2026
    • Date parsed from source:
      Oct 2, 2026
    • First seen by Releasebot:
      Oct 2, 2026
    Model Context Protocol logo

    MCP TypeScript SDK by Model Context Protocol

    @modelcontextprotocol/[email protected]

    MCP TypeScript SDK updates package licenses to Apache-2.0 and ships updated dependencies.

    Patch Changes

    • #2908 633dd3e Thanks @claude! - The license field of the package manifests is now Apache-2.0; the LICENSE file shipped in each package carries the full terms, including the MIT text for earlier contributions. No code change.
    • Updated dependencies [633dd3e]:
    Original source
  • Oct 2, 2026
    • Date parsed from source:
      Oct 2, 2026
    • First seen by Releasebot:
      Oct 2, 2026
    Model Context Protocol logo

    MCP TypeScript SDK by Model Context Protocol

    @modelcontextprotocol/[email protected]

    MCP TypeScript SDK adds tighter bearer token audience checks, a new maxToolInputElements limit for tool calls, and safer one-connection-at-a-time server handling. It also expands origin matching for browser extensions and improves prompts, tasks, and tool registration behavior.

    Minor Changes

    • #2929 40f8f4e Thanks @claude! - requireBearerAuth and verifyBearerToken take a new optional expectedResource, which makes them accept only tokens issued for this resource (the token's audience). Set it to the value your authorization server puts into tokens meant for this server, usually the server's URL. When it is set, a token is accepted only if the verifier reports that value in AuthInfo.resource; the two are compared as strings, ignoring a fragment and one trailing slash. A token reported for another value, or for none, is answered 401 invalid_token with the usual WWW-Authenticate challenge. When it is not set, nothing changes. To use it, pass expectedResource and have verifyAccessToken fill AuthInfo.resource, for example from the aud claim. The option is declared on a new exported type, VerifyBearerTokenOptions, which extends BearerAuthOptions; BearerAuthOptions itself is unchanged. The Express requireBearerAuth passes the option through. With Express, @modelcontextprotocol/express has to be upgraded to this release as well: 2.0.1 does not pass the option on, so nothing is compared. Its options type does not have the option, so TypeScript reports an expectedResource written in a call to the 2.0.1 requireBearerAuth as an error.

    • #2926 6d8dbc6 Thanks @claude! - McpServer now accepts a maxToolInputElements option that limits the number of elements in tool-call arguments: the largest combined number of array elements and object members a single tools/call arguments payload may contain. It is off by default, so behavior is unchanged unless you set it. When it is set and a call exceeds it, that call is answered with an isError: true tool result that names the limit, before the input schema runs, and the server keeps serving. Set it above the largest arguments your tools legitimately accept; maxRequestBodySize remains the primary limit on request size. The value must be a number of at least 1, or Infinity for no limit; any other value is rejected at construction. The options type is exported as McpServerOptions.

    • #2918 84804c2 Thanks @claude! - A Server or McpServer now serves one connection at a time, and a Streamable HTTP server transport without sessions (sessionIdGenerator: undefined) serves one request. An app that uses one server object, or one stateless transport, for every HTTP request fails on the second request after this upgrade. Build the server and the transport per request instead.

    What keeps working without a change:

    • createMcpHandler(buildServer) and serveStdio(buildServer), where buildServer returns a new server on every call.
    • A handler that builds a new server and a new stateless transport for each request.
    • One server and one transport per session (a transport with a sessionIdGenerator).
    • Connecting a server again after close().
    • Client.

    What fails now, how it shows, and what to change:

    • One server object with a new stateless transport per request (const server = new McpServer(...) outside the handler, await server.connect(transport) inside it): the second HTTP request the process receives fails, and so does every later one. connect() rejects with an SdkError of code ALREADY_CONNECTED. If the handler closes the transport when the response ends, requests that arrive one after the other still work and a request that overlaps another one fails. Change: move new McpServer(...) and its registrations into the handler.

    • One stateless transport for every request (a transport built once with sessionIdGenerator: undefined): the second HTTP request fails. WebStandardStreamableHTTPServerTransport.handleRequest() rejects with Stateless transport cannot be reused across requests. Create a new transport per request., and NodeStreamableHTTPServerTransport.handleRequest() answers 500. Change: build the server and the transport inside the handler and connect them there.

    • createMcpHandler(() => server) with a server built once: a request that arrives after the previous response has been read to its end still works. A request that arrives while another one is being served is answered 500 with the JSON-RPC error -32603 (Internal server error); the reason is reported only through the onerror option. Change: pass a function that builds the server, as in createMcpHandler(buildServer).

    • One server object for every session: the initialize request of the second session fails with ALREADY_CONNECTED. Change: build a server per session.

    • What the caller sees when connect() or handleRequest() rejects depends on the host. Express 5, Fastify and Hono answer 500. A plain node:http listener without its own error handling gets an unhandled rejection, which ends the process.

    • The README examples of @modelcontextprotocol/express, @modelcontextprotocol/fastify, @modelcontextprotocol/hono and @modelcontextprotocol/node, and the handler examples in the JSDoc of WebStandardStreamableHTTPServerTransport and NodeStreamableHTTPServerTransport, now build a server and a transport per request.

    • #2907 e55f9ac Thanks @claude! - allowedOrigins and validateOriginHeader accept lowercase entries of the form <scheme>://, such as moz-extension:// or chrome-extension://, which admit every origin of that scheme. This lets a server admit MCP clients that run as a browser extension when the extension ID cannot be listed, as on Firefox, where it differs on every install. http:// and https://* are not honoured, and the defaults are unchanged.

    Patch Changes

    • #2599 5238fba Thanks @freya0926! - A server can now serve, and a client can now call, tasks/get and tasks/cancel of 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 when ctx.era === 'legacy'.

    • #2107 2fc49ea Thanks @pragnyanramtha! - prompts/get without arguments no longer fails with "Invalid arguments" when every argument of the prompt is optional. A missing arguments is now validated as {}, as it already is for tools/call, so a top-level .optional() or .default(...) on argsSchema no longer sees undefined.

    • #2889 4d94e7b Thanks @claude! - registerTool no longer converts tool schemas up front, so a server built per request stops converting every tool on every request. The warning about an invalid x-mcp-header declaration now appears each time tools are listed, not when the tool is registered.

    • #2908 633dd3e Thanks @claude! - The license field of the package manifests is now Apache-2.0; the LICENSE file shipped in each package carries the full terms, including the MIT text for earlier contributions. No code change.

    • #2841 2237555 Thanks @sharziki! - McpServer.registerPrompt() now types the callback correctly when no argsSchema is given: its one parameter is the server context. Before, reading ctx.mcpReq there was a type error although it worked at runtime. Prompts registered with an argsSchema are unchanged.

    • Updated dependencies [633dd3e]:

    Original source
  • Oct 2, 2026
    • Date parsed from source:
      Oct 2, 2026
    • First seen by Releasebot:
      Oct 2, 2026
    Model Context Protocol logo

    MCP TypeScript SDK by Model Context Protocol

    @modelcontextprotocol/[email protected]

    MCP TypeScript SDK ships patch updates that improve server and transport handling, fixing strict peer-dependency installs and clarifying that servers and stateless HTTP transports must be created per request to avoid reuse errors. It also updates package licensing to Apache-2.0.

    Patch Changes

    • #2897 7f4c12a Thanks @claude! - hono is now a regular dependency of @modelcontextprotocol/node, so installs with strict peer-dependency checking no longer fail on the hono peer that @hono/node-server requires. No runtime change.

    • #2918 84804c2 Thanks @claude! - A Server or McpServer now serves one connection at a time, and a Streamable HTTP server transport without sessions (sessionIdGenerator: undefined) serves one request. An app that uses one server object, or one stateless transport, for every HTTP request fails on the second request after this upgrade. Build the server and the transport per request.

      What keeps working without a change:

      • createMcpHandler(buildServer) and serveStdio(buildServer), where buildServer returns a new server on every call.
      • A handler that builds a new server and a new stateless transport for each request.
      • One server and one transport per session (a transport with a sessionIdGenerator).
      • Connecting a server again after close().
      • Client.

      What fails now, how it shows, and what to change:

      • One server object with a new stateless transport per request (const server = new McpServer(...) outside the handler, await server.connect(transport) inside it): the second HTTP request the process receives fails, and so does every later one. connect() rejects with an SdkError of code ALREADY_CONNECTED. If the handler closes the transport when the response ends, requests that arrive one after the other still work and a request that overlaps another one fails. Change: move new McpServer(...) and its registrations into the handler.
      • One stateless transport for every request (a transport built once with sessionIdGenerator: undefined): the second HTTP request fails. WebStandardStreamableHTTPServerTransport.handleRequest() rejects with Stateless transport cannot be reused across requests. Create a new transport per request., and NodeStreamableHTTPServerTransport.handleRequest() answers 500. Change: build the server and the transport inside the handler and connect them there.
      • createMcpHandler(() => server) with a server built once: a request that arrives after the previous response has been read to its end still works. A request that arrives while another one is being served is answered 500 with the JSON-RPC error -32603 (Internal server error); the reason is reported only through the onerror option. Change: pass a function that builds the server, as in createMcpHandler(buildServer).
      • One server object for every session: the initialize request of the second session fails with ALREADY_CONNECTED. Change: build a server per session.

      What the caller sees when connect() or handleRequest() rejects depends on the host. Express 5, Fastify and Hono answer 500. A plain node:http listener without its own error handling gets an unhandled rejection, which ends the process.

      The README examples of @modelcontextprotocol/express, @modelcontextprotocol/fastify, @modelcontextprotocol/hono and @modelcontextprotocol/node, and the handler examples in the JSDoc of WebStandardStreamableHTTPServerTransport and NodeStreamableHTTPServerTransport, now build a server and a transport per request.

    • #2908 633dd3e Thanks @claude! - The license field of the package manifests is now Apache-2.0; the LICENSE file shipped in each package carries the full terms, including the MIT text for earlier contributions. No code change.

    • Updated dependencies [40f8f4e, 6d8dbc6, 5238fba, 2fc49ea, 4d94e7b, 84804c2, e55f9ac, 633dd3e, 2237555]:

    Original source
  • Oct 2, 2026
    • Date parsed from source:
      Oct 2, 2026
    • First seen by Releasebot:
      Oct 2, 2026
    Model Context Protocol logo

    MCP TypeScript SDK by Model Context Protocol

    @modelcontextprotocol/[email protected]

    MCP TypeScript SDK fixes server and transport reuse in HTTP handling, requiring a new server and stateless transport per request or session to avoid ALREADY_CONNECTED errors. It also updates package manifests to Apache-2.0 and ships README and JSDoc examples to match.

    Patch Changes

    #2918 84804c2 Thanks @claude! - A Server or McpServer now serves one connection at a time, and a Streamable HTTP server transport without sessions (sessionIdGenerator: undefined) serves one request. An app that uses one server object, or one stateless transport, for every HTTP request fails on the second request after this upgrade. Build the server and the transport per request instead.

    What keeps working without a change:

    • createMcpHandler(buildServer) and serveStdio(buildServer), where buildServer returns a new server on every call.
    • A handler that builds a new server and a new stateless transport for each request.
    • One server and one transport per session (a transport with a sessionIdGenerator).
    • Connecting a server again after close().
    • Client.

    What fails now, how it shows, and what to change:

    • One server object with a new stateless transport per request (const server = new McpServer(...) outside the handler, await server.connect(transport) inside it): the second HTTP request the process receives fails, and so does every later one. connect() rejects with an SdkError of code ALREADY_CONNECTED. If the handler closes the transport when the response ends, requests that arrive one after the other still work and a request that overlaps another one fails. Change: move new McpServer(...) and its registrations into the handler.
    • One stateless transport for every request (a transport built once with sessionIdGenerator: undefined): the second HTTP request fails. WebStandardStreamableHTTPServerTransport.handleRequest() rejects with Stateless transport cannot be reused across requests. Create a new transport per request., and NodeStreamableHTTPServerTransport.handleRequest() answers 500. Change: build the server and the transport inside the handler and connect them there.
    • createMcpHandler(() => server) with a server built once: a request that arrives after the previous response has been read to its end still works. A request that arrives while another one is being served is answered 500 with the JSON-RPC error -32603 (Internal server error); the reason is reported only through the onerror option. Change: pass a function that builds the server, as in createMcpHandler(buildServer).
    • One server object for every session: the initialize request of the second session fails with ALREADY_CONNECTED. Change: build a server per session.

    What the caller sees when connect() or handleRequest() rejects depends on the host. Express 5, Fastify and Hono answer 500. A plain node:http listener without its own error handling gets an unhandled rejection, which ends the process.

    The README examples of @modelcontextprotocol/express, @modelcontextprotocol/fastify, @modelcontextprotocol/hono and @modelcontextprotocol/node, and the handler examples in the JSDoc of WebStandardStreamableHTTPServerTransport and NodeStreamableHTTPServerTransport, now build a server and a transport per request.

    #2908 633dd3e Thanks @claude! - The license field of the package manifests is now Apache-2.0; the LICENSE file shipped in each package carries the full terms, including the MIT text for earlier contributions. No code change.

    Updated dependencies [40f8f4e, 6d8dbc6, 5238fba, 2fc49ea, 4d94e7b, 84804c2, e55f9ac, 633dd3e, 2237555]:

    Original source
  • Oct 2, 2026
    • Date parsed from source:
      Oct 2, 2026
    • First seen by Releasebot:
      Oct 2, 2026
    Model Context Protocol logo

    MCP TypeScript SDK by Model Context Protocol

    @modelcontextprotocol/[email protected]

    MCP TypeScript SDK fixes server and transport reuse issues, now building a new server and stateless transport per request to avoid ALREADY_CONNECTED and 500 errors. It also updates package licensing to Apache-2.0 and refreshes README and JSDoc examples.

    Patch Changes

    #2918 84804c2 Thanks @claude! - A Server or McpServer now serves one connection at a time, and a Streamable HTTP server transport without sessions (sessionIdGenerator: undefined) serves one request. An app that uses one server object, or one stateless transport, for every HTTP request fails on the second request after this upgrade. Build the server and the transport per request instead.

    What keeps working without a change:

    • createMcpHandler(buildServer) and serveStdio(buildServer), where buildServer returns a new server on every call.
    • A handler that builds a new server and a new stateless transport for each request.
    • One server and one transport per session (a transport with a sessionIdGenerator).
    • Connecting a server again after close().
    • Client.

    What fails now, how it shows, and what to change:

    • One server object with a new stateless transport per request (const server = new McpServer(...) outside the handler, await server.connect(transport) inside it): the second HTTP request the process receives fails, and so does every later one. connect() rejects with an SdkError of code ALREADY_CONNECTED. If the handler closes the transport when the response ends, requests that arrive one after the other still work and a request that overlaps another one fails. Change: move new McpServer(...) and its registrations into the handler.
    • One stateless transport for every request (a transport built once with sessionIdGenerator: undefined): the second HTTP request fails. WebStandardStreamableHTTPServerTransport.handleRequest() rejects with Stateless transport cannot be reused across requests. Create a new transport per request., and NodeStreamableHTTPServerTransport.handleRequest() answers 500. Change: build the server and the transport inside the handler and connect them there.
    • createMcpHandler(() => server) with a server built once: a request that arrives after the previous response has been read to its end still works. A request that arrives while another one is being served is answered 500 with the JSON-RPC error -32603 (Internal server error); the reason is reported only through the onerror option. Change: pass a function that builds the server, as in createMcpHandler(buildServer).
    • One server object for every session: the initialize request of the second session fails with ALREADY_CONNECTED. Change: build a server per session.

    What the caller sees when connect() or handleRequest() rejects depends on the host. Express 5, Fastify and Hono answer 500. A plain node:http listener without its own error handling gets an unhandled rejection, which ends the process.

    The README examples of @modelcontextprotocol/express, @modelcontextprotocol/fastify, @modelcontextprotocol/hono and @modelcontextprotocol/node, and the handler examples in the JSDoc of WebStandardStreamableHTTPServerTransport and NodeStreamableHTTPServerTransport, now build a server and a transport per request.

    #2908 633dd3e Thanks @claude! - The license field of the package manifests is now Apache-2.0; the LICENSE file shipped in each package carries the full terms, including the MIT text for earlier contributions. No code change.

    Updated dependencies [40f8f4e, 6d8dbc6, 5238fba, 2fc49ea, 4d94e7b, 84804c2, e55f9ac, 633dd3e, 2237555]:

    Original source
  • Oct 2, 2026
    • Date parsed from source:
      Oct 2, 2026
    • First seen by Releasebot:
      Oct 2, 2026
    Model Context Protocol logo

    MCP TypeScript SDK by Model Context Protocol

    @modelcontextprotocol/[email protected]

    MCP TypeScript SDK adds bearer token audience checks with a new expectedResource option and updates server handling so connections and stateless transports are built per request. It also updates package licensing to Apache-2.0.

    Patch Changes

    • #2929 40f8f4e Thanks @claude! - requireBearerAuth and verifyBearerToken take a new optional expectedResource, which makes them accept only tokens issued for this resource (the token's audience). Set it to the value your authorization server puts into tokens meant for this server, usually the server's URL. When it is set, a token is accepted only if the verifier reports that value in AuthInfo.resource; the two are compared as strings, ignoring a fragment and one trailing slash. A token reported for another value, or for none, is answered 401 invalid_token with the usual WWW-Authenticate challenge. When it is not set, nothing changes. To use it, pass expectedResource and have verifyAccessToken fill AuthInfo.resource, for example from the aud claim. The option is declared on a new exported type, VerifyBearerTokenOptions, which extends BearerAuthOptions; BearerAuthOptions itself is unchanged. The Express requireBearerAuth passes the option through. With Express, @modelcontextprotocol/express has to be upgraded to this release as well: 2.0.1 does not pass the option on, so nothing is compared. Its options type does not have the option, so TypeScript reports an expectedResource written in a call to the 2.0.1 requireBearerAuth as an error.

    • #2918 84804c2 Thanks @claude! - A Server or McpServer now serves one connection at a time, and a Streamable HTTP server transport without sessions (sessionIdGenerator: undefined) serves one request. An app that uses one server object, or one stateless transport, for every HTTP request fails on the second request after this upgrade. Build the server and the transport per request instead.

      What keeps working without a change:

      createMcpHandler(buildServer) and serveStdio(buildServer), where buildServer returns a new server on every call.
      A handler that builds a new server and a new stateless transport for each request.
      One server and one transport per session (a transport with a sessionIdGenerator).
      Connecting a server again after close().
      Client.

      What fails now, how it shows, and what to change:

      One server object with a new stateless transport per request (const server = new McpServer(...) outside the handler, await server.connect(transport) inside it): the second HTTP request the process receives fails, and so does every later one. connect() rejects with an SdkError of code ALREADY_CONNECTED. If the handler closes the transport when the response ends, requests that arrive one after the other still work and a request that overlaps another one fails. Change: move new McpServer(...) and its registrations into the handler.
      One stateless transport for every request (a transport built once with sessionIdGenerator: undefined): the second HTTP request fails. WebStandardStreamableHTTPServerTransport.handleRequest() rejects with Stateless transport cannot be reused across requests. Create a new transport per request., and NodeStreamableHTTPServerTransport.handleRequest() answers 500. Change: build the server and the transport inside the handler and connect them there.
      createMcpHandler(() => server) with a server built once: a request that arrives after the previous response has been read to its end still works. A request that arrives while another one is being served is answered 500 with the JSON-RPC error -32603 (Internal server error); the reason is reported only through the onerror option. Change: pass a function that builds the server, as in createMcpHandler(buildServer).
      One server object for every session: the initialize request of the second session fails with ALREADY_CONNECTED. Change: build a server per session.

      What the caller sees when connect() or handleRequest() rejects depends on the host. Express 5, Fastify and Hono answer 500. A plain node:http listener without its own error handling gets an unhandled rejection, which ends the process.

      The README examples of @modelcontextprotocol/express, @modelcontextprotocol/fastify, @modelcontextprotocol/hono and @modelcontextprotocol/node, and the handler examples in the JSDoc of WebStandardStreamableHTTPServerTransport and NodeStreamableHTTPServerTransport, now build a server and a transport per request.

    • #2908 633dd3e Thanks @claude! - The license field of the package manifests is now Apache-2.0; the LICENSE file shipped in each package carries the full terms, including the MIT text for earlier contributions. No code change.

    • Updated dependencies [40f8f4e, 6d8dbc6, 5238fba, 2fc49ea, 4d94e7b, 84804c2, e55f9ac, 633dd3e, 2237555]:

    Original source
  • Oct 2, 2026
    • Date parsed from source:
      Oct 2, 2026
    • First seen by Releasebot:
      Oct 2, 2026
    Model Context Protocol logo

    MCP TypeScript SDK by Model Context Protocol

    @modelcontextprotocol/[email protected]

    MCP TypeScript SDK updates package licenses to Apache-2.0 and ships full terms in each package.

    Patch Changes

    #2908 633dd3e Thanks @claude! - The license field of the package manifests is now Apache-2.0; the LICENSE file shipped in each package carries the full terms, including the MIT text for earlier contributions. No code change.

    Original source
  • Oct 2, 2026
    • Date parsed from source:
      Oct 2, 2026
    • First seen by Releasebot:
      Oct 2, 2026
    Model Context Protocol logo

    MCP TypeScript SDK by Model Context Protocol

    @modelcontextprotocol/[email protected]

    MCP TypeScript SDK updates package manifests to Apache-2.0 and ships full license terms in each package.

    Patch Changes

    #2908 633dd3e Thanks @claude! - The license field of the package manifests is now Apache-2.0; the LICENSE file shipped in each package carries the full terms, including the MIT text for earlier contributions. No code change.

    Original source
Releasebot

Curated by the Releasebot team

Releasebot is an aggregator of official release notes from hundreds of software vendors and thousands of sources.

Our editorial process involves the manual review and audit of release notes procured with the help of automated systems.