From 34f4570798cce8050ab20f1f8d211f579763a3d8 Mon Sep 17 00:00:00 2001 From: Felix Weinberger Date: Mon, 29 Jun 2026 18:37:11 +0000 Subject: [PATCH 01/11] docs: replace {@linkcode} tags with plain code spans and externalize out-of-tree links VitePress renders the guide markdown directly, so typedoc-only {@linkcode} tags now render as plain backticked code. Relative links that point outside docs/ (examples, codemod sources) become absolute GitHub URLs since they cannot resolve on the rendered site. The codemod package README gets the same treatment, which also fixes its links on npm. --- docs/client.md | 92 +++++++++++++++------------------ docs/documents.md | 17 ------ docs/faq.md | 2 +- docs/migration/index.md | 2 +- docs/migration/upgrade-to-v2.md | 20 +++---- docs/server-quickstart.md | 4 +- docs/server.md | 55 ++++++++++---------- docs/v2-banner.js | 9 ---- packages/codemod/README.md | 12 ++--- 9 files changed, 89 insertions(+), 124 deletions(-) delete mode 100644 docs/documents.md delete mode 100644 docs/v2-banner.js diff --git a/docs/client.md b/docs/client.md index 659b39abd0..01822e5929 100644 --- a/docs/client.md +++ b/docs/client.md @@ -54,7 +54,7 @@ import { StdioClientTransport } from '@modelcontextprotocol/client/stdio'; ### Streamable HTTP -For remote HTTP servers, use {@linkcode @modelcontextprotocol/client!client/streamableHttp.StreamableHTTPClientTransport | StreamableHTTPClientTransport}: +For remote HTTP servers, use `StreamableHTTPClientTransport`: ```ts source="../examples/guides/clientGuide.examples.ts#connect_streamableHttp" const client = new Client({ name: 'my-client', version: '1.0.0' }); @@ -68,7 +68,7 @@ For a full interactive client over Streamable HTTP, see [`repl/client.ts`](https ### stdio -For local, process-spawned servers (Claude Desktop, CLI tools), use {@linkcode @modelcontextprotocol/client!client/stdio.StdioClientTransport | StdioClientTransport}. The transport spawns the server process and communicates over stdin/stdout: +For local, process-spawned servers (Claude Desktop, CLI tools), use `StdioClientTransport`. The transport spawns the server process and communicates over stdin/stdout: ```ts source="../examples/guides/clientGuide.examples.ts#connect_stdio" const client = new Client({ name: 'my-client', version: '1.0.0' }); @@ -83,8 +83,7 @@ await client.connect(transport); ### SSE fallback for legacy servers -To support both modern Streamable HTTP and legacy SSE servers, try {@linkcode @modelcontextprotocol/client!client/streamableHttp.StreamableHTTPClientTransport | StreamableHTTPClientTransport} first and fall back to {@linkcode -@modelcontextprotocol/client!client/sse.SSEClientTransport | SSEClientTransport} on failure: +To support both modern Streamable HTTP and legacy SSE servers, try `StreamableHTTPClientTransport` first and fall back to `SSEClientTransport` on failure: ```ts source="../examples/guides/clientGuide.examples.ts#connect_sseFallback" const baseUrl = new URL(url); @@ -125,13 +124,13 @@ client.getNegotiatedProtocolVersion(); // '2026-07-28' or '2025-11-25' - **`mode: { pin: '2026-07-28' }`** — modern era at exactly that revision; no fallback. Against a 2025-only server `connect()` rejects with a typed error. Use `pin` where a silent downgrade would be worse than an error (tests, CI, servers you control). Once a modern era is negotiated, the client automatically attaches the per-request `_meta` envelope (the reserved protocol-version / client-info / client-capabilities keys) to every outgoing request and notification. You can also configure negotiation pre-connect on an -already-constructed instance via {@linkcode @modelcontextprotocol/client!client/client.Client#setVersionNegotiation | client.setVersionNegotiation()}. See the [2026-07-28 support guide › Probe policy](./migration/support-2026-07-28.md#probe-policy) for the full failure semantics and probe-timeout behavior. +already-constructed instance via `client.setVersionNegotiation()`. See the [2026-07-28 support guide › Probe policy](./migration/support-2026-07-28.md#probe-policy) for the full failure semantics and probe-timeout behavior. The version lists come from `ClientOptions.supportedProtocolVersions`: under `'auto'`, its 2026-era entries form the modern offer (default: the SDK's modern list), and a list with no 2025-era entry removes the legacy fallback; `connect()` rejects with `SdkError(EraNegotiationFailed)` instead of downgrading. The same modern subset bounds the overlap check of `connect({ prior })`. #### Skipping the probe: `connect({ prior })` -A gateway, proxy, or worker fleet that already knows the server's `server/discover` advertisement can skip the probe entirely. Pass a previously-obtained {@linkcode @modelcontextprotocol/client!index.DiscoverResult | DiscoverResult} via -{@linkcode @modelcontextprotocol/client!client/client.ConnectOptions | ConnectOptions.prior} and `connect()` adopts it directly with **zero round trips** — the 2026-07-28 protocol is stateless on HTTP, so once the advertisement is known there is nothing left to negotiate. +A gateway, proxy, or worker fleet that already knows the server's `server/discover` advertisement can skip the probe entirely. Pass a previously-obtained `DiscoverResult` via +`ConnectOptions.prior` and `connect()` adopts it directly with **zero round trips** — the 2026-07-28 protocol is stateless on HTTP, so once the advertisement is known there is nothing left to negotiate. ```ts source="../examples/guides/clientGuide.examples.ts#Client_connect_prior" // Probe once (here via the 'auto'-mode connect), persist the result … @@ -144,15 +143,15 @@ const worker = new Client({ name: 'worker', version: '1.0.0' }); await worker.connect(new StreamableHTTPClientTransport(url), { prior: JSON.parse(persisted) }); ``` -{@linkcode @modelcontextprotocol/client!client/client.Client#getDiscoverResult | client.getDiscoverResult()} returns the value that the `'auto'`/pinned probe path, an explicit {@linkcode @modelcontextprotocol/client!client/client.Client#discover | client.discover()} call, or a +`client.getDiscoverResult()` returns the value that the `'auto'`/pinned probe path, an explicit `client.discover()` call, or a prior `connect({ prior })` recorded; it round-trips through `JSON.stringify`/`JSON.parse`. `connect({ prior })` is **2026-07-28+ only** — it rejects with `SdkError(EraNegotiationFailed)` when the supplied result and the client share no modern revision. Only reuse a persisted -`DiscoverResult` across clients that present the **same authorization context** as the one that obtained it. See the [`gateway/` example](../examples/gateway/README.md) for the full probe-once / connect-many pattern with a server-side proof. +`DiscoverResult` across clients that present the **same authorization context** as the one that obtained it. See the [`gateway/` example](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/examples/gateway/README.md) for the full probe-once / connect-many pattern with a server-side proof. Unlike an `'auto'`/pinned connect, `connect({ prior })` never auto-opens a `subscriptions/listen` stream. Workers on this path are assumed request-only. A configured `listChanged` option registers its handlers but stays silent. Call [`client.listen(filter)`](#subscription-streams-2026-07-28) yourself if a prior-connected client should observe changes. ### Disconnecting -Call {@linkcode @modelcontextprotocol/client!client/client.Client#close | await client.close() } to disconnect. Pending requests are rejected with a {@linkcode @modelcontextprotocol/client!index.SdkErrorCode.ConnectionClosed | CONNECTION_CLOSED} error. +Call `await client.close()` to disconnect. Pending requests are rejected with a `CONNECTION_CLOSED` error. For Streamable HTTP, terminate the server-side session first (per the MCP specification): @@ -178,7 +177,7 @@ console.log(systemPrompt); ### Extension capabilities -The negotiated server capabilities include `extensions` — a map from extension identifier to that extension's settings object. Read it after connecting via {@linkcode @modelcontextprotocol/client!client/client.Client#getServerCapabilities | client.getServerCapabilities()}: +The negotiated server capabilities include `extensions` — a map from extension identifier to that extension's settings object. Read it after connecting via `client.getServerCapabilities()`: ```ts source="../examples/guides/clientGuide.examples.ts#extensionCapabilities_read" const extensions = client.getServerCapabilities()?.extensions ?? {}; @@ -192,13 +191,11 @@ See [Extension capabilities](./server.md#extension-capabilities) in the server g ## Authentication -MCP servers can require authentication before accepting client connections (see [Authorization](https://modelcontextprotocol.io/specification/latest/basic/authorization) in the MCP specification). Pass an {@linkcode @modelcontextprotocol/client!client/auth.AuthProvider | -AuthProvider} to {@linkcode @modelcontextprotocol/client!client/streamableHttp.StreamableHTTPClientTransport | StreamableHTTPClientTransport}. The transport calls `token()` before every request and `onUnauthorized()` (if provided) on 401, then retries once. +MCP servers can require authentication before accepting client connections (see [Authorization](https://modelcontextprotocol.io/specification/latest/basic/authorization) in the MCP specification). Pass an `AuthProvider` to `StreamableHTTPClientTransport`. The transport calls `token()` before every request and `onUnauthorized()` (if provided) on 401, then retries once. ### Bearer tokens -For servers that accept bearer tokens managed outside the SDK — API keys, tokens from a gateway or proxy, service-account credentials — implement only `token()`. With no `onUnauthorized()`, a 401 throws {@linkcode @modelcontextprotocol/client!client/auth.UnauthorizedError | -UnauthorizedError} immediately: +For servers that accept bearer tokens managed outside the SDK — API keys, tokens from a gateway or proxy, service-account credentials — implement only `token()`. With no `onUnauthorized()`, a 401 throws `UnauthorizedError` immediately: ```ts source="../examples/guides/clientGuide.examples.ts#auth_tokenProvider" const authProvider: AuthProvider = { token: async () => getStoredToken() }; @@ -210,7 +207,7 @@ See [`simpleTokenProvider.ts`](https://github.com/modelcontextprotocol/typescrip ### Client credentials -{@linkcode @modelcontextprotocol/client!client/authExtensions.ClientCredentialsProvider | ClientCredentialsProvider} handles the `client_credentials` grant flow for service-to-service communication: +`ClientCredentialsProvider` handles the `client_credentials` grant flow for service-to-service communication: ```ts source="../examples/guides/clientGuide.examples.ts#auth_clientCredentials" const authProvider = new ClientCredentialsProvider({ @@ -227,7 +224,7 @@ await client.connect(transport); ### Private key JWT -{@linkcode @modelcontextprotocol/client!client/authExtensions.PrivateKeyJwtProvider | PrivateKeyJwtProvider} signs JWT assertions for the `private_key_jwt` token endpoint auth method, avoiding a shared client secret: +`PrivateKeyJwtProvider` signs JWT assertions for the `private_key_jwt` token endpoint auth method, avoiding a shared client secret: ```ts source="../examples/guides/clientGuide.examples.ts#auth_privateKeyJwt" const authProvider = new PrivateKeyJwtProvider({ @@ -244,7 +241,7 @@ Server only implements `client_secret_basic`/`client_secret_post`, so there is n ### Full OAuth with user authorization -For user-facing applications, implement the {@linkcode @modelcontextprotocol/client!client/auth.OAuthClientProvider | OAuthClientProvider} interface to handle the full authorization code flow (redirects, code verifiers, token storage, dynamic client registration). Key persisted +For user-facing applications, implement the `OAuthClientProvider` interface to handle the full authorization code flow (redirects, code verifiers, token storage, dynamic client registration). Key persisted client credentials by the `ctx.issuer` passed to `clientInformation()` / `saveClientInformation()` so credentials registered with one authorization server are never sent to another: ```ts source="../examples/guides/clientGuide.examples.ts#auth_oauthClientProvider" @@ -311,8 +308,8 @@ const transport = new StreamableHTTPClientTransport(new URL('http://localhost:30 }); ``` -The {@linkcode @modelcontextprotocol/client!client/client.Client#connect | connect()} call throws {@linkcode @modelcontextprotocol/client!client/auth.UnauthorizedError | UnauthorizedError} when authorization is needed — catch it, complete the browser flow, hand the callback query -to {@linkcode @modelcontextprotocol/client!client/streamableHttp.StreamableHTTPClientTransport#finishAuth | transport.finishAuth()}, and reconnect. Passing the whole `URLSearchParams` lets the SDK extract `code` and validate the RFC 9207 `iss` parameter for you: +The `connect()` call throws `UnauthorizedError` when authorization is needed — catch it, complete the browser flow, hand the callback query +to `transport.finishAuth()`, and reconnect. Passing the whole `URLSearchParams` lets the SDK extract `code` and validate the RFC 9207 `iss` parameter for you: ```ts source="../examples/guides/clientGuide.examples.ts#auth_finishAuth" const client = new Client({ name: 'my-client', version: '1.0.0' }); @@ -384,7 +381,7 @@ class PinnedResourceProvider extends MyOAuthProvider { ### Cross-App Access (Enterprise Managed Authorization) -{@linkcode @modelcontextprotocol/client!client/authExtensions.CrossAppAccessProvider | CrossAppAccessProvider} implements Enterprise Managed Authorization (SEP-990) for scenarios where users authenticate with an enterprise identity provider (IdP) and clients need to access +`CrossAppAccessProvider` implements Enterprise Managed Authorization (SEP-990) for scenarios where users authenticate with an enterprise identity provider (IdP) and clients need to access protected MCP servers on their behalf. This provider handles a two-step OAuth flow: @@ -436,7 +433,7 @@ For manual control over the token exchange steps, use the Layer 2 utilities from Tools are callable actions offered by servers — discovering and invoking them is usually how your client enables an LLM to take action (see [Tools](https://modelcontextprotocol.io/docs/learn/server-concepts#tools) in the MCP overview). -Use {@linkcode @modelcontextprotocol/client!client/client.Client#listTools | listTools()} to discover available tools, and {@linkcode @modelcontextprotocol/client!client/client.Client#callTool | callTool()} to invoke one. `listTools()` walks every page on your behalf and returns +Use `listTools()` to discover available tools, and `callTool()` to invoke one. `listTools()` walks every page on your behalf and returns the complete list (pass an explicit `{ cursor }` for per-page control): ```ts source="../examples/guides/clientGuide.examples.ts#callTool_basic" @@ -453,8 +450,7 @@ const result = await client.callTool({ console.log(result.content); ``` -The aggregate walk is capped at `ClientOptions.listMaxPages` pages (default 64; `0` disables the cap). If a server's pagination never terminates, the call rejects with {@linkcode @modelcontextprotocol/client!index.SdkError | SdkError} code {@linkcode -@modelcontextprotocol/client!index.SdkErrorCode.ListPaginationExceeded | LIST_PAGINATION_EXCEEDED}. The same applies to `listPrompts()`, `listResources()`, and `listResourceTemplates()`. +The aggregate walk is capped at `ClientOptions.listMaxPages` pages (default 64; `0` disables the cap). If a server's pagination never terminates, the call rejects with `SdkError` code `LIST_PAGINATION_EXCEEDED`. The same applies to `listPrompts()`, `listResources()`, and `listResourceTemplates()`. Tool results may include a `structuredContent` field — a machine-readable JSON value (any JSON type per SEP-2106) for programmatic use by the client application, complementing `content` which is for the LLM: @@ -507,7 +503,7 @@ paths are unchanged. Resources are read-only data — files, database schemas, configuration — that your application can retrieve from a server and attach as context for the model (see [Resources](https://modelcontextprotocol.io/docs/learn/server-concepts#resources) in the MCP overview). -Use {@linkcode @modelcontextprotocol/client!client/client.Client#listResources | listResources()} and {@linkcode @modelcontextprotocol/client!client/client.Client#readResource | readResource()} to discover and read server-provided data. `listResources()` walks every page on your +Use `listResources()` and `readResource()` to discover and read server-provided data. `listResources()` walks every page on your behalf and returns the complete list (pass an explicit `{ cursor }` for per-page control): ```ts source="../examples/guides/clientGuide.examples.ts#readResource_basic" @@ -523,11 +519,11 @@ for (const item of contents) { } ``` -To discover URI templates for dynamic resources, use {@linkcode @modelcontextprotocol/client!client/client.Client#listResourceTemplates | listResourceTemplates()}. +To discover URI templates for dynamic resources, use `listResourceTemplates()`. ### Subscribing to resource changes -If the server supports resource subscriptions, use {@linkcode @modelcontextprotocol/client!client/client.Client#subscribeResource | subscribeResource()} to receive notifications when a resource changes, then re-read it: +If the server supports resource subscriptions, use `subscribeResource()` to receive notifications when a resource changes, then re-read it: ```ts source="../examples/guides/clientGuide.examples.ts#subscribeResource_basic" await client.subscribeResource({ uri: 'config://app' }); @@ -551,7 +547,7 @@ await client.unsubscribeResource({ uri: 'config://app' }); Prompts are reusable message templates that servers offer to help structure interactions with models (see [Prompts](https://modelcontextprotocol.io/docs/learn/server-concepts#prompts) in the MCP overview). -Use {@linkcode @modelcontextprotocol/client!client/client.Client#listPrompts | listPrompts()} and {@linkcode @modelcontextprotocol/client!client/client.Client#getPrompt | getPrompt()} to list available prompts and retrieve them with arguments. `listPrompts()` walks every page on +Use `listPrompts()` and `getPrompt()` to list available prompts and retrieve them with arguments. `listPrompts()` walks every page on your behalf and returns the complete list (pass an explicit `{ cursor }` for per-page control): ```ts source="../examples/guides/clientGuide.examples.ts#getPrompt_basic" @@ -570,7 +566,7 @@ console.log(messages); ## Completions -Both prompts and resources can support argument completions. Use {@linkcode @modelcontextprotocol/client!client/client.Client#complete | complete()} to request autocompletion suggestions from the server as a user types: +Both prompts and resources can support argument completions. Use `complete()` to request autocompletion suggestions from the server as a user types: ```ts source="../examples/guides/clientGuide.examples.ts#complete_basic" const { completion } = await client.complete({ @@ -605,7 +601,7 @@ await client.readResource({ uri: 'config://app' }, { cacheMode: 'bypass' }); // `'bypass'` leaves the cache byte-untouched, including the internal `tools/list` entry that [`x-mcp-header` parameter mirroring](#x-mcp-header-parameter-mirroring-2026-07-28-draft) and output-schema validation read. Cached entries are evicted automatically when the server signals a change: a `list_changed` notification drops the matching list entries, and `notifications/resources/updated` drops the cached body for that URI (see [Notifications](#notifications)). -Three {@linkcode @modelcontextprotocol/client!client/client.ClientOptions | ClientOptions} fields tune the behavior: +Three `ClientOptions` fields tune the behavior: - **`responseCacheStore`**: the backing store; defaults to a per-client `InMemoryResponseCacheStore` (at most 512 `resources/read` entries by default). Supply your own `ResponseCacheStore` implementation (the interface is async-ready, so a Redis-style store fits) to persist entries or share one store across clients. Entries are keyed by connected-server identity, so co-tenants never collide. @@ -620,7 +616,7 @@ Three {@linkcode @modelcontextprotocol/client!client/client.ClientOptions | Clie ### Automatic list-change tracking -The {@linkcode @modelcontextprotocol/client!client/client.ClientOptions | listChanged} client option keeps a local cache of tools, prompts, or resources in sync with the server. It provides automatic server capability gating, debouncing (300 ms by default), auto-refresh, and +The `listChanged` client option keeps a local cache of tools, prompts, or resources in sync with the server. It provides automatic server capability gating, debouncing (300 ms by default), auto-refresh, and error-first callbacks: ```ts source="../examples/guides/clientGuide.examples.ts#listChanged_basic" @@ -649,7 +645,7 @@ const client = new Client( ### Manual notification handlers -For full control — or for notification types not covered by `listChanged` (such as log messages) — register handlers directly with {@linkcode @modelcontextprotocol/client!client/client.Client#setNotificationHandler | setNotificationHandler()}: +For full control — or for notification types not covered by `listChanged` (such as log messages) — register handlers directly with `setNotificationHandler()`: ```ts source="../examples/guides/clientGuide.examples.ts#notificationHandler_basic" // Server log messages (sent by the server during request processing) @@ -669,7 +665,7 @@ client.setNotificationHandler('notifications/resources/list_changed', async () = > MCP logging (including `setLoggingLevel()` and `notifications/message`) is deprecated as of protocol version 2026-07-28 (SEP-2577); see the [deprecated features registry](https://modelcontextprotocol.io/specification/draft/deprecated). It remains fully functional on > 2025-era connections during the deprecation window (at least twelve months); on the 2026-07-28 revision the log level travels per request instead (see below). Servers should migrate to stderr logging (STDIO) or OpenTelemetry. -To control the minimum severity of log messages the server sends, use {@linkcode @modelcontextprotocol/client!client/client.Client#setLoggingLevel | setLoggingLevel()}: +To control the minimum severity of log messages the server sends, use `setLoggingLevel()`: ```ts source="../examples/guides/clientGuide.examples.ts#setLoggingLevel_basic" await client.setLoggingLevel('warning'); @@ -688,14 +684,13 @@ const result = await client.callTool({ Messages arrive through the same `notifications/message` handler shown above. See the [2026-07-28 support guide](./migration/support-2026-07-28.md#ctxmcpreqlog-and-the-per-request-loglevel) for the server-side semantics. > [!WARNING] -> `listChanged` and {@linkcode @modelcontextprotocol/client!client/client.Client#setNotificationHandler | setNotificationHandler()} resolve per notification type by last registration wins: `listChanged` installs its handler during `connect()`, so a manual handler registered +> `listChanged` and `setNotificationHandler()` resolve per notification type by last registration wins: `listChanged` installs its handler during `connect()`, so a manual handler registered > after connecting silently disables `listChanged` for that type, and one registered before connecting is overwritten by it. ### Subscription streams (2026-07-28) On a 2026-07-28 connection the server delivers change notifications only on a `subscriptions/listen` stream the client opens: nothing arrives unsolicited. The `listChanged` option handles this transparently: on a modern connection it auto-opens a stream whose filter is the -intersection of the configured sub-options and the server's advertised capabilities (the handle is exposed as {@linkcode @modelcontextprotocol/client!client/client.Client#autoOpenedSubscription | autoOpenedSubscription}). To open a stream explicitly, use {@linkcode -@modelcontextprotocol/client!client/client.Client#listen | listen()}: +intersection of the configured sub-options and the server's advertised capabilities (the handle is exposed as `autoOpenedSubscription`). To open a stream explicitly, use `listen()`: ```ts source="../examples/guides/clientGuide.examples.ts#listen_basic" client.setNotificationHandler('notifications/tools/list_changed', async () => { @@ -738,7 +733,7 @@ runnable example of both watch styles. ## Handling server-initiated requests MCP is bidirectional — servers can send requests _to_ the client during tool execution, as long as the client declares matching capabilities (see [Architecture](https://modelcontextprotocol.io/docs/learn/architecture) in the MCP overview). Declare the corresponding capability -when constructing the {@linkcode @modelcontextprotocol/client!client/client.Client | Client} and register a request handler: +when constructing the `Client` and register a request handler: ```ts source="../examples/guides/clientGuide.examples.ts#capabilities_declaration" const client = new Client( @@ -755,7 +750,7 @@ const client = new Client( On 2025-era connections these arrive as server→client JSON-RPC requests. On a 2026-07-28 connection there is no server→client request channel: the server answers `tools/call` / `prompts/get` / `resources/read` with an `input_required` result instead, and the client fulfils the embedded requests automatically through the same handlers you register below, then retries the call with the collected responses and a byte-exact echo of the server's opaque `requestState`. `callTool()` and its siblings keep returning their plain result: the interactive -rounds happen inside the call, capped at `maxRounds` (default 10), after which the call rejects with a typed {@linkcode @modelcontextprotocol/client!index.SdkErrorCode.InputRequiredRoundsExceeded | INPUT_REQUIRED_ROUNDS_EXCEEDED} error. Configure or disable this via +rounds happen inside the call, capped at `maxRounds` (default 10), after which the call rejects with a typed `INPUT_REQUIRED_ROUNDS_EXCEEDED` error. Configure or disable this via `ClientOptions.inputRequired` (`{ autoFulfill?: boolean; maxRounds?: number }`); see [Manual multi-round-trip handling](#manual-multi-round-trip-handling-2026-07-28) for the opt-out flow. Handlers are era-transparent: register once for both delivery paths. ### Sampling @@ -824,7 +819,7 @@ client.setRequestHandler('roots/list', async () => { }); ``` -When the available roots change, notify the server with {@linkcode @modelcontextprotocol/client!client/client.Client#sendRootsListChanged | client.sendRootsListChanged()}. +When the available roots change, notify the server with `client.sendRootsListChanged()`. ### Manual multi-round-trip handling (2026-07-28) @@ -864,14 +859,13 @@ if (isInputRequiredResult(value)) { } ``` -The manual retry goes through `client.request()` rather than `callTool()`: `inputResponses` and `requestState` are not fields of the typed `CallToolRequest` params. On the explicit-schema `request()` path, wrap the result schema with {@linkcode -@modelcontextprotocol/client!index.withInputRequired | withInputRequired()} so both outcomes are typed and validated. For the full loop (including URL-mode elicitation), see [`mrtr/client.ts`](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/examples/mrtr/client.ts). +The manual retry goes through `client.request()` rather than `callTool()`: `inputResponses` and `requestState` are not fields of the typed `CallToolRequest` params. On the explicit-schema `request()` path, wrap the result schema with `withInputRequired()` so both outcomes are typed and validated. For the full loop (including URL-mode elicitation), see [`mrtr/client.ts`](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/examples/mrtr/client.ts). ## Error handling ### Tool errors vs protocol errors -{@linkcode @modelcontextprotocol/client!client/client.Client#callTool | callTool()} has two error surfaces: the tool can _run but report failure_ via `isError: true` in the result, or the _request itself can fail_ and throw an exception. Always check both: +`callTool()` has two error surfaces: the tool can _run but report failure_ via `isError: true` in the result, or the _request itself can fail_ and throw an exception. Always check both: ```ts source="../examples/guides/clientGuide.examples.ts#errorHandling_toolErrors" try { @@ -899,15 +893,13 @@ try { } ``` -{@linkcode @modelcontextprotocol/client!index.ProtocolError | ProtocolError} represents JSON-RPC errors from the server (method not found, invalid params, internal error). {@linkcode @modelcontextprotocol/client!index.SdkError | SdkError} represents local SDK errors — {@linkcode -@modelcontextprotocol/client!index.SdkErrorCode.RequestTimeout | REQUEST_TIMEOUT}, {@linkcode @modelcontextprotocol/client!index.SdkErrorCode.ConnectionClosed | CONNECTION_CLOSED}, {@linkcode @modelcontextprotocol/client!index.SdkErrorCode.CapabilityNotSupported | -CAPABILITY_NOT_SUPPORTED}, and others. The {@linkcode @modelcontextprotocol/client!index.SdkErrorCode | SdkErrorCode} enum is the complete vocabulary; the [error mapping table](./migration/upgrade-to-v2.md#sdkerrorcode-enum-complete) in the upgrade guide describes when each +`ProtocolError` represents JSON-RPC errors from the server (method not found, invalid params, internal error). `SdkError` represents local SDK errors — `REQUEST_TIMEOUT`, `CONNECTION_CLOSED`, `CAPABILITY_NOT_SUPPORTED`, and others. The `SdkErrorCode` enum is the complete vocabulary; the [error mapping table](./migration/upgrade-to-v2.md#sdkerrorcode-enum-complete) in the upgrade guide describes when each code is raised. ### Connection lifecycle -Set {@linkcode @modelcontextprotocol/client!client/client.Client#onerror | client.onerror} to catch out-of-band transport errors (SSE disconnects, parse errors). Set {@linkcode @modelcontextprotocol/client!client/client.Client#onclose | client.onclose} to detect when the -connection drops — pending requests are rejected with a {@linkcode @modelcontextprotocol/client!index.SdkErrorCode.ConnectionClosed | CONNECTION_CLOSED} error: +Set `client.onerror` to catch out-of-band transport errors (SSE disconnects, parse errors). Set `client.onclose` to detect when the +connection drops — pending requests are rejected with a `CONNECTION_CLOSED` error: ```ts source="../examples/guides/clientGuide.examples.ts#errorHandling_lifecycle" // Out-of-band errors (SSE disconnects, parse errors) @@ -924,7 +916,7 @@ client.onclose = () => { ### Timeouts All requests have a 60-second default timeout. Pass a custom `timeout` in the options to override it. On timeout, the SDK sends a cancellation notification to the server (on a 2026-07-28 Streamable HTTP connection the per-request stream is aborted instead, which is the -spec's cancellation signal) and rejects the promise with {@linkcode @modelcontextprotocol/client!index.SdkErrorCode.RequestTimeout | SdkErrorCode.RequestTimeout}: +spec's cancellation signal) and rejects the promise with `SdkErrorCode.RequestTimeout`: ```ts source="../examples/guides/clientGuide.examples.ts#errorHandling_timeout" try { @@ -942,7 +934,7 @@ try { ### HTTP transport errors -When an HTTP transport request fails with a non-OK status, the SDK throws {@linkcode @modelcontextprotocol/client!index.SdkHttpError | SdkHttpError}, an `SdkError` subclass with typed `data` (`{ status, statusText? }`) and `status`/`statusText` getters, so you can branch on the status without casting. The codes are the `ClientHttp*` members of `SdkErrorCode`: e.g. `CLIENT_HTTP_AUTHENTICATION` (a 401 persisting after re-authentication), `CLIENT_HTTP_FORBIDDEN` (a 403 `insufficient_scope` after the step-up +When an HTTP transport request fails with a non-OK status, the SDK throws `SdkHttpError`, an `SdkError` subclass with typed `data` (`{ status, statusText? }`) and `status`/`statusText` getters, so you can branch on the status without casting. The codes are the `ClientHttp*` members of `SdkErrorCode`: e.g. `CLIENT_HTTP_AUTHENTICATION` (a 401 persisting after re-authentication), `CLIENT_HTTP_FORBIDDEN` (a 403 `insufficient_scope` after the step-up retry cap), `CLIENT_HTTP_FAILED_TO_OPEN_STREAM`. (Exception: an unexpected response content type throws a plain `SdkError` with code `CLIENT_HTTP_UNEXPECTED_CONTENT`.) ```ts source="../examples/guides/clientGuide.examples.ts#errorHandling_http" @@ -959,7 +951,7 @@ try { ## Client middleware -Use {@linkcode @modelcontextprotocol/client!client/middleware.createMiddleware | createMiddleware()} and {@linkcode @modelcontextprotocol/client!client/middleware.applyMiddlewares | applyMiddlewares()} to compose fetch middleware pipelines. Middleware wraps the underlying `fetch` +Use `createMiddleware()` and `applyMiddlewares()` to compose fetch middleware pipelines. Middleware wraps the underlying `fetch` call and can add headers, handle retries, or log requests. Pass the enhanced fetch to the transport via the `fetch` option: ```ts source="../examples/guides/clientGuide.examples.ts#middleware_basic" diff --git a/docs/documents.md b/docs/documents.md deleted file mode 100644 index 65cff9749c..0000000000 --- a/docs/documents.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: Documents -children: - - ./server-quickstart.md - - ./server.md - - ./client-quickstart.md - - ./client.md - - ./faq.md ---- - -# Documents - -- [Server Quickstart](./server-quickstart.md) – build a weather server from scratch and connect it to VS Code -- [Server](./server.md) – building MCP servers: transports, tools, resources, prompts, server-initiated requests, and deployment -- [Client Quickstart](./client-quickstart.md) – build an LLM-powered chatbot that connects to an MCP server and calls its tools -- [Client](./client.md) – building MCP clients: connecting, tools, resources, prompts, server-initiated requests, and error handling -- [FAQ](./faq.md) – frequently asked questions and troubleshooting diff --git a/docs/faq.md b/docs/faq.md index 45603481ff..1d07ced7a4 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -67,7 +67,7 @@ For production use, you can either: ### Where can I find runnable server examples? -The [server quickstart](./server-quickstart.md) walks you through building a weather server from scratch. Its complete source lives in [`examples/server-quickstart/`](https://github.com/modelcontextprotocol/typescript-sdk/tree/main/examples/server-quickstart/). For more advanced examples (OAuth, streaming, sessions, etc.), see the server examples index in [`examples/README.md`](../examples/README.md). +The [server quickstart](./server-quickstart.md) walks you through building a weather server from scratch. Its complete source lives in [`examples/server-quickstart/`](https://github.com/modelcontextprotocol/typescript-sdk/tree/main/examples/server-quickstart/). For more advanced examples (OAuth, streaming, sessions, etc.), see the server examples index in [`examples/README.md`](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/examples/README.md). ### Where are the server auth helpers? diff --git a/docs/migration/index.md b/docs/migration/index.md index c9c4161b60..89eb5d0a07 100644 --- a/docs/migration/index.md +++ b/docs/migration/index.md @@ -49,6 +49,6 @@ the codemod first; the guide is the codemod's companion for what's left. ## See also -- [`@modelcontextprotocol/codemod` README](../../packages/codemod/README.md) +- [`@modelcontextprotocol/codemod` README](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/packages/codemod/README.md) - [FAQ](../faq.md) - [Examples](https://github.com/modelcontextprotocol/typescript-sdk/tree/main/examples) diff --git a/docs/migration/upgrade-to-v2.md b/docs/migration/upgrade-to-v2.md index f59ecb7dbe..0924aef07d 100644 --- a/docs/migration/upgrade-to-v2.md +++ b/docs/migration/upgrade-to-v2.md @@ -60,16 +60,16 @@ Migrating a large codebase gradually instead of in one pass? See ## What the codemod handles -The codemod ([`@modelcontextprotocol/codemod`](../../packages/codemod/README.md)) +The codemod ([`@modelcontextprotocol/codemod`](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/packages/codemod/README.md)) mechanically applies every rename whose mapping is fixed. The mappings are the **source of truth** — they live in the codemod package and are not reproduced here: | Mapping | Source file | | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | -| `@modelcontextprotocol/sdk/...` import paths → v2 packages | [`mappings/importMap.ts`](../../packages/codemod/src/migrations/v1-to-v2/mappings/importMap.ts) | -| Symbol renames (`McpError` → `ProtocolError`, `JSONRPCError` → `JSONRPCErrorResponse`, …) | [`mappings/symbolMap.ts`](../../packages/codemod/src/migrations/v1-to-v2/mappings/symbolMap.ts) | -| `setRequestHandler(Schema, …)` → `setRequestHandler('method/string', …)` | [`mappings/schemaToMethodMap.ts`](../../packages/codemod/src/migrations/v1-to-v2/mappings/schemaToMethodMap.ts) | -| `extra.*` → `ctx.mcpReq.*` / `ctx.http?.*` property remap | [`mappings/contextPropertyMap.ts`](../../packages/codemod/src/migrations/v1-to-v2/mappings/contextPropertyMap.ts) | +| `@modelcontextprotocol/sdk/...` import paths → v2 packages | [`mappings/importMap.ts`](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/packages/codemod/src/migrations/v1-to-v2/mappings/importMap.ts) | +| Symbol renames (`McpError` → `ProtocolError`, `JSONRPCError` → `JSONRPCErrorResponse`, …) | [`mappings/symbolMap.ts`](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/packages/codemod/src/migrations/v1-to-v2/mappings/symbolMap.ts) | +| `setRequestHandler(Schema, …)` → `setRequestHandler('method/string', …)` | [`mappings/schemaToMethodMap.ts`](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/packages/codemod/src/migrations/v1-to-v2/mappings/schemaToMethodMap.ts) | +| `extra.*` → `ctx.mcpReq.*` / `ctx.http?.*` property remap | [`mappings/contextPropertyMap.ts`](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/packages/codemod/src/migrations/v1-to-v2/mappings/contextPropertyMap.ts) | In addition the codemod: @@ -365,7 +365,7 @@ coexist under different names. ### Imports & transports The codemod rewrites every `@modelcontextprotocol/sdk/...` import path via -[`importMap.ts`](../../packages/codemod/src/migrations/v1-to-v2/mappings/importMap.ts). +[`importMap.ts`](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/packages/codemod/src/migrations/v1-to-v2/mappings/importMap.ts). A few transports need a decision the codemod can't make: - **`StreamableHTTPServerTransport` → which runtime?** The codemod renames it to @@ -431,7 +431,7 @@ A few transports need a decision the codemod can't make: (deprecated, frozen v1 copy); migrate AS to a dedicated IdP/OAuth library. `AuthInfo` is now re-exported by `@modelcontextprotocol/client` and `@modelcontextprotocol/server`. - The codemod's [`importMap.ts`](../../packages/codemod/src/migrations/v1-to-v2/mappings/importMap.ts) + The codemod's [`importMap.ts`](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/packages/codemod/src/migrations/v1-to-v2/mappings/importMap.ts) routes every `…/server/auth/**` deep path (including `…/server/auth/middleware/{bearerAuth,allowedMethods,clientAuth}.js`, `…/server/auth/handlers/*.js`, `…/server/auth/providers/proxyProvider.js`) to @@ -452,7 +452,7 @@ object named `extra` — is now a structured **context** object named `ctx`. Thi `ctx` that appears throughout the rest of this guide. The codemod renames the parameter and remaps property access via -[`contextPropertyMap.ts`](../../packages/codemod/src/migrations/v1-to-v2/mappings/contextPropertyMap.ts). +[`contextPropertyMap.ts`](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/packages/codemod/src/migrations/v1-to-v2/mappings/contextPropertyMap.ts). A few mappings need optional-chaining adjustment (the `http` group is `undefined` on stdio): @@ -522,7 +522,7 @@ wire behavior, and remains functional for at least the twelve-month deprecation The low-level handler registration takes a **method string** instead of a Zod schema. The codemod rewrites every spec-method registration via -[`schemaToMethodMap.ts`](../../packages/codemod/src/migrations/v1-to-v2/mappings/schemaToMethodMap.ts). +[`schemaToMethodMap.ts`](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/packages/codemod/src/migrations/v1-to-v2/mappings/schemaToMethodMap.ts). ```typescript // v1 @@ -1807,7 +1807,7 @@ where an entry notes its own signature change: ## Need help? -- The codemod's [`@mcp-codemod-error`](../../packages/codemod/README.md) markers point +- The codemod's [`@mcp-codemod-error`](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/packages/codemod/README.md) markers point at every site it could not safely rewrite. - The [FAQ](../faq.md) covers common v2 questions. - Runnable [examples](https://github.com/modelcontextprotocol/typescript-sdk/tree/main/examples) diff --git a/docs/server-quickstart.md b/docs/server-quickstart.md index e9f057c015..49511da872 100644 --- a/docs/server-quickstart.md +++ b/docs/server-quickstart.md @@ -207,7 +207,7 @@ interface ForecastResponse { ### Registering tools -Each tool is registered with {@linkcode @modelcontextprotocol/server!server/mcp.McpServer#registerTool | server.registerTool()}, which takes the tool name, a configuration object (with description and input schema), and a callback that implements the tool logic. Create the server inside a `createServer()` factory and register both weather tools on it. The serving entry in the next step builds the instance it serves by calling this factory, so keep it cheap and side-effect-free: +Each tool is registered with `server.registerTool()`, which takes the tool name, a configuration object (with description and input schema), and a callback that implements the tool logic. Create the server inside a `createServer()` factory and register both weather tools on it. The serving entry in the next step builds the instance it serves by calling this factory, so keep it cheap and side-effect-free: ```ts source="../examples/server-quickstart/src/index.ts#registerTools" // Create a server with both weather tools registered. The serving entry calls @@ -352,7 +352,7 @@ function createServer(): McpServer { ### Running the server -Finally, serve the factory on stdio with {@linkcode @modelcontextprotocol/server!server/serveStdio.serveStdio | serveStdio}. The entry owns the transport and negotiates the protocol revision with each client, so the same factory serves current hosts (such as VS Code) and clients that speak the 2026-07-28 draft revision; see [Serving the 2026-07-28 draft revision on stdio](./server.md#serving-the-2026-07-28-draft-revision-on-stdio) in the server guide for the options: +Finally, serve the factory on stdio with `serveStdio`. The entry owns the transport and negotiates the protocol revision with each client, so the same factory serves current hosts (such as VS Code) and clients that speak the 2026-07-28 draft revision; see [Serving the 2026-07-28 draft revision on stdio](./server.md#serving-the-2026-07-28-draft-revision-on-stdio) in the server guide for the options: ```ts source="../examples/server-quickstart/src/index.ts#main" void serveStdio(createServer); diff --git a/docs/server.md b/docs/server.md index 918b3c297e..dee32b4c6f 100644 --- a/docs/server.md +++ b/docs/server.md @@ -8,7 +8,7 @@ This guide covers the TypeScript SDK APIs for building MCP servers. For protocol Building a server takes three steps: -1. Create an {@linkcode @modelcontextprotocol/server!server/mcp.McpServer | McpServer} and register your [tools](#tools), [resources](#resources), and [prompts](#prompts). +1. Create an `McpServer` and register your [tools](#tools), [resources](#resources), and [prompts](#prompts). 2. Create a transport — [Streamable HTTP](#streamable-http) for remote servers or [stdio](#stdio) for local integrations. 3. Connect them with `server.connect(transport)`. @@ -52,7 +52,7 @@ MCP supports two transport mechanisms (see [Transport layer](https://modelcontex ### Streamable HTTP -Create a {@linkcode @modelcontextprotocol/node!streamableHttp.NodeStreamableHTTPServerTransport | NodeStreamableHTTPServerTransport} and connect it to your server: +Create a `NodeStreamableHTTPServerTransport` and connect it to your server: ```ts source="../examples/guides/serverGuide.examples.ts#streamableHttp_stateful" const server = new McpServer({ name: 'my-server', version: '1.0.0' }); @@ -96,7 +96,7 @@ To keep an existing sessionful 2025 deployment serving legacy traffic, route wit ### stdio -For local, process-spawned integrations, use {@linkcode @modelcontextprotocol/server!server/stdio.StdioServerTransport | StdioServerTransport}: +For local, process-spawned integrations, use `StdioServerTransport`: ```ts source="../examples/guides/serverGuide.examples.ts#stdio_basic" const server = new McpServer({ name: 'my-server', version: '1.0.0' }); @@ -142,7 +142,7 @@ const server = new McpServer( Tools let clients invoke actions on your server — they are usually the main way LLMs call into your application (see [Tools](https://modelcontextprotocol.io/docs/learn/server-concepts#tools) in the MCP overview). -Register a tool with {@linkcode @modelcontextprotocol/server!server/mcp.McpServer#registerTool | registerTool}. Provide an `inputSchema` (any Standard Schema library that supports JSON Schema conversion: Zod v4 shown here; ArkType and Valibot also conform) to validate +Register a tool with `registerTool`. Provide an `inputSchema` (any Standard Schema library that supports JSON Schema conversion: Zod v4 shown here; ArkType and Valibot also conform) to validate arguments, and optionally an `outputSchema` for structured return values. > On the 2026-07-28 draft serving path, a tool whose `inputSchema` carries an `x-mcp-header` annotation has that argument mirrored into an `Mcp-Param-{Name}` HTTP request header by conforming clients. `createMcpHandler` validates those headers before dispatch and rejects a @@ -309,7 +309,7 @@ server.registerResource( ); ``` -Dynamic resources use {@linkcode @modelcontextprotocol/server!server/mcp.ResourceTemplate | ResourceTemplate} with URI patterns. The `list` callback lets clients discover available instances: +Dynamic resources use `ResourceTemplate` with URI patterns. The `list` callback lets clients discover available instances: ```ts source="../examples/guides/serverGuide.examples.ts#registerResource_template" server.registerResource( @@ -375,7 +375,7 @@ server.registerPrompt( ## Completions -Both prompts and resources can support argument completions. Wrap a field in the `argsSchema` with {@linkcode @modelcontextprotocol/server!server/completable.completable | completable()} to provide autocompletion suggestions: +Both prompts and resources can support argument completions. Wrap a field in the `argsSchema` with `completable()` to provide autocompletion suggestions: ```ts source="../examples/guides/serverGuide.examples.ts#registerPrompt_completion" server.registerPrompt( @@ -408,7 +408,7 @@ For resource templates, pass a `complete` callback map to the `ResourceTemplate` ## Extension capabilities A server advertises support for [MCP extensions](https://modelcontextprotocol.io/specification/latest/basic/lifecycle#capability-negotiation) through `capabilities.extensions` — a map from extension identifier to that extension's settings object. Declare entries with -{@linkcode @modelcontextprotocol/server!server/server.Server#registerCapabilities | server.server.registerCapabilities()} before connecting: +`server.server.registerCapabilities()` before connecting: ```ts source="../examples/guides/serverGuide.examples.ts#extensionCapabilities_register" server.server.registerCapabilities({ @@ -419,14 +419,14 @@ server.server.registerCapabilities({ The map is advertised in the `initialize` result on legacy connections and in the `server/discover` response on 2026-07-28 ones. Identifiers are prefix-qualified per the spec's `_meta` key naming rules (e.g. `com.example/feature-flags`); each value is free-form JSON for that extension's settings — `{}` means supported with no settings. -For a runnable pair, see the [`extension-capabilities/` example](../examples/extension-capabilities/README.md); reading the map client-side is covered in the [client guide](./client.md#extension-capabilities). +For a runnable pair, see the [`extension-capabilities/` example](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/examples/extension-capabilities/README.md); reading the map client-side is covered in the [client guide](./client.md#extension-capabilities). ## Cache hints (2026-07-28 draft) The 2026-07-28 revision requires `ttlMs` and `cacheScope` on the cacheable results (`tools/list`, `prompts/list`, `resources/list`, `resources/templates/list`, `resources/read`, and `server/discover`) so clients and intermediaries know how long a response stays fresh and whether it may be shared (SEP-2549). The SDK fills both fields automatically when serving that revision, defaulting to `ttlMs: 0` and `cacheScope: 'private'` (immediately stale, never shared). Responses to 2025-era requests are never affected. -To advertise a real cache policy, set {@linkcode @modelcontextprotocol/server!server/server.ServerOptions | ServerOptions.cacheHints} per operation, and/or `cacheHint` on an individual resource registration: +To advertise a real cache policy, set `ServerOptions.cacheHints` per operation, and/or `cacheHint` on an individual resource registration: ```ts source="../examples/guides/serverGuide.examples.ts#cacheHints_basic" const server = new McpServer( @@ -467,7 +467,7 @@ Use `cacheScope: 'public'` only for results that are identical for every caller: Logging lets your server send structured diagnostics — debug traces, progress updates, warnings — to the connected client as notifications (see [Logging](https://modelcontextprotocol.io/specification/latest/server/utilities/logging) in the MCP specification). -Declare the `logging` capability, then call `ctx.mcpReq.log(level, data)` (from {@linkcode @modelcontextprotocol/server!index.ServerContext | ServerContext}) inside any handler: +Declare the `logging` capability, then call `ctx.mcpReq.log(level, data)` (from `ServerContext`) inside any handler: ```ts source="../examples/guides/serverGuide.examples.ts#logging_capability" const server = new McpServer({ name: 'my-server', version: '1.0.0' }, { capabilities: { logging: {} } }); @@ -499,7 +499,7 @@ On a 2026-07-28 request, `ctx.mcpReq.log()` reads its level filter from the requ Progress notifications let a tool report incremental status updates during long-running operations (see [Progress](https://modelcontextprotocol.io/specification/latest/basic/utilities/progress) in the MCP specification). -If the client includes a `progressToken` in the request `_meta`, send `notifications/progress` via `ctx.mcpReq.notify()` (from {@linkcode @modelcontextprotocol/server!index.BaseContext | BaseContext}): +If the client includes a `progressToken` in the request `_meta`, send `notifications/progress` via `ctx.mcpReq.notify()` (from `BaseContext`): ```ts source="../examples/guides/serverGuide.examples.ts#registerTool_progress" server.registerTool( @@ -539,10 +539,10 @@ server.registerTool( Servers can signal that their tool, prompt, or resource lists changed, or that a specific resource's content changed, so clients can refresh. **List changes** are emitted automatically: registering, enabling, disabling, updating, or removing a tool, prompt, or resource sends the matching `notifications/*/list_changed` (`McpServer` advertises the corresponding `listChanged: true` capability on registration; -declare it up front only when using the low-level `Server`). You can also send them explicitly with {@linkcode @modelcontextprotocol/server!server/mcp.McpServer#sendToolListChanged | sendToolListChanged()}, `sendPromptListChanged()`, and `sendResourceListChanged()`. +declare it up front only when using the low-level `Server`). You can also send them explicitly with `sendToolListChanged()`, `sendPromptListChanged()`, and `sendResourceListChanged()`. **Per-resource updates** (2025-era connections) require hand-wiring; `registerResource` has no subscribe option. Declare `resources: { subscribe: true }`, register the `resources/subscribe`/`resources/unsubscribe` handlers on the underlying low-level server, and push -{@linkcode @modelcontextprotocol/server!server/server.Server#sendResourceUpdated | sendResourceUpdated()} when the data changes: +`sendResourceUpdated()` when the data changes: ```ts source="../examples/guides/serverGuide.examples.ts#subscriptions_legacy" const server = new McpServer( @@ -569,7 +569,7 @@ async function onConfigChanged() { ``` **On the 2026-07-28 revision** clients receive change notifications only on a `subscriptions/listen` stream they open, and the serving entries handle that method themselves (nothing to register). Over HTTP, publish through the handler's typed -{@linkcode @modelcontextprotocol/server!server/serverEventBus.ServerNotifier | notify} facade; each call reaches every open subscription that opted in: +`notify` facade; each call reaches every open subscription that opted in: ```ts source="../examples/guides/serverGuide.examples.ts#subscriptions_notify" const handler = createMcpHandler(() => buildServer()); @@ -579,8 +579,8 @@ handler.notify.resourceUpdated('config://app'); handler.notify.toolsChanged(); ``` -The default in-process {@linkcode @modelcontextprotocol/server!server/serverEventBus.InMemoryServerEventBus | InMemoryServerEventBus} covers single-process deployments; multi-process deployments supply their own -{@linkcode @modelcontextprotocol/server!server/serverEventBus.ServerEventBus | ServerEventBus} via the `bus` option. On stdio, `serveStdio` pins one instance per connection and routes its ordinary `send*ListChanged()` calls onto open subscriptions automatically. Per-resource updates need one change on a 2026 connection: the subscription bookkeeping lives at the entry (the client's listen filter), so the hand-wired `resources/subscribe` handlers above never run. Publish +The default in-process `InMemoryServerEventBus` covers single-process deployments; multi-process deployments supply their own +`ServerEventBus` via the `bus` option. On stdio, `serveStdio` pins one instance per connection and routes its ordinary `send*ListChanged()` calls onto open subscriptions automatically. Per-resource updates need one change on a 2026 connection: the subscription bookkeeping lives at the entry (the client's listen filter), so the hand-wired `resources/subscribe` handlers above never run. Publish `sendResourceUpdated()` unconditionally when the data changes and let the entry deliver it only to subscriptions that listed the URI. On the 2026-07-28 revision delivery is capability-gated per type: the entry honors `resourceSubscriptions` only when the server advertises `resources: { subscribe: true }`, and each list-changed type only with the matching `listChanged` capability (on 2025-era connections @@ -624,13 +624,13 @@ To propagate context onward (for example on a server-initiated sampling request, MCP is bidirectional: servers can request input _from_ the client during tool execution, as long as the client declares matching capabilities (see [Architecture](https://modelcontextprotocol.io/docs/learn/architecture) in the MCP overview). On 2025-era connections the server pushes a JSON-RPC request to the client (the sections below). On the 2026-07-28 revision there is no server→client request channel: the handler **returns** an `input_required` result carrying the embedded requests, and the client retries the call with the responses. -On a connection pinned to the 2026-07-28 draft revision (served via `serveStdio` or `createMcpHandler`), the push-style channels below throw an {@linkcode @modelcontextprotocol/server!index.SdkError | SdkError} with -code {@linkcode @modelcontextprotocol/server!index.SdkErrorCode.MethodNotSupportedByProtocolVersion | METHOD_NOT_SUPPORTED_BY_PROTOCOL_VERSION} before anything reaches the wire (see the [2026-07-28 support guide](./migration/support-2026-07-28.md)). +On a connection pinned to the 2026-07-28 draft revision (served via `serveStdio` or `createMcpHandler`), the push-style channels below throw an `SdkError` with +code `METHOD_NOT_SUPPORTED_BY_PROTOCOL_VERSION` before anything reaches the wire (see the [2026-07-28 support guide](./migration/support-2026-07-28.md)). ### Requesting input on 2026-07-28: `input_required` -On the 2026-07-28 revision a `tools/call`, `prompts/get`, or `resources/read` handler requests client input by returning {@linkcode @modelcontextprotocol/server!index.inputRequired | inputRequired(...)}. The result names one or more -embedded requests, built with `inputRequired.elicit(...)` (form elicitation), `inputRequired.elicitUrl(...)` (URL elicitation), `inputRequired.createMessage(...)` (sampling), or `inputRequired.listRoots()`. Write the handler **write-once**: on every entry, first read what has already arrived via {@linkcode @modelcontextprotocol/server!index.acceptedContent | acceptedContent(ctx.mcpReq.inputResponses, key)}, and only ask for what is still missing: +On the 2026-07-28 revision a `tools/call`, `prompts/get`, or `resources/read` handler requests client input by returning `inputRequired(...)`. The result names one or more +embedded requests, built with `inputRequired.elicit(...)` (form elicitation), `inputRequired.elicitUrl(...)` (URL elicitation), `inputRequired.createMessage(...)` (sampling), or `inputRequired.listRoots()`. Write the handler **write-once**: on every entry, first read what has already arrived via `acceptedContent(ctx.mcpReq.inputResponses, key)`, and only ask for what is still missing: ```ts source="../examples/guides/serverGuide.examples.ts#registerTool_inputRequired" server.registerTool( @@ -674,7 +674,7 @@ and the handler reads it back with the typed `ctx.mcpReq.requestState()` > [!IMPORTANT] > `requestState` round-trips through the client and comes back as **attacker-controlled input**. State that influences authorization, resource access, or business logic must be integrity-protected; the SDK applies no protection of its own. Use -> {@linkcode @modelcontextprotocol/server!index.createRequestStateCodec | createRequestStateCodec}, an HMAC-SHA256 codec whose `verify` drops directly into the `ServerOptions.requestState` hook, which runs before the handler and answers tampered or expired state with a +> `createRequestStateCodec`, an HMAC-SHA256 codec whose `verify` drops directly into the `ServerOptions.requestState` hook, which runs before the handler and answers tampered or expired state with a > wire-level `-32602` (frozen message `"Invalid or expired requestState"`). The codec is signed, not encrypted. Do not put secrets in the payload. ```ts source="../examples/guides/serverGuide.examples.ts#requestState_codec" @@ -746,7 +746,7 @@ See [`mrtr/server.ts`](https://github.com/modelcontextprotocol/typescript-sdk/bl Sampling lets a tool handler request an LLM completion from the connected client — the handler describes a prompt and the client returns the model's response (see [Sampling](https://modelcontextprotocol.io/docs/learn/client-concepts#sampling) in the MCP overview). Use sampling when a tool needs the model to generate or transform text mid-execution. -Call `ctx.mcpReq.requestSampling(params)` (from {@linkcode @modelcontextprotocol/server!index.ServerContext | ServerContext}) inside a tool handler: +Call `ctx.mcpReq.requestSampling(params)` (from `ServerContext`) inside a tool handler: ```ts source="../examples/guides/serverGuide.examples.ts#registerTool_sampling" server.registerTool( @@ -796,7 +796,7 @@ Elicitation lets a tool handler request direct input from the user — form fiel > `ctx.mcpReq.elicitInput` is the 2025-era push channel and **throws a typed error on a 2026-07-28-era request**. Return `inputRequired.elicit(...)` (form) or `inputRequired.elicitUrl(...)` (URL) via `inputRequired({ inputRequests: { … } })` instead; see > [Requesting input on 2026-07-28](#requesting-input-on-2026-07-28-input_required). The throw-style `UrlElicitationRequiredError` (`-32042`) also fails loudly toward 2026-era requests. -Call `ctx.mcpReq.elicitInput(params)` (from {@linkcode @modelcontextprotocol/server!index.ServerContext | ServerContext}) inside a tool handler: +Call `ctx.mcpReq.elicitInput(params)` (from `ServerContext`) inside a tool handler: ```ts source="../examples/guides/serverGuide.examples.ts#registerTool_elicitation" server.registerTool( @@ -851,8 +851,7 @@ For runnable examples, see [`elicitation/server.ts`](https://github.com/modelcon > `server.server.listRoots()` **throws a typed error on a 2026-07-28-era instance**. Return `inputRequired({ inputRequests: { roots: inputRequired.listRoots() } })` and read the response from `ctx.mcpReq.inputResponses` on re-entry; see > [Requesting input on 2026-07-28](#requesting-input-on-2026-07-28-input_required). -Roots let a tool handler discover the client's workspace directories — for example, to scope a file search or identify project boundaries (see [Roots](https://modelcontextprotocol.io/docs/learn/client-concepts#roots) in the MCP overview). Call {@linkcode -@modelcontextprotocol/server!server/server.Server#listRoots | server.server.listRoots()} (requires the client to declare the `roots` capability): +Roots let a tool handler discover the client's workspace directories — for example, to scope a file search or identify project boundaries (see [Roots](https://modelcontextprotocol.io/docs/learn/client-concepts#roots) in the MCP overview). Call `server.server.listRoots()` (requires the client to declare the `roots` capability): ```ts source="../examples/guides/serverGuide.examples.ts#registerTool_roots" server.registerTool( @@ -889,9 +888,9 @@ process.on('SIGINT', async () => { }); ``` -Calling {@linkcode @modelcontextprotocol/server!index.Transport#close | transport.close()} closes SSE streams and rejects any pending outbound requests. In-flight tool handlers are not automatically drained — they are terminated when the process exits. +Calling `transport.close()` closes SSE streams and rejects any pending outbound requests. In-flight tool handlers are not automatically drained — they are terminated when the process exits. -For stdio servers, {@linkcode @modelcontextprotocol/server!server/mcp.McpServer#close | server.close()} is sufficient: +For stdio servers, `server.close()` is sufficient: ```ts source="../examples/guides/serverGuide.examples.ts#shutdown_stdio" process.on('SIGINT', async () => { @@ -909,7 +908,7 @@ For a complete multi-session server with shutdown handling, see [`repl/server.ts Under normal circumstances, cross-origin browser restrictions limit what a malicious website can do to your localhost server. [DNS rebinding attacks](https://en.wikipedia.org/wiki/DNS_rebinding) get around those restrictions entirely by making the requests appear as same-origin, since the attacking domain resolves to localhost. Validating the host header on the server side protects against this scenario. **All localhost MCP servers should use DNS rebinding protection.** -The recommended approach is to use {@linkcode @modelcontextprotocol/express!express.createMcpExpressApp | createMcpExpressApp()} (from `@modelcontextprotocol/express`) or {@linkcode @modelcontextprotocol/hono!hono.createMcpHonoApp | createMcpHonoApp()} (from +The recommended approach is to use `createMcpExpressApp()` (from `@modelcontextprotocol/express`) or `createMcpHonoApp()` (from `@modelcontextprotocol/hono`), which enable Host header validation by default: ```ts source="../examples/guides/serverGuide.examples.ts#dnsRebinding_basic" diff --git a/docs/v2-banner.js b/docs/v2-banner.js deleted file mode 100644 index ce0637c8ac..0000000000 --- a/docs/v2-banner.js +++ /dev/null @@ -1,9 +0,0 @@ -document.addEventListener("DOMContentLoaded", function () { - var banner = document.createElement("div"); - banner.innerHTML = - "This documents a pre-release version of the SDK. Expect breaking changes. For the stable SDK, see the V1 docs."; - banner.style.cssText = - "background:#fff3cd;color:#856404;border-bottom:1px solid #ffc107;padding:8px 16px;text-align:center;font-size:14px;"; - banner.querySelector("a").style.cssText = "color:#856404;text-decoration:underline;"; - document.body.insertBefore(banner, document.body.firstChild); -}); diff --git a/packages/codemod/README.md b/packages/codemod/README.md index f21089fc7c..a907eec4ca 100644 --- a/packages/codemod/README.md +++ b/packages/codemod/README.md @@ -20,13 +20,13 @@ working tree so you can review the diff. The mechanical rename mappings are the source of truth — see `src/migrations/v1-to-v2/mappings/`: -- [`importMap.ts`](./src/migrations/v1-to-v2/mappings/importMap.ts) — +- [`importMap.ts`](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/packages/codemod/src/migrations/v1-to-v2/mappings/importMap.ts) — `@modelcontextprotocol/sdk/...` import paths → v2 packages -- [`symbolMap.ts`](./src/migrations/v1-to-v2/mappings/symbolMap.ts) — +- [`symbolMap.ts`](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/packages/codemod/src/migrations/v1-to-v2/mappings/symbolMap.ts) — symbol renames (`McpError` → `ProtocolError`, …) -- [`schemaToMethodMap.ts`](./src/migrations/v1-to-v2/mappings/schemaToMethodMap.ts) — +- [`schemaToMethodMap.ts`](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/packages/codemod/src/migrations/v1-to-v2/mappings/schemaToMethodMap.ts) — `setRequestHandler(Schema, …)` → `setRequestHandler('method/string', …)` -- [`contextPropertyMap.ts`](./src/migrations/v1-to-v2/mappings/contextPropertyMap.ts) — +- [`contextPropertyMap.ts`](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/packages/codemod/src/migrations/v1-to-v2/mappings/contextPropertyMap.ts) — `extra.*` → `ctx.mcpReq.*` / `ctx.http?.*` Transforms in `src/migrations/v1-to-v2/transforms/` also rewrite `.tool()` → @@ -68,10 +68,10 @@ bracket access → `.get()`; sending plain-record headers keeps working), OAuth error-class consolidation (`instanceof InvalidGrantError` → `OAuthError` + `OAuthErrorCode`), per-scenario `SdkErrorCode` branch selection, `ctx.mcpReq.send()` schema-arg drop, and behavioral adaptation are manual — see the -[migration guide](../../docs/migration/upgrade-to-v2.md) for what to do after the +[migration guide](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/docs/migration/upgrade-to-v2.md) for what to do after the codemod runs. The codemod handles the v1→v2 SDK surface upgrade only. Adopting the 2026-07-28 protocol revision (`createMcpHandler`, multi-round-trip requests, `versionNegotiation`) is architectural and not codemod-automatable — see -[docs/migration/support-2026-07-28.md](../../docs/migration/support-2026-07-28.md). +[docs/migration/support-2026-07-28.md](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/docs/migration/support-2026-07-28.md). From 326eb264ea8ab86b57bfe2a32cd95ef0edbc793f Mon Sep 17 00:00:00 2001 From: Felix Weinberger Date: Mon, 29 Jun 2026 18:37:17 +0000 Subject: [PATCH 02/11] docs: render the API reference as markdown via typedoc-plugin-markdown typedoc now emits one markdown page per module into docs/api/ (plus a typedoc-vitepress-theme sidebar JSON) instead of a standalone HTML site. HTML-theme options (projectDocuments, customJs, navigationLinks, hostedBaseUrl, headings) are dropped; the root README is excluded since the site has its own landing page. New scripts: docs:api (typedoc), docs:dev, docs:build (typedoc + vitepress, the new docs:check gate). check:all now also runs sync:snippets --check, which skips the generated docs/api tree. --- .gitignore | 8 + package.json | 13 +- pnpm-lock.yaml | 1342 +++++++++++++++++++++++++++++++++++++- scripts/sync-snippets.ts | 9 +- typedoc.config.mjs | 24 +- 5 files changed, 1368 insertions(+), 28 deletions(-) diff --git a/.gitignore b/.gitignore index 6372eb1d57..48ada02c01 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,14 @@ dist/ # Git worktrees for local doc generation .worktrees/ +# Generated docs-site artifacts +docs/api/ +docs/.vitepress/cache/ +docs/.vitepress/dist/ +docs-v1/content/ +docs-v1/.vitepress/cache/ +docs-v1/.vitepress/dist/ + # Conformance test results results/ diff --git a/package.json b/package.json index 261ad9b92d..e3b765aeab 100644 --- a/package.json +++ b/package.json @@ -27,16 +27,18 @@ "sync:snippets": "tsx scripts/sync-snippets.ts", "examples:oauth-server:w": "pnpm --filter @mcp-examples/oauth exec tsx --watch server.ts", "run:examples": "tsx scripts/examples/run-examples.ts", - "docs": "typedoc", - "docs:multi": "bash scripts/generate-multidoc.sh", - "docs:check": "typedoc", + "docs:api": "typedoc", + "docs:dev": "vitepress dev docs", + "docs:build": "pnpm docs:api && vitepress build docs", + "docs:multi": "bash scripts/build-docs-site.sh", + "docs:check": "pnpm docs:build", "typecheck:all": "pnpm -r typecheck", "build:all": "pnpm -r build", "ci:publish": "pnpm run build:all && pnpm changeset publish", "prepack:all": "pnpm -r prepack", "lint:all": "pnpm sync:snippets --check && pnpm -r lint", "lint:fix:all": "pnpm sync:snippets && pnpm -r lint:fix", - "check:all": "pnpm -r typecheck && pnpm -r lint && pnpm run docs:check", + "check:all": "pnpm sync:snippets --check && pnpm -r typecheck && pnpm -r lint && pnpm run docs:check", "test:all": "pnpm -r test", "prepare": "npx --no-install lefthook install", "test:conformance:client": "pnpm --filter @modelcontextprotocol/test-conformance run test:conformance:client", @@ -77,8 +79,11 @@ "tslib": "^2.8.1", "tsx": "catalog:devTools", "typedoc": "catalog:devTools", + "typedoc-plugin-markdown": "^4.12.0", + "typedoc-vitepress-theme": "^1.1.3", "typescript": "catalog:devTools", "typescript-eslint": "catalog:devTools", + "vitepress": "^1.6.4", "vitest": "catalog:devTools", "zod": "catalog:runtimeShared" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 84a2dcbd5e..1e74a91e86 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -224,12 +224,21 @@ importers: typedoc: specifier: catalog:devTools version: 0.28.18(typescript@5.9.3) + typedoc-plugin-markdown: + specifier: ^4.12.0 + version: 4.12.0(typedoc@0.28.18(typescript@5.9.3)) + typedoc-vitepress-theme: + specifier: ^1.1.3 + version: 1.1.3(typedoc-plugin-markdown@4.12.0(typedoc@0.28.18(typescript@5.9.3))) typescript: specifier: catalog:devTools version: 5.9.3 typescript-eslint: specifier: catalog:devTools version: 8.57.2(eslint@9.39.4)(typescript@5.9.3) + vitepress: + specifier: ^1.6.4 + version: 1.6.4(@algolia/client-search@5.55.0)(@types/node@24.12.0)(change-case@5.4.4)(postcss@8.5.15)(search-insights@2.17.3)(typescript@5.9.3) vitest: specifier: catalog:devTools version: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@24.12.0)(vite@7.3.0(@types/node@24.12.0)(tsx@4.21.0)(yaml@2.8.3)) @@ -949,7 +958,7 @@ importers: version: link:../../packages/server better-auth: specifier: ^1.4.17 - version: 1.5.6(@opentelemetry/api@1.9.1)(better-sqlite3@12.8.0)(vitest@4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(vite@7.3.0(@types/node@25.5.0)(tsx@4.21.0)(yaml@2.8.3))) + version: 1.5.6(@opentelemetry/api@1.9.1)(better-sqlite3@12.8.0)(vitest@4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(vite@7.3.0(@types/node@25.5.0)(tsx@4.21.0)(yaml@2.8.3)))(vue@3.5.38(typescript@5.9.3)) better-sqlite3: specifier: ^12.6.2 version: 12.8.0 @@ -2037,6 +2046,82 @@ importers: packages: + '@algolia/abtesting@1.21.0': + resolution: {integrity: sha512-kGvHfBa9oQCvZh0YXeguSToBD9GNJ+gzUZQ9KPTg+KSsM36obYcsKPoX0NnlJtPflHXu7RkMaIi44xs9meR6Zw==} + engines: {node: '>= 14.0.0'} + + '@algolia/autocomplete-core@1.17.7': + resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} + + '@algolia/autocomplete-plugin-algolia-insights@1.17.7': + resolution: {integrity: sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==} + peerDependencies: + search-insights: '>= 1 < 3' + + '@algolia/autocomplete-preset-algolia@1.17.7': + resolution: {integrity: sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/autocomplete-shared@1.17.7': + resolution: {integrity: sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/client-abtesting@5.55.0': + resolution: {integrity: sha512-Zt2GjIm7vsaf7K23tk5JmtcVNc38G9p0C2L2Lrm06miyLE/NL2etHtHInvuLc1DjxTp7Y2nId4X/tzwo372K8Q==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-analytics@5.55.0': + resolution: {integrity: sha512-7BueMuWYg/KBA2EX9zsQ+3OAleEyrJcB+SV5Al/9pLjMQq5mXB/8M5HaUPqZwN812g5kLzj9j43VThlZgWq0hg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-common@5.55.0': + resolution: {integrity: sha512-pJZIyhvUrs+B7c5Lw0iP5yP/NsqJMda7pKRYbfG4KtfGIVSMcAalZhdqL5UX8Z9DOC4KxO9tKV5RDeVjZU0VfQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-insights@5.55.0': + resolution: {integrity: sha512-RydkKDhx0GWTYuw0ndTXHGM8hD8hgwftKE65FfnJZb5bPc9CevOqv3qNPUQiviAwkqT9hQNH31uDGeV3yZkgfA==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-personalization@5.55.0': + resolution: {integrity: sha512-XiS7gdFq/COWiwdWXZ8+RHuewfEo03TkGESk44zU8zTc/Z6R8fm4DNmV52swJKkeB2N9iC7NKpgpM22OOkcgTw==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-query-suggestions@5.55.0': + resolution: {integrity: sha512-LBEJ/q+hn1nJ0aYg5IcWgLNCPjWHTahWmpHNx1qUZMho+9CyWM6LaEnhac45UHjQm/j0m374HP685VrpL133lA==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-search@5.55.0': + resolution: {integrity: sha512-2/9jUXKH4IcdU5qxH6cbDH46ZBe46G7xr+MrcHwgEXZcUfdAvUgLSH53MAWuMgxvw0G5yoqiWMifHc62Os0fiQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/ingestion@1.55.0': + resolution: {integrity: sha512-80tKsQgxXWo+jK0v4YGCHqyTEXawhAKYyr3kOdN51ElfRqUFjZNPVhZk6vRiqSqXfvrH85ytacT3cbJR6+qolA==} + engines: {node: '>= 14.0.0'} + + '@algolia/monitoring@1.55.0': + resolution: {integrity: sha512-4UjmAL8ywGW4rCfK6Qmgw3wIjbrO2wl2s4Eq56JTiN40L2t0XTv0HZkYAmr6nfeiXO0he/2crvZRX6SATSepag==} + engines: {node: '>= 14.0.0'} + + '@algolia/recommend@5.55.0': + resolution: {integrity: sha512-LMpJPtIkfDsHIx5Ga+baNr22ntYbY+e2wT7MSIc/FjAnu9wnBFhx1H/GfhmP/c5/IvbThDX+3ilxPRjSfCI8aA==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-browser-xhr@5.55.0': + resolution: {integrity: sha512-tDymJ7nFOAoUuecma3usK6o94dp8m4HYFDGh4ByYQXWkv14cpmDn+nWdylmcZO0Qvco107vqDo4+Anksnl8w1Q==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-fetch@5.55.0': + resolution: {integrity: sha512-6IDSB5o5dkDPQ4LdOW0Yuw/qy5MdWlO2xDHgPVZgW4YDjbxvnX5PAiV7/WWZdWyVObScZZnnHpPbiqfYs/zBLg==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-node-http@5.55.0': + resolution: {integrity: sha512-Yyyne4l//vDSdg4MhYJkaVne+KEPi833eCj3/T/87ernTwrvP6j9biXXZELsN8sLI/f2ndV/vugDIy2jdJQB6g==} + engines: {node: '>= 14.0.0'} + '@anthropic-ai/sdk@0.74.0': resolution: {integrity: sha512-srbJV7JKsc5cQ6eVuFzjZO7UR3xEPJqPamHFIe29bs38Ij2IripoAhC0S5NslNbaFUYqBKypmmpzMTpqfHEUDw==} hasBin: true @@ -2060,15 +2145,28 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.29.2': resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/runtime@7.29.2': resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} engines: {node: '>=6.9.0'} @@ -2077,6 +2175,10 @@ packages: resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + '@better-auth/core@1.5.6': resolution: {integrity: sha512-Ez9DZdIMFyxHremmoLz1emFPGNQomDC1jqqBPnZ6Ci+6TiGN3R9w/Y03cJn6I8r1ycKgOzeVMZtJ/erOZ27Gsw==} peerDependencies: @@ -2263,6 +2365,29 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@docsearch/css@3.8.2': + resolution: {integrity: sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==} + + '@docsearch/js@3.8.2': + resolution: {integrity: sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==} + + '@docsearch/react@3.8.2': + resolution: {integrity: sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==} + peerDependencies: + '@types/react': '>= 16.8.0 < 19.0.0' + react: '>= 16.8.0 < 19.0.0' + react-dom: '>= 16.8.0 < 19.0.0' + search-insights: '>= 1 < 3' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + '@emnapi/core@1.9.1': resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==} @@ -2272,6 +2397,12 @@ packages: '@emnapi/wasi-threads@1.2.0': resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.27.3': resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} engines: {node: '>=18'} @@ -2284,6 +2415,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.27.3': resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} engines: {node: '>=18'} @@ -2296,6 +2433,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.27.3': resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} engines: {node: '>=18'} @@ -2308,6 +2451,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.27.3': resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} engines: {node: '>=18'} @@ -2320,6 +2469,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.27.3': resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} engines: {node: '>=18'} @@ -2332,6 +2487,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.27.3': resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} engines: {node: '>=18'} @@ -2344,6 +2505,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.27.3': resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} engines: {node: '>=18'} @@ -2356,6 +2523,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.27.3': resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} engines: {node: '>=18'} @@ -2368,6 +2541,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.27.3': resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} engines: {node: '>=18'} @@ -2380,6 +2559,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.27.3': resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} engines: {node: '>=18'} @@ -2392,6 +2577,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.27.3': resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} engines: {node: '>=18'} @@ -2404,6 +2595,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.27.3': resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} engines: {node: '>=18'} @@ -2416,6 +2613,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.27.3': resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} engines: {node: '>=18'} @@ -2428,6 +2631,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.27.3': resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} engines: {node: '>=18'} @@ -2440,6 +2649,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.27.3': resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} engines: {node: '>=18'} @@ -2452,6 +2667,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.27.3': resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} engines: {node: '>=18'} @@ -2464,6 +2685,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.27.3': resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} engines: {node: '>=18'} @@ -2488,6 +2715,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.27.3': resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} engines: {node: '>=18'} @@ -2512,6 +2745,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.27.3': resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} engines: {node: '>=18'} @@ -2536,6 +2775,12 @@ packages: cpu: [arm64] os: [openharmony] + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.27.3': resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} engines: {node: '>=18'} @@ -2548,6 +2793,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.27.3': resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} engines: {node: '>=18'} @@ -2560,6 +2811,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.27.3': resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} engines: {node: '>=18'} @@ -2572,6 +2829,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.27.3': resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} engines: {node: '>=18'} @@ -2674,6 +2937,12 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@iconify-json/simple-icons@1.2.87': + resolution: {integrity: sha512-8YciStObhSji3OZFmWAWK6kBujyqO5bLCxeDwLxf3CR3F4PVelq7keC2LBvgTqviWzSTysj5/g4PCFLiAMVGsw==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + '@img/colour@1.1.0': resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} @@ -3336,15 +3605,36 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@shikijs/core@2.5.0': + resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==} + + '@shikijs/engine-javascript@2.5.0': + resolution: {integrity: sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==} + + '@shikijs/engine-oniguruma@2.5.0': + resolution: {integrity: sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==} + '@shikijs/engine-oniguruma@3.23.0': resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==} + '@shikijs/langs@2.5.0': + resolution: {integrity: sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==} + '@shikijs/langs@3.23.0': resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==} + '@shikijs/themes@2.5.0': + resolution: {integrity: sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==} + '@shikijs/themes@3.23.0': resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==} + '@shikijs/transformers@2.5.0': + resolution: {integrity: sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==} + + '@shikijs/types@2.5.0': + resolution: {integrity: sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==} + '@shikijs/types@3.23.0': resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} @@ -3418,6 +3708,18 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/methods@1.1.4': resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} @@ -3454,6 +3756,9 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + '@typescript-eslint/eslint-plugin@8.57.2': resolution: {integrity: sha512-NZZgp0Fm2IkD+La5PR81sd+g+8oS6JwJje+aRWsDocxHkjyRw0J5L5ZTlN3LI1LlOcGL7ph3eaIUmTXMIjLk0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3552,6 +3857,9 @@ packages: resolution: {integrity: sha512-npU/LrswTK7gawemSkI2BufIgNgoOHA1OwwIC5EUh++oWLDuWZSvSAcH6mfn28NOt5A196zrHQd3SK7f5XCVAw==} hasBin: true + '@ungap/structured-clone@1.3.1': + resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] @@ -3660,6 +3968,13 @@ packages: peerDependencies: valibot: ^1.3.0 + '@vitejs/plugin-vue@5.2.4': + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + '@vitest/expect@4.1.2': resolution: {integrity: sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==} @@ -3689,6 +4004,94 @@ packages: '@vitest/utils@4.1.2': resolution: {integrity: sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==} + '@vue/compiler-core@3.5.38': + resolution: {integrity: sha512-s99aGxWYig9ErHbct27KXEGhrBYlRI6c4MwAgXErOAbX9xiW37/uMa+XUDO69zLz83dng8UUZ70CTOJrLrYrEQ==} + + '@vue/compiler-dom@3.5.38': + resolution: {integrity: sha512-JTqp25l8aFfJYF7/KmsXZjAxJz7T+SjmTJLoXVjHtc2BrSgSiW2n9Aem/cWq1OPe68A8JL06B3eVdhlP0H4TVw==} + + '@vue/compiler-sfc@3.5.38': + resolution: {integrity: sha512-DuA2GiZawSEW442iw/9+Fkol8hTgb4Ke5KkhmSry65QA7YuyMbIdy8p0XZRMvNwJdgRz307W8g1CSzdvS4nuNg==} + + '@vue/compiler-ssr@3.5.38': + resolution: {integrity: sha512-7s+W5Gc42FGxZMcuwl8H5B29T8BJPMdBT7KHFE+BbAuZ/iTEdTtv7z2XiMjiaUUw4w3ZcCEdHs36RuYJ2VA7bA==} + + '@vue/devtools-api@7.7.9': + resolution: {integrity: sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==} + + '@vue/devtools-kit@7.7.9': + resolution: {integrity: sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==} + + '@vue/devtools-shared@7.7.9': + resolution: {integrity: sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==} + + '@vue/reactivity@3.5.38': + resolution: {integrity: sha512-pG6LV/NDNRbKizcUjFFLAfjaL8mcv4DmR9avNcUw2gDHBzZneuS2TWCmp633ynzxz9YYKNeEPK2I8Wraqy2HUQ==} + + '@vue/runtime-core@3.5.38': + resolution: {integrity: sha512-iyW8WVfF1CpCXxncZY5Ei6rSd6oZr5DgEom//fUjRBRl56AXPD+s9ATvukRt77ZFTuYlnVA1bxY+dJB94tWVYw==} + + '@vue/runtime-dom@3.5.38': + resolution: {integrity: sha512-apX2wt9sdfDshS+a2xueFZLVpt0GkRJZSoPmrW/SA4yzXTznhfcMVW59gr7h4YQeY0vJhdJkk2rsIDwgfFgC5A==} + + '@vue/server-renderer@3.5.38': + resolution: {integrity: sha512-vue8vbf2QlV4quHqzwmJy6dWfmRhP1J8l4wtZg60CL6VoKqcPY2oe7may3+1d9qfpedjK5PRLFqd5k3Isj9mUw==} + peerDependencies: + vue: 3.5.38 + + '@vue/shared@3.5.38': + resolution: {integrity: sha512-FTW0AFZNaK5/mOqvGBwVfUlNLU38TiQn4+DQgIFUnrBBJQ1crMJ82yeGQLV5jyKFsO8yRukpbuP7x+nRbH6aug==} + + '@vueuse/core@12.8.2': + resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} + + '@vueuse/integrations@12.8.2': + resolution: {integrity: sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==} + peerDependencies: + async-validator: ^4 + axios: ^1 + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@12.8.2': + resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==} + + '@vueuse/shared@12.8.2': + resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==} + abstract-logging@2.0.1: resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} @@ -3724,6 +4127,10 @@ packages: ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + algoliasearch@5.55.0: + resolution: {integrity: sha512-af+rI+tUVeS9KWHPAZQHIHPOIC3StPRR6IwQu2nz1aQoTL6Gs5Ty3KsHCgbXMHOpoh9QqSjq8F3KJ8xmaCZSBA==} + engines: {node: '>= 14.0.0'} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -3911,6 +4318,9 @@ packages: bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + birpc@4.0.0: resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} @@ -3981,6 +4391,9 @@ packages: caniuse-lite@1.0.30001781: resolution: {integrity: sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw==} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} @@ -3992,6 +4405,12 @@ packages: change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} @@ -4020,6 +4439,9 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@13.1.0: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} @@ -4060,6 +4482,10 @@ packages: cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + copy-anything@4.0.5: + resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} + engines: {node: '>=18'} + core-js-compat@3.49.0: resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} @@ -4071,6 +4497,9 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} @@ -4161,6 +4590,9 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dezalgo@1.0.4: resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} @@ -4198,6 +4630,9 @@ packages: electron-to-chromium@1.5.328: resolution: {integrity: sha512-QNQ5l45DzYytThO21403XN3FvK0hOkWDG8viNf6jqS42msJ8I4tGDSpBCgvDRRPnkffafiwAym2X2eHeGD2V0w==} + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + empathic@2.0.0: resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} engines: {node: '>=14'} @@ -4224,6 +4659,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + error-stack-parser-es@1.0.5: resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} @@ -4258,6 +4697,11 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.27.3: resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} engines: {node: '>=18'} @@ -4421,6 +4865,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -4556,6 +5003,9 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + focus-trap@7.8.0: + resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==} + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -4709,13 +5159,25 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + hono@4.12.9: resolution: {integrity: sha512-wy3T8Zm2bsEvxKZM5w21VdHDDcwVS1yUFFY6i8UobSsKfFceT7TOwhbhfKsDyx7tYQlmRM5FLpIuYvNFyjctiA==} engines: {node: '>=16.9.0'} + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + hookable@6.1.0: resolution: {integrity: sha512-ZoKZSJgu8voGK2geJS+6YtYjvIzu9AOM/KZXsBxr83uhLL++e9pEv/dlgwgy3dvHg06kTz6JOh1hk3C8Ceiymw==} + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + http-errors@2.0.1: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} @@ -4913,6 +5375,10 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} + is-what@5.5.0: + resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} + engines: {node: '>=18'} + is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -5082,6 +5548,9 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + markdown-it@14.1.1: resolution: {integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==} hasBin: true @@ -5090,6 +5559,9 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -5109,6 +5581,21 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -5153,6 +5640,12 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minisearch@7.2.0: + resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} @@ -5168,6 +5661,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@3.3.15: + resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + nanostores@1.2.0: resolution: {integrity: sha512-F0wCzbsH80G7XXo0Jd9/AVQC7ouWY6idUCTnMwW5t/Rv9W8qmO6endavDwg7TNp5GbugwSukFMVZqzPSrSMndg==} engines: {node: ^20.0.0 || >=22.0.0} @@ -5254,6 +5752,9 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + oniguruma-to-es@3.1.1: + resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==} + open@11.0.0: resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} engines: {node: '>=20'} @@ -5350,6 +5851,9 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -5387,6 +5891,10 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + engines: {node: ^10 || ^12 || >=14} + postcss@8.5.8: resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} engines: {node: ^10 || ^12 || >=14} @@ -5395,6 +5903,9 @@ packages: resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} engines: {node: '>=20'} + preact@10.29.2: + resolution: {integrity: sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ==} + prebuild-install@7.1.3: resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} @@ -5421,6 +5932,9 @@ packages: process-warning@5.0.0: resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} + protobufjs@7.6.4: resolution: {integrity: sha512-RJJPTTpvFfHcWLkIa2JFWK4XvtSzS0yEWDmunqHXli1h3JlkbcQZXDZdcWxv+JK3Xsl5/UFDPZ0iGm7DAengYw==} engines: {node: '>=12.0.0'} @@ -5484,6 +5998,15 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + regexp-tree@0.1.27: resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} hasBin: true @@ -5605,6 +6128,9 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + search-insights@2.17.3: + resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} + secure-json-parse@4.1.0: resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} @@ -5658,6 +6184,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shiki@2.5.0: + resolution: {integrity: sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==} + side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -5698,9 +6227,16 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -5741,6 +6277,9 @@ packages: string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -5765,6 +6304,10 @@ packages: resolution: {integrity: sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==} engines: {node: '>=14.18.0'} + superjson@2.2.6: + resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} + engines: {node: '>=16'} + supertest@7.2.2: resolution: {integrity: sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA==} engines: {node: '>=14.18.0'} @@ -5781,6 +6324,9 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + tabbable@6.5.0: + resolution: {integrity: sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==} + tapable@2.3.2: resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==} engines: {node: '>=6'} @@ -5834,6 +6380,9 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + ts-algebra@2.0.0: resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} @@ -5854,6 +6403,7 @@ packages: tsconfck@3.1.6: resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} + deprecated: unmaintained hasBin: true peerDependencies: typescript: ^5.0.0 @@ -5924,6 +6474,17 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} + typedoc-plugin-markdown@4.12.0: + resolution: {integrity: sha512-eJDEMAfxCmede22c/Jw7d0FA13ggAQv+KkwQYKYCdqI02cin6Rc9QRwbG/7XvvHWinuFejySnZVUWDtvGk3Vbg==} + engines: {node: '>= 18'} + peerDependencies: + typedoc: 0.28.x + + typedoc-vitepress-theme@1.1.3: + resolution: {integrity: sha512-EK9iV7e3+R8lFNigdc0rIPWMxqfmDku0uGac3qYUu9tS4Qf1rhWZnyZJ4zu4G3iXrP5mqNPkv2wpODzRlA7jLw==} + peerDependencies: + typedoc-plugin-markdown: '>=4.11.0' + typedoc@0.28.18: resolution: {integrity: sha512-NTWTUOFRQ9+SGKKTuWKUioUkjxNwtS3JDRPVKZAXGHZy2wCA8bdv2iJiyeePn0xkmK+TCCqZFT0X7+2+FLjngA==} engines: {node: '>= 18', pnpm: '>= 10'} @@ -5970,6 +6531,21 @@ packages: unenv@2.0.0-rc.24: resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + universal-user-agent@7.0.3: resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} @@ -6018,6 +6594,12 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-tsconfig-paths@5.1.4: resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} peerDependencies: @@ -6026,6 +6608,37 @@ packages: vite: optional: true + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + vite@7.3.0: resolution: {integrity: sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6066,6 +6679,18 @@ packages: yaml: optional: true + vitepress@1.6.4: + resolution: {integrity: sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==} + hasBin: true + peerDependencies: + markdown-it-mathjax3: ^4 + postcss: ^8 + peerDependenciesMeta: + markdown-it-mathjax3: + optional: true + postcss: + optional: true + vitest@4.1.2: resolution: {integrity: sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -6101,6 +6726,14 @@ packages: jsdom: optional: true + vue@3.5.38: + resolution: {integrity: sha512-vAMKHfImQlYSy0C+PBue4s3ERZ2xGKfgZg5GXAsLInq1dyh2H78ILVP5sK0KPFPVW4kv+OGCIvBEondcjpZp7A==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} @@ -6190,15 +6823,130 @@ packages: youch@4.1.0-beta.10: resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} - zod-to-json-schema@3.25.2: - resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} - peerDependencies: - zod: ^3.25.28 || ^4 + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + + zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@algolia/abtesting@1.21.0': + dependencies: + '@algolia/client-common': 5.55.0 + '@algolia/requester-browser-xhr': 5.55.0 + '@algolia/requester-fetch': 5.55.0 + '@algolia/requester-node-http': 5.55.0 + + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.55.0)(algoliasearch@5.55.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.55.0)(algoliasearch@5.55.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.55.0)(algoliasearch@5.55.0) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.55.0)(algoliasearch@5.55.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.55.0)(algoliasearch@5.55.0) + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.55.0)(algoliasearch@5.55.0)': + dependencies: + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.55.0)(algoliasearch@5.55.0) + '@algolia/client-search': 5.55.0 + algoliasearch: 5.55.0 + + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.55.0)(algoliasearch@5.55.0)': + dependencies: + '@algolia/client-search': 5.55.0 + algoliasearch: 5.55.0 + + '@algolia/client-abtesting@5.55.0': + dependencies: + '@algolia/client-common': 5.55.0 + '@algolia/requester-browser-xhr': 5.55.0 + '@algolia/requester-fetch': 5.55.0 + '@algolia/requester-node-http': 5.55.0 + + '@algolia/client-analytics@5.55.0': + dependencies: + '@algolia/client-common': 5.55.0 + '@algolia/requester-browser-xhr': 5.55.0 + '@algolia/requester-fetch': 5.55.0 + '@algolia/requester-node-http': 5.55.0 + + '@algolia/client-common@5.55.0': {} + + '@algolia/client-insights@5.55.0': + dependencies: + '@algolia/client-common': 5.55.0 + '@algolia/requester-browser-xhr': 5.55.0 + '@algolia/requester-fetch': 5.55.0 + '@algolia/requester-node-http': 5.55.0 + + '@algolia/client-personalization@5.55.0': + dependencies: + '@algolia/client-common': 5.55.0 + '@algolia/requester-browser-xhr': 5.55.0 + '@algolia/requester-fetch': 5.55.0 + '@algolia/requester-node-http': 5.55.0 + + '@algolia/client-query-suggestions@5.55.0': + dependencies: + '@algolia/client-common': 5.55.0 + '@algolia/requester-browser-xhr': 5.55.0 + '@algolia/requester-fetch': 5.55.0 + '@algolia/requester-node-http': 5.55.0 + + '@algolia/client-search@5.55.0': + dependencies: + '@algolia/client-common': 5.55.0 + '@algolia/requester-browser-xhr': 5.55.0 + '@algolia/requester-fetch': 5.55.0 + '@algolia/requester-node-http': 5.55.0 + + '@algolia/ingestion@1.55.0': + dependencies: + '@algolia/client-common': 5.55.0 + '@algolia/requester-browser-xhr': 5.55.0 + '@algolia/requester-fetch': 5.55.0 + '@algolia/requester-node-http': 5.55.0 + + '@algolia/monitoring@1.55.0': + dependencies: + '@algolia/client-common': 5.55.0 + '@algolia/requester-browser-xhr': 5.55.0 + '@algolia/requester-fetch': 5.55.0 + '@algolia/requester-node-http': 5.55.0 + + '@algolia/recommend@5.55.0': + dependencies: + '@algolia/client-common': 5.55.0 + '@algolia/requester-browser-xhr': 5.55.0 + '@algolia/requester-fetch': 5.55.0 + '@algolia/requester-node-http': 5.55.0 + + '@algolia/requester-browser-xhr@5.55.0': + dependencies: + '@algolia/client-common': 5.55.0 - zod@4.3.6: - resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + '@algolia/requester-fetch@5.55.0': + dependencies: + '@algolia/client-common': 5.55.0 -snapshots: + '@algolia/requester-node-http@5.55.0': + dependencies: + '@algolia/client-common': 5.55.0 '@anthropic-ai/sdk@0.74.0(zod@4.3.6)': dependencies: @@ -6222,12 +6970,20 @@ snapshots: '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} + '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} + '@babel/parser@7.29.2': dependencies: '@babel/types': 7.29.0 + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + '@babel/runtime@7.29.2': {} '@babel/types@7.29.0': @@ -6235,6 +6991,11 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0)': dependencies: '@better-auth/utils': 0.3.1 @@ -6472,6 +7233,30 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 + '@docsearch/css@3.8.2': {} + + '@docsearch/js@3.8.2(@algolia/client-search@5.55.0)(search-insights@2.17.3)': + dependencies: + '@docsearch/react': 3.8.2(@algolia/client-search@5.55.0)(search-insights@2.17.3) + preact: 10.29.2 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/react' + - react + - react-dom + - search-insights + + '@docsearch/react@3.8.2(@algolia/client-search@5.55.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.55.0)(algoliasearch@5.55.0)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.55.0)(algoliasearch@5.55.0) + '@docsearch/css': 3.8.2 + algoliasearch: 5.55.0 + optionalDependencies: + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + '@emnapi/core@1.9.1': dependencies: '@emnapi/wasi-threads': 1.2.0 @@ -6488,102 +7273,153 @@ snapshots: tslib: 2.8.1 optional: true + '@esbuild/aix-ppc64@0.21.5': + optional: true + '@esbuild/aix-ppc64@0.27.3': optional: true '@esbuild/aix-ppc64@0.27.4': optional: true + '@esbuild/android-arm64@0.21.5': + optional: true + '@esbuild/android-arm64@0.27.3': optional: true '@esbuild/android-arm64@0.27.4': optional: true + '@esbuild/android-arm@0.21.5': + optional: true + '@esbuild/android-arm@0.27.3': optional: true '@esbuild/android-arm@0.27.4': optional: true + '@esbuild/android-x64@0.21.5': + optional: true + '@esbuild/android-x64@0.27.3': optional: true '@esbuild/android-x64@0.27.4': optional: true + '@esbuild/darwin-arm64@0.21.5': + optional: true + '@esbuild/darwin-arm64@0.27.3': optional: true '@esbuild/darwin-arm64@0.27.4': optional: true + '@esbuild/darwin-x64@0.21.5': + optional: true + '@esbuild/darwin-x64@0.27.3': optional: true '@esbuild/darwin-x64@0.27.4': optional: true + '@esbuild/freebsd-arm64@0.21.5': + optional: true + '@esbuild/freebsd-arm64@0.27.3': optional: true '@esbuild/freebsd-arm64@0.27.4': optional: true + '@esbuild/freebsd-x64@0.21.5': + optional: true + '@esbuild/freebsd-x64@0.27.3': optional: true '@esbuild/freebsd-x64@0.27.4': optional: true + '@esbuild/linux-arm64@0.21.5': + optional: true + '@esbuild/linux-arm64@0.27.3': optional: true '@esbuild/linux-arm64@0.27.4': optional: true + '@esbuild/linux-arm@0.21.5': + optional: true + '@esbuild/linux-arm@0.27.3': optional: true '@esbuild/linux-arm@0.27.4': optional: true + '@esbuild/linux-ia32@0.21.5': + optional: true + '@esbuild/linux-ia32@0.27.3': optional: true '@esbuild/linux-ia32@0.27.4': optional: true + '@esbuild/linux-loong64@0.21.5': + optional: true + '@esbuild/linux-loong64@0.27.3': optional: true '@esbuild/linux-loong64@0.27.4': optional: true + '@esbuild/linux-mips64el@0.21.5': + optional: true + '@esbuild/linux-mips64el@0.27.3': optional: true '@esbuild/linux-mips64el@0.27.4': optional: true + '@esbuild/linux-ppc64@0.21.5': + optional: true + '@esbuild/linux-ppc64@0.27.3': optional: true '@esbuild/linux-ppc64@0.27.4': optional: true + '@esbuild/linux-riscv64@0.21.5': + optional: true + '@esbuild/linux-riscv64@0.27.3': optional: true '@esbuild/linux-riscv64@0.27.4': optional: true + '@esbuild/linux-s390x@0.21.5': + optional: true + '@esbuild/linux-s390x@0.27.3': optional: true '@esbuild/linux-s390x@0.27.4': optional: true + '@esbuild/linux-x64@0.21.5': + optional: true + '@esbuild/linux-x64@0.27.3': optional: true @@ -6596,6 +7432,9 @@ snapshots: '@esbuild/netbsd-arm64@0.27.4': optional: true + '@esbuild/netbsd-x64@0.21.5': + optional: true + '@esbuild/netbsd-x64@0.27.3': optional: true @@ -6608,6 +7447,9 @@ snapshots: '@esbuild/openbsd-arm64@0.27.4': optional: true + '@esbuild/openbsd-x64@0.21.5': + optional: true + '@esbuild/openbsd-x64@0.27.3': optional: true @@ -6620,24 +7462,36 @@ snapshots: '@esbuild/openharmony-arm64@0.27.4': optional: true + '@esbuild/sunos-x64@0.21.5': + optional: true + '@esbuild/sunos-x64@0.27.3': optional: true '@esbuild/sunos-x64@0.27.4': optional: true + '@esbuild/win32-arm64@0.21.5': + optional: true + '@esbuild/win32-arm64@0.27.3': optional: true '@esbuild/win32-arm64@0.27.4': optional: true + '@esbuild/win32-ia32@0.21.5': + optional: true + '@esbuild/win32-ia32@0.27.3': optional: true '@esbuild/win32-ia32@0.27.4': optional: true + '@esbuild/win32-x64@0.21.5': + optional: true + '@esbuild/win32-x64@0.27.3': optional: true @@ -6749,6 +7603,12 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@iconify-json/simple-icons@1.2.87': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/types@2.0.0': {} + '@img/colour@1.1.0': {} '@img/sharp-darwin-arm64@0.34.5': @@ -7240,19 +8100,57 @@ snapshots: '@rtsao/scc@1.1.0': {} + '@shikijs/core@2.5.0': + dependencies: + '@shikijs/engine-javascript': 2.5.0 + '@shikijs/engine-oniguruma': 2.5.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 3.1.1 + + '@shikijs/engine-oniguruma@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + '@shikijs/engine-oniguruma@3.23.0': dependencies: '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 + '@shikijs/langs@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + '@shikijs/langs@3.23.0': dependencies: '@shikijs/types': 3.23.0 + '@shikijs/themes@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + '@shikijs/themes@3.23.0': dependencies: '@shikijs/types': 3.23.0 + '@shikijs/transformers@2.5.0': + dependencies: + '@shikijs/core': 2.5.0 + '@shikijs/types': 2.5.0 + + '@shikijs/types@2.5.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + '@shikijs/types@3.23.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 @@ -7336,6 +8234,19 @@ snapshots: '@types/json5@0.0.29': {} + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdurl@2.0.0': {} + '@types/methods@1.1.4': {} '@types/node@12.20.55': {} @@ -7378,6 +8289,8 @@ snapshots: '@types/unist@3.0.3': {} + '@types/web-bluetooth@0.0.21': {} + '@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.2(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -7500,6 +8413,8 @@ snapshots: '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260327.2 '@typescript/native-preview-win32-x64': 7.0.0-dev.20260327.2 + '@ungap/structured-clone@1.3.1': {} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true @@ -7563,6 +8478,11 @@ snapshots: dependencies: valibot: 1.3.1(typescript@5.9.3) + '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@24.12.0))(vue@3.5.38(typescript@5.9.3))': + dependencies: + vite: 5.4.21(@types/node@24.12.0) + vue: 3.5.38(typescript@5.9.3) + '@vitest/expect@4.1.2': dependencies: '@standard-schema/spec': 1.1.0 @@ -7612,6 +8532,106 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.1.0 + '@vue/compiler-core@3.5.38': + dependencies: + '@babel/parser': 7.29.7 + '@vue/shared': 3.5.38 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.38': + dependencies: + '@vue/compiler-core': 3.5.38 + '@vue/shared': 3.5.38 + + '@vue/compiler-sfc@3.5.38': + dependencies: + '@babel/parser': 7.29.7 + '@vue/compiler-core': 3.5.38 + '@vue/compiler-dom': 3.5.38 + '@vue/compiler-ssr': 3.5.38 + '@vue/shared': 3.5.38 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.15 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.38': + dependencies: + '@vue/compiler-dom': 3.5.38 + '@vue/shared': 3.5.38 + + '@vue/devtools-api@7.7.9': + dependencies: + '@vue/devtools-kit': 7.7.9 + + '@vue/devtools-kit@7.7.9': + dependencies: + '@vue/devtools-shared': 7.7.9 + birpc: 2.9.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.6 + + '@vue/devtools-shared@7.7.9': + dependencies: + rfdc: 1.4.1 + + '@vue/reactivity@3.5.38': + dependencies: + '@vue/shared': 3.5.38 + + '@vue/runtime-core@3.5.38': + dependencies: + '@vue/reactivity': 3.5.38 + '@vue/shared': 3.5.38 + + '@vue/runtime-dom@3.5.38': + dependencies: + '@vue/reactivity': 3.5.38 + '@vue/runtime-core': 3.5.38 + '@vue/shared': 3.5.38 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.38(vue@3.5.38(typescript@5.9.3))': + dependencies: + '@vue/compiler-ssr': 3.5.38 + '@vue/shared': 3.5.38 + vue: 3.5.38(typescript@5.9.3) + + '@vue/shared@3.5.38': {} + + '@vueuse/core@12.8.2(typescript@5.9.3)': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 12.8.2 + '@vueuse/shared': 12.8.2(typescript@5.9.3) + vue: 3.5.38(typescript@5.9.3) + transitivePeerDependencies: + - typescript + + '@vueuse/integrations@12.8.2(change-case@5.4.4)(focus-trap@7.8.0)(typescript@5.9.3)': + dependencies: + '@vueuse/core': 12.8.2(typescript@5.9.3) + '@vueuse/shared': 12.8.2(typescript@5.9.3) + vue: 3.5.38(typescript@5.9.3) + optionalDependencies: + change-case: 5.4.4 + focus-trap: 7.8.0 + transitivePeerDependencies: + - typescript + + '@vueuse/metadata@12.8.2': {} + + '@vueuse/shared@12.8.2(typescript@5.9.3)': + dependencies: + vue: 3.5.38(typescript@5.9.3) + transitivePeerDependencies: + - typescript + abstract-logging@2.0.1: {} accepts@2.0.0: @@ -7645,6 +8665,23 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + algoliasearch@5.55.0: + dependencies: + '@algolia/abtesting': 1.21.0 + '@algolia/client-abtesting': 5.55.0 + '@algolia/client-analytics': 5.55.0 + '@algolia/client-common': 5.55.0 + '@algolia/client-insights': 5.55.0 + '@algolia/client-personalization': 5.55.0 + '@algolia/client-query-suggestions': 5.55.0 + '@algolia/client-search': 5.55.0 + '@algolia/ingestion': 1.55.0 + '@algolia/monitoring': 1.55.0 + '@algolia/recommend': 5.55.0 + '@algolia/requester-browser-xhr': 5.55.0 + '@algolia/requester-fetch': 5.55.0 + '@algolia/requester-node-http': 5.55.0 + ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} @@ -7757,7 +8794,7 @@ snapshots: before-after-hook@4.0.0: {} - better-auth@1.5.6(@opentelemetry/api@1.9.1)(better-sqlite3@12.8.0)(vitest@4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(vite@7.3.0(@types/node@25.5.0)(tsx@4.21.0)(yaml@2.8.3))): + better-auth@1.5.6(@opentelemetry/api@1.9.1)(better-sqlite3@12.8.0)(vitest@4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(vite@7.3.0(@types/node@25.5.0)(tsx@4.21.0)(yaml@2.8.3)))(vue@3.5.38(typescript@5.9.3)): dependencies: '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) '@better-auth/drizzle-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1) @@ -7779,6 +8816,7 @@ snapshots: optionalDependencies: better-sqlite3: 12.8.0 vitest: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(vite@7.3.0(@types/node@25.5.0)(tsx@4.21.0)(yaml@2.8.3)) + vue: 3.5.38(typescript@5.9.3) transitivePeerDependencies: - '@cloudflare/workers-types' - '@opentelemetry/api' @@ -7807,6 +8845,8 @@ snapshots: dependencies: file-uri-to-path: 1.0.0 + birpc@2.9.0: {} + birpc@4.0.0: {} bl@4.1.0: @@ -7890,6 +8930,8 @@ snapshots: caniuse-lite@1.0.30001781: {} + ccount@2.0.1: {} + chai@6.2.2: {} chalk@4.1.2: @@ -7899,6 +8941,10 @@ snapshots: change-case@5.4.4: {} + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + chardet@2.1.1: {} chownr@1.1.4: {} @@ -7921,6 +8967,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + comma-separated-tokens@2.0.3: {} + commander@13.1.0: {} commander@14.0.3: {} @@ -7943,6 +8991,10 @@ snapshots: cookiejar@2.1.4: {} + copy-anything@4.0.5: + dependencies: + is-what: 5.5.0 + core-js-compat@3.49.0: dependencies: browserslist: 4.28.1 @@ -7958,6 +9010,8 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + csstype@3.2.3: {} + data-uri-to-buffer@4.0.1: {} data-view-buffer@1.0.2: @@ -8029,6 +9083,10 @@ snapshots: detect-libc@2.1.2: {} + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + dezalgo@1.0.4: dependencies: asap: 2.0.6 @@ -8060,6 +9118,8 @@ snapshots: electron-to-chromium@1.5.328: {} + emoji-regex-xs@1.0.0: {} + empathic@2.0.0: {} encodeurl@2.0.0: {} @@ -8085,6 +9145,8 @@ snapshots: entities@4.5.0: {} + entities@7.0.1: {} + error-stack-parser-es@1.0.5: {} es-abstract@1.24.1: @@ -8171,6 +9233,32 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + esbuild@0.27.3: optionalDependencies: '@esbuild/aix-ppc64': 0.27.3 @@ -8432,6 +9520,8 @@ snapshots: estraverse@5.3.0: {} + estree-walker@2.0.2: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.8 @@ -8606,6 +9696,10 @@ snapshots: flatted@3.4.2: {} + focus-trap@7.8.0: + dependencies: + tabbable: 6.5.0 + for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -8779,10 +9873,32 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hono@4.12.9: {} + hookable@5.5.3: {} + hookable@6.1.0: {} + html-void-elements@3.0.0: {} + http-errors@2.0.1: dependencies: depd: 2.0.0 @@ -8972,6 +10088,8 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + is-what@5.5.0: {} + is-windows@1.0.2: {} is-wsl@3.1.1: @@ -9125,6 +10243,8 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + mark.js@8.11.1: {} + markdown-it@14.1.1: dependencies: argparse: 2.0.1 @@ -9136,6 +10256,18 @@ snapshots: math-intrinsics@1.1.0: {} + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.1 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + mdurl@2.0.0: {} media-typer@1.1.0: {} @@ -9146,6 +10278,23 @@ snapshots: methods@1.1.2: {} + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-encode@2.0.1: {} + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -9189,6 +10338,10 @@ snapshots: minimist@1.2.8: {} + minisearch@7.2.0: {} + + mitt@3.0.1: {} + mkdirp-classic@0.5.3: {} mri@1.2.0: {} @@ -9197,6 +10350,8 @@ snapshots: nanoid@3.3.11: {} + nanoid@3.3.15: {} + nanostores@1.2.0: {} napi-build-utils@2.0.0: {} @@ -9274,6 +10429,12 @@ snapshots: dependencies: wrappy: 1.0.2 + oniguruma-to-es@3.1.1: + dependencies: + emoji-regex-xs: 1.0.0 + regex: 6.1.0 + regex-recursion: 6.0.2 + open@11.0.0: dependencies: default-browser: 5.5.0 @@ -9360,6 +10521,8 @@ snapshots: pathe@2.0.3: {} + perfect-debounce@1.0.0: {} + picocolors@1.1.1: {} picomatch@2.3.2: {} @@ -9394,6 +10557,12 @@ snapshots: possible-typed-array-names@1.1.0: {} + postcss@8.5.15: + dependencies: + nanoid: 3.3.15 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postcss@8.5.8: dependencies: nanoid: 3.3.11 @@ -9402,6 +10571,8 @@ snapshots: powershell-utils@0.1.0: {} + preact@10.29.2: {} + prebuild-install@7.1.3: dependencies: detect-libc: 2.1.2 @@ -9427,6 +10598,8 @@ snapshots: process-warning@5.0.0: {} + property-information@7.2.0: {} + protobufjs@7.6.4: dependencies: '@protobufjs/aspromise': 1.1.2 @@ -9509,6 +10682,16 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + regexp-tree@0.1.27: {} regexp.prototype.flags@1.5.4: @@ -9681,6 +10864,8 @@ snapshots: safer-buffer@2.1.2: {} + search-insights@2.17.3: {} + secure-json-parse@4.1.0: {} semver@6.3.1: {} @@ -9777,6 +10962,17 @@ snapshots: shebang-regex@3.0.0: {} + shiki@2.5.0: + dependencies: + '@shikijs/core': 2.5.0 + '@shikijs/engine-javascript': 2.5.0 + '@shikijs/engine-oniguruma': 2.5.0 + '@shikijs/langs': 2.5.0 + '@shikijs/themes': 2.5.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -9825,11 +11021,15 @@ snapshots: source-map-js@1.2.1: {} + space-separated-tokens@2.0.2: {} + spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 + speakingurl@14.0.1: {} + split2@4.2.0: {} sprintf-js@1.0.3: {} @@ -9874,6 +11074,11 @@ snapshots: dependencies: safe-buffer: 5.2.1 + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -9900,6 +11105,10 @@ snapshots: transitivePeerDependencies: - supports-color + superjson@2.2.6: + dependencies: + copy-anything: 4.0.5 + supertest@7.2.2: dependencies: cookie-signature: 1.2.2 @@ -9916,6 +11125,8 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + tabbable@6.5.0: {} + tapable@2.3.2: {} tar-fs@2.1.4: @@ -9962,6 +11173,8 @@ snapshots: tree-kill@1.2.2: {} + trim-lines@3.0.1: {} + ts-algebra@2.0.0: {} ts-api-utils@2.5.0(typescript@5.9.3): @@ -10072,6 +11285,14 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 + typedoc-plugin-markdown@4.12.0(typedoc@0.28.18(typescript@5.9.3)): + dependencies: + typedoc: 0.28.18(typescript@5.9.3) + + typedoc-vitepress-theme@1.1.3(typedoc-plugin-markdown@4.12.0(typedoc@0.28.18(typescript@5.9.3))): + dependencies: + typedoc-plugin-markdown: 4.12.0(typedoc@0.28.18(typescript@5.9.3)) + typedoc@0.28.18(typescript@5.9.3): dependencies: '@gerrit0/mini-shiki': 3.23.0 @@ -10121,6 +11342,29 @@ snapshots: dependencies: pathe: 2.0.3 + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + universal-user-agent@7.0.3: {} universalify@0.1.2: {} @@ -10173,6 +11417,16 @@ snapshots: vary@1.1.2: {} + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.3.0(@types/node@25.5.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: debug: 4.4.3 @@ -10184,6 +11438,15 @@ snapshots: - supports-color - typescript + vite@5.4.21(@types/node@24.12.0): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.8 + rollup: 4.60.0 + optionalDependencies: + '@types/node': 24.12.0 + fsevents: 2.3.3 + vite@7.3.0(@types/node@24.12.0)(tsx@4.21.0)(yaml@2.8.3): dependencies: esbuild: 0.27.4 @@ -10212,6 +11475,55 @@ snapshots: tsx: 4.21.0 yaml: 2.8.3 + vitepress@1.6.4(@algolia/client-search@5.55.0)(@types/node@24.12.0)(change-case@5.4.4)(postcss@8.5.15)(search-insights@2.17.3)(typescript@5.9.3): + dependencies: + '@docsearch/css': 3.8.2 + '@docsearch/js': 3.8.2(@algolia/client-search@5.55.0)(search-insights@2.17.3) + '@iconify-json/simple-icons': 1.2.87 + '@shikijs/core': 2.5.0 + '@shikijs/transformers': 2.5.0 + '@shikijs/types': 2.5.0 + '@types/markdown-it': 14.1.2 + '@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@24.12.0))(vue@3.5.38(typescript@5.9.3)) + '@vue/devtools-api': 7.7.9 + '@vue/shared': 3.5.38 + '@vueuse/core': 12.8.2(typescript@5.9.3) + '@vueuse/integrations': 12.8.2(change-case@5.4.4)(focus-trap@7.8.0)(typescript@5.9.3) + focus-trap: 7.8.0 + mark.js: 8.11.1 + minisearch: 7.2.0 + shiki: 2.5.0 + vite: 5.4.21(@types/node@24.12.0) + vue: 3.5.38(typescript@5.9.3) + optionalDependencies: + postcss: 8.5.15 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/node' + - '@types/react' + - async-validator + - axios + - change-case + - drauu + - fuse.js + - idb-keyval + - jwt-decode + - less + - lightningcss + - nprogress + - qrcode + - react + - react-dom + - sass + - sass-embedded + - search-insights + - sortablejs + - stylus + - sugarss + - terser + - typescript + - universal-cookie + vitest@4.1.2(@opentelemetry/api@1.9.1)(@types/node@24.12.0)(vite@7.3.0(@types/node@24.12.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.2 @@ -10268,6 +11580,16 @@ snapshots: transitivePeerDependencies: - msw + vue@3.5.38(typescript@5.9.3): + dependencies: + '@vue/compiler-dom': 3.5.38 + '@vue/compiler-sfc': 3.5.38 + '@vue/runtime-dom': 3.5.38 + '@vue/server-renderer': 3.5.38(vue@3.5.38(typescript@5.9.3)) + '@vue/shared': 3.5.38 + optionalDependencies: + typescript: 5.9.3 + web-streams-polyfill@3.3.3: {} webidl-conversions@3.0.1: {} @@ -10384,3 +11706,5 @@ snapshots: zod: 4.3.6 zod@4.3.6: {} + + zwitch@2.0.4: {} diff --git a/scripts/sync-snippets.ts b/scripts/sync-snippets.ts index 6d5d81410c..33258f4414 100644 --- a/scripts/sync-snippets.ts +++ b/scripts/sync-snippets.ts @@ -47,7 +47,7 @@ */ import { readFileSync, writeFileSync, readdirSync } from 'node:fs'; -import { dirname, join, resolve } from 'node:path'; +import { dirname, join, resolve, sep } from 'node:path'; import { fileURLToPath } from 'node:url'; const __filename = fileURLToPath(import.meta.url); @@ -484,6 +484,11 @@ function findMarkdownFiles(dir: string): string[] { const files: string[] = []; const entries = readdirSync(dir, { withFileTypes: true, recursive: true }); + // Generated API reference markdown (docs/api/, produced by `pnpm docs:api`) is skipped — its + // fences carry source="..." attributes copied from JSDoc whose relative paths don't resolve + // from the generated location. + const generatedApiDir = join(dir, 'api') + sep; + for (const entry of entries) { if (!entry.isFile()) continue; @@ -491,6 +496,8 @@ function findMarkdownFiles(dir: string): string[] { if (!entry.name.endsWith('.md')) continue; const fullPath = join(entry.parentPath, entry.name); + if (fullPath.startsWith(generatedApiDir)) continue; + files.push(fullPath); } diff --git a/typedoc.config.mjs b/typedoc.config.mjs index b7583ed8fc..99c74f4e65 100644 --- a/typedoc.config.mjs +++ b/typedoc.config.mjs @@ -32,6 +32,7 @@ console.log( /** @type {Partial} */ export default { name: 'MCP TypeScript SDK (V2)', + plugin: ['typedoc-plugin-markdown', 'typedoc-vitepress-theme'], entryPointStrategy: 'packages', entryPoints, packageOptions: { @@ -39,21 +40,16 @@ export default { exclude: ['**/*.examples.ts'] }, highlightLanguages: [...OptionDefaults.highlightLanguages, 'powershell'], - projectDocuments: ['docs/documents.md', 'packages/middleware/README.md', 'examples/README.md'], - hostedBaseUrl: 'https://ts.sdk.modelcontextprotocol.io/v2/', - navigationLinks: { - 'V1 Docs': '/' - }, - navigation: { - compactFolders: true, - includeFolders: false - }, - headings: { - readme: false - }, - customJs: 'docs/v2-banner.js', + // typedoc-plugin-markdown: one page per module/package, symbols as sections. + outputFileStrategy: 'modules', + // The VitePress landing page replaces the root README; rendering it here would duplicate it + // under /api/ and drag relative-linked files into _media/ copies with broken links. + readme: 'none', + // typedoc-vitepress-theme: emits docs/api/typedoc-sidebar.json with links relative to the + // VitePress source root. + docsRoot: 'docs', treatWarningsAsErrors: true, - out: 'tmp/docs/', + out: 'docs/api', externalSymbolLinkMappings: { '@modelcontextprotocol/core-internal': { StandardSchemaV1: 'https://standardschema.dev/', From 06d96a5fc7c39922fde45670e96efb1882be4b86 Mon Sep 17 00:00:00 2001 From: Felix Weinberger Date: Mon, 29 Jun 2026 18:37:17 +0000 Subject: [PATCH 03/11] docs: add VitePress site for the v2 documentation Replaces the typedoc HTML site shell: guide pages get a proper sidebar, local search, and a home layout landing page reusing the README's own descriptions. The API Reference is a collapsed sidebar group imported from the generated typedoc-sidebar.json (with a clear warning when docs:api has not run yet). The theme extends the VitePress default with a monochrome palette modeled on the Python SDK docs and a version banner injected via the layout-top slot. Site-root-relative /specification/ links from spec-generated JSDoc are rewritten to modelcontextprotocol.io at render time. --- docs/.vitepress/config.mts | 87 ++++++++++++++++++ docs/.vitepress/theme/Banner.vue | 6 ++ docs/.vitepress/theme/custom.css | 148 +++++++++++++++++++++++++++++++ docs/.vitepress/theme/index.ts | 15 ++++ docs/index.md | 31 +++++++ 5 files changed, 287 insertions(+) create mode 100644 docs/.vitepress/config.mts create mode 100644 docs/.vitepress/theme/Banner.vue create mode 100644 docs/.vitepress/theme/custom.css create mode 100644 docs/.vitepress/theme/index.ts create mode 100644 docs/index.md diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts new file mode 100644 index 0000000000..c0c246c7e4 --- /dev/null +++ b/docs/.vitepress/config.mts @@ -0,0 +1,87 @@ +import { existsSync, readFileSync } from 'node:fs'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import { defineConfig, type DefaultTheme } from 'vitepress'; + +const docsDir = resolve(dirname(fileURLToPath(import.meta.url)), '..'); + +/** + * The API Reference sidebar is generated by `pnpm docs:api` (typedoc + typedoc-vitepress-theme) + * into docs/api/typedoc-sidebar.json. When it is missing (e.g. `docs:dev` before `docs:api`), + * fall back to an empty group with a hint instead of crashing. + */ +function apiSidebarItems(): DefaultTheme.SidebarItem[] { + const sidebarPath = resolve(docsDir, 'api/typedoc-sidebar.json'); + if (!existsSync(sidebarPath)) { + console.warn(`[docs] ${sidebarPath} not found — run \`pnpm docs:api\` first to populate the API Reference section.`); + return []; + } + return JSON.parse(readFileSync(sidebarPath, 'utf8')); +} + +export default defineConfig({ + title: 'MCP TypeScript SDK', + description: 'The TypeScript SDK implementation of the Model Context Protocol specification.', + base: '/v2/', + markdown: { + config(md) { + // Spec-generated JSDoc (packages/core-internal/src/types/spec.types.*.ts) carries + // site-root-relative links like /specification/draft/basic/index#meta that are meant + // to resolve on modelcontextprotocol.io. Rewrite them at render time so they work on + // this site (and so the dead-link check sees them as external). + const orig = md.renderer.rules.link_open ?? ((tokens, idx, options, _env, self) => self.renderToken(tokens, idx, options)); + md.renderer.rules.link_open = (tokens, idx, options, env, self) => { + const href = tokens[idx].attrGet('href'); + if (href?.startsWith('/specification/')) { + tokens[idx].attrSet('href', `https://modelcontextprotocol.io${href}`); + } + return orig(tokens, idx, options, env, self); + }; + } + }, + themeConfig: { + nav: [ + { text: 'Guide', link: '/server-quickstart', activeMatch: '^/(server|client|faq)' }, + { text: 'Migration', link: '/migration/', activeMatch: '^/migration/' }, + { text: 'API Reference', link: '/api/', activeMatch: '^/api/' }, + { text: 'V1 Docs', link: 'https://ts.sdk.modelcontextprotocol.io/' } + ], + sidebar: [ + { + text: 'Getting started', + items: [ + { text: 'Server Quickstart', link: '/server-quickstart' }, + { text: 'Client Quickstart', link: '/client-quickstart' } + ] + }, + { + text: 'Guides', + items: [ + { text: 'Server', link: '/server' }, + { text: 'Client', link: '/client' } + ] + }, + { + text: 'Migration', + items: [ + { text: 'Overview', link: '/migration/' }, + { text: 'Upgrade to v2', link: '/migration/upgrade-to-v2' }, + { text: '2026-07-28 protocol support', link: '/migration/support-2026-07-28' } + ] + }, + { + text: 'FAQ', + items: [{ text: 'FAQ', link: '/faq' }] + }, + { + text: 'API Reference', + collapsed: true, + items: apiSidebarItems() + } + ], + outline: { level: [2, 3] }, + search: { provider: 'local' }, + socialLinks: [{ icon: 'github', link: 'https://github.com/modelcontextprotocol/typescript-sdk' }] + } +}); diff --git a/docs/.vitepress/theme/Banner.vue b/docs/.vitepress/theme/Banner.vue new file mode 100644 index 0000000000..b00a7047ee --- /dev/null +++ b/docs/.vitepress/theme/Banner.vue @@ -0,0 +1,6 @@ + diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css new file mode 100644 index 0000000000..2f03d12673 --- /dev/null +++ b/docs/.vitepress/theme/custom.css @@ -0,0 +1,148 @@ +/** + * Shared theme for the MCP TypeScript SDK docs (v2 and v1 sites). + * + * Visual pass modeled on the Python SDK docs (py.sdk.modelcontextprotocol.io), + * which use mkdocs-material with a monochrome palette: primary/accent black on + * light, white on slate dark. We map that onto VitePress brand variables. + */ + +/* ---------------------------------------------------------------- branding */ + +:root { + /* Monochrome brand: near-black on light backgrounds. */ + --vp-c-brand-1: #1a1a1a; + --vp-c-brand-2: #333333; + --vp-c-brand-3: #1f1f1f; + --vp-c-brand-soft: rgba(0, 0, 0, 0.08); + + /* Restrained accent for links — dark with a faint blue cast, like + material's black-primary link color. */ + --vp-c-text-link: #21409a; + + /* Neutral grays. */ + --vp-c-gray-1: #dddde3; + --vp-c-gray-2: #e4e4e9; + --vp-c-gray-3: #ebebef; + + /* Buttons: solid black, like material's primary buttons. */ + --vp-button-brand-bg: #1a1a1a; + --vp-button-brand-border: #1a1a1a; + --vp-button-brand-text: #ffffff; + --vp-button-brand-hover-bg: #333333; + --vp-button-brand-hover-border: #333333; + --vp-button-brand-hover-text: #ffffff; + --vp-button-brand-active-bg: #000000; + --vp-button-brand-active-border: #000000; + --vp-button-brand-active-text: #ffffff; + + /* Home hero: plain text, no gradient. */ + --vp-home-hero-name-color: var(--vp-c-text-1); + + /* Height reserved for the fixed version banner (layout-top slot). */ + --vp-layout-top-height: 36px; +} + +.dark { + /* Monochrome brand: near-white on dark backgrounds (material "slate"). */ + --vp-c-brand-1: #e8e8e8; + --vp-c-brand-2: #cccccc; + --vp-c-brand-3: #dddddd; + --vp-c-brand-soft: rgba(255, 255, 255, 0.12); + + --vp-c-text-link: #9db4e8; + + --vp-button-brand-bg: #e8e8e8; + --vp-button-brand-border: #e8e8e8; + --vp-button-brand-text: #1a1a1a; + --vp-button-brand-hover-bg: #ffffff; + --vp-button-brand-hover-border: #ffffff; + --vp-button-brand-hover-text: #1a1a1a; + --vp-button-brand-active-bg: #cccccc; + --vp-button-brand-active-border: #cccccc; + --vp-button-brand-active-text: #1a1a1a; +} + +/* Links: restrained accent, underline on hover only (material-ish). */ +.vp-doc a { + color: var(--vp-c-text-link); + text-decoration: none; + font-weight: 500; +} + +.vp-doc a:hover { + text-decoration: underline; +} + +/* ------------------------------------------------------------- admonitions */ + +/* + * Material-style admonitions: left accent border + tinted background. + * Covers VitePress custom containers and GitHub-style alerts (> [!NOTE] …), + * which VitePress renders with the same .custom-block classes. + */ +.vp-doc .custom-block { + border: none; + border-left: 4px solid var(--vp-c-divider); + border-radius: 2px; + padding: 12px 16px; +} + +.vp-doc .custom-block .custom-block-title { + font-weight: 700; +} + +.vp-doc .custom-block.info, +.vp-doc .custom-block.note { + border-left-color: #448aff; + background-color: rgba(68, 138, 255, 0.08); +} + +.vp-doc .custom-block.tip, +.vp-doc .custom-block.important { + border-left-color: #00bfa5; + background-color: rgba(0, 191, 165, 0.08); +} + +.vp-doc .custom-block.warning, +.vp-doc .custom-block.caution { + border-left-color: #ff9100; + background-color: rgba(255, 145, 0, 0.08); +} + +.vp-doc .custom-block.danger { + border-left-color: #ff5252; + background-color: rgba(255, 82, 82, 0.08); +} + +.vp-doc .custom-block.details { + border-left-color: var(--vp-c-divider); + background-color: var(--vp-c-bg-soft); +} + +/* -------------------------------------------------------------- the banner */ + +.version-banner { + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 35; + height: var(--vp-layout-top-height); + display: flex; + align-items: center; + justify-content: center; + padding: 0 16px; + overflow: hidden; + background-color: var(--vp-c-bg-soft); + border-bottom: 1px solid var(--vp-c-divider); + color: var(--vp-c-text-2); + font-size: 13px; + line-height: 1.3; + text-align: center; +} + +.version-banner a { + color: var(--vp-c-text-1); + text-decoration: underline; + margin-left: 4px; +} diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts new file mode 100644 index 0000000000..be94142d80 --- /dev/null +++ b/docs/.vitepress/theme/index.ts @@ -0,0 +1,15 @@ +import type { Theme } from 'vitepress'; +import DefaultTheme from 'vitepress/theme'; +import { h } from 'vue'; + +import Banner from './Banner.vue'; +import './custom.css'; + +export default { + extends: DefaultTheme, + Layout() { + return h(DefaultTheme.Layout, null, { + 'layout-top': () => h(Banner) + }); + } +} satisfies Theme; diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000000..cfb39bb9ca --- /dev/null +++ b/docs/index.md @@ -0,0 +1,31 @@ +--- +layout: home + +hero: + name: MCP TypeScript SDK + tagline: The TypeScript SDK implementation of the MCP specification. Runs on Node.js, Bun, and Deno. + actions: + - theme: brand + text: Get started + link: /server-quickstart + - theme: alt + text: Client quickstart + link: /client-quickstart + - theme: alt + text: API Reference + link: /api/ + +features: + - title: Servers + details: MCP server libraries — tools, resources, prompts, Streamable HTTP, stdio, and auth helpers. + link: /server + - title: Clients + details: MCP client libraries — transports, high-level helpers, and OAuth helpers. + link: /client + - title: Migration + details: Upgrading from v1.x? Start with the codemod — it handles most mechanical renames. The guides cover what it can't. + link: /migration/ + - title: Conformance-tested + details: Client and server implementations are tested against the MCP conformance suites. + link: https://github.com/modelcontextprotocol/typescript-sdk/tree/main/test/conformance +--- From b3ce208d16b4ade9032e97eff04321a60dbc11d0 Mon Sep 17 00:00:00 2001 From: Felix Weinberger Date: Mon, 29 Jun 2026 18:37:22 +0000 Subject: [PATCH 04/11] docs: rebuild the v1 docs site on VitePress and update the deploy pipeline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit scripts/build-docs-site.sh replaces generate-multidoc.sh: it builds the v2 VitePress site from the current checkout into /v2/ and the v1 site at the root from an origin/v1.x worktree. The v1 content (docs/*.md + README.md as the landing page) is copied into the gitignored docs-v1/content/ at build time with the same mechanical link transforms applied to the build copy only — the v1.x branch itself stays untouched. docs-v1/ holds the VitePress shell for the v1 site, sharing the v2 theme CSS. The deploy workflow and README now invoke the new script. --- .github/workflows/deploy-docs.yml | 7 +- README.md | 10 +- docs-v1/.vitepress/config.mts | 69 +++++++++++++ docs-v1/.vitepress/theme/Banner.vue | 6 ++ docs-v1/.vitepress/theme/index.ts | 16 +++ scripts/build-docs-site.sh | 148 ++++++++++++++++++++++++++++ scripts/generate-multidoc.sh | 115 --------------------- 7 files changed, 250 insertions(+), 121 deletions(-) create mode 100644 docs-v1/.vitepress/config.mts create mode 100644 docs-v1/.vitepress/theme/Banner.vue create mode 100644 docs-v1/.vitepress/theme/index.ts create mode 100755 scripts/build-docs-site.sh delete mode 100755 scripts/generate-multidoc.sh diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 02a5739547..32e8a76c1a 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -37,8 +37,11 @@ jobs: cache: pnpm cache-dependency-path: pnpm-lock.yaml - - name: Generate multi-version docs - run: bash scripts/generate-multidoc.sh tmp/docs-combined + - name: Install dependencies + run: pnpm install + + - name: Build multi-version docs site + run: bash scripts/build-docs-site.sh tmp/docs-combined - name: Configure Pages uses: actions/configure-pages@v6 diff --git a/README.md b/README.md index 7f81e7f4ee..3d8d5a84f0 100644 --- a/README.md +++ b/README.md @@ -150,14 +150,16 @@ The complete code for each tutorial is in [`examples/server-quickstart/`](https: ### Building docs locally -To generate the API reference documentation locally: +To work on the documentation site locally: ```bash -pnpm docs # Generate V2 docs only (output: tmp/docs/) -pnpm docs:multi # Generate combined V1 + V2 docs (output: tmp/docs-combined/) +pnpm docs:api # Generate the API reference markdown (output: docs/api/) +pnpm docs:dev # Start the VitePress dev server for the V2 site +pnpm docs:build # Build the V2 site (output: docs/.vitepress/dist/) +pnpm docs:multi # Build the combined V1 + V2 site (output: tmp/docs-combined/) ``` -The `docs:multi` script checks out both the `v1.x` and `main` branches via git worktrees, builds each, and produces a combined site with V1 docs at the root and V2 docs under `/v2/`. +The `docs:multi` script builds the V2 site from the current checkout, checks out the `v1.x` branch via a git worktree to build the V1 site, and produces a combined site with V1 docs at the root and V2 docs under `/v2/`. ## v1 (legacy) documentation and fixes diff --git a/docs-v1/.vitepress/config.mts b/docs-v1/.vitepress/config.mts new file mode 100644 index 0000000000..39c91da634 --- /dev/null +++ b/docs-v1/.vitepress/config.mts @@ -0,0 +1,69 @@ +import { existsSync, readFileSync } from 'node:fs'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import { defineConfig, type DefaultTheme } from 'vitepress'; + +const siteDir = resolve(dirname(fileURLToPath(import.meta.url)), '..'); + +/** + * The v1 site's source content (docs + generated API markdown) is populated into docs-v1/content/ + * at build time by scripts/build-docs-site.sh from the v1.x branch. The API Reference sidebar is + * generated there by typedoc + typedoc-vitepress-theme. + */ +function apiSidebarItems(): DefaultTheme.SidebarItem[] { + const sidebarPath = resolve(siteDir, 'content/api/typedoc-sidebar.json'); + if (!existsSync(sidebarPath)) { + console.warn(`[docs-v1] ${sidebarPath} not found — run \`bash scripts/build-docs-site.sh\` to populate the v1 content.`); + return []; + } + return JSON.parse(readFileSync(sidebarPath, 'utf8')); +} + +export default defineConfig({ + title: 'MCP TypeScript SDK (v1)', + description: 'Documentation for v1.x of the MCP TypeScript SDK.', + base: '/', + srcDir: 'content', + markdown: { + config(md) { + // Same rewrite as the v2 site: JSDoc carries site-root-relative spec links that are + // meant to resolve on modelcontextprotocol.io. + const orig = md.renderer.rules.link_open ?? ((tokens, idx, options, _env, self) => self.renderToken(tokens, idx, options)); + md.renderer.rules.link_open = (tokens, idx, options, env, self) => { + const href = tokens[idx].attrGet('href'); + if (href?.startsWith('/specification/')) { + tokens[idx].attrSet('href', `https://modelcontextprotocol.io${href}`); + } + return orig(tokens, idx, options, env, self); + }; + } + }, + themeConfig: { + nav: [ + { text: 'Guides', link: '/server', activeMatch: '^/(server|client|capabilities|protocol|faq)' }, + { text: 'API Reference', link: '/api/', activeMatch: '^/api/' }, + { text: 'V2 Docs', link: 'https://ts.sdk.modelcontextprotocol.io/v2/' } + ], + sidebar: [ + { + text: 'Guides', + items: [ + { text: 'Server', link: '/server' }, + { text: 'Client', link: '/client' }, + { text: 'Capabilities', link: '/capabilities' }, + { text: 'Protocol', link: '/protocol' }, + { text: 'FAQ', link: '/faq' } + ] + }, + { + text: 'API Reference', + collapsed: true, + items: apiSidebarItems() + } + ], + outline: { level: [2, 3] }, + search: { provider: 'local' }, + socialLinks: [{ icon: 'github', link: 'https://github.com/modelcontextprotocol/typescript-sdk/tree/v1.x' }] + } +}); diff --git a/docs-v1/.vitepress/theme/Banner.vue b/docs-v1/.vitepress/theme/Banner.vue new file mode 100644 index 0000000000..98c5748b4a --- /dev/null +++ b/docs-v1/.vitepress/theme/Banner.vue @@ -0,0 +1,6 @@ + diff --git a/docs-v1/.vitepress/theme/index.ts b/docs-v1/.vitepress/theme/index.ts new file mode 100644 index 0000000000..f6d7986929 --- /dev/null +++ b/docs-v1/.vitepress/theme/index.ts @@ -0,0 +1,16 @@ +import type { Theme } from 'vitepress'; +import DefaultTheme from 'vitepress/theme'; +import { h } from 'vue'; + +import Banner from './Banner.vue'; +// Shared with the v2 site — do not duplicate. +import '../../../docs/.vitepress/theme/custom.css'; + +export default { + extends: DefaultTheme, + Layout() { + return h(DefaultTheme.Layout, null, { + 'layout-top': () => h(Banner) + }); + } +} satisfies Theme; diff --git a/scripts/build-docs-site.sh b/scripts/build-docs-site.sh new file mode 100755 index 0000000000..0483dc5ac5 --- /dev/null +++ b/scripts/build-docs-site.sh @@ -0,0 +1,148 @@ +#!/usr/bin/env bash +# +# Build the combined V1 + V2 documentation site (VitePress). +# +# V2 (from the current checkout, sources in docs/) is placed under /v2/. +# V1 (content from the v1.x branch, VitePress shell in docs-v1/) is placed at the root. +# +# Usage: +# scripts/build-docs-site.sh [output-dir] +# +# Default output directory: tmp/docs-combined +# +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +OUTPUT_DIR="$(cd "$REPO_ROOT" && realpath -m "${1:-tmp/docs-combined}")" +V1_WORKTREE="$REPO_ROOT/.worktrees/v1-docs" +V1_CONTENT="$REPO_ROOT/docs-v1/content" +V1_GITHUB="https://github.com/modelcontextprotocol/typescript-sdk/blob/v1.x" + +cleanup() { + echo "Cleaning up worktree..." + cd "$REPO_ROOT" + git worktree remove --force "$V1_WORKTREE" 2>/dev/null || true +} +trap cleanup EXIT + +rm -rf "$OUTPUT_DIR" +mkdir -p "$OUTPUT_DIR" + +# --------------------------------------------------------------------------- +# Step 1: Build V2 site from the current checkout +# --------------------------------------------------------------------------- +echo "=== Building V2 site ===" + +cd "$REPO_ROOT" +pnpm install +pnpm -r --filter='./packages/**' build +pnpm docs:api +pnpm exec vitepress build docs + +mkdir -p "$OUTPUT_DIR/v2" +cp -r "$REPO_ROOT/docs/.vitepress/dist/." "$OUTPUT_DIR/v2/" + +# --------------------------------------------------------------------------- +# Step 2: Build V1 site from the v1.x branch +# --------------------------------------------------------------------------- +echo "=== Building V1 site ===" + +git fetch origin v1.x + +git worktree remove --force "$V1_WORKTREE" 2>/dev/null || true +rm -rf "$V1_WORKTREE" +# FETCH_HEAD (set by the fetch above) rather than origin/v1.x: the remote-tracking ref +# does not exist in single-branch or refspec-restricted clones. +git worktree add "$V1_WORKTREE" FETCH_HEAD --detach + +cd "$V1_WORKTREE" +npm install +npm install --no-save typedoc@^0.28.14 typedoc-plugin-markdown@^4.9.0 typedoc-vitepress-theme@^1.1.0 + +rm -rf "$V1_CONTENT" +mkdir -p "$V1_CONTENT" + +# Same entry points as the previous typedoc HTML setup for v1, but rendered to +# markdown (one page per module) for the VitePress shell in docs-v1/. +cat > typedoc.v1-site.json << TYPEDOC_EOF +{ + "name": "MCP TypeScript SDK", + "entryPoints": [ + "src/client/index.ts", + "src/server/index.ts", + "src/shared/protocol.ts", + "src/shared/transport.ts", + "src/types.ts", + "src/inMemory.ts", + "src/validation/index.ts", + "src/experimental/index.ts" + ], + "tsconfig": "tsconfig.json", + "plugin": ["typedoc-plugin-markdown", "typedoc-vitepress-theme"], + "outputFileStrategy": "modules", + "readme": "none", + "docsRoot": "$V1_CONTENT", + "out": "$V1_CONTENT/api", + "exclude": [ + "**/*.test.ts", + "**/__fixtures__/**", + "**/__mocks__/**", + "src/examples/**" + ], + "skipErrorChecking": true +} +TYPEDOC_EOF + +npx typedoc --options typedoc.v1-site.json + +# Copy the v1 markdown content (build copy only — the v1.x branch stays untouched). +cp docs/*.md "$V1_CONTENT/" +cp README.md "$V1_CONTENT/index.md" + +# Rewrite links that don't resolve on the site: +# - source files -> GitHub +# - README links into docs/ -> site-local pages (docs/*.md sit next to index.md in content/) +sed -i "s|(src/examples/|(${V1_GITHUB}/src/examples/|g" "$V1_CONTENT/index.md" +sed -i "s|(LICENSE)|(${V1_GITHUB}/LICENSE)|g" "$V1_CONTENT/index.md" +sed -i "s|(docs/|(./|g" "$V1_CONTENT/index.md" +sed -i "s|(\.\./src/examples/|(${V1_GITHUB}/src/examples/|g" "$V1_CONTENT"/*.md + +# Mechanical {@linkcode} -> backticks transform, mirroring the v2 docs transform. +# (The v1 docs currently contain none; this keeps the build robust if tags appear.) +node -e ' +const fs = require("fs"); +for (const f of process.argv.slice(1)) { + const src = fs.readFileSync(f, "utf8"); + const out = src.replace(/\{@linkcode\s+([^}|]+?)(?:\s*\|\s*([^}]+?))?\s*\}/gs, (_m, path, label) => + "`" + (label !== undefined ? label.replace(/\s+/g, " ").trim() : path.replace(/\s+/g, " ").trim().split(/[.#!/]/).pop()) + "`" + ); + if (out !== src) fs.writeFileSync(f, out); +} +' "$V1_CONTENT"/*.md + +# The v1.x guide pages start at "##" — the old typedoc shell supplied the page title, +# VitePress does not. Prepend a title heading (build copy only) so pages don't open +# with an orphaned section gap. index.md (the README) already has one. +for f in "$V1_CONTENT"/*.md; do + name="$(basename "$f" .md)" + [ "$name" = "index" ] && continue + head -n 1 "$f" | grep -q '^# ' && continue + case "$name" in + faq) title="FAQ" ;; + *) title="$(printf '%s' "${name:0:1}" | tr '[:lower:]' '[:upper:]')${name:1}" ;; + esac + if head -n 1 "$f" | grep -qi "^## *${title} *$"; then + # The page's first section heading already is the title — promote it. + sed -i '1s/^## */# /' "$f" + else + { printf '# %s\n\n' "$title"; cat "$f"; } > "$f.tmp" && mv "$f.tmp" "$f" + fi +done + +cd "$REPO_ROOT" +pnpm exec vitepress build docs-v1 + +cp -r "$REPO_ROOT/docs-v1/.vitepress/dist/." "$OUTPUT_DIR/" + +echo "=== Combined docs generated at $OUTPUT_DIR ===" diff --git a/scripts/generate-multidoc.sh b/scripts/generate-multidoc.sh deleted file mode 100755 index 856370d179..0000000000 --- a/scripts/generate-multidoc.sh +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env bash -# -# Generate combined V1 + V2 TypeDoc documentation. -# -# V1 docs (from the v1.x branch) are placed at the root. -# V2 docs (from main) are placed under /v2/. -# -# Usage: -# scripts/generate-multidoc.sh [output-dir] -# -# Default output directory: tmp/docs-combined -# -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" -OUTPUT_DIR="$(cd "$REPO_ROOT" && realpath -m "${1:-tmp/docs-combined}")" -V1_WORKTREE="$REPO_ROOT/.worktrees/v1-docs" -V2_WORKTREE="$REPO_ROOT/.worktrees/v2-docs" - -cleanup() { - echo "Cleaning up worktrees..." - cd "$REPO_ROOT" - git worktree remove --force "$V1_WORKTREE" 2>/dev/null || true - git worktree remove --force "$V2_WORKTREE" 2>/dev/null || true -} -trap cleanup EXIT - -rm -rf "$OUTPUT_DIR" -mkdir -p "$OUTPUT_DIR" - -# --------------------------------------------------------------------------- -# Step 1: Generate V1 docs from v1.x branch -# --------------------------------------------------------------------------- -echo "=== Generating V1 docs ===" - -git fetch origin v1.x - -git worktree remove --force "$V1_WORKTREE" 2>/dev/null || true -rm -rf "$V1_WORKTREE" -git worktree add "$V1_WORKTREE" "origin/v1.x" --detach - -cd "$V1_WORKTREE" -npm install -npm install --save-dev typedoc@^0.28.14 - -cat > typedoc.json << 'TYPEDOC_EOF' -{ - "name": "MCP TypeScript SDK", - "entryPoints": [ - "src/client/index.ts", - "src/server/index.ts", - "src/shared/protocol.ts", - "src/shared/transport.ts", - "src/types.ts", - "src/inMemory.ts", - "src/validation/index.ts", - "src/experimental/index.ts" - ], - "tsconfig": "tsconfig.json", - "out": "tmp/docs", - "exclude": [ - "**/*.test.ts", - "**/__fixtures__/**", - "**/__mocks__/**", - "src/examples/**" - ], - "projectDocuments": [ - "docs/server.md", - "docs/client.md", - "docs/capabilities.md", - "docs/protocol.md", - "docs/faq.md" - ], - "navigationLinks": { - "V2 Docs": "/v2/" - }, - "headings": { - "readme": false - }, - "skipErrorChecking": true -} -TYPEDOC_EOF - -# Rewrite relative .ts links to point to GitHub source instead of media downloads -V1_GITHUB="https://github.com/modelcontextprotocol/typescript-sdk/blob/v1.x" -sed -i "s|(src/examples/|(${V1_GITHUB}/src/examples/|g" README.md -sed -i "s|(../src/examples/|(${V1_GITHUB}/src/examples/|g" docs/*.md - -npx typedoc - -cp -r "$V1_WORKTREE/tmp/docs/"* "$OUTPUT_DIR/" - -# --------------------------------------------------------------------------- -# Step 2: Generate V2 docs from main branch -# --------------------------------------------------------------------------- -echo "=== Generating V2 docs ===" - -git fetch origin main - -git worktree remove --force "$V2_WORKTREE" 2>/dev/null || true -rm -rf "$V2_WORKTREE" -git worktree add "$V2_WORKTREE" "origin/main" --detach - -cd "$V2_WORKTREE" -pnpm install -pnpm -r --filter='./packages/**' build - -npx typedoc # outputs to tmp/docs/ per typedoc.config.mjs - -mkdir -p "$OUTPUT_DIR/v2" -cp -r "$V2_WORKTREE/tmp/docs/"* "$OUTPUT_DIR/v2/" - -cd "$REPO_ROOT" -echo "=== Combined docs generated at $OUTPUT_DIR ===" From d62994afc72e62034d3e22a0e3c2b9c30a7a737c Mon Sep 17 00:00:00 2001 From: Felix Weinberger Date: Tue, 30 Jun 2026 10:39:01 +0000 Subject: [PATCH 05/11] docs: land the v2 site on the README --- .gitignore | 1 + docs/index.md | 31 ------------------------------- package.json | 5 +++-- scripts/build-docs-index.ts | 29 +++++++++++++++++++++++++++++ scripts/build-docs-site.sh | 3 +-- 5 files changed, 34 insertions(+), 35 deletions(-) delete mode 100644 docs/index.md create mode 100644 scripts/build-docs-index.ts diff --git a/.gitignore b/.gitignore index 48ada02c01..83149ffd3c 100644 --- a/.gitignore +++ b/.gitignore @@ -51,6 +51,7 @@ dist/ .worktrees/ # Generated docs-site artifacts +docs/index.md docs/api/ docs/.vitepress/cache/ docs/.vitepress/dist/ diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index cfb39bb9ca..0000000000 --- a/docs/index.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -layout: home - -hero: - name: MCP TypeScript SDK - tagline: The TypeScript SDK implementation of the MCP specification. Runs on Node.js, Bun, and Deno. - actions: - - theme: brand - text: Get started - link: /server-quickstart - - theme: alt - text: Client quickstart - link: /client-quickstart - - theme: alt - text: API Reference - link: /api/ - -features: - - title: Servers - details: MCP server libraries — tools, resources, prompts, Streamable HTTP, stdio, and auth helpers. - link: /server - - title: Clients - details: MCP client libraries — transports, high-level helpers, and OAuth helpers. - link: /client - - title: Migration - details: Upgrading from v1.x? Start with the codemod — it handles most mechanical renames. The guides cover what it can't. - link: /migration/ - - title: Conformance-tested - details: Client and server implementations are tested against the MCP conformance suites. - link: https://github.com/modelcontextprotocol/typescript-sdk/tree/main/test/conformance ---- diff --git a/package.json b/package.json index e3b765aeab..0fbe0fa6ba 100644 --- a/package.json +++ b/package.json @@ -28,8 +28,9 @@ "examples:oauth-server:w": "pnpm --filter @mcp-examples/oauth exec tsx --watch server.ts", "run:examples": "tsx scripts/examples/run-examples.ts", "docs:api": "typedoc", - "docs:dev": "vitepress dev docs", - "docs:build": "pnpm docs:api && vitepress build docs", + "docs:index": "tsx scripts/build-docs-index.ts", + "docs:dev": "pnpm docs:index && vitepress dev docs", + "docs:build": "pnpm docs:index && pnpm docs:api && vitepress build docs", "docs:multi": "bash scripts/build-docs-site.sh", "docs:check": "pnpm docs:build", "typecheck:all": "pnpm -r typecheck", diff --git a/scripts/build-docs-index.ts b/scripts/build-docs-index.ts new file mode 100644 index 0000000000..344ed62cbb --- /dev/null +++ b/scripts/build-docs-index.ts @@ -0,0 +1,29 @@ +/** + * Generate docs/index.md (the V2 site's landing page) from the repository README. + * + * The docs site lands on the README — the same model as the V1 site — so the README + * stays the single source of truth and the landing page can never drift from it. + * Links that only resolve on GitHub are rewritten for the site: + * - `docs/.md` -> `./.md` (index.md sits next to the guide pages) + * - other repo paths -> the GitHub blob URL + */ +import { readFileSync, writeFileSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const repoRoot = join(dirname(fileURLToPath(import.meta.url)), '..'); +const GITHUB = 'https://github.com/modelcontextprotocol/typescript-sdk/blob/main'; + +let markdown = readFileSync(join(repoRoot, 'README.md'), 'utf8'); + +markdown = markdown + .replaceAll('](docs/', '](./') + .replaceAll('](packages/', `](${GITHUB}/packages/`) + .replaceAll('](examples/', `](${GITHUB}/examples/`) + .replaceAll('](LICENSE)', `](${GITHUB}/LICENSE)`) + .replaceAll('](CONTRIBUTING.md)', `](${GITHUB}/CONTRIBUTING.md)`) + .replaceAll('](SECURITY.md)', `](${GITHUB}/SECURITY.md)`) + .replaceAll('](CODE_OF_CONDUCT.md)', `](${GITHUB}/CODE_OF_CONDUCT.md)`); + +writeFileSync(join(repoRoot, 'docs', 'index.md'), markdown); +console.log('docs/index.md generated from README.md'); diff --git a/scripts/build-docs-site.sh b/scripts/build-docs-site.sh index 0483dc5ac5..3436a8dd92 100755 --- a/scripts/build-docs-site.sh +++ b/scripts/build-docs-site.sh @@ -37,8 +37,7 @@ echo "=== Building V2 site ===" cd "$REPO_ROOT" pnpm install pnpm -r --filter='./packages/**' build -pnpm docs:api -pnpm exec vitepress build docs +pnpm docs:build mkdir -p "$OUTPUT_DIR/v2" cp -r "$REPO_ROOT/docs/.vitepress/dist/." "$OUTPUT_DIR/v2/" From baaf9a98a82a6524f9e1d3dc0eb196747f53b7c1 Mon Sep 17 00:00:00 2001 From: Felix Weinberger Date: Tue, 30 Jun 2026 13:41:08 +0000 Subject: [PATCH 06/11] docs: emit a sitemap from both VitePress sites --- docs-v1/.vitepress/config.mts | 1 + docs/.vitepress/config.mts | 1 + 2 files changed, 2 insertions(+) diff --git a/docs-v1/.vitepress/config.mts b/docs-v1/.vitepress/config.mts index 39c91da634..f96ba01783 100644 --- a/docs-v1/.vitepress/config.mts +++ b/docs-v1/.vitepress/config.mts @@ -24,6 +24,7 @@ export default defineConfig({ title: 'MCP TypeScript SDK (v1)', description: 'Documentation for v1.x of the MCP TypeScript SDK.', base: '/', + sitemap: { hostname: 'https://ts.sdk.modelcontextprotocol.io' }, srcDir: 'content', markdown: { config(md) { diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index c0c246c7e4..f75a3f6e05 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -24,6 +24,7 @@ export default defineConfig({ title: 'MCP TypeScript SDK', description: 'The TypeScript SDK implementation of the Model Context Protocol specification.', base: '/v2/', + sitemap: { hostname: 'https://ts.sdk.modelcontextprotocol.io/v2/' }, markdown: { config(md) { // Spec-generated JSDoc (packages/core-internal/src/types/spec.types.*.ts) carries From 55d26ee7ac15eba9bcba46b816491436dcf70f47 Mon Sep 17 00:00:00 2001 From: Felix Weinberger Date: Tue, 30 Jun 2026 13:50:29 +0000 Subject: [PATCH 07/11] docs: move the v1 site shell under docs/v1/ --- .gitignore | 6 +++--- docs/.vitepress/config.mts | 1 + {docs-v1 => docs/v1}/.vitepress/config.mts | 4 ++-- {docs-v1 => docs/v1}/.vitepress/theme/Banner.vue | 0 {docs-v1 => docs/v1}/.vitepress/theme/index.ts | 2 +- scripts/build-docs-site.sh | 10 +++++----- 6 files changed, 12 insertions(+), 11 deletions(-) rename {docs-v1 => docs/v1}/.vitepress/config.mts (96%) rename {docs-v1 => docs/v1}/.vitepress/theme/Banner.vue (100%) rename {docs-v1 => docs/v1}/.vitepress/theme/index.ts (87%) diff --git a/.gitignore b/.gitignore index 83149ffd3c..64af8fe95a 100644 --- a/.gitignore +++ b/.gitignore @@ -55,9 +55,9 @@ docs/index.md docs/api/ docs/.vitepress/cache/ docs/.vitepress/dist/ -docs-v1/content/ -docs-v1/.vitepress/cache/ -docs-v1/.vitepress/dist/ +docs/v1/content/ +docs/v1/.vitepress/cache/ +docs/v1/.vitepress/dist/ # Conformance test results results/ diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index f75a3f6e05..3504113e50 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -24,6 +24,7 @@ export default defineConfig({ title: 'MCP TypeScript SDK', description: 'The TypeScript SDK implementation of the Model Context Protocol specification.', base: '/v2/', + srcExclude: ['v1/**'], sitemap: { hostname: 'https://ts.sdk.modelcontextprotocol.io/v2/' }, markdown: { config(md) { diff --git a/docs-v1/.vitepress/config.mts b/docs/v1/.vitepress/config.mts similarity index 96% rename from docs-v1/.vitepress/config.mts rename to docs/v1/.vitepress/config.mts index f96ba01783..9870c131b2 100644 --- a/docs-v1/.vitepress/config.mts +++ b/docs/v1/.vitepress/config.mts @@ -7,14 +7,14 @@ import { defineConfig, type DefaultTheme } from 'vitepress'; const siteDir = resolve(dirname(fileURLToPath(import.meta.url)), '..'); /** - * The v1 site's source content (docs + generated API markdown) is populated into docs-v1/content/ + * The v1 site's source content (docs + generated API markdown) is populated into docs/v1/content/ * at build time by scripts/build-docs-site.sh from the v1.x branch. The API Reference sidebar is * generated there by typedoc + typedoc-vitepress-theme. */ function apiSidebarItems(): DefaultTheme.SidebarItem[] { const sidebarPath = resolve(siteDir, 'content/api/typedoc-sidebar.json'); if (!existsSync(sidebarPath)) { - console.warn(`[docs-v1] ${sidebarPath} not found — run \`bash scripts/build-docs-site.sh\` to populate the v1 content.`); + console.warn(`[docs/v1] ${sidebarPath} not found — run \`bash scripts/build-docs-site.sh\` to populate the v1 content.`); return []; } return JSON.parse(readFileSync(sidebarPath, 'utf8')); diff --git a/docs-v1/.vitepress/theme/Banner.vue b/docs/v1/.vitepress/theme/Banner.vue similarity index 100% rename from docs-v1/.vitepress/theme/Banner.vue rename to docs/v1/.vitepress/theme/Banner.vue diff --git a/docs-v1/.vitepress/theme/index.ts b/docs/v1/.vitepress/theme/index.ts similarity index 87% rename from docs-v1/.vitepress/theme/index.ts rename to docs/v1/.vitepress/theme/index.ts index f6d7986929..8a1ec5c6fe 100644 --- a/docs-v1/.vitepress/theme/index.ts +++ b/docs/v1/.vitepress/theme/index.ts @@ -4,7 +4,7 @@ import { h } from 'vue'; import Banner from './Banner.vue'; // Shared with the v2 site — do not duplicate. -import '../../../docs/.vitepress/theme/custom.css'; +import '../../../.vitepress/theme/custom.css'; export default { extends: DefaultTheme, diff --git a/scripts/build-docs-site.sh b/scripts/build-docs-site.sh index 3436a8dd92..01e970428e 100755 --- a/scripts/build-docs-site.sh +++ b/scripts/build-docs-site.sh @@ -3,7 +3,7 @@ # Build the combined V1 + V2 documentation site (VitePress). # # V2 (from the current checkout, sources in docs/) is placed under /v2/. -# V1 (content from the v1.x branch, VitePress shell in docs-v1/) is placed at the root. +# V1 (content from the v1.x branch, VitePress shell in docs/v1/) is placed at the root. # # Usage: # scripts/build-docs-site.sh [output-dir] @@ -16,7 +16,7 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" OUTPUT_DIR="$(cd "$REPO_ROOT" && realpath -m "${1:-tmp/docs-combined}")" V1_WORKTREE="$REPO_ROOT/.worktrees/v1-docs" -V1_CONTENT="$REPO_ROOT/docs-v1/content" +V1_CONTENT="$REPO_ROOT/docs/v1/content" V1_GITHUB="https://github.com/modelcontextprotocol/typescript-sdk/blob/v1.x" cleanup() { @@ -63,7 +63,7 @@ rm -rf "$V1_CONTENT" mkdir -p "$V1_CONTENT" # Same entry points as the previous typedoc HTML setup for v1, but rendered to -# markdown (one page per module) for the VitePress shell in docs-v1/. +# markdown (one page per module) for the VitePress shell in docs/v1/. cat > typedoc.v1-site.json << TYPEDOC_EOF { "name": "MCP TypeScript SDK", @@ -140,8 +140,8 @@ for f in "$V1_CONTENT"/*.md; do done cd "$REPO_ROOT" -pnpm exec vitepress build docs-v1 +pnpm exec vitepress build docs/v1 -cp -r "$REPO_ROOT/docs-v1/.vitepress/dist/." "$OUTPUT_DIR/" +cp -r "$REPO_ROOT/docs/v1/.vitepress/dist/." "$OUTPUT_DIR/" echo "=== Combined docs generated at $OUTPUT_DIR ===" From e231acbdcd098a138e6f2be9cace2fe43713f30e Mon Sep 17 00:00:00 2001 From: Felix Weinberger Date: Tue, 30 Jun 2026 13:58:54 +0000 Subject: [PATCH 08/11] docs(codemod): point the README's migration-guide links at the docs site Reverts the blanket link-externalization on this README: the four ./src/*.ts links stay relative (typedoc rewrites them to the matching API pages, and they work on GitHub/npm). Only the two ../../docs/migration/ links change, to the docs site URL, which stops typedoc-plugin-markdown copying the migration docs into api/_media/ with broken relative links of their own. --- packages/codemod/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/codemod/README.md b/packages/codemod/README.md index a907eec4ca..66d13de7d9 100644 --- a/packages/codemod/README.md +++ b/packages/codemod/README.md @@ -20,13 +20,13 @@ working tree so you can review the diff. The mechanical rename mappings are the source of truth — see `src/migrations/v1-to-v2/mappings/`: -- [`importMap.ts`](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/packages/codemod/src/migrations/v1-to-v2/mappings/importMap.ts) — +- [`importMap.ts`](./src/migrations/v1-to-v2/mappings/importMap.ts) — `@modelcontextprotocol/sdk/...` import paths → v2 packages -- [`symbolMap.ts`](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/packages/codemod/src/migrations/v1-to-v2/mappings/symbolMap.ts) — +- [`symbolMap.ts`](./src/migrations/v1-to-v2/mappings/symbolMap.ts) — symbol renames (`McpError` → `ProtocolError`, …) -- [`schemaToMethodMap.ts`](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/packages/codemod/src/migrations/v1-to-v2/mappings/schemaToMethodMap.ts) — +- [`schemaToMethodMap.ts`](./src/migrations/v1-to-v2/mappings/schemaToMethodMap.ts) — `setRequestHandler(Schema, …)` → `setRequestHandler('method/string', …)` -- [`contextPropertyMap.ts`](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/packages/codemod/src/migrations/v1-to-v2/mappings/contextPropertyMap.ts) — +- [`contextPropertyMap.ts`](./src/migrations/v1-to-v2/mappings/contextPropertyMap.ts) — `extra.*` → `ctx.mcpReq.*` / `ctx.http?.*` Transforms in `src/migrations/v1-to-v2/transforms/` also rewrite `.tool()` → @@ -68,10 +68,10 @@ bracket access → `.get()`; sending plain-record headers keeps working), OAuth error-class consolidation (`instanceof InvalidGrantError` → `OAuthError` + `OAuthErrorCode`), per-scenario `SdkErrorCode` branch selection, `ctx.mcpReq.send()` schema-arg drop, and behavioral adaptation are manual — see the -[migration guide](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/docs/migration/upgrade-to-v2.md) for what to do after the +[migration guide](https://ts.sdk.modelcontextprotocol.io/v2/migration/upgrade-to-v2) for what to do after the codemod runs. The codemod handles the v1→v2 SDK surface upgrade only. Adopting the 2026-07-28 protocol revision (`createMcpHandler`, multi-round-trip requests, `versionNegotiation`) is architectural and not codemod-automatable — see -[docs/migration/support-2026-07-28.md](https://github.com/modelcontextprotocol/typescript-sdk/blob/main/docs/migration/support-2026-07-28.md). +[docs/migration/support-2026-07-28.md](https://ts.sdk.modelcontextprotocol.io/v2/migration/support-2026-07-28). From 6db0f5d541bd51c61359a31f69a4671b542f5802 Mon Sep 17 00:00:00 2001 From: Felix Weinberger Date: Tue, 30 Jun 2026 14:28:12 +0000 Subject: [PATCH 09/11] docs: give the FAQ page a top-level heading --- docs/faq.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/faq.md b/docs/faq.md index 1d07ced7a4..67ca8c171a 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -2,7 +2,7 @@ title: FAQ --- -## FAQ +# FAQ
Table of Contents From bfa3f32e330b9be68132ff3f110e7233bd0b8c52 Mon Sep 17 00:00:00 2001 From: Felix Weinberger Date: Tue, 30 Jun 2026 14:28:12 +0000 Subject: [PATCH 10/11] docs: point the landing page's API docs link at the API reference --- scripts/build-docs-index.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/build-docs-index.ts b/scripts/build-docs-index.ts index 344ed62cbb..2aac179da9 100644 --- a/scripts/build-docs-index.ts +++ b/scripts/build-docs-index.ts @@ -17,6 +17,9 @@ const GITHUB = 'https://github.com/modelcontextprotocol/typescript-sdk/blob/main let markdown = readFileSync(join(repoRoot, 'README.md'), 'utf8'); markdown = markdown + // The README's "API docs" link points at the old typedoc site; on the landing it is the + // in-site API Reference section. + .replaceAll('](https://modelcontextprotocol.github.io/typescript-sdk/)', '](./api/index.md)') .replaceAll('](docs/', '](./') .replaceAll('](packages/', `](${GITHUB}/packages/`) .replaceAll('](examples/', `](${GITHUB}/examples/`) From fde2a5dd71635361337ca8cc31adb355637e55c2 Mon Sep 17 00:00:00 2001 From: Felix Weinberger Date: Tue, 30 Jun 2026 14:32:42 +0000 Subject: [PATCH 11/11] docs: keep the internal behavior-surface-pins note off the published site --- docs/.vitepress/config.mts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 3504113e50..f824e09855 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -24,7 +24,7 @@ export default defineConfig({ title: 'MCP TypeScript SDK', description: 'The TypeScript SDK implementation of the Model Context Protocol specification.', base: '/v2/', - srcExclude: ['v1/**'], + srcExclude: ['v1/**', 'behavior-surface-pins.md'], sitemap: { hostname: 'https://ts.sdk.modelcontextprotocol.io/v2/' }, markdown: { config(md) {