@mcp-fe/mcp-worker 0.1.9 → 0.1.11

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/index.js CHANGED
@@ -26,6 +26,188 @@ var logger = {
26
26
  }
27
27
  };
28
28
 
29
+ // libs/mcp-worker/src/client/tool-registry.ts
30
+ var ToolRegistry = class {
31
+ // Map to store tool handlers in main thread
32
+ toolHandlers = /* @__PURE__ */ new Map();
33
+ // Tool registry for tracking registrations and reference counting
34
+ toolRegistry = /* @__PURE__ */ new Map();
35
+ // Subscribers for tool changes (for React hooks reactivity)
36
+ toolChangeListeners = /* @__PURE__ */ new Map();
37
+ /**
38
+ * Register a tool with handler (or increment ref count if already exists)
39
+ *
40
+ * @param name - Tool name
41
+ * @param description - Tool description
42
+ * @param inputSchema - JSON Schema for tool inputs
43
+ * @param handler - Async function that handles the tool execution
44
+ * @param options - Additional tool options
45
+ * @returns true if newly registered, false if ref count incremented
46
+ */
47
+ register(name, description, inputSchema, handler, options) {
48
+ const existing = this.toolRegistry.get(name);
49
+ if (existing) {
50
+ existing.refCount++;
51
+ logger.log(
52
+ `[ToolRegistry] Incremented ref count for '${name}': ${existing.refCount}`
53
+ );
54
+ this.toolHandlers.set(name, handler);
55
+ this.notifyToolChange(name);
56
+ return false;
57
+ }
58
+ this.toolHandlers.set(name, handler);
59
+ this.toolRegistry.set(name, {
60
+ name,
61
+ description,
62
+ inputSchema,
63
+ outputSchema: options?.outputSchema,
64
+ annotations: options?.annotations,
65
+ execution: options?.execution,
66
+ _meta: options?._meta,
67
+ icons: options?.icons,
68
+ title: options?.title,
69
+ refCount: 1,
70
+ isRegistered: true
71
+ });
72
+ logger.log(`[ToolRegistry] Registered tool '${name}'`);
73
+ this.notifyToolChange(name);
74
+ return true;
75
+ }
76
+ /**
77
+ * Unregister a tool (decrement ref count, remove if count reaches 0)
78
+ *
79
+ * @param name - Tool name to unregister
80
+ * @returns true if tool was removed (ref count reached 0), false if ref count decremented, null if not found
81
+ */
82
+ unregister(name) {
83
+ const existing = this.toolRegistry.get(name);
84
+ if (!existing) {
85
+ logger.warn(`[ToolRegistry] Cannot unregister '${name}': not found`);
86
+ return null;
87
+ }
88
+ existing.refCount--;
89
+ logger.log(
90
+ `[ToolRegistry] Decremented ref count for '${name}': ${existing.refCount}`
91
+ );
92
+ if (existing.refCount <= 0) {
93
+ this.toolHandlers.delete(name);
94
+ this.toolRegistry.delete(name);
95
+ logger.log(`[ToolRegistry] Removed tool '${name}' from registry`);
96
+ this.notifyToolChange(name);
97
+ return true;
98
+ }
99
+ this.notifyToolChange(name);
100
+ return false;
101
+ }
102
+ /**
103
+ * Get tool handler function
104
+ */
105
+ getHandler(name) {
106
+ return this.toolHandlers.get(name);
107
+ }
108
+ /**
109
+ * Get tool info (ref count and registration status)
110
+ */
111
+ getInfo(name) {
112
+ const info = this.toolRegistry.get(name);
113
+ if (!info)
114
+ return null;
115
+ return {
116
+ refCount: info.refCount,
117
+ isRegistered: info.isRegistered
118
+ };
119
+ }
120
+ /**
121
+ * Get complete tool details
122
+ */
123
+ getDetails(name) {
124
+ return this.toolRegistry.get(name) ?? null;
125
+ }
126
+ /**
127
+ * Get all registered tool names
128
+ */
129
+ getRegisteredTools() {
130
+ return Array.from(this.toolRegistry.keys()).filter(
131
+ (name) => this.toolRegistry.get(name)?.isRegistered
132
+ );
133
+ }
134
+ /**
135
+ * Check if a tool is registered
136
+ */
137
+ isRegistered(name) {
138
+ return this.toolRegistry.get(name)?.isRegistered ?? false;
139
+ }
140
+ /**
141
+ * Subscribe to tool changes for a specific tool
142
+ * Returns unsubscribe function
143
+ */
144
+ onToolChange(toolName, callback) {
145
+ if (!this.toolChangeListeners.has(toolName)) {
146
+ this.toolChangeListeners.set(toolName, /* @__PURE__ */ new Set());
147
+ }
148
+ const listeners = this.toolChangeListeners.get(toolName);
149
+ listeners.add(callback);
150
+ try {
151
+ const current = this.toolRegistry.get(toolName);
152
+ if (current) {
153
+ callback({
154
+ refCount: current.refCount,
155
+ isRegistered: current.isRegistered
156
+ });
157
+ } else {
158
+ callback(null);
159
+ }
160
+ } catch (error) {
161
+ logger.error(
162
+ "[ToolRegistry] Error in tool change listener (initial call):",
163
+ error
164
+ );
165
+ }
166
+ return () => {
167
+ listeners.delete(callback);
168
+ if (listeners.size === 0) {
169
+ this.toolChangeListeners.delete(toolName);
170
+ }
171
+ };
172
+ }
173
+ /**
174
+ * Notify all listeners about tool changes
175
+ * @private
176
+ */
177
+ notifyToolChange(toolName) {
178
+ const listeners = this.toolChangeListeners.get(toolName);
179
+ if (!listeners || listeners.size === 0)
180
+ return;
181
+ const info = this.toolRegistry.get(toolName);
182
+ const payload = info ? {
183
+ refCount: info.refCount,
184
+ isRegistered: info.isRegistered
185
+ } : null;
186
+ listeners.forEach((callback) => {
187
+ try {
188
+ callback(payload);
189
+ } catch (error) {
190
+ logger.error("[ToolRegistry] Error in tool change listener:", error);
191
+ }
192
+ });
193
+ }
194
+ /**
195
+ * Clear all tools (useful for cleanup/testing)
196
+ */
197
+ clear() {
198
+ this.toolHandlers.clear();
199
+ this.toolRegistry.clear();
200
+ this.toolChangeListeners.clear();
201
+ logger.log("[ToolRegistry] Cleared all tools");
202
+ }
203
+ /**
204
+ * Get all tool names (including those with refCount > 0)
205
+ */
206
+ getAllToolNames() {
207
+ return Array.from(this.toolRegistry.keys());
208
+ }
209
+ };
210
+
29
211
  // libs/mcp-worker/src/client/worker-client.ts
