@mcp-b/webmcp-ts-sdk 2.1.0 → 2.2.0

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/README.md CHANGED
@@ -41,12 +41,18 @@ public registerCapabilities(capabilities: ServerCapabilities): void {
41
41
 
42
42
  For the Web Model Context API, this restriction is incompatible because:
43
43
 
44
- 1. **Tools arrive dynamically** - Web pages call `window.navigator.modelContext.provideContext({ tools: [...] })` at any time
44
+ 1. **Tools arrive dynamically** - Web pages call `window.navigator.modelContext.registerTool(...)` at any time
45
45
  2. **Transport must be ready immediately** - The MCP server/transport needs to be connected when the page loads
46
46
  3. **Asynchronous registration** - Tools are registered as the page's JavaScript executes, potentially long after initialization
47
47
 
48
48
  This package solves the problem by **pre-registering tool capabilities** before the transport connects, allowing dynamic tool registration to work seamlessly.
49
49
 
50
+ Compatibility note:
51
+
52
+ - `BrowserMcpServer.registerTool(...)` still returns a deprecated compatibility handle with `unregister()` so existing MCP-B integrations do not break, even though current Chrome Beta 147 and Chromium `main` return `undefined`.
53
+ - Current Chromium exposes `unregisterTool(name)` as a string-name API.
54
+ - The upstream WebMCP unregistration design is still under discussion, so avoid assuming the current Chromium shape is the final spec outcome.
55
+
50
56
  ## Modifications from Official SDK
51
57
 
52
58
  ### BrowserMcpServer Class
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ import { RequestOptions, RequestOptions as RequestOptions$1, mergeCapabilities }
3
3
  import { ReadBuffer, serializeMessage } from "@modelcontextprotocol/sdk/shared/stdio.js";
4
4
  import { Transport, Transport as Transport$1, TransportSendOptions } from "@modelcontextprotocol/sdk/shared/transport.js";
5
5
  import { CallToolRequest, CallToolRequestSchema, CallToolResult, CallToolResultSchema, ClientCapabilities, ClientNotification, ClientRequest, ClientResult, CreateMessageRequest, CreateMessageRequest as CreateMessageRequest$1, CreateMessageRequestSchema, CreateMessageResult, CreateMessageResult as CreateMessageResult$1, CreateMessageResultSchema, ElicitRequest, ElicitRequest as ElicitRequest$1, ElicitRequestSchema, ElicitResult, ElicitResult as ElicitResult$1, ElicitResultSchema, ErrorCode, GetPromptRequest, GetPromptRequestSchema, GetPromptResult, GetPromptResultSchema, Implementation, Implementation as Implementation$1, InitializeRequest, InitializeRequestSchema, InitializeResult, InitializeResultSchema, JSONRPCMessage, JSONRPCMessageSchema, LATEST_PROTOCOL_VERSION, ListPromptsRequest, ListPromptsRequestSchema, ListPromptsResult, ListPromptsResultSchema, ListResourcesRequest, ListResourcesRequestSchema, ListResourcesResult, ListResourcesResultSchema, ListToolsRequest, ListToolsRequestSchema, ListToolsResult, ListToolsResultSchema, LoggingLevel, LoggingLevelSchema, LoggingMessageNotification, McpError, Notification, Prompt, PromptMessage, PromptMessage as PromptMessage$1, ReadResourceRequest, ReadResourceRequestSchema, ReadResourceResult, ReadResourceResultSchema, Request, Resource, ResourceContents, ResourceListChangedNotificationSchema, ResourceTemplate, Result, SUPPORTED_PROTOCOL_VERSIONS, ServerCapabilities, ServerNotification, ServerRequest, ServerResult, Tool, ToolAnnotations, ToolListChangedNotificationSchema } from "@modelcontextprotocol/sdk/types.js";
6
- import { InputSchema, ModelContextCore, ModelContextOptions, ResourceContents as ResourceContents$1, ToolDescriptor, ToolListItem, ToolResponse } from "@mcp-b/webmcp-types";
6
+ import { InputSchema, ModelContextCore, ModelContextOptions, ModelContextToolReference, ResourceContents as ResourceContents$1, ToolDescriptor, ToolListItem, ToolResponse } from "@mcp-b/webmcp-types";
7
7
  import { ServerOptions } from "@modelcontextprotocol/sdk/server/index.js";
8
8
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
9
9
 
@@ -12,6 +12,9 @@ declare const SERVER_MARKER_PROPERTY: "__isBrowserMcpServer";
12
12
  interface BrowserMcpServerOptions extends ServerOptions {
13
13
  native?: ModelContextCore;
14
14
  }
15
+ type RegisteredToolHandle = {
16
+ unregister: () => void;
17
+ };
15
18
  /**
16
19
  * Browser-optimized MCP Server that speaks WebMCP natively.
17
20
  *
@@ -29,6 +32,8 @@ declare class BrowserMcpServer extends McpServer {
29
32
  private _promptSchemas;
30
33
  private _jsonValidator;
31
34
  private _publicMethodsBound;
35
+ private _provideContextDeprecationWarned;
36
+ private _clearContextDeprecationWarned;
32
37
  constructor(serverInfo: Implementation$1, options?: BrowserMcpServerOptions);
33
38
  /**
34
39
  * navigator.modelContext consumers may destructure methods (e.g. const { registerTool } = ...).
@@ -50,15 +55,14 @@ declare class BrowserMcpServer extends McpServer {
50
55
  private getNativeToolsApi;
51
56
  private registerToolInServer;
52
57
  backfillTools(tools: readonly ToolListItem[], execute: (name: string, args: Record<string, unknown>) => Promise<ToolResponse>): number;
53
- registerTool(tool: ToolDescriptor): {
54
- unregister: () => void;
55
- };
58
+ registerTool(tool: ToolDescriptor): RegisteredToolHandle;
56
59
  /**
57
60
  * Backfill tools that were already registered on the native/polyfill context
58
61
  * before this BrowserMcpServer wrapper was installed.
59
62
  */
60
63
  syncNativeTools(): number;
61
- unregisterTool(name: string): void;
64
+ unregisterTool(nameOrTool: string | ModelContextToolReference): void;
65
+ private clearRegisteredTools;
62
66
  registerResource(descriptor: {
63
67
  uri: string;
64
68
  name: string;
@@ -82,6 +86,9 @@ declare class BrowserMcpServer extends McpServer {
82
86
  };
83
87
  provideContext(options?: ModelContextOptions): void;
84
88
  clearContext(): void;
89
+ private resolveToolNameForUnregister;
90
+ private warnProvideContextDeprecationOnce;
91
+ private warnClearContextDeprecationOnce;
85
92
  listResources(): Array<{
86
93
  uri: string;
87
94
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/browser-server.ts","../src/no-op-validator.ts","../src/polyfill-validator.ts","../src/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;cAyCa;UAyGI,uBAAA,SAAgC;WACtC;;AA1GX;AAyGA;AAoCA;;;;;;;;;AAyPgB,cAzPH,gBAAA,SAAyB,SAAA,CAyPtB;EAAc,UAxPlB,sBAAA,CAwPkB,EAAA,IAAA;EAA+C,QAAA,MAAA;EAApB,QAAA,cAAA;EAuBxC,QAAA,cAAA;EACD,QAAA,mBAAA;EAAgD,WAAA,CAAA,UAAA,EAzQtC,gBAyQsC,EAAA,OAAA,CAAA,EAzQZ,uBAyQY;EAApB;;;;EAuET,QAAA,oBAAA;EAYnB,YAAA,YAAA,CAAA;EAHC,YAAA,gBAAA,CAAA;EA6BP,YAAA,cAAA,CAAA;EACe;;;;;;;EA2GT,QAAA,iBAAA;EACF,QAAA,WAAA;EAAR,QAAA,iBAAA;EASkC,QAAA,oBAAA;EAAuC,aAAA,CAAA,KAAA,EAAA,SAxV3D,YAwV2D,EAAA,EAAA,OAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAvV7C,MAuV6C,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,GAvVjB,OAuViB,CAvVT,YAuVS,CAAA,CAAA,EAAA,MAAA;EAAR,YAAA,CAAA,IAAA,EAtTzC,cAsTyC,CAAA,EAAA;IAYnC,UAAA,EAAA,GAAA,GAAA,IAAA;EAAY,CAAA;EAkDpC;;;;EAOA,eAAA,CAAA,CAAA,EAAA,MAAA;EACE,cAAA,CAAA,IAAA,EAAA,MAAA,CAAA,EAAA,IAAA;EACD,gBAAA,CAAA,UAAA,EAAA;IAAR,GAAA,EAAA,MAAA;IA3jBiC,IAAA,EAAA,MAAA;IAAa,WAAA,CAAA,EAAA,MAAA;IAkkBlC,QAAA,CAAA,EAAA,MAAkB;IAKrB,IAAA,EAAA,CAAA,GAAA,EA9UE,GA8UF,EAAA,MAAA,CAAA,EA9UgB,MA8UhB,CAAA,MAAA,EAAA,MAAA,CAAA,EAAA,GA9U2C,OA8U3C,CAAA;MAAc,QAAA,EA9UiD,kBA8UjD,EAAA;IAA+C,CAAA,CAAA;EAApB,CAAA,CAAA,EAAA;IAAO,UAAA,EAAA,GAAA,GAAA,IAAA;EAG7C,CAAA;EAGF,cAAA,CAAA,UAAA,EAAA;IACD,IAAA,EAAA,MAAA;IAAgD,WAAA,CAAA,EAAA,MAAA;IAApB,UAAA,CAAA,EA9TzB,WA8TyB;IAAO,GAAA,EAAA,CAAA,IAAA,EA7TjC,MA6TiC,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,GA7TL,OA6TK,CAAA;gBA7Te;;;ICvbtD,UAAA,EAAA,GAAA,GAAA,IAAmB;EAOxB,CAAA;EAuBQ,cAAA,CAAA,OAAwB,CAAxB,EDobc,mBCpbU,CAAA,EAAA,IAAA;EAQ8C,YAAA,CAAA,CAAA,EAAA,IAAA;EAA1B,aAAA,CAAA,CAAA,EDyctC,KCzcsC,CAAA;IART,GAAA,EAAA,MAAA;IAAmB,IAAA,EAAA,MAAA;;;;EC3CzD,YAAA,CAAA,GAAA,EAAA,MAAmB,CAAA,EF2gBM,OE3gBN,CACqD;IAG7E,QAAA,EFugBkD,kBEvgBzB,EAAA;EAIjB,CAAA,CAAA;EACqE,WAAA,CAAA,CAAA,EF2gBjE,KE3gBiE,CAAA;IAA1B,IAAA,EAAA,MAAA;IADJ,WAAA,CAAA,EAAA,MAAA;IAAmB,SAAA,CAAA,EF+gBvD,KE/gBuD,CAAA;;;;ICyF3D,CAAA,CAAA;EACA,CAAA,CAAA;iCH+cF,0BACL;cAAoB;;eAkBV;;;;;;;WAsBL,wDAEL,QAAQ;;;;;;yCAiCR;;;gBAgCW;MACV,QAAQ;mCAS0B,0BAA+B,QAAQ;;;;;;;;;qBAY3C,cAAY;wBAkDpC,4CACE,mBACT,QAAQ;sBAKD,qCACE,mBACT,QAAQ;;UAOI,kBAAA;;;;;cAKH,cAAc,2BAA2B;cAAoB;;;UAG1D,gBAAA;;;eAGF;cACD,4BAA4B;cAAoB;;;;;;;;;;;;;;;AA3tB9D;AAyGA;AAoCA;;;UCtKU,qBAAA,CD8K0C;EAoJhC,YAAA,CAAA,CAAA,CAAA,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,GCjUoC,2BDiUpC,CCjU8D,CDiU9D,CAAA;;;;;KC3Tf,2BDwZW,CAAA,CAAA,CAAA,GAAA;EAAc,KAAA,EAAA,IAAA;EAA+C,IAAA,ECvZpD,CDuZoD;EAApB,YAAA,EAAA,SAAA;CAuBxC,GAAA;EACD,KAAA,EAAA,KAAA;EAAgD,IAAA,EAAA,SAAA;EAApB,YAAA,EAAA,MAAA;CA2BjB;;;;;;;;;;;;;;;;;;;;AAoNS,cCxoBvB,uBAAA,YAAmC,qBDwoBZ,CAAA;EAAY;;;;;;;EA2DnC,YAAA,CAAA,CAAA,CAAA,CAAA,OAAA,EAAA,OAAA,CAAA,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,GC3rB4C,2BD2rB5C,CC3rBsE,CD2rBtE,CAAA;;;;UE9uBH,mBAAA;wDAC8C,0BAA0B;;KAG7E;;QACoB;;;;;EFiCZ,YAAA,EAAA,MAAA;AAyGb,CAAA;AAoCa,cE3KA,2BAAA,YAAuC,mBF2KtB,CAAA;EAClB,YAAA,CAAA,CAAA,CAAA,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,GE3K4C,yBF2K5C,CE3KsE,CF2KtE,CAAA;;;;AArCK,KG9CL,qBAAA,GAAwB,sBH+CzB,CAAA,QADsC,CAAA;AAoCpC,KGjFD,cAAA,GAAiB,qBHiFC"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/browser-server.ts","../src/no-op-validator.ts","../src/polyfill-validator.ts","../src/index.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -4390,6 +4390,8 @@ var BrowserMcpServer = class extends McpServer {
4390
4390
  _promptSchemas = /* @__PURE__ */ new Map();
4391
4391
  _jsonValidator;
4392
4392
  _publicMethodsBound = false;
4393
+ _provideContextDeprecationWarned = false;
4394
+ _clearContextDeprecationWarned = false;
4393
4395
  constructor(serverInfo, options) {
4394
4396
  const validator = new PolyfillJsonSchemaValidator();
4395
4397
  const enhancedOptions = {
@@ -4533,10 +4535,14 @@ var BrowserMcpServer = class extends McpServer {
4533
4535
  arguments: args
4534
4536
  }));
4535
4537
  }
4536
- unregisterTool(name) {
4538
+ unregisterTool(nameOrTool) {
4539
+ const name = this.resolveToolNameForUnregister(nameOrTool);
4537
4540
  this._parentTools[name]?.remove();
4538
4541
  if (this.native) this.native.unregisterTool(name);
4539
4542
  }
4543
+ clearRegisteredTools() {
4544
+ for (const name of Object.keys(this._parentTools)) this.unregisterTool(name);
4545
+ }
4540
4546
  registerResource(descriptor) {
4541
4547
  const registered = super.registerResource(descriptor.name, descriptor.uri, {
4542
4548
  ...descriptor.description !== void 0 && { description: descriptor.description },
@@ -4553,13 +4559,28 @@ var BrowserMcpServer = class extends McpServer {
4553
4559
  } };
4554
4560
  }
4555
4561
  provideContext(options) {
4556
- for (const tool of Object.values(this._parentTools)) tool.remove();
4557
- if (this.native) this.native.clearContext();
4562
+ this.warnProvideContextDeprecationOnce();
4563
+ this.clearRegisteredTools();
4558
4564
  for (const tool of options?.tools ?? []) this.registerTool(tool);
4559
4565
  }
4560
4566
  clearContext() {
4561
- for (const tool of Object.values(this._parentTools)) tool.remove();
4562
- if (this.native) this.native.clearContext();
4567
+ this.warnClearContextDeprecationOnce();
4568
+ this.clearRegisteredTools();
4569
+ }
4570
+ resolveToolNameForUnregister(nameOrTool) {
4571
+ if (typeof nameOrTool === "string") return nameOrTool;
4572
+ if (isPlainObject$1(nameOrTool) && typeof nameOrTool.name === "string") return nameOrTool.name;
4573
+ throw new TypeError("Failed to execute 'unregisterTool' on 'ModelContext': parameter 1 must be a string or an object with a string name.");
4574
+ }
4575
+ warnProvideContextDeprecationOnce() {
4576
+ if (this._provideContextDeprecationWarned) return;
4577
+ this._provideContextDeprecationWarned = true;
4578
+ console.warn("[BrowserMcpServer] navigator.modelContext.provideContext() is deprecated and will be removed in the next major version. Register tools individually with registerTool() instead.");
4579
+ }
4580
+ warnClearContextDeprecationOnce() {
4581
+ if (this._clearContextDeprecationWarned) return;
4582
+ this._clearContextDeprecationWarned = true;
4583
+ console.warn("[BrowserMcpServer] navigator.modelContext.clearContext() is deprecated and will be removed in the next major version. Unregister individual tools instead.");
4563
4584
  }
4564
4585
  listResources() {
4565
4586
  return Object.entries(this._parentResources).filter(([, resource]) => resource.enabled).map(([uri, resource]) => ({