mcp-use 2.0.0-beta.21 → 2.0.0-beta.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.ts","../src/branding.ts","../src/config.ts","../src/context.ts","../src/views/capabilities.ts","../src/views/constants.ts","../src/middleware/cors.ts","../src/middleware/mcp-middleware.ts","../src/inspector-shell.ts","../src/logging.ts","../src/mount-mcp.ts","../src/tools.ts","../src/views/register.ts","../src/views/csp-env.ts","../src/views/routes.ts","../src/views/wire.ts","../src/index.ts"],"sourcesContent":["import {\n localhostAllowedHostnames,\n localhostAllowedOrigins,\n McpServer as SdkMcpServer,\n ResourceTemplate,\n isInputRequiredResult,\n type McpHttpHandler,\n type McpRequestContext,\n type PromptCallback as SdkPromptCallback,\n type ServerEventBus,\n type ServerContext,\n type StandardSchemaWithJSON,\n} from \"@modelcontextprotocol/server\";\nimport type { Server as NodeHttpServer } from \"node:http\";\n\nimport {\n createFaviconHandler,\n hasLocalBrandingAsset,\n normalizeServerBranding,\n resolveImplementationIcons,\n type ServerBranding,\n} from \"./branding.js\";\nimport { assertServerConfig, type ServerConfig } from \"./config.js\";\nimport {\n toAuthenticatedRequestContext,\n toRequestContext,\n type RequestContext,\n} from \"./context.js\";\nimport {\n composeFetch,\n getRequestBag,\n hostValidationMiddleware,\n isHtmlNavigationRequest,\n jsonBodyMiddleware,\n matchesPath,\n originValidationMiddleware,\n routeFetch,\n toFrameworkHandler,\n type FetchHandler,\n type FrameworkHandler,\n} from \"./fetch-app.js\";\nimport { corsFetchMiddleware, isGlobalCorsEnabled } from \"./middleware/cors.js\";\nimport {\n createMcpEventListenerEntry,\n createMcpMiddlewareEntry,\n runMcpOperation,\n withMcpMiddlewareParams,\n type McpEventListenerFnFor,\n type McpEventPattern,\n type McpEventListenerEntry,\n type McpMiddlewareEntry,\n type McpMiddlewareFnFor,\n type McpMiddlewareMethod,\n type McpMiddlewarePattern,\n type McpMiddlewareResult,\n type MiddlewareContext,\n} from \"./middleware/mcp-middleware.js\";\nimport {\n createInspectorHandler,\n matchesInspectorShellPath,\n} from \"./inspector-shell.js\";\nimport { requestLogger } from \"./logging.js\";\nimport { createMcpMount } from \"./mount-mcp.js\";\nimport { normalizeCompletions } from \"./resource-completion.js\";\nimport type { NodeRequestHandler } from \"./node-bridge.js\";\nimport { registerOpenAPITools } from \"./openapi/index.js\";\nimport type { FromOpenAPIOptions } from \"./openapi/types.js\";\nimport {\n getOAuthProtectedResourceMetadataUrl,\n requireBearerAuth,\n} from \"./oauth/index.js\";\nimport { authInfoFromRequest, oauthMetadata } from \"./oauth/adapters.js\";\nimport {\n getOAuthProviderOptions,\n resolveConfiguredOAuthResource,\n resolveLocalOAuthResource,\n wrapOAuthTokenVerifier,\n} from \"./oauth/internal.js\";\nimport type {\n InferPromptInput,\n PromptCallback,\n PromptDefinition,\n} from \"./prompts.js\";\nimport type {\n InferTemplateParams,\n ResourceCallback,\n ResourceDefinition,\n ResourceTemplateCallback,\n ResourceTemplateDefinition,\n TemplateVariableValue,\n} from \"./resources.js\";\nimport type {\n ProxyConnection,\n ProxyMountHost,\n ProxyServerConfig,\n} from \"./mcp-proxy.js\";\nimport type {\n InferToolInput,\n InferToolName,\n InferToolOutput,\n ToolCallback,\n ToolDefinition,\n ToolRef,\n ToolViewConfig,\n} from \"./tools.js\";\nimport { resolveToolInputSchema } from \"./tools.js\";\nimport type { ViewResourceFacts } from \"./views/types.js\";\nimport {\n createViewPublicHandler,\n createViewAssetsHandler,\n registerViews,\n resolveAssetsBase,\n synthesizeViewDocument,\n viewResourceConfig,\n viewResourceUri,\n buildResourceUiMeta,\n buildToolResultUiMeta,\n buildToolUiMeta,\n type BuildResourceUiMetaOptions,\n type ViewManifestEntry,\n type ViewsManifest,\n} from \"./views/index.js\";\n\n/*\n * Registry entries hold callbacks type-erased to their widest signature; the\n * registration methods cast the schema-narrowed callback down at `.set()`.\n * Safe because the SDK validates params against the definition's schema\n * before any callback runs.\n */\ntype HasOAuth<TUser> = [TUser] extends [never] ? false : true;\n\n/** Type-erased registry entry replayed when a per-request SDK server is built. */\ninterface ToolEntry<TUser> {\n /** Declarative tool metadata and schemas supplied at registration time. */\n definition: ToolDefinition;\n /** Tool callback widened for heterogeneous storage in the registry. */\n callback: ToolCallback<\n Record<string, unknown>,\n never,\n TUser,\n HasOAuth<TUser>\n >;\n}\n\n/** Static resource definition and callback retained for per-request replay. */\ninterface ResourceEntry<TUser> {\n /** Declarative resource metadata supplied at registration time. */\n definition: ResourceDefinition;\n /** Callback invoked when the registered resource URI is read. */\n callback: ResourceCallback<TUser, HasOAuth<TUser>>;\n}\n\n/** Parameterized resource definition and type-erased callback registry entry. */\ninterface ResourceTemplateEntry<TUser> {\n /** Declarative template metadata, including its URI template. */\n definition: ResourceTemplateDefinition;\n /** Template callback widened to store every inferred variable shape. */\n callback: ResourceTemplateCallback<\n Record<string, TemplateVariableValue>,\n TUser,\n HasOAuth<TUser>\n >;\n /** SDK callback map normalized once at author-time registration. */\n complete?: ReturnType<typeof normalizeCompletions>;\n}\n\n/** Prompt definition and type-erased callback retained for request-time replay. */\ninterface PromptEntry<TUser> {\n /** Declarative prompt metadata and optional argument schema. */\n definition: PromptDefinition;\n /** Prompt callback widened to store every inferred argument shape. */\n callback: PromptCallback<Record<string, unknown>, TUser, HasOAuth<TUser>>;\n}\n\n/** Node HTTP listener returned by `listen()`. */\ninterface NodeHttpListener {\n close(callback?: (error?: Error) => void): void;\n once(event: \"error\", listener: (error: unknown) => void): void;\n listen(port: number, hostname: string, callback?: () => void): NodeHttpServer;\n address(): { port: number } | string | null;\n}\n\nfunction omitRootSchemaDialect<T>(schema: T): T {\n if (\n typeof schema !== \"object\" ||\n schema === null ||\n Array.isArray(schema) ||\n !(\"$schema\" in schema)\n ) {\n return schema;\n }\n\n const emittedSchema = { ...schema } as T & Record<string, unknown>;\n delete emittedSchema[\"$schema\"];\n return emittedSchema;\n}\n\nfunction omitToolSchemaDialects(\n tools: McpMiddlewareResult<\"tools/list\">\n): McpMiddlewareResult<\"tools/list\"> {\n return tools.map((tool) => ({\n ...tool,\n inputSchema: omitRootSchemaDialect(tool.inputSchema),\n ...(tool.outputSchema === undefined\n ? {}\n : { outputSchema: omitRootSchemaDialect(tool.outputSchema) }),\n }));\n}\n\n/**\n * MCP server with declarative tool/resource/prompt registration, served\n * statelessly over a composed fetch handler.\n *\n * Registrations are stored in a registry; a fresh SDK `McpServer` is built\n * from it for every HTTP request (the stateless 2026-07-28 model), so\n * definition-time work must stay cheap — put pools and caches at module\n * scope, not inside callbacks' setup.\n *\n * @example\n * ```ts\n * const server = new MCPServer({ name: \"my-server\", version: \"1.0.0\" });\n * server.tool(\n * { name: \"add\", inputSchema: z.object({ a: z.number(), b: z.number() }) },\n * async ({ a, b }) => ({\n * content: [{ type: \"text\", text: String(a + b) }],\n * })\n * );\n * await server.listen(3000);\n * ```\n */\nexport class MCPServer<TUser = never> {\n readonly #config: ServerConfig<TUser>;\n readonly #branding: ReturnType<typeof normalizeServerBranding>;\n readonly #tools = new Map<string, ToolEntry<TUser>>();\n readonly #resources = new Map<string, ResourceEntry<TUser>>();\n readonly #resourceTemplates = new Map<string, ResourceTemplateEntry<TUser>>();\n readonly #prompts = new Map<string, PromptEntry<TUser>>();\n readonly #views = new Map<string, ViewManifestEntry>();\n /**\n * One-to-one tool→view bindings. Each view name maps to the single tool\n * that bound it; that tool's `view:` config is the sole source of\n * resource facts for the primed view resource.\n */\n readonly #viewBindings = new Map<\n string,\n {\n toolName: string;\n config: ToolViewConfig;\n }\n >();\n #viewsPrimed = false;\n /** When true, resource CSP emission includes the HMR websocket origin. */\n #viewsDevMode = false;\n /** Project root for filesystem-backed view bundle and public routes. */\n #viewsProjectRoot = process.cwd();\n\n #fetchHandler: FetchHandler | undefined;\n #handler: McpHttpHandler | undefined;\n #httpServer: NodeHttpListener | undefined;\n #oauthResource: URL | undefined;\n #oauthResourceResolved = false;\n #oauthResourceConfigurationAbsent = false;\n /** Whether the mounted app validates Host headers (fixed at first mount). */\n #hostValidated = false;\n readonly #mcpMiddlewares: McpMiddlewareEntry[] = [];\n readonly #mcpEventListeners: McpEventListenerEntry[] = [];\n /** Client instances created by {@link MCPServer.proxy} and owned by this server. */\n readonly #proxyOwners: Array<{ close(): Promise<void> }> = [];\n /** Proxy registrations that {@link close} must let finish before cleanup. */\n readonly #proxyOperations = new Set<Promise<void>>();\n /** Whether terminal shutdown has begun. */\n #closed = false;\n\n /**\n * Create an MCP server from a parsed, bundled OpenAPI document.\n *\n * Each included OpenAPI operation becomes a tool that validates its input,\n * calls the matching upstream HTTP endpoint, and returns the response using\n * the SDK's raw tool-result shape. External `$ref` values are not fetched;\n * bundle the document before passing it in.\n *\n * @param options - OpenAPI document, operation filters, upstream URL, and\n * request authentication options.\n * @returns An unauthenticated MCP server populated with generated tools.\n *\n * @example\n * ```ts\n * const spec = await fetch(\"https://api.example.com/openapi.json\")\n * .then((response) => response.json());\n * const server = MCPServer.fromOpenAPI({ spec });\n * await server.listen(3000);\n * ```\n */\n static fromOpenAPI(options: FromOpenAPIOptions): MCPServer {\n const server = new MCPServer({\n name: options.name ?? options.spec.info.title,\n version: options.version ?? options.spec.info.version ?? \"1.0.0\",\n });\n registerOpenAPITools(server, options);\n return server;\n }\n\n /**\n * Create a server. `config.name` and `config.version` identify the server\n * to clients during initialization. `config.basePath` (default `\"/mcp\"`)\n * is both the MCP route and the path of the OAuth protected-resource\n * identity, so any explicit OAuth resource URL must use that exact path.\n * Nothing binds or listens until {@link MCPServer.listen} or\n * {@link MCPServer.getHandler} is called.\n */\n constructor(config: ServerConfig<TUser>) {\n assertServerConfig(config);\n this.#config = config;\n this.#branding = normalizeServerBranding(config);\n if (config.oauth !== undefined) {\n const mcpUrl =\n typeof process === \"undefined\" ? undefined : process.env[\"MCP_URL\"];\n const resource = resolveConfiguredOAuthResource({\n provider: config.oauth,\n basePath: this.#basePath(),\n ...(mcpUrl !== undefined && { mcpUrl }),\n });\n this.#oauthResource = resource;\n this.#oauthResourceResolved = resource !== undefined;\n this.#oauthResourceConfigurationAbsent = resource === undefined;\n }\n }\n\n /**\n * The URL path prefix the MCP endpoint is mounted at.\n *\n * Reflects `config.basePath` (default `\"/mcp\"`). Exposed so tooling that\n * imports the entry module — `mcp-use dev`'s startup log, for example —\n * can build the endpoint and inspector URLs without assuming the default.\n */\n get basePath(): string {\n return this.#basePath();\n }\n\n /**\n * Immutable normalized branding shared by MCP identity and browser pages.\n *\n * `favicon` is the final source after explicit-favicon and icon-selection\n * precedence. Landing-page integrations can use this accessor and link to\n * the server's root-level `/favicon.ico` route without reading private\n * configuration or depending on the inspector/view layers.\n *\n * @example\n * ```ts\n * if (server.branding.favicon) {\n * console.log(\"Browser favicon: /favicon.ico\");\n * }\n * ```\n */\n get branding(): ServerBranding {\n return this.#branding;\n }\n\n /**\n * Register a tool. Input is validated against `inputSchema` before the callback\n * runs; results carrying `structuredContent` are type-checked against\n * `outputSchema` at the callback's return position.\n *\n * @returns A {@link ToolRef} carrying the tool name and phantom types for\n * inference-based view typing.\n */\n tool<const T extends ToolDefinition>(\n definition: T,\n callback: ToolCallback<\n InferToolInput<T>,\n InferToolOutput<T>,\n TUser,\n HasOAuth<TUser>\n >\n ): ToolRef<InferToolName<T>, InferToolInput<T>, InferToolOutput<T>> {\n this.#assertNotStarted(\"tool\", definition.name);\n this.#validateToolViewBinding(definition);\n this.#tools.set(definition.name, {\n definition,\n callback: callback as ToolCallback<\n Record<string, unknown>,\n never,\n TUser,\n HasOAuth<TUser>\n >,\n });\n return Object.freeze({\n name: definition.name,\n }) as ToolRef<InferToolName<T>, InferToolInput<T>, InferToolOutput<T>>;\n }\n\n /**\n * Prime the views registry from build/dev registry data.\n *\n * @param views - Registry map keyed by view directory name.\n * @param options - Priming options. When `dev` is true, resource CSP\n * emission appends the serving origin's websocket variant to\n * `connectDomains` so Vite HMR passes host-enforced CSP. Pass\n * `projectRoot` in dev so the `public/` route resolves against the user's\n * project directory rather than the CLI process cwd.\n * @throws If views are already primed, or after the server has started.\n *\n * @internal\n */\n [registerViews](\n views: ViewsManifest,\n options?: { dev?: boolean; projectRoot?: string }\n ): void {\n if (this.#viewsPrimed) {\n throw new Error(\n \"Cannot prime views: the views registry is already primed on this server instance.\"\n );\n }\n this.#assertNotStarted(\"views\", \"manifest\");\n this.#viewsDevMode = options?.dev === true;\n if (options?.projectRoot !== undefined) {\n this.#viewsProjectRoot = options.projectRoot;\n }\n for (const [name, entry] of Object.entries(views)) {\n this.#views.set(name, entry);\n }\n this.#viewsPrimed = true;\n }\n\n /**\n * Prime the views registry — string-keyed alias for {@link registerViews}\n * used by the CLI when the symbol export cannot be shared across duplicate\n * module copies (dev module runner with an externalized package).\n *\n * @param views - Manifest map keyed by view directory name.\n * @param options - Priming options forwarded to {@link registerViews}.\n * @throws If views are already primed, or after the server has started.\n *\n * @internal\n */\n __primeViews(\n views: ViewsManifest,\n options?: { dev?: boolean; projectRoot?: string }\n ): void {\n this[registerViews](views, options);\n }\n\n /** Register a static resource readable at `definition.uri`. */\n resource(\n definition: ResourceDefinition,\n callback: ResourceCallback<TUser, HasOAuth<TUser>>\n ): this {\n this.#assertNotStarted(\"resource\", definition.name);\n this.#resources.set(definition.name, { definition, callback });\n return this;\n }\n\n /**\n * Register a parameterized resource. Reads matching `uriTemplate` invoke\n * the callback with the extracted variables.\n *\n * The `const` type parameter keeps `uriTemplate` a string literal during\n * inference (plain generic inference widens object-literal properties to\n * `string`), which is what lets `InferTemplateParams` type the callback's\n * `params` from the template's variables.\n */\n resourceTemplate<const TUriTemplate extends string>(\n definition: ResourceTemplateDefinition<TUriTemplate>,\n callback: ResourceTemplateCallback<\n InferTemplateParams<{ uriTemplate: TUriTemplate }>,\n TUser,\n HasOAuth<TUser>\n >\n ): this {\n this.#assertNotStarted(\"resourceTemplate\", definition.name);\n const complete =\n definition.complete === undefined\n ? undefined\n : normalizeCompletions(definition.complete);\n this.#resourceTemplates.set(definition.name, {\n definition,\n ...(complete !== undefined && { complete }),\n callback: callback as ResourceTemplateCallback<\n Record<string, TemplateVariableValue>,\n TUser,\n HasOAuth<TUser>\n >,\n });\n return this;\n }\n\n /**\n * Register a prompt template. Schema fields wrapped with `completable()`\n * gain autocomplete via `completion/complete`.\n */\n prompt<T extends PromptDefinition>(\n definition: T,\n callback: PromptCallback<InferPromptInput<T>, TUser, HasOAuth<TUser>>\n ): this {\n this.#assertNotStarted(\"prompt\", definition.name);\n this.#prompts.set(definition.name, {\n definition,\n callback: callback as PromptCallback<\n Record<string, unknown>,\n TUser,\n HasOAuth<TUser>\n >,\n });\n return this;\n }\n\n /**\n * Compose upstream MCP servers into this server.\n *\n * A name-keyed HTTP config creates upstream connections through the optional\n * `@mcp-use/client` v2 peer. Each key automatically namespaces its mounted\n * tools, resources, and prompts. You may instead pass an existing ready\n * {@link ProxyConnection}; its negotiated server name becomes the namespace\n * and the connection remains caller-owned.\n *\n * Connection, introspection, and collision failures are diagnosed and\n * skipped without discarding capabilities that can be mounted.\n *\n * @param servers - Namespace-keyed upstream HTTP connection settings.\n * @throws If `@mcp-use/client` is not installed or the server already started\n * or closed.\n *\n * @example\n * ```ts\n * await server.proxy({\n * weather: {\n * url: \"https://weather.example.com/mcp\",\n * authToken: process.env.WEATHER_MCP_TOKEN,\n * },\n * });\n * ```\n */\n async proxy(servers: Record<string, ProxyServerConfig>): Promise<void>;\n /**\n * Mount an existing ready `@mcp-use/client` v2 connection.\n *\n * @param connection - Ready connection to introspect and forward through.\n * The connection's negotiated server name automatically namespaces every\n * mounted capability. Introspection and collision failures are diagnosed and\n * skipped without discarding capabilities that can be mounted.\n *\n * @throws If the server already started or closed.\n *\n * @example\n * ```ts\n * const connection = await client.connect(\"database\");\n * await server.proxy(connection);\n * ```\n */\n async proxy(connection: ProxyConnection): Promise<void>;\n async proxy(\n input: Record<string, ProxyServerConfig> | ProxyConnection\n ): Promise<void> {\n this.#assertOpen(\"proxy()\");\n const operation = (async (): Promise<void> => {\n const { isProxyConnection, mountProxyConnection, mountProxyServers } =\n await import(\"./mcp-proxy.js\");\n if (isProxyConnection(input)) {\n await mountProxyConnection(this.#proxyHost(), input);\n return;\n }\n await mountProxyServers(this.#proxyHost(), input);\n })();\n this.#proxyOperations.add(operation);\n try {\n await operation;\n } finally {\n this.#proxyOperations.delete(operation);\n }\n }\n\n /**\n * Web-standard request handler for the whole app (MCP endpoint included) —\n * usable directly on serverless/edge runtimes or in tests.\n *\n * The handler never binds a socket, so no Host/Origin validation applies\n * by default: DNS rebinding targets locally bound servers, and platform\n * edges (Vercel, Cloudflare, …) only route hostnames assigned to the\n * deployment. Set `allowedHosts`/`allowedOrigins` to opt into validation\n * (additive — localhost-class values stay allowed).\n *\n * Pass the same `bus` to multiple server instances when their handlers\n * replace one another while existing `subscriptions/listen` streams remain\n * open. The bus is fixed when this instance first mounts.\n *\n * @param options - Optional handler wiring.\n *\n * @example\n * ```ts\n * const handler = server.getHandler();\n * export default { fetch: handler };\n * ```\n */\n getHandler(options: { bus?: ServerEventBus } = {}): FrameworkHandler {\n this.#assertOpen(\"getHandler()\");\n const { fetch } = this.#ensureMounted(\"handler\", undefined, options.bus);\n return toFrameworkHandler(fetch);\n }\n\n /**\n * Node `(req, res) => void` handler for composing with an existing\n * `http.Server`. Uses the same internal `toNodeHandler` bridge as\n * {@link MCPServer.listen}; MCPServer users do not need to import\n * `mcp-use/node`.\n *\n * @example\n * ```ts\n * import { createServer } from \"node:http\";\n * const httpServer = createServer(await server.getNodeHandler());\n * httpServer.listen(3000);\n * ```\n */\n async getNodeHandler(): Promise<NodeRequestHandler> {\n const { fetch } = this.#ensureMounted(\"handler\");\n const { toNodeHandler } = await import(\"./node-bridge.js\");\n return toNodeHandler({ fetch });\n }\n\n /**\n * Register MCP operation middleware that intercepts JSON-RPC dispatch.\n *\n * Patterns use an `mcp:` prefix (for example `mcp:tools/call`, `mcp:*`).\n * Exact methods may transform their typed result. The global `mcp:*` pattern\n * is pass-through middleware. Middleware runs in registration order; call\n * `next()` to continue the chain.\n *\n * @example\n * ```ts\n * server.use(\"mcp:tools/call\", async (ctx, next) => {\n * console.log(`Calling tool: ${ctx.params.name}`);\n * return next();\n * });\n * ```\n */\n use<P extends McpMiddlewarePattern>(\n pattern: P,\n handler: McpMiddlewareFnFor<P>\n ): this {\n this.#assertNotStarted(\"middleware\", pattern);\n this.#mcpMiddlewares.push(createMcpMiddlewareEntry(pattern, handler));\n return this;\n }\n\n /**\n * Register a read-only MCP observer. Unlike {@link MCPServer.use}, listeners\n * cannot block, override, or mutate params. Throwing is logged and does not\n * fail the request.\n *\n * Append `:complete` to run after the handler (for example\n * `mcp:tools/call:complete`).\n *\n * @example\n * ```ts\n * server.on(\"mcp:tools/call\", (ctx) => {\n * metrics.increment(\"tools.call\", { tool: ctx.params.name });\n * });\n * ```\n */\n on<P extends McpEventPattern>(\n pattern: P,\n handler: McpEventListenerFnFor<P>\n ): this {\n this.#assertNotStarted(\"event listener\", pattern);\n this.#mcpEventListeners.push(createMcpEventListenerEntry(pattern, handler));\n return this;\n }\n\n /**\n * Publish a tools-list change to v2 clients with active subscriptions.\n *\n * @example\n * ```ts\n * await server.notifyToolsChanged();\n * ```\n */\n async notifyToolsChanged(): Promise<void> {\n await this.#ensureMounted(\"handler\").handler.notify.toolsChanged();\n }\n\n /**\n * Publish a prompts-list change to v2 clients with active subscriptions.\n *\n * @example\n * ```ts\n * await server.notifyPromptsChanged();\n * ```\n */\n async notifyPromptsChanged(): Promise<void> {\n await this.#ensureMounted(\"handler\").handler.notify.promptsChanged();\n }\n\n /**\n * Publish a resources-list change to v2 clients with active subscriptions.\n *\n * @example\n * ```ts\n * await server.notifyResourcesChanged();\n * ```\n */\n async notifyResourcesChanged(): Promise<void> {\n await this.#ensureMounted(\"handler\").handler.notify.resourcesChanged();\n }\n\n /**\n * Publish a resource update to subscribed v2 clients.\n *\n * @param uri - Resource URI whose representation changed.\n *\n * @example\n * ```ts\n * await server.notifyResourceUpdated(\"config://settings\");\n * ```\n */\n async notifyResourceUpdated(uri: string): Promise<void> {\n await this.#ensureMounted(\"handler\").handler.notify.resourceUpdated(uri);\n }\n\n /**\n * Serve over HTTP on Node. Pass port `0` for an ephemeral port.\n *\n * Binds `config.host` (default `127.0.0.1`). Localhost-class binds get\n * DNS-rebinding Host protection automatically. Origin validation is off\n * unless `allowedOrigins` is set. To serve publicly set `host: \"0.0.0.0\"`;\n * behind a platform edge that is all that's needed, and `allowedHosts`\n * restricts direct exposure (additive — localhost-class values stay allowed).\n *\n * With OAuth and no explicit resource or `MCP_URL`, a localhost listener\n * derives its protected-resource URL from the actual bound port. Mounting\n * therefore waits for the listener callback (especially for port `0`), and\n * requests accepted before then are queued. Public/wildcard listeners must\n * configure the resource before calling this method.\n *\n * @throws If called on a localhost-class bind after {@link MCPServer.getHandler}\n * already mounted the app without Host validation.\n */\n async listen(port = 3000): Promise<{ port: number; url: string }> {\n this.#assertOpen(\"listen()\");\n this.#assertListenOAuthConfiguration();\n const { createServer } = await import(\"node:http\");\n const { toNodeHandler } = await import(\"./node-bridge.js\");\n const host = this.#config.host ?? \"127.0.0.1\";\n\n return new Promise((resolve, reject) => {\n let resolveFetch: ((fetch: FetchHandler) => void) | undefined;\n let rejectFetch: ((error: unknown) => void) | undefined;\n const fetchReady = new Promise<FetchHandler>(\n (resolveFetchPromise, rejectFetchPromise) => {\n resolveFetch = resolveFetchPromise;\n rejectFetch = rejectFetchPromise;\n }\n );\n void fetchReady.catch(() => undefined);\n\n let settled = false;\n const rejectAndClose = (error: unknown) => {\n if (!settled) {\n settled = true;\n reject(error);\n }\n rejectFetch?.(error);\n void new Promise<void>((closeResolve) =>\n server.close(() => closeResolve())\n )\n .catch(() => undefined)\n .finally(() => {\n if (this.#httpServer === server) {\n this.#httpServer = undefined;\n }\n });\n };\n\n const nodeHandler = toNodeHandler({\n fetch: async (request) => (await fetchReady)(request),\n });\n const server = createServer((req, res) => {\n void nodeHandler(req, res);\n }) as NodeHttpListener;\n\n server.once(\"error\", rejectAndClose);\n server.listen(port, host, () => {\n try {\n const address = server.address();\n const boundPort =\n typeof address === \"object\" && address !== null\n ? address.port\n : port;\n const { fetch } = this.#ensureMounted(\"listen\", boundPort);\n resolveFetch?.(fetch);\n if (!settled) {\n settled = true;\n resolve({\n port: boundPort,\n url: `http://localhost:${boundPort}${this.#basePath()}`,\n });\n }\n } catch (error) {\n rejectAndClose(error);\n }\n });\n this.#httpServer = server;\n });\n }\n\n /**\n * Abort in-flight MCP exchanges and stop the HTTP listener.\n *\n * A closed server is done for good — the underlying MCP handler stays\n * closed, so `listen()`/`getHandler()` cannot revive it. Create a new\n * instance to serve again.\n */\n async close(): Promise<void> {\n this.#closed = true;\n await Promise.allSettled([...this.#proxyOperations]);\n\n const errors: unknown[] = [];\n const proxyOwners = this.#proxyOwners.splice(0);\n const ownerResults = await Promise.allSettled(\n proxyOwners.map((owner) => owner.close())\n );\n for (const result of ownerResults) {\n if (result.status === \"rejected\") errors.push(result.reason);\n }\n\n try {\n await this.#handler?.close();\n } catch (error) {\n errors.push(error);\n }\n const httpServer = this.#httpServer;\n if (httpServer !== undefined) {\n try {\n await new Promise<void>((resolve, reject) => {\n httpServer.close((err) => (err ? reject(err) : resolve()));\n });\n this.#httpServer = undefined;\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length > 0) {\n throw new AggregateError(errors, \"Failed to close MCP server cleanly\");\n }\n }\n\n #assertOpen(operation?: string): void {\n if (!this.#closed) return;\n if (operation !== undefined) {\n throw new Error(`Cannot call ${operation} after the server has closed.`);\n }\n throw new Error(\"Cannot use the server after it has closed.\");\n }\n\n #basePath(): string {\n return this.#config.basePath ?? \"/mcp\";\n }\n\n #resolveOAuthResource(\n mode: \"listen\" | \"handler\",\n listenPort?: number\n ): URL | undefined {\n if (this.#config.oauth === undefined) {\n return undefined;\n }\n if (this.#oauthResourceResolved) {\n return this.#oauthResource;\n }\n\n const host = this.#config.host ?? \"127.0.0.1\";\n const localListen =\n mode === \"listen\" &&\n listenPort !== undefined &&\n [\"127.0.0.1\", \"localhost\", \"::1\"].includes(host);\n if (this.#oauthResourceConfigurationAbsent && localListen) {\n this.#oauthResource = resolveLocalOAuthResource(\n `http://localhost:${listenPort}`,\n this.#basePath()\n );\n this.#oauthResourceResolved = true;\n return this.#oauthResource;\n }\n\n throw new Error(\n \"OAuth requires an explicit resource or MCP_URL when using getHandler() or listening on a non-local host\"\n );\n }\n\n #assertListenOAuthConfiguration(): void {\n if (this.#config.oauth === undefined) {\n return;\n }\n const host = this.#config.host ?? \"127.0.0.1\";\n if ([\"127.0.0.1\", \"localhost\", \"::1\"].includes(host)) {\n return;\n }\n if (!this.#oauthResourceResolved) {\n // Public/wildcard listeners have no stable local fallback. Their\n // configured resource was already validated during construction.\n throw new Error(\n \"OAuth listen() on a public or wildcard host requires an explicit provider resource or valid MCP_URL.\"\n );\n }\n }\n\n #assertNotStarted(kind: string, name: string): void {\n if (this.#handler !== undefined) {\n throw new Error(\n `Cannot register ${kind} \"${name}\" after the server has started: ` +\n `registrations are replayed per request from the registry, ` +\n `so register everything before listen()/getHandler().`\n );\n }\n }\n\n #proxyHost(): ProxyMountHost {\n return {\n isStarted: () => this.#handler !== undefined,\n hasTool: (name) => this.#tools.has(name),\n hasResource: (name) => this.#resources.has(name),\n hasPrompt: (name) => this.#prompts.has(name),\n registerTool: (definition, callback) => {\n this.#assertNotStarted(\"tool\", definition.name);\n this.#tools.set(definition.name, {\n definition,\n callback: callback as ToolCallback<\n Record<string, unknown>,\n never,\n TUser,\n HasOAuth<TUser>\n >,\n });\n },\n registerResource: (definition, callback) => {\n this.#assertNotStarted(\"resource\", definition.name);\n this.#resources.set(definition.name, {\n definition,\n callback: callback as ResourceCallback<TUser, HasOAuth<TUser>>,\n });\n },\n registerPrompt: (definition, callback) => {\n this.#assertNotStarted(\"prompt\", definition.name);\n this.#prompts.set(definition.name, {\n definition,\n callback: callback as PromptCallback<\n Record<string, unknown>,\n TUser,\n HasOAuth<TUser>\n >,\n });\n },\n trackOwner: (owner) => {\n this.#proxyOwners.push(owner);\n },\n };\n }\n\n /**\n * Effective Host/Origin allowlists for a mount mode; `undefined` means the\n * corresponding validation is off.\n *\n * Configured lists are additive to the localhost-class allowlists, so local\n * runs keep working when a deployment hostname is added. With nothing\n * configured, `listen()` on a localhost-class bind validates Host against the\n * localhost lists (the DNS-rebinding threat model), while `getHandler()` —\n * which never binds — applies no validation. Origin validation is off unless\n * `allowedOrigins` is set explicitly (SDK-aligned: the handler is open by\n * default). When enabled, Origin is checked only on non-GET/HEAD requests.\n */\n #validationPolicy(mode: \"listen\" | \"handler\"): {\n hosts: string[] | undefined;\n origins: string[] | undefined;\n } {\n const { host = \"127.0.0.1\", allowedHosts, allowedOrigins } = this.#config;\n const localhostBind = [\"127.0.0.1\", \"localhost\", \"::1\"].includes(host);\n const hosts =\n allowedHosts !== undefined\n ? [...new Set([...localhostAllowedHostnames(), ...allowedHosts])]\n : mode === \"listen\" && localhostBind\n ? localhostAllowedHostnames()\n : undefined;\n const origins =\n allowedOrigins !== undefined\n ? [...new Set([...localhostAllowedOrigins(), ...allowedOrigins])]\n : undefined;\n return { hosts, origins };\n }\n\n #ensureMounted(\n mode: \"listen\" | \"handler\",\n listenPort?: number,\n bus?: ServerEventBus\n ): {\n fetch: FetchHandler;\n handler: McpHttpHandler;\n } {\n this.#assertOpen();\n if (this.#fetchHandler === undefined || this.#handler === undefined) {\n const { hosts, origins } = this.#validationPolicy(mode);\n const basePath = this.#basePath();\n const nestedBasePath = basePath === \"/\" ? \"\" : basePath;\n const middlewares = [\n jsonBodyMiddleware(),\n requestLogger(this.#config.logging),\n ];\n\n const corsConfig = this.#config.cors;\n if (corsConfig !== undefined) {\n middlewares.unshift(corsFetchMiddleware(corsConfig));\n }\n const deferViewCors = isGlobalCorsEnabled(corsConfig);\n\n if (hosts !== undefined) {\n middlewares.unshift(hostValidationMiddleware(hosts));\n }\n if (origins !== undefined) {\n middlewares.push(originValidationMiddleware(origins));\n }\n if (hosts === undefined) {\n if (mode === \"listen\") {\n console.warn(\n `[mcp-use] listen() is serving on ${this.#config.host} without ` +\n `Host validation. Behind a platform edge that only routes your ` +\n `own domains this is expected; if this process is reachable ` +\n `directly, set allowedHosts to restrict it.`\n );\n }\n }\n\n this.#validateViewBindingsAtMount();\n\n const resource = this.#resolveOAuthResource(mode, listenPort);\n if (resource !== undefined) {\n const provider = this.#config.oauth!;\n middlewares.push(oauthMetadata(provider, resource));\n }\n\n const { handler, fetch: mcpFetch } = createMcpMount(\n (ctx) => this.#buildSdkServer(ctx),\n {\n path: basePath,\n ...((this.#config.legacy !== undefined || bus !== undefined) && {\n handler: {\n ...(this.#config.legacy !== undefined && {\n legacy: this.#config.legacy,\n }),\n ...(bus !== undefined && { bus }),\n },\n }),\n ...(resource !== undefined && {\n authInfo: (request) => authInfoFromRequest(request),\n }),\n }\n );\n\n let protectWithBearer: (\n request: Request,\n next: () => Promise<Response>\n ) => Promise<Response> = async (_request, next) => next();\n if (resource !== undefined) {\n const provider = this.#config.oauth!;\n const providerOptions = getOAuthProviderOptions(provider);\n const gate = requireBearerAuth({\n verifier: wrapOAuthTokenVerifier(provider, resource),\n resourceMetadataUrl: getOAuthProtectedResourceMetadataUrl(resource),\n ...(providerOptions.requiredScopes !== undefined && {\n requiredScopes: providerOptions.requiredScopes,\n }),\n });\n protectWithBearer = async (request, next) => {\n const result = await gate(request);\n if (result instanceof Response) {\n return result;\n }\n const bag = getRequestBag(request);\n bag.authInfo = result;\n return next();\n };\n }\n\n const mcpRouteHandler: FetchHandler = (request) =>\n protectWithBearer(request, () => mcpFetch(request));\n const endpointHandler: FetchHandler = async (request) => {\n if (!isHtmlNavigationRequest(request)) {\n return mcpRouteHandler(request);\n }\n const respond = async (): Promise<Response> => {\n const { createLandingPageResponse } =\n await import(\"./landing-handler.js\");\n return createLandingPageResponse(\n request,\n basePath,\n this.#config,\n this.#branding,\n this.#tools.values(),\n this.#prompts.values(),\n this.#resources.values()\n );\n };\n if (resource !== undefined && this.#config.publicLandingPage !== true) {\n return protectWithBearer(request, respond);\n }\n return respond();\n };\n\n const routes: Array<{\n match: (request: Request) => boolean;\n handler: FetchHandler;\n }> = [];\n\n const brandingDevMode = this.#viewsPrimed\n ? this.#viewsDevMode\n : process.env[\"NODE_ENV\"] !== \"production\";\n const faviconHandler = createFaviconHandler(this.#branding, {\n dev: brandingDevMode,\n projectRoot: this.#viewsProjectRoot,\n deferCors: deferViewCors,\n });\n if (faviconHandler !== undefined) {\n routes.push({\n match: (request) => new URL(request.url).pathname === \"/favicon.ico\",\n handler: faviconHandler,\n });\n }\n\n const viewHandler = createViewPublicHandler(basePath, this.#views, {\n dev: this.#viewsPrimed ? this.#viewsDevMode : brandingDevMode,\n projectRoot: this.#viewsProjectRoot,\n enabled: hasLocalBrandingAsset(this.#branding),\n deferCors: deferViewCors,\n });\n if (viewHandler !== undefined) {\n routes.push({\n match: (request) =>\n request.method === \"GET\" || request.method === \"HEAD\"\n ? new URL(request.url).pathname.startsWith(\n `${nestedBasePath}/_mcp-use/public/`\n )\n : false,\n handler: viewHandler,\n });\n }\n\n if (!this.#viewsDevMode) {\n const viewAssetsHandler = createViewAssetsHandler(\n basePath,\n this.#views,\n { projectRoot: this.#viewsProjectRoot, deferCors: deferViewCors }\n );\n if (viewAssetsHandler !== undefined) {\n routes.push({\n match: (request) =>\n request.method === \"GET\" || request.method === \"HEAD\"\n ? new URL(request.url).pathname.startsWith(\n `${nestedBasePath}/_mcp-use/views/`\n )\n : false,\n handler: viewAssetsHandler,\n });\n }\n }\n\n const inspectorHandler = createInspectorHandler(this.#config.inspector, {\n serverName: this.#config.name,\n basePath,\n ...(faviconHandler !== undefined && {\n faviconHref: \"/favicon.ico\",\n ...(this.#branding.faviconMimeType !== undefined && {\n faviconType: this.#branding.faviconMimeType,\n }),\n }),\n });\n if (inspectorHandler !== undefined) {\n routes.push({\n match: (request) => {\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n return false;\n }\n const pathname = new URL(request.url).pathname;\n return matchesInspectorShellPath(pathname, basePath);\n },\n handler: inspectorHandler,\n });\n }\n\n routes.push({\n match: (request) => matchesPath(request, basePath),\n handler: endpointHandler,\n });\n\n const terminal = routeFetch(routes);\n this.#fetchHandler = composeFetch(terminal, ...middlewares);\n this.#handler = handler;\n this.#hostValidated = hosts !== undefined;\n } else if (bus !== undefined && this.#handler.bus !== bus) {\n throw new Error(\n \"Cannot change the MCP event bus after the server has started.\"\n );\n } else if (\n mode === \"listen\" &&\n !this.#hostValidated &&\n this.#validationPolicy(\"listen\").hosts !== undefined\n ) {\n throw new Error(\n \"Cannot listen() on a localhost bind after getHandler(): the app is \" +\n \"already mounted without Host validation (getHandler() expects a \" +\n \"platform edge in front). Call listen() first, or set allowedHosts.\"\n );\n }\n return { fetch: this.#fetchHandler, handler: this.#handler };\n }\n\n #validateToolViewBinding(definition: ToolDefinition): void {\n const view = definition.view;\n if (view === undefined) {\n return;\n }\n if (definition.outputSchema === undefined) {\n throw new Error(\n `Tool \"${definition.name}\" declares view \"${view.name}\" but has no outputSchema. ` +\n `View-bound tools require an outputSchema — the view reads structuredContent typed from it. ` +\n `Use outputSchema: z.object({}) for a view that takes no structured output.`\n );\n }\n\n const existing = this.#viewBindings.get(view.name);\n if (existing !== undefined) {\n throw new Error(\n `View \"${view.name}\" is already bound to tool \"${existing.toolName}\"; ` +\n `tool \"${definition.name}\" cannot bind the same view. ` +\n `Each view may be bound to one tool.`\n );\n }\n\n this.#viewBindings.set(view.name, {\n toolName: definition.name,\n config: view,\n });\n }\n\n #validateViewBindingsAtMount(): void {\n if (this.#viewBindings.size > 0 && !this.#viewsPrimed) {\n const first = [...this.#tools.values()].find(\n (entry) => entry.definition.view !== undefined\n );\n const viewName = first?.definition.view?.name ?? \"unknown\";\n throw new Error(\n `Tool \"${first?.definition.name ?? \"unknown\"}\" is bound to view \"${viewName}\" ` +\n `but no views were primed. Run \\`mcp-use build\\` and deploy the built entry, ` +\n `or in dev let the CLI prime views automatically.`\n );\n }\n\n for (const entry of this.#tools.values()) {\n const viewName = entry.definition.view?.name;\n if (viewName !== undefined && !this.#views.has(viewName)) {\n throw new Error(\n `Tool \"${entry.definition.name}\" is bound to view \"${viewName}\" ` +\n `which is not in the primed views registry. Run \\`mcp-use build\\` ` +\n `and deploy the built entry, or in dev let the CLI prime views automatically.`\n );\n }\n }\n\n for (const viewName of this.#views.keys()) {\n if (!this.#viewBindings.has(viewName)) {\n console.warn(\n `[mcp-use] View \"${viewName}\" is registered but no tool binds it.`\n );\n }\n }\n }\n\n /** Build a fresh SDK server from the registry (runs once per request). */\n #buildSdkServer(ctx: McpRequestContext): SdkMcpServer {\n const { name, version, title, description, instructions } = this.#config;\n const authInfo = ctx.authInfo;\n const server = new SdkMcpServer(\n {\n name,\n version,\n ...(title !== undefined && { title }),\n ...(description !== undefined && { description }),\n ...(this.#branding.websiteUrl !== undefined && {\n websiteUrl: this.#branding.websiteUrl,\n }),\n ...(this.#branding.icons !== undefined && {\n icons: resolveImplementationIcons(\n this.#branding.icons,\n ctx.requestInfo,\n this.#basePath()\n ),\n }),\n },\n {\n capabilities: {\n logging: {},\n tools: { listChanged: true },\n prompts: { listChanged: true },\n resources: { listChanged: true, subscribe: true },\n },\n ...(instructions !== undefined && { instructions }),\n ...(authInfo !== undefined && { authInfo }),\n ...(this.#config.requestState !== undefined && {\n requestState: this.#config.requestState,\n }),\n }\n );\n\n const request = ctx.requestInfo;\n const viewMetaOptions =\n request !== undefined\n ? { request, hmrWs: this.#viewsDevMode }\n : { hmrWs: this.#viewsDevMode };\n const basePath = this.#basePath();\n\n for (const entry of this.#tools.values()) {\n this.#registerTool(server, entry);\n }\n for (const entry of this.#resources.values()) {\n this.#registerResource(server, entry);\n }\n for (const entry of this.#resourceTemplates.values()) {\n this.#registerResourceTemplate(server, entry);\n }\n for (const entry of this.#prompts.values()) {\n this.#registerPrompt(server, entry);\n }\n for (const [viewName, viewEntry] of this.#views.entries()) {\n this.#registerViewResource(\n server,\n viewName,\n viewEntry,\n viewMetaOptions,\n basePath\n );\n }\n this.#wrapListHandlers(server);\n return server;\n }\n\n #createMiddlewareContext<M extends McpMiddlewareMethod>(\n method: M,\n params: MiddlewareContext<M>[\"params\"],\n ctx: ServerContext\n ): MiddlewareContext<M> {\n return {\n method,\n params,\n ...(ctx.http?.req !== undefined && { request: ctx.http.req }),\n ...(ctx.sessionId !== undefined && {\n session: { sessionId: ctx.sessionId },\n }),\n ...(ctx.http?.authInfo !== undefined && { auth: ctx.http.authInfo }),\n state: new Map(),\n } as MiddlewareContext<M>;\n }\n\n #runMcpHook<M extends McpMiddlewareMethod>(\n method: M,\n ctx: MiddlewareContext<M>,\n innerFn: () => Promise<McpMiddlewareResult<M>>\n ): Promise<McpMiddlewareResult<M>> {\n return runMcpOperation(\n this.#mcpMiddlewares,\n this.#mcpEventListeners,\n method,\n ctx,\n innerFn\n );\n }\n\n /**\n * Wrap native SDK list handlers with the MCP middleware chain.\n *\n * ponytail: uses SDK-private `_requestHandlers`; pin compile-time test.\n *\n * @internal\n */\n #wrapListHandlers(server: SdkMcpServer): void {\n type RequestHandler = (\n request: unknown,\n extra: unknown\n ) => Promise<unknown>;\n const handlers = (\n server.server as unknown as {\n _requestHandlers?: Map<string, RequestHandler>;\n }\n )._requestHandlers;\n if (handlers === undefined) {\n return;\n }\n\n type ListMethod = \"tools/list\" | \"resources/list\" | \"prompts/list\";\n type ListResultKey<M extends ListMethod> = M extends \"tools/list\"\n ? \"tools\"\n : M extends \"resources/list\"\n ? \"resources\"\n : \"prompts\";\n\n const wrapListMethod = <M extends ListMethod>(\n method: M,\n resultKey: ListResultKey<NoInfer<M>>,\n transform?: (\n items: McpMiddlewareResult<NoInfer<M>>\n ) => McpMiddlewareResult<NoInfer<M>>\n ) => {\n const original = handlers.get(method);\n if (original === undefined) {\n return;\n }\n if ((original as { __mcpListWrapped?: boolean }).__mcpListWrapped) {\n return;\n }\n\n const wrapped = async (request: unknown, extra: unknown) => {\n const serverContext = extra as ServerContext;\n const params =\n (request as { params?: MiddlewareContext<M>[\"params\"] }).params ??\n ({} as MiddlewareContext<M>[\"params\"]);\n const mwCtx = this.#createMiddlewareContext(\n method,\n params,\n serverContext\n );\n let originalEnvelope: Record<string, unknown> | undefined;\n const innerFn = async (): Promise<McpMiddlewareResult<M>> => {\n const downstreamRequest = withMcpMiddlewareParams<M>(\n request,\n mwCtx.params\n );\n const result = await original(downstreamRequest, extra);\n if (typeof result !== \"object\" || result === null) {\n throw new TypeError(\n `[mcp-use] ${method} handler returned a non-object result`\n );\n }\n originalEnvelope = result as Record<string, unknown>;\n const items = originalEnvelope[resultKey];\n if (!Array.isArray(items)) {\n throw new TypeError(\n `[mcp-use] ${method} handler result is missing a ${resultKey} array`\n );\n }\n return items as McpMiddlewareResult<M>;\n };\n const filtered = await this.#runMcpHook(method, mwCtx, innerFn);\n if (!Array.isArray(filtered)) {\n throw new TypeError(\n `[mcp-use] ${method} middleware must return a ${resultKey} array`\n );\n }\n const emitted = transform?.(filtered) ?? filtered;\n return {\n ...originalEnvelope,\n [resultKey]: emitted,\n };\n };\n (wrapped as { __mcpListWrapped?: boolean }).__mcpListWrapped = true;\n handlers.set(method, wrapped);\n };\n\n wrapListMethod(\"tools/list\", \"tools\", omitToolSchemaDialects);\n wrapListMethod(\"resources/list\", \"resources\");\n wrapListMethod(\"prompts/list\", \"prompts\");\n }\n\n #registerTool(\n server: SdkMcpServer,\n { definition, callback }: ToolEntry<TUser>\n ): void {\n const view = definition.view;\n\n const toolMeta = buildToolUiMeta(\n view?.name,\n definition.visibility,\n definition._meta\n );\n const config = {\n ...(definition.title !== undefined && { title: definition.title }),\n ...(definition.description !== undefined && {\n description: definition.description,\n }),\n ...(definition.annotations !== undefined && {\n annotations: definition.annotations,\n }),\n ...(definition.outputSchema !== undefined && {\n outputSchema: definition.outputSchema,\n }),\n ...(toolMeta !== undefined && { _meta: toolMeta }),\n };\n const wireResultMeta =\n view !== undefined ? buildToolResultUiMeta(view.name) : undefined;\n\n const inputSchema = resolveToolInputSchema(definition);\n\n const invokeTool = async (\n args: Record<string, unknown>,\n ctx: ServerContext\n ) => {\n const mwCtx = this.#createMiddlewareContext(\n \"tools/call\",\n {\n name: definition.name,\n arguments: args,\n ...(ctx.mcpReq._meta !== undefined && { _meta: ctx.mcpReq._meta }),\n },\n ctx\n );\n const innerFn = async () => {\n const effectiveArgs = (mwCtx.params.arguments ?? {}) as Record<\n string,\n unknown\n >;\n const result = await callback(\n effectiveArgs,\n this.#toRequestContext(ctx)\n );\n if (\n isInputRequiredResult(result) ||\n wireResultMeta === undefined ||\n result.isError === true\n ) {\n return result;\n }\n return {\n ...result,\n _meta: { ...result._meta, ...wireResultMeta },\n };\n };\n return (await this.#runMcpHook(\"tools/call\", mwCtx, innerFn)) as Awaited<\n ReturnType<typeof callback>\n >;\n };\n\n if (inputSchema !== undefined) {\n server.registerTool(\n definition.name,\n { ...config, inputSchema },\n async (args, ctx) => invokeTool(args as Record<string, unknown>, ctx)\n );\n } else {\n server.registerTool(definition.name, config, async (ctx) =>\n invokeTool({}, ctx)\n );\n }\n }\n\n #registerViewResource(\n server: SdkMcpServer,\n viewName: string,\n entry: ViewManifestEntry,\n metaOptions: { request?: Request; hmrWs?: boolean },\n basePath: string\n ): void {\n const uri = viewResourceUri(viewName);\n const authorFacts = this.#viewResourceFacts(\n this.#viewBindings.get(viewName)?.config\n );\n const resourceConfig = viewResourceConfig(\n viewName,\n entry,\n authorFacts,\n metaOptions\n );\n server.registerResource(\n viewName,\n uri,\n resourceConfig,\n async (readUri, ctx) => {\n const req = ctx.http?.req;\n const readOptions: BuildResourceUiMetaOptions =\n req !== undefined\n ? {\n request: req,\n ...(metaOptions.hmrWs === true ? { hmrWs: true } : {}),\n }\n : metaOptions.hmrWs === true\n ? { hmrWs: true }\n : {};\n const assetsBase =\n req !== undefined\n ? resolveAssetsBase(req)\n : metaOptions.request !== undefined\n ? resolveAssetsBase(metaOptions.request)\n : \"\";\n const html = synthesizeViewDocument(\n entry,\n assetsBase,\n basePath,\n viewName\n );\n return {\n contents: [\n {\n uri: readUri.href,\n mimeType: resourceConfig.mimeType,\n text: html,\n _meta: buildResourceUiMeta(authorFacts, readOptions),\n },\n ],\n };\n }\n );\n }\n\n #registerResource(\n server: SdkMcpServer,\n { definition, callback }: ResourceEntry<TUser>\n ): void {\n server.registerResource(\n definition.name,\n definition.uri,\n {\n ...(definition.title !== undefined && { title: definition.title }),\n ...(definition.description !== undefined && {\n description: definition.description,\n }),\n ...(definition.mimeType !== undefined && {\n mimeType: definition.mimeType,\n }),\n ...(definition.annotations !== undefined && {\n annotations: definition.annotations,\n }),\n ...(definition._meta !== undefined && {\n _meta: { ...definition._meta },\n }),\n },\n async (uri, ctx) => {\n const mwCtx = this.#createMiddlewareContext(\n \"resources/read\",\n {\n uri: uri.href,\n ...(ctx.mcpReq._meta !== undefined && { _meta: ctx.mcpReq._meta }),\n },\n ctx\n );\n const innerFn = async () => callback(uri, this.#toRequestContext(ctx));\n return (await this.#runMcpHook(\n \"resources/read\",\n mwCtx,\n innerFn\n )) as Awaited<ReturnType<typeof callback>>;\n }\n );\n }\n\n #registerResourceTemplate(\n server: SdkMcpServer,\n { definition, callback, complete }: ResourceTemplateEntry<TUser>\n ): void {\n const template = new ResourceTemplate(definition.uriTemplate, {\n list: undefined,\n ...(complete !== undefined && { complete }),\n });\n server.registerResource(\n definition.name,\n template,\n {\n ...(definition.title !== undefined && { title: definition.title }),\n ...(definition.description !== undefined && {\n description: definition.description,\n }),\n ...(definition.mimeType !== undefined && {\n mimeType: definition.mimeType,\n }),\n ...(definition.annotations !== undefined && {\n annotations: definition.annotations,\n }),\n ...(definition._meta !== undefined && {\n _meta: { ...definition._meta },\n }),\n },\n async (uri, variables, ctx) => {\n const mwCtx = this.#createMiddlewareContext(\n \"resources/read\",\n {\n uri: uri.href,\n ...(ctx.mcpReq._meta !== undefined && { _meta: ctx.mcpReq._meta }),\n },\n ctx\n );\n const innerFn = async () =>\n callback(\n uri,\n variables as Record<string, TemplateVariableValue>,\n this.#toRequestContext(ctx)\n );\n return (await this.#runMcpHook(\n \"resources/read\",\n mwCtx,\n innerFn\n )) as Awaited<ReturnType<typeof callback>>;\n }\n );\n }\n\n #viewResourceFacts(\n viewConfig: ToolViewConfig | undefined\n ): ViewResourceFacts | undefined {\n if (viewConfig === undefined) {\n return undefined;\n }\n return {\n ...(viewConfig.description !== undefined && {\n description: viewConfig.description,\n }),\n ...(viewConfig.csp !== undefined && { csp: viewConfig.csp }),\n ...(viewConfig.permissions !== undefined && {\n permissions: viewConfig.permissions,\n }),\n ...(viewConfig.domain !== undefined && { domain: viewConfig.domain }),\n ...(viewConfig.prefersBorder !== undefined && {\n prefersBorder: viewConfig.prefersBorder,\n }),\n };\n }\n\n #registerPrompt(\n server: SdkMcpServer,\n { definition, callback }: PromptEntry<TUser>\n ): void {\n const config = {\n ...(definition.title !== undefined && { title: definition.title }),\n ...(definition.description !== undefined && {\n description: definition.description,\n }),\n };\n const invokePrompt = async (\n args: Record<string, unknown>,\n ctx: ServerContext\n ) => {\n const mwCtx = this.#createMiddlewareContext(\n \"prompts/get\",\n {\n name: definition.name,\n arguments: args as Record<string, string>,\n ...(ctx.mcpReq._meta !== undefined && { _meta: ctx.mcpReq._meta }),\n },\n ctx\n );\n const innerFn = async () => {\n const effectiveArgs = (mwCtx.params.arguments ?? {}) as Record<\n string,\n unknown\n >;\n return callback(effectiveArgs, this.#toRequestContext(ctx));\n };\n return (await this.#runMcpHook(\"prompts/get\", mwCtx, innerFn)) as Awaited<\n ReturnType<typeof callback>\n >;\n };\n\n if (definition.schema !== undefined) {\n server.registerPrompt(\n definition.name,\n { ...config, argsSchema: definition.schema },\n async (args, ctx) => invokePrompt(args as Record<string, unknown>, ctx)\n );\n } else {\n const handler = async (ctx: ServerContext) => invokePrompt({}, ctx);\n server.registerPrompt(\n definition.name,\n config,\n handler as unknown as SdkPromptCallback<StandardSchemaWithJSON>\n );\n }\n }\n\n #toRequestContext(\n ctx: ServerContext\n ): RequestContext<TUser, HasOAuth<TUser>> {\n if (this.#config.oauth === undefined) {\n return toRequestContext(ctx) as RequestContext<TUser, HasOAuth<TUser>>;\n }\n return toAuthenticatedRequestContext<TUser>(ctx) as RequestContext<\n TUser,\n HasOAuth<TUser>\n >;\n }\n}\n","import type { Icon } from \"@modelcontextprotocol/server\";\n\nimport type { FetchHandler } from \"./fetch-app.js\";\nimport { resolveAssetsBase } from \"./views/origin.js\";\nimport {\n resolvePublicFilePath,\n servePublicFile,\n} from \"./views/public-route.js\";\n\nconst FAVICON_CACHE_CONTROL = \"public, max-age=31536000, immutable\";\nconst FAVICON_REDIRECT_CACHE_CONTROL = \"public, max-age=300\";\n\n/** Normalized server branding shared by browser and MCP identity surfaces. */\nexport interface ServerBranding {\n /**\n * Source selected for `/favicon.ico`, after applying explicit-favicon and\n * first-icon inference.\n */\n readonly favicon?: string;\n /** MIME type of the selected favicon when known. */\n readonly faviconMimeType?: string;\n /** Icons reported in MCP implementation metadata, in author order. */\n readonly icons?: readonly Icon[];\n /** Server website reported in MCP implementation metadata. */\n readonly websiteUrl?: string;\n}\n\nfunction protocolOf(value: string): string | undefined {\n const match = /^([a-z][a-z\\d+.-]*):/i.exec(value);\n return match?.[1]?.toLowerCase();\n}\n\nfunction publicAssetPath(basePath: string, source: string): string {\n const prefix = basePath === \"/\" ? \"\" : basePath;\n return `${prefix}/_mcp-use/public/${source\n .split(\"/\")\n .map((segment) => encodeURIComponent(segment))\n .join(\"/\")}`;\n}\n\nfunction isLocalPublicSource(source: string): boolean {\n return protocolOf(source) === undefined;\n}\n\n/**\n * Select the browser favicon from an ordered set of MCP icons.\n *\n * Uses the first icon in author order. Put the preferred browser favicon\n * first, or set {@link ServerConfig.favicon} explicitly.\n *\n * @param icons - Validated, non-empty icon list.\n * @returns The selected icon.\n *\n * @internal\n */\nexport function selectFaviconFromIcons(\n icons: readonly Icon[]\n): Icon | undefined {\n return icons[0];\n}\n\nfunction assertLocalPublicSource(source: string, field: string): void {\n if (\n source.startsWith(\"/\") ||\n source.includes(\"\\\\\") ||\n source.includes(\"?\") ||\n source.includes(\"#\") ||\n source.split(\"/\").some((segment) => segment === \"\" || segment === \"..\")\n ) {\n throw new TypeError(\n `${field} must be an http(s) URL, image data URL, or safe path relative to public/`\n );\n }\n}\n\ninterface ParsedDataImage {\n readonly bytes: Uint8Array<ArrayBuffer>;\n readonly mimeType: string;\n}\n\nfunction parseDataImage(source: string, field: string): ParsedDataImage {\n const comma = source.indexOf(\",\");\n if (comma < 0) {\n throw new TypeError(`${field} must be a valid image data URL`);\n }\n const metadata = source.slice(5, comma);\n const payload = source.slice(comma + 1);\n const parts = metadata.split(\";\");\n const mimeType = parts[0]?.toLowerCase() ?? \"\";\n if (!mimeType.startsWith(\"image/\")) {\n throw new TypeError(`${field} data URL must use an image MIME type`);\n }\n try {\n if (parts.includes(\"base64\")) {\n const binary = atob(payload);\n return {\n mimeType,\n bytes: Uint8Array.from(binary, (character) => character.charCodeAt(0)),\n };\n }\n return {\n mimeType,\n bytes: new TextEncoder().encode(decodeURIComponent(payload)),\n };\n } catch {\n throw new TypeError(`${field} must be a valid image data URL`);\n }\n}\n\nfunction assertBrandingSource(source: unknown, field: string): string {\n if (typeof source !== \"string\" || source.length === 0) {\n throw new TypeError(`${field} must be a non-empty string`);\n }\n const protocol = protocolOf(source);\n if (protocol === undefined) {\n assertLocalPublicSource(source, field);\n return source;\n }\n if (protocol === \"data\") {\n parseDataImage(source, field);\n return source;\n }\n if (protocol !== \"http\" && protocol !== \"https\") {\n throw new TypeError(\n `${field} must be an http(s) URL, image data URL, or safe path relative to public/`\n );\n }\n try {\n new URL(source);\n } catch {\n throw new TypeError(`${field} must be a valid absolute http(s) URL`);\n }\n return source;\n}\n\n/**\n * Validate and freeze the branding fields from server configuration.\n *\n * @param config - Untyped-compatible branding input.\n * @returns Immutable normalized branding and the selected favicon MIME type.\n *\n * @internal\n */\nexport function normalizeServerBranding(config: {\n favicon?: unknown;\n icons?: unknown;\n websiteUrl?: unknown;\n}): ServerBranding {\n let websiteUrl: string | undefined;\n if (config.websiteUrl !== undefined) {\n if (\n typeof config.websiteUrl !== \"string\" ||\n config.websiteUrl.length === 0\n ) {\n throw new TypeError(\n \"websiteUrl must be a non-empty absolute http(s) URL\"\n );\n }\n let parsed: URL;\n try {\n parsed = new URL(config.websiteUrl);\n } catch {\n throw new TypeError(\n \"websiteUrl must be a non-empty absolute http(s) URL\"\n );\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new TypeError(\n \"websiteUrl must be a non-empty absolute http(s) URL\"\n );\n }\n websiteUrl = config.websiteUrl;\n }\n\n let icons: readonly Icon[] | undefined;\n if (config.icons !== undefined) {\n if (!Array.isArray(config.icons)) {\n throw new TypeError(\"icons must be an array of MCP Icon objects\");\n }\n icons = Object.freeze(\n config.icons.map((value, index): Icon => {\n if (typeof value !== \"object\" || value === null) {\n throw new TypeError(`icons[${index}] must be an MCP Icon object`);\n }\n const icon = value as Record<string, unknown>;\n const src = assertBrandingSource(icon[\"src\"], `icons[${index}].src`);\n const mimeType = icon[\"mimeType\"];\n if (\n mimeType !== undefined &&\n (typeof mimeType !== \"string\" ||\n !mimeType.toLowerCase().startsWith(\"image/\"))\n ) {\n throw new TypeError(\n `icons[${index}].mimeType must be an image MIME type when provided`\n );\n }\n const sizes = icon[\"sizes\"];\n if (\n sizes !== undefined &&\n (!Array.isArray(sizes) ||\n sizes.some((size) => typeof size !== \"string\" || size.length === 0))\n ) {\n throw new TypeError(\n `icons[${index}].sizes must be an array of non-empty strings when provided`\n );\n }\n const normalizedSizes =\n sizes === undefined\n ? undefined\n : (sizes as unknown[]).map((size) => size as string);\n const theme = icon[\"theme\"];\n if (theme !== undefined && theme !== \"light\" && theme !== \"dark\") {\n throw new TypeError(\n `icons[${index}].theme must be \"light\" or \"dark\" when provided`\n );\n }\n return Object.freeze({\n src,\n ...(mimeType !== undefined && { mimeType }),\n ...(normalizedSizes !== undefined && {\n sizes: Object.freeze(normalizedSizes) as string[],\n }),\n ...(theme !== undefined && { theme }),\n });\n })\n );\n }\n\n const explicitFavicon =\n config.favicon === undefined\n ? undefined\n : assertBrandingSource(config.favicon, \"favicon\");\n const inferred =\n explicitFavicon === undefined\n ? selectFaviconFromIcons(icons ?? [])\n : undefined;\n const favicon = explicitFavicon ?? inferred?.src;\n const faviconMimeType =\n inferred?.mimeType ??\n icons?.find((icon) => icon.src === explicitFavicon)?.mimeType;\n\n return Object.freeze({\n ...(favicon !== undefined && { favicon }),\n ...(faviconMimeType !== undefined && { faviconMimeType }),\n ...(icons !== undefined && { icons }),\n ...(websiteUrl !== undefined && { websiteUrl }),\n });\n}\n\n/**\n * Resolve configured icons for MCP implementation metadata.\n *\n * Absolute HTTP(S) and data URLs pass through. Public-relative sources become\n * request-scoped absolute URLs under `${basePath}/_mcp-use/public/`.\n *\n * @param icons - Normalized configured icons.\n * @param request - HTTP request used to derive the public asset origin.\n * @param basePath - MCP endpoint base path.\n * @returns Icons suitable for the official SDK `Implementation` object.\n *\n * @internal\n */\nexport function resolveImplementationIcons(\n icons: readonly Icon[] | undefined,\n request: Request | undefined,\n basePath: string\n): Icon[] | undefined {\n if (icons === undefined) {\n return undefined;\n }\n return icons.map((icon) => ({\n ...icon,\n src:\n request !== undefined && isLocalPublicSource(icon.src)\n ? `${resolveAssetsBase(request)}${publicAssetPath(basePath, icon.src)}`\n : icon.src,\n ...(icon.sizes !== undefined && { sizes: [...icon.sizes] }),\n }));\n}\n\n/**\n * Whether any configured branding source needs the local public route.\n *\n * @param branding - Normalized branding to inspect.\n * @returns `true` when the favicon or an MCP icon uses a `public/` path.\n *\n * @internal\n */\nexport function hasLocalBrandingAsset(branding: ServerBranding): boolean {\n return (\n (branding.favicon !== undefined && isLocalPublicSource(branding.favicon)) ||\n branding.icons?.some((icon) => isLocalPublicSource(icon.src)) === true\n );\n}\n\n/**\n * Create the root-level `/favicon.ico` handler for normalized branding.\n *\n * Local public files and data URLs are streamed directly. Absolute HTTP(S)\n * sources receive a temporary redirect, avoiding server-side remote fetches.\n *\n * @param branding - Normalized server branding.\n * @param options - Public directory resolution mode.\n * @returns A GET/HEAD handler, or `undefined` when no favicon is configured.\n *\n * @internal\n */\nexport function createFaviconHandler(\n branding: ServerBranding,\n options: { dev: boolean; projectRoot: string; deferCors?: boolean }\n): FetchHandler | undefined {\n const source = branding.favicon;\n if (source === undefined) {\n return undefined;\n }\n\n return async (request) => {\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n return new Response(\"Method Not Allowed\", {\n status: 405,\n headers: { Allow: \"GET, HEAD\" },\n });\n }\n if (new URL(request.url).pathname !== \"/favicon.ico\") {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n const protocol = protocolOf(source);\n if (protocol === \"http\" || protocol === \"https\") {\n return new Response(null, {\n status: 307,\n headers: {\n Location: source,\n \"Cache-Control\": FAVICON_REDIRECT_CACHE_CONTROL,\n },\n });\n }\n if (protocol === \"data\") {\n const data = parseDataImage(source, \"favicon\");\n return new Response(\n request.method === \"HEAD\" ? null : data.bytes.buffer,\n {\n status: 200,\n headers: {\n \"Content-Type\": branding.faviconMimeType ?? data.mimeType,\n \"Cache-Control\": FAVICON_CACHE_CONTROL,\n \"X-Content-Type-Options\": \"nosniff\",\n },\n }\n );\n }\n\n const { join } = await import(\"node:path\");\n const publicRoot = options.dev\n ? join(options.projectRoot, \"public\")\n : join(options.projectRoot, \".mcp-use/build/views/public\");\n const diskPath = await resolvePublicFilePath(publicRoot, source);\n if (diskPath === null) {\n return new Response(\"Not Found\", {\n status: 404,\n headers: { \"Cache-Control\": \"no-store\" },\n });\n }\n const response = await servePublicFile(diskPath, {\n ...(options.deferCors === true && { deferCors: true }),\n ...(request.method === \"HEAD\" && { head: true }),\n });\n response.headers.set(\"Cache-Control\", FAVICON_CACHE_CONTROL);\n response.headers.set(\"X-Content-Type-Options\", \"nosniff\");\n if (branding.faviconMimeType !== undefined) {\n response.headers.set(\"Content-Type\", branding.faviconMimeType);\n }\n return response;\n };\n}\n","import type { Icon, ServerOptions } from \"@modelcontextprotocol/server\";\n\nimport type { LoggingOptions } from \"./logging.js\";\nimport type { OAuthProvider } from \"./oauth/index.js\";\n\n/**\n * Options for the inspector shell route — the shape of\n * {@link ServerConfig.inspector}.\n */\nexport interface InspectorOptions {\n /**\n * Whether the inspector shell route is mounted.\n *\n * @defaultValue `true`\n */\n enabled?: boolean;\n /**\n * Full replacement URL for the inspector bundle script (FastAPI's\n * `swagger_js_url` analog). The shell's `<script type=\"module\">` loads\n * exactly this URL, so it must point at a complete copy of the\n * `@mcp-use/inspector` CDN bundle (`dist/cdn/inspector.js`) — self-host it\n * for air-gapped environments where the public CDN is unreachable.\n *\n * @defaultValue The mcp-use CDN URL for the `@mcp-use/inspector` bundle,\n * pinned to the current version.\n */\n assetsUrl?: string;\n /**\n * Hosted managed-chat backend URL (injected as `window.__MANUFACT_CHAT_URL__`).\n * Defaults to `process.env.MANUFACT_CHAT_URL` when the shell is mounted.\n */\n manufactChatUrl?: string;\n}\n\n/**\n * Common server identity and behavior, passed to `new MCPServer(...)`.\n *\n * Includes the fields consumed by the core HTTP and OAuth resource-server\n * wiring. Other legacy configuration is added with the feature that reads it.\n */\ninterface BaseServerConfig {\n /** Server name reported to clients during negotiation. */\n name: string;\n /** Server version reported to clients. */\n version: string;\n /** Human-readable display name (falls back to `name`). */\n title?: string;\n /**\n * Human-readable description of the server, reported to clients as\n * implementation metadata during negotiation.\n */\n description?: string;\n /**\n * Browser favicon source.\n *\n * Accepts a safe path relative to the project `public/` directory, an\n * absolute HTTP(S) URL, or an image data URL. The selected image is served\n * at the root-level `/favicon.ico` route. When omitted, the first entry in\n * `icons` selects the favicon. An explicit value always wins; an empty\n * string is invalid.\n *\n * @defaultValue Inferred from `icons`, or no favicon when `icons` is absent\n * or empty.\n * @throws TypeError When the value is empty, uses an unsupported URL scheme,\n * or is an unsafe local path.\n *\n * @example\n * ```ts\n * new MCPServer({\n * name: \"my-server\",\n * version: \"1.0.0\",\n * favicon: \"brand/favicon.svg\",\n * });\n * ```\n */\n favicon?: string;\n /**\n * Server icons reported to clients in MCP implementation metadata.\n *\n * Uses the official SDK {@link Icon} shape. Each `src` accepts a safe path\n * relative to `public/`, an absolute HTTP(S) URL, or an image data URL.\n * Local paths become request-scoped absolute URLs under\n * `${basePath}/_mcp-use/public/`; author order is preserved on the wire.\n * When `favicon` is omitted, the first icon in this array also selects\n * `/favicon.ico`. An empty array is valid and selects no favicon.\n *\n * @defaultValue `undefined`\n * @throws TypeError When an icon has an invalid source, MIME type, sizes,\n * or theme.\n *\n * @example\n * ```ts\n * new MCPServer({\n * name: \"my-server\",\n * version: \"1.0.0\",\n * icons: [\n * { src: \"brand/icon.svg\", mimeType: \"image/svg+xml\" },\n * { src: \"brand/icon-32.png\", mimeType: \"image/png\", sizes: [\"32x32\"] },\n * ],\n * });\n * ```\n */\n icons?: Icon[];\n /**\n * Absolute HTTP(S) URL for the server's website or documentation, reported\n * to clients in MCP implementation metadata.\n *\n * @defaultValue `undefined`\n * @throws TypeError When the value is empty, relative, or not HTTP(S).\n *\n * @example\n * ```ts\n * new MCPServer({\n * name: \"my-server\",\n * version: \"1.0.0\",\n * websiteUrl: \"https://example.com/my-server\",\n * });\n * ```\n */\n websiteUrl?: string;\n /** Usage instructions surfaced to the model by clients. */\n instructions?: string;\n /**\n * Route path the MCP endpoint is served on.\n *\n * Must be an absolute URL pathname: starts with `/`, and contains no `?`,\n * `#`, whitespace, empty path segments (`//`), or trailing slash (except\n * for the root path `/`).\n *\n * @defaultValue `\"/mcp\"`\n * @throws TypeError When the value fails the pathname rules above\n * (validated by {@link assertServerConfig}).\n */\n basePath?: string;\n /**\n * Hostname `listen()` binds. Defaults to `127.0.0.1`; localhost-class\n * binds get DNS-rebinding protection (`Host` on every request; `Origin`\n * only on non-GET/HEAD) automatically. Set `\"0.0.0.0\"` to serve publicly — behind a platform\n * edge (Railway, Fly, …) nothing more is needed, since the edge only\n * routes hostnames assigned to the deployment. Ignored by `getHandler()`,\n * which never binds.\n */\n host?: string;\n /**\n * Extra allowed hostnames for Host-header validation (DNS-rebinding\n * protection), e.g. `[\"api.example.com\"]`. Port-agnostic and additive:\n * localhost-class hostnames stay allowed, so local runs keep working\n * unmodified. Setting this also turns Host validation on for\n * `getHandler()`, which otherwise applies none.\n */\n allowedHosts?: string[];\n /**\n * Extra allowed origin hostnames for Origin-header validation\n * (port-agnostic, additive to the localhost-class origins). When unset,\n * Origin validation is off (SDK-aligned). When set, Origin is validated\n * only on non-GET/HEAD requests (sandboxed view iframes send `Origin: null`\n * on asset GETs; the MCP wire is POST). Requests without an `Origin` header\n * always pass (non-browser MCP clients don't send one).\n */\n allowedOrigins?: string[];\n /**\n * How 2025-era (non-envelope) requests are served.\n *\n * `\"stateless\"` answers each legacy request with a fresh instance over a\n * session-less streamable HTTP transport (2025 session operations — GET and\n * DELETE — get `405`). `\"reject\"` is modern-only strict: legacy-classified\n * requests are refused with the unsupported-protocol-version error naming\n * the supported revisions.\n *\n * @defaultValue `\"stateless\"`\n */\n legacy?: \"stateless\" | \"reject\";\n /**\n * Expose the HTML landing page without bearer authentication when OAuth is\n * configured.\n *\n * The landing page itself is always mounted at `basePath` for browser GET\n * and HEAD requests that explicitly accept `text/html`. Without OAuth it is\n * public. With OAuth, it requires a valid bearer token unless this option is\n * `true`. MCP protocol requests remain protected in either case.\n *\n * @defaultValue `false`\n */\n publicLandingPage?: boolean;\n /**\n * Inspector shell route at `${basePath}/inspector` — a browser UI for\n * exploring and calling the server's tools, resources, and prompts.\n *\n * @remarks\n * Follows the FastAPI `/docs` model: the server itself ships only a tiny\n * dependency-free HTML page whose `<script type=\"module\">` loads the\n * `@mcp-use/inspector` bundle from a CDN (pinned to the current inspector\n * version), so the UI updates independently of SDK releases and adds\n * nothing to the install. The page tells the inspector to connect to this\n * server's MCP endpoint at `basePath`, deriving the URL from the browser's\n * own origin.\n *\n * Enabled by default; set `{ enabled: false }` to disable the route, or\n * pass `{ assetsUrl }` to load the bundle from a self-hosted copy instead\n * of the public CDN (air-gapped environments). For local development,\n * `MCP_USE_INSPECTOR_ASSETS_URL` provides the same override without changing\n * application code; an explicit `assetsUrl` takes precedence.\n *\n * @example\n * ```ts\n * // Default: inspector served at /mcp/inspector from the public CDN.\n * new MCPServer({ name: \"my-server\", version: \"1.0.0\" });\n *\n * // Disabled:\n * new MCPServer({\n * name: \"my-server\",\n * version: \"1.0.0\",\n * inspector: { enabled: false },\n * });\n *\n * // Air-gapped: load a self-hosted copy of the inspector bundle.\n * new MCPServer({\n * name: \"my-server\",\n * version: \"1.0.0\",\n * inspector: { assetsUrl: \"https://intranet.example.com/inspector.js\" },\n * });\n * ```\n */\n inspector?: InspectorOptions;\n /**\n * HTTP/MCP request logging: one summary line per request plus an indented\n * detail line naming the MCP method, its subject (tool name, resource URI,\n * prompt name), and the calling client.\n *\n * Enabled at the `info` level by default, which prints no request or\n * response payloads. Set `{ enabled: false }` to disable,\n * `{ level: \"debug\" }` to echo compact truncated tool/prompt input and\n * tool output on the detail line, or `{ level: \"trace\" }` for debug plus\n * full request/response header and body dumps. The `MCP_USE_LOG_LEVEL`\n * environment variable (`info` | `debug` | `trace`) overrides the\n * configured level.\n */\n logging?: LoggingOptions;\n /**\n * Integrity verification for `requestState` echoed across\n * `input_required` rounds.\n *\n * Use the SDK's `createRequestStateCodec(...).verify` here when state\n * affects authorization, resource access, or business logic. Without a\n * verifier, {@link RequestContext.requestState} returns the raw,\n * attacker-controlled wire string.\n *\n * @defaultValue `undefined`\n */\n requestState?: ServerOptions[\"requestState\"];\n /**\n * Optional CORS headers on every route served by `getHandler()` / `listen()`\n * (MCP endpoint, view assets, inspector, OAuth metadata). Off when omitted.\n *\n * Pair with {@link BaseServerConfig.allowedOrigins | allowedOrigins} for\n * browser clients: CORS tells the browser it may read the response; Origin\n * validation decides whether the server accepts the request.\n *\n * @example\n * ```ts\n * new MCPServer({\n * name: \"api\",\n * version: \"1.0.0\",\n * allowedOrigins: [\"app.example.com\"],\n * cors: {\n * origin: \"https://app.example.com\",\n * credentials: true,\n * },\n * });\n * ```\n */\n cors?: CorsOptions;\n}\n\n/**\n * CORS configuration for routes owned by mcp-use (`getHandler()` / `listen()`).\n *\n * Omit `cors` entirely for the current no-CORS behavior. Pass `cors: {}` to\n * enable with defaults (reflects the request `Origin` when present; wildcard\n * `origin: \"*\"` requires an explicit opt-in).\n */\nexport interface CorsOptions {\n /** @defaultValue `true` when `cors` is set; ignored when `cors` is omitted */\n enabled?: boolean;\n /** Allowed Origin(s). Reflect matching `Origin` header, or `\"*\"` when set. */\n origin?: string | string[] | ((origin: string | null) => string | null);\n /** @defaultValue `[\"GET\", \"HEAD\", \"POST\", \"OPTIONS\"]` */\n methods?: string[];\n /** @defaultValue common MCP + JSON headers */\n allowedHeaders?: string[];\n /** @defaultValue `false` */\n credentials?: boolean;\n}\n\n/**\n * Runtime checks for optional {@link ServerConfig} fields that TypeScript\n * alone cannot enforce when values arrive from untyped call sites.\n *\n * @throws TypeError When `basePath` is present but not an absolute URL\n * pathname without empty segments, trailing slash, query, fragment, or\n * whitespace.\n */\nexport function assertServerConfig(config: { basePath?: unknown }): void {\n if (config.basePath !== undefined) {\n if (typeof config.basePath !== \"string\") {\n throw new TypeError(\n \"basePath must be an absolute URL pathname without empty segments, trailing slash, query, fragment, or whitespace\"\n );\n }\n const { basePath } = config;\n if (\n !basePath.startsWith(\"/\") ||\n basePath.includes(\"?\") ||\n basePath.includes(\"#\") ||\n /\\s/.test(basePath) ||\n basePath.includes(\"//\") ||\n (basePath.length > 1 && basePath.endsWith(\"/\"))\n ) {\n throw new TypeError(\n \"basePath must be an absolute URL pathname without empty segments, trailing slash, query, fragment, or whitespace\"\n );\n }\n }\n}\n\n/**\n * Server identity and behavior, passed to `new MCPServer(...)`.\n *\n * A user type other than `never` requires an OAuth provider, preventing a\n * callback from declaring authenticated context without authentication at\n * runtime. Omitting the type keeps the no-OAuth API ergonomic.\n */\nexport type ServerConfig<TUser = never> = BaseServerConfig &\n ([TUser] extends [never]\n ? {\n /** OAuth is unavailable when no authenticated user type is declared. */\n oauth?: undefined;\n }\n : {\n /**\n * External OAuth resource-server provider. Callback contexts receive\n * this provider's user type as required `ctx.auth.user`.\n */\n oauth: OAuthProvider<TUser>;\n });\n","import {\n CLIENT_CAPABILITIES_META_KEY,\n inputRequired,\n inputResponse,\n type AuthInfo,\n type InputRequest,\n type InputRequiredResult,\n type RequestStateAccessor,\n type ServerContext,\n type StandardSchemaWithJSON,\n} from \"@modelcontextprotocol/server\";\n\nimport type { OAuthExtra } from \"./oauth/provider.js\";\nimport { supportsViews } from \"./views/capabilities.js\";\n\n/**\n * Per-request client capability queries.\n *\n * Reads the modern per-request envelope only — never session state.\n */\nexport interface RequestClientContext {\n /**\n * Whether this request's client advertises MCP Apps / UI support.\n *\n * True when the client declares the `io.modelcontextprotocol/ui` extension\n * with `text/html;profile=mcp-app` in `mimeTypes`. Legacy (non-envelope)\n * requests always return `false`.\n */\n supportsViews(): boolean;\n}\n\n/**\n * Result of a {@link Elicit} call.\n *\n * `required` means the callback must return `result`; the client then gathers\n * input and retries the tool. Accepted form results carry schema-validated,\n * inferred `data`. URL acceptances and declined/cancelled results carry no\n * data.\n */\nexport type ElicitationResult<T = never> =\n | { status: \"required\"; result: InputRequiredResult }\n | { status: \"decline\" | \"cancel\" }\n | ([T] extends [never]\n ? { status: \"accept\" }\n : { status: \"accept\"; data: T });\n\n/**\n * Requests or reads one keyed elicitation in a multi-round-trip tool callback.\n *\n * The explicit key correlates the request with the client's response on\n * re-entry. On the first entry, or after an invalid form response, this returns\n * `{ status: \"required\", result }`; return that result from the tool. On\n * re-entry it returns `accept`, `decline`, or `cancel` and validates accepted\n * Standard Schema form data before exposing it. Validation may be synchronous\n * or asynchronous.\n *\n * @example\n * ```ts\n * const confirmation = await ctx.elicit(\n * \"confirm\",\n * \"Deploy to production?\",\n * schema,\n * );\n * if (confirmation.status === \"required\") {\n * return confirmation.result;\n * }\n * ```\n */\nexport interface Elicit {\n /** Request or read a typed form-mode elicitation. */\n <S extends StandardSchemaWithJSON>(\n key: string,\n message: string,\n schema: S\n ): Promise<ElicitationResult<StandardSchemaWithJSON.InferOutput<S>>>;\n /** Request or read a URL-mode elicitation. */\n (key: string, message: string, url: string): Promise<ElicitationResult>;\n}\n\n/**\n * Per-request context passed to tool/resource/prompt callbacks.\n */\nexport type OAuthAuth<TUser> = {\n user: TUser;\n payload: Record<string, unknown>;\n accessToken: string;\n scopes: string[];\n permissions: string[];\n /**\n * The OAuth client identifier from the token's `client_id` or `azp` claim;\n * undefined when the identity provider's access tokens carry no client claim\n * (e.g. WorkOS AuthKit, Supabase).\n */\n clientId?: string;\n expiresAt: number;\n resource?: URL;\n};\n\ntype RequestContextBase = {\n /** Aborted when the client cancels the request or the connection drops. */\n signal: AbortSignal;\n /** The originating HTTP request, when served over HTTP. */\n request?: Request;\n /** Per-request client capability queries. */\n client: RequestClientContext;\n /** Request or read a keyed form- or URL-mode elicitation. */\n elicit: Elicit;\n /**\n * Bare responses supplied when the client retries an `input_required`\n * round. Values are client input; validate them before use.\n */\n inputResponses?: ServerContext[\"mcpReq\"][\"inputResponses\"];\n /**\n * Read opaque state echoed by the client for this `input_required` round.\n * The generic is only a type assertion. Configure `requestState.verify`\n * when state affects authorization or business logic.\n */\n requestState: RequestStateAccessor;\n /**\n * Report request-scoped progress when the caller supplied a progress token.\n *\n * @returns `true` when a notification was sent, `false` when the caller did\n * not request progress.\n */\n reportProgress(\n progress: number,\n total?: number,\n message?: string\n ): Promise<boolean>;\n /** Send a log message notification to the client during tool execution. */\n sendLog(\n level:\n | \"debug\"\n | \"info\"\n | \"notice\"\n | \"warning\"\n | \"error\"\n | \"critical\"\n | \"alert\"\n | \"emergency\",\n data: unknown,\n logger?: string\n ): Promise<void>;\n};\n\n/**\n * Per-request callback context, authenticated when OAuth is configured.\n */\nexport type RequestContext<\n TUser = never,\n HasOAuth extends boolean = false,\n> = HasOAuth extends true\n ? RequestContextBase & { auth: OAuthAuth<TUser> }\n : RequestContextBase & { auth?: never };\n\ntype MappedOAuthAuthInfo<TUser> = AuthInfo & {\n expiresAt: number;\n extra: OAuthExtra<TUser>;\n};\n\nfunction requireOAuthAuthInfo<TUser>(\n authInfo: AuthInfo | undefined\n): asserts authInfo is MappedOAuthAuthInfo<TUser> {\n if (\n authInfo === undefined ||\n authInfo.extra === undefined ||\n authInfo.expiresAt === undefined\n ) {\n throw new Error(\"OAuth callback did not receive mapped AuthInfo.extra\");\n }\n}\n\nfunction toClientContext(ctx: ServerContext): RequestClientContext {\n const envelopeCaps = ctx.mcpReq.envelope?.[CLIENT_CAPABILITIES_META_KEY];\n return {\n supportsViews(): boolean {\n return supportsViews(envelopeCaps);\n },\n };\n}\n\nfunction createElicit(\n inputResponses: ServerContext[\"mcpReq\"][\"inputResponses\"]\n): Elicit {\n return async function elicit(\n key: string,\n message: string,\n schemaOrUrl?: StandardSchemaWithJSON | string\n ): Promise<ElicitationResult<unknown> | ElicitationResult> {\n let request: InputRequest;\n let formSchema: StandardSchemaWithJSON | undefined;\n\n if (typeof schemaOrUrl === \"string\") {\n request = inputRequired.elicitUrl({\n message,\n url: schemaOrUrl,\n });\n } else if (schemaOrUrl !== undefined) {\n formSchema = schemaOrUrl;\n request = inputRequired.elicit({\n message,\n requestedSchema: schemaOrUrl,\n });\n } else {\n throw new TypeError(\n \"ctx.elicit(key, message, value) requires a form schema or URL string\"\n );\n }\n\n const response = inputResponse(inputResponses, key);\n if (response.kind === \"elicit\") {\n if (response.action !== \"accept\") {\n return { status: response.action };\n }\n if (formSchema === undefined) {\n return { status: \"accept\" };\n }\n if (response.content !== undefined) {\n const outcome = await formSchema[\"~standard\"].validate(\n response.content\n );\n if (outcome.issues === undefined) {\n return { status: \"accept\", data: outcome.value };\n }\n }\n }\n\n return {\n status: \"required\",\n result: inputRequired({ inputRequests: { [key]: request } }),\n };\n } as Elicit;\n}\n\n/**\n * Derive the callback-facing {@link RequestContext} from the SDK's\n * per-request `ServerContext`.\n *\n * @internal\n */\nexport function toRequestContext(\n ctx: ServerContext\n): RequestContext<never, false> {\n const request = ctx.http?.req;\n return {\n signal: ctx.mcpReq.signal,\n ...(request !== undefined && { request }),\n ...(ctx.mcpReq.inputResponses !== undefined && {\n inputResponses: ctx.mcpReq.inputResponses,\n }),\n client: toClientContext(ctx),\n elicit: createElicit(ctx.mcpReq.inputResponses),\n requestState: <T = unknown>() => ctx.mcpReq.requestState<T>(),\n async reportProgress(progress, total, message): Promise<boolean> {\n const progressToken = ctx.mcpReq._meta?.progressToken;\n if (progressToken === undefined) return false;\n await ctx.mcpReq.notify({\n method: \"notifications/progress\",\n params: {\n progressToken,\n progress,\n ...(total !== undefined && { total }),\n ...(message !== undefined && { message }),\n },\n });\n return true;\n },\n async sendLog(level, data, logger): Promise<void> {\n await ctx.mcpReq.notify({\n method: \"notifications/message\",\n params: {\n level,\n data,\n ...(logger !== undefined && { logger }),\n },\n });\n },\n };\n}\n\n/** @internal Projects mapped OAuth auth information into callback context. */\nexport function toAuthenticatedRequestContext<TUser>(\n ctx: ServerContext\n): RequestContext<TUser, true> {\n const authInfo = ctx.http?.authInfo;\n requireOAuthAuthInfo<TUser>(authInfo);\n return {\n ...toRequestContext(ctx),\n auth: {\n user: authInfo.extra.user,\n payload: authInfo.extra.payload,\n accessToken: authInfo.token,\n scopes: [...authInfo.scopes],\n permissions: [...authInfo.extra.permissions],\n ...(authInfo.clientId.length > 0 && { clientId: authInfo.clientId }),\n expiresAt: authInfo.expiresAt,\n ...(authInfo.resource !== undefined && { resource: authInfo.resource }),\n },\n };\n}\n","import {\n CLIENT_CAPABILITIES_META_KEY,\n type ClientCapabilities,\n} from \"@modelcontextprotocol/server\";\n\nimport { UI_EXTENSION_ID, UI_MIME_TYPE } from \"./constants.js\";\n\n/** Per-request client capabilities stashed before the SDK handler runs. */\nconst clientCapabilitiesByRequest = new WeakMap<Request, ClientCapabilities>();\n\n/**\n * Stash parsed client capabilities on the request for the per-request server\n * factory.\n *\n * @internal\n */\nexport function stashClientCapabilities(\n request: Request,\n capabilities: ClientCapabilities\n): void {\n clientCapabilitiesByRequest.set(request, capabilities);\n}\n\n/**\n * Read stashed client capabilities for an HTTP request.\n *\n * @internal\n */\nexport function getStashedClientCapabilities(\n request: Request | undefined\n): ClientCapabilities | undefined {\n if (request === undefined) {\n return undefined;\n }\n return clientCapabilitiesByRequest.get(request);\n}\n\n/**\n * Extract `clientCapabilities` from a parsed JSON-RPC body, when present.\n *\n * @internal\n */\nexport function extractClientCapabilitiesFromBody(\n body: unknown\n): ClientCapabilities | undefined {\n if (typeof body !== \"object\" || body === null) {\n return undefined;\n }\n const params = (body as Record<string, unknown>)[\"params\"];\n if (typeof params !== \"object\" || params === null) {\n return undefined;\n }\n const meta = (params as Record<string, unknown>)[\"_meta\"];\n if (typeof meta !== \"object\" || meta === null) {\n return undefined;\n }\n const capabilities = (meta as Record<string, unknown>)[\n CLIENT_CAPABILITIES_META_KEY\n ];\n if (typeof capabilities !== \"object\" || capabilities === null) {\n return undefined;\n }\n return capabilities as ClientCapabilities;\n}\n\n/**\n * Whether the client advertises MCP Apps / UI support for this request.\n *\n * True when `capabilities.extensions[\"io.modelcontextprotocol/ui\"]` exists\n * and its `mimeTypes` array includes `text/html;profile=mcp-app`.\n *\n * @remarks\n * Used only for {@link RequestContext.client} queries (e.g.\n * `ctx.client.supportsViews()`). Capability negotiation does not affect the\n * wire surface — `tools/list` always includes every registered tool regardless\n * of this result.\n */\nexport function supportsViews(\n capabilities: ClientCapabilities | undefined\n): boolean {\n const extensions = capabilities?.extensions;\n if (extensions === undefined) {\n return false;\n }\n const uiExtension = extensions[UI_EXTENSION_ID];\n if (typeof uiExtension !== \"object\" || uiExtension === null) {\n return false;\n }\n const mimeTypes = (uiExtension as Record<string, unknown>)[\"mimeTypes\"];\n if (!Array.isArray(mimeTypes)) {\n return false;\n }\n return mimeTypes.includes(UI_MIME_TYPE);\n}\n","/** MCP Apps extension identifier (`io.modelcontextprotocol/ui`). */\nexport const UI_EXTENSION_ID = \"io.modelcontextprotocol/ui\" as const;\n\n/** MIME type for MCP App view resources. */\nexport const UI_MIME_TYPE = \"text/html;profile=mcp-app\" as const;\n\n/** URI scheme prefix for view resources (`ui://views/<name>.html`). */\nexport const UI_RESOURCE_URI_PREFIX = \"ui://views/\" as const;\n\n/** Nested `_meta` key for UI metadata on tools and resources. */\nexport const UI_META_KEY = \"ui\" as const;\n\n/** Legacy flat `_meta` key for the view resource URI (kept while hosts read it). */\nexport const UI_RESOURCE_URI_META_KEY = \"ui/resourceUri\" as const;\n\n/**\n * Build the stable `ui://` resource URI for a view name.\n *\n * @param viewName - View directory / registry key.\n */\nexport function viewResourceUri(viewName: string): string {\n return `${UI_RESOURCE_URI_PREFIX}${viewName}.html`;\n}\n","import type { CorsOptions } from \"../config.js\";\nimport type { FetchMiddleware } from \"../fetch-app.js\";\n\nconst DEFAULT_METHODS = [\"GET\", \"HEAD\", \"POST\", \"OPTIONS\"];\nconst DEFAULT_ALLOWED_HEADERS = [\n \"Content-Type\",\n \"Authorization\",\n \"mcp-protocol-version\",\n \"mcp-method\",\n \"mcp-name\",\n];\n\nfunction resolveAllowedOrigin(\n origin: CorsOptions[\"origin\"],\n requestOrigin: string | null\n): string | null {\n if (origin === undefined) {\n return requestOrigin;\n }\n if (typeof origin === \"function\") {\n return origin(requestOrigin);\n }\n if (origin === \"*\") {\n return \"*\";\n }\n if (Array.isArray(origin)) {\n if (requestOrigin !== null && origin.includes(requestOrigin)) {\n return requestOrigin;\n }\n return null;\n }\n return origin;\n}\n\nfunction corsHeaders(\n options: Required<\n Pick<CorsOptions, \"methods\" | \"allowedHeaders\" | \"credentials\">\n > &\n Pick<CorsOptions, \"origin\">,\n request: Request\n): HeadersInit | undefined {\n if (request.headers.has(\"Access-Control-Allow-Origin\")) {\n return undefined;\n }\n\n const requestOrigin = request.headers.get(\"Origin\");\n const allowedOrigin = resolveAllowedOrigin(options.origin, requestOrigin);\n if (allowedOrigin === null) {\n return undefined;\n }\n\n const headers: Record<string, string> = {\n \"Access-Control-Allow-Origin\": allowedOrigin,\n \"Access-Control-Allow-Methods\": options.methods.join(\", \"),\n \"Access-Control-Allow-Headers\": options.allowedHeaders.join(\", \"),\n };\n if (options.credentials) {\n headers[\"Access-Control-Allow-Credentials\"] = \"true\";\n }\n if (allowedOrigin !== \"*\") {\n headers.Vary = \"Origin\";\n }\n return headers;\n}\n\nfunction mergeCorsHeaders(response: Response, headers: HeadersInit): Response {\n if (response.headers.has(\"Access-Control-Allow-Origin\")) {\n return response;\n }\n const merged = new Headers(response.headers);\n const corsHeaders = new Headers(headers);\n corsHeaders.forEach((value, key) => {\n merged.set(key, value);\n });\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers: merged,\n });\n}\n\n/**\n * Fetch middleware that adds CORS headers to every response.\n *\n * @internal Wired from {@link MCPServer} when `ServerConfig.cors` is set.\n */\nexport function corsFetchMiddleware(options: CorsOptions): FetchMiddleware {\n const enabled = options.enabled !== false;\n if (!enabled) {\n return async (_request, next) => next();\n }\n\n const resolved = {\n ...(options.origin !== undefined && { origin: options.origin }),\n methods: options.methods ?? DEFAULT_METHODS,\n allowedHeaders: options.allowedHeaders ?? DEFAULT_ALLOWED_HEADERS,\n credentials: options.credentials ?? false,\n };\n\n return async (request, next) => {\n const headers = corsHeaders(resolved, request);\n if (headers === undefined) {\n return next();\n }\n\n if (request.method === \"OPTIONS\") {\n return new Response(null, { status: 204, headers });\n }\n\n const response = await next();\n return mergeCorsHeaders(response, headers);\n };\n}\n\n/** Whether global CORS middleware owns response headers for view assets. */\nexport function isGlobalCorsEnabled(cors: CorsOptions | undefined): boolean {\n return cors !== undefined && cors.enabled !== false;\n}\n","import {\n CallToolResultSchema,\n GetPromptResultSchema,\n ListPromptsResultSchema,\n ListResourcesResultSchema,\n ListToolsResultSchema,\n ReadResourceResultSchema,\n} from \"@modelcontextprotocol/core\";\nimport { isInputRequiredResult } from \"@modelcontextprotocol/server\";\nimport type {\n AuthInfo,\n HandlerResultTypeMap,\n RequestTypeMap,\n ResultTypeMap,\n} from \"@modelcontextprotocol/server\";\n\nconst MCP_MIDDLEWARE_METHODS = [\n \"tools/call\",\n \"tools/list\",\n \"resources/read\",\n \"resources/list\",\n \"prompts/get\",\n \"prompts/list\",\n] as const;\n\n/** MCP methods currently intercepted by {@link MCPServer.use}. */\nexport type McpMiddlewareMethod = (typeof MCP_MIDDLEWARE_METHODS)[number];\n\n/** Params exposed by the SDK for a particular MCP request method. */\nexport type McpMiddlewareParams<M extends McpMiddlewareMethod> =\n RequestTypeMap[M] extends { params?: infer P }\n ? NonNullable<P>\n : Record<string, never>;\n\n/**\n * Method-specific params and middleware result types.\n *\n * List middleware intentionally operates on item arrays rather than protocol\n * result envelopes. The server wrapper preserves the envelope around the\n * transformed array.\n */\nexport interface McpMiddlewareOperationMap {\n \"tools/call\": {\n params: McpMiddlewareParams<\"tools/call\">;\n result: HandlerResultTypeMap[\"tools/call\"];\n };\n \"tools/list\": {\n params: McpMiddlewareParams<\"tools/list\">;\n result: ResultTypeMap[\"tools/list\"][\"tools\"];\n };\n \"resources/read\": {\n params: McpMiddlewareParams<\"resources/read\">;\n result: HandlerResultTypeMap[\"resources/read\"];\n };\n \"resources/list\": {\n params: McpMiddlewareParams<\"resources/list\">;\n result: ResultTypeMap[\"resources/list\"][\"resources\"];\n };\n \"prompts/get\": {\n params: McpMiddlewareParams<\"prompts/get\">;\n result: HandlerResultTypeMap[\"prompts/get\"];\n };\n \"prompts/list\": {\n params: McpMiddlewareParams<\"prompts/list\">;\n result: ResultTypeMap[\"prompts/list\"][\"prompts\"];\n };\n}\n\n/** Result exposed to middleware for a particular MCP method. */\nexport type McpMiddlewareResult<M extends McpMiddlewareMethod> =\n McpMiddlewareOperationMap[M][\"result\"];\n\n/**\n * Rebuild an SDK request with the params currently held by middleware.\n *\n * Middleware may replace `ctx.params`, so forwarding the request object that\n * was captured before the chain ran would silently discard that replacement.\n * @internal\n */\nexport function withMcpMiddlewareParams<M extends McpMiddlewareMethod>(\n request: unknown,\n params: McpMiddlewareOperationMap[M][\"params\"]\n): RequestTypeMap[M] {\n if (\n typeof request !== \"object\" ||\n request === null ||\n Array.isArray(request)\n ) {\n throw new TypeError(\n \"[mcp-use] MCP middleware received an invalid downstream request\"\n );\n }\n\n return { ...request, params } as RequestTypeMap[M];\n}\n\ninterface MiddlewareContextCommon {\n /** The originating HTTP request, when this operation is served over HTTP. */\n request?: Request;\n /** Session info when the underlying transport provides a session ID. */\n session?: { sessionId: string };\n /** OAuth info extracted from the validated access token. */\n auth?: AuthInfo;\n /** Shared state for middleware participating in this request. */\n state: Map<string, unknown>;\n}\n\n/**\n * Context passed to MCP middleware.\n *\n * The conditional form preserves the correlation between `method` and\n * `params` when more than one method is represented.\n */\nexport type MiddlewareContext<\n M extends McpMiddlewareMethod = McpMiddlewareMethod,\n> = M extends McpMiddlewareMethod\n ? MiddlewareContextCommon & {\n method: M;\n params: McpMiddlewareOperationMap[M][\"params\"];\n }\n : never;\n\n/** Preferred explicit name for the method-correlated middleware context. */\nexport type McpMiddlewareContext<\n M extends McpMiddlewareMethod = McpMiddlewareMethod,\n> = MiddlewareContext<M>;\n\n/** Context with narrowed params for `tools/call`. */\nexport type ToolsCallMiddlewareContext = MiddlewareContext<\"tools/call\">;\n/** Context with narrowed params for `tools/list`. */\nexport type ToolsListMiddlewareContext = MiddlewareContext<\"tools/list\">;\n/** Context with narrowed params for `resources/read`. */\nexport type ResourcesReadMiddlewareContext =\n MiddlewareContext<\"resources/read\">;\n/** Context with narrowed params for `resources/list`. */\nexport type ResourcesListMiddlewareContext =\n MiddlewareContext<\"resources/list\">;\n/** Context with narrowed params for `prompts/get`. */\nexport type PromptsGetMiddlewareContext = MiddlewareContext<\"prompts/get\">;\n/** Context with narrowed params for `prompts/list`. */\nexport type PromptsListMiddlewareContext = MiddlewareContext<\"prompts/list\">;\n\n/** Map retained for compatibility and convenient indexed lookup. */\nexport type McpMiddlewarePatternMap = {\n [M in McpMiddlewareMethod]: MiddlewareContext<M>;\n};\n\n/** Continue the middleware chain with the result type for method `M`. */\nexport type McpMiddlewareNext<M extends McpMiddlewareMethod> = () => Promise<\n McpMiddlewareResult<M>\n>;\n\n/** Middleware for one exact MCP method. */\nexport type McpExactMiddlewareFn<M extends McpMiddlewareMethod> = (\n ctx: MiddlewareContext<M>,\n next: McpMiddlewareNext<M>\n) => Promise<McpMiddlewareResult<M>>;\n\n/**\n * Type-preserving middleware over every wrapped MCP method.\n *\n * The global wildcard cannot inspect or replace a method-specific result. Its `next`\n * resolves after downstream middleware, and the composer propagates that\n * downstream result unchanged. It must call `next()` or throw.\n */\nexport type McpMiddlewareFn<\n Methods extends McpMiddlewareMethod = McpMiddlewareMethod,\n> = (\n ctx: MiddlewareContext<Methods>,\n next: () => Promise<void>\n) => Promise<void>;\n\n/** Exact MCP middleware methods plus the global pass-through wildcard. */\nexport type McpMiddlewarePatternBody = McpMiddlewareMethod | \"*\";\n\n/** Canonical `mcp:` patterns plus prefixless compatibility forms. */\nexport type McpMiddlewarePattern =\n | McpMiddlewarePatternBody\n | `mcp:${McpMiddlewarePatternBody}`;\n\n/** Observer patterns additionally support grouping related MCP methods. */\nexport type McpEventPatternBody =\n | McpMiddlewarePatternBody\n | \"tools/*\"\n | \"resources/*\"\n | \"prompts/*\";\n\ntype McpEventBasePattern = McpEventPatternBody | `mcp:${McpEventPatternBody}`;\n\ntype StripMcpPrefix<P extends string> = P extends `mcp:${infer Body}`\n ? Body\n : P;\n\n/** Methods selected by an MCP middleware or observer pattern. */\nexport type McpMiddlewareMethodsForPattern<P extends string> =\n StripMcpPrefix<P> extends infer Body\n ? Body extends McpMiddlewareMethod\n ? Body\n : Body extends \"tools/*\"\n ? Extract<McpMiddlewareMethod, `tools/${string}`>\n : Body extends \"resources/*\"\n ? Extract<McpMiddlewareMethod, `resources/${string}`>\n : Body extends \"prompts/*\"\n ? Extract<McpMiddlewareMethod, `prompts/${string}`>\n : Body extends \"*\"\n ? McpMiddlewareMethod\n : never\n : never;\n\n/** Infer an exact or type-preserving wildcard handler from pattern `P`. */\nexport type McpMiddlewareFnFor<P extends McpMiddlewarePattern> =\n StripMcpPrefix<P> extends infer Body\n ? Body extends McpMiddlewareMethod\n ? McpExactMiddlewareFn<Body>\n : McpMiddlewareFn<McpMiddlewareMethodsForPattern<P>>\n : never;\n\n/**\n * Type-erased middleware adapter stored after registration.\n *\n * Exact handlers and the global wildcard are adapted to this common callable\n * shape before insertion, following the SDK's request-handler storage model.\n * @internal\n */\nexport interface McpMiddlewareEntry {\n pattern: string;\n handler: (\n ctx: MiddlewareContext,\n next: () => Promise<unknown>\n ) => Promise<unknown>;\n}\n\n/**\n * Adapt a public method-correlated handler for type-erased internal storage.\n *\n * The overload retains the public pattern/handler correlation. The broad\n * implementation signature is the deliberate erasure boundary, like the\n * official SDK's `setRequestHandler` implementation.\n */\nexport function createMcpMiddlewareEntry<P extends McpMiddlewarePattern>(\n pattern: P,\n handler: McpMiddlewareFnFor<P>\n): McpMiddlewareEntry;\n// eslint-disable-next-line no-redeclare -- implementation signature\nexport function createMcpMiddlewareEntry(\n pattern: McpMiddlewarePattern,\n handler: McpMiddlewareFnFor<McpMiddlewarePattern>\n): McpMiddlewareEntry {\n const normalizedPattern = normalizeMcpMiddlewarePattern(pattern);\n const invoke = handler as McpMiddlewareEntry[\"handler\"];\n\n if (normalizedPattern !== \"*\" && !isMcpMiddlewareMethod(normalizedPattern)) {\n throw new TypeError(\n `Unsupported MCP middleware pattern \"${pattern}\". Use an exact MCP method or \"mcp:*\".`\n );\n }\n\n if (normalizedPattern === \"*\") {\n return {\n pattern: normalizedPattern,\n handler: async (ctx, next) => {\n let downstreamCalled = false;\n let downstreamResult: unknown;\n\n await invoke(ctx, async () => {\n downstreamResult = await next();\n downstreamCalled = true;\n });\n\n if (!downstreamCalled) {\n throw new Error(\n `Wildcard MCP middleware \"${normalizedPattern}\" must call next()`\n );\n }\n\n return downstreamResult;\n },\n };\n }\n\n return {\n pattern: normalizedPattern,\n handler: (ctx, next) => invoke(ctx, next),\n };\n}\n\n/** Phase for MCP observer event listeners registered via `server.on()`. */\nexport type McpEventPhase = \"before\" | \"complete\";\n\n/** Read-only observer context correlated by MCP method. */\nexport type ReadonlyMiddlewareContext<\n M extends McpMiddlewareMethod = McpMiddlewareMethod,\n> = M extends McpMiddlewareMethod\n ? Omit<MiddlewareContext<M>, \"params\" | \"request\" | \"state\"> & {\n readonly params: Readonly<McpMiddlewareOperationMap[M][\"params\"]>;\n /** The originating HTTP request, when this operation is served over HTTP. */\n readonly request?: Request;\n readonly state: ReadonlyMap<string, unknown>;\n }\n : never;\n\n/** Read-only observer invoked before an MCP handler runs. */\nexport type McpEventListenerFn<\n Methods extends McpMiddlewareMethod = McpMiddlewareMethod,\n> = <M extends Methods>(ctx: ReadonlyMiddlewareContext<M>) => void;\n\n/** Read-only observer invoked after an MCP handler completes. */\nexport type McpCompleteEventListenerFn<\n Methods extends McpMiddlewareMethod = McpMiddlewareMethod,\n> = <M extends Methods>(\n ctx: ReadonlyMiddlewareContext<M>,\n result: McpMiddlewareResult<M>\n) => void;\n\ntype McpExactEventListenerFn<M extends McpMiddlewareMethod> = (\n ctx: ReadonlyMiddlewareContext<M>\n) => void;\n\ntype McpExactCompleteEventListenerFn<M extends McpMiddlewareMethod> = (\n ctx: ReadonlyMiddlewareContext<M>,\n result: McpMiddlewareResult<M>\n) => void;\n\n/** MCP observer pattern, optionally targeting the completion phase. */\nexport type McpEventPattern =\n | McpEventBasePattern\n | `${McpEventBasePattern}:complete`;\n\ntype StripCompleteSuffix<P extends string> = P extends `${infer Body}:complete`\n ? Body\n : P;\n\n/** Infer a typed before/complete observer from event pattern `P`. */\nexport type McpEventListenerFnFor<P extends McpEventPattern> =\n StripCompleteSuffix<StripMcpPrefix<P>> extends infer Body\n ? Body extends McpMiddlewareMethod\n ? P extends `${string}:complete`\n ? McpExactCompleteEventListenerFn<Body>\n : McpExactEventListenerFn<Body>\n : P extends `${string}:complete`\n ? McpCompleteEventListenerFn<\n McpMiddlewareMethodsForPattern<StripCompleteSuffix<P>>\n >\n : McpEventListenerFn<\n McpMiddlewareMethodsForPattern<StripCompleteSuffix<P>>\n >\n : never;\n\n/** Internal type-erased observer entry. @internal */\nexport interface McpEventListenerEntry {\n pattern: string;\n phase: McpEventPhase;\n handler: (ctx: ReadonlyMiddlewareContext, result?: unknown) => void;\n}\n\n/** Adapt a public method-correlated observer for type-erased storage. */\nexport function createMcpEventListenerEntry<P extends McpEventPattern>(\n pattern: P,\n handler: McpEventListenerFnFor<P>\n): McpEventListenerEntry;\n// eslint-disable-next-line no-redeclare -- implementation signature\nexport function createMcpEventListenerEntry(\n pattern: McpEventPattern,\n handler: McpEventListenerFnFor<McpEventPattern>\n): McpEventListenerEntry {\n const { pattern: normalizedPattern, phase } = parseMcpPattern(pattern);\n const invoke = handler as McpEventListenerEntry[\"handler\"];\n\n return {\n pattern: normalizedPattern,\n phase,\n handler: (ctx, result) => invoke(ctx, result),\n };\n}\n\n/** Test whether a registered middleware or observer pattern matches a method. */\nexport function matchesPattern(pattern: string, method: string): boolean {\n if (pattern === \"*\") return true;\n if (pattern.endsWith(\"/*\")) {\n const prefix = pattern.slice(0, -1);\n return method.startsWith(prefix);\n }\n return pattern === method;\n}\n\nfunction isMcpMiddlewareMethod(value: string): value is McpMiddlewareMethod {\n return MCP_MIDDLEWARE_METHODS.some((method) => method === value);\n}\n\n/** Compose matching middleware in FIFO registration order. */\nexport function composeMiddleware<M extends McpMiddlewareMethod>(\n entries: McpMiddlewareEntry[],\n method: M,\n innerFn: () => Promise<McpMiddlewareResult<M>>\n): (ctx: MiddlewareContext<M>) => Promise<McpMiddlewareResult<M>> {\n const matching = entries.filter((entry) =>\n matchesPattern(entry.pattern, method)\n );\n\n if (matching.length === 0) {\n return (_ctx: MiddlewareContext<M>) => innerFn();\n }\n\n return (ctx: MiddlewareContext<M>) => {\n let index = -1;\n\n const dispatch = (i: number): Promise<McpMiddlewareResult<M>> => {\n if (i <= index) {\n return Promise.reject(new Error(\"next() called multiple times\"));\n }\n index = i;\n\n if (i === matching.length) {\n return innerFn();\n }\n\n const entry = matching[i]!;\n return entry.handler(ctx, () => dispatch(i + 1)) as Promise<\n McpMiddlewareResult<M>\n >;\n };\n\n return dispatch(0);\n };\n}\n\n/** Build a read-only snapshot of middleware context for observer events. */\nexport function freezeMiddlewareContext<M extends McpMiddlewareMethod>(\n ctx: MiddlewareContext<M>\n): ReadonlyMiddlewareContext<M> {\n return Object.freeze({\n method: ctx.method,\n params: Object.freeze({ ...ctx.params }),\n ...(ctx.request !== undefined && { request: ctx.request }),\n ...(ctx.session !== undefined && {\n session: Object.freeze({ ...ctx.session }),\n }),\n ...(ctx.auth !== undefined && { auth: ctx.auth }),\n state: new Map(ctx.state),\n }) as unknown as ReadonlyMiddlewareContext<M>;\n}\n\n/** Run before/complete observers around a method-correlated middleware chain. */\nexport async function runMcpOperation<M extends McpMiddlewareMethod>(\n middlewares: McpMiddlewareEntry[],\n events: McpEventListenerEntry[],\n method: M,\n ctx: MiddlewareContext<M>,\n innerFn: () => Promise<McpMiddlewareResult<M>>\n): Promise<McpMiddlewareResult<M>> {\n dispatchMcpEvents(events, method, \"before\", ctx);\n\n const chained = composeMiddleware(middlewares, method, innerFn);\n const result = await chained(ctx);\n assertValidMiddlewareResult(method, result);\n\n dispatchMcpEvents(events, method, \"complete\", ctx, result);\n return result;\n}\n\nfunction assertValidMiddlewareResult<M extends McpMiddlewareMethod>(\n method: M,\n result: McpMiddlewareResult<M>\n): void {\n if (\n (method === \"tools/call\" ||\n method === \"resources/read\" ||\n method === \"prompts/get\") &&\n isInputRequiredResult(result)\n ) {\n return;\n }\n\n const validation = (() => {\n switch (method) {\n case \"tools/call\":\n assertArrayProperty(method, result, \"content\");\n return CallToolResultSchema.safeParse(result);\n case \"tools/list\":\n assertArrayResult(method, result);\n return ListToolsResultSchema.safeParse({ tools: result });\n case \"resources/read\":\n assertArrayProperty(method, result, \"contents\");\n return ReadResourceResultSchema.safeParse(result);\n case \"resources/list\":\n assertArrayResult(method, result);\n return ListResourcesResultSchema.safeParse({ resources: result });\n case \"prompts/get\":\n assertArrayProperty(method, result, \"messages\");\n return GetPromptResultSchema.safeParse(result);\n case \"prompts/list\":\n assertArrayResult(method, result);\n return ListPromptsResultSchema.safeParse({ prompts: result });\n default:\n throw new TypeError(`Unsupported MCP middleware method \"${method}\"`);\n }\n })();\n\n if (!validation.success) {\n throw new TypeError(\n `[mcp-use] ${method} middleware returned an invalid result: ${validation.error.message}`\n );\n }\n}\n\nfunction assertArrayResult(\n method: string,\n result: unknown\n): asserts result is unknown[] {\n if (!Array.isArray(result)) {\n throw new TypeError(\n `[mcp-use] ${method} middleware returned an invalid result: expected an array`\n );\n }\n}\n\nfunction assertArrayProperty(\n method: string,\n result: unknown,\n property: string\n): void {\n if (\n typeof result !== \"object\" ||\n result === null ||\n !Array.isArray((result as Record<string, unknown>)[property])\n ) {\n throw new TypeError(\n `[mcp-use] ${method} middleware returned an invalid result: expected a ${property} array`\n );\n }\n}\n\nfunction dispatchMcpEvents<M extends McpMiddlewareMethod>(\n events: McpEventListenerEntry[],\n method: M,\n phase: McpEventPhase,\n ctx: MiddlewareContext<M>,\n result?: McpMiddlewareResult<M>\n): void {\n const frozen = freezeMiddlewareContext(ctx);\n for (const entry of events) {\n if (entry.phase !== phase || !matchesPattern(entry.pattern, method)) {\n continue;\n }\n try {\n entry.handler(frozen, result);\n } catch (error) {\n console.error(\n `[mcp-use] MCP event listener for \"${entry.pattern}\" (${phase}) threw:`,\n error\n );\n }\n }\n}\n\n/** Strip `mcp:` prefix and optional `:complete` suffix from event patterns. */\nexport function parseMcpPattern(raw: string): {\n pattern: string;\n phase: McpEventPhase;\n} {\n const pattern = raw.startsWith(\"mcp:\") ? raw.slice(4) : raw;\n if (pattern.endsWith(\":complete\")) {\n return {\n pattern: pattern.slice(0, -\":complete\".length),\n phase: \"complete\",\n };\n }\n return { pattern, phase: \"before\" };\n}\n\n/** Normalize middleware pattern strings by stripping the `mcp:` prefix. */\nexport function normalizeMcpMiddlewarePattern(raw: string): string {\n return raw.startsWith(\"mcp:\") ? raw.slice(4) : raw;\n}\n","/**\n * Inspector CDN shell — the FastAPI `/docs` analog.\n *\n * The server ships no inspector code: it serves a tiny self-contained HTML\n * page whose `<script type=\"module\">` loads the `@mcp-use/inspector` CDN\n * bundle entry (`dist/cdn/inspector.js`) plus lazy chunks, pinned to a major\n * version so the UI updates independently of SDK releases. Runtime configuration crosses to\n * the bundle through a serialized `window` global; the connect URL is derived\n * in the browser from the page's own origin, so the server never guesses its\n * public hostname.\n */\nimport type { InspectorOptions } from \"./config.js\";\nimport { pathUnderBase, type FetchHandler } from \"./fetch-app.js\";\n\n/**\n * npm dist-tag of the `@mcp-use/inspector` CDN bundle the default URL follows.\n *\n * Every new Inspector beta published with this tag becomes the default\n * inspector for mcp-use servers without requiring an mcp-use release.\n */\nexport const INSPECTOR_TAG = \"beta\";\n\n/**\n * Default URL the inspector shell loads the UI bundle from: the\n * `@mcp-use/inspector` CDN build (`dist/cdn/inspector.js`) built from this\n * branch and served by jsDelivr from npm's {@link INSPECTOR_TAG} tag.\n * Override per server with {@link InspectorOptions.assetsUrl}.\n */\nexport const DEFAULT_INSPECTOR_ASSETS_URL = `https://cdn.jsdelivr.net/npm/@mcp-use/inspector@${INSPECTOR_TAG}/dist/cdn/inspector.js`;\n\n/**\n * Derive the stylesheet URL that accompanies an inspector bundle URL.\n *\n * The CDN build ships as dist/cdn/inspector.js + dist/cdn/inspector.css\n * plus sibling lazy chunks referenced by the entry script. The stylesheet URL\n * is the script URL with its `.js` suffix swapped for `.css`. Query\n * strings and fragments are preserved.\n */\nexport function inspectorStylesUrl(assetsUrl: string): string {\n return assetsUrl.replace(/\\.js(?=$|[?#])/, \".css\");\n}\n\n/** True for the default jsDelivr `@mcp-use/inspector@*` CDN bundle URL. */\nexport function isDefaultJsdelivrInspectorUrl(url: string): boolean {\n return url.startsWith(\"https://cdn.jsdelivr.net/npm/@mcp-use/inspector@\");\n}\n\n/** Append a per-request cache-bust query param for the default jsDelivr CDN URL. */\nexport function withInspectorCacheBust(assetsUrl: string): string {\n if (!isDefaultJsdelivrInspectorUrl(assetsUrl)) return assetsUrl;\n const sep = assetsUrl.includes(\"?\") ? \"&\" : \"?\";\n return `${assetsUrl}${sep}cb=${crypto.randomUUID()}`;\n}\n\n/** True for inspector UI shell routes (SPA), excluding `/inspector/api/*`. */\nexport function matchesInspectorShellPath(\n pathname: string,\n basePath: string\n): boolean {\n const prefix = pathUnderBase(basePath, \"inspector\");\n if (pathname !== prefix && !pathname.startsWith(`${prefix}/`)) {\n return false;\n }\n const suffix = pathname.slice(prefix.length);\n return suffix !== \"/api\" && !suffix.startsWith(\"/api/\");\n}\n\n/** Inputs for {@link renderInspectorShell}. */\nexport interface InspectorShellOptions {\n /** Server display name, used in the page title. */\n serverName: string;\n /** Route path the MCP endpoint is mounted on (e.g. `/mcp`). */\n basePath: string;\n /** Browser favicon URL, normally the server's root-level `/favicon.ico`. */\n faviconHref?: string | undefined;\n /** MIME type for the favicon link tag when known. */\n faviconType?: string | undefined;\n /**\n * Full replacement URL for the inspector bundle script. Defaults to\n * {@link DEFAULT_INSPECTOR_ASSETS_URL}.\n */\n assetsUrl?: string | undefined;\n /** Hosted managed-chat URL (`window.__MANUFACT_CHAT_URL__`). */\n manufactChatUrl?: string | undefined;\n}\n\n/** Escape a string for interpolation into HTML text or attribute values. */\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\n}\n\n/**\n * Serialize a value for interpolation inside an inline `<script>` body.\n *\n * `<` is escaped to its unicode JSON escape (backslash-u003c) so serialized\n * config can never form a `</script>` (or `<!--`) sequence and break out of\n * the script element.\n */\nfunction serializeForInlineScript(value: string): string {\n return JSON.stringify(value).replaceAll(\"<\", \"\\\\u003c\");\n}\n\n/**\n * Render the inspector shell page.\n *\n * A minimal shell document whose background matches the inspector UI\n * with a `#root` mount node pre-filled by a centered boot spinner so the\n * page is not blank while the CDN bundle downloads, an inline script\n * publishing `window.__MCP_USE_INSPECTOR__ = { autoConnectUrl, basePath }`\n * — where `autoConnectUrl` is computed client-side as\n * `window.location.origin + basePath` — a stylesheet link for the bundle's\n * companion CSS (see {@link inspectorStylesUrl}), and a module script\n * loading the inspector bundle. All server-provided values are HTML-escaped\n * or JSON-serialized with `<` escaped, so config can't inject markup.\n */\nexport function renderInspectorShell(options: InspectorShellOptions): string {\n const {\n serverName,\n basePath,\n faviconHref,\n faviconType,\n assetsUrl,\n manufactChatUrl,\n } = options;\n const serializedBasePath = serializeForInlineScript(basePath);\n const serializedManufactChatUrl = manufactChatUrl\n ? serializeForInlineScript(manufactChatUrl)\n : null;\n const rawUrl = assetsUrl ?? DEFAULT_INSPECTOR_ASSETS_URL;\n const bundleUrl = withInspectorCacheBust(rawUrl);\n const scriptSrc = escapeHtml(bundleUrl);\n const stylesHref = escapeHtml(inspectorStylesUrl(bundleUrl));\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${escapeHtml(serverName)} — MCP Inspector</title>\n ${faviconHref !== undefined ? `<link rel=\"icon\"${faviconType !== undefined ? ` type=\"${escapeHtml(faviconType)}\"` : \"\"} href=\"${escapeHtml(faviconHref)}\" />` : \"\"}\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" />\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin />\n <link\n href=\"https://fonts.googleapis.com/css2?family=Ubuntu:wght@400;500;700&display=swap\"\n rel=\"stylesheet\"\n />\n <link rel=\"stylesheet\" href=\"${stylesHref}\" />\n <style>\n :root { color-scheme: light dark; }\n html, body { height: 100%; margin: 0; background-color: #f3f3f3; }\n #root { height: 100%; }\n .mcp-boot {\n display: flex;\n height: 100%;\n align-items: center;\n justify-content: center;\n background-color: #f3f3f3;\n }\n .mcp-boot-inner {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n }\n .mcp-boot-spinner {\n width: 32px;\n height: 32px;\n color: #52525b;\n animation: mcp-boot-spin 1s linear infinite;\n }\n .mcp-boot-label {\n margin: 0;\n font-family: Ubuntu, sans-serif;\n font-size: 0.875rem;\n line-height: 1.25rem;\n color: #52525b;\n }\n @keyframes mcp-boot-spin {\n to { transform: rotate(360deg); }\n }\n @media (prefers-color-scheme: dark) {\n html, body { background-color: #000; }\n .mcp-boot { background-color: #000; }\n .mcp-boot-spinner, .mcp-boot-label { color: #a1a1aa; }\n }\n </style>\n </head>\n <body>\n <div id=\"root\">\n <div class=\"mcp-boot\">\n <div class=\"mcp-boot-inner\">\n <svg\n class=\"mcp-boot-spinner\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n role=\"status\"\n aria-label=\"Loading\"\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n <p class=\"mcp-boot-label\">Connecting to MCP server...</p>\n </div>\n </div>\n </div>\n <script>\n (function () {\n var basePath = ${serializedBasePath};\n // The connect URL is derived from the page's own origin: the server\n // never guesses the hostname a browser reached it by.\n window.__MCP_USE_INSPECTOR__ = {\n autoConnectUrl: window.location.origin + basePath,\n basePath: basePath,\n };\n // Read by the current inspector bundle to derive its own URLs.\n window.__MCP_BASE_PATH__ = basePath;\n ${process.env.MCP_USE_DEV_CLI === \"1\" ? \"window.__MCP_DEV_CLI__ = true;\" : \"\"}\n ${serializedManufactChatUrl ? `window.__MANUFACT_CHAT_URL__ = ${serializedManufactChatUrl};` : \"\"}\n // The bundle carries Node-flavored dependencies that touch \\`process\\`\n // at module scope; give them the same browser polyfill the v1\n // inspector shell provides, or the bundle throws on load.\n if (typeof window.process === \"undefined\") {\n window.process = {\n env: {},\n platform: \"browser\",\n browser: true,\n version: \"v18.0.0\",\n versions: { node: \"18.0.0\" },\n cwd: function () { return \"/\"; },\n nextTick: function (fn) {\n var args = Array.prototype.slice.call(arguments, 1);\n queueMicrotask(function () { fn.apply(null, args); });\n },\n };\n }\n })();\n </script>\n <script type=\"module\" src=\"${scriptSrc}\"></script>\n </body>\n</html>\n`;\n}\n\n/**\n * Fetch handler for `${basePath}/inspector` (GET and HEAD).\n *\n * No-op when `inspector.enabled` is `false`; `undefined` and `{}` mean enabled.\n *\n * @internal Wiring for `MCPServer`.\n */\nexport function createInspectorHandler(\n inspector: InspectorOptions | undefined,\n options: {\n serverName: string;\n basePath: string;\n faviconHref?: string;\n faviconType?: string;\n }\n): FetchHandler | undefined {\n if (inspector?.enabled === false) {\n return undefined;\n }\n const { assetsUrl: configAssetsUrl, manufactChatUrl: configManufactChatUrl } =\n inspector ?? {};\n const assetsUrl =\n configAssetsUrl ?? process.env[\"MCP_USE_INSPECTOR_ASSETS_URL\"] ?? undefined;\n const manufactChatUrl =\n configManufactChatUrl ?? process.env[\"MANUFACT_CHAT_URL\"] ?? undefined;\n const shellOptions: InspectorShellOptions = {\n serverName: options.serverName,\n basePath: options.basePath,\n ...(options.faviconHref !== undefined && {\n faviconHref: options.faviconHref,\n }),\n ...(options.faviconType !== undefined && {\n faviconType: options.faviconType,\n }),\n assetsUrl,\n manufactChatUrl,\n };\n\n return async (request) => {\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n return new Response(\"Method Not Allowed\", { status: 405 });\n }\n const pathname = new URL(request.url).pathname;\n if (!matchesInspectorShellPath(pathname, options.basePath)) {\n return new Response(\"Not Found\", { status: 404 });\n }\n const html = renderInspectorShell(shellOptions);\n return new Response(request.method === \"HEAD\" ? null : html, {\n status: 200,\n headers: { \"content-type\": \"text/html; charset=utf-8\" },\n });\n };\n}\n\n/**\n * @deprecated Use {@link createInspectorHandler}.\n *\n * @internal\n */\nexport function mountInspectorShell(): void {\n throw new Error(\n \"mountInspectorShell(app) was removed — use createInspectorHandler\"\n );\n}\n","/**\n * Compact HTTP/MCP request logging.\n *\n * One summary line per HTTP request, plus an indented detail line for MCP\n * (JSON-RPC) requests naming the protocol method, its subject (tool name,\n * resource URI, prompt name), and the calling client:\n *\n * ```text\n * 12:45:01 POST /mcp 200 in 12ms\n * tools/call greet raw-request/0.0.0\n * ```\n *\n * Detail lines are plain two-space-indented ASCII (no box-drawing glyphs) so\n * log parsers and agents can tell the two apart mechanically: summary lines\n * start with a timestamp, detail lines start with whitespace.\n *\n * Three verbosity levels, resolved per request from the `MCP_USE_LOG_LEVEL`\n * environment variable (overriding any configured level):\n *\n * - `info` (default): the compact summary + detail lines only — no request\n * or response payloads, so secrets in tool arguments/results stay out of\n * production logs.\n * - `debug`: echoes compact truncated input/output on the detail line:\n * `tools/call greet {\"who\":\"world\"} -> \"hi world\" raw-request/0.0.0`.\n * - `trace`: debug plus a full request/response dump (headers and bodies)\n * after the summary.\n */\nimport {\n CLIENT_INFO_META_KEY,\n isJSONRPCRequest,\n type Implementation,\n type JSONRPCRequest,\n type RequestMethod,\n type RequestTypeMap,\n} from \"@modelcontextprotocol/server\";\n\nimport { getRequestBag, type FetchMiddleware } from \"./fetch-app.js\";\n\n/** Verbosity of the request logger. */\nexport type LogLevel = \"info\" | \"debug\" | \"trace\";\n\n/** Options for {@link requestLogger} — the shape of `config.logging`. */\nexport interface LoggingOptions {\n /**\n * Whether request logging is on.\n *\n * @defaultValue `true`\n */\n enabled?: boolean;\n /**\n * Verbosity: `info` (compact lines without payloads, default), `debug`\n * (adds compact truncated input/output on the detail line), or `trace`\n * (debug plus full request/response header and body dumps). The\n * `MCP_USE_LOG_LEVEL` environment variable overrides this when set.\n */\n level?: LogLevel;\n}\n\n/* ------------------------------------------------------------------------ *\n * ANSI styling (no color-library dependency)\n * ------------------------------------------------------------------------ */\n\n/**\n * Whether to emit ANSI escapes: only on a TTY stdout, and never when the\n * `NO_COLOR` convention is set. Edge runtimes without `process.stdout`\n * (Workers, Deno Deploy) get plain text.\n */\nfunction colorsEnabled(): boolean {\n if (typeof process === \"undefined\") return false;\n if (process.env?.[\"NO_COLOR\"] !== undefined) return false;\n return process.stdout?.isTTY === true;\n}\n\ntype Style = (text: string) => string;\n\nfunction ansi(open: number, close: number): Style {\n return (text) =>\n colorsEnabled() ? `\\u001B[${open}m${text}\\u001B[${close}m` : text;\n}\n\nconst bold = ansi(1, 22);\nconst dim = ansi(2, 22);\nconst red = ansi(31, 39);\nconst green = ansi(32, 39);\nconst yellow = ansi(33, 39);\nconst blue = ansi(34, 39);\nconst magenta = ansi(35, 39);\nconst cyan = ansi(36, 39);\nconst gray = ansi(90, 39);\n\n/* ------------------------------------------------------------------------ *\n * Level resolution\n * ------------------------------------------------------------------------ */\n\n/**\n * Effective log level: `MCP_USE_LOG_LEVEL` when it names a known level,\n * otherwise the configured level, otherwise `info`.\n */\nexport function resolveLogLevel(configured?: LogLevel): LogLevel {\n const raw =\n typeof process === \"undefined\"\n ? undefined\n : process.env?.[\"MCP_USE_LOG_LEVEL\"]?.toLowerCase();\n if (raw === \"info\" || raw === \"debug\" || raw === \"trace\") return raw;\n return configured ?? \"info\";\n}\n\n/* ------------------------------------------------------------------------ *\n * MCP detail formatting (typed against the SDK's protocol method surface)\n * ------------------------------------------------------------------------ */\n\n/** What one protocol method contributes to the detail line. */\ninterface McpDetail {\n /** Short subject next to the method name (tool name, resource URI, …). */\n subject?: string | undefined;\n /** Caller-provided input worth echoing inline (tool/prompt arguments). */\n input?: unknown;\n}\n\n/**\n * Detail extractor for one protocol method: given the method's typed params,\n * return the subject and inline input to show, or `{}` when the method name\n * says it all.\n */\ntype DetailFormatter<M extends RequestMethod> = (\n params: RequestTypeMap[M][\"params\"]\n) => McpDetail;\n\nfunction formatClientInfo(\n info: Implementation | undefined\n): string | undefined {\n if (info === undefined) return undefined;\n return typeof info.version === \"string\" && info.version !== \"\"\n ? `${info.name}/${info.version}`\n : info.name;\n}\n\n/**\n * Exhaustive over {@link RequestMethod}: adding a protocol method to the SDK\n * makes this table a compile error until a formatter is chosen — the inverse\n * of v1's silent `[unknown-method]` fallback.\n */\nconst detailFormatters: {\n [M in RequestMethod]: DetailFormatter<M>;\n} = {\n initialize: (p) => ({ subject: formatClientInfo(p.clientInfo) }),\n ping: () => ({}),\n \"server/discover\": () => ({}),\n \"completion/complete\": (p) => ({\n subject: p.ref.type === \"ref/prompt\" ? p.ref.name : p.ref.uri,\n input: p.argument,\n }),\n \"logging/setLevel\": (p) => ({ subject: p.level }),\n \"prompts/get\": (p) => ({ subject: p.name, input: p.arguments }),\n \"prompts/list\": () => ({}),\n \"resources/list\": () => ({}),\n \"resources/templates/list\": () => ({}),\n \"resources/read\": (p) => ({ subject: p.uri }),\n \"resources/subscribe\": (p) => ({ subject: p.uri }),\n \"resources/unsubscribe\": (p) => ({ subject: p.uri }),\n \"subscriptions/listen\": () => ({}),\n \"tools/call\": (p) => ({ subject: p.name, input: p.arguments }),\n \"tools/list\": () => ({}),\n \"sampling/createMessage\": () => ({}),\n \"elicitation/create\": () => ({}),\n \"roots/list\": () => ({}),\n};\n\nfunction isKnownMethod(method: string): method is RequestMethod {\n return Object.prototype.hasOwnProperty.call(detailFormatters, method);\n}\n\n/**\n * Detail for a guard-proved JSON-RPC request. The guard proves the JSON-RPC\n * envelope, not method-specific params, so the formatter call is fenced: a\n * malformed body (which the SDK will reject downstream anyway) logs without\n * a subject rather than throwing here.\n */\nfunction formatDetail(message: JSONRPCRequest): McpDetail {\n if (!isKnownMethod(message.method)) return {};\n try {\n const formatter = detailFormatters[message.method] as (\n params: unknown\n ) => McpDetail;\n const detail = formatter(message.params);\n return typeof detail.subject === \"string\" || detail.subject === undefined\n ? detail\n : {};\n } catch {\n return {};\n }\n}\n\n/** Longest inline JSON segment (input or output) before truncation. */\nconst INLINE_JSON_MAX_LENGTH = 80;\n\n/**\n * Compact single-line JSON for inline input/output echoing, truncated to\n * {@link INLINE_JSON_MAX_LENGTH} characters.\n */\nfunction inlineJson(value: unknown): string {\n let text: string;\n try {\n text = JSON.stringify(value) ?? String(value);\n } catch {\n text = String(value);\n }\n return text.length > INLINE_JSON_MAX_LENGTH\n ? `${text.slice(0, INLINE_JSON_MAX_LENGTH)}...`\n : text;\n}\n\n/**\n * Client identity from the per-request `_meta` envelope every 2026-07-28\n * request carries (`io.modelcontextprotocol/clientInfo`) — the stateless\n * replacement for v1's session-id prefix. `undefined` for requests without\n * the envelope (legacy-era traffic).\n */\nfunction formatClientIdentity(message: JSONRPCRequest): string | undefined {\n const meta = message.params?._meta;\n if (meta === undefined) return undefined;\n const info = (meta as Record<string, unknown>)[CLIENT_INFO_META_KEY];\n if (\n typeof info !== \"object\" ||\n info === null ||\n typeof (info as Implementation).name !== \"string\"\n ) {\n return undefined;\n }\n return formatClientInfo(info as Implementation);\n}\n\n/**\n * Strip control characters (newlines, ANSI escapes, …) from request-derived\n * strings so a hostile method/subject/error value cannot forge extra log\n * lines or terminal escape sequences.\n */\nfunction sanitize(text: string): string {\n // eslint-disable-next-line no-control-regex\n return text.replace(/[\\u0000-\\u001F\\u007F-\\u009F]+/g, \" \");\n}\n\n/** Namespace color for the detail line's method segment. */\nfunction methodStyle(method: string): Style {\n if (method.startsWith(\"tools/\")) return cyan;\n if (method.startsWith(\"resources/\")) return green;\n if (method.startsWith(\"prompts/\")) return magenta;\n if (method === \"initialize\" || method === \"ping\") return gray;\n return blue;\n}\n\n/* ------------------------------------------------------------------------ *\n * Response outcome\n * ------------------------------------------------------------------------ */\n\n/** Header names whose values are credentials and never worth dumping. */\nconst REDACTED_HEADERS = new Set([\n \"authorization\",\n \"proxy-authorization\",\n \"cookie\",\n \"set-cookie\",\n \"x-api-key\",\n]);\n\n/** Replace credential-bearing header values with a `[REDACTED]` marker. */\nfunction redactHeaders(\n headers: Record<string, string>\n): Record<string, string> {\n return Object.fromEntries(\n Object.entries(headers).map(([name, value]) => [\n name,\n REDACTED_HEADERS.has(name.toLowerCase()) ? \"[REDACTED]\" : value,\n ])\n );\n}\n\n/** The JSON-RPC-level outcome parsed from a response body. */\ninterface ResponseOutcome {\n /** Error message when the exchange failed (JSON-RPC error or tool error). */\n errorMessage: string | null;\n /** The JSON-RPC `result` payload when the exchange succeeded. */\n result?: unknown;\n}\n\n/**\n * Parse the JSON-RPC outcome from the response body: an error message from\n * the error envelope (`{ error: { message } }`) or a tool-call error\n * (`{ result: { isError: true, content: [{ text }] } }`), otherwise the\n * successful `result` payload. Handles both `application/json` and\n * `text/event-stream` bodies.\n */\nasync function extractResponseOutcome(res: Response): Promise<ResponseOutcome> {\n if (!res.body) return { errorMessage: null };\n\n let text: string;\n try {\n text = await res.clone().text();\n } catch {\n return { errorMessage: null };\n }\n if (!text) return { errorMessage: null };\n\n const isSse = (res.headers.get(\"content-type\") ?? \"\").includes(\n \"text/event-stream\"\n );\n const payloads: unknown[] = [];\n const tryParse = (raw: string) => {\n try {\n payloads.push(JSON.parse(raw));\n } catch {\n // not JSON — skip\n }\n };\n if (isSse) {\n for (const line of text.split(/\\r?\\n/)) {\n if (line.startsWith(\"data:\")) {\n const data = line.slice(5).trim();\n if (data) tryParse(data);\n }\n }\n } else {\n tryParse(text);\n }\n\n let result: unknown;\n for (const payload of payloads) {\n if (payload === null || typeof payload !== \"object\") continue;\n const message = payload as {\n error?: { message?: unknown };\n result?: { isError?: unknown; content?: unknown };\n };\n if (typeof message.error?.message === \"string\") {\n return { errorMessage: message.error.message };\n }\n if (message.result?.isError === true) {\n const blocks = Array.isArray(message.result.content)\n ? (message.result.content as { type?: unknown; text?: unknown }[])\n : [];\n const textBlock = blocks.find(\n (b) => b?.type === \"text\" && typeof b.text === \"string\"\n );\n return {\n errorMessage: textBlock ? String(textBlock.text) : \"tool error\",\n };\n }\n if (\"result\" in message) result = message.result;\n }\n return { errorMessage: null, result };\n}\n\n/**\n * Compact view of a successful `tools/call` result for inline echoing:\n * `structuredContent` when present, a lone text block's text, or the raw\n * content blocks.\n */\nfunction compactToolResult(result: unknown): unknown {\n if (result === null || typeof result !== \"object\") return result;\n const { structuredContent, content } = result as {\n structuredContent?: unknown;\n content?: unknown;\n };\n if (structuredContent !== undefined) return structuredContent;\n if (Array.isArray(content)) {\n const [block] = content as { type?: unknown; text?: unknown }[];\n if (content.length === 1 && block?.type === \"text\") return block.text;\n }\n return content;\n}\n\n/* ------------------------------------------------------------------------ *\n * Trace dump\n * ------------------------------------------------------------------------ */\n\n/** Pretty-print a value for the trace dump, truncating long strings. */\nfunction formatForDump(value: unknown): string {\n function truncate(val: unknown): unknown {\n if (typeof val === \"string\" && val.length > 100) {\n return `${val.slice(0, 100)}...`;\n }\n if (Array.isArray(val)) return val.map(truncate);\n if (val !== null && typeof val === \"object\") {\n return Object.fromEntries(\n Object.entries(val as Record<string, unknown>).map(([k, v]) => [\n k,\n truncate(v),\n ])\n );\n }\n return val;\n }\n try {\n return JSON.stringify(truncate(value), null, 2);\n } catch {\n return String(value);\n }\n}\n\nconst DUMP_BODY_MAX_LENGTH = 10_000;\n\nasync function printTraceDump(\n response: Response,\n requestHeaders: Record<string, string>,\n requestBody: unknown,\n readResponseBody: boolean\n): Promise<void> {\n console.log(`\\n${cyan(\"=\".repeat(80))}`);\n console.log(bold(cyan(\"[TRACE] Request Details\")));\n console.log(cyan(\"-\".repeat(80)));\n\n if (Object.keys(requestHeaders).length > 0) {\n console.log(yellow(\"Request Headers:\"));\n console.log(formatForDump(redactHeaders(requestHeaders)));\n }\n if (requestBody !== undefined) {\n console.log(yellow(\"Request Body:\"));\n console.log(\n typeof requestBody === \"string\" ? requestBody : formatForDump(requestBody)\n );\n }\n\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n if (Object.keys(responseHeaders).length > 0) {\n console.log(yellow(\"Response Headers:\"));\n console.log(formatForDump(redactHeaders(responseHeaders)));\n }\n\n if (!readResponseBody) {\n console.log(`${yellow(\"Response Body:\")} (streaming — not dumped)`);\n } else if (response.body === null) {\n console.log(`${yellow(\"Response Body:\")} (no body)`);\n } else {\n try {\n const text = await response.clone().text();\n if (text.length === 0) {\n console.log(`${yellow(\"Response Body:\")} (empty)`);\n } else {\n console.log(yellow(\"Response Body:\"));\n try {\n console.log(formatForDump(JSON.parse(text)));\n } catch {\n console.log(\n text.length > DUMP_BODY_MAX_LENGTH\n ? `${text.slice(0, DUMP_BODY_MAX_LENGTH)}\\n... (truncated, ${\n text.length - DUMP_BODY_MAX_LENGTH\n } more characters)`\n : text\n );\n }\n }\n } catch {\n console.log(`${yellow(\"Response Body:\")} (unable to read)`);\n }\n }\n\n console.log(`${cyan(\"=\".repeat(80))}\\n`);\n}\n\n/* ------------------------------------------------------------------------ *\n * Middleware\n * ------------------------------------------------------------------------ */\n\n/** Style an HTTP status code by its class. */\nfunction styleStatus(status: number): string {\n const text = String(status);\n if (status >= 500) return magenta(text);\n if (status >= 400) return red(text);\n if (status >= 300) return yellow(text);\n return green(text);\n}\n\n/**\n * Cosmetic noise suppression: inspector shell page loads and favicon probes\n * add nothing to a request log.\n */\nfunction isNoisyRequest(httpMethod: string, pathname: string): boolean {\n if (httpMethod !== \"GET\" && httpMethod !== \"HEAD\") return false;\n return pathname.includes(\"/inspector\") || pathname.endsWith(\"/favicon.ico\");\n}\n\n/**\n * Fetch middleware logging every request in the compact two-line format (see\n * the module docs). `MCPServer` registers it automatically unless\n * `config.logging.enabled` is `false`.\n */\nexport function requestLogger(options: LoggingOptions = {}): FetchMiddleware {\n if (options.enabled === false) {\n return (_request, next) => next();\n }\n return async (request, next) => {\n const level = resolveLogLevel(options.level);\n const startedAt = Date.now();\n const httpMethod = request.method;\n const pathname = new URL(request.url).pathname;\n\n if (isNoisyRequest(httpMethod, pathname)) {\n return next();\n }\n\n const requestHeaders: Record<string, string> = {};\n if (level === \"trace\") {\n request.headers.forEach((value, key) => {\n requestHeaders[key] = value;\n });\n }\n\n let requestBody: unknown;\n if (httpMethod !== \"GET\" && httpMethod !== \"HEAD\") {\n const parsedBody = getRequestBag(request).parsedBody;\n if (parsedBody !== undefined) {\n requestBody = parsedBody;\n } else {\n try {\n requestBody = await request.clone().json();\n } catch {\n // Non-JSON body — the summary line logs without MCP detail.\n }\n }\n }\n\n const response = await next();\n\n const durationMs = Date.now() - startedAt;\n const timestamp = new Date().toISOString().substring(11, 19);\n const mcpRequest = isJSONRPCRequest(requestBody) ? requestBody : undefined;\n const isStreamingMethod = mcpRequest?.method === \"subscriptions/listen\";\n\n const lines: string[] = [\n [\n dim(timestamp),\n bold(httpMethod),\n pathname,\n styleStatus(response.status),\n dim(`in ${durationMs}ms`),\n ].join(\" \"),\n ];\n\n if (mcpRequest !== undefined) {\n const method = sanitize(mcpRequest.method);\n const parts: string[] = [` ${methodStyle(method)(method)}`];\n const detail = formatDetail(mcpRequest);\n if (detail.subject !== undefined) {\n parts.push(bold(sanitize(detail.subject)));\n }\n const echoPayloads = level !== \"info\";\n if (echoPayloads && detail.input !== undefined) {\n parts.push(inlineJson(detail.input));\n }\n const outcome: ResponseOutcome = isStreamingMethod\n ? { errorMessage: null }\n : await extractResponseOutcome(response);\n if (\n echoPayloads &&\n mcpRequest.method === \"tools/call\" &&\n outcome.errorMessage === null &&\n outcome.result !== undefined\n ) {\n parts.push(dim(\"->\"), inlineJson(compactToolResult(outcome.result)));\n }\n if (mcpRequest.method !== \"initialize\") {\n const client = formatClientIdentity(mcpRequest);\n if (client !== undefined) parts.push(dim(sanitize(client)));\n }\n if (outcome.errorMessage !== null) {\n parts.push(red(`ERROR ${sanitize(outcome.errorMessage)}`));\n } else if (response.status >= 400) {\n parts.push(red(`ERROR (HTTP ${response.status})`));\n }\n lines.push(parts.join(\" \"));\n }\n\n console.log(lines.join(\"\\n\"));\n\n if (level === \"trace\") {\n await printTraceDump(\n response,\n requestHeaders,\n requestBody,\n !isStreamingMethod\n );\n }\n\n return response;\n };\n}\n","import {\n createMcpHandler,\n type AuthInfo,\n type CreateMcpHandlerOptions,\n type McpHttpHandler,\n type McpServerFactory,\n} from \"@modelcontextprotocol/server\";\n\nimport { getRequestBag, matchesPath, type FetchHandler } from \"./fetch-app.js\";\nimport {\n extractClientCapabilitiesFromBody,\n stashClientCapabilities,\n} from \"./views/capabilities.js\";\n\n/** Options for {@link createMcpMount}. */\nexport interface MountMcpOptions {\n /** Route path the MCP endpoint is served on. Defaults to `/mcp`. */\n path?: string;\n /**\n * Options forwarded to the SDK's `createMcpHandler`.\n *\n * `legacy` defaults to `\"stateless\"`: 2025-era (non-envelope) requests are\n * served by a fresh instance over a session-less streamable HTTP transport.\n * Pass `legacy: \"reject\"` for modern-only strict serving, where\n * legacy-classified requests get the unsupported-protocol-version error.\n */\n handler?: CreateMcpHandlerOptions;\n /**\n * Produce verified {@link AuthInfo} for the request before the SDK handler\n * runs. When omitted, requests are served without authenticated identity.\n */\n authInfo?: (request: Request) => AuthInfo | undefined;\n}\n\n/** Result of {@link createMcpMount}. */\nexport interface McpMount {\n /** Underlying SDK handler (`close`, `notify`, `bus`). */\n handler: McpHttpHandler;\n /** Fetch handler for the MCP path only (compose into a larger app). */\n fetch: FetchHandler;\n}\n\n/**\n * Create the MCP Streamable HTTP endpoint as a fetch handler.\n *\n * Returns the underlying `McpHttpHandler` so callers can call `close()` on\n * shutdown to abort in-flight exchanges, and use `notify`/`bus` for\n * list-changed notifications.\n *\n * Compose the returned `fetch` into a larger app with {@link composeFetch}\n * from `mcp-use`, and put Host/Origin validation in front when binding\n * locally or exposing the process directly.\n *\n * @example\n * ```ts\n * const { handler, fetch: mcpFetch } = createMcpMount(factory);\n * const app = composeFetch(mcpFetch, jsonBodyMiddleware(), hostValidationMiddleware(hosts));\n * ```\n */\nexport function createMcpMount(\n factory: McpServerFactory,\n options: MountMcpOptions = {}\n): McpMount {\n const {\n path = \"/mcp\",\n handler: handlerOptions,\n authInfo: getAuthInfo,\n } = options;\n const legacyMode = handlerOptions?.legacy ?? \"stateless\";\n const handler = createMcpHandler(factory, {\n legacy: \"stateless\",\n ...handlerOptions,\n });\n\n const fetch: FetchHandler = async (request) => {\n if (!matchesPath(request, path)) {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n // ponytail: stateless wire is POST-only; SDK GET/DELETE/HEAD probes are optional.\n // 204 avoids browser console noise from 405 while remaining client-safe.\n if (legacyMode === \"stateless\") {\n const method = request.method.toUpperCase();\n if (method === \"GET\" || method === \"DELETE\" || method === \"HEAD\") {\n return new Response(null, { status: 204 });\n }\n }\n\n const bag = getRequestBag(request);\n let parsedBody = bag.parsedBody;\n if (parsedBody === undefined) {\n try {\n parsedBody = await request.clone().json();\n } catch {\n // Non-JSON or empty body — the SDK handler will surface the error.\n }\n }\n\n const capabilities = extractClientCapabilitiesFromBody(parsedBody);\n if (capabilities !== undefined) {\n stashClientCapabilities(request, capabilities);\n }\n\n const authInfo = getAuthInfo?.(request) ?? bag.authInfo;\n return handler.fetch(request, {\n ...(parsedBody !== undefined && { parsedBody }),\n ...(authInfo !== undefined && { authInfo }),\n });\n };\n\n return { handler, fetch };\n}\n","import type {\n CallToolResult,\n InputRequiredResult,\n MetaObject,\n StandardSchemaWithJSON,\n ToolAnnotations,\n} from \"@modelcontextprotocol/server\";\n\nimport type { McpUiResourceCsp } from \"@modelcontextprotocol/ext-apps\";\n\nimport type { RequestContext } from \"./context.js\";\nimport type { UiPermissions } from \"./views/types.js\";\n\n/**\n * Binds a tool to a view directory for MCP Apps rendering.\n *\n * A view may have at most one bound tool. That tool owns the resource facts\n * (`description`, `csp`, `permissions`, `domain`, `prefersBorder`); a second\n * tool that names the same view is rejected. The view file exports the\n * component, while the framework emits these fields on the view's MCP\n * resource, where hosts read `_meta.ui`.\n */\nexport interface ToolViewConfig {\n /** View directory / registry name, e.g. `\"product-search-result\"`. */\n name: string;\n /**\n * Human-readable description of the view resource → the resource's\n * `description` on `resources/list` and `resources/read`.\n */\n description?: string;\n /**\n * CSP domains the host must allow → resource `_meta.ui.csp`. The framework\n * appends the server origin to `connectDomains` and the configured assets\n * origin (or server origin) to `resourceDomains` at emission time. Other\n * author-set fields (`frameDomains`, `baseUriDomains`, …) pass through.\n */\n csp?: McpUiResourceCsp;\n /** Sandbox permissions the view needs → resource `_meta.ui.permissions`. */\n permissions?: UiPermissions;\n /**\n * Dedicated origin hint for hosts that render views on a separate domain →\n * resource `_meta.ui.domain`.\n */\n domain?: string;\n /**\n * Ask the host to draw a border around the view → resource\n * `_meta.ui.prefersBorder`.\n */\n prefersBorder?: boolean;\n}\n\n/** Declares a tool's identity, LLM-facing description, and schemas. First argument to {@link MCPServer.tool}. */\nexport interface ToolDefinition {\n /** Unique tool identifier, e.g. `\"fetch-weather\"`. */\n name: string;\n /** Human-readable title shown in UIs (falls back to `name`). */\n title?: string;\n /** LLM-facing description of what the tool does. */\n description?: string;\n /**\n * Object schema for input validation — any Standard Schema library with\n * JSON Schema conversion ({@link StandardSchemaWithJSON}): zod v4, ArkType,\n * Valibot, …. Field descriptions become LLM hints. Input is validated by\n * the SDK before the callback runs. Emitted on the wire as `inputSchema`.\n */\n inputSchema?: StandardSchemaWithJSON;\n /**\n * Alias for {@link ToolDefinition.inputSchema}. Prefer `inputSchema` in new\n * code — it matches the MCP wire field name.\n */\n schema?: StandardSchemaWithJSON;\n /**\n * Schema for structured output ({@link StandardSchemaWithJSON}). Any JSON\n * root is allowed — object, array, or primitive (2026-07-28 protocol).\n * When set, the callback must return a result carrying matching\n * `structuredContent` or an explicit `isError` result — enforced at\n * compile time and validated by the SDK at runtime.\n */\n outputSchema?: StandardSchemaWithJSON;\n /** Behavioral hints for clients (readOnlyHint, destructiveHint, …). */\n annotations?: ToolAnnotations;\n /**\n * Extension metadata advertised on this tool's `tools/list` descriptor.\n *\n * Use vendor-namespaced keys for custom data. This definition metadata is\n * distinct from a tool callback result's `_meta`: it describes the tool,\n * while result `_meta` belongs to one invocation. For view-bound or\n * visibility-restricted tools, framework-owned MCP Apps keys are derived\n * from {@link ToolDefinition.view} and {@link ToolDefinition.visibility};\n * those derived values take precedence over colliding entries here.\n */\n _meta?: MetaObject;\n /**\n * Declares who may call or see the tool. Emitted as `_meta.ui.visibility`\n * on `tools/list`. Omitted = host default (callable by the model, visible\n * to the app). The server always lists every registered tool — hosts\n * filter by this declaration; the server never omits tools from\n * `tools/list`. `\"app\"` marks app-private helper tools callable from\n * views via `useCallTool` while the host hides them from the model.\n */\n visibility?: \"model\" | \"app\";\n /**\n * Bind this tool to a view for MCP Apps rendering. Requires\n * {@link ToolDefinition.outputSchema} — the view reads the result's\n * `structuredContent` typed by this schema.\n */\n view?: ToolViewConfig;\n}\n\n/**\n * Handle returned by {@link MCPServer.tool} — carries the tool name at runtime\n * and phantom input/output types for inference (e.g. `Register` / `useCallTool`).\n */\nexport interface ToolRef<\n Name extends string = string,\n Input = Record<string, unknown>,\n Output = never,\n> {\n /** The tool's registered name. */\n readonly name: Name;\n /**\n * Phantom carrier for the tool's inferred input/output types. Never set at\n * runtime.\n *\n * @internal\n */\n readonly \"~types\"?: { input: Input; output: Output };\n}\n\n/**\n * Result a tool callback may return, keyed by the tool's inferred output\n * type. Completed calls use the SDK's raw {@link CallToolResult}; interactive\n * calls may return an {@link InputRequiredResult}. There is no\n * framework-specific result layer.\n *\n * Without an `outputSchema` (`TOutput = never`) any `CallToolResult` is\n * accepted. With one, the result must carry `structuredContent` matching the\n * schema or set `isError: true` — mirroring the SDK's runtime rule, which\n * rejects results from schema'd tools that carry no structured content\n * unless `isError` is set.\n *\n * The SDK auto-appends a JSON text block when `structuredContent` is a\n * non-object value and no `type: \"text\"` block is present; for object-shaped\n * payloads include the text serialization yourself:\n *\n * ```ts\n * return {\n * content: [{ type: \"text\", text: JSON.stringify(data) }],\n * structuredContent: data,\n * };\n * ```\n */\nexport type ToolResult<TOutput = never> =\n | InputRequiredResult\n | ([TOutput] extends [never]\n ? CallToolResult\n :\n | (CallToolResult & { structuredContent: TOutput })\n | (CallToolResult & { isError: true }));\n\n/** Infer the callback params type from a tool definition's input schema. */\nexport type InferToolInput<T> = T extends {\n inputSchema: infer S extends StandardSchemaWithJSON;\n}\n ? StandardSchemaWithJSON.InferOutput<S> extends Record<string, unknown>\n ? StandardSchemaWithJSON.InferOutput<S>\n : Record<string, unknown>\n : T extends {\n schema: infer S extends StandardSchemaWithJSON;\n }\n ? StandardSchemaWithJSON.InferOutput<S> extends Record<string, unknown>\n ? StandardSchemaWithJSON.InferOutput<S>\n : Record<string, unknown>\n : Record<string, unknown>;\n\n/**\n * Resolve a tool definition's input schema. `inputSchema` wins when both are\n * set.\n *\n * @internal\n */\nexport function resolveToolInputSchema(\n definition: Pick<ToolDefinition, \"inputSchema\" | \"schema\">\n): StandardSchemaWithJSON | undefined {\n return definition.inputSchema ?? definition.schema;\n}\n\n/**\n * Infer the structured output type from a definition's `outputSchema` —\n * any JSON root, not just objects (2026-07-28 protocol); `never` when the\n * definition declares none (any {@link CallToolResult} is then accepted —\n * see {@link ToolResult}).\n */\nexport type InferToolOutput<T> = T extends {\n outputSchema: infer S extends StandardSchemaWithJSON;\n}\n ? StandardSchemaWithJSON.InferOutput<S>\n : never;\n\n/** Infer the literal tool name from a definition's `name` field. */\nexport type InferToolName<T> = T extends { name: infer N extends string }\n ? N\n : string;\n\n/**\n * Tool execution callback. The return type is {@link ToolResult}: tools with\n * an `outputSchema` must return matching `structuredContent` or an `isError`\n * result; tools without one accept any {@link CallToolResult}.\n */\nexport type ToolCallback<\n TInput = Record<string, unknown>,\n TOutput = never,\n TUser = never,\n HasOAuth extends boolean = false,\n> = (\n params: TInput,\n ctx: RequestContext<TUser, HasOAuth>\n) => ToolResult<TOutput> | Promise<ToolResult<TOutput>>;\n","import type { ViewsManifest } from \"./types.js\";\n\n/**\n * Symbol-keyed method on {@link MCPServer} that primes the views registry\n * from build/dev registry data.\n *\n * @internal\n */\nexport const registerViews: unique symbol = Symbol(\"mcp-use/registerViews\");\n\n/**\n * Options for priming the views registry.\n *\n * @internal\n */\nexport interface RegisterViewsOptions {\n /**\n * When true, resource CSP emission appends the serving origin's websocket\n * variant to `connectDomains` so Vite HMR passes host-enforced CSP.\n */\n dev?: boolean;\n /**\n * Absolute project root for resolving the `public/` directory in dev.\n * Defaults to `process.cwd()` when omitted (production `start`).\n */\n projectRoot?: string;\n}\n\n/** Type of the {@link registerViews} method on {@link MCPServer}. */\nexport type RegisterViews = (\n views: ViewsManifest,\n options?: RegisterViewsOptions\n) => void;\n","import type { McpUiResourceCsp } from \"@modelcontextprotocol/ext-apps\";\n\nimport type { ViewResourceFacts } from \"./types.js\";\n\ntype CspCategory =\n | \"connectDomains\"\n | \"resourceDomains\"\n | \"frameDomains\"\n | \"baseUriDomains\";\n\nconst CATEGORY_ENV: Record<CspCategory, string> = {\n connectDomains: \"CSP_CONNECT_DOMAINS\",\n resourceDomains: \"CSP_RESOURCE_DOMAINS\",\n frameDomains: \"CSP_FRAME_DOMAINS\",\n baseUriDomains: \"CSP_BASE_URI_DOMAINS\",\n};\n\n/** Parse a comma-separated env var into trimmed non-empty domain strings. */\nexport function parseDomainList(raw: string | undefined): string[] {\n if (raw === undefined || raw.trim() === \"\") {\n return [];\n }\n return raw\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n}\n\nfunction readEnvDomains(name: string): string[] | undefined {\n if (typeof process === \"undefined\") {\n return undefined;\n }\n const raw = process.env[name];\n if (raw === undefined || raw.trim() === \"\") {\n return undefined;\n }\n return parseDomainList(raw);\n}\n\n/** Domains from `CSP_URLS` (shortcut for all categories). */\nexport function readCspUrlsShortcut(): string[] {\n return readEnvDomains(\"CSP_URLS\") ?? [];\n}\n\n/** Per-category env override, or `CSP_URLS` when the category var is unset. */\nexport function readEnvDomainsForCategory(category: CspCategory): string[] {\n const perCategory = readEnvDomains(CATEGORY_ENV[category]);\n if (perCategory !== undefined) {\n return perCategory;\n }\n return readCspUrlsShortcut();\n}\n\n/**\n * Merge domain lists: earlier segments win on duplicate (higher priority).\n */\nexport function mergeDomainLists(...segments: string[][]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const segment of segments) {\n for (const domain of segment) {\n if (!seen.has(domain)) {\n seen.add(domain);\n out.push(domain);\n }\n }\n }\n return out;\n}\n\n/**\n * Resolved origins and flags used when merging author, env, and MCP CSP domains.\n *\n * @internal\n */\nexport interface BuildCspOptions {\n /** Public server origin from `MCP_URL` or forwarded request headers. */\n serverOrigin: string;\n /** Assets origin derived from `MCP_ASSETS_URL` or the server origin. */\n assetsOrigin: string;\n /** When false, server origin is appended to resourceDomains (same-origin assets). */\n explicitAssetsBase: boolean;\n /** When true, append the server origin's websocket variant for Vite HMR. */\n hmrWs?: boolean;\n}\n\nfunction toWebSocketOrigin(serverOrigin: string): string {\n if (serverOrigin.startsWith(\"https://\")) {\n return `wss://${serverOrigin.slice(\"https://\".length)}`;\n }\n if (serverOrigin.startsWith(\"http://\")) {\n return `ws://${serverOrigin.slice(\"http://\".length)}`;\n }\n return serverOrigin;\n}\n\n/**\n * Build final `_meta.ui.csp` from author facts, env vars, and MCP auto-append.\n *\n * Precedence (high → low): author → env (`CSP_*_DOMAINS` or `CSP_URLS`) →\n * MCP auto-append (lowest).\n */\nexport function buildMergedResourceCsp(\n authorFacts: ViewResourceFacts | undefined,\n options: BuildCspOptions\n): McpUiResourceCsp {\n const author = authorFacts?.csp;\n\n const mcpConnectAuto: string[] = [];\n if (options.serverOrigin !== \"\") {\n mcpConnectAuto.push(options.serverOrigin);\n if (options.hmrWs === true) {\n mcpConnectAuto.push(toWebSocketOrigin(options.serverOrigin));\n }\n }\n\n const mcpResourceAuto: string[] = [];\n const resourceOrigin = options.explicitAssetsBase\n ? options.assetsOrigin\n : options.serverOrigin;\n if (resourceOrigin !== \"\") {\n mcpResourceAuto.push(resourceOrigin);\n }\n\n const connectDomains = mergeDomainLists(\n author?.connectDomains ?? [],\n readEnvDomainsForCategory(\"connectDomains\"),\n mcpConnectAuto\n );\n\n const resourceDomains = mergeDomainLists(\n author?.resourceDomains ?? [],\n readEnvDomainsForCategory(\"resourceDomains\"),\n mcpResourceAuto\n );\n\n const frameDomains = mergeDomainLists(\n author?.frameDomains ?? [],\n readEnvDomainsForCategory(\"frameDomains\")\n );\n\n const baseUriDomains = mergeDomainLists(\n author?.baseUriDomains ?? [],\n readEnvDomainsForCategory(\"baseUriDomains\")\n );\n\n return {\n ...author,\n connectDomains,\n resourceDomains,\n frameDomains,\n baseUriDomains,\n };\n}\n","import {\n matchesPathPrefix,\n pathUnderBase,\n pathnameOf,\n type FetchHandler,\n} from \"../fetch-app.js\";\nimport type { ViewManifestEntry } from \"./types.js\";\n\nconst PUBLIC_BUILD_DIR = \".mcp-use/build/views/public\";\nconst PUBLIC_DEV_DIR = \"public\";\nconst VIEW_ASSETS_BUILD_ROOT = \".mcp-use/build/views\";\n\n/**\n * Fetch handler for built view bundles under\n * `${basePath}/_mcp-use/views/<name>/…`.\n *\n * Production only — dev serves view modules through Vite middleware.\n *\n * @param basePath - MCP mount prefix (e.g. `/mcp`).\n * @param views - Primed view registry; empty skips mounting.\n * @param options - `projectRoot` defaults to `process.cwd()`.\n *\n * @internal\n */\nexport function createViewAssetsHandler(\n basePath: string,\n views: ReadonlyMap<string, ViewManifestEntry>,\n options?: { projectRoot?: string; deferCors?: boolean }\n): FetchHandler | undefined {\n if (views.size === 0) {\n return undefined;\n }\n\n const assetsPrefix = pathUnderBase(basePath, \"_mcp-use/views\");\n const projectRoot = options?.projectRoot ?? process.cwd();\n\n return async (request) => {\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n return new Response(\"Method Not Allowed\", { status: 405 });\n }\n if (!matchesPathPrefix(request, assetsPrefix)) {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n const pathname = pathnameOf(request);\n const remainder = pathname.slice(assetsPrefix.length + 1);\n const slash = remainder.indexOf(\"/\");\n if (slash <= 0 || slash === remainder.length - 1) {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n const viewName = remainder.slice(0, slash);\n const subpath = remainder.slice(slash + 1);\n const entry = views.get(viewName);\n if (entry === undefined || entry.kind !== \"external\") {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n const [{ join }, { resolvePublicFilePath, servePublicFile }] =\n await Promise.all([import(\"node:path\"), import(\"./public-route.js\")]);\n const viewRoot = join(projectRoot, VIEW_ASSETS_BUILD_ROOT, viewName);\n const diskPath = await resolvePublicFilePath(viewRoot, subpath);\n if (diskPath === null) {\n return new Response(\"Not Found\", { status: 404 });\n }\n return await servePublicFile(diskPath, {\n ...(options?.deferCors === true && { deferCors: true }),\n ...(request.method === \"HEAD\" && { head: true }),\n });\n };\n}\n\n/**\n * Fetch handler for public view assets under `${basePath}/_mcp-use/public/`.\n *\n * Public responses include `Access-Control-Allow-Origin: *` for\n * cross-origin sandboxed view iframes.\n *\n * Node filesystem modules load only on the first public-asset request so the\n * library entry stays edge-safe for `getHandler()`-only deployments.\n *\n * @param basePath - MCP mount prefix (e.g. `/mcp`).\n * @param views - Primed view registry; empty skips mounting.\n * @param options - When `dev` is true, the public route reads from\n * `<projectRoot>/public` instead of `.mcp-use/build/views/public/`.\n * `projectRoot` defaults to `process.cwd()`. `enabled` mounts the shared\n * public route for local server branding even when no views are registered.\n *\n * @internal\n */\nexport function createViewPublicHandler(\n basePath: string,\n views: ReadonlyMap<string, ViewManifestEntry>,\n options?: {\n dev?: boolean;\n projectRoot?: string;\n deferCors?: boolean;\n enabled?: boolean;\n }\n): FetchHandler | undefined {\n if (views.size === 0 && options?.enabled !== true) {\n return undefined;\n }\n\n const publicPrefix = pathUnderBase(basePath, \"_mcp-use/public\");\n const subdir = options?.dev === true ? PUBLIC_DEV_DIR : PUBLIC_BUILD_DIR;\n const projectRoot = options?.projectRoot ?? process.cwd();\n\n return async (request) => {\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n return new Response(\"Method Not Allowed\", { status: 405 });\n }\n if (!matchesPathPrefix(request, publicPrefix)) {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n const pathname = pathnameOf(request);\n const encodedSubpath = pathname.slice(publicPrefix.length + 1);\n let subpath: string;\n try {\n subpath = decodeURIComponent(encodedSubpath);\n } catch {\n return new Response(\"Not Found\", { status: 404 });\n }\n if (subpath.length === 0) {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n const [{ join }, { resolvePublicFilePath, servePublicFile }] =\n await Promise.all([import(\"node:path\"), import(\"./public-route.js\")]);\n const publicRoot = join(projectRoot, subdir);\n const diskPath = await resolvePublicFilePath(publicRoot, subpath);\n if (diskPath === null) {\n return new Response(\"Not Found\", { status: 404 });\n }\n return await servePublicFile(diskPath, {\n ...(options?.deferCors === true && { deferCors: true }),\n ...(request.method === \"HEAD\" && { head: true }),\n });\n };\n}\n\n/**\n * @deprecated Use {@link createViewPublicHandler}.\n *\n * @internal\n */\nexport function mountViewRoutes(): void {\n throw new Error(\n \"mountViewRoutes(app) was removed — use createViewPublicHandler\"\n );\n}\n","import type { MetaObject } from \"@modelcontextprotocol/server\";\n\nimport type { ViewManifestEntry, ViewResourceFacts } from \"./types.js\";\nimport {\n UI_META_KEY,\n UI_MIME_TYPE,\n UI_RESOURCE_URI_META_KEY,\n viewResourceUri,\n} from \"./constants.js\";\nimport { buildMergedResourceCsp, type BuildCspOptions } from \"./csp-env.js\";\nimport {\n hasExplicitAssetsBase,\n originFromAssetsBase,\n resolveAssetsBase,\n resolveServerOrigin,\n} from \"./origin.js\";\n\n/**\n * Tool declaration `_meta` for `tools/list`.\n *\n * When `viewName` is set, emits `ui.resourceUri` plus the legacy flat\n * {@link UI_RESOURCE_URI_META_KEY} key. When `visibility` is set, emits\n * `ui.visibility: [visibility]`. Either may be set independently — a\n * view-less tool can still declare app-only visibility. Returns `undefined`\n * only when no view, visibility, or existing metadata is provided.\n *\n * @param viewName - Bound view directory / manifest key, or `undefined` when\n * the tool has no view.\n * @param visibility - Optional model/app visibility narrowing from the tool\n * definition's top-level `visibility` field.\n * @param existingMetadata - Optional author-supplied definition metadata. Other\n * keys pass through, while framework-owned resource URI and visibility keys\n * are derived exclusively from `viewName` and `visibility`.\n * @returns Wire metadata for the tool listing, or `undefined` when there is\n * nothing to emit.\n */\nexport function buildToolUiMeta(\n viewName: string | undefined,\n visibility: \"model\" | \"app\" | undefined,\n existingMetadata?: MetaObject\n): MetaObject | undefined {\n if (\n viewName === undefined &&\n visibility === undefined &&\n existingMetadata === undefined\n ) {\n return undefined;\n }\n\n const meta: MetaObject = { ...existingMetadata };\n const existingUi = existingMetadata?.[UI_META_KEY];\n const existingUiIsObject =\n typeof existingUi === \"object\" &&\n existingUi !== null &&\n !Array.isArray(existingUi);\n const ui: MetaObject = existingUiIsObject ? { ...existingUi } : {};\n\n if (viewName !== undefined) {\n const resourceUri = viewResourceUri(viewName);\n ui[\"resourceUri\"] = resourceUri;\n meta[UI_RESOURCE_URI_META_KEY] = resourceUri;\n } else {\n // These keys describe the top-level view contract. Do not advertise an\n // author-supplied URI when the tool has no declared view.\n delete ui[\"resourceUri\"];\n delete meta[UI_RESOURCE_URI_META_KEY];\n }\n\n if (visibility !== undefined) {\n ui[\"visibility\"] = [visibility];\n } else {\n // Visibility is likewise derived exclusively from the top-level field.\n delete ui[\"visibility\"];\n }\n\n if (\n viewName !== undefined ||\n visibility !== undefined ||\n existingUiIsObject\n ) {\n meta[UI_META_KEY] = ui;\n }\n\n return meta;\n}\n\n/**\n * Tool result `_meta` stamped on completed non-error `CallToolResult` values\n * from a view-bound tool.\n *\n * Emits the nested `ui.resourceUri` key and the legacy flat\n * {@link UI_RESOURCE_URI_META_KEY} key so hosts can open the bound view.\n * Error results (`isError: true`) and intermediate `input_required` returns\n * must not receive this metadata. A stamped error URI would create a new\n * rendered view through legacy host behavior. Result `_meta` is view-only and\n * never enters model context.\n *\n * @param viewName - Bound view directory / registry key.\n * @returns Nested and legacy resource-URI wire keys.\n */\nexport function buildToolResultUiMeta(\n viewName: string\n): Record<string, unknown> {\n const resourceUri = viewResourceUri(viewName);\n return {\n [UI_META_KEY]: { resourceUri },\n [UI_RESOURCE_URI_META_KEY]: resourceUri,\n };\n}\n\n/**\n * Options for {@link buildResourceUiMeta}.\n *\n * @internal\n */\nexport interface BuildResourceUiMetaOptions {\n /** Request used to resolve server/assets origins when not passed explicitly. */\n request?: Request;\n /** Explicit server origin (overrides request resolution). */\n serverOrigin?: string;\n /** Explicit assets URL prefix (overrides request resolution). */\n assetsBase?: string;\n /**\n * When true, append the server origin's websocket variant to\n * `csp.connectDomains` for Vite HMR under host-enforced CSP.\n */\n hmrWs?: boolean;\n}\n\nfunction resolveCspOptions(\n options?: BuildResourceUiMetaOptions\n): BuildCspOptions {\n const request = options?.request;\n const serverOrigin =\n options?.serverOrigin ??\n (request !== undefined ? resolveServerOrigin(request) : \"\");\n const assetsBase =\n options?.assetsBase ??\n (request !== undefined ? resolveAssetsBase(request) : serverOrigin);\n\n return {\n serverOrigin,\n assetsOrigin: originFromAssetsBase(assetsBase),\n explicitAssetsBase: hasExplicitAssetsBase(),\n ...(options?.hmrWs === true ? { hmrWs: true as const } : {}),\n };\n}\n\n/**\n * Resource `_meta.ui` for a primed view.\n *\n * Emits `csp` by merging author `view.csp`, env (`CSP_URLS` / `CSP_*_DOMAINS`),\n * and MCP auto-append (`MCP_URL` → connect; assets origin → resource).\n */\nexport function buildResourceUiMeta(\n authorFacts: ViewResourceFacts | undefined,\n options?: BuildResourceUiMetaOptions\n): Record<string, unknown> {\n const csp = buildMergedResourceCsp(authorFacts, resolveCspOptions(options));\n\n const ui: Record<string, unknown> = { csp };\n\n if (authorFacts?.permissions !== undefined) {\n ui[\"permissions\"] = authorFacts.permissions;\n }\n if (authorFacts?.domain !== undefined) {\n ui[\"domain\"] = authorFacts.domain;\n }\n if (authorFacts?.prefersBorder !== undefined) {\n ui[\"prefersBorder\"] = authorFacts.prefersBorder;\n }\n\n return { [UI_META_KEY]: ui };\n}\n\n/**\n * Listing metadata for a primed view resource.\n */\nexport function viewResourceConfig(\n _viewName: string,\n _entry: ViewManifestEntry,\n authorFacts: ViewResourceFacts | undefined,\n options?: BuildResourceUiMetaOptions\n): {\n mimeType: string;\n description?: string;\n _meta: Record<string, unknown>;\n} {\n return {\n mimeType: UI_MIME_TYPE,\n ...(authorFacts?.description !== undefined && {\n description: authorFacts.description,\n }),\n _meta: buildResourceUiMeta(authorFacts, options),\n };\n}\n","/**\n * `mcp-use` — MCP server framework on the official v2 SDK (fetch-native).\n *\n * Greenfield rebuild of the mcp-use server package against the stateless\n * 2026-07-28 MCP protocol. See specs/SPEC.md for the phase plan and API contract.\n */\n\nexport { MCPServer } from \"./server.js\";\nexport { createMcpMount } from \"./mount-mcp.js\";\nexport type { MountMcpOptions, McpMount } from \"./mount-mcp.js\";\nexport {\n composeFetch,\n getRequestBag,\n hostValidationMiddleware,\n jsonBodyMiddleware,\n matchesPath,\n matchesPathPrefix,\n originValidationMiddleware,\n pathnameOf,\n routeFetch,\n toFrameworkHandler,\n} from \"./fetch-app.js\";\nexport type {\n FetchHandler,\n FetchMiddleware,\n FrameworkHandler,\n FrameworkRequestLike,\n RequestBag,\n} from \"./fetch-app.js\";\nexport { registerViews } from \"./views/index.js\";\nexport { requestLogger } from \"./logging.js\";\nexport type { LoggingOptions, LogLevel } from \"./logging.js\";\nexport type {\n LandingPageOptions,\n LandingPagePrompt,\n LandingPageResource,\n LandingPageTool,\n} from \"./landing.js\";\n\n/**\n * Wire result shapes (re-exported from the SDK): callbacks return these raw\n * shapes directly — tools return {@link CallToolResult}, resources\n * {@link ReadResourceResult}, prompts {@link GetPromptResult}. There is no\n * framework-specific result layer.\n */\nexport type {\n CallToolResult,\n ContentBlock,\n GetPromptResult,\n InputRequest,\n InputRequiredResult,\n InputResponses,\n PromptMessage,\n ReadResourceResult,\n} from \"@modelcontextprotocol/server\";\n/**\n * Official SDK descriptor metadata contracts. Tools use\n * {@link ToolAnnotations}; resources and resource templates use\n * {@link Annotations}; every descriptor's extension `_meta` uses\n * {@link MetaObject}.\n */\nexport type {\n Annotations,\n MetaObject,\n ToolAnnotations,\n} from \"@modelcontextprotocol/server\";\n/**\n * Official SDK helpers for authoring and reading multi-round-trip\n * `input_required` results.\n */\nexport {\n acceptedContent,\n createRequestStateCodec,\n inputRequired,\n inputResponse,\n isInputRequiredResult,\n} from \"@modelcontextprotocol/server\";\n\nexport { completable } from \"./completable.js\";\nexport type { CompletionCallback, CompletionContext } from \"./completable.js\";\n\n/**\n * Schema contracts accepted by `inputSchema`/`outputSchema` fields (re-exported\n * from the SDK): `StandardSchemaWithJSON` requires validation plus JSON\n * Schema conversion; `completable()` needs only `StandardSchemaV1`.\n * Implemented by zod v4, ArkType, Valibot, …\n */\nexport type {\n StandardSchemaV1,\n StandardSchemaWithJSON,\n} from \"@modelcontextprotocol/server\";\n\nexport type { InspectorOptions, ServerConfig, CorsOptions } from \"./config.js\";\nexport type { ServerBranding } from \"./branding.js\";\n/** Official MCP icon shape used by {@link ServerConfig.icons}. */\nexport type { Icon } from \"@modelcontextprotocol/server\";\nexport type {\n MiddlewareContext,\n McpMiddlewareContext,\n McpCompleteEventListenerFn,\n McpEventListenerFnFor,\n McpEventPattern,\n McpEventPatternBody,\n McpEventListenerFn,\n McpExactMiddlewareFn,\n McpMiddlewareFn,\n McpMiddlewareFnFor,\n McpMiddlewareMethod,\n McpMiddlewareMethodsForPattern,\n McpMiddlewareNext,\n McpMiddlewareOperationMap,\n McpMiddlewareParams,\n McpMiddlewarePattern,\n McpMiddlewarePatternBody,\n McpMiddlewarePatternMap,\n McpMiddlewareResult,\n PromptsGetMiddlewareContext,\n PromptsListMiddlewareContext,\n ReadonlyMiddlewareContext,\n ResourcesReadMiddlewareContext,\n ResourcesListMiddlewareContext,\n ToolsCallMiddlewareContext,\n ToolsListMiddlewareContext,\n} from \"./middleware/mcp-middleware.js\";\nexport {\n composeMiddleware,\n createMcpEventListenerEntry,\n createMcpMiddlewareEntry,\n matchesPattern,\n} from \"./middleware/mcp-middleware.js\";\nexport type { NodeRequestHandler } from \"./node-bridge.js\";\nexport type {\n FromOpenAPIOptions,\n OpenAPIAuth,\n OpenAPIDocument,\n OpenAPIExcludeRule,\n} from \"./openapi/index.js\";\nexport type {\n Elicit,\n ElicitationResult,\n OAuthAuth,\n RequestClientContext,\n RequestContext,\n} from \"./context.js\";\nexport type {\n InferToolInput,\n InferToolName,\n InferToolOutput,\n ToolCallback,\n ToolDefinition,\n ToolRef,\n ToolResult,\n ToolViewConfig,\n} from \"./tools.js\";\nexport type {\n ExternalViewManifestEntry,\n InlineViewManifestEntry,\n UiPermissions,\n ViewManifestEntry,\n ViewsManifest,\n} from \"./views/index.js\";\nexport type {\n InferTemplateParams,\n ResourceCallback,\n ResourceDefinition,\n ResourceTemplateCallback,\n ResourceTemplateCompleter,\n ResourceTemplateCompletions,\n ResourceTemplateDefinition,\n TemplateVariableValue,\n} from \"./resources.js\";\nexport type {\n InferPromptInput,\n PromptCallback,\n PromptDefinition,\n} from \"./prompts.js\";\nexport type {\n ProxyConnection,\n ProxyHttpConfig,\n ProxyProgress,\n ProxyPrompt,\n ProxyRequestOptions,\n ProxyResource,\n ProxyServerConfig,\n ProxyTool,\n} from \"./mcp-proxy.js\";\n"],"mappings":"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","names":["isInputRequiredResult","CLIENT_CAPABILITIES_META_KEY","CLIENT_CAPABILITIES_META_KEY","corsHeaders","resolvePublicFilePath","servePublicFile","isInputRequiredResult","inputRequired","inputResponse","isInputRequiredResult"]}
1
+ {"version":3,"sources":["../src/server.ts","../src/branding.ts","../src/config.ts","../src/context.ts","../src/views/capabilities.ts","../src/views/constants.ts","../src/middleware/cors.ts","../src/middleware/mcp-middleware.ts","../src/inspector-shell.ts","../src/logging.ts","../src/mount-mcp.ts","../src/tools.ts","../src/views/register.ts","../src/views/csp-env.ts","../src/views/routes.ts","../src/views/wire.ts","../src/index.ts"],"sourcesContent":["import {\n localhostAllowedHostnames,\n localhostAllowedOrigins,\n McpServer as SdkMcpServer,\n ResourceTemplate,\n isInputRequiredResult,\n type McpHttpHandler,\n type McpRequestContext,\n type PromptCallback as SdkPromptCallback,\n type ServerEventBus,\n type ServerContext,\n type StandardSchemaWithJSON,\n} from \"@modelcontextprotocol/server\";\nimport type { Server as NodeHttpServer } from \"node:http\";\n\nimport {\n createFaviconHandler,\n hasLocalBrandingAsset,\n normalizeServerBranding,\n resolveImplementationIcons,\n type ServerBranding,\n} from \"./branding.js\";\nimport { assertServerConfig, type ServerConfig } from \"./config.js\";\nimport {\n toAuthenticatedRequestContext,\n toRequestContext,\n type RequestContext,\n} from \"./context.js\";\nimport {\n composeFetch,\n getRequestBag,\n hostValidationMiddleware,\n isHtmlNavigationRequest,\n jsonBodyMiddleware,\n matchesPath,\n originValidationMiddleware,\n routeFetch,\n toFrameworkHandler,\n type FetchHandler,\n type FrameworkHandler,\n} from \"./fetch-app.js\";\nimport { corsFetchMiddleware, isGlobalCorsEnabled } from \"./middleware/cors.js\";\nimport {\n createMcpEventListenerEntry,\n createMcpMiddlewareEntry,\n runMcpOperation,\n withMcpMiddlewareParams,\n type McpEventListenerFnFor,\n type McpEventPattern,\n type McpEventListenerEntry,\n type McpMiddlewareEntry,\n type McpMiddlewareFnFor,\n type McpMiddlewareMethod,\n type McpMiddlewarePattern,\n type McpMiddlewareResult,\n type MiddlewareContext,\n} from \"./middleware/mcp-middleware.js\";\nimport {\n createInspectorHandler,\n matchesInspectorShellPath,\n} from \"./inspector-shell.js\";\nimport { requestLogger } from \"./logging.js\";\nimport { createMcpMount } from \"./mount-mcp.js\";\nimport { normalizeCompletions } from \"./resource-completion.js\";\nimport type { NodeRequestHandler } from \"./node-bridge.js\";\nimport { registerOpenAPITools } from \"./openapi/index.js\";\nimport type { FromOpenAPIOptions } from \"./openapi/types.js\";\nimport {\n getOAuthProtectedResourceMetadataUrl,\n requireBearerAuth,\n} from \"./oauth/index.js\";\nimport { authInfoFromRequest, oauthMetadata } from \"./oauth/adapters.js\";\nimport {\n getOAuthProviderOptions,\n resolveConfiguredOAuthResource,\n resolveLocalOAuthResource,\n wrapOAuthTokenVerifier,\n} from \"./oauth/internal.js\";\nimport type {\n InferPromptInput,\n PromptCallback,\n PromptDefinition,\n} from \"./prompts.js\";\nimport type {\n InferTemplateParams,\n ResourceCallback,\n ResourceDefinition,\n ResourceTemplateCallback,\n ResourceTemplateDefinition,\n TemplateVariableValue,\n} from \"./resources.js\";\nimport type {\n ProxyConnection,\n ProxyMountHost,\n ProxyServerConfig,\n} from \"./mcp-proxy.js\";\nimport type {\n InferToolInput,\n InferToolName,\n InferToolOutput,\n ToolCallback,\n ToolDefinition,\n ToolRef,\n ToolViewConfig,\n} from \"./tools.js\";\nimport { resolveToolInputSchema } from \"./tools.js\";\nimport type { ViewResourceFacts } from \"./views/types.js\";\nimport {\n createViewPublicHandler,\n createViewAssetsHandler,\n registerViews,\n resolveAssetsBase,\n synthesizeViewDocument,\n viewResourceConfig,\n viewResourceUri,\n buildResourceUiMeta,\n buildToolResultUiMeta,\n buildToolUiMeta,\n type BuildResourceUiMetaOptions,\n type ViewManifestEntry,\n type ViewsManifest,\n} from \"./views/index.js\";\n\n/*\n * Registry entries hold callbacks type-erased to their widest signature; the\n * registration methods cast the schema-narrowed callback down at `.set()`.\n * Safe because the SDK validates params against the definition's schema\n * before any callback runs.\n */\ntype HasOAuth<TUser> = [TUser] extends [never] ? false : true;\n\n/** Type-erased registry entry replayed when a per-request SDK server is built. */\ninterface ToolEntry<TUser> {\n /** Declarative tool metadata and schemas supplied at registration time. */\n definition: ToolDefinition;\n /** Tool callback widened for heterogeneous storage in the registry. */\n callback: ToolCallback<\n Record<string, unknown>,\n never,\n TUser,\n HasOAuth<TUser>\n >;\n}\n\n/** Static resource definition and callback retained for per-request replay. */\ninterface ResourceEntry<TUser> {\n /** Declarative resource metadata supplied at registration time. */\n definition: ResourceDefinition;\n /** Callback invoked when the registered resource URI is read. */\n callback: ResourceCallback<TUser, HasOAuth<TUser>>;\n}\n\n/** Parameterized resource definition and type-erased callback registry entry. */\ninterface ResourceTemplateEntry<TUser> {\n /** Declarative template metadata, including its URI template. */\n definition: ResourceTemplateDefinition;\n /** Template callback widened to store every inferred variable shape. */\n callback: ResourceTemplateCallback<\n Record<string, TemplateVariableValue>,\n TUser,\n HasOAuth<TUser>\n >;\n /** SDK callback map normalized once at author-time registration. */\n complete?: ReturnType<typeof normalizeCompletions>;\n}\n\n/** Prompt definition and type-erased callback retained for request-time replay. */\ninterface PromptEntry<TUser> {\n /** Declarative prompt metadata and optional argument schema. */\n definition: PromptDefinition;\n /** Prompt callback widened to store every inferred argument shape. */\n callback: PromptCallback<Record<string, unknown>, TUser, HasOAuth<TUser>>;\n}\n\n/** Node HTTP listener returned by `listen()`. */\ninterface NodeHttpListener {\n close(callback?: (error?: Error) => void): void;\n once(event: \"error\", listener: (error: unknown) => void): void;\n listen(port: number, hostname: string, callback?: () => void): NodeHttpServer;\n address(): { port: number } | string | null;\n}\n\nfunction omitRootSchemaDialect<T>(schema: T): T {\n if (\n typeof schema !== \"object\" ||\n schema === null ||\n Array.isArray(schema) ||\n !(\"$schema\" in schema)\n ) {\n return schema;\n }\n\n const emittedSchema = { ...schema } as T & Record<string, unknown>;\n delete emittedSchema[\"$schema\"];\n return emittedSchema;\n}\n\nfunction omitToolSchemaDialects(\n tools: McpMiddlewareResult<\"tools/list\">\n): McpMiddlewareResult<\"tools/list\"> {\n return tools.map((tool) => ({\n ...tool,\n inputSchema: omitRootSchemaDialect(tool.inputSchema),\n ...(tool.outputSchema === undefined\n ? {}\n : { outputSchema: omitRootSchemaDialect(tool.outputSchema) }),\n }));\n}\n\n/**\n * MCP server with declarative tool/resource/prompt registration, served\n * statelessly over a composed fetch handler.\n *\n * Registrations are stored in a registry; a fresh SDK `McpServer` is built\n * from it for every HTTP request (the stateless 2026-07-28 model), so\n * definition-time work must stay cheap — put pools and caches at module\n * scope, not inside callbacks' setup.\n *\n * @example\n * ```ts\n * const server = new MCPServer({ name: \"my-server\", version: \"1.0.0\" });\n * server.tool(\n * { name: \"add\", inputSchema: z.object({ a: z.number(), b: z.number() }) },\n * async ({ a, b }) => ({\n * content: [{ type: \"text\", text: String(a + b) }],\n * })\n * );\n * await server.listen(3000);\n * ```\n */\nexport class MCPServer<TUser = never> {\n readonly #config: ServerConfig<TUser>;\n readonly #branding: ReturnType<typeof normalizeServerBranding>;\n readonly #tools = new Map<string, ToolEntry<TUser>>();\n readonly #resources = new Map<string, ResourceEntry<TUser>>();\n readonly #resourceTemplates = new Map<string, ResourceTemplateEntry<TUser>>();\n readonly #prompts = new Map<string, PromptEntry<TUser>>();\n readonly #views = new Map<string, ViewManifestEntry>();\n /**\n * One-to-one tool→view bindings. Each view name maps to the single tool\n * that bound it; that tool's `view:` config is the sole source of\n * resource facts for the primed view resource.\n */\n readonly #viewBindings = new Map<\n string,\n {\n toolName: string;\n config: ToolViewConfig;\n }\n >();\n #viewsPrimed = false;\n /** When true, resource CSP emission includes the HMR websocket origin. */\n #viewsDevMode = false;\n /** Project root for filesystem-backed view bundle and public routes. */\n #viewsProjectRoot = process.cwd();\n\n #fetchHandler: FetchHandler | undefined;\n #handler: McpHttpHandler | undefined;\n #httpServer: NodeHttpListener | undefined;\n #oauthResource: URL | undefined;\n #oauthResourceResolved = false;\n #oauthResourceConfigurationAbsent = false;\n /** Whether the mounted app validates Host headers (fixed at first mount). */\n #hostValidated = false;\n readonly #mcpMiddlewares: McpMiddlewareEntry[] = [];\n readonly #mcpEventListeners: McpEventListenerEntry[] = [];\n /** Client instances created by {@link MCPServer.proxy} and owned by this server. */\n readonly #proxyOwners: Array<{ close(): Promise<void> }> = [];\n /** Proxy registrations that {@link close} must let finish before cleanup. */\n readonly #proxyOperations = new Set<Promise<void>>();\n /** Whether terminal shutdown has begun. */\n #closed = false;\n\n /**\n * Create an MCP server from a parsed, bundled OpenAPI document.\n *\n * Each included OpenAPI operation becomes a tool that validates its input,\n * calls the matching upstream HTTP endpoint, and returns the response using\n * the SDK's raw tool-result shape. External `$ref` values are not fetched;\n * bundle the document before passing it in.\n *\n * @param options - OpenAPI document, operation filters, upstream URL, and\n * request authentication options.\n * @returns An unauthenticated MCP server populated with generated tools.\n *\n * @example\n * ```ts\n * const spec = await fetch(\"https://api.example.com/openapi.json\")\n * .then((response) => response.json());\n * const server = MCPServer.fromOpenAPI({ spec });\n * await server.listen(3000);\n * ```\n */\n static fromOpenAPI(options: FromOpenAPIOptions): MCPServer {\n const server = new MCPServer({\n name: options.name ?? options.spec.info.title,\n version: options.version ?? options.spec.info.version ?? \"1.0.0\",\n });\n registerOpenAPITools(server, options);\n return server;\n }\n\n /**\n * Create a server. `config.name` and `config.version` identify the server\n * to clients during initialization. `config.basePath` (default `\"/mcp\"`)\n * is both the MCP route and the path of the OAuth protected-resource\n * identity, so any explicit OAuth resource URL must use that exact path.\n * Nothing binds or listens until {@link MCPServer.listen} or\n * {@link MCPServer.getHandler} is called.\n */\n constructor(config: ServerConfig<TUser>) {\n assertServerConfig(config);\n this.#config = config;\n this.#branding = normalizeServerBranding(config);\n if (config.oauth !== undefined) {\n const mcpUrl =\n typeof process === \"undefined\" ? undefined : process.env[\"MCP_URL\"];\n const resource = resolveConfiguredOAuthResource({\n provider: config.oauth,\n basePath: this.#basePath(),\n ...(mcpUrl !== undefined && { mcpUrl }),\n });\n this.#oauthResource = resource;\n this.#oauthResourceResolved = resource !== undefined;\n this.#oauthResourceConfigurationAbsent = resource === undefined;\n }\n }\n\n /**\n * The URL path prefix the MCP endpoint is mounted at.\n *\n * Reflects `config.basePath` (default `\"/mcp\"`). Exposed so tooling that\n * imports the entry module — `mcp-use dev`'s startup log, for example —\n * can build the endpoint and inspector URLs without assuming the default.\n */\n get basePath(): string {\n return this.#basePath();\n }\n\n /**\n * Immutable normalized branding shared by MCP identity and browser pages.\n *\n * `favicon` is the final source after explicit-favicon and icon-selection\n * precedence. Landing-page integrations can use this accessor and link to\n * the server's root-level `/favicon.ico` route without reading private\n * configuration or depending on the inspector/view layers.\n *\n * @example\n * ```ts\n * if (server.branding.favicon) {\n * console.log(\"Browser favicon: /favicon.ico\");\n * }\n * ```\n */\n get branding(): ServerBranding {\n return this.#branding;\n }\n\n /**\n * Register a tool. Input is validated against `inputSchema` before the callback\n * runs; results carrying `structuredContent` are type-checked against\n * `outputSchema` at the callback's return position.\n *\n * @returns A {@link ToolRef} carrying the tool name and phantom types for\n * inference-based view typing.\n */\n tool<const T extends ToolDefinition>(\n definition: T,\n callback: ToolCallback<\n InferToolInput<T>,\n InferToolOutput<T>,\n TUser,\n HasOAuth<TUser>\n >\n ): ToolRef<InferToolName<T>, InferToolInput<T>, InferToolOutput<T>> {\n this.#assertNotStarted(\"tool\", definition.name);\n this.#validateToolViewBinding(definition);\n this.#tools.set(definition.name, {\n definition,\n callback: callback as ToolCallback<\n Record<string, unknown>,\n never,\n TUser,\n HasOAuth<TUser>\n >,\n });\n return Object.freeze({\n name: definition.name,\n }) as ToolRef<InferToolName<T>, InferToolInput<T>, InferToolOutput<T>>;\n }\n\n /**\n * Prime the views registry from build/dev registry data.\n *\n * @param views - Registry map keyed by view directory name.\n * @param options - Priming options. When `dev` is true, resource CSP\n * emission appends the serving origin's websocket variant to\n * `connectDomains` so Vite HMR passes host-enforced CSP. Pass\n * `projectRoot` in dev so the `public/` route resolves against the user's\n * project directory rather than the CLI process cwd.\n * @throws If views are already primed, or after the server has started.\n *\n * @internal\n */\n [registerViews](\n views: ViewsManifest,\n options?: { dev?: boolean; projectRoot?: string }\n ): void {\n if (this.#viewsPrimed) {\n throw new Error(\n \"Cannot prime views: the views registry is already primed on this server instance.\"\n );\n }\n this.#assertNotStarted(\"views\", \"manifest\");\n this.#viewsDevMode = options?.dev === true;\n if (options?.projectRoot !== undefined) {\n this.#viewsProjectRoot = options.projectRoot;\n }\n for (const [name, entry] of Object.entries(views)) {\n this.#views.set(name, entry);\n }\n this.#viewsPrimed = true;\n }\n\n /**\n * Prime the views registry — string-keyed alias for {@link registerViews}\n * used by the CLI when the symbol export cannot be shared across duplicate\n * module copies (dev module runner with an externalized package).\n *\n * @param views - Manifest map keyed by view directory name.\n * @param options - Priming options forwarded to {@link registerViews}.\n * @throws If views are already primed, or after the server has started.\n *\n * @internal\n */\n __primeViews(\n views: ViewsManifest,\n options?: { dev?: boolean; projectRoot?: string }\n ): void {\n this[registerViews](views, options);\n }\n\n /** Register a static resource readable at `definition.uri`. */\n resource(\n definition: ResourceDefinition,\n callback: ResourceCallback<TUser, HasOAuth<TUser>>\n ): this {\n this.#assertNotStarted(\"resource\", definition.name);\n this.#resources.set(definition.name, { definition, callback });\n return this;\n }\n\n /**\n * Register a parameterized resource. Reads matching `uriTemplate` invoke\n * the callback with the extracted variables.\n *\n * The `const` type parameter keeps `uriTemplate` a string literal during\n * inference (plain generic inference widens object-literal properties to\n * `string`), which is what lets `InferTemplateParams` type the callback's\n * `params` from the template's variables.\n */\n resourceTemplate<const TUriTemplate extends string>(\n definition: ResourceTemplateDefinition<TUriTemplate>,\n callback: ResourceTemplateCallback<\n InferTemplateParams<{ uriTemplate: TUriTemplate }>,\n TUser,\n HasOAuth<TUser>\n >\n ): this {\n this.#assertNotStarted(\"resourceTemplate\", definition.name);\n const complete =\n definition.complete === undefined\n ? undefined\n : normalizeCompletions(definition.complete);\n this.#resourceTemplates.set(definition.name, {\n definition,\n ...(complete !== undefined && { complete }),\n callback: callback as ResourceTemplateCallback<\n Record<string, TemplateVariableValue>,\n TUser,\n HasOAuth<TUser>\n >,\n });\n return this;\n }\n\n /**\n * Register a prompt template. Schema fields wrapped with `completable()`\n * gain autocomplete via `completion/complete`.\n */\n prompt<T extends PromptDefinition>(\n definition: T,\n callback: PromptCallback<InferPromptInput<T>, TUser, HasOAuth<TUser>>\n ): this {\n this.#assertNotStarted(\"prompt\", definition.name);\n this.#prompts.set(definition.name, {\n definition,\n callback: callback as PromptCallback<\n Record<string, unknown>,\n TUser,\n HasOAuth<TUser>\n >,\n });\n return this;\n }\n\n /**\n * Compose upstream MCP servers into this server.\n *\n * A name-keyed HTTP config creates upstream connections through the optional\n * `@mcp-use/client` v2 peer. Each key automatically namespaces its mounted\n * tools, resources, and prompts. You may instead pass an existing ready\n * {@link ProxyConnection}; its negotiated server name becomes the namespace\n * and the connection remains caller-owned.\n *\n * Connection, introspection, and collision failures are diagnosed and\n * skipped without discarding capabilities that can be mounted.\n *\n * @param servers - Namespace-keyed upstream HTTP connection settings.\n * @throws If `@mcp-use/client` is not installed or the server already started\n * or closed.\n *\n * @example\n * ```ts\n * await server.proxy({\n * weather: {\n * url: \"https://weather.example.com/mcp\",\n * authToken: process.env.WEATHER_MCP_TOKEN,\n * },\n * });\n * ```\n */\n async proxy(servers: Record<string, ProxyServerConfig>): Promise<void>;\n /**\n * Mount an existing ready `@mcp-use/client` v2 connection.\n *\n * @param connection - Ready connection to introspect and forward through.\n * The connection's negotiated server name automatically namespaces every\n * mounted capability. Introspection and collision failures are diagnosed and\n * skipped without discarding capabilities that can be mounted.\n *\n * @throws If the server already started or closed.\n *\n * @example\n * ```ts\n * const connection = await client.connect(\"database\");\n * await server.proxy(connection);\n * ```\n */\n async proxy(connection: ProxyConnection): Promise<void>;\n async proxy(\n input: Record<string, ProxyServerConfig> | ProxyConnection\n ): Promise<void> {\n this.#assertOpen(\"proxy()\");\n const operation = (async (): Promise<void> => {\n const { isProxyConnection, mountProxyConnection, mountProxyServers } =\n await import(\"./mcp-proxy.js\");\n if (isProxyConnection(input)) {\n await mountProxyConnection(this.#proxyHost(), input);\n return;\n }\n await mountProxyServers(this.#proxyHost(), input);\n })();\n this.#proxyOperations.add(operation);\n try {\n await operation;\n } finally {\n this.#proxyOperations.delete(operation);\n }\n }\n\n /**\n * Web-standard request handler for the whole app (MCP endpoint included) —\n * usable directly on serverless/edge runtimes or in tests.\n *\n * The handler never binds a socket, so no Host/Origin validation applies\n * by default: DNS rebinding targets locally bound servers, and platform\n * edges (Vercel, Cloudflare, …) only route hostnames assigned to the\n * deployment. Set `allowedHosts`/`allowedOrigins` to opt into validation\n * (additive — localhost-class values stay allowed).\n *\n * Pass the same `bus` to multiple server instances when their handlers\n * replace one another while existing `subscriptions/listen` streams remain\n * open. The bus is fixed when this instance first mounts.\n *\n * @param options - Optional handler wiring.\n *\n * @example\n * ```ts\n * const handler = server.getHandler();\n * export default { fetch: handler };\n * ```\n */\n getHandler(options: { bus?: ServerEventBus } = {}): FrameworkHandler {\n this.#assertOpen(\"getHandler()\");\n const { fetch } = this.#ensureMounted(\"handler\", undefined, options.bus);\n return toFrameworkHandler(fetch);\n }\n\n /**\n * Node `(req, res) => void` handler for composing with an existing\n * `http.Server`. Uses the same internal `toNodeHandler` bridge as\n * {@link MCPServer.listen}; MCPServer users do not need to import\n * `mcp-use/node`.\n *\n * @example\n * ```ts\n * import { createServer } from \"node:http\";\n * const httpServer = createServer(await server.getNodeHandler());\n * httpServer.listen(3000);\n * ```\n */\n async getNodeHandler(): Promise<NodeRequestHandler> {\n const { fetch } = this.#ensureMounted(\"handler\");\n const { toNodeHandler } = await import(\"./node-bridge.js\");\n return toNodeHandler({ fetch });\n }\n\n /**\n * Register MCP operation middleware that intercepts JSON-RPC dispatch.\n *\n * Patterns use an `mcp:` prefix (for example `mcp:tools/call`, `mcp:*`).\n * Exact methods may transform their typed result. The global `mcp:*` pattern\n * is pass-through middleware. Middleware runs in registration order; call\n * `next()` to continue the chain.\n *\n * @example\n * ```ts\n * server.use(\"mcp:tools/call\", async (ctx, next) => {\n * console.log(`Calling tool: ${ctx.params.name}`);\n * return next();\n * });\n * ```\n */\n use<P extends McpMiddlewarePattern>(\n pattern: P,\n handler: McpMiddlewareFnFor<P>\n ): this {\n this.#assertNotStarted(\"middleware\", pattern);\n this.#mcpMiddlewares.push(createMcpMiddlewareEntry(pattern, handler));\n return this;\n }\n\n /**\n * Register a read-only MCP observer. Unlike {@link MCPServer.use}, listeners\n * cannot block, override, or mutate params. Throwing is logged and does not\n * fail the request.\n *\n * Append `:complete` to run after the handler (for example\n * `mcp:tools/call:complete`).\n *\n * @example\n * ```ts\n * server.on(\"mcp:tools/call\", (ctx) => {\n * metrics.increment(\"tools.call\", { tool: ctx.params.name });\n * });\n * ```\n */\n on<P extends McpEventPattern>(\n pattern: P,\n handler: McpEventListenerFnFor<P>\n ): this {\n this.#assertNotStarted(\"event listener\", pattern);\n this.#mcpEventListeners.push(createMcpEventListenerEntry(pattern, handler));\n return this;\n }\n\n /**\n * Publish a tools-list change to v2 clients with active subscriptions.\n *\n * @example\n * ```ts\n * await server.notifyToolsChanged();\n * ```\n */\n async notifyToolsChanged(): Promise<void> {\n await this.#ensureMounted(\"handler\").handler.notify.toolsChanged();\n }\n\n /**\n * Publish a prompts-list change to v2 clients with active subscriptions.\n *\n * @example\n * ```ts\n * await server.notifyPromptsChanged();\n * ```\n */\n async notifyPromptsChanged(): Promise<void> {\n await this.#ensureMounted(\"handler\").handler.notify.promptsChanged();\n }\n\n /**\n * Publish a resources-list change to v2 clients with active subscriptions.\n *\n * @example\n * ```ts\n * await server.notifyResourcesChanged();\n * ```\n */\n async notifyResourcesChanged(): Promise<void> {\n await this.#ensureMounted(\"handler\").handler.notify.resourcesChanged();\n }\n\n /**\n * Publish a resource update to subscribed v2 clients.\n *\n * @param uri - Resource URI whose representation changed.\n *\n * @example\n * ```ts\n * await server.notifyResourceUpdated(\"config://settings\");\n * ```\n */\n async notifyResourceUpdated(uri: string): Promise<void> {\n await this.#ensureMounted(\"handler\").handler.notify.resourceUpdated(uri);\n }\n\n /**\n * Serve over HTTP on Node. Pass port `0` for an ephemeral port.\n *\n * Binds `config.host` (default `127.0.0.1`). Localhost-class binds get\n * DNS-rebinding Host protection automatically. Origin validation is off\n * unless `allowedOrigins` is set. To serve publicly set `host: \"0.0.0.0\"`;\n * behind a platform edge that is all that's needed, and `allowedHosts`\n * restricts direct exposure (additive — localhost-class values stay allowed).\n *\n * With OAuth and no explicit resource or `MCP_URL`, a localhost listener\n * derives its protected-resource URL from the actual bound port. Mounting\n * therefore waits for the listener callback (especially for port `0`), and\n * requests accepted before then are queued. Public/wildcard listeners must\n * configure the resource before calling this method.\n *\n * @throws If called on a localhost-class bind after {@link MCPServer.getHandler}\n * already mounted the app without Host validation.\n */\n async listen(port = 3000): Promise<{ port: number; url: string }> {\n this.#assertOpen(\"listen()\");\n this.#assertListenOAuthConfiguration();\n const { createServer } = await import(\"node:http\");\n const { toNodeHandler } = await import(\"./node-bridge.js\");\n const host = this.#config.host ?? \"127.0.0.1\";\n\n return new Promise((resolve, reject) => {\n let resolveFetch: ((fetch: FetchHandler) => void) | undefined;\n let rejectFetch: ((error: unknown) => void) | undefined;\n const fetchReady = new Promise<FetchHandler>(\n (resolveFetchPromise, rejectFetchPromise) => {\n resolveFetch = resolveFetchPromise;\n rejectFetch = rejectFetchPromise;\n }\n );\n void fetchReady.catch(() => undefined);\n\n let settled = false;\n const rejectAndClose = (error: unknown) => {\n if (!settled) {\n settled = true;\n reject(error);\n }\n rejectFetch?.(error);\n void new Promise<void>((closeResolve) =>\n server.close(() => closeResolve())\n )\n .catch(() => undefined)\n .finally(() => {\n if (this.#httpServer === server) {\n this.#httpServer = undefined;\n }\n });\n };\n\n const nodeHandler = toNodeHandler({\n fetch: async (request) => (await fetchReady)(request),\n });\n const server = createServer((req, res) => {\n void nodeHandler(req, res);\n }) as NodeHttpListener;\n\n server.once(\"error\", rejectAndClose);\n server.listen(port, host, () => {\n try {\n const address = server.address();\n const boundPort =\n typeof address === \"object\" && address !== null\n ? address.port\n : port;\n const { fetch } = this.#ensureMounted(\"listen\", boundPort);\n resolveFetch?.(fetch);\n if (!settled) {\n settled = true;\n resolve({\n port: boundPort,\n url: `http://localhost:${boundPort}${this.#basePath()}`,\n });\n }\n } catch (error) {\n rejectAndClose(error);\n }\n });\n this.#httpServer = server;\n });\n }\n\n /**\n * Abort in-flight MCP exchanges and stop the HTTP listener.\n *\n * A closed server is done for good — the underlying MCP handler stays\n * closed, so `listen()`/`getHandler()` cannot revive it. Create a new\n * instance to serve again.\n */\n async close(): Promise<void> {\n this.#closed = true;\n await Promise.allSettled([...this.#proxyOperations]);\n\n const errors: unknown[] = [];\n const proxyOwners = this.#proxyOwners.splice(0);\n const ownerResults = await Promise.allSettled(\n proxyOwners.map((owner) => owner.close())\n );\n for (const result of ownerResults) {\n if (result.status === \"rejected\") errors.push(result.reason);\n }\n\n try {\n await this.#handler?.close();\n } catch (error) {\n errors.push(error);\n }\n const httpServer = this.#httpServer;\n if (httpServer !== undefined) {\n try {\n await new Promise<void>((resolve, reject) => {\n httpServer.close((err) => (err ? reject(err) : resolve()));\n });\n this.#httpServer = undefined;\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length > 0) {\n throw new AggregateError(errors, \"Failed to close MCP server cleanly\");\n }\n }\n\n #assertOpen(operation?: string): void {\n if (!this.#closed) return;\n if (operation !== undefined) {\n throw new Error(`Cannot call ${operation} after the server has closed.`);\n }\n throw new Error(\"Cannot use the server after it has closed.\");\n }\n\n #basePath(): string {\n return this.#config.basePath ?? \"/mcp\";\n }\n\n #resolveOAuthResource(\n mode: \"listen\" | \"handler\",\n listenPort?: number\n ): URL | undefined {\n if (this.#config.oauth === undefined) {\n return undefined;\n }\n if (this.#oauthResourceResolved) {\n return this.#oauthResource;\n }\n\n const host = this.#config.host ?? \"127.0.0.1\";\n const localListen =\n mode === \"listen\" &&\n listenPort !== undefined &&\n [\"127.0.0.1\", \"localhost\", \"::1\"].includes(host);\n if (this.#oauthResourceConfigurationAbsent && localListen) {\n this.#oauthResource = resolveLocalOAuthResource(\n `http://localhost:${listenPort}`,\n this.#basePath()\n );\n this.#oauthResourceResolved = true;\n return this.#oauthResource;\n }\n\n throw new Error(\n \"OAuth requires an explicit resource or MCP_URL when using getHandler() or listening on a non-local host\"\n );\n }\n\n #assertListenOAuthConfiguration(): void {\n if (this.#config.oauth === undefined) {\n return;\n }\n const host = this.#config.host ?? \"127.0.0.1\";\n if ([\"127.0.0.1\", \"localhost\", \"::1\"].includes(host)) {\n return;\n }\n if (!this.#oauthResourceResolved) {\n // Public/wildcard listeners have no stable local fallback. Their\n // configured resource was already validated during construction.\n throw new Error(\n \"OAuth listen() on a public or wildcard host requires an explicit provider resource or valid MCP_URL.\"\n );\n }\n }\n\n #assertNotStarted(kind: string, name: string): void {\n if (this.#handler !== undefined) {\n throw new Error(\n `Cannot register ${kind} \"${name}\" after the server has started: ` +\n `registrations are replayed per request from the registry, ` +\n `so register everything before listen()/getHandler().`\n );\n }\n }\n\n #proxyHost(): ProxyMountHost {\n return {\n isStarted: () => this.#handler !== undefined,\n hasTool: (name) => this.#tools.has(name),\n hasResource: (name) => this.#resources.has(name),\n hasPrompt: (name) => this.#prompts.has(name),\n registerTool: (definition, callback) => {\n this.#assertNotStarted(\"tool\", definition.name);\n this.#tools.set(definition.name, {\n definition,\n callback: callback as ToolCallback<\n Record<string, unknown>,\n never,\n TUser,\n HasOAuth<TUser>\n >,\n });\n },\n registerResource: (definition, callback) => {\n this.#assertNotStarted(\"resource\", definition.name);\n this.#resources.set(definition.name, {\n definition,\n callback: callback as ResourceCallback<TUser, HasOAuth<TUser>>,\n });\n },\n registerPrompt: (definition, callback) => {\n this.#assertNotStarted(\"prompt\", definition.name);\n this.#prompts.set(definition.name, {\n definition,\n callback: callback as PromptCallback<\n Record<string, unknown>,\n TUser,\n HasOAuth<TUser>\n >,\n });\n },\n trackOwner: (owner) => {\n this.#proxyOwners.push(owner);\n },\n };\n }\n\n /**\n * Effective Host/Origin allowlists for a mount mode; `undefined` means the\n * corresponding validation is off.\n *\n * Configured lists are additive to the localhost-class allowlists, so local\n * runs keep working when a deployment hostname is added. With nothing\n * configured, `listen()` on a localhost-class bind validates Host against the\n * localhost lists (the DNS-rebinding threat model), while `getHandler()` —\n * which never binds — applies no validation. Origin validation is off unless\n * `allowedOrigins` is set explicitly (SDK-aligned: the handler is open by\n * default). When enabled, Origin is checked only on non-GET/HEAD requests.\n */\n #validationPolicy(mode: \"listen\" | \"handler\"): {\n hosts: string[] | undefined;\n origins: string[] | undefined;\n } {\n const { host = \"127.0.0.1\", allowedHosts, allowedOrigins } = this.#config;\n const localhostBind = [\"127.0.0.1\", \"localhost\", \"::1\"].includes(host);\n const hosts =\n allowedHosts !== undefined\n ? [...new Set([...localhostAllowedHostnames(), ...allowedHosts])]\n : mode === \"listen\" && localhostBind\n ? localhostAllowedHostnames()\n : undefined;\n const origins =\n allowedOrigins !== undefined\n ? [...new Set([...localhostAllowedOrigins(), ...allowedOrigins])]\n : undefined;\n return { hosts, origins };\n }\n\n #ensureMounted(\n mode: \"listen\" | \"handler\",\n listenPort?: number,\n bus?: ServerEventBus\n ): {\n fetch: FetchHandler;\n handler: McpHttpHandler;\n } {\n this.#assertOpen();\n if (this.#fetchHandler === undefined || this.#handler === undefined) {\n const { hosts, origins } = this.#validationPolicy(mode);\n const basePath = this.#basePath();\n const nestedBasePath = basePath === \"/\" ? \"\" : basePath;\n const middlewares = [\n jsonBodyMiddleware(),\n requestLogger(this.#config.logging),\n ];\n\n const corsConfig = this.#config.cors;\n if (corsConfig !== undefined) {\n middlewares.unshift(corsFetchMiddleware(corsConfig));\n }\n const deferViewCors = isGlobalCorsEnabled(corsConfig);\n\n if (hosts !== undefined) {\n middlewares.unshift(hostValidationMiddleware(hosts));\n }\n if (origins !== undefined) {\n middlewares.push(originValidationMiddleware(origins));\n }\n if (hosts === undefined) {\n if (mode === \"listen\") {\n console.warn(\n `[mcp-use] listen() is serving on ${this.#config.host} without ` +\n `Host validation. Behind a platform edge that only routes your ` +\n `own domains this is expected; if this process is reachable ` +\n `directly, set allowedHosts to restrict it.`\n );\n }\n }\n\n this.#validateViewBindingsAtMount();\n\n const resource = this.#resolveOAuthResource(mode, listenPort);\n if (resource !== undefined) {\n const provider = this.#config.oauth!;\n middlewares.push(oauthMetadata(provider, resource));\n }\n\n const { handler, fetch: mcpFetch } = createMcpMount(\n (ctx) => this.#buildSdkServer(ctx),\n {\n path: basePath,\n ...((this.#config.legacy !== undefined || bus !== undefined) && {\n handler: {\n ...(this.#config.legacy !== undefined && {\n legacy: this.#config.legacy,\n }),\n ...(bus !== undefined && { bus }),\n },\n }),\n ...(resource !== undefined && {\n authInfo: (request) => authInfoFromRequest(request),\n }),\n }\n );\n\n let protectWithBearer: (\n request: Request,\n next: () => Promise<Response>\n ) => Promise<Response> = async (_request, next) => next();\n if (resource !== undefined) {\n const provider = this.#config.oauth!;\n const providerOptions = getOAuthProviderOptions(provider);\n const gate = requireBearerAuth({\n verifier: wrapOAuthTokenVerifier(provider, resource),\n resourceMetadataUrl: getOAuthProtectedResourceMetadataUrl(resource),\n ...(providerOptions.requiredScopes !== undefined && {\n requiredScopes: providerOptions.requiredScopes,\n }),\n });\n protectWithBearer = async (request, next) => {\n const result = await gate(request);\n if (result instanceof Response) {\n return result;\n }\n const bag = getRequestBag(request);\n bag.authInfo = result;\n return next();\n };\n }\n\n const mcpRouteHandler: FetchHandler = (request) =>\n protectWithBearer(request, () => mcpFetch(request));\n const endpointHandler: FetchHandler = async (request) => {\n if (!isHtmlNavigationRequest(request)) {\n return mcpRouteHandler(request);\n }\n const respond = async (): Promise<Response> => {\n const { createLandingPageResponse } =\n await import(\"./landing-handler.js\");\n return createLandingPageResponse(\n request,\n basePath,\n this.#config,\n this.#branding,\n this.#tools.values(),\n this.#prompts.values(),\n this.#resources.values()\n );\n };\n if (resource !== undefined && this.#config.publicLandingPage !== true) {\n return protectWithBearer(request, respond);\n }\n return respond();\n };\n\n const routes: Array<{\n match: (request: Request) => boolean;\n handler: FetchHandler;\n }> = [];\n\n const brandingDevMode = this.#viewsPrimed\n ? this.#viewsDevMode\n : process.env[\"NODE_ENV\"] !== \"production\";\n const faviconHandler = createFaviconHandler(this.#branding, {\n dev: brandingDevMode,\n projectRoot: this.#viewsProjectRoot,\n deferCors: deferViewCors,\n });\n if (faviconHandler !== undefined) {\n routes.push({\n match: (request) => new URL(request.url).pathname === \"/favicon.ico\",\n handler: faviconHandler,\n });\n }\n\n const viewHandler = createViewPublicHandler(basePath, this.#views, {\n dev: this.#viewsPrimed ? this.#viewsDevMode : brandingDevMode,\n projectRoot: this.#viewsProjectRoot,\n enabled: hasLocalBrandingAsset(this.#branding),\n deferCors: deferViewCors,\n });\n if (viewHandler !== undefined) {\n routes.push({\n match: (request) =>\n request.method === \"GET\" || request.method === \"HEAD\"\n ? new URL(request.url).pathname.startsWith(\n `${nestedBasePath}/_mcp-use/public/`\n )\n : false,\n handler: viewHandler,\n });\n }\n\n if (!this.#viewsDevMode) {\n const viewAssetsHandler = createViewAssetsHandler(\n basePath,\n this.#views,\n { projectRoot: this.#viewsProjectRoot, deferCors: deferViewCors }\n );\n if (viewAssetsHandler !== undefined) {\n routes.push({\n match: (request) =>\n request.method === \"GET\" || request.method === \"HEAD\"\n ? new URL(request.url).pathname.startsWith(\n `${nestedBasePath}/_mcp-use/views/`\n )\n : false,\n handler: viewAssetsHandler,\n });\n }\n }\n\n const inspectorHandler = createInspectorHandler(this.#config.inspector, {\n serverName: this.#config.name,\n basePath,\n ...(faviconHandler !== undefined && {\n faviconHref: \"/favicon.ico\",\n ...(this.#branding.faviconMimeType !== undefined && {\n faviconType: this.#branding.faviconMimeType,\n }),\n }),\n });\n if (inspectorHandler !== undefined) {\n routes.push({\n match: (request) => {\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n return false;\n }\n const pathname = new URL(request.url).pathname;\n return matchesInspectorShellPath(pathname, basePath);\n },\n handler: inspectorHandler,\n });\n }\n\n routes.push({\n match: (request) => matchesPath(request, basePath),\n handler: endpointHandler,\n });\n\n const terminal = routeFetch(routes);\n this.#fetchHandler = composeFetch(terminal, ...middlewares);\n this.#handler = handler;\n this.#hostValidated = hosts !== undefined;\n } else if (bus !== undefined && this.#handler.bus !== bus) {\n throw new Error(\n \"Cannot change the MCP event bus after the server has started.\"\n );\n } else if (\n mode === \"listen\" &&\n !this.#hostValidated &&\n this.#validationPolicy(\"listen\").hosts !== undefined\n ) {\n throw new Error(\n \"Cannot listen() on a localhost bind after getHandler(): the app is \" +\n \"already mounted without Host validation (getHandler() expects a \" +\n \"platform edge in front). Call listen() first, or set allowedHosts.\"\n );\n }\n return { fetch: this.#fetchHandler, handler: this.#handler };\n }\n\n #validateToolViewBinding(definition: ToolDefinition): void {\n const view = definition.view;\n if (view === undefined) {\n return;\n }\n if (definition.outputSchema === undefined) {\n throw new Error(\n `Tool \"${definition.name}\" declares view \"${view.name}\" but has no outputSchema. ` +\n `View-bound tools require an outputSchema — the view reads structuredContent typed from it. ` +\n `Use outputSchema: z.object({}) for a view that takes no structured output.`\n );\n }\n\n const existing = this.#viewBindings.get(view.name);\n if (existing !== undefined) {\n throw new Error(\n `View \"${view.name}\" is already bound to tool \"${existing.toolName}\"; ` +\n `tool \"${definition.name}\" cannot bind the same view. ` +\n `Each view may be bound to one tool.`\n );\n }\n\n this.#viewBindings.set(view.name, {\n toolName: definition.name,\n config: view,\n });\n }\n\n #validateViewBindingsAtMount(): void {\n if (this.#viewBindings.size > 0 && !this.#viewsPrimed) {\n const first = [...this.#tools.values()].find(\n (entry) => entry.definition.view !== undefined\n );\n const viewName = first?.definition.view?.name ?? \"unknown\";\n throw new Error(\n `Tool \"${first?.definition.name ?? \"unknown\"}\" is bound to view \"${viewName}\" ` +\n `but no views were primed. Run \\`mcp-use build\\` and deploy the built entry, ` +\n `or in dev let the CLI prime views automatically.`\n );\n }\n\n for (const entry of this.#tools.values()) {\n const viewName = entry.definition.view?.name;\n if (viewName !== undefined && !this.#views.has(viewName)) {\n throw new Error(\n `Tool \"${entry.definition.name}\" is bound to view \"${viewName}\" ` +\n `which is not in the primed views registry. Run \\`mcp-use build\\` ` +\n `and deploy the built entry, or in dev let the CLI prime views automatically.`\n );\n }\n }\n\n for (const viewName of this.#views.keys()) {\n if (!this.#viewBindings.has(viewName)) {\n console.warn(\n `[mcp-use] View \"${viewName}\" is registered but no tool binds it.`\n );\n }\n }\n }\n\n /** Build a fresh SDK server from the registry (runs once per request). */\n #buildSdkServer(ctx: McpRequestContext): SdkMcpServer {\n const { name, version, title, description, instructions } = this.#config;\n const authInfo = ctx.authInfo;\n const server = new SdkMcpServer(\n {\n name,\n version,\n ...(title !== undefined && { title }),\n ...(description !== undefined && { description }),\n ...(this.#branding.websiteUrl !== undefined && {\n websiteUrl: this.#branding.websiteUrl,\n }),\n ...(this.#branding.icons !== undefined && {\n icons: resolveImplementationIcons(\n this.#branding.icons,\n ctx.requestInfo,\n this.#basePath()\n ),\n }),\n },\n {\n capabilities: {\n logging: {},\n tools: { listChanged: true },\n prompts: { listChanged: true },\n resources: { listChanged: true, subscribe: true },\n },\n ...(instructions !== undefined && { instructions }),\n ...(authInfo !== undefined && { authInfo }),\n ...(this.#config.requestState !== undefined && {\n requestState: this.#config.requestState,\n }),\n }\n );\n\n const request = ctx.requestInfo;\n const viewMetaOptions =\n request !== undefined\n ? { request, hmrWs: this.#viewsDevMode }\n : { hmrWs: this.#viewsDevMode };\n const basePath = this.#basePath();\n\n for (const entry of this.#tools.values()) {\n this.#registerTool(server, entry);\n }\n for (const entry of this.#resources.values()) {\n this.#registerResource(server, entry);\n }\n for (const entry of this.#resourceTemplates.values()) {\n this.#registerResourceTemplate(server, entry);\n }\n for (const entry of this.#prompts.values()) {\n this.#registerPrompt(server, entry);\n }\n for (const [viewName, viewEntry] of this.#views.entries()) {\n this.#registerViewResource(\n server,\n viewName,\n viewEntry,\n viewMetaOptions,\n basePath\n );\n }\n this.#wrapListHandlers(server);\n return server;\n }\n\n #createMiddlewareContext<M extends McpMiddlewareMethod>(\n method: M,\n params: MiddlewareContext<M>[\"params\"],\n ctx: ServerContext\n ): MiddlewareContext<M> {\n return {\n method,\n params,\n ...(ctx.http?.req !== undefined && { request: ctx.http.req }),\n ...(ctx.sessionId !== undefined && {\n session: { sessionId: ctx.sessionId },\n }),\n ...(ctx.http?.authInfo !== undefined && { auth: ctx.http.authInfo }),\n state: new Map(),\n } as MiddlewareContext<M>;\n }\n\n #runMcpHook<M extends McpMiddlewareMethod>(\n method: M,\n ctx: MiddlewareContext<M>,\n innerFn: () => Promise<McpMiddlewareResult<M>>\n ): Promise<McpMiddlewareResult<M>> {\n return runMcpOperation(\n this.#mcpMiddlewares,\n this.#mcpEventListeners,\n method,\n ctx,\n innerFn\n );\n }\n\n /**\n * Wrap native SDK list handlers with the MCP middleware chain.\n *\n * ponytail: uses SDK-private `_requestHandlers`; pin compile-time test.\n *\n * @internal\n */\n #wrapListHandlers(server: SdkMcpServer): void {\n type RequestHandler = (\n request: unknown,\n extra: unknown\n ) => Promise<unknown>;\n const handlers = (\n server.server as unknown as {\n _requestHandlers?: Map<string, RequestHandler>;\n }\n )._requestHandlers;\n if (handlers === undefined) {\n return;\n }\n\n type ListMethod = \"tools/list\" | \"resources/list\" | \"prompts/list\";\n type ListResultKey<M extends ListMethod> = M extends \"tools/list\"\n ? \"tools\"\n : M extends \"resources/list\"\n ? \"resources\"\n : \"prompts\";\n\n const wrapListMethod = <M extends ListMethod>(\n method: M,\n resultKey: ListResultKey<NoInfer<M>>,\n transform?: (\n items: McpMiddlewareResult<NoInfer<M>>\n ) => McpMiddlewareResult<NoInfer<M>>\n ) => {\n const original = handlers.get(method);\n if (original === undefined) {\n return;\n }\n if ((original as { __mcpListWrapped?: boolean }).__mcpListWrapped) {\n return;\n }\n\n const wrapped = async (request: unknown, extra: unknown) => {\n const serverContext = extra as ServerContext;\n const params =\n (request as { params?: MiddlewareContext<M>[\"params\"] }).params ??\n ({} as MiddlewareContext<M>[\"params\"]);\n const mwCtx = this.#createMiddlewareContext(\n method,\n params,\n serverContext\n );\n let originalEnvelope: Record<string, unknown> | undefined;\n const innerFn = async (): Promise<McpMiddlewareResult<M>> => {\n const downstreamRequest = withMcpMiddlewareParams<M>(\n request,\n mwCtx.params\n );\n const result = await original(downstreamRequest, extra);\n if (typeof result !== \"object\" || result === null) {\n throw new TypeError(\n `[mcp-use] ${method} handler returned a non-object result`\n );\n }\n originalEnvelope = result as Record<string, unknown>;\n const items = originalEnvelope[resultKey];\n if (!Array.isArray(items)) {\n throw new TypeError(\n `[mcp-use] ${method} handler result is missing a ${resultKey} array`\n );\n }\n return items as McpMiddlewareResult<M>;\n };\n const filtered = await this.#runMcpHook(method, mwCtx, innerFn);\n if (!Array.isArray(filtered)) {\n throw new TypeError(\n `[mcp-use] ${method} middleware must return a ${resultKey} array`\n );\n }\n const emitted = transform?.(filtered) ?? filtered;\n return {\n ...originalEnvelope,\n [resultKey]: emitted,\n };\n };\n (wrapped as { __mcpListWrapped?: boolean }).__mcpListWrapped = true;\n handlers.set(method, wrapped);\n };\n\n wrapListMethod(\"tools/list\", \"tools\", omitToolSchemaDialects);\n wrapListMethod(\"resources/list\", \"resources\");\n wrapListMethod(\"prompts/list\", \"prompts\");\n }\n\n #registerTool(\n server: SdkMcpServer,\n { definition, callback }: ToolEntry<TUser>\n ): void {\n const view = definition.view;\n\n const toolMeta = buildToolUiMeta(\n view?.name,\n definition.visibility,\n definition._meta\n );\n const config = {\n ...(definition.title !== undefined && { title: definition.title }),\n ...(definition.description !== undefined && {\n description: definition.description,\n }),\n ...(definition.annotations !== undefined && {\n annotations: definition.annotations,\n }),\n ...(definition.outputSchema !== undefined && {\n outputSchema: definition.outputSchema,\n }),\n ...(toolMeta !== undefined && { _meta: toolMeta }),\n };\n const wireResultMeta =\n view !== undefined ? buildToolResultUiMeta(view.name) : undefined;\n\n const inputSchema = resolveToolInputSchema(definition);\n\n const invokeTool = async (\n args: Record<string, unknown>,\n ctx: ServerContext\n ) => {\n const mwCtx = this.#createMiddlewareContext(\n \"tools/call\",\n {\n name: definition.name,\n arguments: args,\n ...(ctx.mcpReq._meta !== undefined && { _meta: ctx.mcpReq._meta }),\n },\n ctx\n );\n const innerFn = async () => {\n const effectiveArgs = (mwCtx.params.arguments ?? {}) as Record<\n string,\n unknown\n >;\n const result = await callback(\n effectiveArgs,\n this.#toRequestContext(ctx)\n );\n if (\n isInputRequiredResult(result) ||\n wireResultMeta === undefined ||\n result.isError === true\n ) {\n return result;\n }\n return {\n ...result,\n _meta: { ...result._meta, ...wireResultMeta },\n };\n };\n return (await this.#runMcpHook(\"tools/call\", mwCtx, innerFn)) as Awaited<\n ReturnType<typeof callback>\n >;\n };\n\n if (inputSchema !== undefined) {\n server.registerTool(\n definition.name,\n { ...config, inputSchema },\n async (args, ctx) => invokeTool(args as Record<string, unknown>, ctx)\n );\n } else {\n server.registerTool(definition.name, config, async (ctx) =>\n invokeTool({}, ctx)\n );\n }\n }\n\n #registerViewResource(\n server: SdkMcpServer,\n viewName: string,\n entry: ViewManifestEntry,\n metaOptions: { request?: Request; hmrWs?: boolean },\n basePath: string\n ): void {\n const uri = viewResourceUri(viewName);\n const authorFacts = this.#viewResourceFacts(\n this.#viewBindings.get(viewName)?.config\n );\n const resourceConfig = viewResourceConfig(\n viewName,\n entry,\n authorFacts,\n metaOptions\n );\n server.registerResource(\n viewName,\n uri,\n resourceConfig,\n async (readUri, ctx) => {\n const req = ctx.http?.req;\n const readOptions: BuildResourceUiMetaOptions =\n req !== undefined\n ? {\n request: req,\n ...(metaOptions.hmrWs === true ? { hmrWs: true } : {}),\n }\n : metaOptions.hmrWs === true\n ? { hmrWs: true }\n : {};\n const assetsBase =\n req !== undefined\n ? resolveAssetsBase(req)\n : metaOptions.request !== undefined\n ? resolveAssetsBase(metaOptions.request)\n : \"\";\n const html = synthesizeViewDocument(\n entry,\n assetsBase,\n basePath,\n viewName\n );\n return {\n contents: [\n {\n uri: readUri.href,\n mimeType: resourceConfig.mimeType,\n text: html,\n _meta: buildResourceUiMeta(authorFacts, readOptions),\n },\n ],\n };\n }\n );\n }\n\n #registerResource(\n server: SdkMcpServer,\n { definition, callback }: ResourceEntry<TUser>\n ): void {\n server.registerResource(\n definition.name,\n definition.uri,\n {\n ...(definition.title !== undefined && { title: definition.title }),\n ...(definition.description !== undefined && {\n description: definition.description,\n }),\n ...(definition.mimeType !== undefined && {\n mimeType: definition.mimeType,\n }),\n ...(definition.annotations !== undefined && {\n annotations: definition.annotations,\n }),\n ...(definition._meta !== undefined && {\n _meta: { ...definition._meta },\n }),\n },\n async (uri, ctx) => {\n const mwCtx = this.#createMiddlewareContext(\n \"resources/read\",\n {\n uri: uri.href,\n ...(ctx.mcpReq._meta !== undefined && { _meta: ctx.mcpReq._meta }),\n },\n ctx\n );\n const innerFn = async () => callback(uri, this.#toRequestContext(ctx));\n return (await this.#runMcpHook(\n \"resources/read\",\n mwCtx,\n innerFn\n )) as Awaited<ReturnType<typeof callback>>;\n }\n );\n }\n\n #registerResourceTemplate(\n server: SdkMcpServer,\n { definition, callback, complete }: ResourceTemplateEntry<TUser>\n ): void {\n const template = new ResourceTemplate(definition.uriTemplate, {\n list: undefined,\n ...(complete !== undefined && { complete }),\n });\n server.registerResource(\n definition.name,\n template,\n {\n ...(definition.title !== undefined && { title: definition.title }),\n ...(definition.description !== undefined && {\n description: definition.description,\n }),\n ...(definition.mimeType !== undefined && {\n mimeType: definition.mimeType,\n }),\n ...(definition.annotations !== undefined && {\n annotations: definition.annotations,\n }),\n ...(definition._meta !== undefined && {\n _meta: { ...definition._meta },\n }),\n },\n async (uri, variables, ctx) => {\n const mwCtx = this.#createMiddlewareContext(\n \"resources/read\",\n {\n uri: uri.href,\n ...(ctx.mcpReq._meta !== undefined && { _meta: ctx.mcpReq._meta }),\n },\n ctx\n );\n const innerFn = async () =>\n callback(\n uri,\n variables as Record<string, TemplateVariableValue>,\n this.#toRequestContext(ctx)\n );\n return (await this.#runMcpHook(\n \"resources/read\",\n mwCtx,\n innerFn\n )) as Awaited<ReturnType<typeof callback>>;\n }\n );\n }\n\n #viewResourceFacts(\n viewConfig: ToolViewConfig | undefined\n ): ViewResourceFacts | undefined {\n if (viewConfig === undefined) {\n return undefined;\n }\n return {\n ...(viewConfig.description !== undefined && {\n description: viewConfig.description,\n }),\n ...(viewConfig.csp !== undefined && { csp: viewConfig.csp }),\n ...(viewConfig.permissions !== undefined && {\n permissions: viewConfig.permissions,\n }),\n ...(viewConfig.domain !== undefined && { domain: viewConfig.domain }),\n ...(viewConfig.prefersBorder !== undefined && {\n prefersBorder: viewConfig.prefersBorder,\n }),\n };\n }\n\n #registerPrompt(\n server: SdkMcpServer,\n { definition, callback }: PromptEntry<TUser>\n ): void {\n const config = {\n ...(definition.title !== undefined && { title: definition.title }),\n ...(definition.description !== undefined && {\n description: definition.description,\n }),\n };\n const invokePrompt = async (\n args: Record<string, unknown>,\n ctx: ServerContext\n ) => {\n const mwCtx = this.#createMiddlewareContext(\n \"prompts/get\",\n {\n name: definition.name,\n arguments: args as Record<string, string>,\n ...(ctx.mcpReq._meta !== undefined && { _meta: ctx.mcpReq._meta }),\n },\n ctx\n );\n const innerFn = async () => {\n const effectiveArgs = (mwCtx.params.arguments ?? {}) as Record<\n string,\n unknown\n >;\n return callback(effectiveArgs, this.#toRequestContext(ctx));\n };\n return (await this.#runMcpHook(\"prompts/get\", mwCtx, innerFn)) as Awaited<\n ReturnType<typeof callback>\n >;\n };\n\n if (definition.schema !== undefined) {\n server.registerPrompt(\n definition.name,\n { ...config, argsSchema: definition.schema },\n async (args, ctx) => invokePrompt(args as Record<string, unknown>, ctx)\n );\n } else {\n const handler = async (ctx: ServerContext) => invokePrompt({}, ctx);\n server.registerPrompt(\n definition.name,\n config,\n handler as unknown as SdkPromptCallback<StandardSchemaWithJSON>\n );\n }\n }\n\n #toRequestContext(\n ctx: ServerContext\n ): RequestContext<TUser, HasOAuth<TUser>> {\n if (this.#config.oauth === undefined) {\n return toRequestContext(ctx) as RequestContext<TUser, HasOAuth<TUser>>;\n }\n return toAuthenticatedRequestContext<TUser>(ctx) as RequestContext<\n TUser,\n HasOAuth<TUser>\n >;\n }\n}\n","import type { Icon } from \"@modelcontextprotocol/server\";\n\nimport type { FetchHandler } from \"./fetch-app.js\";\nimport { resolveAssetsBase } from \"./views/origin.js\";\nimport {\n resolvePublicFilePath,\n servePublicFile,\n} from \"./views/public-route.js\";\n\nconst FAVICON_CACHE_CONTROL = \"public, max-age=31536000, immutable\";\nconst FAVICON_REDIRECT_CACHE_CONTROL = \"public, max-age=300\";\n\n/** Normalized server branding shared by browser and MCP identity surfaces. */\nexport interface ServerBranding {\n /**\n * Source selected for `/favicon.ico`, after applying explicit-favicon and\n * first-icon inference.\n */\n readonly favicon?: string;\n /** MIME type of the selected favicon when known. */\n readonly faviconMimeType?: string;\n /** Icons reported in MCP implementation metadata, in author order. */\n readonly icons?: readonly Icon[];\n /** Server website reported in MCP implementation metadata. */\n readonly websiteUrl?: string;\n}\n\nfunction protocolOf(value: string): string | undefined {\n const match = /^([a-z][a-z\\d+.-]*):/i.exec(value);\n return match?.[1]?.toLowerCase();\n}\n\nfunction publicAssetPath(basePath: string, source: string): string {\n const prefix = basePath === \"/\" ? \"\" : basePath;\n return `${prefix}/_mcp-use/public/${source\n .split(\"/\")\n .map((segment) => encodeURIComponent(segment))\n .join(\"/\")}`;\n}\n\nfunction isLocalPublicSource(source: string): boolean {\n return protocolOf(source) === undefined;\n}\n\n/**\n * Select the browser favicon from an ordered set of MCP icons.\n *\n * Uses the first icon in author order. Put the preferred browser favicon\n * first, or set {@link ServerConfig.favicon} explicitly.\n *\n * @param icons - Validated, non-empty icon list.\n * @returns The selected icon.\n *\n * @internal\n */\nexport function selectFaviconFromIcons(\n icons: readonly Icon[]\n): Icon | undefined {\n return icons[0];\n}\n\nfunction assertLocalPublicSource(source: string, field: string): void {\n if (\n source.startsWith(\"/\") ||\n source.includes(\"\\\\\") ||\n source.includes(\"?\") ||\n source.includes(\"#\") ||\n source.split(\"/\").some((segment) => segment === \"\" || segment === \"..\")\n ) {\n throw new TypeError(\n `${field} must be an http(s) URL, image data URL, or safe path relative to public/`\n );\n }\n}\n\ninterface ParsedDataImage {\n readonly bytes: Uint8Array<ArrayBuffer>;\n readonly mimeType: string;\n}\n\nfunction parseDataImage(source: string, field: string): ParsedDataImage {\n const comma = source.indexOf(\",\");\n if (comma < 0) {\n throw new TypeError(`${field} must be a valid image data URL`);\n }\n const metadata = source.slice(5, comma);\n const payload = source.slice(comma + 1);\n const parts = metadata.split(\";\");\n const mimeType = parts[0]?.toLowerCase() ?? \"\";\n if (!mimeType.startsWith(\"image/\")) {\n throw new TypeError(`${field} data URL must use an image MIME type`);\n }\n try {\n if (parts.includes(\"base64\")) {\n const binary = atob(payload);\n return {\n mimeType,\n bytes: Uint8Array.from(binary, (character) => character.charCodeAt(0)),\n };\n }\n return {\n mimeType,\n bytes: new TextEncoder().encode(decodeURIComponent(payload)),\n };\n } catch {\n throw new TypeError(`${field} must be a valid image data URL`);\n }\n}\n\nfunction assertBrandingSource(source: unknown, field: string): string {\n if (typeof source !== \"string\" || source.length === 0) {\n throw new TypeError(`${field} must be a non-empty string`);\n }\n const protocol = protocolOf(source);\n if (protocol === undefined) {\n assertLocalPublicSource(source, field);\n return source;\n }\n if (protocol === \"data\") {\n parseDataImage(source, field);\n return source;\n }\n if (protocol !== \"http\" && protocol !== \"https\") {\n throw new TypeError(\n `${field} must be an http(s) URL, image data URL, or safe path relative to public/`\n );\n }\n try {\n new URL(source);\n } catch {\n throw new TypeError(`${field} must be a valid absolute http(s) URL`);\n }\n return source;\n}\n\n/**\n * Validate and freeze the branding fields from server configuration.\n *\n * @param config - Untyped-compatible branding input.\n * @returns Immutable normalized branding and the selected favicon MIME type.\n *\n * @internal\n */\nexport function normalizeServerBranding(config: {\n favicon?: unknown;\n icons?: unknown;\n websiteUrl?: unknown;\n}): ServerBranding {\n let websiteUrl: string | undefined;\n if (config.websiteUrl !== undefined) {\n if (\n typeof config.websiteUrl !== \"string\" ||\n config.websiteUrl.length === 0\n ) {\n throw new TypeError(\n \"websiteUrl must be a non-empty absolute http(s) URL\"\n );\n }\n let parsed: URL;\n try {\n parsed = new URL(config.websiteUrl);\n } catch {\n throw new TypeError(\n \"websiteUrl must be a non-empty absolute http(s) URL\"\n );\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new TypeError(\n \"websiteUrl must be a non-empty absolute http(s) URL\"\n );\n }\n websiteUrl = config.websiteUrl;\n }\n\n let icons: readonly Icon[] | undefined;\n if (config.icons !== undefined) {\n if (!Array.isArray(config.icons)) {\n throw new TypeError(\"icons must be an array of MCP Icon objects\");\n }\n icons = Object.freeze(\n config.icons.map((value, index): Icon => {\n if (typeof value !== \"object\" || value === null) {\n throw new TypeError(`icons[${index}] must be an MCP Icon object`);\n }\n const icon = value as Record<string, unknown>;\n const src = assertBrandingSource(icon[\"src\"], `icons[${index}].src`);\n const mimeType = icon[\"mimeType\"];\n if (\n mimeType !== undefined &&\n (typeof mimeType !== \"string\" ||\n !mimeType.toLowerCase().startsWith(\"image/\"))\n ) {\n throw new TypeError(\n `icons[${index}].mimeType must be an image MIME type when provided`\n );\n }\n const sizes = icon[\"sizes\"];\n if (\n sizes !== undefined &&\n (!Array.isArray(sizes) ||\n sizes.some((size) => typeof size !== \"string\" || size.length === 0))\n ) {\n throw new TypeError(\n `icons[${index}].sizes must be an array of non-empty strings when provided`\n );\n }\n const normalizedSizes =\n sizes === undefined\n ? undefined\n : (sizes as unknown[]).map((size) => size as string);\n const theme = icon[\"theme\"];\n if (theme !== undefined && theme !== \"light\" && theme !== \"dark\") {\n throw new TypeError(\n `icons[${index}].theme must be \"light\" or \"dark\" when provided`\n );\n }\n return Object.freeze({\n src,\n ...(mimeType !== undefined && { mimeType }),\n ...(normalizedSizes !== undefined && {\n sizes: Object.freeze(normalizedSizes) as string[],\n }),\n ...(theme !== undefined && { theme }),\n });\n })\n );\n }\n\n const explicitFavicon =\n config.favicon === undefined\n ? undefined\n : assertBrandingSource(config.favicon, \"favicon\");\n const inferred =\n explicitFavicon === undefined\n ? selectFaviconFromIcons(icons ?? [])\n : undefined;\n const favicon = explicitFavicon ?? inferred?.src;\n const faviconMimeType =\n inferred?.mimeType ??\n icons?.find((icon) => icon.src === explicitFavicon)?.mimeType;\n\n return Object.freeze({\n ...(favicon !== undefined && { favicon }),\n ...(faviconMimeType !== undefined && { faviconMimeType }),\n ...(icons !== undefined && { icons }),\n ...(websiteUrl !== undefined && { websiteUrl }),\n });\n}\n\n/**\n * Resolve configured icons for MCP implementation metadata.\n *\n * Absolute HTTP(S) and data URLs pass through. Public-relative sources become\n * request-scoped absolute URLs under `${basePath}/_mcp-use/public/`.\n *\n * @param icons - Normalized configured icons.\n * @param request - HTTP request used to derive the public asset origin.\n * @param basePath - MCP endpoint base path.\n * @returns Icons suitable for the official SDK `Implementation` object.\n *\n * @internal\n */\nexport function resolveImplementationIcons(\n icons: readonly Icon[] | undefined,\n request: Request | undefined,\n basePath: string\n): Icon[] | undefined {\n if (icons === undefined) {\n return undefined;\n }\n return icons.map((icon) => ({\n ...icon,\n src:\n request !== undefined && isLocalPublicSource(icon.src)\n ? `${resolveAssetsBase(request)}${publicAssetPath(basePath, icon.src)}`\n : icon.src,\n ...(icon.sizes !== undefined && { sizes: [...icon.sizes] }),\n }));\n}\n\n/**\n * Whether any configured branding source needs the local public route.\n *\n * @param branding - Normalized branding to inspect.\n * @returns `true` when the favicon or an MCP icon uses a `public/` path.\n *\n * @internal\n */\nexport function hasLocalBrandingAsset(branding: ServerBranding): boolean {\n return (\n (branding.favicon !== undefined && isLocalPublicSource(branding.favicon)) ||\n branding.icons?.some((icon) => isLocalPublicSource(icon.src)) === true\n );\n}\n\n/**\n * Create the root-level `/favicon.ico` handler for normalized branding.\n *\n * Local public files and data URLs are streamed directly. Absolute HTTP(S)\n * sources receive a temporary redirect, avoiding server-side remote fetches.\n *\n * @param branding - Normalized server branding.\n * @param options - Public directory resolution mode.\n * @returns A GET/HEAD handler, or `undefined` when no favicon is configured.\n *\n * @internal\n */\nexport function createFaviconHandler(\n branding: ServerBranding,\n options: { dev: boolean; projectRoot: string; deferCors?: boolean }\n): FetchHandler | undefined {\n const source = branding.favicon;\n if (source === undefined) {\n return undefined;\n }\n\n return async (request) => {\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n return new Response(\"Method Not Allowed\", {\n status: 405,\n headers: { Allow: \"GET, HEAD\" },\n });\n }\n if (new URL(request.url).pathname !== \"/favicon.ico\") {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n const protocol = protocolOf(source);\n if (protocol === \"http\" || protocol === \"https\") {\n return new Response(null, {\n status: 307,\n headers: {\n Location: source,\n \"Cache-Control\": FAVICON_REDIRECT_CACHE_CONTROL,\n },\n });\n }\n if (protocol === \"data\") {\n const data = parseDataImage(source, \"favicon\");\n return new Response(\n request.method === \"HEAD\" ? null : data.bytes.buffer,\n {\n status: 200,\n headers: {\n \"Content-Type\": branding.faviconMimeType ?? data.mimeType,\n \"Cache-Control\": FAVICON_CACHE_CONTROL,\n \"X-Content-Type-Options\": \"nosniff\",\n },\n }\n );\n }\n\n const { join } = await import(\"node:path\");\n const publicRoot = options.dev\n ? join(options.projectRoot, \"public\")\n : join(options.projectRoot, \".mcp-use/build/views/public\");\n const diskPath = await resolvePublicFilePath(publicRoot, source);\n if (diskPath === null) {\n return new Response(\"Not Found\", {\n status: 404,\n headers: { \"Cache-Control\": \"no-store\" },\n });\n }\n const response = await servePublicFile(diskPath, {\n ...(options.deferCors === true && { deferCors: true }),\n ...(request.method === \"HEAD\" && { head: true }),\n });\n response.headers.set(\"Cache-Control\", FAVICON_CACHE_CONTROL);\n response.headers.set(\"X-Content-Type-Options\", \"nosniff\");\n if (branding.faviconMimeType !== undefined) {\n response.headers.set(\"Content-Type\", branding.faviconMimeType);\n }\n return response;\n };\n}\n","import type { Icon, ServerOptions } from \"@modelcontextprotocol/server\";\n\nimport type { LoggingOptions } from \"./logging.js\";\nimport type { OAuthProvider } from \"./oauth/index.js\";\n\n/**\n * Options for the inspector shell route — the shape of\n * {@link ServerConfig.inspector}.\n */\nexport interface InspectorOptions {\n /**\n * Whether the inspector shell route is mounted.\n *\n * @defaultValue `true`\n */\n enabled?: boolean;\n /**\n * Full replacement URL for the inspector bundle script (FastAPI's\n * `swagger_js_url` analog). When set, the shell's `<script type=\"module\">`\n * loads exactly this URL, so it must point at a complete copy of the\n * `@mcp-use/inspector` CDN bundle (`dist/cdn/inspector.js`) — self-host it\n * for air-gapped environments where the public CDN is unreachable.\n *\n * @defaultValue The latest `@mcp-use/inspector` beta, resolved to one exact\n * asset version in the browser before the bundle loads.\n */\n assetsUrl?: string;\n /**\n * Hosted managed-chat backend URL (injected as `window.__MANUFACT_CHAT_URL__`).\n * Defaults to `process.env.MANUFACT_CHAT_URL` when the shell is mounted.\n */\n manufactChatUrl?: string;\n}\n\n/**\n * Common server identity and behavior, passed to `new MCPServer(...)`.\n *\n * Includes the fields consumed by the core HTTP and OAuth resource-server\n * wiring. Other legacy configuration is added with the feature that reads it.\n */\ninterface BaseServerConfig {\n /** Server name reported to clients during negotiation. */\n name: string;\n /** Server version reported to clients. */\n version: string;\n /** Human-readable display name (falls back to `name`). */\n title?: string;\n /**\n * Human-readable description of the server, reported to clients as\n * implementation metadata during negotiation.\n */\n description?: string;\n /**\n * Browser favicon source.\n *\n * Accepts a safe path relative to the project `public/` directory, an\n * absolute HTTP(S) URL, or an image data URL. The selected image is served\n * at the root-level `/favicon.ico` route. When omitted, the first entry in\n * `icons` selects the favicon. An explicit value always wins; an empty\n * string is invalid.\n *\n * @defaultValue Inferred from `icons`, or no favicon when `icons` is absent\n * or empty.\n * @throws TypeError When the value is empty, uses an unsupported URL scheme,\n * or is an unsafe local path.\n *\n * @example\n * ```ts\n * new MCPServer({\n * name: \"my-server\",\n * version: \"1.0.0\",\n * favicon: \"brand/favicon.svg\",\n * });\n * ```\n */\n favicon?: string;\n /**\n * Server icons reported to clients in MCP implementation metadata.\n *\n * Uses the official SDK {@link Icon} shape. Each `src` accepts a safe path\n * relative to `public/`, an absolute HTTP(S) URL, or an image data URL.\n * Local paths become request-scoped absolute URLs under\n * `${basePath}/_mcp-use/public/`; author order is preserved on the wire.\n * When `favicon` is omitted, the first icon in this array also selects\n * `/favicon.ico`. An empty array is valid and selects no favicon.\n *\n * @defaultValue `undefined`\n * @throws TypeError When an icon has an invalid source, MIME type, sizes,\n * or theme.\n *\n * @example\n * ```ts\n * new MCPServer({\n * name: \"my-server\",\n * version: \"1.0.0\",\n * icons: [\n * { src: \"brand/icon.svg\", mimeType: \"image/svg+xml\" },\n * { src: \"brand/icon-32.png\", mimeType: \"image/png\", sizes: [\"32x32\"] },\n * ],\n * });\n * ```\n */\n icons?: Icon[];\n /**\n * Absolute HTTP(S) URL for the server's website or documentation, reported\n * to clients in MCP implementation metadata.\n *\n * @defaultValue `undefined`\n * @throws TypeError When the value is empty, relative, or not HTTP(S).\n *\n * @example\n * ```ts\n * new MCPServer({\n * name: \"my-server\",\n * version: \"1.0.0\",\n * websiteUrl: \"https://example.com/my-server\",\n * });\n * ```\n */\n websiteUrl?: string;\n /** Usage instructions surfaced to the model by clients. */\n instructions?: string;\n /**\n * Route path the MCP endpoint is served on.\n *\n * Must be an absolute URL pathname: starts with `/`, and contains no `?`,\n * `#`, whitespace, empty path segments (`//`), or trailing slash (except\n * for the root path `/`).\n *\n * @defaultValue `\"/mcp\"`\n * @throws TypeError When the value fails the pathname rules above\n * (validated by {@link assertServerConfig}).\n */\n basePath?: string;\n /**\n * Hostname `listen()` binds. Defaults to `127.0.0.1`; localhost-class\n * binds get DNS-rebinding protection (`Host` on every request; `Origin`\n * only on non-GET/HEAD) automatically. Set `\"0.0.0.0\"` to serve publicly — behind a platform\n * edge (Railway, Fly, …) nothing more is needed, since the edge only\n * routes hostnames assigned to the deployment. Ignored by `getHandler()`,\n * which never binds.\n */\n host?: string;\n /**\n * Extra allowed hostnames for Host-header validation (DNS-rebinding\n * protection), e.g. `[\"api.example.com\"]`. Port-agnostic and additive:\n * localhost-class hostnames stay allowed, so local runs keep working\n * unmodified. Setting this also turns Host validation on for\n * `getHandler()`, which otherwise applies none.\n */\n allowedHosts?: string[];\n /**\n * Extra allowed origin hostnames for Origin-header validation\n * (port-agnostic, additive to the localhost-class origins). When unset,\n * Origin validation is off (SDK-aligned). When set, Origin is validated\n * only on non-GET/HEAD requests (sandboxed view iframes send `Origin: null`\n * on asset GETs; the MCP wire is POST). Requests without an `Origin` header\n * always pass (non-browser MCP clients don't send one).\n */\n allowedOrigins?: string[];\n /**\n * How 2025-era (non-envelope) requests are served.\n *\n * `\"stateless\"` answers each legacy request with a fresh instance over a\n * session-less streamable HTTP transport (2025 session operations — GET and\n * DELETE — get `405`). `\"reject\"` is modern-only strict: legacy-classified\n * requests are refused with the unsupported-protocol-version error naming\n * the supported revisions.\n *\n * @defaultValue `\"stateless\"`\n */\n legacy?: \"stateless\" | \"reject\";\n /**\n * Expose the HTML landing page without bearer authentication when OAuth is\n * configured.\n *\n * The landing page itself is always mounted at `basePath` for browser GET\n * and HEAD requests that explicitly accept `text/html`. Without OAuth it is\n * public. With OAuth, it requires a valid bearer token unless this option is\n * `true`. MCP protocol requests remain protected in either case.\n *\n * @defaultValue `false`\n */\n publicLandingPage?: boolean;\n /**\n * Inspector shell route at `${basePath}/inspector` — a browser UI for\n * exploring and calling the server's tools, resources, and prompts.\n *\n * @remarks\n * Follows the FastAPI `/docs` model: the server itself ships only a tiny\n * dependency-free HTML page whose inline module loader resolves the latest\n * `@mcp-use/inspector` beta to one exact CDN release before loading it, so\n * the UI updates independently of SDK releases without mixing asset\n * versions or adding anything to the install. The page tells the inspector\n * to connect to this server's MCP endpoint at `basePath`, deriving the URL\n * from the browser's own origin.\n *\n * Enabled by default; set `{ enabled: false }` to disable the route, or\n * pass `{ assetsUrl }` to load the bundle from a self-hosted copy instead\n * of the public CDN (air-gapped environments). For local development,\n * `MCP_USE_INSPECTOR_ASSETS_URL` provides the same override without changing\n * application code; an explicit `assetsUrl` takes precedence.\n *\n * @example\n * ```ts\n * // Default: inspector served at /mcp/inspector from the public CDN.\n * new MCPServer({ name: \"my-server\", version: \"1.0.0\" });\n *\n * // Disabled:\n * new MCPServer({\n * name: \"my-server\",\n * version: \"1.0.0\",\n * inspector: { enabled: false },\n * });\n *\n * // Air-gapped: load a self-hosted copy of the inspector bundle.\n * new MCPServer({\n * name: \"my-server\",\n * version: \"1.0.0\",\n * inspector: { assetsUrl: \"https://intranet.example.com/inspector.js\" },\n * });\n * ```\n */\n inspector?: InspectorOptions;\n /**\n * HTTP/MCP request logging: one summary line per request plus an indented\n * detail line naming the MCP method, its subject (tool name, resource URI,\n * prompt name), and the calling client.\n *\n * Enabled at the `info` level by default, which prints no request or\n * response payloads. Set `{ enabled: false }` to disable,\n * `{ level: \"debug\" }` to echo compact truncated tool/prompt input and\n * tool output on the detail line, or `{ level: \"trace\" }` for debug plus\n * full request/response header and body dumps. The `MCP_USE_LOG_LEVEL`\n * environment variable (`info` | `debug` | `trace`) overrides the\n * configured level.\n */\n logging?: LoggingOptions;\n /**\n * Integrity verification for `requestState` echoed across\n * `input_required` rounds.\n *\n * Use the SDK's `createRequestStateCodec(...).verify` here when state\n * affects authorization, resource access, or business logic. Without a\n * verifier, {@link RequestContext.requestState} returns the raw,\n * attacker-controlled wire string.\n *\n * @defaultValue `undefined`\n */\n requestState?: ServerOptions[\"requestState\"];\n /**\n * Optional CORS headers on every route served by `getHandler()` / `listen()`\n * (MCP endpoint, view assets, inspector, OAuth metadata). Off when omitted.\n *\n * Pair with {@link BaseServerConfig.allowedOrigins | allowedOrigins} for\n * browser clients: CORS tells the browser it may read the response; Origin\n * validation decides whether the server accepts the request.\n *\n * @example\n * ```ts\n * new MCPServer({\n * name: \"api\",\n * version: \"1.0.0\",\n * allowedOrigins: [\"app.example.com\"],\n * cors: {\n * origin: \"https://app.example.com\",\n * credentials: true,\n * },\n * });\n * ```\n */\n cors?: CorsOptions;\n}\n\n/**\n * CORS configuration for routes owned by mcp-use (`getHandler()` / `listen()`).\n *\n * Omit `cors` entirely for the current no-CORS behavior. Pass `cors: {}` to\n * enable with defaults (reflects the request `Origin` when present; wildcard\n * `origin: \"*\"` requires an explicit opt-in).\n */\nexport interface CorsOptions {\n /** @defaultValue `true` when `cors` is set; ignored when `cors` is omitted */\n enabled?: boolean;\n /** Allowed Origin(s). Reflect matching `Origin` header, or `\"*\"` when set. */\n origin?: string | string[] | ((origin: string | null) => string | null);\n /** @defaultValue `[\"GET\", \"HEAD\", \"POST\", \"OPTIONS\"]` */\n methods?: string[];\n /** @defaultValue common MCP + JSON headers */\n allowedHeaders?: string[];\n /** @defaultValue `false` */\n credentials?: boolean;\n}\n\n/**\n * Runtime checks for optional {@link ServerConfig} fields that TypeScript\n * alone cannot enforce when values arrive from untyped call sites.\n *\n * @throws TypeError When `basePath` is present but not an absolute URL\n * pathname without empty segments, trailing slash, query, fragment, or\n * whitespace.\n */\nexport function assertServerConfig(config: { basePath?: unknown }): void {\n if (config.basePath !== undefined) {\n if (typeof config.basePath !== \"string\") {\n throw new TypeError(\n \"basePath must be an absolute URL pathname without empty segments, trailing slash, query, fragment, or whitespace\"\n );\n }\n const { basePath } = config;\n if (\n !basePath.startsWith(\"/\") ||\n basePath.includes(\"?\") ||\n basePath.includes(\"#\") ||\n /\\s/.test(basePath) ||\n basePath.includes(\"//\") ||\n (basePath.length > 1 && basePath.endsWith(\"/\"))\n ) {\n throw new TypeError(\n \"basePath must be an absolute URL pathname without empty segments, trailing slash, query, fragment, or whitespace\"\n );\n }\n }\n}\n\n/**\n * Server identity and behavior, passed to `new MCPServer(...)`.\n *\n * A user type other than `never` requires an OAuth provider, preventing a\n * callback from declaring authenticated context without authentication at\n * runtime. Omitting the type keeps the no-OAuth API ergonomic.\n */\nexport type ServerConfig<TUser = never> = BaseServerConfig &\n ([TUser] extends [never]\n ? {\n /** OAuth is unavailable when no authenticated user type is declared. */\n oauth?: undefined;\n }\n : {\n /**\n * External OAuth resource-server provider. Callback contexts receive\n * this provider's user type as required `ctx.auth.user`.\n */\n oauth: OAuthProvider<TUser>;\n });\n","import {\n CLIENT_CAPABILITIES_META_KEY,\n inputRequired,\n inputResponse,\n type AuthInfo,\n type InputRequest,\n type InputRequiredResult,\n type RequestStateAccessor,\n type ServerContext,\n type StandardSchemaWithJSON,\n} from \"@modelcontextprotocol/server\";\n\nimport type { OAuthExtra } from \"./oauth/provider.js\";\nimport { supportsViews } from \"./views/capabilities.js\";\n\n/**\n * Per-request client capability queries.\n *\n * Reads the modern per-request envelope only — never session state.\n */\nexport interface RequestClientContext {\n /**\n * Whether this request's client advertises MCP Apps / UI support.\n *\n * True when the client declares the `io.modelcontextprotocol/ui` extension\n * with `text/html;profile=mcp-app` in `mimeTypes`. Legacy (non-envelope)\n * requests always return `false`.\n */\n supportsViews(): boolean;\n}\n\n/**\n * Result of a {@link Elicit} call.\n *\n * `required` means the callback must return `result`; the client then gathers\n * input and retries the tool. Accepted form results carry schema-validated,\n * inferred `data`. URL acceptances and declined/cancelled results carry no\n * data.\n */\nexport type ElicitationResult<T = never> =\n | { status: \"required\"; result: InputRequiredResult }\n | { status: \"decline\" | \"cancel\" }\n | ([T] extends [never]\n ? { status: \"accept\" }\n : { status: \"accept\"; data: T });\n\n/**\n * Requests or reads one keyed elicitation in a multi-round-trip tool callback.\n *\n * The explicit key correlates the request with the client's response on\n * re-entry. On the first entry, or after an invalid form response, this returns\n * `{ status: \"required\", result }`; return that result from the tool. On\n * re-entry it returns `accept`, `decline`, or `cancel` and validates accepted\n * Standard Schema form data before exposing it. Validation may be synchronous\n * or asynchronous.\n *\n * @example\n * ```ts\n * const confirmation = await ctx.elicit(\n * \"confirm\",\n * \"Deploy to production?\",\n * schema,\n * );\n * if (confirmation.status === \"required\") {\n * return confirmation.result;\n * }\n * ```\n */\nexport interface Elicit {\n /** Request or read a typed form-mode elicitation. */\n <S extends StandardSchemaWithJSON>(\n key: string,\n message: string,\n schema: S\n ): Promise<ElicitationResult<StandardSchemaWithJSON.InferOutput<S>>>;\n /** Request or read a URL-mode elicitation. */\n (key: string, message: string, url: string): Promise<ElicitationResult>;\n}\n\n/**\n * Per-request context passed to tool/resource/prompt callbacks.\n */\nexport type OAuthAuth<TUser> = {\n user: TUser;\n payload: Record<string, unknown>;\n accessToken: string;\n scopes: string[];\n permissions: string[];\n /**\n * The OAuth client identifier from the token's `client_id` or `azp` claim;\n * undefined when the identity provider's access tokens carry no client claim\n * (e.g. WorkOS AuthKit, Supabase).\n */\n clientId?: string;\n expiresAt: number;\n resource?: URL;\n};\n\ntype RequestContextBase = {\n /** Aborted when the client cancels the request or the connection drops. */\n signal: AbortSignal;\n /** The originating HTTP request, when served over HTTP. */\n request?: Request;\n /** Per-request client capability queries. */\n client: RequestClientContext;\n /** Request or read a keyed form- or URL-mode elicitation. */\n elicit: Elicit;\n /**\n * Bare responses supplied when the client retries an `input_required`\n * round. Values are client input; validate them before use.\n */\n inputResponses?: ServerContext[\"mcpReq\"][\"inputResponses\"];\n /**\n * Read opaque state echoed by the client for this `input_required` round.\n * The generic is only a type assertion. Configure `requestState.verify`\n * when state affects authorization or business logic.\n */\n requestState: RequestStateAccessor;\n /**\n * Report request-scoped progress when the caller supplied a progress token.\n *\n * @returns `true` when a notification was sent, `false` when the caller did\n * not request progress.\n */\n reportProgress(\n progress: number,\n total?: number,\n message?: string\n ): Promise<boolean>;\n /** Send a log message notification to the client during tool execution. */\n sendLog(\n level:\n | \"debug\"\n | \"info\"\n | \"notice\"\n | \"warning\"\n | \"error\"\n | \"critical\"\n | \"alert\"\n | \"emergency\",\n data: unknown,\n logger?: string\n ): Promise<void>;\n};\n\n/**\n * Per-request callback context, authenticated when OAuth is configured.\n */\nexport type RequestContext<\n TUser = never,\n HasOAuth extends boolean = false,\n> = HasOAuth extends true\n ? RequestContextBase & { auth: OAuthAuth<TUser> }\n : RequestContextBase & { auth?: never };\n\ntype MappedOAuthAuthInfo<TUser> = AuthInfo & {\n expiresAt: number;\n extra: OAuthExtra<TUser>;\n};\n\nfunction requireOAuthAuthInfo<TUser>(\n authInfo: AuthInfo | undefined\n): asserts authInfo is MappedOAuthAuthInfo<TUser> {\n if (\n authInfo === undefined ||\n authInfo.extra === undefined ||\n authInfo.expiresAt === undefined\n ) {\n throw new Error(\"OAuth callback did not receive mapped AuthInfo.extra\");\n }\n}\n\nfunction toClientContext(ctx: ServerContext): RequestClientContext {\n const envelopeCaps = ctx.mcpReq.envelope?.[CLIENT_CAPABILITIES_META_KEY];\n return {\n supportsViews(): boolean {\n return supportsViews(envelopeCaps);\n },\n };\n}\n\nfunction createElicit(\n inputResponses: ServerContext[\"mcpReq\"][\"inputResponses\"]\n): Elicit {\n return async function elicit(\n key: string,\n message: string,\n schemaOrUrl?: StandardSchemaWithJSON | string\n ): Promise<ElicitationResult<unknown> | ElicitationResult> {\n let request: InputRequest;\n let formSchema: StandardSchemaWithJSON | undefined;\n\n if (typeof schemaOrUrl === \"string\") {\n request = inputRequired.elicitUrl({\n message,\n url: schemaOrUrl,\n });\n } else if (schemaOrUrl !== undefined) {\n formSchema = schemaOrUrl;\n request = inputRequired.elicit({\n message,\n requestedSchema: schemaOrUrl,\n });\n } else {\n throw new TypeError(\n \"ctx.elicit(key, message, value) requires a form schema or URL string\"\n );\n }\n\n const response = inputResponse(inputResponses, key);\n if (response.kind === \"elicit\") {\n if (response.action !== \"accept\") {\n return { status: response.action };\n }\n if (formSchema === undefined) {\n return { status: \"accept\" };\n }\n if (response.content !== undefined) {\n const outcome = await formSchema[\"~standard\"].validate(\n response.content\n );\n if (outcome.issues === undefined) {\n return { status: \"accept\", data: outcome.value };\n }\n }\n }\n\n return {\n status: \"required\",\n result: inputRequired({ inputRequests: { [key]: request } }),\n };\n } as Elicit;\n}\n\n/**\n * Derive the callback-facing {@link RequestContext} from the SDK's\n * per-request `ServerContext`.\n *\n * @internal\n */\nexport function toRequestContext(\n ctx: ServerContext\n): RequestContext<never, false> {\n const request = ctx.http?.req;\n return {\n signal: ctx.mcpReq.signal,\n ...(request !== undefined && { request }),\n ...(ctx.mcpReq.inputResponses !== undefined && {\n inputResponses: ctx.mcpReq.inputResponses,\n }),\n client: toClientContext(ctx),\n elicit: createElicit(ctx.mcpReq.inputResponses),\n requestState: <T = unknown>() => ctx.mcpReq.requestState<T>(),\n async reportProgress(progress, total, message): Promise<boolean> {\n const progressToken = ctx.mcpReq._meta?.progressToken;\n if (progressToken === undefined) return false;\n await ctx.mcpReq.notify({\n method: \"notifications/progress\",\n params: {\n progressToken,\n progress,\n ...(total !== undefined && { total }),\n ...(message !== undefined && { message }),\n },\n });\n return true;\n },\n async sendLog(level, data, logger): Promise<void> {\n await ctx.mcpReq.notify({\n method: \"notifications/message\",\n params: {\n level,\n data,\n ...(logger !== undefined && { logger }),\n },\n });\n },\n };\n}\n\n/** @internal Projects mapped OAuth auth information into callback context. */\nexport function toAuthenticatedRequestContext<TUser>(\n ctx: ServerContext\n): RequestContext<TUser, true> {\n const authInfo = ctx.http?.authInfo;\n requireOAuthAuthInfo<TUser>(authInfo);\n return {\n ...toRequestContext(ctx),\n auth: {\n user: authInfo.extra.user,\n payload: authInfo.extra.payload,\n accessToken: authInfo.token,\n scopes: [...authInfo.scopes],\n permissions: [...authInfo.extra.permissions],\n ...(authInfo.clientId.length > 0 && { clientId: authInfo.clientId }),\n expiresAt: authInfo.expiresAt,\n ...(authInfo.resource !== undefined && { resource: authInfo.resource }),\n },\n };\n}\n","import {\n CLIENT_CAPABILITIES_META_KEY,\n type ClientCapabilities,\n} from \"@modelcontextprotocol/server\";\n\nimport { UI_EXTENSION_ID, UI_MIME_TYPE } from \"./constants.js\";\n\n/** Per-request client capabilities stashed before the SDK handler runs. */\nconst clientCapabilitiesByRequest = new WeakMap<Request, ClientCapabilities>();\n\n/**\n * Stash parsed client capabilities on the request for the per-request server\n * factory.\n *\n * @internal\n */\nexport function stashClientCapabilities(\n request: Request,\n capabilities: ClientCapabilities\n): void {\n clientCapabilitiesByRequest.set(request, capabilities);\n}\n\n/**\n * Read stashed client capabilities for an HTTP request.\n *\n * @internal\n */\nexport function getStashedClientCapabilities(\n request: Request | undefined\n): ClientCapabilities | undefined {\n if (request === undefined) {\n return undefined;\n }\n return clientCapabilitiesByRequest.get(request);\n}\n\n/**\n * Extract `clientCapabilities` from a parsed JSON-RPC body, when present.\n *\n * @internal\n */\nexport function extractClientCapabilitiesFromBody(\n body: unknown\n): ClientCapabilities | undefined {\n if (typeof body !== \"object\" || body === null) {\n return undefined;\n }\n const params = (body as Record<string, unknown>)[\"params\"];\n if (typeof params !== \"object\" || params === null) {\n return undefined;\n }\n const meta = (params as Record<string, unknown>)[\"_meta\"];\n if (typeof meta !== \"object\" || meta === null) {\n return undefined;\n }\n const capabilities = (meta as Record<string, unknown>)[\n CLIENT_CAPABILITIES_META_KEY\n ];\n if (typeof capabilities !== \"object\" || capabilities === null) {\n return undefined;\n }\n return capabilities as ClientCapabilities;\n}\n\n/**\n * Whether the client advertises MCP Apps / UI support for this request.\n *\n * True when `capabilities.extensions[\"io.modelcontextprotocol/ui\"]` exists\n * and its `mimeTypes` array includes `text/html;profile=mcp-app`.\n *\n * @remarks\n * Used only for {@link RequestContext.client} queries (e.g.\n * `ctx.client.supportsViews()`). Capability negotiation does not affect the\n * wire surface — `tools/list` always includes every registered tool regardless\n * of this result.\n */\nexport function supportsViews(\n capabilities: ClientCapabilities | undefined\n): boolean {\n const extensions = capabilities?.extensions;\n if (extensions === undefined) {\n return false;\n }\n const uiExtension = extensions[UI_EXTENSION_ID];\n if (typeof uiExtension !== \"object\" || uiExtension === null) {\n return false;\n }\n const mimeTypes = (uiExtension as Record<string, unknown>)[\"mimeTypes\"];\n if (!Array.isArray(mimeTypes)) {\n return false;\n }\n return mimeTypes.includes(UI_MIME_TYPE);\n}\n","/** MCP Apps extension identifier (`io.modelcontextprotocol/ui`). */\nexport const UI_EXTENSION_ID = \"io.modelcontextprotocol/ui\" as const;\n\n/** MIME type for MCP App view resources. */\nexport const UI_MIME_TYPE = \"text/html;profile=mcp-app\" as const;\n\n/** URI scheme prefix for view resources (`ui://views/<name>.html`). */\nexport const UI_RESOURCE_URI_PREFIX = \"ui://views/\" as const;\n\n/** Nested `_meta` key for UI metadata on tools and resources. */\nexport const UI_META_KEY = \"ui\" as const;\n\n/** Legacy flat `_meta` key for the view resource URI (kept while hosts read it). */\nexport const UI_RESOURCE_URI_META_KEY = \"ui/resourceUri\" as const;\n\n/**\n * Build the stable `ui://` resource URI for a view name.\n *\n * @param viewName - View directory / registry key.\n */\nexport function viewResourceUri(viewName: string): string {\n return `${UI_RESOURCE_URI_PREFIX}${viewName}.html`;\n}\n","import type { CorsOptions } from \"../config.js\";\nimport type { FetchMiddleware } from \"../fetch-app.js\";\n\nconst DEFAULT_METHODS = [\"GET\", \"HEAD\", \"POST\", \"OPTIONS\"];\nconst DEFAULT_ALLOWED_HEADERS = [\n \"Content-Type\",\n \"Authorization\",\n \"mcp-protocol-version\",\n \"mcp-method\",\n \"mcp-name\",\n];\n\nfunction resolveAllowedOrigin(\n origin: CorsOptions[\"origin\"],\n requestOrigin: string | null\n): string | null {\n if (origin === undefined) {\n return requestOrigin;\n }\n if (typeof origin === \"function\") {\n return origin(requestOrigin);\n }\n if (origin === \"*\") {\n return \"*\";\n }\n if (Array.isArray(origin)) {\n if (requestOrigin !== null && origin.includes(requestOrigin)) {\n return requestOrigin;\n }\n return null;\n }\n return origin;\n}\n\nfunction corsHeaders(\n options: Required<\n Pick<CorsOptions, \"methods\" | \"allowedHeaders\" | \"credentials\">\n > &\n Pick<CorsOptions, \"origin\">,\n request: Request\n): HeadersInit | undefined {\n if (request.headers.has(\"Access-Control-Allow-Origin\")) {\n return undefined;\n }\n\n const requestOrigin = request.headers.get(\"Origin\");\n const allowedOrigin = resolveAllowedOrigin(options.origin, requestOrigin);\n if (allowedOrigin === null) {\n return undefined;\n }\n\n const headers: Record<string, string> = {\n \"Access-Control-Allow-Origin\": allowedOrigin,\n \"Access-Control-Allow-Methods\": options.methods.join(\", \"),\n \"Access-Control-Allow-Headers\": options.allowedHeaders.join(\", \"),\n };\n if (options.credentials) {\n headers[\"Access-Control-Allow-Credentials\"] = \"true\";\n }\n if (allowedOrigin !== \"*\") {\n headers.Vary = \"Origin\";\n }\n return headers;\n}\n\nfunction mergeCorsHeaders(response: Response, headers: HeadersInit): Response {\n if (response.headers.has(\"Access-Control-Allow-Origin\")) {\n return response;\n }\n const merged = new Headers(response.headers);\n const corsHeaders = new Headers(headers);\n corsHeaders.forEach((value, key) => {\n merged.set(key, value);\n });\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers: merged,\n });\n}\n\n/**\n * Fetch middleware that adds CORS headers to every response.\n *\n * @internal Wired from {@link MCPServer} when `ServerConfig.cors` is set.\n */\nexport function corsFetchMiddleware(options: CorsOptions): FetchMiddleware {\n const enabled = options.enabled !== false;\n if (!enabled) {\n return async (_request, next) => next();\n }\n\n const resolved = {\n ...(options.origin !== undefined && { origin: options.origin }),\n methods: options.methods ?? DEFAULT_METHODS,\n allowedHeaders: options.allowedHeaders ?? DEFAULT_ALLOWED_HEADERS,\n credentials: options.credentials ?? false,\n };\n\n return async (request, next) => {\n const headers = corsHeaders(resolved, request);\n if (headers === undefined) {\n return next();\n }\n\n if (request.method === \"OPTIONS\") {\n return new Response(null, { status: 204, headers });\n }\n\n const response = await next();\n return mergeCorsHeaders(response, headers);\n };\n}\n\n/** Whether global CORS middleware owns response headers for view assets. */\nexport function isGlobalCorsEnabled(cors: CorsOptions | undefined): boolean {\n return cors !== undefined && cors.enabled !== false;\n}\n","import {\n CallToolResultSchema,\n GetPromptResultSchema,\n ListPromptsResultSchema,\n ListResourcesResultSchema,\n ListToolsResultSchema,\n ReadResourceResultSchema,\n} from \"@modelcontextprotocol/core\";\nimport { isInputRequiredResult } from \"@modelcontextprotocol/server\";\nimport type {\n AuthInfo,\n HandlerResultTypeMap,\n RequestTypeMap,\n ResultTypeMap,\n} from \"@modelcontextprotocol/server\";\n\nconst MCP_MIDDLEWARE_METHODS = [\n \"tools/call\",\n \"tools/list\",\n \"resources/read\",\n \"resources/list\",\n \"prompts/get\",\n \"prompts/list\",\n] as const;\n\n/** MCP methods currently intercepted by {@link MCPServer.use}. */\nexport type McpMiddlewareMethod = (typeof MCP_MIDDLEWARE_METHODS)[number];\n\n/** Params exposed by the SDK for a particular MCP request method. */\nexport type McpMiddlewareParams<M extends McpMiddlewareMethod> =\n RequestTypeMap[M] extends { params?: infer P }\n ? NonNullable<P>\n : Record<string, never>;\n\n/**\n * Method-specific params and middleware result types.\n *\n * List middleware intentionally operates on item arrays rather than protocol\n * result envelopes. The server wrapper preserves the envelope around the\n * transformed array.\n */\nexport interface McpMiddlewareOperationMap {\n \"tools/call\": {\n params: McpMiddlewareParams<\"tools/call\">;\n result: HandlerResultTypeMap[\"tools/call\"];\n };\n \"tools/list\": {\n params: McpMiddlewareParams<\"tools/list\">;\n result: ResultTypeMap[\"tools/list\"][\"tools\"];\n };\n \"resources/read\": {\n params: McpMiddlewareParams<\"resources/read\">;\n result: HandlerResultTypeMap[\"resources/read\"];\n };\n \"resources/list\": {\n params: McpMiddlewareParams<\"resources/list\">;\n result: ResultTypeMap[\"resources/list\"][\"resources\"];\n };\n \"prompts/get\": {\n params: McpMiddlewareParams<\"prompts/get\">;\n result: HandlerResultTypeMap[\"prompts/get\"];\n };\n \"prompts/list\": {\n params: McpMiddlewareParams<\"prompts/list\">;\n result: ResultTypeMap[\"prompts/list\"][\"prompts\"];\n };\n}\n\n/** Result exposed to middleware for a particular MCP method. */\nexport type McpMiddlewareResult<M extends McpMiddlewareMethod> =\n McpMiddlewareOperationMap[M][\"result\"];\n\n/**\n * Rebuild an SDK request with the params currently held by middleware.\n *\n * Middleware may replace `ctx.params`, so forwarding the request object that\n * was captured before the chain ran would silently discard that replacement.\n * @internal\n */\nexport function withMcpMiddlewareParams<M extends McpMiddlewareMethod>(\n request: unknown,\n params: McpMiddlewareOperationMap[M][\"params\"]\n): RequestTypeMap[M] {\n if (\n typeof request !== \"object\" ||\n request === null ||\n Array.isArray(request)\n ) {\n throw new TypeError(\n \"[mcp-use] MCP middleware received an invalid downstream request\"\n );\n }\n\n return { ...request, params } as RequestTypeMap[M];\n}\n\ninterface MiddlewareContextCommon {\n /** The originating HTTP request, when this operation is served over HTTP. */\n request?: Request;\n /** Session info when the underlying transport provides a session ID. */\n session?: { sessionId: string };\n /** OAuth info extracted from the validated access token. */\n auth?: AuthInfo;\n /** Shared state for middleware participating in this request. */\n state: Map<string, unknown>;\n}\n\n/**\n * Context passed to MCP middleware.\n *\n * The conditional form preserves the correlation between `method` and\n * `params` when more than one method is represented.\n */\nexport type MiddlewareContext<\n M extends McpMiddlewareMethod = McpMiddlewareMethod,\n> = M extends McpMiddlewareMethod\n ? MiddlewareContextCommon & {\n method: M;\n params: McpMiddlewareOperationMap[M][\"params\"];\n }\n : never;\n\n/** Preferred explicit name for the method-correlated middleware context. */\nexport type McpMiddlewareContext<\n M extends McpMiddlewareMethod = McpMiddlewareMethod,\n> = MiddlewareContext<M>;\n\n/** Context with narrowed params for `tools/call`. */\nexport type ToolsCallMiddlewareContext = MiddlewareContext<\"tools/call\">;\n/** Context with narrowed params for `tools/list`. */\nexport type ToolsListMiddlewareContext = MiddlewareContext<\"tools/list\">;\n/** Context with narrowed params for `resources/read`. */\nexport type ResourcesReadMiddlewareContext =\n MiddlewareContext<\"resources/read\">;\n/** Context with narrowed params for `resources/list`. */\nexport type ResourcesListMiddlewareContext =\n MiddlewareContext<\"resources/list\">;\n/** Context with narrowed params for `prompts/get`. */\nexport type PromptsGetMiddlewareContext = MiddlewareContext<\"prompts/get\">;\n/** Context with narrowed params for `prompts/list`. */\nexport type PromptsListMiddlewareContext = MiddlewareContext<\"prompts/list\">;\n\n/** Map retained for compatibility and convenient indexed lookup. */\nexport type McpMiddlewarePatternMap = {\n [M in McpMiddlewareMethod]: MiddlewareContext<M>;\n};\n\n/** Continue the middleware chain with the result type for method `M`. */\nexport type McpMiddlewareNext<M extends McpMiddlewareMethod> = () => Promise<\n McpMiddlewareResult<M>\n>;\n\n/** Middleware for one exact MCP method. */\nexport type McpExactMiddlewareFn<M extends McpMiddlewareMethod> = (\n ctx: MiddlewareContext<M>,\n next: McpMiddlewareNext<M>\n) => Promise<McpMiddlewareResult<M>>;\n\n/**\n * Type-preserving middleware over every wrapped MCP method.\n *\n * The global wildcard cannot inspect or replace a method-specific result. Its `next`\n * resolves after downstream middleware, and the composer propagates that\n * downstream result unchanged. It must call `next()` or throw.\n */\nexport type McpMiddlewareFn<\n Methods extends McpMiddlewareMethod = McpMiddlewareMethod,\n> = (\n ctx: MiddlewareContext<Methods>,\n next: () => Promise<void>\n) => Promise<void>;\n\n/** Exact MCP middleware methods plus the global pass-through wildcard. */\nexport type McpMiddlewarePatternBody = McpMiddlewareMethod | \"*\";\n\n/** Canonical `mcp:` patterns plus prefixless compatibility forms. */\nexport type McpMiddlewarePattern =\n | McpMiddlewarePatternBody\n | `mcp:${McpMiddlewarePatternBody}`;\n\n/** Observer patterns additionally support grouping related MCP methods. */\nexport type McpEventPatternBody =\n | McpMiddlewarePatternBody\n | \"tools/*\"\n | \"resources/*\"\n | \"prompts/*\";\n\ntype McpEventBasePattern = McpEventPatternBody | `mcp:${McpEventPatternBody}`;\n\ntype StripMcpPrefix<P extends string> = P extends `mcp:${infer Body}`\n ? Body\n : P;\n\n/** Methods selected by an MCP middleware or observer pattern. */\nexport type McpMiddlewareMethodsForPattern<P extends string> =\n StripMcpPrefix<P> extends infer Body\n ? Body extends McpMiddlewareMethod\n ? Body\n : Body extends \"tools/*\"\n ? Extract<McpMiddlewareMethod, `tools/${string}`>\n : Body extends \"resources/*\"\n ? Extract<McpMiddlewareMethod, `resources/${string}`>\n : Body extends \"prompts/*\"\n ? Extract<McpMiddlewareMethod, `prompts/${string}`>\n : Body extends \"*\"\n ? McpMiddlewareMethod\n : never\n : never;\n\n/** Infer an exact or type-preserving wildcard handler from pattern `P`. */\nexport type McpMiddlewareFnFor<P extends McpMiddlewarePattern> =\n StripMcpPrefix<P> extends infer Body\n ? Body extends McpMiddlewareMethod\n ? McpExactMiddlewareFn<Body>\n : McpMiddlewareFn<McpMiddlewareMethodsForPattern<P>>\n : never;\n\n/**\n * Type-erased middleware adapter stored after registration.\n *\n * Exact handlers and the global wildcard are adapted to this common callable\n * shape before insertion, following the SDK's request-handler storage model.\n * @internal\n */\nexport interface McpMiddlewareEntry {\n pattern: string;\n handler: (\n ctx: MiddlewareContext,\n next: () => Promise<unknown>\n ) => Promise<unknown>;\n}\n\n/**\n * Adapt a public method-correlated handler for type-erased internal storage.\n *\n * The overload retains the public pattern/handler correlation. The broad\n * implementation signature is the deliberate erasure boundary, like the\n * official SDK's `setRequestHandler` implementation.\n */\nexport function createMcpMiddlewareEntry<P extends McpMiddlewarePattern>(\n pattern: P,\n handler: McpMiddlewareFnFor<P>\n): McpMiddlewareEntry;\n// eslint-disable-next-line no-redeclare -- implementation signature\nexport function createMcpMiddlewareEntry(\n pattern: McpMiddlewarePattern,\n handler: McpMiddlewareFnFor<McpMiddlewarePattern>\n): McpMiddlewareEntry {\n const normalizedPattern = normalizeMcpMiddlewarePattern(pattern);\n const invoke = handler as McpMiddlewareEntry[\"handler\"];\n\n if (normalizedPattern !== \"*\" && !isMcpMiddlewareMethod(normalizedPattern)) {\n throw new TypeError(\n `Unsupported MCP middleware pattern \"${pattern}\". Use an exact MCP method or \"mcp:*\".`\n );\n }\n\n if (normalizedPattern === \"*\") {\n return {\n pattern: normalizedPattern,\n handler: async (ctx, next) => {\n let downstreamCalled = false;\n let downstreamResult: unknown;\n\n await invoke(ctx, async () => {\n downstreamResult = await next();\n downstreamCalled = true;\n });\n\n if (!downstreamCalled) {\n throw new Error(\n `Wildcard MCP middleware \"${normalizedPattern}\" must call next()`\n );\n }\n\n return downstreamResult;\n },\n };\n }\n\n return {\n pattern: normalizedPattern,\n handler: (ctx, next) => invoke(ctx, next),\n };\n}\n\n/** Phase for MCP observer event listeners registered via `server.on()`. */\nexport type McpEventPhase = \"before\" | \"complete\";\n\n/** Read-only observer context correlated by MCP method. */\nexport type ReadonlyMiddlewareContext<\n M extends McpMiddlewareMethod = McpMiddlewareMethod,\n> = M extends McpMiddlewareMethod\n ? Omit<MiddlewareContext<M>, \"params\" | \"request\" | \"state\"> & {\n readonly params: Readonly<McpMiddlewareOperationMap[M][\"params\"]>;\n /** The originating HTTP request, when this operation is served over HTTP. */\n readonly request?: Request;\n readonly state: ReadonlyMap<string, unknown>;\n }\n : never;\n\n/** Read-only observer invoked before an MCP handler runs. */\nexport type McpEventListenerFn<\n Methods extends McpMiddlewareMethod = McpMiddlewareMethod,\n> = <M extends Methods>(ctx: ReadonlyMiddlewareContext<M>) => void;\n\n/** Read-only observer invoked after an MCP handler completes. */\nexport type McpCompleteEventListenerFn<\n Methods extends McpMiddlewareMethod = McpMiddlewareMethod,\n> = <M extends Methods>(\n ctx: ReadonlyMiddlewareContext<M>,\n result: McpMiddlewareResult<M>\n) => void;\n\ntype McpExactEventListenerFn<M extends McpMiddlewareMethod> = (\n ctx: ReadonlyMiddlewareContext<M>\n) => void;\n\ntype McpExactCompleteEventListenerFn<M extends McpMiddlewareMethod> = (\n ctx: ReadonlyMiddlewareContext<M>,\n result: McpMiddlewareResult<M>\n) => void;\n\n/** MCP observer pattern, optionally targeting the completion phase. */\nexport type McpEventPattern =\n | McpEventBasePattern\n | `${McpEventBasePattern}:complete`;\n\ntype StripCompleteSuffix<P extends string> = P extends `${infer Body}:complete`\n ? Body\n : P;\n\n/** Infer a typed before/complete observer from event pattern `P`. */\nexport type McpEventListenerFnFor<P extends McpEventPattern> =\n StripCompleteSuffix<StripMcpPrefix<P>> extends infer Body\n ? Body extends McpMiddlewareMethod\n ? P extends `${string}:complete`\n ? McpExactCompleteEventListenerFn<Body>\n : McpExactEventListenerFn<Body>\n : P extends `${string}:complete`\n ? McpCompleteEventListenerFn<\n McpMiddlewareMethodsForPattern<StripCompleteSuffix<P>>\n >\n : McpEventListenerFn<\n McpMiddlewareMethodsForPattern<StripCompleteSuffix<P>>\n >\n : never;\n\n/** Internal type-erased observer entry. @internal */\nexport interface McpEventListenerEntry {\n pattern: string;\n phase: McpEventPhase;\n handler: (ctx: ReadonlyMiddlewareContext, result?: unknown) => void;\n}\n\n/** Adapt a public method-correlated observer for type-erased storage. */\nexport function createMcpEventListenerEntry<P extends McpEventPattern>(\n pattern: P,\n handler: McpEventListenerFnFor<P>\n): McpEventListenerEntry;\n// eslint-disable-next-line no-redeclare -- implementation signature\nexport function createMcpEventListenerEntry(\n pattern: McpEventPattern,\n handler: McpEventListenerFnFor<McpEventPattern>\n): McpEventListenerEntry {\n const { pattern: normalizedPattern, phase } = parseMcpPattern(pattern);\n const invoke = handler as McpEventListenerEntry[\"handler\"];\n\n return {\n pattern: normalizedPattern,\n phase,\n handler: (ctx, result) => invoke(ctx, result),\n };\n}\n\n/** Test whether a registered middleware or observer pattern matches a method. */\nexport function matchesPattern(pattern: string, method: string): boolean {\n if (pattern === \"*\") return true;\n if (pattern.endsWith(\"/*\")) {\n const prefix = pattern.slice(0, -1);\n return method.startsWith(prefix);\n }\n return pattern === method;\n}\n\nfunction isMcpMiddlewareMethod(value: string): value is McpMiddlewareMethod {\n return MCP_MIDDLEWARE_METHODS.some((method) => method === value);\n}\n\n/** Compose matching middleware in FIFO registration order. */\nexport function composeMiddleware<M extends McpMiddlewareMethod>(\n entries: McpMiddlewareEntry[],\n method: M,\n innerFn: () => Promise<McpMiddlewareResult<M>>\n): (ctx: MiddlewareContext<M>) => Promise<McpMiddlewareResult<M>> {\n const matching = entries.filter((entry) =>\n matchesPattern(entry.pattern, method)\n );\n\n if (matching.length === 0) {\n return (_ctx: MiddlewareContext<M>) => innerFn();\n }\n\n return (ctx: MiddlewareContext<M>) => {\n let index = -1;\n\n const dispatch = (i: number): Promise<McpMiddlewareResult<M>> => {\n if (i <= index) {\n return Promise.reject(new Error(\"next() called multiple times\"));\n }\n index = i;\n\n if (i === matching.length) {\n return innerFn();\n }\n\n const entry = matching[i]!;\n return entry.handler(ctx, () => dispatch(i + 1)) as Promise<\n McpMiddlewareResult<M>\n >;\n };\n\n return dispatch(0);\n };\n}\n\n/** Build a read-only snapshot of middleware context for observer events. */\nexport function freezeMiddlewareContext<M extends McpMiddlewareMethod>(\n ctx: MiddlewareContext<M>\n): ReadonlyMiddlewareContext<M> {\n return Object.freeze({\n method: ctx.method,\n params: Object.freeze({ ...ctx.params }),\n ...(ctx.request !== undefined && { request: ctx.request }),\n ...(ctx.session !== undefined && {\n session: Object.freeze({ ...ctx.session }),\n }),\n ...(ctx.auth !== undefined && { auth: ctx.auth }),\n state: new Map(ctx.state),\n }) as unknown as ReadonlyMiddlewareContext<M>;\n}\n\n/** Run before/complete observers around a method-correlated middleware chain. */\nexport async function runMcpOperation<M extends McpMiddlewareMethod>(\n middlewares: McpMiddlewareEntry[],\n events: McpEventListenerEntry[],\n method: M,\n ctx: MiddlewareContext<M>,\n innerFn: () => Promise<McpMiddlewareResult<M>>\n): Promise<McpMiddlewareResult<M>> {\n dispatchMcpEvents(events, method, \"before\", ctx);\n\n const chained = composeMiddleware(middlewares, method, innerFn);\n const result = await chained(ctx);\n assertValidMiddlewareResult(method, result);\n\n dispatchMcpEvents(events, method, \"complete\", ctx, result);\n return result;\n}\n\nfunction assertValidMiddlewareResult<M extends McpMiddlewareMethod>(\n method: M,\n result: McpMiddlewareResult<M>\n): void {\n if (\n (method === \"tools/call\" ||\n method === \"resources/read\" ||\n method === \"prompts/get\") &&\n isInputRequiredResult(result)\n ) {\n return;\n }\n\n const validation = (() => {\n switch (method) {\n case \"tools/call\":\n assertArrayProperty(method, result, \"content\");\n return CallToolResultSchema.safeParse(result);\n case \"tools/list\":\n assertArrayResult(method, result);\n return ListToolsResultSchema.safeParse({ tools: result });\n case \"resources/read\":\n assertArrayProperty(method, result, \"contents\");\n return ReadResourceResultSchema.safeParse(result);\n case \"resources/list\":\n assertArrayResult(method, result);\n return ListResourcesResultSchema.safeParse({ resources: result });\n case \"prompts/get\":\n assertArrayProperty(method, result, \"messages\");\n return GetPromptResultSchema.safeParse(result);\n case \"prompts/list\":\n assertArrayResult(method, result);\n return ListPromptsResultSchema.safeParse({ prompts: result });\n default:\n throw new TypeError(`Unsupported MCP middleware method \"${method}\"`);\n }\n })();\n\n if (!validation.success) {\n throw new TypeError(\n `[mcp-use] ${method} middleware returned an invalid result: ${validation.error.message}`\n );\n }\n}\n\nfunction assertArrayResult(\n method: string,\n result: unknown\n): asserts result is unknown[] {\n if (!Array.isArray(result)) {\n throw new TypeError(\n `[mcp-use] ${method} middleware returned an invalid result: expected an array`\n );\n }\n}\n\nfunction assertArrayProperty(\n method: string,\n result: unknown,\n property: string\n): void {\n if (\n typeof result !== \"object\" ||\n result === null ||\n !Array.isArray((result as Record<string, unknown>)[property])\n ) {\n throw new TypeError(\n `[mcp-use] ${method} middleware returned an invalid result: expected a ${property} array`\n );\n }\n}\n\nfunction dispatchMcpEvents<M extends McpMiddlewareMethod>(\n events: McpEventListenerEntry[],\n method: M,\n phase: McpEventPhase,\n ctx: MiddlewareContext<M>,\n result?: McpMiddlewareResult<M>\n): void {\n const frozen = freezeMiddlewareContext(ctx);\n for (const entry of events) {\n if (entry.phase !== phase || !matchesPattern(entry.pattern, method)) {\n continue;\n }\n try {\n entry.handler(frozen, result);\n } catch (error) {\n console.error(\n `[mcp-use] MCP event listener for \"${entry.pattern}\" (${phase}) threw:`,\n error\n );\n }\n }\n}\n\n/** Strip `mcp:` prefix and optional `:complete` suffix from event patterns. */\nexport function parseMcpPattern(raw: string): {\n pattern: string;\n phase: McpEventPhase;\n} {\n const pattern = raw.startsWith(\"mcp:\") ? raw.slice(4) : raw;\n if (pattern.endsWith(\":complete\")) {\n return {\n pattern: pattern.slice(0, -\":complete\".length),\n phase: \"complete\",\n };\n }\n return { pattern, phase: \"before\" };\n}\n\n/** Normalize middleware pattern strings by stripping the `mcp:` prefix. */\nexport function normalizeMcpMiddlewarePattern(raw: string): string {\n return raw.startsWith(\"mcp:\") ? raw.slice(4) : raw;\n}\n","/**\n * Inspector CDN shell — the FastAPI `/docs` analog.\n *\n * The server ships no inspector code: it serves a tiny self-contained HTML\n * page whose inline module loader resolves the current `@mcp-use/inspector`\n * beta and then loads that exact release's CDN bundle entry\n * (`dist/cdn/inspector.js`) plus lazy chunks. Runtime configuration crosses to\n * the bundle through a serialized `window` global; the connect URL is derived\n * in the browser from the page's own origin, so the server never guesses its\n * public hostname.\n */\nimport type { InspectorOptions } from \"./config.js\";\nimport { pathUnderBase, type FetchHandler } from \"./fetch-app.js\";\n\n/**\n * npm dist-tag of the `@mcp-use/inspector` CDN bundle the default URL follows.\n *\n * Every new Inspector beta published with this tag becomes the default\n * inspector for mcp-use servers without requiring an mcp-use release.\n */\nexport const INSPECTOR_TAG = \"beta\";\n\n/**\n * Legacy direct URL for the mutable `@mcp-use/inspector` beta-tag bundle.\n * Passing this URL through {@link InspectorOptions.assetsUrl} bypasses the\n * default loader that resolves the tag to one immutable release.\n *\n * @deprecated Leave `assetsUrl` undefined to resolve the latest beta safely,\n * or provide an exact-version or self-hosted URL as an explicit override.\n */\nexport const DEFAULT_INSPECTOR_ASSETS_URL = `https://cdn.jsdelivr.net/npm/@mcp-use/inspector@${INSPECTOR_TAG}/dist/cdn/inspector.js`;\n\nconst INSPECTOR_VERSION_RESOLVER_URL = `https://data.jsdelivr.com/v1/packages/npm/@mcp-use/inspector/resolved?specifier=${INSPECTOR_TAG}`;\nconst INSPECTOR_CDN_PACKAGE_URL =\n \"https://cdn.jsdelivr.net/npm/@mcp-use/inspector\";\n\n/**\n * Derive the stylesheet URL that accompanies an inspector bundle URL.\n *\n * The CDN build ships as dist/cdn/inspector.js + dist/cdn/inspector.css\n * plus sibling lazy chunks referenced by the entry script. The stylesheet URL\n * is the script URL with its `.js` suffix swapped for `.css`. Query\n * strings and fragments are preserved.\n */\nexport function inspectorStylesUrl(assetsUrl: string): string {\n return assetsUrl.replace(/\\.js(?=$|[?#])/, \".css\");\n}\n\n/** True for inspector UI shell routes (SPA), excluding `/inspector/api/*`. */\nexport function matchesInspectorShellPath(\n pathname: string,\n basePath: string\n): boolean {\n const prefix = pathUnderBase(basePath, \"inspector\");\n if (pathname !== prefix && !pathname.startsWith(`${prefix}/`)) {\n return false;\n }\n const suffix = pathname.slice(prefix.length);\n return suffix !== \"/api\" && !suffix.startsWith(\"/api/\");\n}\n\n/** Inputs for {@link renderInspectorShell}. */\nexport interface InspectorShellOptions {\n /** Server display name, used in the page title. */\n serverName: string;\n /** Route path the MCP endpoint is mounted on (e.g. `/mcp`). */\n basePath: string;\n /** Browser favicon URL, normally the server's root-level `/favicon.ico`. */\n faviconHref?: string | undefined;\n /** MIME type for the favicon link tag when known. */\n faviconType?: string | undefined;\n /**\n * Full replacement URL for the inspector bundle script. When omitted, the\n * shell resolves {@link INSPECTOR_TAG} to one exact release before loading.\n */\n assetsUrl?: string | undefined;\n /** Hosted managed-chat URL (`window.__MANUFACT_CHAT_URL__`). */\n manufactChatUrl?: string | undefined;\n}\n\n/** Escape a string for interpolation into HTML text or attribute values. */\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\n}\n\n/**\n * Serialize a value for interpolation inside an inline `<script>` body.\n *\n * `<` is escaped to its unicode JSON escape (backslash-u003c) so serialized\n * config can never form a `</script>` (or `<!--`) sequence and break out of\n * the script element.\n */\nfunction serializeForInlineScript(value: string): string {\n return JSON.stringify(value).replaceAll(\"<\", \"\\\\u003c\");\n}\n\n/** Render the default loader that resolves one immutable Inspector release. */\nfunction renderDefaultInspectorAssetLoader(): string {\n return `<script type=\"module\">\n const resolverUrl = ${serializeForInlineScript(INSPECTOR_VERSION_RESOLVER_URL)};\n const packageUrl = ${serializeForInlineScript(INSPECTOR_CDN_PACKAGE_URL)};\n const versionPattern = /^\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:-[0-9A-Za-z.-]+)?(?:\\\\+[0-9A-Za-z.-]+)?$/;\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 10_000);\n let response;\n try {\n response = await fetch(resolverUrl, { signal: controller.signal });\n } finally {\n clearTimeout(timeout);\n }\n if (!response.ok) {\n throw new Error(\\`Inspector version resolver returned HTTP \\${response.status}\\`);\n }\n\n const resolved = await response.json();\n if (\n resolved?.name !== \"@mcp-use/inspector\" ||\n typeof resolved.version !== \"string\" ||\n !versionPattern.test(resolved.version)\n ) {\n throw new Error(\"Inspector version resolver returned an invalid release\");\n }\n\n const version = resolved.version;\n const assetBase = \\`\\${packageUrl}@\\${version}/dist/cdn\\`;\n const stylesheet = document.createElement(\"link\");\n stylesheet.rel = \"stylesheet\";\n stylesheet.href = \\`\\${assetBase}/inspector.css\\`;\n document.head.append(stylesheet);\n\n window.__INSPECTOR_VERSION__ = version;\n await import(\\`\\${assetBase}/inspector.js\\`);\n } catch (error) {\n console.error(\"[Inspector] Failed to load the latest Inspector release:\", error);\n document.querySelector(\".mcp-boot-spinner\")?.remove();\n const label = document.querySelector(\".mcp-boot-label\");\n if (label) {\n label.textContent = \"Unable to load Inspector. Reload to try again.\";\n }\n }\n </script>`;\n}\n\n/**\n * Render the inspector shell page.\n *\n * A minimal shell document whose background matches the inspector UI\n * with a `#root` mount node pre-filled by a centered boot spinner so the\n * page is not blank while the CDN bundle downloads, an inline script\n * publishing `window.__MCP_USE_INSPECTOR__ = { autoConnectUrl, basePath }`\n * — where `autoConnectUrl` is computed client-side as\n * `window.location.origin + basePath` — and either a default inline loader\n * that resolves the latest beta to one immutable asset version or direct\n * stylesheet and module tags for a custom asset URL. All server-provided\n * values are HTML-escaped or JSON-serialized with `<` escaped, so config can't\n * inject markup.\n */\nexport function renderInspectorShell(options: InspectorShellOptions): string {\n const {\n serverName,\n basePath,\n faviconHref,\n faviconType,\n assetsUrl,\n manufactChatUrl,\n } = options;\n const serializedBasePath = serializeForInlineScript(basePath);\n const serializedManufactChatUrl = manufactChatUrl\n ? serializeForInlineScript(manufactChatUrl)\n : null;\n const usesDefaultAssets = assetsUrl === undefined;\n const customScriptSrc =\n assetsUrl === undefined ? null : escapeHtml(assetsUrl);\n const customStylesHref =\n assetsUrl === undefined ? null : escapeHtml(inspectorStylesUrl(assetsUrl));\n const assetPreconnects = usesDefaultAssets\n ? ` <link rel=\"preconnect\" href=\"https://data.jsdelivr.com\" crossorigin />\n <link rel=\"preconnect\" href=\"https://cdn.jsdelivr.net\" crossorigin />`\n : \"\";\n const stylesheetTag =\n customStylesHref !== null\n ? ` <link rel=\"stylesheet\" href=\"${customStylesHref}\" />`\n : \"\";\n const assetLoader = usesDefaultAssets\n ? renderDefaultInspectorAssetLoader()\n : `<script type=\"module\" src=\"${customScriptSrc}\"></script>`;\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${escapeHtml(serverName)} — MCP Inspector</title>\n ${faviconHref !== undefined ? `<link rel=\"icon\"${faviconType !== undefined ? ` type=\"${escapeHtml(faviconType)}\"` : \"\"} href=\"${escapeHtml(faviconHref)}\" />` : \"\"}\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" />\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin />\n${assetPreconnects}\n <link\n href=\"https://fonts.googleapis.com/css2?family=Ubuntu:wght@400;500;700&display=swap\"\n rel=\"stylesheet\"\n />\n${stylesheetTag}\n <style>\n :root { color-scheme: light dark; }\n html, body { height: 100%; margin: 0; background-color: #f3f3f3; }\n #root { height: 100%; }\n .mcp-boot {\n display: flex;\n height: 100%;\n align-items: center;\n justify-content: center;\n background-color: #f3f3f3;\n }\n .mcp-boot-inner {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n }\n .mcp-boot-spinner {\n width: 32px;\n height: 32px;\n color: #52525b;\n animation: mcp-boot-spin 1s linear infinite;\n }\n .mcp-boot-label {\n margin: 0;\n font-family: Ubuntu, sans-serif;\n font-size: 0.875rem;\n line-height: 1.25rem;\n color: #52525b;\n }\n @keyframes mcp-boot-spin {\n to { transform: rotate(360deg); }\n }\n @media (prefers-color-scheme: dark) {\n html, body { background-color: #000; }\n .mcp-boot { background-color: #000; }\n .mcp-boot-spinner, .mcp-boot-label { color: #a1a1aa; }\n }\n </style>\n </head>\n <body>\n <div id=\"root\">\n <div class=\"mcp-boot\">\n <div class=\"mcp-boot-inner\">\n <svg\n class=\"mcp-boot-spinner\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n role=\"status\"\n aria-label=\"Loading\"\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n <p class=\"mcp-boot-label\">Connecting to MCP server...</p>\n </div>\n </div>\n </div>\n <script>\n (function () {\n var basePath = ${serializedBasePath};\n // The connect URL is derived from the page's own origin: the server\n // never guesses the hostname a browser reached it by.\n window.__MCP_USE_INSPECTOR__ = {\n autoConnectUrl: window.location.origin + basePath,\n basePath: basePath,\n };\n // Read by the current inspector bundle to derive its own URLs.\n window.__MCP_BASE_PATH__ = basePath;\n ${process.env.MCP_USE_DEV_CLI === \"1\" ? \"window.__MCP_DEV_CLI__ = true;\" : \"\"}\n ${serializedManufactChatUrl ? `window.__MANUFACT_CHAT_URL__ = ${serializedManufactChatUrl};` : \"\"}\n // The bundle carries Node-flavored dependencies that touch \\`process\\`\n // at module scope; give them the same browser polyfill the v1\n // inspector shell provides, or the bundle throws on load.\n if (typeof window.process === \"undefined\") {\n window.process = {\n env: {},\n platform: \"browser\",\n browser: true,\n version: \"v18.0.0\",\n versions: { node: \"18.0.0\" },\n cwd: function () { return \"/\"; },\n nextTick: function (fn) {\n var args = Array.prototype.slice.call(arguments, 1);\n queueMicrotask(function () { fn.apply(null, args); });\n },\n };\n }\n })();\n </script>\n ${assetLoader}\n </body>\n</html>\n`;\n}\n\n/**\n * Fetch handler for `${basePath}/inspector` (GET and HEAD).\n *\n * No-op when `inspector.enabled` is `false`; `undefined` and `{}` mean enabled.\n *\n * @internal Wiring for `MCPServer`.\n */\nexport function createInspectorHandler(\n inspector: InspectorOptions | undefined,\n options: {\n serverName: string;\n basePath: string;\n faviconHref?: string;\n faviconType?: string;\n }\n): FetchHandler | undefined {\n if (inspector?.enabled === false) {\n return undefined;\n }\n const { assetsUrl: configAssetsUrl, manufactChatUrl: configManufactChatUrl } =\n inspector ?? {};\n const assetsUrl =\n configAssetsUrl ?? process.env[\"MCP_USE_INSPECTOR_ASSETS_URL\"] ?? undefined;\n const manufactChatUrl =\n configManufactChatUrl ?? process.env[\"MANUFACT_CHAT_URL\"] ?? undefined;\n const shellOptions: InspectorShellOptions = {\n serverName: options.serverName,\n basePath: options.basePath,\n ...(options.faviconHref !== undefined && {\n faviconHref: options.faviconHref,\n }),\n ...(options.faviconType !== undefined && {\n faviconType: options.faviconType,\n }),\n assetsUrl,\n manufactChatUrl,\n };\n\n return async (request) => {\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n return new Response(\"Method Not Allowed\", { status: 405 });\n }\n const pathname = new URL(request.url).pathname;\n if (!matchesInspectorShellPath(pathname, options.basePath)) {\n return new Response(\"Not Found\", { status: 404 });\n }\n const html = renderInspectorShell(shellOptions);\n return new Response(request.method === \"HEAD\" ? null : html, {\n status: 200,\n headers: { \"content-type\": \"text/html; charset=utf-8\" },\n });\n };\n}\n\n/**\n * @deprecated Use {@link createInspectorHandler}.\n *\n * @internal\n */\nexport function mountInspectorShell(): void {\n throw new Error(\n \"mountInspectorShell(app) was removed — use createInspectorHandler\"\n );\n}\n","/**\n * Compact HTTP/MCP request logging.\n *\n * One summary line per HTTP request, plus an indented detail line for MCP\n * (JSON-RPC) requests naming the protocol method, its subject (tool name,\n * resource URI, prompt name), and the calling client:\n *\n * ```text\n * 12:45:01 POST /mcp 200 in 12ms\n * tools/call greet raw-request/0.0.0\n * ```\n *\n * Detail lines are plain two-space-indented ASCII (no box-drawing glyphs) so\n * log parsers and agents can tell the two apart mechanically: summary lines\n * start with a timestamp, detail lines start with whitespace.\n *\n * Three verbosity levels, resolved per request from the `MCP_USE_LOG_LEVEL`\n * environment variable (overriding any configured level):\n *\n * - `info` (default): the compact summary + detail lines only — no request\n * or response payloads, so secrets in tool arguments/results stay out of\n * production logs.\n * - `debug`: echoes compact truncated input/output on the detail line:\n * `tools/call greet {\"who\":\"world\"} -> \"hi world\" raw-request/0.0.0`.\n * - `trace`: debug plus a full request/response dump (headers and bodies)\n * after the summary.\n */\nimport {\n CLIENT_INFO_META_KEY,\n isJSONRPCRequest,\n type Implementation,\n type JSONRPCRequest,\n type RequestMethod,\n type RequestTypeMap,\n} from \"@modelcontextprotocol/server\";\n\nimport { getRequestBag, type FetchMiddleware } from \"./fetch-app.js\";\n\n/** Verbosity of the request logger. */\nexport type LogLevel = \"info\" | \"debug\" | \"trace\";\n\n/** Options for {@link requestLogger} — the shape of `config.logging`. */\nexport interface LoggingOptions {\n /**\n * Whether request logging is on.\n *\n * @defaultValue `true`\n */\n enabled?: boolean;\n /**\n * Verbosity: `info` (compact lines without payloads, default), `debug`\n * (adds compact truncated input/output on the detail line), or `trace`\n * (debug plus full request/response header and body dumps). The\n * `MCP_USE_LOG_LEVEL` environment variable overrides this when set.\n */\n level?: LogLevel;\n}\n\n/* ------------------------------------------------------------------------ *\n * ANSI styling (no color-library dependency)\n * ------------------------------------------------------------------------ */\n\n/**\n * Whether to emit ANSI escapes: only on a TTY stdout, and never when the\n * `NO_COLOR` convention is set. Edge runtimes without `process.stdout`\n * (Workers, Deno Deploy) get plain text.\n */\nfunction colorsEnabled(): boolean {\n if (typeof process === \"undefined\") return false;\n if (process.env?.[\"NO_COLOR\"] !== undefined) return false;\n return process.stdout?.isTTY === true;\n}\n\ntype Style = (text: string) => string;\n\nfunction ansi(open: number, close: number): Style {\n return (text) =>\n colorsEnabled() ? `\\u001B[${open}m${text}\\u001B[${close}m` : text;\n}\n\nconst bold = ansi(1, 22);\nconst dim = ansi(2, 22);\nconst red = ansi(31, 39);\nconst green = ansi(32, 39);\nconst yellow = ansi(33, 39);\nconst blue = ansi(34, 39);\nconst magenta = ansi(35, 39);\nconst cyan = ansi(36, 39);\nconst gray = ansi(90, 39);\n\n/* ------------------------------------------------------------------------ *\n * Level resolution\n * ------------------------------------------------------------------------ */\n\n/**\n * Effective log level: `MCP_USE_LOG_LEVEL` when it names a known level,\n * otherwise the configured level, otherwise `info`.\n */\nexport function resolveLogLevel(configured?: LogLevel): LogLevel {\n const raw =\n typeof process === \"undefined\"\n ? undefined\n : process.env?.[\"MCP_USE_LOG_LEVEL\"]?.toLowerCase();\n if (raw === \"info\" || raw === \"debug\" || raw === \"trace\") return raw;\n return configured ?? \"info\";\n}\n\n/* ------------------------------------------------------------------------ *\n * MCP detail formatting (typed against the SDK's protocol method surface)\n * ------------------------------------------------------------------------ */\n\n/** What one protocol method contributes to the detail line. */\ninterface McpDetail {\n /** Short subject next to the method name (tool name, resource URI, …). */\n subject?: string | undefined;\n /** Caller-provided input worth echoing inline (tool/prompt arguments). */\n input?: unknown;\n}\n\n/**\n * Detail extractor for one protocol method: given the method's typed params,\n * return the subject and inline input to show, or `{}` when the method name\n * says it all.\n */\ntype DetailFormatter<M extends RequestMethod> = (\n params: RequestTypeMap[M][\"params\"]\n) => McpDetail;\n\nfunction formatClientInfo(\n info: Implementation | undefined\n): string | undefined {\n if (info === undefined) return undefined;\n return typeof info.version === \"string\" && info.version !== \"\"\n ? `${info.name}/${info.version}`\n : info.name;\n}\n\n/**\n * Exhaustive over {@link RequestMethod}: adding a protocol method to the SDK\n * makes this table a compile error until a formatter is chosen — the inverse\n * of v1's silent `[unknown-method]` fallback.\n */\nconst detailFormatters: {\n [M in RequestMethod]: DetailFormatter<M>;\n} = {\n initialize: (p) => ({ subject: formatClientInfo(p.clientInfo) }),\n ping: () => ({}),\n \"server/discover\": () => ({}),\n \"completion/complete\": (p) => ({\n subject: p.ref.type === \"ref/prompt\" ? p.ref.name : p.ref.uri,\n input: p.argument,\n }),\n \"logging/setLevel\": (p) => ({ subject: p.level }),\n \"prompts/get\": (p) => ({ subject: p.name, input: p.arguments }),\n \"prompts/list\": () => ({}),\n \"resources/list\": () => ({}),\n \"resources/templates/list\": () => ({}),\n \"resources/read\": (p) => ({ subject: p.uri }),\n \"resources/subscribe\": (p) => ({ subject: p.uri }),\n \"resources/unsubscribe\": (p) => ({ subject: p.uri }),\n \"subscriptions/listen\": () => ({}),\n \"tools/call\": (p) => ({ subject: p.name, input: p.arguments }),\n \"tools/list\": () => ({}),\n \"sampling/createMessage\": () => ({}),\n \"elicitation/create\": () => ({}),\n \"roots/list\": () => ({}),\n};\n\nfunction isKnownMethod(method: string): method is RequestMethod {\n return Object.prototype.hasOwnProperty.call(detailFormatters, method);\n}\n\n/**\n * Detail for a guard-proved JSON-RPC request. The guard proves the JSON-RPC\n * envelope, not method-specific params, so the formatter call is fenced: a\n * malformed body (which the SDK will reject downstream anyway) logs without\n * a subject rather than throwing here.\n */\nfunction formatDetail(message: JSONRPCRequest): McpDetail {\n if (!isKnownMethod(message.method)) return {};\n try {\n const formatter = detailFormatters[message.method] as (\n params: unknown\n ) => McpDetail;\n const detail = formatter(message.params);\n return typeof detail.subject === \"string\" || detail.subject === undefined\n ? detail\n : {};\n } catch {\n return {};\n }\n}\n\n/** Longest inline JSON segment (input or output) before truncation. */\nconst INLINE_JSON_MAX_LENGTH = 80;\n\n/**\n * Compact single-line JSON for inline input/output echoing, truncated to\n * {@link INLINE_JSON_MAX_LENGTH} characters.\n */\nfunction inlineJson(value: unknown): string {\n let text: string;\n try {\n text = JSON.stringify(value) ?? String(value);\n } catch {\n text = String(value);\n }\n return text.length > INLINE_JSON_MAX_LENGTH\n ? `${text.slice(0, INLINE_JSON_MAX_LENGTH)}...`\n : text;\n}\n\n/**\n * Client identity from the per-request `_meta` envelope every 2026-07-28\n * request carries (`io.modelcontextprotocol/clientInfo`) — the stateless\n * replacement for v1's session-id prefix. `undefined` for requests without\n * the envelope (legacy-era traffic).\n */\nfunction formatClientIdentity(message: JSONRPCRequest): string | undefined {\n const meta = message.params?._meta;\n if (meta === undefined) return undefined;\n const info = (meta as Record<string, unknown>)[CLIENT_INFO_META_KEY];\n if (\n typeof info !== \"object\" ||\n info === null ||\n typeof (info as Implementation).name !== \"string\"\n ) {\n return undefined;\n }\n return formatClientInfo(info as Implementation);\n}\n\n/**\n * Strip control characters (newlines, ANSI escapes, …) from request-derived\n * strings so a hostile method/subject/error value cannot forge extra log\n * lines or terminal escape sequences.\n */\nfunction sanitize(text: string): string {\n // eslint-disable-next-line no-control-regex\n return text.replace(/[\\u0000-\\u001F\\u007F-\\u009F]+/g, \" \");\n}\n\n/** Namespace color for the detail line's method segment. */\nfunction methodStyle(method: string): Style {\n if (method.startsWith(\"tools/\")) return cyan;\n if (method.startsWith(\"resources/\")) return green;\n if (method.startsWith(\"prompts/\")) return magenta;\n if (method === \"initialize\" || method === \"ping\") return gray;\n return blue;\n}\n\n/* ------------------------------------------------------------------------ *\n * Response outcome\n * ------------------------------------------------------------------------ */\n\n/** Header names whose values are credentials and never worth dumping. */\nconst REDACTED_HEADERS = new Set([\n \"authorization\",\n \"proxy-authorization\",\n \"cookie\",\n \"set-cookie\",\n \"x-api-key\",\n]);\n\n/** Replace credential-bearing header values with a `[REDACTED]` marker. */\nfunction redactHeaders(\n headers: Record<string, string>\n): Record<string, string> {\n return Object.fromEntries(\n Object.entries(headers).map(([name, value]) => [\n name,\n REDACTED_HEADERS.has(name.toLowerCase()) ? \"[REDACTED]\" : value,\n ])\n );\n}\n\n/** The JSON-RPC-level outcome parsed from a response body. */\ninterface ResponseOutcome {\n /** Error message when the exchange failed (JSON-RPC error or tool error). */\n errorMessage: string | null;\n /** The JSON-RPC `result` payload when the exchange succeeded. */\n result?: unknown;\n}\n\n/**\n * Parse the JSON-RPC outcome from the response body: an error message from\n * the error envelope (`{ error: { message } }`) or a tool-call error\n * (`{ result: { isError: true, content: [{ text }] } }`), otherwise the\n * successful `result` payload. Handles both `application/json` and\n * `text/event-stream` bodies.\n */\nasync function extractResponseOutcome(res: Response): Promise<ResponseOutcome> {\n if (!res.body) return { errorMessage: null };\n\n let text: string;\n try {\n text = await res.clone().text();\n } catch {\n return { errorMessage: null };\n }\n if (!text) return { errorMessage: null };\n\n const isSse = (res.headers.get(\"content-type\") ?? \"\").includes(\n \"text/event-stream\"\n );\n const payloads: unknown[] = [];\n const tryParse = (raw: string) => {\n try {\n payloads.push(JSON.parse(raw));\n } catch {\n // not JSON — skip\n }\n };\n if (isSse) {\n for (const line of text.split(/\\r?\\n/)) {\n if (line.startsWith(\"data:\")) {\n const data = line.slice(5).trim();\n if (data) tryParse(data);\n }\n }\n } else {\n tryParse(text);\n }\n\n let result: unknown;\n for (const payload of payloads) {\n if (payload === null || typeof payload !== \"object\") continue;\n const message = payload as {\n error?: { message?: unknown };\n result?: { isError?: unknown; content?: unknown };\n };\n if (typeof message.error?.message === \"string\") {\n return { errorMessage: message.error.message };\n }\n if (message.result?.isError === true) {\n const blocks = Array.isArray(message.result.content)\n ? (message.result.content as { type?: unknown; text?: unknown }[])\n : [];\n const textBlock = blocks.find(\n (b) => b?.type === \"text\" && typeof b.text === \"string\"\n );\n return {\n errorMessage: textBlock ? String(textBlock.text) : \"tool error\",\n };\n }\n if (\"result\" in message) result = message.result;\n }\n return { errorMessage: null, result };\n}\n\n/**\n * Compact view of a successful `tools/call` result for inline echoing:\n * `structuredContent` when present, a lone text block's text, or the raw\n * content blocks.\n */\nfunction compactToolResult(result: unknown): unknown {\n if (result === null || typeof result !== \"object\") return result;\n const { structuredContent, content } = result as {\n structuredContent?: unknown;\n content?: unknown;\n };\n if (structuredContent !== undefined) return structuredContent;\n if (Array.isArray(content)) {\n const [block] = content as { type?: unknown; text?: unknown }[];\n if (content.length === 1 && block?.type === \"text\") return block.text;\n }\n return content;\n}\n\n/* ------------------------------------------------------------------------ *\n * Trace dump\n * ------------------------------------------------------------------------ */\n\n/** Pretty-print a value for the trace dump, truncating long strings. */\nfunction formatForDump(value: unknown): string {\n function truncate(val: unknown): unknown {\n if (typeof val === \"string\" && val.length > 100) {\n return `${val.slice(0, 100)}...`;\n }\n if (Array.isArray(val)) return val.map(truncate);\n if (val !== null && typeof val === \"object\") {\n return Object.fromEntries(\n Object.entries(val as Record<string, unknown>).map(([k, v]) => [\n k,\n truncate(v),\n ])\n );\n }\n return val;\n }\n try {\n return JSON.stringify(truncate(value), null, 2);\n } catch {\n return String(value);\n }\n}\n\nconst DUMP_BODY_MAX_LENGTH = 10_000;\n\nasync function printTraceDump(\n response: Response,\n requestHeaders: Record<string, string>,\n requestBody: unknown,\n readResponseBody: boolean\n): Promise<void> {\n console.log(`\\n${cyan(\"=\".repeat(80))}`);\n console.log(bold(cyan(\"[TRACE] Request Details\")));\n console.log(cyan(\"-\".repeat(80)));\n\n if (Object.keys(requestHeaders).length > 0) {\n console.log(yellow(\"Request Headers:\"));\n console.log(formatForDump(redactHeaders(requestHeaders)));\n }\n if (requestBody !== undefined) {\n console.log(yellow(\"Request Body:\"));\n console.log(\n typeof requestBody === \"string\" ? requestBody : formatForDump(requestBody)\n );\n }\n\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n if (Object.keys(responseHeaders).length > 0) {\n console.log(yellow(\"Response Headers:\"));\n console.log(formatForDump(redactHeaders(responseHeaders)));\n }\n\n if (!readResponseBody) {\n console.log(`${yellow(\"Response Body:\")} (streaming — not dumped)`);\n } else if (response.body === null) {\n console.log(`${yellow(\"Response Body:\")} (no body)`);\n } else {\n try {\n const text = await response.clone().text();\n if (text.length === 0) {\n console.log(`${yellow(\"Response Body:\")} (empty)`);\n } else {\n console.log(yellow(\"Response Body:\"));\n try {\n console.log(formatForDump(JSON.parse(text)));\n } catch {\n console.log(\n text.length > DUMP_BODY_MAX_LENGTH\n ? `${text.slice(0, DUMP_BODY_MAX_LENGTH)}\\n... (truncated, ${\n text.length - DUMP_BODY_MAX_LENGTH\n } more characters)`\n : text\n );\n }\n }\n } catch {\n console.log(`${yellow(\"Response Body:\")} (unable to read)`);\n }\n }\n\n console.log(`${cyan(\"=\".repeat(80))}\\n`);\n}\n\n/* ------------------------------------------------------------------------ *\n * Middleware\n * ------------------------------------------------------------------------ */\n\n/** Style an HTTP status code by its class. */\nfunction styleStatus(status: number): string {\n const text = String(status);\n if (status >= 500) return magenta(text);\n if (status >= 400) return red(text);\n if (status >= 300) return yellow(text);\n return green(text);\n}\n\n/**\n * Cosmetic noise suppression: inspector shell page loads and favicon probes\n * add nothing to a request log.\n */\nfunction isNoisyRequest(httpMethod: string, pathname: string): boolean {\n if (httpMethod !== \"GET\" && httpMethod !== \"HEAD\") return false;\n return pathname.includes(\"/inspector\") || pathname.endsWith(\"/favicon.ico\");\n}\n\n/**\n * Fetch middleware logging every request in the compact two-line format (see\n * the module docs). `MCPServer` registers it automatically unless\n * `config.logging.enabled` is `false`.\n */\nexport function requestLogger(options: LoggingOptions = {}): FetchMiddleware {\n if (options.enabled === false) {\n return (_request, next) => next();\n }\n return async (request, next) => {\n const level = resolveLogLevel(options.level);\n const startedAt = Date.now();\n const httpMethod = request.method;\n const pathname = new URL(request.url).pathname;\n\n if (isNoisyRequest(httpMethod, pathname)) {\n return next();\n }\n\n const requestHeaders: Record<string, string> = {};\n if (level === \"trace\") {\n request.headers.forEach((value, key) => {\n requestHeaders[key] = value;\n });\n }\n\n let requestBody: unknown;\n if (httpMethod !== \"GET\" && httpMethod !== \"HEAD\") {\n const parsedBody = getRequestBag(request).parsedBody;\n if (parsedBody !== undefined) {\n requestBody = parsedBody;\n } else {\n try {\n requestBody = await request.clone().json();\n } catch {\n // Non-JSON body — the summary line logs without MCP detail.\n }\n }\n }\n\n const response = await next();\n\n const durationMs = Date.now() - startedAt;\n const timestamp = new Date().toISOString().substring(11, 19);\n const mcpRequest = isJSONRPCRequest(requestBody) ? requestBody : undefined;\n const isStreamingMethod = mcpRequest?.method === \"subscriptions/listen\";\n\n const lines: string[] = [\n [\n dim(timestamp),\n bold(httpMethod),\n pathname,\n styleStatus(response.status),\n dim(`in ${durationMs}ms`),\n ].join(\" \"),\n ];\n\n if (mcpRequest !== undefined) {\n const method = sanitize(mcpRequest.method);\n const parts: string[] = [` ${methodStyle(method)(method)}`];\n const detail = formatDetail(mcpRequest);\n if (detail.subject !== undefined) {\n parts.push(bold(sanitize(detail.subject)));\n }\n const echoPayloads = level !== \"info\";\n if (echoPayloads && detail.input !== undefined) {\n parts.push(inlineJson(detail.input));\n }\n const outcome: ResponseOutcome = isStreamingMethod\n ? { errorMessage: null }\n : await extractResponseOutcome(response);\n if (\n echoPayloads &&\n mcpRequest.method === \"tools/call\" &&\n outcome.errorMessage === null &&\n outcome.result !== undefined\n ) {\n parts.push(dim(\"->\"), inlineJson(compactToolResult(outcome.result)));\n }\n if (mcpRequest.method !== \"initialize\") {\n const client = formatClientIdentity(mcpRequest);\n if (client !== undefined) parts.push(dim(sanitize(client)));\n }\n if (outcome.errorMessage !== null) {\n parts.push(red(`ERROR ${sanitize(outcome.errorMessage)}`));\n } else if (response.status >= 400) {\n parts.push(red(`ERROR (HTTP ${response.status})`));\n }\n lines.push(parts.join(\" \"));\n }\n\n console.log(lines.join(\"\\n\"));\n\n if (level === \"trace\") {\n await printTraceDump(\n response,\n requestHeaders,\n requestBody,\n !isStreamingMethod\n );\n }\n\n return response;\n };\n}\n","import {\n createMcpHandler,\n type AuthInfo,\n type CreateMcpHandlerOptions,\n type McpHttpHandler,\n type McpServerFactory,\n} from \"@modelcontextprotocol/server\";\n\nimport { getRequestBag, matchesPath, type FetchHandler } from \"./fetch-app.js\";\nimport {\n extractClientCapabilitiesFromBody,\n stashClientCapabilities,\n} from \"./views/capabilities.js\";\n\n/** Options for {@link createMcpMount}. */\nexport interface MountMcpOptions {\n /** Route path the MCP endpoint is served on. Defaults to `/mcp`. */\n path?: string;\n /**\n * Options forwarded to the SDK's `createMcpHandler`.\n *\n * `legacy` defaults to `\"stateless\"`: 2025-era (non-envelope) requests are\n * served by a fresh instance over a session-less streamable HTTP transport.\n * Pass `legacy: \"reject\"` for modern-only strict serving, where\n * legacy-classified requests get the unsupported-protocol-version error.\n */\n handler?: CreateMcpHandlerOptions;\n /**\n * Produce verified {@link AuthInfo} for the request before the SDK handler\n * runs. When omitted, requests are served without authenticated identity.\n */\n authInfo?: (request: Request) => AuthInfo | undefined;\n}\n\n/** Result of {@link createMcpMount}. */\nexport interface McpMount {\n /** Underlying SDK handler (`close`, `notify`, `bus`). */\n handler: McpHttpHandler;\n /** Fetch handler for the MCP path only (compose into a larger app). */\n fetch: FetchHandler;\n}\n\n/**\n * Create the MCP Streamable HTTP endpoint as a fetch handler.\n *\n * Returns the underlying `McpHttpHandler` so callers can call `close()` on\n * shutdown to abort in-flight exchanges, and use `notify`/`bus` for\n * list-changed notifications.\n *\n * Compose the returned `fetch` into a larger app with {@link composeFetch}\n * from `mcp-use`, and put Host/Origin validation in front when binding\n * locally or exposing the process directly.\n *\n * @example\n * ```ts\n * const { handler, fetch: mcpFetch } = createMcpMount(factory);\n * const app = composeFetch(mcpFetch, jsonBodyMiddleware(), hostValidationMiddleware(hosts));\n * ```\n */\nexport function createMcpMount(\n factory: McpServerFactory,\n options: MountMcpOptions = {}\n): McpMount {\n const {\n path = \"/mcp\",\n handler: handlerOptions,\n authInfo: getAuthInfo,\n } = options;\n const legacyMode = handlerOptions?.legacy ?? \"stateless\";\n const handler = createMcpHandler(factory, {\n legacy: \"stateless\",\n ...handlerOptions,\n });\n\n const fetch: FetchHandler = async (request) => {\n if (!matchesPath(request, path)) {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n // ponytail: stateless wire is POST-only; SDK GET/DELETE/HEAD probes are optional.\n // 204 avoids browser console noise from 405 while remaining client-safe.\n if (legacyMode === \"stateless\") {\n const method = request.method.toUpperCase();\n if (method === \"GET\" || method === \"DELETE\" || method === \"HEAD\") {\n return new Response(null, { status: 204 });\n }\n }\n\n const bag = getRequestBag(request);\n let parsedBody = bag.parsedBody;\n if (parsedBody === undefined) {\n try {\n parsedBody = await request.clone().json();\n } catch {\n // Non-JSON or empty body — the SDK handler will surface the error.\n }\n }\n\n const capabilities = extractClientCapabilitiesFromBody(parsedBody);\n if (capabilities !== undefined) {\n stashClientCapabilities(request, capabilities);\n }\n\n const authInfo = getAuthInfo?.(request) ?? bag.authInfo;\n return handler.fetch(request, {\n ...(parsedBody !== undefined && { parsedBody }),\n ...(authInfo !== undefined && { authInfo }),\n });\n };\n\n return { handler, fetch };\n}\n","import type {\n CallToolResult,\n InputRequiredResult,\n MetaObject,\n StandardSchemaWithJSON,\n ToolAnnotations,\n} from \"@modelcontextprotocol/server\";\n\nimport type { McpUiResourceCsp } from \"@modelcontextprotocol/ext-apps\";\n\nimport type { RequestContext } from \"./context.js\";\nimport type { UiPermissions } from \"./views/types.js\";\n\n/**\n * Binds a tool to a view directory for MCP Apps rendering.\n *\n * A view may have at most one bound tool. That tool owns the resource facts\n * (`description`, `csp`, `permissions`, `domain`, `prefersBorder`); a second\n * tool that names the same view is rejected. The view file exports the\n * component, while the framework emits these fields on the view's MCP\n * resource, where hosts read `_meta.ui`.\n */\nexport interface ToolViewConfig {\n /** View directory / registry name, e.g. `\"product-search-result\"`. */\n name: string;\n /**\n * Human-readable description of the view resource → the resource's\n * `description` on `resources/list` and `resources/read`.\n */\n description?: string;\n /**\n * CSP domains the host must allow → resource `_meta.ui.csp`. The framework\n * appends the server origin to `connectDomains` and the configured assets\n * origin (or server origin) to `resourceDomains` at emission time. Other\n * author-set fields (`frameDomains`, `baseUriDomains`, …) pass through.\n */\n csp?: McpUiResourceCsp;\n /** Sandbox permissions the view needs → resource `_meta.ui.permissions`. */\n permissions?: UiPermissions;\n /**\n * Dedicated origin hint for hosts that render views on a separate domain →\n * resource `_meta.ui.domain`.\n */\n domain?: string;\n /**\n * Ask the host to draw a border around the view → resource\n * `_meta.ui.prefersBorder`.\n */\n prefersBorder?: boolean;\n}\n\n/** Declares a tool's identity, LLM-facing description, and schemas. First argument to {@link MCPServer.tool}. */\nexport interface ToolDefinition {\n /** Unique tool identifier, e.g. `\"fetch-weather\"`. */\n name: string;\n /** Human-readable title shown in UIs (falls back to `name`). */\n title?: string;\n /** LLM-facing description of what the tool does. */\n description?: string;\n /**\n * Object schema for input validation — any Standard Schema library with\n * JSON Schema conversion ({@link StandardSchemaWithJSON}): zod v4, ArkType,\n * Valibot, …. Field descriptions become LLM hints. Input is validated by\n * the SDK before the callback runs. Emitted on the wire as `inputSchema`.\n */\n inputSchema?: StandardSchemaWithJSON;\n /**\n * Alias for {@link ToolDefinition.inputSchema}. Prefer `inputSchema` in new\n * code — it matches the MCP wire field name.\n */\n schema?: StandardSchemaWithJSON;\n /**\n * Schema for structured output ({@link StandardSchemaWithJSON}). Any JSON\n * root is allowed — object, array, or primitive (2026-07-28 protocol).\n * When set, the callback must return a result carrying matching\n * `structuredContent` or an explicit `isError` result — enforced at\n * compile time and validated by the SDK at runtime.\n */\n outputSchema?: StandardSchemaWithJSON;\n /** Behavioral hints for clients (readOnlyHint, destructiveHint, …). */\n annotations?: ToolAnnotations;\n /**\n * Extension metadata advertised on this tool's `tools/list` descriptor.\n *\n * Use vendor-namespaced keys for custom data. This definition metadata is\n * distinct from a tool callback result's `_meta`: it describes the tool,\n * while result `_meta` belongs to one invocation. For view-bound or\n * visibility-restricted tools, framework-owned MCP Apps keys are derived\n * from {@link ToolDefinition.view} and {@link ToolDefinition.visibility};\n * those derived values take precedence over colliding entries here.\n */\n _meta?: MetaObject;\n /**\n * Declares who may call or see the tool. Emitted as `_meta.ui.visibility`\n * on `tools/list`. Omitted = host default (callable by the model, visible\n * to the app). The server always lists every registered tool — hosts\n * filter by this declaration; the server never omits tools from\n * `tools/list`. `\"app\"` marks app-private helper tools callable from\n * views via `useCallTool` while the host hides them from the model.\n */\n visibility?: \"model\" | \"app\";\n /**\n * Bind this tool to a view for MCP Apps rendering. Requires\n * {@link ToolDefinition.outputSchema} — the view reads the result's\n * `structuredContent` typed by this schema.\n */\n view?: ToolViewConfig;\n}\n\n/**\n * Handle returned by {@link MCPServer.tool} — carries the tool name at runtime\n * and phantom input/output types for inference (e.g. `Register` / `useCallTool`).\n */\nexport interface ToolRef<\n Name extends string = string,\n Input = Record<string, unknown>,\n Output = never,\n> {\n /** The tool's registered name. */\n readonly name: Name;\n /**\n * Phantom carrier for the tool's inferred input/output types. Never set at\n * runtime.\n *\n * @internal\n */\n readonly \"~types\"?: { input: Input; output: Output };\n}\n\n/**\n * Result a tool callback may return, keyed by the tool's inferred output\n * type. Completed calls use the SDK's raw {@link CallToolResult}; interactive\n * calls may return an {@link InputRequiredResult}. There is no\n * framework-specific result layer.\n *\n * Without an `outputSchema` (`TOutput = never`) any `CallToolResult` is\n * accepted. With one, the result must carry `structuredContent` matching the\n * schema or set `isError: true` — mirroring the SDK's runtime rule, which\n * rejects results from schema'd tools that carry no structured content\n * unless `isError` is set.\n *\n * The SDK auto-appends a JSON text block when `structuredContent` is a\n * non-object value and no `type: \"text\"` block is present; for object-shaped\n * payloads include the text serialization yourself:\n *\n * ```ts\n * return {\n * content: [{ type: \"text\", text: JSON.stringify(data) }],\n * structuredContent: data,\n * };\n * ```\n */\nexport type ToolResult<TOutput = never> =\n | InputRequiredResult\n | ([TOutput] extends [never]\n ? CallToolResult\n :\n | (CallToolResult & { structuredContent: TOutput })\n | (CallToolResult & { isError: true }));\n\n/** Infer the callback params type from a tool definition's input schema. */\nexport type InferToolInput<T> = T extends {\n inputSchema: infer S extends StandardSchemaWithJSON;\n}\n ? StandardSchemaWithJSON.InferOutput<S> extends Record<string, unknown>\n ? StandardSchemaWithJSON.InferOutput<S>\n : Record<string, unknown>\n : T extends {\n schema: infer S extends StandardSchemaWithJSON;\n }\n ? StandardSchemaWithJSON.InferOutput<S> extends Record<string, unknown>\n ? StandardSchemaWithJSON.InferOutput<S>\n : Record<string, unknown>\n : Record<string, unknown>;\n\n/**\n * Resolve a tool definition's input schema. `inputSchema` wins when both are\n * set.\n *\n * @internal\n */\nexport function resolveToolInputSchema(\n definition: Pick<ToolDefinition, \"inputSchema\" | \"schema\">\n): StandardSchemaWithJSON | undefined {\n return definition.inputSchema ?? definition.schema;\n}\n\n/**\n * Infer the structured output type from a definition's `outputSchema` —\n * any JSON root, not just objects (2026-07-28 protocol); `never` when the\n * definition declares none (any {@link CallToolResult} is then accepted —\n * see {@link ToolResult}).\n */\nexport type InferToolOutput<T> = T extends {\n outputSchema: infer S extends StandardSchemaWithJSON;\n}\n ? StandardSchemaWithJSON.InferOutput<S>\n : never;\n\n/** Infer the literal tool name from a definition's `name` field. */\nexport type InferToolName<T> = T extends { name: infer N extends string }\n ? N\n : string;\n\n/**\n * Tool execution callback. The return type is {@link ToolResult}: tools with\n * an `outputSchema` must return matching `structuredContent` or an `isError`\n * result; tools without one accept any {@link CallToolResult}.\n */\nexport type ToolCallback<\n TInput = Record<string, unknown>,\n TOutput = never,\n TUser = never,\n HasOAuth extends boolean = false,\n> = (\n params: TInput,\n ctx: RequestContext<TUser, HasOAuth>\n) => ToolResult<TOutput> | Promise<ToolResult<TOutput>>;\n","import type { ViewsManifest } from \"./types.js\";\n\n/**\n * Symbol-keyed method on {@link MCPServer} that primes the views registry\n * from build/dev registry data.\n *\n * @internal\n */\nexport const registerViews: unique symbol = Symbol(\"mcp-use/registerViews\");\n\n/**\n * Options for priming the views registry.\n *\n * @internal\n */\nexport interface RegisterViewsOptions {\n /**\n * When true, resource CSP emission appends the serving origin's websocket\n * variant to `connectDomains` so Vite HMR passes host-enforced CSP.\n */\n dev?: boolean;\n /**\n * Absolute project root for resolving the `public/` directory in dev.\n * Defaults to `process.cwd()` when omitted (production `start`).\n */\n projectRoot?: string;\n}\n\n/** Type of the {@link registerViews} method on {@link MCPServer}. */\nexport type RegisterViews = (\n views: ViewsManifest,\n options?: RegisterViewsOptions\n) => void;\n","import type { McpUiResourceCsp } from \"@modelcontextprotocol/ext-apps\";\n\nimport type { ViewResourceFacts } from \"./types.js\";\n\ntype CspCategory =\n | \"connectDomains\"\n | \"resourceDomains\"\n | \"frameDomains\"\n | \"baseUriDomains\";\n\nconst CATEGORY_ENV: Record<CspCategory, string> = {\n connectDomains: \"CSP_CONNECT_DOMAINS\",\n resourceDomains: \"CSP_RESOURCE_DOMAINS\",\n frameDomains: \"CSP_FRAME_DOMAINS\",\n baseUriDomains: \"CSP_BASE_URI_DOMAINS\",\n};\n\n/** Parse a comma-separated env var into trimmed non-empty domain strings. */\nexport function parseDomainList(raw: string | undefined): string[] {\n if (raw === undefined || raw.trim() === \"\") {\n return [];\n }\n return raw\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n}\n\nfunction readEnvDomains(name: string): string[] | undefined {\n if (typeof process === \"undefined\") {\n return undefined;\n }\n const raw = process.env[name];\n if (raw === undefined || raw.trim() === \"\") {\n return undefined;\n }\n return parseDomainList(raw);\n}\n\n/** Domains from `CSP_URLS` (shortcut for all categories). */\nexport function readCspUrlsShortcut(): string[] {\n return readEnvDomains(\"CSP_URLS\") ?? [];\n}\n\n/** Per-category env override, or `CSP_URLS` when the category var is unset. */\nexport function readEnvDomainsForCategory(category: CspCategory): string[] {\n const perCategory = readEnvDomains(CATEGORY_ENV[category]);\n if (perCategory !== undefined) {\n return perCategory;\n }\n return readCspUrlsShortcut();\n}\n\n/**\n * Merge domain lists: earlier segments win on duplicate (higher priority).\n */\nexport function mergeDomainLists(...segments: string[][]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const segment of segments) {\n for (const domain of segment) {\n if (!seen.has(domain)) {\n seen.add(domain);\n out.push(domain);\n }\n }\n }\n return out;\n}\n\n/**\n * Resolved origins and flags used when merging author, env, and MCP CSP domains.\n *\n * @internal\n */\nexport interface BuildCspOptions {\n /** Public server origin from `MCP_URL` or forwarded request headers. */\n serverOrigin: string;\n /** Assets origin derived from `MCP_ASSETS_URL` or the server origin. */\n assetsOrigin: string;\n /** When false, server origin is appended to resourceDomains (same-origin assets). */\n explicitAssetsBase: boolean;\n /** When true, append the server origin's websocket variant for Vite HMR. */\n hmrWs?: boolean;\n}\n\nfunction toWebSocketOrigin(serverOrigin: string): string {\n if (serverOrigin.startsWith(\"https://\")) {\n return `wss://${serverOrigin.slice(\"https://\".length)}`;\n }\n if (serverOrigin.startsWith(\"http://\")) {\n return `ws://${serverOrigin.slice(\"http://\".length)}`;\n }\n return serverOrigin;\n}\n\n/**\n * Build final `_meta.ui.csp` from author facts, env vars, and MCP auto-append.\n *\n * Precedence (high → low): author → env (`CSP_*_DOMAINS` or `CSP_URLS`) →\n * MCP auto-append (lowest).\n */\nexport function buildMergedResourceCsp(\n authorFacts: ViewResourceFacts | undefined,\n options: BuildCspOptions\n): McpUiResourceCsp {\n const author = authorFacts?.csp;\n\n const mcpConnectAuto: string[] = [];\n if (options.serverOrigin !== \"\") {\n mcpConnectAuto.push(options.serverOrigin);\n if (options.hmrWs === true) {\n mcpConnectAuto.push(toWebSocketOrigin(options.serverOrigin));\n }\n }\n\n const mcpResourceAuto: string[] = [];\n const resourceOrigin = options.explicitAssetsBase\n ? options.assetsOrigin\n : options.serverOrigin;\n if (resourceOrigin !== \"\") {\n mcpResourceAuto.push(resourceOrigin);\n }\n\n const connectDomains = mergeDomainLists(\n author?.connectDomains ?? [],\n readEnvDomainsForCategory(\"connectDomains\"),\n mcpConnectAuto\n );\n\n const resourceDomains = mergeDomainLists(\n author?.resourceDomains ?? [],\n readEnvDomainsForCategory(\"resourceDomains\"),\n mcpResourceAuto\n );\n\n const frameDomains = mergeDomainLists(\n author?.frameDomains ?? [],\n readEnvDomainsForCategory(\"frameDomains\")\n );\n\n const baseUriDomains = mergeDomainLists(\n author?.baseUriDomains ?? [],\n readEnvDomainsForCategory(\"baseUriDomains\")\n );\n\n return {\n ...author,\n connectDomains,\n resourceDomains,\n frameDomains,\n baseUriDomains,\n };\n}\n","import {\n matchesPathPrefix,\n pathUnderBase,\n pathnameOf,\n type FetchHandler,\n} from \"../fetch-app.js\";\nimport type { ViewManifestEntry } from \"./types.js\";\n\nconst PUBLIC_BUILD_DIR = \".mcp-use/build/views/public\";\nconst PUBLIC_DEV_DIR = \"public\";\nconst VIEW_ASSETS_BUILD_ROOT = \".mcp-use/build/views\";\n\n/**\n * Fetch handler for built view bundles under\n * `${basePath}/_mcp-use/views/<name>/…`.\n *\n * Production only — dev serves view modules through Vite middleware.\n *\n * @param basePath - MCP mount prefix (e.g. `/mcp`).\n * @param views - Primed view registry; empty skips mounting.\n * @param options - `projectRoot` defaults to `process.cwd()`.\n *\n * @internal\n */\nexport function createViewAssetsHandler(\n basePath: string,\n views: ReadonlyMap<string, ViewManifestEntry>,\n options?: { projectRoot?: string; deferCors?: boolean }\n): FetchHandler | undefined {\n if (views.size === 0) {\n return undefined;\n }\n\n const assetsPrefix = pathUnderBase(basePath, \"_mcp-use/views\");\n const projectRoot = options?.projectRoot ?? process.cwd();\n\n return async (request) => {\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n return new Response(\"Method Not Allowed\", { status: 405 });\n }\n if (!matchesPathPrefix(request, assetsPrefix)) {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n const pathname = pathnameOf(request);\n const remainder = pathname.slice(assetsPrefix.length + 1);\n const slash = remainder.indexOf(\"/\");\n if (slash <= 0 || slash === remainder.length - 1) {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n const viewName = remainder.slice(0, slash);\n const subpath = remainder.slice(slash + 1);\n const entry = views.get(viewName);\n if (entry === undefined || entry.kind !== \"external\") {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n const [{ join }, { resolvePublicFilePath, servePublicFile }] =\n await Promise.all([import(\"node:path\"), import(\"./public-route.js\")]);\n const viewRoot = join(projectRoot, VIEW_ASSETS_BUILD_ROOT, viewName);\n const diskPath = await resolvePublicFilePath(viewRoot, subpath);\n if (diskPath === null) {\n return new Response(\"Not Found\", { status: 404 });\n }\n return await servePublicFile(diskPath, {\n ...(options?.deferCors === true && { deferCors: true }),\n ...(request.method === \"HEAD\" && { head: true }),\n });\n };\n}\n\n/**\n * Fetch handler for public view assets under `${basePath}/_mcp-use/public/`.\n *\n * Public responses include `Access-Control-Allow-Origin: *` for\n * cross-origin sandboxed view iframes.\n *\n * Node filesystem modules load only on the first public-asset request so the\n * library entry stays edge-safe for `getHandler()`-only deployments.\n *\n * @param basePath - MCP mount prefix (e.g. `/mcp`).\n * @param views - Primed view registry; empty skips mounting.\n * @param options - When `dev` is true, the public route reads from\n * `<projectRoot>/public` instead of `.mcp-use/build/views/public/`.\n * `projectRoot` defaults to `process.cwd()`. `enabled` mounts the shared\n * public route for local server branding even when no views are registered.\n *\n * @internal\n */\nexport function createViewPublicHandler(\n basePath: string,\n views: ReadonlyMap<string, ViewManifestEntry>,\n options?: {\n dev?: boolean;\n projectRoot?: string;\n deferCors?: boolean;\n enabled?: boolean;\n }\n): FetchHandler | undefined {\n if (views.size === 0 && options?.enabled !== true) {\n return undefined;\n }\n\n const publicPrefix = pathUnderBase(basePath, \"_mcp-use/public\");\n const subdir = options?.dev === true ? PUBLIC_DEV_DIR : PUBLIC_BUILD_DIR;\n const projectRoot = options?.projectRoot ?? process.cwd();\n\n return async (request) => {\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n return new Response(\"Method Not Allowed\", { status: 405 });\n }\n if (!matchesPathPrefix(request, publicPrefix)) {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n const pathname = pathnameOf(request);\n const encodedSubpath = pathname.slice(publicPrefix.length + 1);\n let subpath: string;\n try {\n subpath = decodeURIComponent(encodedSubpath);\n } catch {\n return new Response(\"Not Found\", { status: 404 });\n }\n if (subpath.length === 0) {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n const [{ join }, { resolvePublicFilePath, servePublicFile }] =\n await Promise.all([import(\"node:path\"), import(\"./public-route.js\")]);\n const publicRoot = join(projectRoot, subdir);\n const diskPath = await resolvePublicFilePath(publicRoot, subpath);\n if (diskPath === null) {\n return new Response(\"Not Found\", { status: 404 });\n }\n return await servePublicFile(diskPath, {\n ...(options?.deferCors === true && { deferCors: true }),\n ...(request.method === \"HEAD\" && { head: true }),\n });\n };\n}\n\n/**\n * @deprecated Use {@link createViewPublicHandler}.\n *\n * @internal\n */\nexport function mountViewRoutes(): void {\n throw new Error(\n \"mountViewRoutes(app) was removed — use createViewPublicHandler\"\n );\n}\n","import type { MetaObject } from \"@modelcontextprotocol/server\";\n\nimport type { ViewManifestEntry, ViewResourceFacts } from \"./types.js\";\nimport {\n UI_META_KEY,\n UI_MIME_TYPE,\n UI_RESOURCE_URI_META_KEY,\n viewResourceUri,\n} from \"./constants.js\";\nimport { buildMergedResourceCsp, type BuildCspOptions } from \"./csp-env.js\";\nimport {\n hasExplicitAssetsBase,\n originFromAssetsBase,\n resolveAssetsBase,\n resolveServerOrigin,\n} from \"./origin.js\";\n\n/**\n * Tool declaration `_meta` for `tools/list`.\n *\n * When `viewName` is set, emits `ui.resourceUri` plus the legacy flat\n * {@link UI_RESOURCE_URI_META_KEY} key. When `visibility` is set, emits\n * `ui.visibility: [visibility]`. Either may be set independently — a\n * view-less tool can still declare app-only visibility. Returns `undefined`\n * only when no view, visibility, or existing metadata is provided.\n *\n * @param viewName - Bound view directory / manifest key, or `undefined` when\n * the tool has no view.\n * @param visibility - Optional model/app visibility narrowing from the tool\n * definition's top-level `visibility` field.\n * @param existingMetadata - Optional author-supplied definition metadata. Other\n * keys pass through, while framework-owned resource URI and visibility keys\n * are derived exclusively from `viewName` and `visibility`.\n * @returns Wire metadata for the tool listing, or `undefined` when there is\n * nothing to emit.\n */\nexport function buildToolUiMeta(\n viewName: string | undefined,\n visibility: \"model\" | \"app\" | undefined,\n existingMetadata?: MetaObject\n): MetaObject | undefined {\n if (\n viewName === undefined &&\n visibility === undefined &&\n existingMetadata === undefined\n ) {\n return undefined;\n }\n\n const meta: MetaObject = { ...existingMetadata };\n const existingUi = existingMetadata?.[UI_META_KEY];\n const existingUiIsObject =\n typeof existingUi === \"object\" &&\n existingUi !== null &&\n !Array.isArray(existingUi);\n const ui: MetaObject = existingUiIsObject ? { ...existingUi } : {};\n\n if (viewName !== undefined) {\n const resourceUri = viewResourceUri(viewName);\n ui[\"resourceUri\"] = resourceUri;\n meta[UI_RESOURCE_URI_META_KEY] = resourceUri;\n } else {\n // These keys describe the top-level view contract. Do not advertise an\n // author-supplied URI when the tool has no declared view.\n delete ui[\"resourceUri\"];\n delete meta[UI_RESOURCE_URI_META_KEY];\n }\n\n if (visibility !== undefined) {\n ui[\"visibility\"] = [visibility];\n } else {\n // Visibility is likewise derived exclusively from the top-level field.\n delete ui[\"visibility\"];\n }\n\n if (\n viewName !== undefined ||\n visibility !== undefined ||\n existingUiIsObject\n ) {\n meta[UI_META_KEY] = ui;\n }\n\n return meta;\n}\n\n/**\n * Tool result `_meta` stamped on completed non-error `CallToolResult` values\n * from a view-bound tool.\n *\n * Emits the nested `ui.resourceUri` key and the legacy flat\n * {@link UI_RESOURCE_URI_META_KEY} key so hosts can open the bound view.\n * Error results (`isError: true`) and intermediate `input_required` returns\n * must not receive this metadata. A stamped error URI would create a new\n * rendered view through legacy host behavior. Result `_meta` is view-only and\n * never enters model context.\n *\n * @param viewName - Bound view directory / registry key.\n * @returns Nested and legacy resource-URI wire keys.\n */\nexport function buildToolResultUiMeta(\n viewName: string\n): Record<string, unknown> {\n const resourceUri = viewResourceUri(viewName);\n return {\n [UI_META_KEY]: { resourceUri },\n [UI_RESOURCE_URI_META_KEY]: resourceUri,\n };\n}\n\n/**\n * Options for {@link buildResourceUiMeta}.\n *\n * @internal\n */\nexport interface BuildResourceUiMetaOptions {\n /** Request used to resolve server/assets origins when not passed explicitly. */\n request?: Request;\n /** Explicit server origin (overrides request resolution). */\n serverOrigin?: string;\n /** Explicit assets URL prefix (overrides request resolution). */\n assetsBase?: string;\n /**\n * When true, append the server origin's websocket variant to\n * `csp.connectDomains` for Vite HMR under host-enforced CSP.\n */\n hmrWs?: boolean;\n}\n\nfunction resolveCspOptions(\n options?: BuildResourceUiMetaOptions\n): BuildCspOptions {\n const request = options?.request;\n const serverOrigin =\n options?.serverOrigin ??\n (request !== undefined ? resolveServerOrigin(request) : \"\");\n const assetsBase =\n options?.assetsBase ??\n (request !== undefined ? resolveAssetsBase(request) : serverOrigin);\n\n return {\n serverOrigin,\n assetsOrigin: originFromAssetsBase(assetsBase),\n explicitAssetsBase: hasExplicitAssetsBase(),\n ...(options?.hmrWs === true ? { hmrWs: true as const } : {}),\n };\n}\n\n/**\n * Resource `_meta.ui` for a primed view.\n *\n * Emits `csp` by merging author `view.csp`, env (`CSP_URLS` / `CSP_*_DOMAINS`),\n * and MCP auto-append (`MCP_URL` → connect; assets origin → resource).\n */\nexport function buildResourceUiMeta(\n authorFacts: ViewResourceFacts | undefined,\n options?: BuildResourceUiMetaOptions\n): Record<string, unknown> {\n const csp = buildMergedResourceCsp(authorFacts, resolveCspOptions(options));\n\n const ui: Record<string, unknown> = { csp };\n\n if (authorFacts?.permissions !== undefined) {\n ui[\"permissions\"] = authorFacts.permissions;\n }\n if (authorFacts?.domain !== undefined) {\n ui[\"domain\"] = authorFacts.domain;\n }\n if (authorFacts?.prefersBorder !== undefined) {\n ui[\"prefersBorder\"] = authorFacts.prefersBorder;\n }\n\n return { [UI_META_KEY]: ui };\n}\n\n/**\n * Listing metadata for a primed view resource.\n */\nexport function viewResourceConfig(\n _viewName: string,\n _entry: ViewManifestEntry,\n authorFacts: ViewResourceFacts | undefined,\n options?: BuildResourceUiMetaOptions\n): {\n mimeType: string;\n description?: string;\n _meta: Record<string, unknown>;\n} {\n return {\n mimeType: UI_MIME_TYPE,\n ...(authorFacts?.description !== undefined && {\n description: authorFacts.description,\n }),\n _meta: buildResourceUiMeta(authorFacts, options),\n };\n}\n","/**\n * `mcp-use` — MCP server framework on the official v2 SDK (fetch-native).\n *\n * Greenfield rebuild of the mcp-use server package against the stateless\n * 2026-07-28 MCP protocol. See specs/SPEC.md for the phase plan and API contract.\n */\n\nexport { MCPServer } from \"./server.js\";\nexport { createMcpMount } from \"./mount-mcp.js\";\nexport type { MountMcpOptions, McpMount } from \"./mount-mcp.js\";\nexport {\n composeFetch,\n getRequestBag,\n hostValidationMiddleware,\n jsonBodyMiddleware,\n matchesPath,\n matchesPathPrefix,\n originValidationMiddleware,\n pathnameOf,\n routeFetch,\n toFrameworkHandler,\n} from \"./fetch-app.js\";\nexport type {\n FetchHandler,\n FetchMiddleware,\n FrameworkHandler,\n FrameworkRequestLike,\n RequestBag,\n} from \"./fetch-app.js\";\nexport { registerViews } from \"./views/index.js\";\nexport { requestLogger } from \"./logging.js\";\nexport type { LoggingOptions, LogLevel } from \"./logging.js\";\nexport type {\n LandingPageOptions,\n LandingPagePrompt,\n LandingPageResource,\n LandingPageTool,\n} from \"./landing.js\";\n\n/**\n * Wire result shapes (re-exported from the SDK): callbacks return these raw\n * shapes directly — tools return {@link CallToolResult}, resources\n * {@link ReadResourceResult}, prompts {@link GetPromptResult}. There is no\n * framework-specific result layer.\n */\nexport type {\n CallToolResult,\n ContentBlock,\n GetPromptResult,\n InputRequest,\n InputRequiredResult,\n InputResponses,\n PromptMessage,\n ReadResourceResult,\n} from \"@modelcontextprotocol/server\";\n/**\n * Official SDK descriptor metadata contracts. Tools use\n * {@link ToolAnnotations}; resources and resource templates use\n * {@link Annotations}; every descriptor's extension `_meta` uses\n * {@link MetaObject}.\n */\nexport type {\n Annotations,\n MetaObject,\n ToolAnnotations,\n} from \"@modelcontextprotocol/server\";\n/**\n * Official SDK helpers for authoring and reading multi-round-trip\n * `input_required` results.\n */\nexport {\n acceptedContent,\n createRequestStateCodec,\n inputRequired,\n inputResponse,\n isInputRequiredResult,\n} from \"@modelcontextprotocol/server\";\n\nexport { completable } from \"./completable.js\";\nexport type { CompletionCallback, CompletionContext } from \"./completable.js\";\n\n/**\n * Schema contracts accepted by `inputSchema`/`outputSchema` fields (re-exported\n * from the SDK): `StandardSchemaWithJSON` requires validation plus JSON\n * Schema conversion; `completable()` needs only `StandardSchemaV1`.\n * Implemented by zod v4, ArkType, Valibot, …\n */\nexport type {\n StandardSchemaV1,\n StandardSchemaWithJSON,\n} from \"@modelcontextprotocol/server\";\n\nexport type { InspectorOptions, ServerConfig, CorsOptions } from \"./config.js\";\nexport type { ServerBranding } from \"./branding.js\";\n/** Official MCP icon shape used by {@link ServerConfig.icons}. */\nexport type { Icon } from \"@modelcontextprotocol/server\";\nexport type {\n MiddlewareContext,\n McpMiddlewareContext,\n McpCompleteEventListenerFn,\n McpEventListenerFnFor,\n McpEventPattern,\n McpEventPatternBody,\n McpEventListenerFn,\n McpExactMiddlewareFn,\n McpMiddlewareFn,\n McpMiddlewareFnFor,\n McpMiddlewareMethod,\n McpMiddlewareMethodsForPattern,\n McpMiddlewareNext,\n McpMiddlewareOperationMap,\n McpMiddlewareParams,\n McpMiddlewarePattern,\n McpMiddlewarePatternBody,\n McpMiddlewarePatternMap,\n McpMiddlewareResult,\n PromptsGetMiddlewareContext,\n PromptsListMiddlewareContext,\n ReadonlyMiddlewareContext,\n ResourcesReadMiddlewareContext,\n ResourcesListMiddlewareContext,\n ToolsCallMiddlewareContext,\n ToolsListMiddlewareContext,\n} from \"./middleware/mcp-middleware.js\";\nexport {\n composeMiddleware,\n createMcpEventListenerEntry,\n createMcpMiddlewareEntry,\n matchesPattern,\n} from \"./middleware/mcp-middleware.js\";\nexport type { NodeRequestHandler } from \"./node-bridge.js\";\nexport type {\n FromOpenAPIOptions,\n OpenAPIAuth,\n OpenAPIDocument,\n OpenAPIExcludeRule,\n} from \"./openapi/index.js\";\nexport type {\n Elicit,\n ElicitationResult,\n OAuthAuth,\n RequestClientContext,\n RequestContext,\n} from \"./context.js\";\nexport type {\n InferToolInput,\n InferToolName,\n InferToolOutput,\n ToolCallback,\n ToolDefinition,\n ToolRef,\n ToolResult,\n ToolViewConfig,\n} from \"./tools.js\";\nexport type {\n ExternalViewManifestEntry,\n InlineViewManifestEntry,\n UiPermissions,\n ViewManifestEntry,\n ViewsManifest,\n} from \"./views/index.js\";\nexport type {\n InferTemplateParams,\n ResourceCallback,\n ResourceDefinition,\n ResourceTemplateCallback,\n ResourceTemplateCompleter,\n ResourceTemplateCompletions,\n ResourceTemplateDefinition,\n TemplateVariableValue,\n} from \"./resources.js\";\nexport type {\n InferPromptInput,\n PromptCallback,\n PromptDefinition,\n} from \"./prompts.js\";\nexport type {\n ProxyConnection,\n ProxyHttpConfig,\n ProxyProgress,\n ProxyPrompt,\n ProxyRequestOptions,\n ProxyResource,\n ProxyServerConfig,\n ProxyTool,\n} from \"./mcp-proxy.js\";\n"],"mappings":"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","names":["isInputRequiredResult","CLIENT_CAPABILITIES_META_KEY","CLIENT_CAPABILITIES_META_KEY","corsHeaders","resolvePublicFilePath","servePublicFile","isInputRequiredResult","inputRequired","inputResponse","isInputRequiredResult"]}