github modelcontextprotocol/typescript-sdk @modelcontextprotocol/node@2.1.0

latest releases: 1.30.1, @modelcontextprotocol/server-legacy@2.1.0
4 hours ago

Minor Changes

  • #1624 6032170 Thanks @SamMorrowDrums! - Add request-time OAuth scope challenges for tools, resources, resource templates,
    and prompts. Each primitive's scopeChallenge callback receives the parsed
    request and verified authentication info, then either continues or returns the
    exact scope set for an insufficient_scope response. requireScopes provides a
    small helper for static all-of checks.

    createMcpHandler and Streamable HTTP transports return HTTP 403 with an
    insufficient_scope challenge before handler execution or SSE setup. The
    preflight is active whenever a registered primitive carries a scopeChallenge
    callback — there is no handler- or transport-level configuration. The
    challenge's WWW-Authenticate header is built by the same formatter as the
    bearer-auth 401/403 answers, and its resource_metadata parameter is derived
    from the verified AuthInfo: requireBearerAuth / verifyBearerToken now
    stamp their configured resourceMetadataUrl onto the AuthInfo they return
    (new optional AuthInfo.resourceMetadataUrl field), with a fallback to the
    well-known location for an HTTP(S) RFC 8707 resource identifier; the
    parameter is omitted when neither is available.

Patch Changes

  • #2698 7b781ed Thanks @maxisbey! - Read Streamable HTTP request bodies with a size limit. Every SDK-owned body read —
    WebStandardStreamableHTTPServerTransport (and the Node transport built on it),
    createMcpHandler, toNodeHandler, and createMcpHonoApp's JSON pre-parse — now stops at
    4 MiB by default (the limit the legacy SSE transport already uses; the Express adapter and stdio
    bound their reads too) and answers 413 Payload Too Large before anything is parsed.
    toWebRequest (when it reads the Node stream itself) now rejects once the body exceeds the
    limit with an error whose name is 'RequestBodyTooLargeError' and status is 413, and
    toNodeHandler answers that with 413; hand-wired callers of toWebRequest should handle the
    rejection or pass a pre-parsed body, and isLegacyRequest reports such a request as non-legacy
    so the modern handler answers it. JSON-RPC batch arrays are limited to 100 messages; a longer
    batch is answered 400 / -32600 and none of it is dispatched.

    The limit is configurable with a new maxRequestBodySize option (bytes, default
    DEFAULT_MAX_REQUEST_BODY_SIZE = 4 MiB, exported from @modelcontextprotocol/server) on
    WebStandardStreamableHTTPServerTransportOptions, CreateMcpHandlerOptions (forwarded to its
    stateless legacy leg; isLegacyRequest and legacyStatelessFallback take the same option),
    CreateMcpHonoAppOptions, and ToNodeHandlerOptions / ToWebRequestOptions (the adapter's
    bound applies before the handler's, so raise both). The bounded reader is exported as
    readRequestBody for adapter authors. Hosts that pre-parse the body and pass it as
    parsedBody skip the SDK's read and its size limit entirely; the batch bound applies either way.

    createMcpHonoApp and createMcpExpressApp now run their Host/Origin validation before the
    JSON body parser, so a request from a disallowed Host or Origin with an invalid JSON body is
    answered 403 rather than 400, and its body is not read.

  • Updated dependencies [6fa4227, 03842cd, 3e90449, 7b781ed, 75dc7ea, 6032170, 6a05402, 70de0c8]:

    • @modelcontextprotocol/server@2.1.0

Don't miss a new typescript-sdk release

NewReleases is sending notifications on new releases.