@loop_ouroboros/mcp-hub-lite 1.2.4 → 1.2.6
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/CHANGELOG.md +33 -0
- package/dist/server/src/api/web/hub-tools.d.ts.map +1 -1
- package/dist/server/src/api/web/hub-tools.js +15 -0
- package/dist/server/src/api/web/mcp-status.d.ts.map +1 -1
- package/dist/server/src/api/web/mcp-status.js +4 -0
- package/dist/server/src/cli/commands/status.js +13 -3
- package/dist/server/src/cli/commands/tool-use.d.ts +5 -1
- package/dist/server/src/cli/commands/tool-use.d.ts.map +1 -1
- package/dist/server/src/cli/commands/tool-use.js +27 -4
- package/dist/server/src/cli/server.d.ts +2 -0
- package/dist/server/src/cli/server.d.ts.map +1 -1
- package/dist/server/src/cli/server.js +2 -0
- package/dist/server/src/models/system-tools.constants.d.ts +6 -2
- package/dist/server/src/models/system-tools.constants.d.ts.map +1 -1
- package/dist/server/src/models/system-tools.constants.js +3 -1
- package/dist/server/src/services/connection/connection-manager.d.ts +6 -0
- package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -1
- package/dist/server/src/services/connection/connection-manager.js +23 -0
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +28 -1
- package/dist/server/src/services/gateway/tool-list-generator.js +1 -1
- package/dist/server/src/services/hub-tools/instance-selector.d.ts +8 -1
- package/dist/server/src/services/hub-tools/instance-selector.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/instance-selector.js +24 -10
- package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/resource-generator.js +17 -13
- package/dist/server/src/services/hub-tools/server-selector.d.ts +2 -2
- package/dist/server/src/services/hub-tools/server-selector.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/server-selector.js +4 -3
- package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/system-tool-definitions.js +23 -3
- package/dist/server/src/services/hub-tools.service.d.ts +29 -7
- package/dist/server/src/services/hub-tools.service.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools.service.js +96 -36
- package/dist/server/src/services/system-tool-handler.d.ts.map +1 -1
- package/dist/server/src/services/system-tool-handler.js +21 -8
- package/dist/server/src/utils/name-converter.d.ts.map +1 -1
- package/dist/server/src/utils/name-converter.js +2 -0
- package/dist/server/tests/unit/services/hub-tools/instance-selector.test.js +21 -16
- package/dist/server/tests/unit/services/hub-tools.service.test.js +42 -40
- package/package.json +1 -1
|
@@ -36,6 +36,7 @@ describe('HubToolsService', () => {
|
|
|
36
36
|
instances: [
|
|
37
37
|
{
|
|
38
38
|
id: 'test-server-1-instance',
|
|
39
|
+
index: 0,
|
|
39
40
|
enabled: true,
|
|
40
41
|
args: [],
|
|
41
42
|
env: {},
|
|
@@ -62,6 +63,7 @@ describe('HubToolsService', () => {
|
|
|
62
63
|
instances: [
|
|
63
64
|
{
|
|
64
65
|
id: 'test-server-2-instance',
|
|
66
|
+
index: 0,
|
|
65
67
|
enabled: true,
|
|
66
68
|
args: [],
|
|
67
69
|
env: {},
|
|
@@ -82,20 +84,18 @@ describe('HubToolsService', () => {
|
|
|
82
84
|
const server = mockServers.find((s) => s.name === name);
|
|
83
85
|
return server?.config;
|
|
84
86
|
});
|
|
85
|
-
vi.mocked(mcpConnectionManager.
|
|
86
|
-
return
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
resourcesCount: 0
|
|
91
|
-
};
|
|
87
|
+
vi.mocked(mcpConnectionManager.getConnectedIndexes).mockImplementation(() => {
|
|
88
|
+
return [0];
|
|
89
|
+
});
|
|
90
|
+
vi.mocked(mcpConnectionManager.getStatus).mockImplementation(() => {
|
|
91
|
+
return { connected: true, lastCheck: Date.now(), toolsCount: 0, resourcesCount: 0 };
|
|
92
92
|
});
|
|
93
93
|
// Act
|
|
94
94
|
const servers = await hubToolsService.listServers();
|
|
95
95
|
// Assert
|
|
96
96
|
expect(servers).toEqual({
|
|
97
97
|
'Test Server 1': 'File system operations',
|
|
98
|
-
'Test Server 2': '
|
|
98
|
+
'Test Server 2': 'Test Server 2 (You can check the tool list to understand its capabilities and update the description.)'
|
|
99
99
|
});
|
|
100
100
|
expect(hubManager.getAllServers).toHaveBeenCalledTimes(1);
|
|
101
101
|
});
|
|
@@ -118,6 +118,7 @@ describe('HubToolsService', () => {
|
|
|
118
118
|
instances: [
|
|
119
119
|
{
|
|
120
120
|
id: 'server1-instance',
|
|
121
|
+
index: 0,
|
|
121
122
|
enabled: true,
|
|
122
123
|
args: [],
|
|
123
124
|
env: {},
|
|
@@ -138,19 +139,17 @@ describe('HubToolsService', () => {
|
|
|
138
139
|
const server = mockServers.find((s) => s.name === name);
|
|
139
140
|
return server?.config;
|
|
140
141
|
});
|
|
141
|
-
vi.mocked(mcpConnectionManager.
|
|
142
|
-
return
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
resourcesCount: 0
|
|
147
|
-
};
|
|
142
|
+
vi.mocked(mcpConnectionManager.getConnectedIndexes).mockImplementation(() => {
|
|
143
|
+
return [0];
|
|
144
|
+
});
|
|
145
|
+
vi.mocked(mcpConnectionManager.getStatus).mockImplementation(() => {
|
|
146
|
+
return { connected: true, lastCheck: Date.now(), toolsCount: 0, resourcesCount: 0 };
|
|
148
147
|
});
|
|
149
148
|
// Act
|
|
150
149
|
const servers = await hubToolsService.listServers();
|
|
151
150
|
// Assert
|
|
152
151
|
expect(servers).toEqual({
|
|
153
|
-
server1: '
|
|
152
|
+
server1: 'server1 (You can check the tool list to understand its capabilities and update the description.)'
|
|
154
153
|
});
|
|
155
154
|
});
|
|
156
155
|
it('should use provided description when available', async () => {
|
|
@@ -173,6 +172,7 @@ describe('HubToolsService', () => {
|
|
|
173
172
|
instances: [
|
|
174
173
|
{
|
|
175
174
|
id: 'filesystem-instance',
|
|
175
|
+
index: 0,
|
|
176
176
|
enabled: true,
|
|
177
177
|
args: [],
|
|
178
178
|
env: {},
|
|
@@ -200,6 +200,7 @@ describe('HubToolsService', () => {
|
|
|
200
200
|
instances: [
|
|
201
201
|
{
|
|
202
202
|
id: 'time-instance',
|
|
203
|
+
index: 0,
|
|
203
204
|
enabled: true,
|
|
204
205
|
args: [],
|
|
205
206
|
env: {},
|
|
@@ -220,13 +221,11 @@ describe('HubToolsService', () => {
|
|
|
220
221
|
const server = mockServers.find((s) => s.name === name);
|
|
221
222
|
return server?.config;
|
|
222
223
|
});
|
|
223
|
-
vi.mocked(mcpConnectionManager.
|
|
224
|
-
return
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
resourcesCount: 0
|
|
229
|
-
};
|
|
224
|
+
vi.mocked(mcpConnectionManager.getConnectedIndexes).mockImplementation(() => {
|
|
225
|
+
return [0];
|
|
226
|
+
});
|
|
227
|
+
vi.mocked(mcpConnectionManager.getStatus).mockImplementation(() => {
|
|
228
|
+
return { connected: true, lastCheck: Date.now(), toolsCount: 0, resourcesCount: 0 };
|
|
230
229
|
});
|
|
231
230
|
// Act
|
|
232
231
|
const servers = await hubToolsService.listServers();
|
|
@@ -256,6 +255,7 @@ describe('HubToolsService', () => {
|
|
|
256
255
|
instances: [
|
|
257
256
|
{
|
|
258
257
|
id: 'connected-server-instance',
|
|
258
|
+
index: 0,
|
|
259
259
|
enabled: true,
|
|
260
260
|
args: [],
|
|
261
261
|
env: {},
|
|
@@ -303,21 +303,14 @@ describe('HubToolsService', () => {
|
|
|
303
303
|
const server = mockServers.find((s) => s.name === name);
|
|
304
304
|
return server?.config;
|
|
305
305
|
});
|
|
306
|
-
vi.mocked(mcpConnectionManager.
|
|
306
|
+
vi.mocked(mcpConnectionManager.getConnectedIndexes).mockImplementation((name) => {
|
|
307
307
|
if (name === 'Connected Server') {
|
|
308
|
-
return
|
|
309
|
-
connected: true,
|
|
310
|
-
lastCheck: Date.now(),
|
|
311
|
-
toolsCount: 0,
|
|
312
|
-
resourcesCount: 0
|
|
313
|
-
};
|
|
308
|
+
return [0];
|
|
314
309
|
}
|
|
315
|
-
return
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
resourcesCount: 0
|
|
320
|
-
};
|
|
310
|
+
return [];
|
|
311
|
+
});
|
|
312
|
+
vi.mocked(mcpConnectionManager.getStatus).mockImplementation(() => {
|
|
313
|
+
return { connected: true, lastCheck: Date.now(), toolsCount: 0, resourcesCount: 0 };
|
|
321
314
|
});
|
|
322
315
|
// Act
|
|
323
316
|
const servers = await hubToolsService.listServers();
|
|
@@ -380,6 +373,7 @@ describe('HubToolsService', () => {
|
|
|
380
373
|
tagDefinitions: []
|
|
381
374
|
});
|
|
382
375
|
vi.mocked(mcpConnectionManager.getToolsByServerName).mockReturnValue(mockTools);
|
|
376
|
+
vi.mocked(mcpConnectionManager.getConnectedIndexes).mockReturnValue([0]);
|
|
383
377
|
// Act
|
|
384
378
|
const result = await hubToolsService.listToolsInServer({ serverName });
|
|
385
379
|
// Assert
|
|
@@ -392,7 +386,7 @@ describe('HubToolsService', () => {
|
|
|
392
386
|
it('should throw error if server not found', async () => {
|
|
393
387
|
// Arrange
|
|
394
388
|
const serverName = 'Non-existent Server';
|
|
395
|
-
vi.mocked(mcpConnectionManager.
|
|
389
|
+
vi.mocked(mcpConnectionManager.getConnectedIndexes).mockReturnValue([]);
|
|
396
390
|
// Act & Assert
|
|
397
391
|
await expect(hubToolsService.listToolsInServer({ serverName })).rejects.toThrow(`Server not found: ${serverName}`);
|
|
398
392
|
});
|
|
@@ -440,6 +434,7 @@ describe('HubToolsService', () => {
|
|
|
440
434
|
tagDefinitions: []
|
|
441
435
|
});
|
|
442
436
|
vi.mocked(mcpConnectionManager.getToolsByServerName).mockReturnValue(mockTools);
|
|
437
|
+
vi.mocked(mcpConnectionManager.getConnectedIndexes).mockReturnValue([0]);
|
|
443
438
|
// Act
|
|
444
439
|
const tool = await hubToolsService.getTool({ serverName, toolName });
|
|
445
440
|
// Assert
|
|
@@ -480,6 +475,8 @@ describe('HubToolsService', () => {
|
|
|
480
475
|
instances: [mockInstance],
|
|
481
476
|
tagDefinitions: []
|
|
482
477
|
});
|
|
478
|
+
vi.mocked(mcpConnectionManager.getToolsByServerName).mockReturnValue(mockTools);
|
|
479
|
+
vi.mocked(mcpConnectionManager.getConnectedIndexes).mockReturnValue([0]);
|
|
483
480
|
vi.mocked(mcpConnectionManager.getTools).mockReturnValue(mockTools);
|
|
484
481
|
// Act
|
|
485
482
|
const tool = await hubToolsService.getTool({ serverName, toolName });
|
|
@@ -610,14 +607,15 @@ describe('HubToolsService', () => {
|
|
|
610
607
|
// Assert - System tools under mcp-hub-lite
|
|
611
608
|
expect(allTools).toHaveProperty('mcp-hub-lite');
|
|
612
609
|
expect(Array.isArray(allTools['mcp-hub-lite'].tools)).toBe(true);
|
|
613
|
-
// Assert system tools - should have
|
|
610
|
+
// Assert system tools - should have 6 tools now
|
|
614
611
|
const systemToolNames = allTools['mcp-hub-lite'].tools.map((t) => t.name);
|
|
615
612
|
expect(systemToolNames).toContain('list_servers');
|
|
616
613
|
expect(systemToolNames).toContain('list_tools');
|
|
617
614
|
expect(systemToolNames).toContain('get_tool');
|
|
618
615
|
expect(systemToolNames).toContain('call_tool');
|
|
619
616
|
expect(systemToolNames).toContain('update_server_description');
|
|
620
|
-
expect(systemToolNames).
|
|
617
|
+
expect(systemToolNames).toContain('list_tags');
|
|
618
|
+
expect(systemToolNames).toHaveLength(6);
|
|
621
619
|
// Assert server tools - should have only name and description
|
|
622
620
|
expect(allTools['Server 1'].tools).toEqual(expectedToolSummariesServer1);
|
|
623
621
|
expect(allTools['Server 2'].tools).toEqual(expectedToolSummariesServer2);
|
|
@@ -680,6 +678,7 @@ describe('HubToolsService', () => {
|
|
|
680
678
|
vi.mocked(mcpConnectionManager.getResources).mockReturnValue([
|
|
681
679
|
{ uri: 'test://resource', name: 'Test Resource' }
|
|
682
680
|
]);
|
|
681
|
+
vi.mocked(mcpConnectionManager.getConnectedIndexes).mockReturnValue([0]);
|
|
683
682
|
// Act
|
|
684
683
|
const resources = await hubToolsService.listResources();
|
|
685
684
|
// Assert - the resource list should include use-guide and at least the server resource
|
|
@@ -746,6 +745,7 @@ describe('HubToolsService', () => {
|
|
|
746
745
|
instances: [
|
|
747
746
|
{
|
|
748
747
|
id: 'test-instance',
|
|
748
|
+
index: 0,
|
|
749
749
|
enabled: true,
|
|
750
750
|
args: [],
|
|
751
751
|
env: {},
|
|
@@ -783,7 +783,7 @@ describe('HubToolsService', () => {
|
|
|
783
783
|
lastHeartbeat: mockInstance.lastHeartbeat,
|
|
784
784
|
// @ts-expect-error - Accessing extra fields on mock
|
|
785
785
|
uptime: mockInstance.uptime,
|
|
786
|
-
description:
|
|
786
|
+
description: `${serverName} (You can check the tool list to understand its capabilities and update the description.)`
|
|
787
787
|
});
|
|
788
788
|
});
|
|
789
789
|
it('should return tools list for tools URI', async () => {
|
|
@@ -791,6 +791,7 @@ describe('HubToolsService', () => {
|
|
|
791
791
|
const serverName = 'Test Server';
|
|
792
792
|
const mockInstance = {
|
|
793
793
|
id: '1',
|
|
794
|
+
index: 0,
|
|
794
795
|
enabled: true,
|
|
795
796
|
args: [],
|
|
796
797
|
env: {},
|
|
@@ -816,6 +817,7 @@ describe('HubToolsService', () => {
|
|
|
816
817
|
const serverName = 'Test Server';
|
|
817
818
|
const mockInstance = {
|
|
818
819
|
id: '1',
|
|
820
|
+
index: 0,
|
|
819
821
|
enabled: true,
|
|
820
822
|
args: [],
|
|
821
823
|
env: {},
|