@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
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,39 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [1.2.6] - 2026-04-29
|
|
6
|
+
|
|
7
|
+
### Hub Tools
|
|
8
|
+
|
|
9
|
+
- use runtime connected status for instance selection
|
|
10
|
+
- clarify instance filtering comment
|
|
11
|
+
- fix listMcpResources returning incomplete server resources by using two-pass approach to check all instances connection status
|
|
12
|
+
|
|
13
|
+
### Utils
|
|
14
|
+
|
|
15
|
+
- add null check to normalizeToolName
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## [1.2.5] - 2026-04-28
|
|
20
|
+
|
|
21
|
+
### Hub Tools
|
|
22
|
+
|
|
23
|
+
- enhance hub-tools system with improved tool handling
|
|
24
|
+
- add list_tags tool constants and update CLAUDE.md docs
|
|
25
|
+
- add comprehensive use guide documentation
|
|
26
|
+
- improve default server description text
|
|
27
|
+
- remove stale cache in listResources
|
|
28
|
+
- clarify instance filtering comment
|
|
29
|
+
- fix listMcpResources returning incomplete server resources by using two-pass approach to check all instances connection status
|
|
30
|
+
- align resource generation logic with /web/mcp/status API behavior
|
|
31
|
+
|
|
32
|
+
### Utils
|
|
33
|
+
|
|
34
|
+
- add null check to normalizeToolName
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
5
38
|
## [1.2.4] - 2026-04-25
|
|
6
39
|
|
|
7
40
|
### Frontend
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hub-tools.d.ts","sourceRoot":"","sources":["../../../../../src/api/web/hub-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"hub-tools.d.ts","sourceRoot":"","sources":["../../../../../src/api/web/hub-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAqB1C;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,iBAuK/D"}
|
|
@@ -77,6 +77,21 @@ export async function webHubToolsRoutes(fastify) {
|
|
|
77
77
|
});
|
|
78
78
|
}
|
|
79
79
|
});
|
|
80
|
+
// GET /web/hub-tools/servers/:serverName/tags - List all instance tags for a specific server
|
|
81
|
+
fastify.get('/web/hub-tools/servers/:serverName/tags', async (request, reply) => {
|
|
82
|
+
try {
|
|
83
|
+
const { serverName } = request.params;
|
|
84
|
+
const params = { serverName };
|
|
85
|
+
const result = await hubToolsService.listTags(params);
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
return reply.code(404).send({
|
|
90
|
+
error: 'Server not found',
|
|
91
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
});
|
|
80
95
|
// GET /web/hub-tools/servers/:serverName/tools/:toolName - Get specific tool details
|
|
81
96
|
fastify.get('/web/hub-tools/servers/:serverName/tools/:toolName', async (request, reply) => {
|
|
82
97
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-status.d.ts","sourceRoot":"","sources":["../../../../../src/api/web/mcp-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAQ1C;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"mcp-status.d.ts","sourceRoot":"","sources":["../../../../../src/api/web/mcp-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAQ1C;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,eAAe,iBA6KhE"}
|
|
@@ -43,6 +43,8 @@ export async function webMcpStatusRoutes(fastify) {
|
|
|
43
43
|
id: server.name,
|
|
44
44
|
name: server.name,
|
|
45
45
|
type: server.config.template.type,
|
|
46
|
+
displayName: undefined,
|
|
47
|
+
tags: {},
|
|
46
48
|
status: {
|
|
47
49
|
connected: false,
|
|
48
50
|
lastCheck: Date.now(),
|
|
@@ -60,6 +62,8 @@ export async function webMcpStatusRoutes(fastify) {
|
|
|
60
62
|
id: instance.id || '',
|
|
61
63
|
name: server.name,
|
|
62
64
|
type: resolvedConfig?.type || server.config.template.type,
|
|
65
|
+
displayName: instance.displayName,
|
|
66
|
+
tags: instance.tags,
|
|
63
67
|
status: mcpConnectionManager.getStatus(server.name, instance.index ?? 0) || {
|
|
64
68
|
connected: false,
|
|
65
69
|
lastCheck: Date.now(),
|
|
@@ -97,16 +97,24 @@ function printFormattedStatus(status) {
|
|
|
97
97
|
let maxNameLen = 'Server Name'.length;
|
|
98
98
|
let maxTypeLen = 'Type'.length;
|
|
99
99
|
const maxStatusLen = 'Disconnected'.length;
|
|
100
|
+
let maxDisplayNameLen = 'DisplayName'.length;
|
|
101
|
+
let maxTagsLen = 'Tags'.length;
|
|
100
102
|
for (const server of servers) {
|
|
101
103
|
maxNameLen = Math.max(maxNameLen, (server.name || '').length);
|
|
102
104
|
maxTypeLen = Math.max(maxTypeLen, (server.type || '').length);
|
|
105
|
+
const displayName = server.displayName || '';
|
|
106
|
+
const tags = JSON.stringify(server.tags || {});
|
|
107
|
+
maxDisplayNameLen = Math.max(maxDisplayNameLen, displayName.length);
|
|
108
|
+
maxTagsLen = Math.max(maxTagsLen, tags.length);
|
|
103
109
|
}
|
|
104
110
|
// Simple table without complex borders
|
|
105
111
|
const headerName = 'Server Name'.padEnd(maxNameLen);
|
|
106
112
|
const headerType = 'Type'.padEnd(maxTypeLen);
|
|
107
113
|
const headerStatus = 'Status'.padEnd(maxStatusLen);
|
|
108
|
-
|
|
109
|
-
|
|
114
|
+
const headerDisplayName = 'DisplayName'.padEnd(maxDisplayNameLen);
|
|
115
|
+
const headerTags = 'Tags'.padEnd(maxTagsLen);
|
|
116
|
+
console.log(`${cyan}${headerName} ${headerType} ${headerStatus} Tools Resources ${headerDisplayName} ${headerTags}${reset}`);
|
|
117
|
+
console.log(`${dim}${'─'.repeat(maxNameLen + maxTypeLen + maxStatusLen + 26 + maxDisplayNameLen + maxTagsLen)}${reset}`);
|
|
110
118
|
for (const server of servers) {
|
|
111
119
|
const name = (server.name || '').padEnd(maxNameLen);
|
|
112
120
|
const type = (server.type || '').padEnd(maxTypeLen);
|
|
@@ -115,7 +123,9 @@ function printFormattedStatus(status) {
|
|
|
115
123
|
: `${red}Disconnected${reset}`.padEnd(maxStatusLen + 9);
|
|
116
124
|
const tools = server.toolsCount.toString().padStart(5);
|
|
117
125
|
const resources = server.resourcesCount.toString().padStart(9);
|
|
118
|
-
|
|
126
|
+
const displayName = (server.displayName || '').padEnd(maxDisplayNameLen);
|
|
127
|
+
const tags = JSON.stringify(server.tags || {}).padEnd(maxTagsLen);
|
|
128
|
+
console.log(`${name} ${type} ${statusText} ${tools} ${resources} ${displayName} ${tags}`);
|
|
119
129
|
if (server.error) {
|
|
120
130
|
console.log(` ${red}Error: ${server.error}${reset}`);
|
|
121
131
|
}
|
|
@@ -3,7 +3,7 @@ import { Command } from 'commander';
|
|
|
3
3
|
* CLI command for dynamic MCP server tool operations via API.
|
|
4
4
|
*
|
|
5
5
|
* This command provides a simplified CLI interface for interacting with MCP server tools,
|
|
6
|
-
* supporting
|
|
6
|
+
* supporting five actions: list-servers, list-tools, list-tags, get-tool, and call-tool. It wraps
|
|
7
7
|
* the HTTP API endpoints and requires the MCP Hub Lite server to be running.
|
|
8
8
|
*
|
|
9
9
|
* ## Command Format
|
|
@@ -21,6 +21,7 @@ import { Command } from 'commander';
|
|
|
21
21
|
*
|
|
22
22
|
* - `list-servers` - List all connected MCP servers
|
|
23
23
|
* - `list-tools` - List all tools from the specified server
|
|
24
|
+
* - `list-tags` - List all instance tags for a specific MCP server
|
|
24
25
|
* - `get-tool` - Get complete schema for a specific tool (requires --tool)
|
|
25
26
|
* - `call-tool` - Call a tool on the specified server (requires --tool)
|
|
26
27
|
*
|
|
@@ -55,6 +56,9 @@ import { Command } from 'commander';
|
|
|
55
56
|
* # List third-party server tools
|
|
56
57
|
* mcp-hub-lite tool-use list-tools --server baidu-search
|
|
57
58
|
*
|
|
59
|
+
* # List instance tags for a server
|
|
60
|
+
* mcp-hub-lite tool-use list-tags --server chrome-devtools
|
|
61
|
+
*
|
|
58
62
|
* # Get system tool schema
|
|
59
63
|
* mcp-hub-lite tool-use get-tool --tool list_tools --server mcp-hub-lite
|
|
60
64
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-use.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/tool-use.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC
|
|
1
|
+
{"version":3,"file":"tool-use.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/tool-use.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+FG;AACH,eAAO,MAAM,cAAc,SAkNvB,CAAC"}
|
|
@@ -4,7 +4,7 @@ import { getServerStatus } from '../server.js';
|
|
|
4
4
|
* CLI command for dynamic MCP server tool operations via API.
|
|
5
5
|
*
|
|
6
6
|
* This command provides a simplified CLI interface for interacting with MCP server tools,
|
|
7
|
-
* supporting
|
|
7
|
+
* supporting five actions: list-servers, list-tools, list-tags, get-tool, and call-tool. It wraps
|
|
8
8
|
* the HTTP API endpoints and requires the MCP Hub Lite server to be running.
|
|
9
9
|
*
|
|
10
10
|
* ## Command Format
|
|
@@ -22,6 +22,7 @@ import { getServerStatus } from '../server.js';
|
|
|
22
22
|
*
|
|
23
23
|
* - `list-servers` - List all connected MCP servers
|
|
24
24
|
* - `list-tools` - List all tools from the specified server
|
|
25
|
+
* - `list-tags` - List all instance tags for a specific MCP server
|
|
25
26
|
* - `get-tool` - Get complete schema for a specific tool (requires --tool)
|
|
26
27
|
* - `call-tool` - Call a tool on the specified server (requires --tool)
|
|
27
28
|
*
|
|
@@ -56,6 +57,9 @@ import { getServerStatus } from '../server.js';
|
|
|
56
57
|
* # List third-party server tools
|
|
57
58
|
* mcp-hub-lite tool-use list-tools --server baidu-search
|
|
58
59
|
*
|
|
60
|
+
* # List instance tags for a server
|
|
61
|
+
* mcp-hub-lite tool-use list-tags --server chrome-devtools
|
|
62
|
+
*
|
|
59
63
|
* # Get system tool schema
|
|
60
64
|
* mcp-hub-lite tool-use get-tool --tool list_tools --server mcp-hub-lite
|
|
61
65
|
*
|
|
@@ -93,8 +97,8 @@ import { getServerStatus } from '../server.js';
|
|
|
93
97
|
* @returns {Command} The configured mcp-tool-use command instance for registration with Commander.js
|
|
94
98
|
*/
|
|
95
99
|
export const toolUseCommand = new Command('tool-use')
|
|
96
|
-
.description('Manage MCP server tools via API (list-servers, list-tools, get-tool, call-tool)')
|
|
97
|
-
.argument('<action>', 'Action: list-servers, list-tools, get-tool, call-tool')
|
|
100
|
+
.description('Manage MCP server tools via API (list-servers, list-tools, list-tags, get-tool, call-tool)')
|
|
101
|
+
.argument('<action>', 'Action: list-servers, list-tools, list-tags, get-tool, call-tool')
|
|
98
102
|
.option('--server <serverName>', 'Server name to target (omit or empty for system tools)')
|
|
99
103
|
.option('--tool <toolName>', 'Tool name (required for get-tool and call-tool actions)')
|
|
100
104
|
.option('--args <json>', 'JSON string of tool arguments, or combined JSON with server/tool/args fields')
|
|
@@ -111,6 +115,9 @@ Examples:
|
|
|
111
115
|
# List third-party server tools
|
|
112
116
|
mcp-hub-lite tool-use list-tools --server baidu-search
|
|
113
117
|
|
|
118
|
+
# List instance tags for a server
|
|
119
|
+
mcp-hub-lite tool-use list-tags --server chrome-devtools
|
|
120
|
+
|
|
114
121
|
# Get system tool schema
|
|
115
122
|
mcp-hub-lite tool-use get-tool --tool list_tools
|
|
116
123
|
|
|
@@ -208,6 +215,22 @@ Examples:
|
|
|
208
215
|
console.log(JSON.stringify(result, null, 2));
|
|
209
216
|
break;
|
|
210
217
|
}
|
|
218
|
+
case 'list-tags': {
|
|
219
|
+
if (!effectiveServer || effectiveServer === defaultServer) {
|
|
220
|
+
effectiveServer = 'mcp-hub-lite';
|
|
221
|
+
}
|
|
222
|
+
const tagsParam = options.tags ? `?tags=${encodeURIComponent(options.tags)}` : '';
|
|
223
|
+
const response = await fetch(`${baseUrl}/web/hub-tools/servers/${effectiveServer}/tags${tagsParam}`, {
|
|
224
|
+
headers: { Accept: 'application/json' }
|
|
225
|
+
});
|
|
226
|
+
if (!response.ok) {
|
|
227
|
+
const error = await response.json().catch(() => ({ message: response.statusText }));
|
|
228
|
+
throw new Error(error.message || `API error: ${response.status}`);
|
|
229
|
+
}
|
|
230
|
+
const result = await response.json();
|
|
231
|
+
console.log(JSON.stringify(result, null, 2));
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
211
234
|
case 'call-tool': {
|
|
212
235
|
if (!effectiveTool) {
|
|
213
236
|
console.error('Error: toolName is required for call-tool action');
|
|
@@ -242,7 +265,7 @@ Examples:
|
|
|
242
265
|
}
|
|
243
266
|
default: {
|
|
244
267
|
console.error(`Unknown action: ${action}`);
|
|
245
|
-
console.error('Valid actions: list-servers, list-tools, get-tool, call-tool');
|
|
268
|
+
console.error('Valid actions: list-servers, list-tools, list-tags, get-tool, call-tool');
|
|
246
269
|
process.exit(1);
|
|
247
270
|
}
|
|
248
271
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../../src/cli/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAMvE;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,iBAO5C;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA0CjF;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../../src/cli/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAMvE;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,iBAO5C;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA0CjF;AAoED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,WAAW;;;;;;;;;;;;;;;;;;;KAUhC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,GAAG,KAAK,GAAG,iBAAiB,CAAC;IAC/C,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,yBAAyB,EAAE,QAAQ,GAAG,aAAa,GAAG,kBAAkB,CAAC;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,oBAAoB,EAC7B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CA0Df;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkBvE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkB1E"}
|
|
@@ -173,6 +173,8 @@ async function fetchRuntimeStatus(host, port) {
|
|
|
173
173
|
const result = statusData.map((item) => ({
|
|
174
174
|
name: item.name,
|
|
175
175
|
type: item.type,
|
|
176
|
+
displayName: item.displayName,
|
|
177
|
+
tags: item.tags,
|
|
176
178
|
connected: item.status.connected,
|
|
177
179
|
toolsCount: item.status.toolsCount,
|
|
178
180
|
resourcesCount: item.status.resourcesCount,
|
|
@@ -32,17 +32,21 @@ export interface UpdateServerDescriptionParams {
|
|
|
32
32
|
serverName: string;
|
|
33
33
|
description: string;
|
|
34
34
|
}
|
|
35
|
-
export
|
|
35
|
+
export interface ListTagsParams {
|
|
36
|
+
serverName: string;
|
|
37
|
+
}
|
|
38
|
+
export type SystemToolArgs = ListServersParams | ListToolsInServerParams | GetToolParams | CallToolParams | UpdateServerDescriptionParams | ListTagsParams;
|
|
36
39
|
export declare const LIST_SERVERS_TOOL = "list_servers";
|
|
37
40
|
export declare const LIST_TOOLS_TOOL = "list_tools";
|
|
38
41
|
export declare const GET_TOOL_TOOL = "get_tool";
|
|
39
42
|
export declare const CALL_TOOL_TOOL = "call_tool";
|
|
40
43
|
export declare const UPDATE_SERVER_DESCRIPTION_TOOL = "update_server_description";
|
|
44
|
+
export declare const LIST_TAGS_TOOL = "list_tags";
|
|
41
45
|
/**
|
|
42
46
|
* List of all system tool names
|
|
43
47
|
* This array is used to identify system tools across the application
|
|
44
48
|
*/
|
|
45
|
-
export declare const SYSTEM_TOOL_NAMES: readonly ["list_servers", "list_tools", "get_tool", "call_tool", "update_server_description"];
|
|
49
|
+
export declare const SYSTEM_TOOL_NAMES: readonly ["list_servers", "list_tools", "get_tool", "call_tool", "update_server_description", "list_tags"];
|
|
46
50
|
/**
|
|
47
51
|
* Type definition for system tool names
|
|
48
52
|
* Provides type safety when working with system tool names
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-tools.constants.d.ts","sourceRoot":"","sources":["../../../../src/models/system-tools.constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEtD,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,cAAc,CAAC,EAAE;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAGD,MAAM,MAAM,cAAc,GACtB,iBAAiB,GACjB,uBAAuB,GACvB,aAAa,GACb,cAAc,GACd,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"system-tools.constants.d.ts","sourceRoot":"","sources":["../../../../src/models/system-tools.constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEtD,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,cAAc,CAAC,EAAE;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,MAAM,cAAc,GACtB,iBAAiB,GACjB,uBAAuB,GACvB,aAAa,GACb,cAAc,GACd,6BAA6B,GAC7B,cAAc,CAAC;AAGnB,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAChD,eAAO,MAAM,eAAe,eAAe,CAAC;AAC5C,eAAO,MAAM,aAAa,aAAa,CAAC;AACxC,eAAO,MAAM,cAAc,cAAc,CAAC;AAC1C,eAAO,MAAM,8BAA8B,8BAA8B,CAAC;AAC1E,eAAO,MAAM,cAAc,cAAc,CAAC;AAE1C;;;GAGG;AACH,eAAO,MAAM,iBAAiB,4GAOpB,CAAC;AAEX;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAGhE;;;GAGG;AACH,eAAO,MAAM,mBAAmB,iBAAiB,CAAC"}
|
|
@@ -8,6 +8,7 @@ export const LIST_TOOLS_TOOL = 'list_tools';
|
|
|
8
8
|
export const GET_TOOL_TOOL = 'get_tool';
|
|
9
9
|
export const CALL_TOOL_TOOL = 'call_tool';
|
|
10
10
|
export const UPDATE_SERVER_DESCRIPTION_TOOL = 'update_server_description';
|
|
11
|
+
export const LIST_TAGS_TOOL = 'list_tags';
|
|
11
12
|
/**
|
|
12
13
|
* List of all system tool names
|
|
13
14
|
* This array is used to identify system tools across the application
|
|
@@ -17,7 +18,8 @@ export const SYSTEM_TOOL_NAMES = [
|
|
|
17
18
|
LIST_TOOLS_TOOL,
|
|
18
19
|
GET_TOOL_TOOL,
|
|
19
20
|
CALL_TOOL_TOOL,
|
|
20
|
-
UPDATE_SERVER_DESCRIPTION_TOOL
|
|
21
|
+
UPDATE_SERVER_DESCRIPTION_TOOL,
|
|
22
|
+
LIST_TAGS_TOOL
|
|
21
23
|
];
|
|
22
24
|
// Individual gateway server name constant
|
|
23
25
|
/**
|
|
@@ -475,6 +475,12 @@ export declare class McpConnectionManager {
|
|
|
475
475
|
* @returns ServerStatus or undefined if not connected
|
|
476
476
|
*/
|
|
477
477
|
getStatusByName(name: string): ServerStatus | undefined;
|
|
478
|
+
/**
|
|
479
|
+
* Gets all connected instance indexes for a server.
|
|
480
|
+
* @param serverName - Server name
|
|
481
|
+
* @returns Array of connected instance indexes, empty if none connected
|
|
482
|
+
*/
|
|
483
|
+
getConnectedIndexes(serverName: string): number[];
|
|
478
484
|
/**
|
|
479
485
|
* Gets the composite key of the first connected instance for a server name.
|
|
480
486
|
* This is a backward compatibility method for code that expects getServerIdByName.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection-manager.d.ts","sourceRoot":"","sources":["../../../../../src/services/connection/connection-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAWnE,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,8BAA8B,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAKjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAG1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,aAAa,CAAsC;IAE3D,OAAO,CAAC,yBAAyB,CAAuC;;IAuBxE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;IACU,OAAO,CAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,GAC1D,OAAO,CAAC,OAAO,CAAC;IA8DnB;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkB5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAS9B;;OAEG;IACH,OAAO,CAAC,aAAa;IAYrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAiH3B;;OAEG;YACW,yBAAyB;IAgBvC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAuB7B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAgB/B;;OAEG;YACW,sBAAsB;IA6BpC;;OAEG;YACW,qBAAqB;IA0BnC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA+B1B;;;;;;;;;;;;;;;;;;;;;OAqBG;IACU,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwE/E;;;;;;;;;;;;;;;OAeG;IACU,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B3C;;;;;;;;;;;;;;;;;;OAkBG;IACU,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAwCnF;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACU,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAuF3F;;;;;;;;;;;;;;;;;OAiBG;IACI,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAKnF;;;;;;;;;;;;;;;;OAgBG;IACI,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE;IAIhE;;;;;;;;;;;;;;;;;OAiBG;IACI,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,QAAQ,EAAE;IAWxE;;;;;;;;;;;;;;;;;OAiBG;IACU,YAAY,CACvB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,OAAO,CAAC;IAUnB;;;;;;;;;;;;;;OAcG;IACI,WAAW,IAAI,IAAI,EAAE;IAI5B;;;;;;;;;;;;;;;OAeG;IACI,mBAAmB,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE;IAIhD;;;;;;;;;;;;;;;;;OAiBG;IACI,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAQ7E;;;;;;;;;;;;;;;;;;;OAmBG;IACI,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKjE;;;;;;;;;;;;;;;;;;;;OAoBG;IACU,QAAQ,CACnB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,OAAO,CAAC;IAuBnB;;;;;;;;;;;;;;;OAeG;IACI,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE;IAI3C;;;;;;;;;;;;;;;OAeG;IACI,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE;IAcnD;;;;;;;;;;;;;;;;;OAiBG;IACI,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAItE;;;;;;;;;;;;;;;;OAgBG;IACI,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;IAepD;;;;;;;;;;;;;;;OAeG;IACI,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE;IAIvD;;;;;;OAMG;IACI,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAe9D;;;;;;OAMG;IACI,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAe1D;;;;;;;;;;;;;;OAcG;IACI,uBAAuB,IAAI,IAAI,EAAE;IAIxC;;;;;;OAMG;IACH,IAAI,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAEnC;CACF;AAmBD,eAAO,MAAM,oBAAoB,sBAA6B,CAAC"}
|
|
1
|
+
{"version":3,"file":"connection-manager.d.ts","sourceRoot":"","sources":["../../../../../src/services/connection/connection-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -995,6 +995,29 @@ export class McpConnectionManager {
|
|
|
995
995
|
}
|
|
996
996
|
return undefined;
|
|
997
997
|
}
|
|
998
|
+
/**
|
|
999
|
+
* Gets all connected instance indexes for a server.
|
|
1000
|
+
* @param serverName - Server name
|
|
1001
|
+
* @returns Array of connected instance indexes, empty if none connected
|
|
1002
|
+
*/
|
|
1003
|
+
getConnectedIndexes(serverName) {
|
|
1004
|
+
// Directly iterate instances via hubManager, check each via getStatus
|
|
1005
|
+
// This bypasses serverNameToCompositeKeys which may have stale/missing entries
|
|
1006
|
+
// Note: We do NOT filter by instance.enabled here because:
|
|
1007
|
+
// - enabled=false means "do not auto-start" (config), not "cannot be connected" (runtime)
|
|
1008
|
+
// - A user can manually start an enabled=false instance, which should still appear in list_servers
|
|
1009
|
+
const instances = hubManager.getServerInstancesByName(serverName);
|
|
1010
|
+
const connectedIndexes = [];
|
|
1011
|
+
for (const instance of instances) {
|
|
1012
|
+
if (instance.index !== undefined) {
|
|
1013
|
+
const status = this.getStatus(serverName, instance.index);
|
|
1014
|
+
if (status?.connected) {
|
|
1015
|
+
connectedIndexes.push(instance.index);
|
|
1016
|
+
}
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
return connectedIndexes;
|
|
1020
|
+
}
|
|
998
1021
|
/**
|
|
999
1022
|
* Gets the composite key of the first connected instance for a server name.
|
|
1000
1023
|
* This is a backward compatibility method for code that expects getServerIdByName.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-tools-handler.d.ts","sourceRoot":"","sources":["../../../../../../src/services/gateway/request-handlers/system-tools-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"system-tools-handler.d.ts","sourceRoot":"","sources":["../../../../../../src/services/gateway/request-handlers/system-tools-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmNnE"}
|
|
@@ -6,7 +6,7 @@ import { McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
|
6
6
|
import { logger } from '../../../utils/index.js';
|
|
7
7
|
import { LOG_MODULES } from '../../../utils/logger/log-modules.js';
|
|
8
8
|
import { hubToolsService } from '../../hub-tools.service.js';
|
|
9
|
-
import { LIST_SERVERS_TOOL, LIST_TOOLS_TOOL, GET_TOOL_TOOL, CALL_TOOL_TOOL, UPDATE_SERVER_DESCRIPTION_TOOL } from '../../../models/system-tools.constants.js';
|
|
9
|
+
import { LIST_SERVERS_TOOL, LIST_TOOLS_TOOL, GET_TOOL_TOOL, CALL_TOOL_TOOL, UPDATE_SERVER_DESCRIPTION_TOOL, LIST_TAGS_TOOL } from '../../../models/system-tools.constants.js';
|
|
10
10
|
/**
|
|
11
11
|
* Register system tools handlers on the MCP server.
|
|
12
12
|
*
|
|
@@ -192,4 +192,31 @@ export function registerSystemToolsHandlers(server) {
|
|
|
192
192
|
}
|
|
193
193
|
}
|
|
194
194
|
});
|
|
195
|
+
// List tags
|
|
196
|
+
const ListTagsRequestSchema = z.object({
|
|
197
|
+
method: z.literal(LIST_TAGS_TOOL),
|
|
198
|
+
params: z.object({
|
|
199
|
+
serverName: z.string()
|
|
200
|
+
}),
|
|
201
|
+
id: z.union([z.string(), z.number()]),
|
|
202
|
+
jsonrpc: z.literal('2.0')
|
|
203
|
+
});
|
|
204
|
+
server.server.setRequestHandler(ListTagsRequestSchema, async (request) => {
|
|
205
|
+
try {
|
|
206
|
+
const result = await hubToolsService.listTags(request.params);
|
|
207
|
+
return result;
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
logger.error(`List tags error:`, error, LOG_MODULES.SYSTEM_TOOLS_HANDLER);
|
|
211
|
+
if (error instanceof McpError) {
|
|
212
|
+
throw error;
|
|
213
|
+
}
|
|
214
|
+
else if (error instanceof Error) {
|
|
215
|
+
throw new McpError(-32802, error.message);
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
throw new McpError(-32802, String(error));
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
});
|
|
195
222
|
}
|
|
@@ -17,11 +17,18 @@ export declare class InstanceSelector {
|
|
|
17
17
|
private static roundRobinCounters;
|
|
18
18
|
/**
|
|
19
19
|
* Select best instance based on configured strategy
|
|
20
|
+
*
|
|
21
|
+
* @param serverName - Name of the server
|
|
22
|
+
* @param serverConfig - Server configuration
|
|
23
|
+
* @param requestOptions - Optional request options for instance selection
|
|
24
|
+
* @param statusChecker - Optional function to check instance connection status (for testing)
|
|
20
25
|
*/
|
|
21
26
|
static selectInstance(serverName: string, serverConfig: ServerConfig, requestOptions?: {
|
|
22
27
|
sessionId?: string;
|
|
23
28
|
tags?: Record<string, string>;
|
|
24
|
-
}
|
|
29
|
+
}, statusChecker?: (serverName: string, index: number) => {
|
|
30
|
+
connected?: boolean;
|
|
31
|
+
} | undefined): ServerInstance | undefined;
|
|
25
32
|
private static selectRandomInstance;
|
|
26
33
|
private static selectRoundRobinInstance;
|
|
27
34
|
private static selectTagMatchUniqueInstance;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance-selector.d.ts","sourceRoot":"","sources":["../../../../../src/services/hub-tools/instance-selector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"instance-selector.d.ts","sourceRoot":"","sources":["../../../../../src/services/hub-tools/instance-selector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAInF;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAE1B,aAAa,EAAE,MAAM;aACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;aACpC,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAF3D,aAAa,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,YAAA,EACpC,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,YAAA;CAmB9E;AAED;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAA6B;IAE9D;;;;;;;OAOG;IACH,MAAM,CAAC,cAAc,CACnB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,YAAY,EAC1B,cAAc,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,EACtE,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,GACzF,cAAc,GAAG,SAAS;IAwC7B,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAKnC,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAUvC,OAAO,CAAC,MAAM,CAAC,4BAA4B;CAiC5C"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { InstanceSelectionStrategy } from '../../models/server.model.js';
|
|
2
|
+
import { mcpConnectionManager } from '../mcp-connection-manager.js';
|
|
2
3
|
/**
|
|
3
4
|
* Error thrown when tag-match-unique instance selection fails.
|
|
4
5
|
* Passes raw data so the error class itself can format the message.
|
|
@@ -39,28 +40,41 @@ export class InstanceSelector {
|
|
|
39
40
|
static roundRobinCounters = new Map();
|
|
40
41
|
/**
|
|
41
42
|
* Select best instance based on configured strategy
|
|
43
|
+
*
|
|
44
|
+
* @param serverName - Name of the server
|
|
45
|
+
* @param serverConfig - Server configuration
|
|
46
|
+
* @param requestOptions - Optional request options for instance selection
|
|
47
|
+
* @param statusChecker - Optional function to check instance connection status (for testing)
|
|
42
48
|
*/
|
|
43
|
-
static selectInstance(serverName, serverConfig, requestOptions) {
|
|
49
|
+
static selectInstance(serverName, serverConfig, requestOptions, statusChecker) {
|
|
44
50
|
const { instances } = serverConfig;
|
|
45
51
|
const instanceSelectionStrategy = serverConfig.template.instanceSelectionStrategy || InstanceSelectionStrategy.RANDOM;
|
|
46
|
-
//
|
|
47
|
-
const
|
|
48
|
-
|
|
52
|
+
// Use provided statusChecker or default to mcpConnectionManager.getStatus
|
|
53
|
+
const checkStatus = statusChecker || ((name, idx) => mcpConnectionManager.getStatus(name, idx));
|
|
54
|
+
// Filter instances - use runtime connected status, NOT config enabled flag
|
|
55
|
+
// enabled=false means "do not auto-start" but user can manually start it
|
|
56
|
+
const connectedInstances = instances.filter((instance) => {
|
|
57
|
+
if (instance.index === undefined)
|
|
58
|
+
return false;
|
|
59
|
+
const status = checkStatus(serverName, instance.index);
|
|
60
|
+
return status?.connected;
|
|
61
|
+
});
|
|
62
|
+
if (connectedInstances.length === 0) {
|
|
49
63
|
return undefined;
|
|
50
64
|
}
|
|
51
65
|
// Single instance case - return directly
|
|
52
|
-
if (
|
|
53
|
-
return
|
|
66
|
+
if (connectedInstances.length === 1) {
|
|
67
|
+
return connectedInstances[0];
|
|
54
68
|
}
|
|
55
69
|
switch (instanceSelectionStrategy) {
|
|
56
70
|
case InstanceSelectionStrategy.RANDOM:
|
|
57
|
-
return this.selectRandomInstance(
|
|
71
|
+
return this.selectRandomInstance(connectedInstances);
|
|
58
72
|
case InstanceSelectionStrategy.ROUND_ROBIN:
|
|
59
|
-
return this.selectRoundRobinInstance(serverName,
|
|
73
|
+
return this.selectRoundRobinInstance(serverName, connectedInstances);
|
|
60
74
|
case InstanceSelectionStrategy.TAG_MATCH_UNIQUE:
|
|
61
|
-
return this.selectTagMatchUniqueInstance(
|
|
75
|
+
return this.selectTagMatchUniqueInstance(connectedInstances, requestOptions?.tags);
|
|
62
76
|
default:
|
|
63
|
-
return
|
|
77
|
+
return connectedInstances[0]; // Fallback to first instance
|
|
64
78
|
}
|
|
65
79
|
}
|
|
66
80
|
static selectRandomInstance(instances) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-generator.d.ts","sourceRoot":"","sources":["../../../../../src/services/hub-tools/resource-generator.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAUlE;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AA6ID;;GAEG;AACH,eAAO,MAAM,aAAa,oBAAoB,CAAC;AAE/C;;GAEG;AACH,eAAO,MAAM,cAAc,2BAA2B,CAAC;AAEvD;;GAEG;AACH,eAAO,MAAM,qBAAqB,uEACoC,CAAC;AAEvE;;GAEG;AACH,eAAO,MAAM,mBAAmB,kBAAkB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,wBAAwB,IAAI,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"resource-generator.d.ts","sourceRoot":"","sources":["../../../../../src/services/hub-tools/resource-generator.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAUlE;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AA6ID;;GAEG;AACH,eAAO,MAAM,aAAa,oBAAoB,CAAC;AAE/C;;GAEG;AACH,eAAO,MAAM,cAAc,2BAA2B,CAAC;AAEvD;;GAEG;AACH,eAAO,MAAM,qBAAqB,uEACoC,CAAC;AAEvE;;GAEG;AACH,eAAO,MAAM,mBAAmB,kBAAkB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,wBAAwB,IAAI,QAAQ,EAAE,CAqErD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,cAAc,GAAG,QAAQ,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,CAyGzD"}
|
|
@@ -178,36 +178,40 @@ export function generateDynamicResources() {
|
|
|
178
178
|
if (!hasValidId(server)) {
|
|
179
179
|
continue;
|
|
180
180
|
}
|
|
181
|
-
// Check if any
|
|
182
|
-
const
|
|
183
|
-
if (
|
|
181
|
+
// Check if any instances are connected using getConnectedIndexes
|
|
182
|
+
const connectedIndexes = mcpConnectionManager.getConnectedIndexes(server.name);
|
|
183
|
+
if (connectedIndexes.length === 0) {
|
|
184
184
|
continue;
|
|
185
185
|
}
|
|
186
|
-
//
|
|
186
|
+
// Second pass: generate resources for each connected instance
|
|
187
187
|
for (const instance of server.config.instances) {
|
|
188
|
-
|
|
188
|
+
const idx = instance.index;
|
|
189
|
+
if (idx === undefined) {
|
|
189
190
|
continue;
|
|
190
191
|
}
|
|
191
|
-
const
|
|
192
|
-
|
|
193
|
-
|
|
192
|
+
const instanceStatus = mcpConnectionManager.getStatus(server.name, idx);
|
|
193
|
+
if (!instanceStatus?.connected) {
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
// Server metadata resource (one per server, using first connected instance's index)
|
|
197
|
+
// Only generate once when we hit the first connected instance
|
|
198
|
+
if (idx === connectedIndexes[0]) {
|
|
194
199
|
resources.push({
|
|
195
200
|
uri: `hub://servers/${server.name}`,
|
|
196
201
|
name: `Server: ${server.name}`,
|
|
197
202
|
description: getServerDescription(server.config, server.name),
|
|
198
203
|
mimeType: 'application/json',
|
|
199
204
|
serverName: server.name,
|
|
200
|
-
serverIndex:
|
|
205
|
+
serverIndex: idx
|
|
201
206
|
});
|
|
202
207
|
}
|
|
203
208
|
// Get MCP native resources and map to hub format
|
|
204
|
-
const
|
|
205
|
-
const mcpResources = mcpConnectionManager.getResources(server.name, instanceIdx);
|
|
209
|
+
const mcpResources = mcpConnectionManager.getResources(server.name, idx);
|
|
206
210
|
for (const res of mcpResources) {
|
|
207
211
|
// Format: Resource: {ServerName} - {Index}: {Native Name}
|
|
208
|
-
const displayName = `Resource:${server.name} - ${
|
|
212
|
+
const displayName = `Resource:${server.name} - ${idx}:${res.name}`;
|
|
209
213
|
resources.push({
|
|
210
|
-
uri: mapMcpUriToHub(server.name,
|
|
214
|
+
uri: mapMcpUriToHub(server.name, idx, res.uri),
|
|
211
215
|
name: displayName,
|
|
212
216
|
description: res.description,
|
|
213
217
|
mimeType: res.mimeType
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { RequestOptions, ServerInstanceInfo, ValidServer } from './types.js';
|
|
2
2
|
/**
|
|
3
|
-
* Gets the description for a server, using
|
|
3
|
+
* Gets the description for a server, using the server name as default if none is provided.
|
|
4
4
|
*
|
|
5
5
|
* @param serverConfig - Server configuration object (may contain description in template)
|
|
6
6
|
* @param serverName - Name of the server
|
|
7
|
-
* @returns The server description or
|
|
7
|
+
* @returns The server description or the server name with usage note if no description is configured
|
|
8
8
|
*/
|
|
9
9
|
export declare function getServerDescription(serverConfig: {
|
|
10
10
|
template?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-selector.d.ts","sourceRoot":"","sources":["../../../../../src/services/hub-tools/server-selector.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAElF;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE;IAAE,QAAQ,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,SAAS,EACjE,UAAU,EAAE,MAAM,GACjB,MAAM,
|
|
1
|
+
{"version":3,"file":"server-selector.d.ts","sourceRoot":"","sources":["../../../../../src/services/hub-tools/server-selector.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAElF;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE;IAAE,QAAQ,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,SAAS,EACjE,UAAU,EAAE,MAAM,GACjB,MAAM,CAKR;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,WAAW,CAMjE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,cAAc,CAAC,EAAE,cAAc,EAC/B,UAAU,GAAE,OAAc,GACzB,kBAAkB,GAAG,SAAS,CA8ChC"}
|