@mcp-fe/mcp-worker 0.1.10 → 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 +251 -153
- package/mcp-service-worker.js +10 -0
- package/mcp-shared-worker.js +10 -0
- package/package.json +1 -1
- package/src/client/tool-registry.d.ts +117 -0
- package/src/client/tool-registry.d.ts.map +1 -0
- package/src/client/worker-client.d.ts +10 -37
- package/src/client/worker-client.d.ts.map +1 -1
- package/src/worker/mcp-controller.d.ts.map +1 -1
- package/src/worker/mcp-server.d.ts +5 -0
- package/src/worker/mcp-server.d.ts.map +1 -1
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
|
-
//
|
|
49
|
-
|
|
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 =
|
|
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.
|
|
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.
|
|
178
|
-
|
|
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
|
|
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
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
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.
|
|
282
|
-
name,
|
|
283
|
-
description,
|
|
284
|
-
inputSchema,
|
|
285
|
-
|
|
286
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
1024
|
+
* Register tool in worker only (assumes already registered in ToolRegistry)
|
|
842
1025
|
* @private
|
|
843
1026
|
*/
|
|
844
|
-
async
|
|
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
|
|
897
|
-
if (
|
|
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
|
-
|
|
902
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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.
|
|
1109
|
+
const handler = this.toolRegistry.getHandler(toolName);
|
|
1012
1110
|
if (!handler) {
|
|
1013
1111
|
throw new Error(`Tool handler not found: ${toolName}`);
|
|
1014
1112
|
}
|
package/mcp-service-worker.js
CHANGED
|
@@ -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/mcp-shared-worker.js
CHANGED
|
@@ -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
|
@@ -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
|
|
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:
|
|
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
|
-
*
|
|
189
|
+
* Register tool in worker only (assumes already registered in ToolRegistry)
|
|
212
190
|
* @private
|
|
213
191
|
*/
|
|
214
|
-
private
|
|
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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"worker-client.d.ts","sourceRoot":"","sources":["../../../../../libs/mcp-worker/src/client/worker-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AAKzB,MAAM,MAAM,uBAAuB,GAAG;IACpC,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,qBAAa,YAAY;IAEvB,OAAO,CAAC,eAAe,CAA2B;IAClD,OAAO,CAAC,gBAAgB,CAA4B;IAEpD,OAAO,CAAC,YAAY,CAAwC;IAE5D,OAAO,CAAC,yBAAyB,CAA0C;IAC3E,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,gBAAgB,CAAuB;IAE/C,OAAO,CAAC,yBAAyB,CACrB;IAGZ,OAAO,CAAC,WAAW,CAA8B;IAGjD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,aAAa,CAAyB;IAG9C,OAAO,CAAC,YAAY,CAAsB;IAG1C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAmB;;IA+B7D;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAwBxB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAWnB;;;OAGG;IACH,OAAO,CAAC,YAAY;IAOpB;;;OAGG;IACI,QAAQ,IAAI,MAAM;IAIzB;;;OAGG;IACI,UAAU,IAAI;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;KACf;IAQD;;;OAGG;WACW,UAAU,IAAI,IAAI;IAShC;;;OAGG;IACH,OAAO,CAAC,eAAe;IAwCV,IAAI,CACf,qBAAqB,CAAC,EAAE,yBAAyB,GAAG,uBAAuB,GAC1E,OAAO,CAAC,IAAI,CAAC;IAuFhB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;;OAGG;YACW,iBAAiB;IAwC/B;;;OAGG;IACU,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBzC;;OAEG;IACH,IAAW,WAAW,IAAI,OAAO,CAEhC;YAEa,gBAAgB;YAqHhB,yBAAyB;IA4F1B,OAAO,CAAC,CAAC,GAAG,OAAO,EAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,SAAS,SAAO,GACf,OAAO,CAAC,CAAC,CAAC;IAuKA,IAAI,CACf,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC;IAkDhB,OAAO,CAAC,4BAA4B;IAmC7B,kBAAkB,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAI1D,mBAAmB,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAIrD,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;IAe7C,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAqBxC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+CG;IACU,YAAY,CACvB,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,CAAC,IAAI,CAAC;IAwBhB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAqB9B;;;OAGG;YACW,oBAAoB;IA6BlC;;;;OAIG;IACU,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuB3D;;;OAGG;IACI,YAAY,CACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,CACR,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,KACrD,IAAI,GACR,MAAM,IAAI;IAIb;;OAEG;IACI,WAAW,CAChB,QAAQ,EAAE,MAAM,GACf;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAIrD;;OAEG;IACI,cAAc,CAAC,QAAQ,EAAE,MAAM,GAClC,CAAC,cAAc,GAAG;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,OAAO,CAAC;KACvB,CAAC,GACF,IAAI;IAIR;;OAEG;IACI,kBAAkB,IAAI,MAAM,EAAE;IAIrC;;OAEG;IACI,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIlD;;;OAGG;YACW,cAAc;IAiC5B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;CAmC3B"}
|
|
@@ -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;
|
|
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"}
|