30
212
  var WorkerClient = class _WorkerClient {
31
213
  // Configurable worker script URLs (defaults kept for backward compatibility)
@@ -45,14 +227,8 @@ var WorkerClient = class _WorkerClient {
45
227
  // Initialization state
46
228
  isInitialized = false;
47
229
  initResolvers = [];
48
- // Queue for operations that need to wait for initialization
49
- pendingRegistrations = [];
50
- // Map to store tool handlers in main thread
51
- toolHandlers = /* @__PURE__ */ new Map();
52
- // Tool registry for tracking registrations and reference counting
53
- toolRegistry = /* @__PURE__ */ new Map();
54
- // Subscribers for tool changes (for React hooks reactivity)
55
- toolChangeListeners = /* @__PURE__ */ new Map();
230
+ // Tool registry for managing tool lifecycle
231
+ toolRegistry = new ToolRegistry();
56
232
  // Tab tracking for multi-tab support
57
233
  tabId;
58
234
  static TAB_ID_STORAGE_KEY = "mcp_fe_tab_id";
@@ -156,7 +332,7 @@ var WorkerClient = class _WorkerClient {
156
332
  * @private
157
333
  */
158
334
  cleanupAllTools() {
159
- const toolNames = Array.from(this.toolRegistry.keys());
335
+ const toolNames = this.toolRegistry.getAllToolNames();
160
336
  if (toolNames.length === 0) {
161
337
  return;
162
338
  }
@@ -164,18 +340,18 @@ var WorkerClient = class _WorkerClient {
164
340
  `[WorkerClient] Page unloading, cleaning up ${toolNames.length} tool(s)`
165
341
  );
166
342
  toolNames.forEach((toolName) => {
167
- const existing = this.toolRegistry.get(toolName);
343
+ const existing = this.toolRegistry.getInfo(toolName);
168
344
  if (!existing)
169
345
  return;
170
- existing.refCount = 1;
171
346
  try {
172
347
  this.post("UNREGISTER_TOOL", {
173
348
  name: toolName,
174
349
  tabId: this.tabId
175
350
  }).catch(() => {
176
351
  });
177
- this.toolHandlers.delete(toolName);
178
- this.toolRegistry.delete(toolName);
352
+ while (this.toolRegistry.isRegistered(toolName)) {
353
+ this.toolRegistry.unregister(toolName);
354
+ }
179
355
  } catch (error) {
180
356
  logger.warn(
181
357
  `[WorkerClient] Failed to unregister '${toolName}' during cleanup:`,
@@ -253,43 +429,57 @@ var WorkerClient = class _WorkerClient {
253
429
  return this.initPromise;
254
430
  }
255
431
  /**
256
- * Mark worker as initialized and process pending registrations
432
+ * Mark worker as initialized and sync all registered tools to worker
257
433
  * @private
258
434
  */
259
435
  markAsInitialized() {
260
436
  this.isInitialized = true;
261
- logger.log(
262
- "[WorkerClient] Worker initialized, processing pending operations"
263
- );
437
+ logger.log("[WorkerClient] Worker initialized, syncing tools to worker");
264
438
  this.registerTab();
265
439
  this.setActiveTab();
266
440
  this.initResolvers.forEach((resolve) => resolve());
267
441
  this.initResolvers = [];
268
- const pending = [...this.pendingRegistrations];
269
- this.pendingRegistrations = [];
270
- pending.forEach(
271
- async ({
272
- name,
273
- description,
274
- inputSchema,
275
- handler,
276
- options,
277
- resolve,
278
- reject
279
- }) => {
442
+ this.syncToolsToWorker().catch((error) => {
443
+ logger.error("[WorkerClient] Error syncing tools to worker:", error);
444
+ });
445
+ }
446
+ /**
447
+ * Synchronize all locally registered tools to worker
448
+ * @private
449
+ */
450
+ async syncToolsToWorker() {
451
+ const toolNames = this.toolRegistry.getRegisteredTools();
452
+ if (toolNames.length === 0) {
453
+ logger.log("[WorkerClient] No tools to sync");
454
+ return;
455
+ }
456
+ logger.log(`[WorkerClient] Syncing ${toolNames.length} tool(s) to worker`);
457
+ await Promise.all(
458
+ toolNames.map(async (toolName) => {
459
+ const details = this.toolRegistry.getDetails(toolName);
460
+ if (!details)
461
+ return;
280
462
  try {
281
- await this.registerToolInternal(
282
- name,
283
- description,
284
- inputSchema,
285
- handler,
286
- options
463
+ await this.registerToolInWorker(
464
+ details.name,
465
+ details.description,
466
+ details.inputSchema,
467
+ {
468
+ outputSchema: details.outputSchema,
469
+ annotations: details.annotations,
470
+ execution: details.execution,
471
+ _meta: details._meta,
472
+ icons: details.icons,
473
+ title: details.title
474
+ }
287
475
  );
288
- resolve();
289
476
  } catch (error) {
290
- reject(error instanceof Error ? error : new Error(String(error)));
477
+ logger.error(
478
+ `[WorkerClient] Failed to sync tool '${toolName}' to worker:`,
479
+ error
480
+ );
291
481
  }
292
- }
482
+ })
293
483
  );
294
484
  }
295
485
  /**
@@ -798,29 +988,22 @@ var WorkerClient = class _WorkerClient {
798
988
  * ```
799
989
  */
800
990
  async registerTool(name, description, inputSchema, handler, options) {
801
- if (!this.isInitialized) {
802
- logger.log(
803
- `[WorkerClient] Queueing tool registration '${name}' (worker not initialized yet)`
804
- );
805
- return new Promise((resolve, reject) => {
806
- this.pendingRegistrations.push({
807
- name,
808
- description,
809
- inputSchema,
810
- handler,
811
- options,
812
- resolve,
813
- reject
814
- });
815
- });
816
- }
817
- return this.registerToolInternal(
991
+ const isNew = this.toolRegistry.register(
818
992
  name,
819
993
  description,
820
994
  inputSchema,
821
995
  handler,
822
996
  options
823
997
  );
998
+ if (!this.isInitialized) {
999
+ logger.log(
1000
+ `[WorkerClient] Registered '${name}' locally (will sync to worker after init)`
1001
+ );
1002
+ return;
1003
+ }
1004
+ if (isNew) {
1005
+ await this.registerToolInWorker(name, description, inputSchema, options);
1006
+ }
824
1007
  }
825
1008
  /**
826
1009
  * Enhance tool input schema with optional tabId parameter for multi-tab support
@@ -838,21 +1021,10 @@ var WorkerClient = class _WorkerClient {
838
1021
  return enhanced;
839
1022
  }
840
1023
  /**
841
- * Internal method to register tool (assumes worker is initialized)
1024
+ * Register tool in worker only (assumes already registered in ToolRegistry)
842
1025
  * @private
843
1026
  */
844
- async registerToolInternal(name, description, inputSchema, handler, options) {
845
- const existing = this.toolRegistry.get(name);
846
- if (existing) {
847
- existing.refCount++;
848
- logger.log(
849
- `[WorkerClient] Incremented ref count for '${name}': ${existing.refCount}`
850
- );
851
- this.toolHandlers.set(name, handler);
852
- this.notifyToolChange(name);
853
- return;
854
- }
855
- this.toolHandlers.set(name, handler);
1027
+ async registerToolInWorker(name, description, inputSchema, options) {
856
1028
  const enhancedSchema = this.enhanceSchemaWithTabId(inputSchema);
857
1029
  await this.request("REGISTER_TOOL", {
858
1030
  name,
@@ -869,23 +1041,9 @@ var WorkerClient = class _WorkerClient {
869
1041
  tabId: this.tabId
870
1042
  // Tell worker which tab registered this
871
1043
  });
872
- this.toolRegistry.set(name, {
873
- name,
874
- description,
875
- inputSchema: enhancedSchema,
876
- outputSchema: options?.outputSchema,
877
- annotations: options?.annotations,
878
- execution: options?.execution,
879
- _meta: options?._meta,
880
- icons: options?.icons,
881
- title: options?.title,
882
- refCount: 1,
883
- isRegistered: true
884
- });
885
1044
  logger.log(
886
1045
  `[WorkerClient] Registered tool '${name}' with main-thread handler`
887
1046
  );
888
- this.notifyToolChange(name);
889
1047
  }
890
1048
  /**
891
1049
  * Unregister a previously registered MCP tool
@@ -893,27 +1051,18 @@ var WorkerClient = class _WorkerClient {
893
1051
  * @returns Promise that resolves to true if tool was found and removed
894
1052
  */
895
1053
  async unregisterTool(name) {
896
- const existing = this.toolRegistry.get(name);
897
- if (!existing) {
898
- logger.warn(`[WorkerClient] Cannot unregister '${name}': not found`);
1054
+ const result = this.toolRegistry.unregister(name);
1055
+ if (result === null) {
899
1056
  return false;
900
1057
  }
901
- existing.refCount--;
902
- logger.log(
903
- `[WorkerClient] Decremented ref count for '${name}': ${existing.refCount}`
904
- );
905
- if (existing.refCount <= 0) {
906
- this.toolHandlers.delete(name);
907
- const result = await this.request(
1058
+ if (result) {
1059
+ const workerResult = await this.request(
908
1060
  "UNREGISTER_TOOL",
909
1061
  { name, tabId: this.tabId }
910
1062
  );
911
- this.toolRegistry.delete(name);
912
1063
  logger.log(`[WorkerClient] Unregistered tool '${name}'`);
913
- this.notifyToolChange(name);
914
- return result?.success ?? false;
1064
+ return workerResult?.success ?? false;
915
1065
  }
916
- this.notifyToolChange(name);
917
1066
  return true;
918
1067
  }
919
1068
  /**
@@ -921,82 +1070,31 @@ var WorkerClient = class _WorkerClient {
921
1070
  * Returns unsubscribe function
922
1071
  */
923
1072
  onToolChange(toolName, callback) {
924
- if (!this.toolChangeListeners.has(toolName)) {
925
- this.toolChangeListeners.set(toolName, /* @__PURE__ */ new Set());
926
- }
927
- const listeners = this.toolChangeListeners.get(toolName);
928
- listeners.add(callback);
929
- const current = this.toolRegistry.get(toolName);
930
- if (current) {
931
- callback({
932
- refCount: current.refCount,
933
- isRegistered: current.isRegistered
934
- });
935
- } else {
936
- callback(null);
937
- }
938
- return () => {
939
- listeners.delete(callback);
940
- if (listeners.size === 0) {
941
- this.toolChangeListeners.delete(toolName);
942
- }
943
- };
944
- }
945
- /**
946
- * Notify all listeners about tool changes
947
- * @private
948
- */
949
- notifyToolChange(toolName) {
950
- const listeners = this.toolChangeListeners.get(toolName);
951
- if (!listeners || listeners.size === 0)
952
- return;
953
- const info = this.toolRegistry.get(toolName);
954
- const payload = info ? {
955
- refCount: info.refCount,
956
- isRegistered: info.isRegistered
957
- } : null;
958
- listeners.forEach((callback) => {
959
- try {
960
- callback(payload);
961
- } catch (error) {
962
- logger.error("[WorkerClient] Error in tool change listener:", error);
963
- }
964
- });
1073
+ return this.toolRegistry.onToolChange(toolName, callback);
965
1074
  }
966
1075
  /**
967
1076
  * Get tool info from registry
968
1077
  */
969
1078
  getToolInfo(toolName) {
970
- const info = this.toolRegistry.get(toolName);
971
- if (!info)
972
- return null;
973
- return {
974
- refCount: info.refCount,
975
- isRegistered: info.isRegistered
976
- };
1079
+ return this.toolRegistry.getInfo(toolName);
977
1080
  }
978
1081
  /**
979
1082
  * Get complete tool details from registry
980
1083
  */
981
1084
  getToolDetails(toolName) {
982
- const info = this.toolRegistry.get(toolName);
983
- if (!info)
984
- return null;
985
- return info;
1085
+ return this.toolRegistry.getDetails(toolName);
986
1086
  }
987
1087
  /**
988
1088
  * Get all registered tool names
989
1089
  */
990
1090
  getRegisteredTools() {
991
- return Array.from(this.toolRegistry.keys()).filter(
992
- (name) => this.toolRegistry.get(name)?.isRegistered
993
- );
1091
+ return this.toolRegistry.getRegisteredTools();
994
1092
  }
995
1093
  /**
996
1094
  * Check if a tool is registered
997
1095
  */
998
1096
  isToolRegistered(toolName) {
999
- return this.toolRegistry.get(toolName)?.isRegistered ?? false;
1097
+ return this.toolRegistry.isRegistered(toolName);
1000
1098
  }
1001
1099
  /**
1002
1100
  * Handle tool call from worker - execute handler in main thread and return result
@@ -1008,7 +1106,7 @@ var WorkerClient = class _WorkerClient {
1008
1106
  args
1009
1107
  });
1010
1108
  try {
1011
- const handler = this.toolHandlers.get(toolName);
1109
+ const handler = this.toolRegistry.getHandler(toolName);
1012
1110
  if (!handler) {
1013
1111
  throw new Error(`Tool handler not found: ${toolName}`);
1014
1112
  }
@@ -20933,6 +20933,14 @@ function createMCPServer(options = {}) {
20933
20933
  );
20934
20934
  return server;
20935
20935
  }
20936
+ function notifyToolsChanged(server) {
20937
+ try {
20938
+ server.notification({
20939
+ method: "notifications/tools/list_changed"
20940
+ });
20941
+ } catch {
20942
+ }
20943
+ }
20936
20944
  var mcpServer = createMCPServer();
20937
20945
 
20938
20946
  // libs/mcp-worker/src/worker/websocket-transport.ts
@@ -21579,6 +21587,7 @@ var MCPController = class _MCPController {
21579
21587
  logger.log(
21580
21588
  `[MCPController] Registered proxy tool: ${name} with smart multi-tab routing`
21581
21589
  );
21590
+ notifyToolsChanged(mcpServer);
21582
21591
  }
21583
21592
  }
21584
21593
  handleToolCallResult(callId, result) {
@@ -21652,6 +21661,7 @@ var MCPController = class _MCPController {
21652
21661
  logger.log(
21653
21662
  `[MCPController] Unregistered tool from MCP: ${toolName} (no tabs remaining)`
21654
21663
  );
21664
+ notifyToolsChanged(mcpServer);
21655
21665
  }
21656
21666
  return success2;
21657
21667
  }
@@ -20933,6 +20933,14 @@ function createMCPServer(options = {}) {
20933
20933
  );
20934
20934
  return server;
20935
20935
  }
20936
+ function notifyToolsChanged(server) {
20937
+ try {
20938
+ server.notification({
20939
+ method: "notifications/tools/list_changed"
20940
+ });
20941
+ } catch {
20942
+ }
20943
+ }
20936
20944
  var mcpServer = createMCPServer();
20937
20945
 
20938
20946
  // libs/mcp-worker/src/worker/websocket-transport.ts
@@ -21579,6 +21587,7 @@ var MCPController = class _MCPController {
21579
21587
  logger.log(
21580
21588
  `[MCPController] Registered proxy tool: ${name} with smart multi-tab routing`
21581
21589
  );
21590
+ notifyToolsChanged(mcpServer);
21582
21591
  }
21583
21592
  }
21584
21593
  handleToolCallResult(callId, result) {
@@ -21652,6 +21661,7 @@ var MCPController = class _MCPController {
21652
21661
  logger.log(
21653
21662
  `[MCPController] Unregistered tool from MCP: ${toolName} (no tabs remaining)`
21654
21663
  );
21664
+ notifyToolsChanged(mcpServer);
21655
21665
  }
21656
21666
  return success2;
21657
21667
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-fe/mcp-worker",
3
- "version": "0.1.9",
3
+ "version": "0.1.11",
4
4
  "license": "Apache-2.0",
5
5
  "homepage": "https://mcp-fe.ai",
6
6
  "repository": {
@@ -11,7 +11,7 @@
11
11
  "private": false,
12
12
  "type": "module",
13
13
  "main": "./index.js",
14
- "types": "./index.d.ts",
14
+ "types": "./src/index.d.ts",
15
15
  "dependencies": {},
16
16
  "publishConfig": {
17
17
  "access": "public"
@@ -0,0 +1,117 @@
1
+ /**
2
+ * ToolRegistry — manages registration, reference counting, and lifecycle of MCP tools.
3
+ *
4
+ * Responsibilities:
5
+ * - Track registered tools with reference counting for proper cleanup
6
+ * - Store tool handlers (functions that execute in main thread)
7
+ * - Manage tool change subscriptions for reactive updates
8
+ * - Provide query methods for tool state
9
+ *
10
+ * Public API:
11
+ * - register(tool, handler): Register a tool and increment ref count
12
+ * - unregister(name): Decrement ref count and optionally remove tool
13
+ * - getHandler(name): Get tool handler function
14
+ * - getInfo(name): Get tool metadata (refCount, isRegistered)
15
+ * - getDetails(name): Get full tool definition
16
+ * - getRegisteredTools(): Get list of all registered tool names
17
+ * - isRegistered(name): Check if tool is registered
18
+ * - onToolChange(name, callback): Subscribe to tool changes
19
+ */
20
+ import type { ToolDefinition } from '../shared/types';
21
+ export type ToolHandler = (args: unknown) => Promise<{
22
+ content: Array<{
23
+ type: string;
24
+ text: string;
25
+ }>;
26
+ }>;
27
+ export type ToolOptions = {
28
+ outputSchema?: Record<string, unknown>;
29
+ annotations?: {
30
+ title?: string;
31
+ readOnlyHint?: boolean;
32
+ destructiveHint?: boolean;
33
+ idempotentHint?: boolean;
34
+ openWorldHint?: boolean;
35
+ };
36
+ execution?: {
37
+ taskSupport?: 'optional' | 'required' | 'forbidden';
38
+ };
39
+ _meta?: Record<string, unknown>;
40
+ icons?: Array<{
41
+ src: string;
42
+ mimeType?: string;
43
+ sizes?: string[];
44
+ theme?: 'light' | 'dark';
45
+ }>;
46
+ title?: string;
47
+ };
48
+ export type ToolInfo = {
49
+ refCount: number;
50
+ isRegistered: boolean;
51
+ };
52
+ export type ToolDetails = ToolDefinition & {
53
+ refCount: number;
54
+ isRegistered: boolean;
55
+ };
56
+ export declare class ToolRegistry {
57
+ private toolHandlers;
58
+ private toolRegistry;
59
+ private toolChangeListeners;
60
+ /**
61
+ * Register a tool with handler (or increment ref count if already exists)
62
+ *
63
+ * @param name - Tool name
64
+ * @param description - Tool description
65
+ * @param inputSchema - JSON Schema for tool inputs
66
+ * @param handler - Async function that handles the tool execution
67
+ * @param options - Additional tool options
68
+ * @returns true if newly registered, false if ref count incremented
69
+ */
70
+ register(name: string, description: string | undefined, inputSchema: Record<string, unknown>, handler: ToolHandler, options?: ToolOptions): boolean;
71
+ /**
72
+ * Unregister a tool (decrement ref count, remove if count reaches 0)
73
+ *
74
+ * @param name - Tool name to unregister
75
+ * @returns true if tool was removed (ref count reached 0), false if ref count decremented, null if not found
76
+ */
77
+ unregister(name: string): boolean | null;
78
+ /**
79
+ * Get tool handler function
80
+ */
81
+ getHandler(name: string): ToolHandler | undefined;
82
+ /**
83
+ * Get tool info (ref count and registration status)
84
+ */
85
+ getInfo(name: string): ToolInfo | null;
86
+ /**
87
+ * Get complete tool details
88
+ */
89
+ getDetails(name: string): ToolDetails | null;
90
+ /**
91
+ * Get all registered tool names
92
+ */
93
+ getRegisteredTools(): string[];
94
+ /**
95
+ * Check if a tool is registered
96
+ */
97
+ isRegistered(name: string): boolean;
98
+ /**
99
+ * Subscribe to tool changes for a specific tool
100
+ * Returns unsubscribe function
101
+ */
102
+ onToolChange(toolName: string, callback: (info: ToolInfo | null) => void): () => void;
103
+ /**
104
+ * Notify all listeners about tool changes
105
+ * @private
106
+ */
107
+ private notifyToolChange;
108
+ /**
109
+ * Clear all tools (useful for cleanup/testing)
110
+ */
111
+ clear(): void;
112
+ /**
113
+ * Get all tool names (including those with refCount > 0)
114
+ */
115
+ getAllToolNames(): string[];
116
+ }
117
+ //# sourceMappingURL=tool-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../../../../../libs/mcp-worker/src/client/tool-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;IACnD,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD,CAAC,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,SAAS,CAAC,EAAE;QACV,WAAW,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;KACrD,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,KAAK,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;KAC1B,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,qBAAa,YAAY;IAEvB,OAAO,CAAC,YAAY,CAAkC;IAGtD,OAAO,CAAC,YAAY,CAAkC;IAGtD,OAAO,CAAC,mBAAmB,CAGvB;IAEJ;;;;;;;;;OASG;IACI,QAAQ,CACb,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO;IA2CV;;;;;OAKG;IACI,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IA8B/C;;OAEG;IACI,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIxD;;OAEG;IACI,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAU7C;;OAEG;IACI,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAInD;;OAEG;IACI,kBAAkB,IAAI,MAAM,EAAE;IAMrC;;OAEG;IACI,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1C;;;OAGG;IACI,YAAY,CACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,GACxC,MAAM,IAAI;IAmCb;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAqBxB;;OAEG;IACI,KAAK,IAAI,IAAI;IAOpB;;OAEG;IACI,eAAe,IAAI,MAAM,EAAE;CAGnC"}
@@ -37,6 +37,7 @@
37
37
  *
38
38
  */
39
39
  import type { ToolDefinition } from '../shared/types';
40
+ import { type ToolHandler, type ToolOptions } from './tool-registry';
40
41
  export type WorkerClientInitOptions = {
41
42
  /** URL to the SharedWorker script (optional) */
42
43
  sharedWorkerUrl?: string;
@@ -58,10 +59,7 @@ export declare class WorkerClient {
58
59
  private initPromise;
59
60
  private isInitialized;
60
61
  private initResolvers;
61
- private pendingRegistrations;
62
- private toolHandlers;
63
62
  private toolRegistry;
64
- private toolChangeListeners;
65
63
  private tabId;
66
64
  private static readonly TAB_ID_STORAGE_KEY;
67
65
  constructor();
@@ -106,10 +104,15 @@ export declare class WorkerClient {
106
104
  private cleanupAllTools;
107
105
  init(registrationOrOptions?: ServiceWorkerRegistration | WorkerClientInitOptions): Promise<void>;
108
106
  /**
109
- * Mark worker as initialized and process pending registrations
107
+ * Mark worker as initialized and sync all registered tools to worker
110
108
  * @private
111
109
  */
112
110
  private markAsInitialized;
111
+ /**
112
+ * Synchronize all locally registered tools to worker
113
+ * @private
114
+ */
115
+ private syncToolsToWorker;
113
116
  /**
114
117
  * Wait for worker initialization
115
118
  * @returns Promise that resolves when worker is initialized
@@ -176,42 +179,17 @@ export declare class WorkerClient {
176
179
  * );
177
180
  * ```
178
181
  */
179
- registerTool(name: string, description: string | undefined, inputSchema: Record<string, unknown>, handler: (args: unknown) => Promise<{
180
- content: Array<{
181
- type: string;
182
- text: string;
183
- }>;
184
- }>, options?: {
185
- outputSchema?: Record<string, unknown>;
186
- annotations?: {
187
- title?: string;
188
- readOnlyHint?: boolean;
189
- destructiveHint?: boolean;
190
- idempotentHint?: boolean;
191
- openWorldHint?: boolean;
192
- };
193
- execution?: {
194
- taskSupport?: 'optional' | 'required' | 'forbidden';
195
- };
196
- _meta?: Record<string, unknown>;
197
- icons?: Array<{
198
- src: string;
199
- mimeType?: string;
200
- sizes?: string[];
201
- theme?: 'light' | 'dark';
202
- }>;
203
- title?: string;
204
- }): Promise<void>;
182
+ registerTool(name: string, description: string | undefined, inputSchema: Record<string, unknown>, handler: ToolHandler, options?: ToolOptions): Promise<void>;
205
183
  /**
206
184
  * Enhance tool input schema with optional tabId parameter for multi-tab support
207
185
  * @private
208
186
  */
209
187
  private enhanceSchemaWithTabId;
210
188
  /**
211
- * Internal method to register tool (assumes worker is initialized)
189
+ * Register tool in worker only (assumes already registered in ToolRegistry)
212
190
  * @private
213
191
  */
214
- private registerToolInternal;
192
+ private registerToolInWorker;
215
193
  /**
216
194
  * Unregister a previously registered MCP tool
217
195
  * @param name - Tool name to unregister
@@ -226,11 +204,6 @@ export declare class WorkerClient {
226
204
  refCount: number;
227
205
  isRegistered: boolean;
228
206
  } | null) => void): () => void;
229
- /**
230
- * Notify all listeners about tool changes
231
- * @private
232
- */
233
- private notifyToolChange;
234
207
  /**
235
208
  * Get tool info from registry
236
209
  */
@@ -1 +1 @@
1
- {"version":3,"file":"worker-client.d.ts","sourceRoot":"","sources":["../../../../../libs/mcp-worker/src/client/worker-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker-client.d.ts","sourceRoot":"","sources":["../../../../../libs/mcp-worker/src/client/worker-client.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-controller.d.ts","sourceRoot":"","sources":["../../../../../libs/mcp-worker/src/worker/mcp-controller.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAc,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAWjD,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;AAGrD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE;QACP,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAChD,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAGD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,cAAc,CAapE;AAED,qBAAa,aAAa;IAmCtB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,WAAW;IAnCrB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,iBAAiB,CAA+C;IACxE,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,sBAAsB,CAAS;IAGvC,OAAO,CAAC,wBAAwB,CAIxB;IAER,OAAO,CAAC,gBAAgB,CAAS;IAGjC,OAAO,CAAC,UAAU,CAAoB;IAGtC,OAAO,CAAC,gBAAgB,CAUpB;gBAGM,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,WAAW,EAChC,WAAW,UAAO;IAOpB;;;OAGG;IACI,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAmB7D;;;OAGG;IACI,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAW9D,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,aAAa;IAOR,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAmIvC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAgClC,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,eAAe,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IAIvE;;;OAGG;IACH,OAAO,CAAC,+BAA+B;IAoB1B,kBAAkB,CAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC;IAoBhB;;;OAGG;YACW,0BAA0B;IAmJjC,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI;IAyD5D,oBAAoB,CAC/B,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC;IA0CZ,mBAAmB,IAAI,OAAO;IAI9B,OAAO,IAAI,IAAI;IAYtB;;;OAGG;WACW,MAAM,CAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,WAAW,EACxB,WAAW,UAAO,GACjB,aAAa;CAGjB"}
1
+ {"version":3,"file":"mcp-controller.d.ts","sourceRoot":"","sources":["../../../../../libs/mcp-worker/src/worker/mcp-controller.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAc,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAWjD,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;AAGrD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE;QACP,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAChD,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAGD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,cAAc,CAapE;AAED,qBAAa,aAAa;IAmCtB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,WAAW;IAnCrB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,iBAAiB,CAA+C;IACxE,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,sBAAsB,CAAS;IAGvC,OAAO,CAAC,wBAAwB,CAIxB;IAER,OAAO,CAAC,gBAAgB,CAAS;IAGjC,OAAO,CAAC,UAAU,CAAoB;IAGtC,OAAO,CAAC,gBAAgB,CAUpB;gBAGM,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,WAAW,EAChC,WAAW,UAAO;IAOpB;;;OAGG;IACI,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAmB7D;;;OAGG;IACI,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAW9D,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,aAAa;IAOR,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAmIvC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAgClC,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,eAAe,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IAIvE;;;OAGG;IACH,OAAO,CAAC,+BAA+B;IAoB1B,kBAAkB,CAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC;IAoBhB;;;OAGG;YACW,0BAA0B;IAsJjC,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI;IAyD5D,oBAAoB,CAC/B,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC;IA6CZ,mBAAmB,IAAI,OAAO;IAI9B,OAAO,IAAI,IAAI;IAYtB;;;OAGG;WACW,MAAM,CAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,WAAW,EACxB,WAAW,UAAO,GACjB,aAAa;CAGjB"}
@@ -14,6 +14,11 @@ export interface MCPServerOptions {
14
14
  * @returns Configured MCP Server instance
15
15
  */
16
16
  export declare function createMCPServer(options?: MCPServerOptions): Server;
17
+ /**
18
+ * Send tools/list_changed notification to MCP client
19
+ * Call this whenever tools are added or removed from the registry
20
+ */
21
+ export declare function notifyToolsChanged(server: Server): void;
17
22
  export declare const mcpServer: Server<{
18
23
  method: string;
19
24
  params?: {
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../../../../libs/mcp-worker/src/worker/mcp-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAQnE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAgDtE;AAGD,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAoB,CAAC"}
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../../../../libs/mcp-worker/src/worker/mcp-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAQnE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAgDtE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAQvD;AAGD,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAoB,CAAC"}