@mcp-b/webmcp-ts-sdk 4.0.0 → 4.1.0-beta.20260702224704

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.d.ts CHANGED
@@ -5,7 +5,7 @@ import { CallToolRequest, CallToolRequestSchema, CallToolResult, CallToolResultS
5
5
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
6
  import { CfWorkerJsonSchemaValidator, CfWorkerJsonSchemaValidator as PolyfillJsonSchemaValidator } from "@modelcontextprotocol/sdk/validation/cfworker";
7
7
  import { Transport, Transport as Transport$1, TransportSendOptions } from "@modelcontextprotocol/sdk/shared/transport.js";
8
- import { InputSchema, ModelContextCore, ModelContextRegisterToolOptions, ModelContextTestingExecuteToolOptions, ModelContextToolInfo, ModelContextToolReference, ResourceContents as ResourceContents$1, ToolDescriptor, ToolListItem, ToolResponse } from "@mcp-b/webmcp-types";
8
+ import { InputSchema, InputSchema as InputSchema$1, InputSchemaProperty, JsonObject, JsonValue, ModelContextClient, ModelContextCore, ModelContextRegisterToolOptions, ModelContextTestingExecuteToolOptions, ModelContextToolInfo, ModelContextToolReference, ResourceContents as ResourceContents$1, ToolDescriptor, ToolDescriptor as ToolDescriptor$1, ToolExecuteResult, ToolListItem, ToolListItem as ToolListItem$1, ToolResponse, ToolResponse as ToolResponse$1 } from "@mcp-b/webmcp-types";
9
9
  import { ServerOptions } from "@modelcontextprotocol/sdk/server/index.js";
10
10
  import { JsonSchemaValidatorResult, jsonSchemaValidator } from "@modelcontextprotocol/sdk/validation";
11
11
 
@@ -64,8 +64,8 @@ declare class BrowserMcpServer extends McpServer {
64
64
  removeEventListener(type: string, listener: EventListenerOrEventListenerObject | null, options?: boolean | EventListenerOptions): void;
65
65
  dispatchEvent(event: Event): boolean;
66
66
  private notifyProducerToolsChanged;
67
- backfillTools(tools: readonly ToolListItem[], execute: (name: string, args: Record<string, unknown>) => Promise<ToolResponse>): number;
68
- registerTool(tool: ToolDescriptor, options?: ModelContextRegisterToolOptions): Promise<void>;
67
+ backfillTools(tools: readonly ToolListItem$1[], execute: (name: string, args: Record<string, unknown>) => Promise<ToolResponse$1>): number;
68
+ registerTool(tool: ToolDescriptor$1, options?: ModelContextRegisterToolOptions): Promise<void>;
69
69
  /**
70
70
  * Backfill tools that were already registered on the native/polyfill context
71
71
  * before this BrowserMcpServer wrapper was installed.
@@ -87,7 +87,7 @@ declare class BrowserMcpServer extends McpServer {
87
87
  registerPrompt(descriptor: {
88
88
  name: string;
89
89
  description?: string;
90
- argsSchema?: InputSchema;
90
+ argsSchema?: InputSchema$1;
91
91
  get: (args: Record<string, unknown>) => Promise<{
92
92
  messages: PromptMessage$1[];
93
93
  }>;
@@ -117,7 +117,7 @@ declare class BrowserMcpServer extends McpServer {
117
117
  getPrompt(name: string, args?: Record<string, unknown>): Promise<{
118
118
  messages: PromptMessage$1[];
119
119
  }>;
120
- listTools(): ToolListItem[];
120
+ listTools(): ToolListItem$1[];
121
121
  private listToolsForMcpTransport;
122
122
  private toMcpCallToolResult;
123
123
  getTools(): Promise<ModelContextToolInfo[]>;
@@ -144,7 +144,7 @@ declare class BrowserMcpServer extends McpServer {
144
144
  callTool(params: {
145
145
  name: string;
146
146
  arguments?: Record<string, unknown>;
147
- }): Promise<ToolResponse>;
147
+ }): Promise<ToolResponse$1>;
148
148
  /**
149
149
  * Executes a tool descriptor returned from getTools().
150
150
  */
@@ -155,7 +155,7 @@ declare class BrowserMcpServer extends McpServer {
155
155
  * @deprecated Prefer the WebMCP standard producer path: get a descriptor from
156
156
  * `getTools()` and pass it to `executeTool(tool, inputArgsJson)`.
157
157
  */
158
- executeTool(name: string, args?: Record<string, unknown>): Promise<ToolResponse>;
158
+ executeTool(name: string, args?: Record<string, unknown>): Promise<ToolResponse$1>;
159
159
  /**
160
160
  * Override connect to initialize request handlers BEFORE the transport connection.
161
161
  * This prevents "Cannot register capabilities after connecting to transport" errors
@@ -181,7 +181,7 @@ interface ResourceDescriptor {
181
181
  interface PromptDescriptor {
182
182
  name: string;
183
183
  description?: string;
184
- argsSchema?: InputSchema;
184
+ argsSchema?: InputSchema$1;
185
185
  get: (args: Record<string, unknown>) => Promise<{
186
186
  messages: PromptMessage$1[];
187
187
  }>;
@@ -229,9 +229,21 @@ declare class NoOpJsonSchemaValidator implements jsonSchemaValidator {
229
229
  getValidator<T>(_schema: unknown): (input: unknown) => JsonSchemaValidatorResult<T>;
230
230
  }
231
231
  //#endregion
232
+ //#region src/schema.d.ts
233
+ declare const DEFAULT_INPUT_SCHEMA: InputSchema$1;
234
+ interface ToWebMcpJsonSchemaOptions {
235
+ requireObjectType?: boolean;
236
+ }
237
+ /**
238
+ * Converts Zod schemas, Zod raw shapes, or plain JSON Schema objects to the
239
+ * JSON Schema shape expected by WebMCP tool descriptors.
240
+ */
241
+ declare function toWebMcpJsonSchema(schema: unknown, options?: ToWebMcpJsonSchemaOptions): InputSchema$1;
242
+ declare function toWebMcpInputSchema(schema: unknown): InputSchema$1;
243
+ //#endregion
232
244
  //#region src/index.d.ts
233
245
  type SamplingRequestParams = CreateMessageRequest$1['params'];
234
246
  type SamplingResult = CreateMessageResult$1;
235
247
  //#endregion
236
- export { BrowserMcpServer, BrowserMcpServer as McpServer, type BrowserMcpServerOptions, type CallToolRequest, CallToolRequestSchema, type CallToolResult, CallToolResultSchema, CfWorkerJsonSchemaValidator, Client, type ClientCapabilities, type ClientNotification, type ClientRequest, type ClientResult, type CreateMessageRequest, CreateMessageRequestSchema, type CreateMessageResult, CreateMessageResultSchema, type ElicitRequest, ElicitRequestSchema, type ElicitResult, ElicitResultSchema, ErrorCode, type GetPromptRequest, GetPromptRequestSchema, type GetPromptResult, GetPromptResultSchema, type Implementation, type InitializeRequest, InitializeRequestSchema, type InitializeResult, InitializeResultSchema, type JSONRPCMessage, JSONRPCMessageSchema, LATEST_PROTOCOL_VERSION, type ListPromptsRequest, ListPromptsRequestSchema, type ListPromptsResult, ListPromptsResultSchema, type ListResourcesRequest, ListResourcesRequestSchema, type ListResourcesResult, ListResourcesResultSchema, type ListToolsRequest, ListToolsRequestSchema, type ListToolsResult, ListToolsResultSchema, type LoggingLevel, LoggingLevelSchema, type LoggingMessageNotification, type McpError, NoOpJsonSchemaValidator, type Notification, PolyfillJsonSchemaValidator, type Prompt, type PromptDescriptor, type PromptMessage, ReadBuffer, type ReadResourceRequest, ReadResourceRequestSchema, type ReadResourceResult, ReadResourceResultSchema, type Request, type RequestOptions, type Resource, type ResourceContents, type ResourceDescriptor, ResourceListChangedNotificationSchema, type ResourceTemplate, type Result, SERVER_MARKER_PROPERTY, SUPPORTED_PROTOCOL_VERSIONS, SamplingRequestParams, SamplingResult, type ServerCapabilities, type ServerNotification, type ServerRequest, type ServerResult, type Tool, type ToolAnnotations, ToolListChangedNotificationSchema, type Transport, type TransportSendOptions, mergeCapabilities, serializeMessage };
248
+ export { BrowserMcpServer, BrowserMcpServer as McpServer, type BrowserMcpServerOptions, type CallToolRequest, CallToolRequestSchema, type CallToolResult, CallToolResultSchema, CfWorkerJsonSchemaValidator, Client, type ClientCapabilities, type ClientNotification, type ClientRequest, type ClientResult, type CreateMessageRequest, CreateMessageRequestSchema, type CreateMessageResult, CreateMessageResultSchema, DEFAULT_INPUT_SCHEMA, type ElicitRequest, ElicitRequestSchema, type ElicitResult, ElicitResultSchema, ErrorCode, type GetPromptRequest, GetPromptRequestSchema, type GetPromptResult, GetPromptResultSchema, type Implementation, type InitializeRequest, InitializeRequestSchema, type InitializeResult, InitializeResultSchema, type InputSchema, type InputSchemaProperty, type JSONRPCMessage, JSONRPCMessageSchema, type JsonObject, type JsonValue, LATEST_PROTOCOL_VERSION, type ListPromptsRequest, ListPromptsRequestSchema, type ListPromptsResult, ListPromptsResultSchema, type ListResourcesRequest, ListResourcesRequestSchema, type ListResourcesResult, ListResourcesResultSchema, type ListToolsRequest, ListToolsRequestSchema, type ListToolsResult, ListToolsResultSchema, type LoggingLevel, LoggingLevelSchema, type LoggingMessageNotification, type McpError, type ModelContextClient, NoOpJsonSchemaValidator, type Notification, PolyfillJsonSchemaValidator, type Prompt, type PromptDescriptor, type PromptMessage, ReadBuffer, type ReadResourceRequest, ReadResourceRequestSchema, type ReadResourceResult, ReadResourceResultSchema, type Request, type RequestOptions, type Resource, type ResourceContents, type ResourceDescriptor, ResourceListChangedNotificationSchema, type ResourceTemplate, type Result, SERVER_MARKER_PROPERTY, SUPPORTED_PROTOCOL_VERSIONS, SamplingRequestParams, SamplingResult, type ServerCapabilities, type ServerNotification, type ServerRequest, type ServerResult, type ToWebMcpJsonSchemaOptions, type Tool, type ToolAnnotations, type ToolDescriptor, type ToolExecuteResult, ToolListChangedNotificationSchema, type ToolListItem, type ToolResponse, type Transport, type TransportSendOptions, mergeCapabilities, serializeMessage, toWebMcpInputSchema, toWebMcpJsonSchema };
237
249
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/browser-server.ts","../src/no-op-validator.ts","../src/index.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/browser-server.ts","../src/no-op-validator.ts","../src/schema.ts","../src/index.ts"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -10,7 +10,7 @@ import { validateAndWarnToolName } from "@modelcontextprotocol/sdk/shared/toolNa
10
10
  import { CfWorkerJsonSchemaValidator, CfWorkerJsonSchemaValidator as CfWorkerJsonSchemaValidator$1, CfWorkerJsonSchemaValidator as PolyfillJsonSchemaValidator } from "@modelcontextprotocol/sdk/validation/cfworker";
11
11
 
12
12
  //#region src/browser-server.ts
13
- const DEFAULT_INPUT_SCHEMA = {
13
+ const DEFAULT_INPUT_SCHEMA$1 = {
14
14
  type: "object",
15
15
  properties: {}
16
16
  };
@@ -60,12 +60,12 @@ function normalizeToolResponse(value) {
60
60
  };
61
61
  }
62
62
  function parseNativeToolInputSchema(inputSchema) {
63
- if (!inputSchema) return DEFAULT_INPUT_SCHEMA;
63
+ if (!inputSchema) return DEFAULT_INPUT_SCHEMA$1;
64
64
  try {
65
65
  const parsed = JSON.parse(inputSchema);
66
66
  if (isPlainObject(parsed)) return parsed;
67
67
  } catch {}
68
- return DEFAULT_INPUT_SCHEMA;
68
+ return DEFAULT_INPUT_SCHEMA$1;
69
69
  }
70
70
  function toToolListItemFromNativeToolInfo(tool) {
71
71
  return {
@@ -178,7 +178,7 @@ var BrowserMcpServer = class extends McpServer {
178
178
  }
179
179
  toInputTransportSchema(schema) {
180
180
  const jsonSchema = this.toJsonSchema(schema, "input");
181
- if (Object.keys(jsonSchema).length === 0) return DEFAULT_INPUT_SCHEMA;
181
+ if (Object.keys(jsonSchema).length === 0) return DEFAULT_INPUT_SCHEMA$1;
182
182
  if (jsonSchema.type === void 0) return {
183
183
  type: "object",
184
184
  ...jsonSchema
@@ -357,7 +357,7 @@ var BrowserMcpServer = class extends McpServer {
357
357
  const toolDescriptor = {
358
358
  name: sourceTool.name,
359
359
  description: sourceTool.description ?? "",
360
- inputSchema: sourceTool.inputSchema ?? DEFAULT_INPUT_SCHEMA,
360
+ inputSchema: sourceTool.inputSchema ?? DEFAULT_INPUT_SCHEMA$1,
361
361
  execute: async (args) => execute(sourceTool.name, args)
362
362
  };
363
363
  if (sourceTool.outputSchema) toolDescriptor.outputSchema = sourceTool.outputSchema;
@@ -529,9 +529,9 @@ var BrowserMcpServer = class extends McpServer {
529
529
  return this.listTools().map((tool) => {
530
530
  let inputSchema;
531
531
  try {
532
- inputSchema = JSON.stringify(tool.inputSchema ?? DEFAULT_INPUT_SCHEMA);
532
+ inputSchema = JSON.stringify(tool.inputSchema ?? DEFAULT_INPUT_SCHEMA$1);
533
533
  } catch {
534
- inputSchema = JSON.stringify(DEFAULT_INPUT_SCHEMA);
534
+ inputSchema = JSON.stringify(DEFAULT_INPUT_SCHEMA$1);
535
535
  }
536
536
  return {
537
537
  name: tool.name,
@@ -686,5 +686,34 @@ var NoOpJsonSchemaValidator = class {
686
686
  };
687
687
 
688
688
  //#endregion
689
- export { BrowserMcpServer, BrowserMcpServer as McpServer, CallToolRequestSchema, CallToolResultSchema, CfWorkerJsonSchemaValidator, Client, CreateMessageRequestSchema, CreateMessageResultSchema, ElicitRequestSchema, ElicitResultSchema, ErrorCode, GetPromptRequestSchema, GetPromptResultSchema, InitializeRequestSchema, InitializeResultSchema, JSONRPCMessageSchema, LATEST_PROTOCOL_VERSION, ListPromptsRequestSchema, ListPromptsResultSchema, ListResourcesRequestSchema, ListResourcesResultSchema, ListToolsRequestSchema, ListToolsResultSchema, LoggingLevelSchema, NoOpJsonSchemaValidator, PolyfillJsonSchemaValidator, ReadBuffer, ReadResourceRequestSchema, ReadResourceResultSchema, ResourceListChangedNotificationSchema, SERVER_MARKER_PROPERTY, SUPPORTED_PROTOCOL_VERSIONS, ToolListChangedNotificationSchema, mergeCapabilities, serializeMessage };
689
+ //#region src/schema.ts
690
+ const DEFAULT_INPUT_SCHEMA = {
691
+ type: "object",
692
+ properties: {}
693
+ };
694
+ /**
695
+ * Converts Zod schemas, Zod raw shapes, or plain JSON Schema objects to the
696
+ * JSON Schema shape expected by WebMCP tool descriptors.
697
+ */
698
+ function toWebMcpJsonSchema(schema, options = {}) {
699
+ const requireObjectType = options.requireObjectType ?? true;
700
+ if (!schema || typeof schema !== "object") return requireObjectType ? DEFAULT_INPUT_SCHEMA : {};
701
+ const normalized = normalizeObjectSchema(schema);
702
+ const jsonSchema = normalized ? toJsonSchemaCompat(normalized, {
703
+ strictUnions: true,
704
+ pipeStrategy: "input"
705
+ }) : schema;
706
+ if (Object.keys(jsonSchema).length === 0) return requireObjectType ? DEFAULT_INPUT_SCHEMA : jsonSchema;
707
+ if (requireObjectType && jsonSchema.type === void 0) return {
708
+ type: "object",
709
+ ...jsonSchema
710
+ };
711
+ return jsonSchema;
712
+ }
713
+ function toWebMcpInputSchema(schema) {
714
+ return toWebMcpJsonSchema(schema, { requireObjectType: true });
715
+ }
716
+
717
+ //#endregion
718
+ export { BrowserMcpServer, BrowserMcpServer as McpServer, CallToolRequestSchema, CallToolResultSchema, CfWorkerJsonSchemaValidator, Client, CreateMessageRequestSchema, CreateMessageResultSchema, DEFAULT_INPUT_SCHEMA, ElicitRequestSchema, ElicitResultSchema, ErrorCode, GetPromptRequestSchema, GetPromptResultSchema, InitializeRequestSchema, InitializeResultSchema, JSONRPCMessageSchema, LATEST_PROTOCOL_VERSION, ListPromptsRequestSchema, ListPromptsResultSchema, ListResourcesRequestSchema, ListResourcesResultSchema, ListToolsRequestSchema, ListToolsResultSchema, LoggingLevelSchema, NoOpJsonSchemaValidator, PolyfillJsonSchemaValidator, ReadBuffer, ReadResourceRequestSchema, ReadResourceResultSchema, ResourceListChangedNotificationSchema, SERVER_MARKER_PROPERTY, SUPPORTED_PROTOCOL_VERSIONS, ToolListChangedNotificationSchema, mergeCapabilities, serializeMessage, toWebMcpInputSchema, toWebMcpJsonSchema };
690
719
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["BaseMcpServer","CfWorkerJsonSchemaValidator","mergeCapabilities","ListToolsRequestSchema","CallToolRequestSchema","ListPromptsRequestSchema","GetPromptRequestSchema"],"sources":["../src/browser-server.ts","../src/no-op-validator.ts"],"sourcesContent":["import type {\n InputSchema,\n JsonSchemaForInference,\n ModelContextClient,\n ModelContextCore,\n ModelContextExtensions,\n ModelContextRegisterToolOptions,\n ModelContextTestingExecuteToolOptions,\n ModelContextToolInfo,\n ModelContextToolReference,\n ResourceContents,\n ToolDescriptor,\n ToolListItem,\n ToolResponse,\n} from '@mcp-b/webmcp-types';\nimport { toJsonValue } from '@mcp-b/webmcp-polyfill/schema';\nimport type { ServerOptions } from '@modelcontextprotocol/sdk/server/index.js';\nimport { McpServer as BaseMcpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n getParseErrorMessage,\n normalizeObjectSchema,\n safeParseAsync,\n} from '@modelcontextprotocol/sdk/server/zod-compat.js';\nimport { toJsonSchemaCompat } from '@modelcontextprotocol/sdk/server/zod-json-schema-compat.js';\nimport type { RequestOptions } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport { mergeCapabilities } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport { validateAndWarnToolName } from '@modelcontextprotocol/sdk/shared/toolNameValidation.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport type { jsonSchemaValidator } from '@modelcontextprotocol/sdk/validation';\nimport { CfWorkerJsonSchemaValidator } from '@modelcontextprotocol/sdk/validation/cfworker';\nimport type {\n CallToolResult as McpCallToolResult,\n CreateMessageRequest,\n CreateMessageResult,\n ElicitRequest,\n ElicitResult,\n Implementation,\n PromptMessage,\n} from '@modelcontextprotocol/sdk/types.js';\nimport {\n CallToolRequestSchema,\n GetPromptRequestSchema,\n ListPromptsRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\n\nconst DEFAULT_INPUT_SCHEMA: InputSchema = { type: 'object', properties: {} };\nconst DEFAULT_CLIENT_REQUEST_TIMEOUT = 10_000;\n\nexport const SERVER_MARKER_PROPERTY = '__isBrowserMcpServer' as const;\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction isCallToolResult(value: unknown): value is ToolResponse {\n return isPlainObject(value) && Array.isArray(value.content);\n}\n\nfunction isPermissionsPolicySecurityError(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const { name, message } = error as { name?: unknown; message?: unknown };\n\n return (\n name === 'SecurityError' &&\n typeof message === 'string' &&\n /permissions policy|feature \"tools\" is disallowed/i.test(message)\n );\n}\n\nfunction isAbortError(error: unknown): boolean {\n return (\n Boolean(error) &&\n typeof error === 'object' &&\n (error as { name?: unknown }).name === 'AbortError'\n );\n}\n\nfunction createAbortError(): Error {\n if (typeof DOMException === 'function') {\n return new DOMException('signal is aborted without reason', 'AbortError');\n }\n\n const error = new Error('signal is aborted without reason');\n error.name = 'AbortError';\n return error;\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n Boolean(value) &&\n (typeof value === 'object' || typeof value === 'function') &&\n typeof (value as { then?: unknown }).then === 'function'\n );\n}\n\nfunction serializeTextContent(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n\n try {\n const candidate = JSON.stringify(value);\n return candidate ?? String(value);\n } catch {\n return String(value);\n }\n}\n\nfunction normalizeToolResponse(value: unknown): ToolResponse {\n if (isCallToolResult(value)) {\n return value;\n }\n\n const structuredContent = toJsonValue(value);\n\n return {\n content: [{ type: 'text', text: serializeTextContent(value) }],\n ...(structuredContent !== undefined ? { structuredContent } : {}),\n isError: false,\n };\n}\n\nfunction parseNativeToolInputSchema(inputSchema: string | undefined): InputSchema {\n if (!inputSchema) {\n return DEFAULT_INPUT_SCHEMA;\n }\n\n try {\n const parsed = JSON.parse(inputSchema) as unknown;\n if (isPlainObject(parsed)) {\n return parsed as InputSchema;\n }\n } catch {\n // Fall through to the default schema. Native previews have returned invalid\n // schema strings during development; a bad imported tool schema should not\n // prevent the wrapper from initializing.\n }\n\n return DEFAULT_INPUT_SCHEMA;\n}\n\nfunction toToolListItemFromNativeToolInfo(tool: ModelContextToolInfo): ToolListItem {\n return {\n name: tool.name,\n description: tool.description ?? '',\n inputSchema: parseNativeToolInputSchema(tool.inputSchema),\n };\n}\n\nfunction parseNativeToolResult(toolName: string, serialized: string | null): ToolResponse {\n if (serialized === null) {\n return {\n content: [{ type: 'text', text: 'Tool execution interrupted by navigation' }],\n isError: true,\n };\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(serialized);\n } catch (parseError) {\n throw new Error(\n `Failed to parse serialized tool response for ${toolName}: ${parseError instanceof Error ? parseError.message : String(parseError)}`\n );\n }\n\n return normalizeToolResponse(parsed);\n}\n\nfunction withDefaultTimeout(options?: RequestOptions): RequestOptions {\n if (options?.signal) return options;\n return { ...options, signal: AbortSignal.timeout(DEFAULT_CLIENT_REQUEST_TIMEOUT) };\n}\n\ninterface RegisteredWebMcpTool {\n title?: string;\n description?: string;\n inputSchema: InputSchema;\n outputSchema?: JsonSchemaForInference;\n annotations?: ToolListItem['annotations'];\n handler: (args: Record<string, unknown>) => Promise<ToolResponse>;\n}\n\ninterface ParentRegisteredResource {\n name: string;\n metadata?: { description?: string; mimeType?: string; title?: string };\n readCallback: (uri: URL, extra: unknown) => Promise<{ contents: ResourceContents[] }>;\n enabled: boolean;\n remove: () => void;\n}\n\ninterface ParentRegisteredPrompt {\n title?: string;\n description?: string;\n argsSchema?: unknown;\n callback: (\n args: Record<string, unknown>,\n extra: unknown\n ) => Promise<{ messages: PromptMessage[] }>;\n enabled: boolean;\n remove: () => void;\n}\n\nexport interface BrowserMcpServerOptions extends ServerOptions {\n native?: ModelContextCore;\n}\n\ntype ParentRegisterResourceFn = (\n name: string,\n uri: string,\n config: Record<string, unknown>,\n cb: (uri: URL, extra: unknown) => Promise<{ contents: ResourceContents[] }>\n) => { remove: () => void };\n\ntype ParentRegisterPromptFn = (\n name: string,\n config: Record<string, unknown>,\n cb: (args: Record<string, unknown>, extra: unknown) => Promise<{ messages: PromptMessage[] }>\n) => { remove: () => void };\n\ntype NativeLegacyToolsApi = ModelContextCore &\n Pick<ModelContextExtensions, 'listTools' | 'callTool'>;\ntype NativeStandardToolsApi = Pick<ModelContextCore, 'getTools' | 'executeTool'>;\ntype MaybePromise<T> = T | PromiseLike<T>;\ntype NativeRegisterToolFn = (\n tool: ToolDescriptor,\n options?: ModelContextRegisterToolOptions\n) => MaybePromise<void>;\ntype NativeUnregisterToolFn = (nameOrTool: string | ModelContextToolReference) => void;\ninterface NativeToolCleanup {\n abort: () => void;\n nativeSignalAccepted: boolean;\n}\n\n/**\n * Browser-optimized MCP Server that speaks WebMCP natively.\n *\n * Implements `registerTool(tool, options?)` while retaining MCP capabilities\n * (resources, prompts, elicitation, sampling) via BaseMcpServer.\n *\n * Deprecated compatibility (kept for Chrome Beta 147 and existing wrappers,\n * removed in the next major): `unregisterTool(name)`.\n *\n * When `native` is provided, tool operations are mirrored so that\n * navigator.modelContextTesting stays in sync.\n */\nexport class BrowserMcpServer extends BaseMcpServer {\n readonly [SERVER_MARKER_PROPERTY] = true as const;\n\n private native: ModelContextCore | undefined;\n private _promptSchemas = new Map<string, InputSchema>();\n private _jsonValidator: jsonSchemaValidator;\n private _publicMethodsBound = false;\n private _unregisterToolDeprecationWarned = false;\n private _nativeToolCleanups = new Map<string, NativeToolCleanup>();\n private _tools = new Map<string, RegisteredWebMcpTool>();\n private _producerEventTarget = new EventTarget();\n private _ontoolchange: ((this: ModelContextCore, ev: Event) => unknown) | null = null;\n private _producerToolsChangedQueued = false;\n\n constructor(serverInfo: Implementation, options?: BrowserMcpServerOptions) {\n const validator = options?.jsonSchemaValidator ?? new CfWorkerJsonSchemaValidator();\n const enhancedOptions: ServerOptions = {\n capabilities: mergeCapabilities(options?.capabilities || {}, {\n tools: { listChanged: true },\n resources: { listChanged: true },\n prompts: { listChanged: true },\n }),\n jsonSchemaValidator: validator,\n };\n\n super(serverInfo, enhancedOptions);\n this._jsonValidator = validator;\n this.native = options?.native;\n this.bindPublicApiMethods();\n this.installToolRequestHandlers();\n }\n\n /**\n * navigator.modelContext consumers may destructure methods (e.g. const { registerTool } = ...).\n * Bind methods once so they remain callable outside instance-method invocation syntax.\n */\n private bindPublicApiMethods(): void {\n if (this._publicMethodsBound) {\n return;\n }\n\n this.registerTool = this.registerTool.bind(this);\n this.unregisterTool = this.unregisterTool.bind(this);\n this.listTools = this.listTools.bind(this);\n this.getTools = this.getTools.bind(this);\n this.callTool = this.callTool.bind(this);\n this.executeTool = this.executeTool.bind(this);\n this.addEventListener = this.addEventListener.bind(this);\n this.removeEventListener = this.removeEventListener.bind(this);\n this.dispatchEvent = this.dispatchEvent.bind(this);\n\n this.registerResource = this.registerResource.bind(this);\n this.listResources = this.listResources.bind(this);\n this.readResource = this.readResource.bind(this);\n\n this.registerPrompt = this.registerPrompt.bind(this);\n this.listPrompts = this.listPrompts.bind(this);\n this.getPrompt = this.getPrompt.bind(this);\n\n this.createMessage = this.createMessage.bind(this);\n this.elicitInput = this.elicitInput.bind(this);\n\n this._publicMethodsBound = true;\n }\n\n private get _parentResources(): Record<string, ParentRegisteredResource> {\n return (this as unknown as { _registeredResources: Record<string, ParentRegisteredResource> })\n ._registeredResources;\n }\n\n private get _parentPrompts(): Record<string, ParentRegisteredPrompt> {\n return (this as unknown as { _registeredPrompts: Record<string, ParentRegisteredPrompt> })\n ._registeredPrompts;\n }\n\n private toJsonSchema(schema: unknown, pipeStrategy: 'input' | 'output'): Record<string, unknown> {\n if (!schema || typeof schema !== 'object') {\n return {};\n }\n\n const normalized = normalizeObjectSchema(schema as Parameters<typeof normalizeObjectSchema>[0]);\n return normalized\n ? (toJsonSchemaCompat(normalized, {\n strictUnions: true,\n pipeStrategy,\n }) as unknown as Record<string, unknown>)\n : (schema as Record<string, unknown>);\n }\n\n private toInputTransportSchema(schema: unknown): InputSchema {\n const jsonSchema = this.toJsonSchema(schema, 'input');\n\n if (Object.keys(jsonSchema).length === 0) {\n return DEFAULT_INPUT_SCHEMA;\n }\n\n if (jsonSchema.type === undefined) {\n return { type: 'object', ...jsonSchema } as InputSchema;\n }\n\n return jsonSchema as InputSchema;\n }\n\n private toOutputTransportSchema(schema: unknown): JsonSchemaForInference {\n return this.toJsonSchema(schema, 'output') as unknown as JsonSchemaForInference;\n }\n\n private isZodSchema(schema: unknown): boolean {\n if (!schema || typeof schema !== 'object') return false;\n const s = schema as Record<string, unknown>;\n return '_zod' in s || '_def' in s;\n }\n\n private getNativeLegacyToolsApi(): NativeLegacyToolsApi | undefined {\n if (!this.native) {\n return undefined;\n }\n\n const candidate = this.native as ModelContextCore &\n Partial<Pick<ModelContextExtensions, 'listTools' | 'callTool'>>;\n if (typeof candidate.listTools !== 'function' || typeof candidate.callTool !== 'function') {\n return undefined;\n }\n\n return candidate as NativeLegacyToolsApi;\n }\n\n private getNativeStandardToolsApi(): NativeStandardToolsApi | undefined {\n if (!this.native) {\n return undefined;\n }\n\n const candidate = this.native as Partial<NativeStandardToolsApi>;\n if (typeof candidate.getTools !== 'function' || typeof candidate.executeTool !== 'function') {\n return undefined;\n }\n\n return candidate as NativeStandardToolsApi;\n }\n\n private getNativeUnregisterTool(): NativeUnregisterToolFn | undefined {\n if (!this.native) {\n return undefined;\n }\n\n const unregisterTool = (this.native as { unregisterTool?: unknown }).unregisterTool;\n if (typeof unregisterTool !== 'function') {\n return undefined;\n }\n\n return (nameOrTool: string | ModelContextToolReference) =>\n unregisterTool.call(this.native, nameOrTool);\n }\n\n private createNativeToolCleanup(signal?: AbortSignal): {\n options: ModelContextRegisterToolOptions;\n abort: () => void;\n } {\n const controller = new AbortController();\n let removeSignalListener: (() => void) | undefined;\n\n if (signal) {\n const abortNativeSignal = () => {\n controller.abort();\n };\n\n if (signal.aborted) {\n abortNativeSignal();\n } else {\n signal.addEventListener('abort', abortNativeSignal, { once: true });\n removeSignalListener = () => signal.removeEventListener('abort', abortNativeSignal);\n }\n }\n\n return {\n options: { signal: controller.signal },\n abort: () => {\n removeSignalListener?.();\n if (!controller.signal.aborted) {\n controller.abort();\n }\n },\n };\n }\n\n private registerNativeToolMirror(\n tool: ToolDescriptor,\n signal?: AbortSignal\n ): NativeToolCleanup | undefined {\n if (!this.native) {\n return undefined;\n }\n\n const nativeRegister = this.native.registerTool as NativeRegisterToolFn;\n const nativeUnregisterTool = this.getNativeUnregisterTool();\n const shouldPassSignal = Boolean(signal) || !nativeUnregisterTool;\n const cleanup = shouldPassSignal ? this.createNativeToolCleanup(signal) : undefined;\n let nativeRegisterResult: MaybePromise<void>;\n\n try {\n if (cleanup) {\n nativeRegisterResult = nativeRegister.call(this.native, tool, cleanup.options);\n } else {\n nativeRegisterResult = nativeRegister.call(this.native, tool);\n }\n } catch (error) {\n cleanup?.abort();\n if (isPermissionsPolicySecurityError(error)) {\n console.warn(\n '[BrowserMcpServer] Native WebMCP tool mirror is blocked by permissions policy; continuing with WebMCP transport registration only.'\n );\n return undefined;\n }\n throw error;\n }\n\n if (!cleanup) {\n return undefined;\n }\n\n const nativeToolCleanup = {\n abort: cleanup.abort,\n // Web IDL optional arguments may not increase function.length. When\n // unregisterTool is absent, the signal is the only native cleanup path.\n nativeSignalAccepted: nativeRegister.length >= 2 || !nativeUnregisterTool,\n };\n this._nativeToolCleanups.set(tool.name, nativeToolCleanup);\n\n if (isPromiseLike(nativeRegisterResult)) {\n nativeRegisterResult.then(undefined, (error: unknown) => {\n cleanup.abort();\n if (this._nativeToolCleanups.get(tool.name) === nativeToolCleanup) {\n this._nativeToolCleanups.delete(tool.name);\n }\n\n if (isPermissionsPolicySecurityError(error)) {\n console.warn(\n '[BrowserMcpServer] Native WebMCP tool mirror is blocked by permissions policy; continuing with WebMCP transport registration only.'\n );\n return;\n }\n\n if (isAbortError(error)) {\n return;\n }\n\n console.warn(\n '[BrowserMcpServer] Native WebMCP tool mirror registration rejected; continuing with WebMCP transport registration only.',\n error\n );\n });\n }\n\n return nativeToolCleanup;\n }\n\n private unregisterNativeToolMirror(\n name: string,\n options?: { preferAbortSignal?: boolean }\n ): void {\n const cleanup = this._nativeToolCleanups.get(name);\n this._nativeToolCleanups.delete(name);\n\n const nativeUnregisterTool = this.getNativeUnregisterTool();\n const shouldUseAbortOnly = options?.preferAbortSignal && cleanup?.nativeSignalAccepted === true;\n\n if (shouldUseAbortOnly || !nativeUnregisterTool) {\n cleanup?.abort();\n return;\n }\n\n try {\n nativeUnregisterTool(name);\n } finally {\n cleanup?.abort();\n }\n }\n\n private installToolRequestHandlers(): void {\n this.server.setRequestHandler(ListToolsRequestSchema, () => ({\n tools: this.listToolsForMcpTransport(),\n }));\n\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n try {\n const params =\n request.params.arguments === undefined\n ? { name: request.params.name }\n : {\n name: request.params.name,\n arguments: request.params.arguments,\n };\n const result = await this.callTool(params);\n return this.toMcpCallToolResult(result);\n } catch (error) {\n return {\n content: [\n {\n type: 'text',\n text: error instanceof Error ? error.message : String(error),\n },\n ],\n isError: true,\n } satisfies McpCallToolResult;\n }\n });\n }\n\n private registerToolInServer(tool: ToolDescriptor): void {\n validateAndWarnToolName(tool.name);\n\n const inputSchema = this.toInputTransportSchema(tool.inputSchema);\n const outputSchema = tool.outputSchema\n ? this.toOutputTransportSchema(tool.outputSchema)\n : undefined;\n\n if (this._tools.has(tool.name)) {\n throw new Error(`Tool ${tool.name} is already registered`);\n }\n\n const registeredTool: RegisteredWebMcpTool = {\n ...(tool.title ? { title: tool.title } : {}),\n description: tool.description,\n inputSchema,\n ...(outputSchema ? { outputSchema } : {}),\n ...(tool.annotations ? { annotations: tool.annotations } : {}),\n handler: async (args: Record<string, unknown>) => {\n const client: ModelContextClient = {\n requestUserInteraction: async (cb: () => Promise<unknown>) => cb(),\n };\n return normalizeToolResponse(await tool.execute(args, client));\n },\n };\n\n this._tools.set(tool.name, registeredTool);\n this.sendToolListChanged();\n this.notifyProducerToolsChanged();\n }\n\n get ontoolchange(): ((this: ModelContextCore, ev: Event) => unknown) | null {\n return this._ontoolchange;\n }\n\n set ontoolchange(handler: ((this: ModelContextCore, ev: Event) => unknown) | null) {\n this._ontoolchange = handler;\n }\n\n addEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | AddEventListenerOptions\n ): void {\n this._producerEventTarget.addEventListener(type, listener, options);\n }\n\n removeEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | EventListenerOptions\n ): void {\n this._producerEventTarget.removeEventListener(type, listener, options);\n }\n\n dispatchEvent(event: Event): boolean {\n return this._producerEventTarget.dispatchEvent(event);\n }\n\n private notifyProducerToolsChanged(): void {\n if (this._producerToolsChangedQueued) {\n return;\n }\n this._producerToolsChangedQueued = true;\n\n queueMicrotask(() => {\n this._producerToolsChangedQueued = false;\n const event = new Event('toolchange');\n try {\n this._ontoolchange?.call(this as unknown as ModelContextCore, event);\n } catch (error) {\n console.warn(\n '[BrowserMcpServer] navigator.modelContext.ontoolchange handler threw:',\n error\n );\n }\n this.dispatchEvent(event);\n });\n }\n\n backfillTools(\n tools: readonly ToolListItem[],\n execute: (name: string, args: Record<string, unknown>) => Promise<ToolResponse>\n ): number {\n let synced = 0;\n\n for (const sourceTool of tools) {\n if (!sourceTool?.name || this._tools.has(sourceTool.name)) {\n continue;\n }\n\n const toolDescriptor: ToolDescriptor = {\n name: sourceTool.name,\n description: sourceTool.description ?? '',\n inputSchema: sourceTool.inputSchema ?? DEFAULT_INPUT_SCHEMA,\n execute: async (args: Record<string, unknown>) => execute(sourceTool.name, args),\n };\n\n if (sourceTool.outputSchema) {\n toolDescriptor.outputSchema = sourceTool.outputSchema;\n }\n if (sourceTool.annotations) {\n toolDescriptor.annotations = sourceTool.annotations;\n }\n\n this.registerToolInServer(toolDescriptor);\n synced++;\n }\n\n return synced;\n }\n\n // --- WebMCP standard API (primary surface) ---\n\n // @ts-expect-error -- WebMCP API: (ToolDescriptor, options?) vs MCP SDK: (name, config, cb)\n override registerTool(\n tool: ToolDescriptor,\n options?: ModelContextRegisterToolOptions\n ): Promise<void> {\n const signal = options?.signal;\n\n if (signal?.aborted) {\n return Promise.reject(createAbortError());\n }\n\n this.registerNativeToolMirror(tool, signal);\n\n try {\n this.registerToolInServer(tool);\n } catch (error) {\n if (this.native) {\n try {\n this.unregisterNativeToolMirror(tool.name);\n } catch (rollbackError) {\n console.error(\n '[BrowserMcpServer] Rollback of native tool registration failed:',\n rollbackError\n );\n }\n }\n throw error;\n }\n\n if (signal) {\n signal.addEventListener(\n 'abort',\n () => {\n const removed = this._tools.delete(tool.name);\n if (removed) {\n this.sendToolListChanged();\n }\n try {\n this.unregisterNativeToolMirror(tool.name, { preferAbortSignal: true });\n } catch (error) {\n console.warn('[BrowserMcpServer] Native unregister via abort fallback failed:', error);\n }\n if (removed) {\n this.notifyProducerToolsChanged();\n }\n },\n { once: true }\n );\n }\n\n return Promise.resolve();\n }\n\n /**\n * Backfill tools that were already registered on the native/polyfill context\n * before this BrowserMcpServer wrapper was installed.\n */\n syncNativeTools(): number {\n let synced = 0;\n const nativeLegacyToolsApi = this.getNativeLegacyToolsApi();\n if (nativeLegacyToolsApi) {\n const nativeCallTool = nativeLegacyToolsApi.callTool.bind(nativeLegacyToolsApi);\n synced += this.backfillTools(\n nativeLegacyToolsApi.listTools(),\n async (name: string, args: Record<string, unknown>) =>\n nativeCallTool({\n name,\n arguments: args,\n })\n );\n }\n\n const nativeStandardToolsApi = this.getNativeStandardToolsApi();\n if (nativeStandardToolsApi) {\n void this.backfillNativeStandardTools(nativeStandardToolsApi).catch((error: unknown) => {\n console.warn('[BrowserMcpServer] Native WebMCP tool backfill failed:', error);\n });\n }\n\n return synced;\n }\n\n private async backfillNativeStandardTools(\n nativeToolsApi: NativeStandardToolsApi\n ): Promise<number> {\n const nativeTools = await nativeToolsApi.getTools.call(this.native);\n return this.backfillTools(\n nativeTools.map(toToolListItemFromNativeToolInfo),\n async (name: string, args: Record<string, unknown>) => {\n const nativeTool = nativeTools.find((tool) => tool.name === name);\n if (!nativeTool) {\n throw new Error(`Native tool not found: ${name}`);\n }\n\n const serialized = await nativeToolsApi.executeTool.call(\n this.native,\n nativeTool,\n JSON.stringify(args ?? {})\n );\n return parseNativeToolResult(name, serialized);\n }\n );\n }\n\n unregisterTool(nameOrTool: string | ModelContextToolReference): void {\n this.warnUnregisterToolDeprecationOnce();\n const name = this.resolveToolNameForUnregister(nameOrTool);\n const removed = this._tools.delete(name);\n if (removed) {\n this.sendToolListChanged();\n }\n\n if (this.native) {\n this.unregisterNativeToolMirror(name);\n }\n if (removed) {\n this.notifyProducerToolsChanged();\n }\n }\n\n // @ts-expect-error -- WebMCP API: (descriptor) vs MCP SDK: (name, uri, config, readCallback)\n override registerResource(descriptor: {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n read: (uri: URL, params?: Record<string, string>) => Promise<{ contents: ResourceContents[] }>;\n }): { unregister: () => void } {\n const registered = (super.registerResource as unknown as ParentRegisterResourceFn)(\n descriptor.name,\n descriptor.uri,\n {\n ...(descriptor.description !== undefined && { description: descriptor.description }),\n ...(descriptor.mimeType !== undefined && { mimeType: descriptor.mimeType }),\n },\n async (uri: URL) => ({\n contents: (await descriptor.read(uri)).contents,\n })\n );\n\n return {\n unregister: () => registered.remove(),\n };\n }\n\n // @ts-expect-error -- WebMCP API: (descriptor) vs MCP SDK: (name, config, cb)\n override registerPrompt(descriptor: {\n name: string;\n description?: string;\n argsSchema?: InputSchema;\n get: (args: Record<string, unknown>) => Promise<{ messages: PromptMessage[] }>;\n }): { unregister: () => void } {\n // Store argsSchema locally — the parent SDK's _createRegisteredPrompt corrupts\n // plain JSON Schema objects via objectFromShape() which expects Zod schemas.\n if (descriptor.argsSchema) {\n this._promptSchemas.set(descriptor.name, descriptor.argsSchema);\n }\n\n const registered = (super.registerPrompt as unknown as ParentRegisterPromptFn)(\n descriptor.name,\n {\n ...(descriptor.description !== undefined && { description: descriptor.description }),\n // Do NOT pass argsSchema to parent — it gets corrupted by Zod's objectFromShape\n },\n async (args: Record<string, unknown>) => ({\n messages: (await descriptor.get(args)).messages,\n })\n );\n\n return {\n unregister: () => {\n this._promptSchemas.delete(descriptor.name);\n registered.remove();\n },\n };\n }\n\n private resolveToolNameForUnregister(nameOrTool: string | ModelContextToolReference): string {\n if (typeof nameOrTool === 'string') {\n return nameOrTool;\n }\n\n if (isPlainObject(nameOrTool) && typeof nameOrTool.name === 'string') {\n return nameOrTool.name;\n }\n\n throw new TypeError(\n \"Failed to execute 'unregisterTool' on 'ModelContext': parameter 1 must be a string or an object with a string name.\"\n );\n }\n\n private warnUnregisterToolDeprecationOnce(): void {\n if (this._unregisterToolDeprecationWarned) {\n return;\n }\n\n this._unregisterToolDeprecationWarned = true;\n console.warn(\n '[BrowserMcpServer] navigator.modelContext.unregisterTool() is deprecated. The April 23, 2026 WebMCP draft removed it in favor of registerTool(tool, { signal }) — pass an AbortSignal and abort it to unregister.'\n );\n }\n\n // --- Extension methods ---\n\n listResources(): Array<{\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n }> {\n return Object.entries(this._parentResources)\n .filter(([, resource]) => resource.enabled)\n .map(([uri, resource]) => ({\n uri,\n name: resource.name,\n ...resource.metadata,\n }));\n }\n\n async readResource(uri: string): Promise<{ contents: ResourceContents[] }> {\n const resource = this._parentResources[uri];\n if (!resource) {\n throw new Error(`Resource not found: ${uri}`);\n }\n\n return resource.readCallback(new URL(uri), {});\n }\n\n listPrompts(): Array<{\n name: string;\n description?: string;\n arguments?: Array<{ name: string; description?: string; required?: boolean }>;\n }> {\n return Object.entries(this._parentPrompts)\n .filter(([, prompt]) => prompt.enabled)\n .map(([name, prompt]) => {\n const schema = this._promptSchemas.get(name);\n return {\n name,\n ...(prompt.description !== undefined && { description: prompt.description }),\n ...(schema?.properties\n ? {\n arguments: Object.entries(schema.properties).map(([argName, prop]) => ({\n name: argName,\n ...(typeof prop === 'object' && prop !== null && 'description' in prop\n ? { description: (prop as { description: string }).description }\n : {}),\n ...(schema.required?.includes(argName) ? { required: true } : {}),\n })),\n }\n : {}),\n };\n });\n }\n\n async getPrompt(\n name: string,\n args: Record<string, unknown> = {}\n ): Promise<{ messages: PromptMessage[] }> {\n const prompt = this._parentPrompts[name];\n if (!prompt) {\n throw new Error(`Prompt not found: ${name}`);\n }\n\n const schema = this._promptSchemas.get(name);\n if (schema) {\n const validator = this._jsonValidator.getValidator(schema);\n const result = validator(args);\n if (!result.valid) {\n throw new Error(`Invalid arguments for prompt ${name}: ${result.errorMessage}`);\n }\n }\n\n return prompt.callback(args, {});\n }\n\n listTools(): ToolListItem[] {\n return [...this._tools.entries()].map(([name, tool]) => {\n const item: ToolListItem = {\n name,\n description: tool.description ?? '',\n inputSchema: tool.inputSchema,\n };\n if (tool.outputSchema) item.outputSchema = tool.outputSchema;\n if (tool.annotations) item.annotations = tool.annotations;\n return item;\n });\n }\n\n private listToolsForMcpTransport(): ToolListItem[] {\n return this.listTools().map((tool) => {\n if (!tool.outputSchema || tool.outputSchema.type === 'object') {\n return tool;\n }\n\n if (tool.outputSchema.type === undefined) {\n return {\n ...tool,\n outputSchema: {\n ...(tool.outputSchema as Record<string, unknown>),\n type: 'object',\n } as JsonSchemaForInference,\n };\n }\n\n const { outputSchema: _outputSchema, ...mcpTool } = tool;\n return mcpTool;\n });\n }\n\n private toMcpCallToolResult(result: ToolResponse): McpCallToolResult {\n return {\n content: result.content as McpCallToolResult['content'],\n ...(isPlainObject(result.structuredContent)\n ? {\n structuredContent: result.structuredContent as McpCallToolResult['structuredContent'],\n }\n : {}),\n ...(result.isError !== undefined ? { isError: result.isError } : {}),\n };\n }\n\n async getTools(): Promise<ModelContextToolInfo[]> {\n const origin =\n typeof globalThis.location === 'object' && typeof globalThis.location?.origin === 'string'\n ? globalThis.location.origin\n : '';\n const currentWindow =\n typeof globalThis.window === 'object' ? globalThis.window : (undefined as unknown as Window);\n\n return this.listTools().map((tool) => {\n let inputSchema: string;\n try {\n inputSchema = JSON.stringify(tool.inputSchema ?? DEFAULT_INPUT_SCHEMA);\n } catch {\n inputSchema = JSON.stringify(DEFAULT_INPUT_SCHEMA);\n }\n\n return {\n name: tool.name,\n title: this._tools.get(tool.name)?.title ?? tool.description ?? '',\n description: tool.description ?? '',\n inputSchema,\n origin,\n window: currentWindow,\n };\n });\n }\n\n /**\n * Override SDK's validateToolInput to handle both Zod schemas and plain JSON Schema.\n * Zod schemas use the SDK's safeParseAsync; plain JSON Schema uses the configured SDK validator.\n */\n override async validateToolInput(\n tool: { inputSchema?: unknown },\n args: Record<string, unknown> | undefined,\n toolName: string\n ): Promise<Record<string, unknown> | undefined> {\n if (!tool.inputSchema) return undefined;\n\n // Zod schemas → use SDK's safeParseAsync\n if (this.isZodSchema(tool.inputSchema)) {\n const result = await safeParseAsync(\n tool.inputSchema as Parameters<typeof safeParseAsync>[0],\n args ?? {}\n );\n if (!result.success) {\n throw new Error(\n `Invalid arguments for tool ${toolName}: ${getParseErrorMessage(result.error)}`\n );\n }\n return result.data as Record<string, unknown>;\n }\n\n // Plain JSON Schema → use the configured SDK validator\n const validator = this._jsonValidator.getValidator(tool.inputSchema);\n const result = validator(args ?? {});\n if (!result.valid) {\n throw new Error(`Invalid arguments for tool ${toolName}: ${result.errorMessage}`);\n }\n return result.data as Record<string, unknown>;\n }\n\n /**\n * Override SDK's validateToolOutput to handle both Zod schemas and plain JSON Schema.\n */\n override async validateToolOutput(\n tool: { outputSchema?: unknown },\n result: unknown,\n toolName: string\n ): Promise<void> {\n if (!tool.outputSchema) return;\n\n const r = result as { content?: unknown; isError?: unknown; structuredContent?: unknown };\n if (!('content' in r) || r.isError) return;\n if (r.structuredContent === undefined) {\n throw new Error(\n `Output validation error: Tool ${toolName} has an output schema but no structured content was provided`\n );\n }\n\n // Zod schemas → use SDK's safeParseAsync\n if (this.isZodSchema(tool.outputSchema)) {\n const parseResult = await safeParseAsync(\n tool.outputSchema as Parameters<typeof safeParseAsync>[0],\n r.structuredContent\n );\n if (!parseResult.success) {\n throw new Error(\n `Output validation error: Invalid structured content for tool ${toolName}: ${getParseErrorMessage(parseResult.error)}`\n );\n }\n return;\n }\n\n // Plain JSON Schema → use the configured SDK validator\n const validator = this._jsonValidator.getValidator(tool.outputSchema);\n const validationResult = validator(r.structuredContent);\n if (!validationResult.valid) {\n throw new Error(\n `Output validation error: Invalid structured content for tool ${toolName}: ${validationResult.errorMessage}`\n );\n }\n }\n\n /**\n * Executes a registered tool by name.\n *\n * @deprecated Prefer the WebMCP standard producer path: get a descriptor from\n * `getTools()` and pass it to `executeTool(tool, inputArgsJson)`. This method\n * remains as an MCP-B compatibility convenience and MCP transport bridge.\n */\n async callTool(params: {\n name: string;\n arguments?: Record<string, unknown>;\n }): Promise<ToolResponse> {\n const tool = this._tools.get(params.name);\n if (!tool) {\n throw new Error(`Tool not found: ${params.name}`);\n }\n\n const args = await this.validateToolInput(tool, params.arguments, params.name);\n const result = await tool.handler(args ?? {});\n await this.validateToolOutput(tool, result, params.name);\n return result;\n }\n\n /**\n * Executes a tool descriptor returned from getTools().\n */\n executeTool(\n tool: ModelContextToolInfo,\n inputArgsJson: string,\n options?: ModelContextTestingExecuteToolOptions\n ): Promise<string | null>;\n /**\n * Executes a registered tool by name.\n *\n * @deprecated Prefer the WebMCP standard producer path: get a descriptor from\n * `getTools()` and pass it to `executeTool(tool, inputArgsJson)`.\n */\n executeTool(name: string, args?: Record<string, unknown>): Promise<ToolResponse>;\n async executeTool(\n toolOrName: ModelContextToolInfo | string,\n inputArgsJsonOrArgs: string | Record<string, unknown> = {}\n ): Promise<string | null | ToolResponse> {\n if (typeof toolOrName === 'string') {\n return this.callTool({\n name: toolOrName,\n arguments:\n typeof inputArgsJsonOrArgs === 'string'\n ? JSON.parse(inputArgsJsonOrArgs)\n : inputArgsJsonOrArgs,\n });\n }\n\n const result = await this.callTool({\n name: toolOrName.name,\n arguments:\n typeof inputArgsJsonOrArgs === 'string'\n ? (JSON.parse(inputArgsJsonOrArgs) as Record<string, unknown>)\n : inputArgsJsonOrArgs,\n });\n const serialized = JSON.stringify(result);\n return serialized === undefined ? null : serialized;\n }\n\n /**\n * Override connect to initialize request handlers BEFORE the transport connection.\n * This prevents \"Cannot register capabilities after connecting to transport\" errors\n * when tools are registered dynamically after connection.\n *\n * Tool handlers are installed with the public low-level Server API in the constructor.\n * Prompt/resource handlers still come from the parent, then prompt handlers are replaced\n * where the parent expects Zod shapes instead of plain JSON Schema.\n */\n override async connect(transport: Transport): Promise<void> {\n (this as unknown as { setResourceRequestHandlers: () => void }).setResourceRequestHandlers();\n (this as unknown as { setPromptRequestHandlers: () => void }).setPromptRequestHandlers();\n\n // Replace ListPrompts handler — parent calls promptArgumentsFromSchema which expects\n // Zod shapes. We use _promptSchemas which has the real JSON Schema.\n this.server.setRequestHandler(ListPromptsRequestSchema, () => ({\n prompts: this.listPrompts(),\n }));\n\n // Replace GetPrompt handler — parent calls safeParseAsync on argsSchema.\n // We validate with the configured SDK validator instead.\n this.server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n const prompt = this._parentPrompts[request.params.name];\n if (!prompt) {\n throw new Error(`Prompt ${request.params.name} not found`);\n }\n if (!prompt.enabled) {\n throw new Error(`Prompt ${request.params.name} disabled`);\n }\n\n const schema = this._promptSchemas.get(request.params.name);\n if (schema) {\n const validator = this._jsonValidator.getValidator(schema);\n const result = validator(request.params.arguments ?? {});\n if (!result.valid) {\n throw new Error(\n `Invalid arguments for prompt ${request.params.name}: ${result.errorMessage}`\n );\n }\n return prompt.callback(request.params.arguments as Record<string, unknown>, {});\n }\n\n return prompt.callback({}, {});\n });\n\n return super.connect(transport);\n }\n\n // --- Sampling & Elicitation (delegated to Server) ---\n\n async createMessage(\n params: CreateMessageRequest['params'],\n options?: RequestOptions\n ): Promise<CreateMessageResult> {\n return this.server.createMessage(params, withDefaultTimeout(options));\n }\n\n async elicitInput(\n params: ElicitRequest['params'],\n options?: RequestOptions\n ): Promise<ElicitResult> {\n return this.server.elicitInput(params, withDefaultTimeout(options));\n }\n}\n\n// --- Exported descriptor types for consumers ---\n\nexport interface ResourceDescriptor {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n read: (uri: URL, params?: Record<string, string>) => Promise<{ contents: ResourceContents[] }>;\n}\n\nexport interface PromptDescriptor {\n name: string;\n description?: string;\n argsSchema?: InputSchema;\n get: (args: Record<string, unknown>) => Promise<{ messages: PromptMessage[] }>;\n}\n","import type {\n JsonSchemaValidatorResult,\n jsonSchemaValidator,\n} from '@modelcontextprotocol/sdk/validation';\n\n/**\n * No-op JSON Schema validator for browser environments.\n *\n * This validator bypasses the MCP SDK's internal ajv-based validation which causes\n * \"Error compiling schema\" errors in browser extensions due to ajv's use of\n * eval/Function constructor.\n *\n * Validation is handled externally by Zod in @mcp-b/global, making the SDK's\n * internal validation redundant. This no-op validator allows the SDK to function\n * without the ajv dependency issues.\n */\n\n/**\n * A no-op JSON Schema validator that always returns valid.\n *\n * Use this in browser environments where:\n * - ajv causes \"Error compiling schema\" errors\n * - Validation is already handled elsewhere (e.g., by Zod)\n * - You need to avoid eval/Function constructor restrictions\n *\n * @example\n * ```typescript\n * import { BrowserMcpServer } from '@mcp-b/webmcp-ts-sdk';\n * import { NoOpJsonSchemaValidator } from '@mcp-b/webmcp-ts-sdk/no-op-validator';\n *\n * const server = new BrowserMcpServer(\n * { name: 'my-server', version: '1.0.0' },\n * { jsonSchemaValidator: new NoOpJsonSchemaValidator() }\n * );\n * ```\n */\nexport class NoOpJsonSchemaValidator implements jsonSchemaValidator {\n /**\n * Returns a validator function that always passes.\n * The input data is passed through unchanged.\n *\n * @param _schema - The JSON Schema (ignored)\n * @returns A validator function that always returns valid\n */\n getValidator<T>(_schema: unknown): (input: unknown) => JsonSchemaValidatorResult<T> {\n return (input: unknown): JsonSchemaValidatorResult<T> => ({\n valid: true,\n data: input as T,\n errorMessage: undefined,\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["DEFAULT_INPUT_SCHEMA","BaseMcpServer","CfWorkerJsonSchemaValidator","mergeCapabilities","ListToolsRequestSchema","CallToolRequestSchema","ListPromptsRequestSchema","GetPromptRequestSchema"],"sources":["../src/browser-server.ts","../src/no-op-validator.ts","../src/schema.ts"],"sourcesContent":["import type {\n InputSchema,\n JsonSchemaForInference,\n ModelContextClient,\n ModelContextCore,\n ModelContextExtensions,\n ModelContextRegisterToolOptions,\n ModelContextTestingExecuteToolOptions,\n ModelContextToolInfo,\n ModelContextToolReference,\n ResourceContents,\n ToolDescriptor,\n ToolListItem,\n ToolResponse,\n} from '@mcp-b/webmcp-types';\nimport { toJsonValue } from '@mcp-b/webmcp-polyfill/schema';\nimport type { ServerOptions } from '@modelcontextprotocol/sdk/server/index.js';\nimport { McpServer as BaseMcpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n getParseErrorMessage,\n normalizeObjectSchema,\n safeParseAsync,\n} from '@modelcontextprotocol/sdk/server/zod-compat.js';\nimport { toJsonSchemaCompat } from '@modelcontextprotocol/sdk/server/zod-json-schema-compat.js';\nimport type { RequestOptions } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport { mergeCapabilities } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport { validateAndWarnToolName } from '@modelcontextprotocol/sdk/shared/toolNameValidation.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport type { jsonSchemaValidator } from '@modelcontextprotocol/sdk/validation';\nimport { CfWorkerJsonSchemaValidator } from '@modelcontextprotocol/sdk/validation/cfworker';\nimport type {\n CallToolResult as McpCallToolResult,\n CreateMessageRequest,\n CreateMessageResult,\n ElicitRequest,\n ElicitResult,\n Implementation,\n PromptMessage,\n} from '@modelcontextprotocol/sdk/types.js';\nimport {\n CallToolRequestSchema,\n GetPromptRequestSchema,\n ListPromptsRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\n\nconst DEFAULT_INPUT_SCHEMA: InputSchema = { type: 'object', properties: {} };\nconst DEFAULT_CLIENT_REQUEST_TIMEOUT = 10_000;\n\nexport const SERVER_MARKER_PROPERTY = '__isBrowserMcpServer' as const;\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction isCallToolResult(value: unknown): value is ToolResponse {\n return isPlainObject(value) && Array.isArray(value.content);\n}\n\nfunction isPermissionsPolicySecurityError(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const { name, message } = error as { name?: unknown; message?: unknown };\n\n return (\n name === 'SecurityError' &&\n typeof message === 'string' &&\n /permissions policy|feature \"tools\" is disallowed/i.test(message)\n );\n}\n\nfunction isAbortError(error: unknown): boolean {\n return (\n Boolean(error) &&\n typeof error === 'object' &&\n (error as { name?: unknown }).name === 'AbortError'\n );\n}\n\nfunction createAbortError(): Error {\n if (typeof DOMException === 'function') {\n return new DOMException('signal is aborted without reason', 'AbortError');\n }\n\n const error = new Error('signal is aborted without reason');\n error.name = 'AbortError';\n return error;\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n Boolean(value) &&\n (typeof value === 'object' || typeof value === 'function') &&\n typeof (value as { then?: unknown }).then === 'function'\n );\n}\n\nfunction serializeTextContent(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n\n try {\n const candidate = JSON.stringify(value);\n return candidate ?? String(value);\n } catch {\n return String(value);\n }\n}\n\nfunction normalizeToolResponse(value: unknown): ToolResponse {\n if (isCallToolResult(value)) {\n return value;\n }\n\n const structuredContent = toJsonValue(value);\n\n return {\n content: [{ type: 'text', text: serializeTextContent(value) }],\n ...(structuredContent !== undefined ? { structuredContent } : {}),\n isError: false,\n };\n}\n\nfunction parseNativeToolInputSchema(inputSchema: string | undefined): InputSchema {\n if (!inputSchema) {\n return DEFAULT_INPUT_SCHEMA;\n }\n\n try {\n const parsed = JSON.parse(inputSchema) as unknown;\n if (isPlainObject(parsed)) {\n return parsed as InputSchema;\n }\n } catch {\n // Fall through to the default schema. Native previews have returned invalid\n // schema strings during development; a bad imported tool schema should not\n // prevent the wrapper from initializing.\n }\n\n return DEFAULT_INPUT_SCHEMA;\n}\n\nfunction toToolListItemFromNativeToolInfo(tool: ModelContextToolInfo): ToolListItem {\n return {\n name: tool.name,\n description: tool.description ?? '',\n inputSchema: parseNativeToolInputSchema(tool.inputSchema),\n };\n}\n\nfunction parseNativeToolResult(toolName: string, serialized: string | null): ToolResponse {\n if (serialized === null) {\n return {\n content: [{ type: 'text', text: 'Tool execution interrupted by navigation' }],\n isError: true,\n };\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(serialized);\n } catch (parseError) {\n throw new Error(\n `Failed to parse serialized tool response for ${toolName}: ${parseError instanceof Error ? parseError.message : String(parseError)}`\n );\n }\n\n return normalizeToolResponse(parsed);\n}\n\nfunction withDefaultTimeout(options?: RequestOptions): RequestOptions {\n if (options?.signal) return options;\n return { ...options, signal: AbortSignal.timeout(DEFAULT_CLIENT_REQUEST_TIMEOUT) };\n}\n\ninterface RegisteredWebMcpTool {\n title?: string;\n description?: string;\n inputSchema: InputSchema;\n outputSchema?: JsonSchemaForInference;\n annotations?: ToolListItem['annotations'];\n handler: (args: Record<string, unknown>) => Promise<ToolResponse>;\n}\n\ninterface ParentRegisteredResource {\n name: string;\n metadata?: { description?: string; mimeType?: string; title?: string };\n readCallback: (uri: URL, extra: unknown) => Promise<{ contents: ResourceContents[] }>;\n enabled: boolean;\n remove: () => void;\n}\n\ninterface ParentRegisteredPrompt {\n title?: string;\n description?: string;\n argsSchema?: unknown;\n callback: (\n args: Record<string, unknown>,\n extra: unknown\n ) => Promise<{ messages: PromptMessage[] }>;\n enabled: boolean;\n remove: () => void;\n}\n\nexport interface BrowserMcpServerOptions extends ServerOptions {\n native?: ModelContextCore;\n}\n\ntype ParentRegisterResourceFn = (\n name: string,\n uri: string,\n config: Record<string, unknown>,\n cb: (uri: URL, extra: unknown) => Promise<{ contents: ResourceContents[] }>\n) => { remove: () => void };\n\ntype ParentRegisterPromptFn = (\n name: string,\n config: Record<string, unknown>,\n cb: (args: Record<string, unknown>, extra: unknown) => Promise<{ messages: PromptMessage[] }>\n) => { remove: () => void };\n\ntype NativeLegacyToolsApi = ModelContextCore &\n Pick<ModelContextExtensions, 'listTools' | 'callTool'>;\ntype NativeStandardToolsApi = Pick<ModelContextCore, 'getTools' | 'executeTool'>;\ntype MaybePromise<T> = T | PromiseLike<T>;\ntype NativeRegisterToolFn = (\n tool: ToolDescriptor,\n options?: ModelContextRegisterToolOptions\n) => MaybePromise<void>;\ntype NativeUnregisterToolFn = (nameOrTool: string | ModelContextToolReference) => void;\ninterface NativeToolCleanup {\n abort: () => void;\n nativeSignalAccepted: boolean;\n}\n\n/**\n * Browser-optimized MCP Server that speaks WebMCP natively.\n *\n * Implements `registerTool(tool, options?)` while retaining MCP capabilities\n * (resources, prompts, elicitation, sampling) via BaseMcpServer.\n *\n * Deprecated compatibility (kept for Chrome Beta 147 and existing wrappers,\n * removed in the next major): `unregisterTool(name)`.\n *\n * When `native` is provided, tool operations are mirrored so that\n * navigator.modelContextTesting stays in sync.\n */\nexport class BrowserMcpServer extends BaseMcpServer {\n readonly [SERVER_MARKER_PROPERTY] = true as const;\n\n private native: ModelContextCore | undefined;\n private _promptSchemas = new Map<string, InputSchema>();\n private _jsonValidator: jsonSchemaValidator;\n private _publicMethodsBound = false;\n private _unregisterToolDeprecationWarned = false;\n private _nativeToolCleanups = new Map<string, NativeToolCleanup>();\n private _tools = new Map<string, RegisteredWebMcpTool>();\n private _producerEventTarget = new EventTarget();\n private _ontoolchange: ((this: ModelContextCore, ev: Event) => unknown) | null = null;\n private _producerToolsChangedQueued = false;\n\n constructor(serverInfo: Implementation, options?: BrowserMcpServerOptions) {\n const validator = options?.jsonSchemaValidator ?? new CfWorkerJsonSchemaValidator();\n const enhancedOptions: ServerOptions = {\n capabilities: mergeCapabilities(options?.capabilities || {}, {\n tools: { listChanged: true },\n resources: { listChanged: true },\n prompts: { listChanged: true },\n }),\n jsonSchemaValidator: validator,\n };\n\n super(serverInfo, enhancedOptions);\n this._jsonValidator = validator;\n this.native = options?.native;\n this.bindPublicApiMethods();\n this.installToolRequestHandlers();\n }\n\n /**\n * navigator.modelContext consumers may destructure methods (e.g. const { registerTool } = ...).\n * Bind methods once so they remain callable outside instance-method invocation syntax.\n */\n private bindPublicApiMethods(): void {\n if (this._publicMethodsBound) {\n return;\n }\n\n this.registerTool = this.registerTool.bind(this);\n this.unregisterTool = this.unregisterTool.bind(this);\n this.listTools = this.listTools.bind(this);\n this.getTools = this.getTools.bind(this);\n this.callTool = this.callTool.bind(this);\n this.executeTool = this.executeTool.bind(this);\n this.addEventListener = this.addEventListener.bind(this);\n this.removeEventListener = this.removeEventListener.bind(this);\n this.dispatchEvent = this.dispatchEvent.bind(this);\n\n this.registerResource = this.registerResource.bind(this);\n this.listResources = this.listResources.bind(this);\n this.readResource = this.readResource.bind(this);\n\n this.registerPrompt = this.registerPrompt.bind(this);\n this.listPrompts = this.listPrompts.bind(this);\n this.getPrompt = this.getPrompt.bind(this);\n\n this.createMessage = this.createMessage.bind(this);\n this.elicitInput = this.elicitInput.bind(this);\n\n this._publicMethodsBound = true;\n }\n\n private get _parentResources(): Record<string, ParentRegisteredResource> {\n return (this as unknown as { _registeredResources: Record<string, ParentRegisteredResource> })\n ._registeredResources;\n }\n\n private get _parentPrompts(): Record<string, ParentRegisteredPrompt> {\n return (this as unknown as { _registeredPrompts: Record<string, ParentRegisteredPrompt> })\n ._registeredPrompts;\n }\n\n private toJsonSchema(schema: unknown, pipeStrategy: 'input' | 'output'): Record<string, unknown> {\n if (!schema || typeof schema !== 'object') {\n return {};\n }\n\n const normalized = normalizeObjectSchema(schema as Parameters<typeof normalizeObjectSchema>[0]);\n return normalized\n ? (toJsonSchemaCompat(normalized, {\n strictUnions: true,\n pipeStrategy,\n }) as unknown as Record<string, unknown>)\n : (schema as Record<string, unknown>);\n }\n\n private toInputTransportSchema(schema: unknown): InputSchema {\n const jsonSchema = this.toJsonSchema(schema, 'input');\n\n if (Object.keys(jsonSchema).length === 0) {\n return DEFAULT_INPUT_SCHEMA;\n }\n\n if (jsonSchema.type === undefined) {\n return { type: 'object', ...jsonSchema } as InputSchema;\n }\n\n return jsonSchema as InputSchema;\n }\n\n private toOutputTransportSchema(schema: unknown): JsonSchemaForInference {\n return this.toJsonSchema(schema, 'output') as unknown as JsonSchemaForInference;\n }\n\n private isZodSchema(schema: unknown): boolean {\n if (!schema || typeof schema !== 'object') return false;\n const s = schema as Record<string, unknown>;\n return '_zod' in s || '_def' in s;\n }\n\n private getNativeLegacyToolsApi(): NativeLegacyToolsApi | undefined {\n if (!this.native) {\n return undefined;\n }\n\n const candidate = this.native as ModelContextCore &\n Partial<Pick<ModelContextExtensions, 'listTools' | 'callTool'>>;\n if (typeof candidate.listTools !== 'function' || typeof candidate.callTool !== 'function') {\n return undefined;\n }\n\n return candidate as NativeLegacyToolsApi;\n }\n\n private getNativeStandardToolsApi(): NativeStandardToolsApi | undefined {\n if (!this.native) {\n return undefined;\n }\n\n const candidate = this.native as Partial<NativeStandardToolsApi>;\n if (typeof candidate.getTools !== 'function' || typeof candidate.executeTool !== 'function') {\n return undefined;\n }\n\n return candidate as NativeStandardToolsApi;\n }\n\n private getNativeUnregisterTool(): NativeUnregisterToolFn | undefined {\n if (!this.native) {\n return undefined;\n }\n\n const unregisterTool = (this.native as { unregisterTool?: unknown }).unregisterTool;\n if (typeof unregisterTool !== 'function') {\n return undefined;\n }\n\n return (nameOrTool: string | ModelContextToolReference) =>\n unregisterTool.call(this.native, nameOrTool);\n }\n\n private createNativeToolCleanup(signal?: AbortSignal): {\n options: ModelContextRegisterToolOptions;\n abort: () => void;\n } {\n const controller = new AbortController();\n let removeSignalListener: (() => void) | undefined;\n\n if (signal) {\n const abortNativeSignal = () => {\n controller.abort();\n };\n\n if (signal.aborted) {\n abortNativeSignal();\n } else {\n signal.addEventListener('abort', abortNativeSignal, { once: true });\n removeSignalListener = () => signal.removeEventListener('abort', abortNativeSignal);\n }\n }\n\n return {\n options: { signal: controller.signal },\n abort: () => {\n removeSignalListener?.();\n if (!controller.signal.aborted) {\n controller.abort();\n }\n },\n };\n }\n\n private registerNativeToolMirror(\n tool: ToolDescriptor,\n signal?: AbortSignal\n ): NativeToolCleanup | undefined {\n if (!this.native) {\n return undefined;\n }\n\n const nativeRegister = this.native.registerTool as NativeRegisterToolFn;\n const nativeUnregisterTool = this.getNativeUnregisterTool();\n const shouldPassSignal = Boolean(signal) || !nativeUnregisterTool;\n const cleanup = shouldPassSignal ? this.createNativeToolCleanup(signal) : undefined;\n let nativeRegisterResult: MaybePromise<void>;\n\n try {\n if (cleanup) {\n nativeRegisterResult = nativeRegister.call(this.native, tool, cleanup.options);\n } else {\n nativeRegisterResult = nativeRegister.call(this.native, tool);\n }\n } catch (error) {\n cleanup?.abort();\n if (isPermissionsPolicySecurityError(error)) {\n console.warn(\n '[BrowserMcpServer] Native WebMCP tool mirror is blocked by permissions policy; continuing with WebMCP transport registration only.'\n );\n return undefined;\n }\n throw error;\n }\n\n if (!cleanup) {\n return undefined;\n }\n\n const nativeToolCleanup = {\n abort: cleanup.abort,\n // Web IDL optional arguments may not increase function.length. When\n // unregisterTool is absent, the signal is the only native cleanup path.\n nativeSignalAccepted: nativeRegister.length >= 2 || !nativeUnregisterTool,\n };\n this._nativeToolCleanups.set(tool.name, nativeToolCleanup);\n\n if (isPromiseLike(nativeRegisterResult)) {\n nativeRegisterResult.then(undefined, (error: unknown) => {\n cleanup.abort();\n if (this._nativeToolCleanups.get(tool.name) === nativeToolCleanup) {\n this._nativeToolCleanups.delete(tool.name);\n }\n\n if (isPermissionsPolicySecurityError(error)) {\n console.warn(\n '[BrowserMcpServer] Native WebMCP tool mirror is blocked by permissions policy; continuing with WebMCP transport registration only.'\n );\n return;\n }\n\n if (isAbortError(error)) {\n return;\n }\n\n console.warn(\n '[BrowserMcpServer] Native WebMCP tool mirror registration rejected; continuing with WebMCP transport registration only.',\n error\n );\n });\n }\n\n return nativeToolCleanup;\n }\n\n private unregisterNativeToolMirror(\n name: string,\n options?: { preferAbortSignal?: boolean }\n ): void {\n const cleanup = this._nativeToolCleanups.get(name);\n this._nativeToolCleanups.delete(name);\n\n const nativeUnregisterTool = this.getNativeUnregisterTool();\n const shouldUseAbortOnly = options?.preferAbortSignal && cleanup?.nativeSignalAccepted === true;\n\n if (shouldUseAbortOnly || !nativeUnregisterTool) {\n cleanup?.abort();\n return;\n }\n\n try {\n nativeUnregisterTool(name);\n } finally {\n cleanup?.abort();\n }\n }\n\n private installToolRequestHandlers(): void {\n this.server.setRequestHandler(ListToolsRequestSchema, () => ({\n tools: this.listToolsForMcpTransport(),\n }));\n\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n try {\n const params =\n request.params.arguments === undefined\n ? { name: request.params.name }\n : {\n name: request.params.name,\n arguments: request.params.arguments,\n };\n const result = await this.callTool(params);\n return this.toMcpCallToolResult(result);\n } catch (error) {\n return {\n content: [\n {\n type: 'text',\n text: error instanceof Error ? error.message : String(error),\n },\n ],\n isError: true,\n } satisfies McpCallToolResult;\n }\n });\n }\n\n private registerToolInServer(tool: ToolDescriptor): void {\n validateAndWarnToolName(tool.name);\n\n const inputSchema = this.toInputTransportSchema(tool.inputSchema);\n const outputSchema = tool.outputSchema\n ? this.toOutputTransportSchema(tool.outputSchema)\n : undefined;\n\n if (this._tools.has(tool.name)) {\n throw new Error(`Tool ${tool.name} is already registered`);\n }\n\n const registeredTool: RegisteredWebMcpTool = {\n ...(tool.title ? { title: tool.title } : {}),\n description: tool.description,\n inputSchema,\n ...(outputSchema ? { outputSchema } : {}),\n ...(tool.annotations ? { annotations: tool.annotations } : {}),\n handler: async (args: Record<string, unknown>) => {\n const client: ModelContextClient = {\n requestUserInteraction: async (cb: () => Promise<unknown>) => cb(),\n };\n return normalizeToolResponse(await tool.execute(args, client));\n },\n };\n\n this._tools.set(tool.name, registeredTool);\n this.sendToolListChanged();\n this.notifyProducerToolsChanged();\n }\n\n get ontoolchange(): ((this: ModelContextCore, ev: Event) => unknown) | null {\n return this._ontoolchange;\n }\n\n set ontoolchange(handler: ((this: ModelContextCore, ev: Event) => unknown) | null) {\n this._ontoolchange = handler;\n }\n\n addEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | AddEventListenerOptions\n ): void {\n this._producerEventTarget.addEventListener(type, listener, options);\n }\n\n removeEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | EventListenerOptions\n ): void {\n this._producerEventTarget.removeEventListener(type, listener, options);\n }\n\n dispatchEvent(event: Event): boolean {\n return this._producerEventTarget.dispatchEvent(event);\n }\n\n private notifyProducerToolsChanged(): void {\n if (this._producerToolsChangedQueued) {\n return;\n }\n this._producerToolsChangedQueued = true;\n\n queueMicrotask(() => {\n this._producerToolsChangedQueued = false;\n const event = new Event('toolchange');\n try {\n this._ontoolchange?.call(this as unknown as ModelContextCore, event);\n } catch (error) {\n console.warn(\n '[BrowserMcpServer] navigator.modelContext.ontoolchange handler threw:',\n error\n );\n }\n this.dispatchEvent(event);\n });\n }\n\n backfillTools(\n tools: readonly ToolListItem[],\n execute: (name: string, args: Record<string, unknown>) => Promise<ToolResponse>\n ): number {\n let synced = 0;\n\n for (const sourceTool of tools) {\n if (!sourceTool?.name || this._tools.has(sourceTool.name)) {\n continue;\n }\n\n const toolDescriptor: ToolDescriptor = {\n name: sourceTool.name,\n description: sourceTool.description ?? '',\n inputSchema: sourceTool.inputSchema ?? DEFAULT_INPUT_SCHEMA,\n execute: async (args: Record<string, unknown>) => execute(sourceTool.name, args),\n };\n\n if (sourceTool.outputSchema) {\n toolDescriptor.outputSchema = sourceTool.outputSchema;\n }\n if (sourceTool.annotations) {\n toolDescriptor.annotations = sourceTool.annotations;\n }\n\n this.registerToolInServer(toolDescriptor);\n synced++;\n }\n\n return synced;\n }\n\n // --- WebMCP standard API (primary surface) ---\n\n // @ts-expect-error -- WebMCP API: (ToolDescriptor, options?) vs MCP SDK: (name, config, cb)\n override registerTool(\n tool: ToolDescriptor,\n options?: ModelContextRegisterToolOptions\n ): Promise<void> {\n const signal = options?.signal;\n\n if (signal?.aborted) {\n return Promise.reject(createAbortError());\n }\n\n this.registerNativeToolMirror(tool, signal);\n\n try {\n this.registerToolInServer(tool);\n } catch (error) {\n if (this.native) {\n try {\n this.unregisterNativeToolMirror(tool.name);\n } catch (rollbackError) {\n console.error(\n '[BrowserMcpServer] Rollback of native tool registration failed:',\n rollbackError\n );\n }\n }\n throw error;\n }\n\n if (signal) {\n signal.addEventListener(\n 'abort',\n () => {\n const removed = this._tools.delete(tool.name);\n if (removed) {\n this.sendToolListChanged();\n }\n try {\n this.unregisterNativeToolMirror(tool.name, { preferAbortSignal: true });\n } catch (error) {\n console.warn('[BrowserMcpServer] Native unregister via abort fallback failed:', error);\n }\n if (removed) {\n this.notifyProducerToolsChanged();\n }\n },\n { once: true }\n );\n }\n\n return Promise.resolve();\n }\n\n /**\n * Backfill tools that were already registered on the native/polyfill context\n * before this BrowserMcpServer wrapper was installed.\n */\n syncNativeTools(): number {\n let synced = 0;\n const nativeLegacyToolsApi = this.getNativeLegacyToolsApi();\n if (nativeLegacyToolsApi) {\n const nativeCallTool = nativeLegacyToolsApi.callTool.bind(nativeLegacyToolsApi);\n synced += this.backfillTools(\n nativeLegacyToolsApi.listTools(),\n async (name: string, args: Record<string, unknown>) =>\n nativeCallTool({\n name,\n arguments: args,\n })\n );\n }\n\n const nativeStandardToolsApi = this.getNativeStandardToolsApi();\n if (nativeStandardToolsApi) {\n void this.backfillNativeStandardTools(nativeStandardToolsApi).catch((error: unknown) => {\n console.warn('[BrowserMcpServer] Native WebMCP tool backfill failed:', error);\n });\n }\n\n return synced;\n }\n\n private async backfillNativeStandardTools(\n nativeToolsApi: NativeStandardToolsApi\n ): Promise<number> {\n const nativeTools = await nativeToolsApi.getTools.call(this.native);\n return this.backfillTools(\n nativeTools.map(toToolListItemFromNativeToolInfo),\n async (name: string, args: Record<string, unknown>) => {\n const nativeTool = nativeTools.find((tool) => tool.name === name);\n if (!nativeTool) {\n throw new Error(`Native tool not found: ${name}`);\n }\n\n const serialized = await nativeToolsApi.executeTool.call(\n this.native,\n nativeTool,\n JSON.stringify(args ?? {})\n );\n return parseNativeToolResult(name, serialized);\n }\n );\n }\n\n unregisterTool(nameOrTool: string | ModelContextToolReference): void {\n this.warnUnregisterToolDeprecationOnce();\n const name = this.resolveToolNameForUnregister(nameOrTool);\n const removed = this._tools.delete(name);\n if (removed) {\n this.sendToolListChanged();\n }\n\n if (this.native) {\n this.unregisterNativeToolMirror(name);\n }\n if (removed) {\n this.notifyProducerToolsChanged();\n }\n }\n\n // @ts-expect-error -- WebMCP API: (descriptor) vs MCP SDK: (name, uri, config, readCallback)\n override registerResource(descriptor: {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n read: (uri: URL, params?: Record<string, string>) => Promise<{ contents: ResourceContents[] }>;\n }): { unregister: () => void } {\n const registered = (super.registerResource as unknown as ParentRegisterResourceFn)(\n descriptor.name,\n descriptor.uri,\n {\n ...(descriptor.description !== undefined && { description: descriptor.description }),\n ...(descriptor.mimeType !== undefined && { mimeType: descriptor.mimeType }),\n },\n async (uri: URL) => ({\n contents: (await descriptor.read(uri)).contents,\n })\n );\n\n return {\n unregister: () => registered.remove(),\n };\n }\n\n // @ts-expect-error -- WebMCP API: (descriptor) vs MCP SDK: (name, config, cb)\n override registerPrompt(descriptor: {\n name: string;\n description?: string;\n argsSchema?: InputSchema;\n get: (args: Record<string, unknown>) => Promise<{ messages: PromptMessage[] }>;\n }): { unregister: () => void } {\n // Store argsSchema locally — the parent SDK's _createRegisteredPrompt corrupts\n // plain JSON Schema objects via objectFromShape() which expects Zod schemas.\n if (descriptor.argsSchema) {\n this._promptSchemas.set(descriptor.name, descriptor.argsSchema);\n }\n\n const registered = (super.registerPrompt as unknown as ParentRegisterPromptFn)(\n descriptor.name,\n {\n ...(descriptor.description !== undefined && { description: descriptor.description }),\n // Do NOT pass argsSchema to parent — it gets corrupted by Zod's objectFromShape\n },\n async (args: Record<string, unknown>) => ({\n messages: (await descriptor.get(args)).messages,\n })\n );\n\n return {\n unregister: () => {\n this._promptSchemas.delete(descriptor.name);\n registered.remove();\n },\n };\n }\n\n private resolveToolNameForUnregister(nameOrTool: string | ModelContextToolReference): string {\n if (typeof nameOrTool === 'string') {\n return nameOrTool;\n }\n\n if (isPlainObject(nameOrTool) && typeof nameOrTool.name === 'string') {\n return nameOrTool.name;\n }\n\n throw new TypeError(\n \"Failed to execute 'unregisterTool' on 'ModelContext': parameter 1 must be a string or an object with a string name.\"\n );\n }\n\n private warnUnregisterToolDeprecationOnce(): void {\n if (this._unregisterToolDeprecationWarned) {\n return;\n }\n\n this._unregisterToolDeprecationWarned = true;\n console.warn(\n '[BrowserMcpServer] navigator.modelContext.unregisterTool() is deprecated. The April 23, 2026 WebMCP draft removed it in favor of registerTool(tool, { signal }) — pass an AbortSignal and abort it to unregister.'\n );\n }\n\n // --- Extension methods ---\n\n listResources(): Array<{\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n }> {\n return Object.entries(this._parentResources)\n .filter(([, resource]) => resource.enabled)\n .map(([uri, resource]) => ({\n uri,\n name: resource.name,\n ...resource.metadata,\n }));\n }\n\n async readResource(uri: string): Promise<{ contents: ResourceContents[] }> {\n const resource = this._parentResources[uri];\n if (!resource) {\n throw new Error(`Resource not found: ${uri}`);\n }\n\n return resource.readCallback(new URL(uri), {});\n }\n\n listPrompts(): Array<{\n name: string;\n description?: string;\n arguments?: Array<{ name: string; description?: string; required?: boolean }>;\n }> {\n return Object.entries(this._parentPrompts)\n .filter(([, prompt]) => prompt.enabled)\n .map(([name, prompt]) => {\n const schema = this._promptSchemas.get(name);\n return {\n name,\n ...(prompt.description !== undefined && { description: prompt.description }),\n ...(schema?.properties\n ? {\n arguments: Object.entries(schema.properties).map(([argName, prop]) => ({\n name: argName,\n ...(typeof prop === 'object' && prop !== null && 'description' in prop\n ? { description: (prop as { description: string }).description }\n : {}),\n ...(schema.required?.includes(argName) ? { required: true } : {}),\n })),\n }\n : {}),\n };\n });\n }\n\n async getPrompt(\n name: string,\n args: Record<string, unknown> = {}\n ): Promise<{ messages: PromptMessage[] }> {\n const prompt = this._parentPrompts[name];\n if (!prompt) {\n throw new Error(`Prompt not found: ${name}`);\n }\n\n const schema = this._promptSchemas.get(name);\n if (schema) {\n const validator = this._jsonValidator.getValidator(schema);\n const result = validator(args);\n if (!result.valid) {\n throw new Error(`Invalid arguments for prompt ${name}: ${result.errorMessage}`);\n }\n }\n\n return prompt.callback(args, {});\n }\n\n listTools(): ToolListItem[] {\n return [...this._tools.entries()].map(([name, tool]) => {\n const item: ToolListItem = {\n name,\n description: tool.description ?? '',\n inputSchema: tool.inputSchema,\n };\n if (tool.outputSchema) item.outputSchema = tool.outputSchema;\n if (tool.annotations) item.annotations = tool.annotations;\n return item;\n });\n }\n\n private listToolsForMcpTransport(): ToolListItem[] {\n return this.listTools().map((tool) => {\n if (!tool.outputSchema || tool.outputSchema.type === 'object') {\n return tool;\n }\n\n if (tool.outputSchema.type === undefined) {\n return {\n ...tool,\n outputSchema: {\n ...(tool.outputSchema as Record<string, unknown>),\n type: 'object',\n } as JsonSchemaForInference,\n };\n }\n\n const { outputSchema: _outputSchema, ...mcpTool } = tool;\n return mcpTool;\n });\n }\n\n private toMcpCallToolResult(result: ToolResponse): McpCallToolResult {\n return {\n content: result.content as McpCallToolResult['content'],\n ...(isPlainObject(result.structuredContent)\n ? {\n structuredContent: result.structuredContent as McpCallToolResult['structuredContent'],\n }\n : {}),\n ...(result.isError !== undefined ? { isError: result.isError } : {}),\n };\n }\n\n async getTools(): Promise<ModelContextToolInfo[]> {\n const origin =\n typeof globalThis.location === 'object' && typeof globalThis.location?.origin === 'string'\n ? globalThis.location.origin\n : '';\n const currentWindow =\n typeof globalThis.window === 'object' ? globalThis.window : (undefined as unknown as Window);\n\n return this.listTools().map((tool) => {\n let inputSchema: string;\n try {\n inputSchema = JSON.stringify(tool.inputSchema ?? DEFAULT_INPUT_SCHEMA);\n } catch {\n inputSchema = JSON.stringify(DEFAULT_INPUT_SCHEMA);\n }\n\n return {\n name: tool.name,\n title: this._tools.get(tool.name)?.title ?? tool.description ?? '',\n description: tool.description ?? '',\n inputSchema,\n origin,\n window: currentWindow,\n };\n });\n }\n\n /**\n * Override SDK's validateToolInput to handle both Zod schemas and plain JSON Schema.\n * Zod schemas use the SDK's safeParseAsync; plain JSON Schema uses the configured SDK validator.\n */\n override async validateToolInput(\n tool: { inputSchema?: unknown },\n args: Record<string, unknown> | undefined,\n toolName: string\n ): Promise<Record<string, unknown> | undefined> {\n if (!tool.inputSchema) return undefined;\n\n // Zod schemas → use SDK's safeParseAsync\n if (this.isZodSchema(tool.inputSchema)) {\n const result = await safeParseAsync(\n tool.inputSchema as Parameters<typeof safeParseAsync>[0],\n args ?? {}\n );\n if (!result.success) {\n throw new Error(\n `Invalid arguments for tool ${toolName}: ${getParseErrorMessage(result.error)}`\n );\n }\n return result.data as Record<string, unknown>;\n }\n\n // Plain JSON Schema → use the configured SDK validator\n const validator = this._jsonValidator.getValidator(tool.inputSchema);\n const result = validator(args ?? {});\n if (!result.valid) {\n throw new Error(`Invalid arguments for tool ${toolName}: ${result.errorMessage}`);\n }\n return result.data as Record<string, unknown>;\n }\n\n /**\n * Override SDK's validateToolOutput to handle both Zod schemas and plain JSON Schema.\n */\n override async validateToolOutput(\n tool: { outputSchema?: unknown },\n result: unknown,\n toolName: string\n ): Promise<void> {\n if (!tool.outputSchema) return;\n\n const r = result as { content?: unknown; isError?: unknown; structuredContent?: unknown };\n if (!('content' in r) || r.isError) return;\n if (r.structuredContent === undefined) {\n throw new Error(\n `Output validation error: Tool ${toolName} has an output schema but no structured content was provided`\n );\n }\n\n // Zod schemas → use SDK's safeParseAsync\n if (this.isZodSchema(tool.outputSchema)) {\n const parseResult = await safeParseAsync(\n tool.outputSchema as Parameters<typeof safeParseAsync>[0],\n r.structuredContent\n );\n if (!parseResult.success) {\n throw new Error(\n `Output validation error: Invalid structured content for tool ${toolName}: ${getParseErrorMessage(parseResult.error)}`\n );\n }\n return;\n }\n\n // Plain JSON Schema → use the configured SDK validator\n const validator = this._jsonValidator.getValidator(tool.outputSchema);\n const validationResult = validator(r.structuredContent);\n if (!validationResult.valid) {\n throw new Error(\n `Output validation error: Invalid structured content for tool ${toolName}: ${validationResult.errorMessage}`\n );\n }\n }\n\n /**\n * Executes a registered tool by name.\n *\n * @deprecated Prefer the WebMCP standard producer path: get a descriptor from\n * `getTools()` and pass it to `executeTool(tool, inputArgsJson)`. This method\n * remains as an MCP-B compatibility convenience and MCP transport bridge.\n */\n async callTool(params: {\n name: string;\n arguments?: Record<string, unknown>;\n }): Promise<ToolResponse> {\n const tool = this._tools.get(params.name);\n if (!tool) {\n throw new Error(`Tool not found: ${params.name}`);\n }\n\n const args = await this.validateToolInput(tool, params.arguments, params.name);\n const result = await tool.handler(args ?? {});\n await this.validateToolOutput(tool, result, params.name);\n return result;\n }\n\n /**\n * Executes a tool descriptor returned from getTools().\n */\n executeTool(\n tool: ModelContextToolInfo,\n inputArgsJson: string,\n options?: ModelContextTestingExecuteToolOptions\n ): Promise<string | null>;\n /**\n * Executes a registered tool by name.\n *\n * @deprecated Prefer the WebMCP standard producer path: get a descriptor from\n * `getTools()` and pass it to `executeTool(tool, inputArgsJson)`.\n */\n executeTool(name: string, args?: Record<string, unknown>): Promise<ToolResponse>;\n async executeTool(\n toolOrName: ModelContextToolInfo | string,\n inputArgsJsonOrArgs: string | Record<string, unknown> = {}\n ): Promise<string | null | ToolResponse> {\n if (typeof toolOrName === 'string') {\n return this.callTool({\n name: toolOrName,\n arguments:\n typeof inputArgsJsonOrArgs === 'string'\n ? JSON.parse(inputArgsJsonOrArgs)\n : inputArgsJsonOrArgs,\n });\n }\n\n const result = await this.callTool({\n name: toolOrName.name,\n arguments:\n typeof inputArgsJsonOrArgs === 'string'\n ? (JSON.parse(inputArgsJsonOrArgs) as Record<string, unknown>)\n : inputArgsJsonOrArgs,\n });\n const serialized = JSON.stringify(result);\n return serialized === undefined ? null : serialized;\n }\n\n /**\n * Override connect to initialize request handlers BEFORE the transport connection.\n * This prevents \"Cannot register capabilities after connecting to transport\" errors\n * when tools are registered dynamically after connection.\n *\n * Tool handlers are installed with the public low-level Server API in the constructor.\n * Prompt/resource handlers still come from the parent, then prompt handlers are replaced\n * where the parent expects Zod shapes instead of plain JSON Schema.\n */\n override async connect(transport: Transport): Promise<void> {\n (this as unknown as { setResourceRequestHandlers: () => void }).setResourceRequestHandlers();\n (this as unknown as { setPromptRequestHandlers: () => void }).setPromptRequestHandlers();\n\n // Replace ListPrompts handler — parent calls promptArgumentsFromSchema which expects\n // Zod shapes. We use _promptSchemas which has the real JSON Schema.\n this.server.setRequestHandler(ListPromptsRequestSchema, () => ({\n prompts: this.listPrompts(),\n }));\n\n // Replace GetPrompt handler — parent calls safeParseAsync on argsSchema.\n // We validate with the configured SDK validator instead.\n this.server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n const prompt = this._parentPrompts[request.params.name];\n if (!prompt) {\n throw new Error(`Prompt ${request.params.name} not found`);\n }\n if (!prompt.enabled) {\n throw new Error(`Prompt ${request.params.name} disabled`);\n }\n\n const schema = this._promptSchemas.get(request.params.name);\n if (schema) {\n const validator = this._jsonValidator.getValidator(schema);\n const result = validator(request.params.arguments ?? {});\n if (!result.valid) {\n throw new Error(\n `Invalid arguments for prompt ${request.params.name}: ${result.errorMessage}`\n );\n }\n return prompt.callback(request.params.arguments as Record<string, unknown>, {});\n }\n\n return prompt.callback({}, {});\n });\n\n return super.connect(transport);\n }\n\n // --- Sampling & Elicitation (delegated to Server) ---\n\n async createMessage(\n params: CreateMessageRequest['params'],\n options?: RequestOptions\n ): Promise<CreateMessageResult> {\n return this.server.createMessage(params, withDefaultTimeout(options));\n }\n\n async elicitInput(\n params: ElicitRequest['params'],\n options?: RequestOptions\n ): Promise<ElicitResult> {\n return this.server.elicitInput(params, withDefaultTimeout(options));\n }\n}\n\n// --- Exported descriptor types for consumers ---\n\nexport interface ResourceDescriptor {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n read: (uri: URL, params?: Record<string, string>) => Promise<{ contents: ResourceContents[] }>;\n}\n\nexport interface PromptDescriptor {\n name: string;\n description?: string;\n argsSchema?: InputSchema;\n get: (args: Record<string, unknown>) => Promise<{ messages: PromptMessage[] }>;\n}\n","import type {\n JsonSchemaValidatorResult,\n jsonSchemaValidator,\n} from '@modelcontextprotocol/sdk/validation';\n\n/**\n * No-op JSON Schema validator for browser environments.\n *\n * This validator bypasses the MCP SDK's internal ajv-based validation which causes\n * \"Error compiling schema\" errors in browser extensions due to ajv's use of\n * eval/Function constructor.\n *\n * Validation is handled externally by Zod in @mcp-b/global, making the SDK's\n * internal validation redundant. This no-op validator allows the SDK to function\n * without the ajv dependency issues.\n */\n\n/**\n * A no-op JSON Schema validator that always returns valid.\n *\n * Use this in browser environments where:\n * - ajv causes \"Error compiling schema\" errors\n * - Validation is already handled elsewhere (e.g., by Zod)\n * - You need to avoid eval/Function constructor restrictions\n *\n * @example\n * ```typescript\n * import { BrowserMcpServer } from '@mcp-b/webmcp-ts-sdk';\n * import { NoOpJsonSchemaValidator } from '@mcp-b/webmcp-ts-sdk/no-op-validator';\n *\n * const server = new BrowserMcpServer(\n * { name: 'my-server', version: '1.0.0' },\n * { jsonSchemaValidator: new NoOpJsonSchemaValidator() }\n * );\n * ```\n */\nexport class NoOpJsonSchemaValidator implements jsonSchemaValidator {\n /**\n * Returns a validator function that always passes.\n * The input data is passed through unchanged.\n *\n * @param _schema - The JSON Schema (ignored)\n * @returns A validator function that always returns valid\n */\n getValidator<T>(_schema: unknown): (input: unknown) => JsonSchemaValidatorResult<T> {\n return (input: unknown): JsonSchemaValidatorResult<T> => ({\n valid: true,\n data: input as T,\n errorMessage: undefined,\n });\n }\n}\n","import type { InputSchema } from '@mcp-b/webmcp-types';\nimport { normalizeObjectSchema } from '@modelcontextprotocol/sdk/server/zod-compat.js';\nimport { toJsonSchemaCompat } from '@modelcontextprotocol/sdk/server/zod-json-schema-compat.js';\n\nexport const DEFAULT_INPUT_SCHEMA: InputSchema = { type: 'object', properties: {} };\n\nexport interface ToWebMcpJsonSchemaOptions {\n requireObjectType?: boolean;\n}\n\n/**\n * Converts Zod schemas, Zod raw shapes, or plain JSON Schema objects to the\n * JSON Schema shape expected by WebMCP tool descriptors.\n */\nexport function toWebMcpJsonSchema(\n schema: unknown,\n options: ToWebMcpJsonSchemaOptions = {}\n): InputSchema {\n const requireObjectType = options.requireObjectType ?? true;\n\n if (!schema || typeof schema !== 'object') {\n return requireObjectType ? DEFAULT_INPUT_SCHEMA : ({} as InputSchema);\n }\n\n const normalized = normalizeObjectSchema(schema as Parameters<typeof normalizeObjectSchema>[0]);\n const jsonSchema = normalized\n ? (toJsonSchemaCompat(normalized, {\n strictUnions: true,\n pipeStrategy: 'input',\n }) as unknown as Record<string, unknown>)\n : (schema as Record<string, unknown>);\n\n if (Object.keys(jsonSchema).length === 0) {\n return requireObjectType ? DEFAULT_INPUT_SCHEMA : (jsonSchema as InputSchema);\n }\n\n if (requireObjectType && jsonSchema.type === undefined) {\n return { type: 'object', ...jsonSchema } as InputSchema;\n }\n\n return jsonSchema as InputSchema;\n}\n\nexport function toWebMcpInputSchema(schema: unknown): InputSchema {\n return toWebMcpJsonSchema(schema, { requireObjectType: true });\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-b/webmcp-ts-sdk",
3
- "version": "4.0.0",
3
+ "version": "4.1.0-beta.20260702224704",
4
4
  "description": "Browser-adapted MCP TypeScript SDK - Dynamic tool registration for W3C Web Model Context API and AI agent integration",
5
5
  "keywords": [
6
6
  "adapter",
@@ -58,8 +58,8 @@
58
58
  },
59
59
  "dependencies": {
60
60
  "@modelcontextprotocol/sdk": "1.29.0",
61
- "@mcp-b/webmcp-polyfill": "4.0.0",
62
- "@mcp-b/webmcp-types": "4.0.0"
61
+ "@mcp-b/webmcp-polyfill": "4.1.0-beta.20260702224704",
62
+ "@mcp-b/webmcp-types": "4.1.0-beta.20260702224704"
63
63
  },
64
64
  "devDependencies": {
65
65
  "@types/node": "22.17.2",
@@ -67,15 +67,11 @@
67
67
  "vite-plus": "^0.1.22"
68
68
  },
69
69
  "peerDependencies": {
70
- "zod": "^3.25 || ^4.0",
71
- "zod-to-json-schema": "^3.25.0"
70
+ "zod": "^3.25 || ^4.0"
72
71
  },
73
72
  "peerDependenciesMeta": {
74
73
  "zod": {
75
74
  "optional": true
76
- },
77
- "zod-to-json-schema": {
78
- "optional": true
79
75
  }
80
76
  },
81
77
  "engines": {