@loop_ouroboros/mcp-hub-lite 1.3.0 → 1.3.1

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.
Files changed (120) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +405 -331
  3. package/dist/client/assets/{HomeView-Bi2bkUKf.js → HomeView-DplI3V-h.js} +1 -1
  4. package/dist/client/assets/{ResourceDetailView-DyuSovH9.js → ResourceDetailView-CeHPn99Y.js} +1 -1
  5. package/dist/client/assets/ResourcesView-C1ObRhYS.js +1 -0
  6. package/dist/client/assets/{ServerDashboard-BGyyZAti.js → ServerDashboard-D7wG4Gvt.js} +1 -1
  7. package/dist/client/assets/ServerDetail-G23phOcJ.js +2 -0
  8. package/dist/client/assets/{ServerListView-yQPVJFHG.js → ServerListView-BFiZLtPO.js} +1 -1
  9. package/dist/client/assets/{ServerStatusTags.vue_vue_type_script_setup_true_lang-C8gQlxGE.js → ServerStatusTags.vue_vue_type_script_setup_true_lang-Deb_SbFw.js} +1 -1
  10. package/dist/client/assets/SettingsView-QBFLZ6fP.js +1 -0
  11. package/dist/client/assets/ToolCallDialog-DYS-ADCL.js +1 -0
  12. package/dist/client/assets/ToolsView-DYwgtm7W.js +1 -0
  13. package/dist/client/assets/_baseClone-DQno9YO3.js +1 -0
  14. package/dist/client/assets/{el-form-item-DfWq_kSy.js → el-form-item-DF0zzQdH.js} +2 -2
  15. package/dist/client/assets/el-input-C_p2Qw42.js +1 -0
  16. package/dist/client/assets/el-loading-BaenpNzU.js +1 -0
  17. package/dist/client/assets/el-overlay-MbIUXSQ7.js +1 -0
  18. package/dist/client/assets/el-radio-group-COnCjCcz.js +1 -0
  19. package/dist/client/assets/el-skeleton-item-qj0eQP4s.js +1 -0
  20. package/dist/client/assets/el-switch-BZbXqB3_.js +1 -0
  21. package/dist/client/assets/el-tab-pane-w7RltRLd.js +1 -0
  22. package/dist/client/assets/el-table-column-OD8zhFcD.js +1 -0
  23. package/dist/client/assets/index-DwhULJXZ.js +2 -0
  24. package/dist/client/assets/{index-Bzz3tYbS.css → index-UtsV0Cvh.css} +1 -1
  25. package/dist/client/assets/{omit-BIIebEYo.js → omit-BAJQlviJ.js} +1 -1
  26. package/dist/client/assets/raf-B1Ry7ruA.js +1 -0
  27. package/dist/client/assets/{vue-vendor-Dwcr0jep.js → vue-vendor-ClSvefnQ.js} +1 -1
  28. package/dist/client/index.html +3 -3
  29. package/dist/server/shared/models/constants.d.ts +5 -0
  30. package/dist/server/shared/models/constants.d.ts.map +1 -1
  31. package/dist/server/shared/models/constants.js +4 -0
  32. package/dist/server/shared/models/server.model.d.ts +14 -0
  33. package/dist/server/shared/models/server.model.d.ts.map +1 -1
  34. package/dist/server/shared/models/server.model.js +27 -4
  35. package/dist/server/src/api/mcp/gateway.d.ts +10 -6
  36. package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
  37. package/dist/server/src/api/mcp/gateway.js +235 -69
  38. package/dist/server/src/api/web/sessions.d.ts +1 -27
  39. package/dist/server/src/api/web/sessions.d.ts.map +1 -1
  40. package/dist/server/src/api/web/sessions.js +8 -97
  41. package/dist/server/src/app.d.ts.map +1 -1
  42. package/dist/server/src/app.js +5 -0
  43. package/dist/server/src/cli/commands/status.js +39 -1
  44. package/dist/server/src/cli/commands/use-guide.d.ts +0 -8
  45. package/dist/server/src/cli/commands/use-guide.d.ts.map +1 -1
  46. package/dist/server/src/cli/commands/use-guide.js +28 -170
  47. package/dist/server/src/cli/server.d.ts +10 -0
  48. package/dist/server/src/cli/server.d.ts.map +1 -1
  49. package/dist/server/src/cli/server.js +31 -1
  50. package/dist/server/src/server/dev-server.js +2 -0
  51. package/dist/server/src/server/runner.d.ts.map +1 -1
  52. package/dist/server/src/server/runner.js +2 -0
  53. package/dist/server/src/services/connection/connection-manager.d.ts +2 -0
  54. package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -1
  55. package/dist/server/src/services/connection/connection-manager.js +14 -7
  56. package/dist/server/src/services/gateway/gateway.service.d.ts +13 -0
  57. package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -1
  58. package/dist/server/src/services/gateway/gateway.service.js +72 -0
  59. package/dist/server/src/services/gateway/global-transport.d.ts +20 -10
  60. package/dist/server/src/services/gateway/global-transport.d.ts.map +1 -1
  61. package/dist/server/src/services/gateway/global-transport.js +50 -34
  62. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts.map +1 -1
  63. package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +22 -6
  64. package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts.map +1 -1
  65. package/dist/server/src/services/gateway/request-handlers/resources-handler.js +5 -1
  66. package/dist/server/src/services/gateway/session-manager.d.ts +101 -0
  67. package/dist/server/src/services/gateway/session-manager.d.ts.map +1 -0
  68. package/dist/server/src/services/gateway/session-manager.js +256 -0
  69. package/dist/server/src/services/hub-tools/resource-generator.d.ts +1 -1
  70. package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -1
  71. package/dist/server/src/services/hub-tools/resource-generator.js +11 -9
  72. package/dist/server/src/services/hub-tools.service.d.ts.map +1 -1
  73. package/dist/server/src/services/hub-tools.service.js +3 -1
  74. package/dist/server/src/utils/json-utils.d.ts +9 -0
  75. package/dist/server/src/utils/json-utils.d.ts.map +1 -1
  76. package/dist/server/src/utils/json-utils.js +19 -0
  77. package/dist/server/src/utils/logger/index.d.ts +1 -1
  78. package/dist/server/src/utils/logger/index.d.ts.map +1 -1
  79. package/dist/server/src/utils/logger/index.js +1 -1
  80. package/dist/server/src/utils/logger/log-context.d.ts +1 -0
  81. package/dist/server/src/utils/logger/log-context.d.ts.map +1 -1
  82. package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -1
  83. package/dist/server/src/utils/logger/log-formatter.js +25 -11
  84. package/dist/server/src/utils/logger/log-output.d.ts +17 -1
  85. package/dist/server/src/utils/logger/log-output.d.ts.map +1 -1
  86. package/dist/server/src/utils/logger/log-output.js +46 -40
  87. package/dist/server/src/utils/logger/logger.d.ts.map +1 -1
  88. package/dist/server/src/utils/logger/logger.js +18 -2
  89. package/dist/server/src/utils/request-context.d.ts +8 -70
  90. package/dist/server/src/utils/request-context.d.ts.map +1 -1
  91. package/dist/server/src/utils/request-context.js +11 -70
  92. package/dist/server/tests/unit/config/config.schema.test.js +2 -1
  93. package/dist/server/tests/unit/server/runner.test.js +14 -7
  94. package/dist/server/tests/unit/services/gateway-session-mode.test.d.ts +2 -0
  95. package/dist/server/tests/unit/services/gateway-session-mode.test.d.ts.map +1 -0
  96. package/dist/server/tests/unit/services/gateway-session-mode.test.js +174 -0
  97. package/dist/server/tests/unit/services/hub-tools.service.test.js +4 -4
  98. package/dist/server/tests/unit/utils/config.test.js +14 -7
  99. package/dist/server/tests/unit/utils/log-output.test.d.ts +2 -0
  100. package/dist/server/tests/unit/utils/log-output.test.d.ts.map +1 -0
  101. package/dist/server/tests/unit/utils/log-output.test.js +198 -0
  102. package/dist/server/vitest.config.d.ts.map +1 -1
  103. package/dist/server/vitest.config.js +0 -2
  104. package/package.json +1 -1
  105. package/dist/client/assets/ResourcesView-CU0VbNy5.js +0 -1
  106. package/dist/client/assets/ServerDetail-bcQ8BVXR.js +0 -2
  107. package/dist/client/assets/SettingsView-B1DxbFP3.js +0 -1
  108. package/dist/client/assets/ToolCallDialog-DEapCO06.js +0 -1
  109. package/dist/client/assets/ToolsView-DA0u_bCw.js +0 -1
  110. package/dist/client/assets/_baseClone-B991Lvrt.js +0 -1
  111. package/dist/client/assets/el-input-5YzZrwir.js +0 -1
  112. package/dist/client/assets/el-loading-DE3FcxNH.js +0 -1
  113. package/dist/client/assets/el-overlay-BTeTueuN.js +0 -1
  114. package/dist/client/assets/el-radio-group-Y1E2bxIW.js +0 -1
  115. package/dist/client/assets/el-skeleton-item-DhgR50Jx.js +0 -1
  116. package/dist/client/assets/el-switch-fF--nMSD.js +0 -1
  117. package/dist/client/assets/el-tab-pane-rvS_KTwP.js +0 -1
  118. package/dist/client/assets/el-table-column-B1O8mY47.js +0 -1
  119. package/dist/client/assets/index-DkqV9kH4.js +0 -2
  120. package/dist/client/assets/raf-Cj-gATZv.js +0 -1
@@ -1,104 +1,15 @@
1
- import { mcpSessionManager } from '../../services/session/index.js';
2
- import { logger, LOG_MODULES } from '../../utils/logger.js';
3
- /**
4
- * Session Management API Routes
5
- *
6
- * Provides comprehensive session management endpoints for the MCP Hub Lite system's persistent session storage.
7
- * This module enables administrators and clients to monitor, inspect, and manage active and persisted sessions
8
- * that maintain client connection state across service restarts.
9
- *
10
- * Sessions store critical client context including connection metadata, working directories, project information,
11
- * and other state that enables seamless reconnection and continuity of operations. The session persistence
12
- * feature ensures that client connections can be restored even after service interruptions.
13
- *
14
- * Key features include:
15
- * - Listing all persisted sessions with metadata
16
- * - Detailed session inspection by session ID
17
- * - Session deletion for cleanup and maintenance
18
- * - Integration with the MCP session manager for consistency
19
- *
20
- * @param fastify - The Fastify instance to register routes on
21
- * @returns Promise that resolves when all routes are registered
22
- *
23
- * @example
24
- * ```typescript
25
- * // Register session management routes
26
- * await webSessionRoutes(app);
27
- * ```
28
- */
29
- export async function webSessionRoutes(fastify) {
30
- /**
31
- * List all persisted sessions
32
- */
1
+ import { logger } from '../../utils/logger/index.js';
2
+ import { LOG_MODULES } from '../../utils/logger/log-modules.js';
3
+ import { sessionManager } from '../../services/gateway/session-manager.js';
4
+ export async function webSessionsRoutes(fastify) {
33
5
  fastify.get('/web/sessions', async (_request, reply) => {
34
6
  try {
35
- const sessions = mcpSessionManager.getAllSessionStates();
36
- return reply.send({
37
- success: true,
38
- data: sessions,
39
- count: sessions.length
40
- });
7
+ const sessions = sessionManager.getAllSessions();
8
+ return { sessions };
41
9
  }
42
10
  catch (error) {
43
- logger.error('Failed to get sessions:', error, LOG_MODULES.SESSION_API);
44
- return reply.code(500).send({
45
- success: false,
46
- error: 'Failed to get sessions'
47
- });
48
- }
49
- });
50
- /**
51
- * Get a specific session by ID
52
- */
53
- fastify.get('/web/sessions/:sessionId', async (request, reply) => {
54
- try {
55
- const { sessionId } = request.params;
56
- const session = mcpSessionManager.getSessionState(sessionId);
57
- if (!session) {
58
- return reply.code(404).send({
59
- success: false,
60
- error: 'Session not found'
61
- });
62
- }
63
- return reply.send({
64
- success: true,
65
- data: session
66
- });
67
- }
68
- catch (error) {
69
- logger.error('Failed to get session:', error, LOG_MODULES.SESSION_API);
70
- return reply.code(500).send({
71
- success: false,
72
- error: 'Failed to get session'
73
- });
74
- }
75
- });
76
- /**
77
- * Delete a session
78
- */
79
- fastify.delete('/web/sessions/:sessionId', async (request, reply) => {
80
- try {
81
- const { sessionId } = request.params;
82
- logger.info(`Deleting session: ${sessionId}`, LOG_MODULES.SESSION_API);
83
- const existed = await mcpSessionManager.deleteSession(sessionId);
84
- if (!existed) {
85
- return reply.code(404).send({
86
- success: false,
87
- error: 'Session not found'
88
- });
89
- }
90
- logger.info(`Session deleted successfully: ${sessionId}`, LOG_MODULES.SESSION_API);
91
- return reply.send({
92
- success: true,
93
- message: 'Session deleted successfully'
94
- });
95
- }
96
- catch (error) {
97
- logger.error('Failed to delete session:', error, LOG_MODULES.SESSION_API);
98
- return reply.code(500).send({
99
- success: false,
100
- error: 'Failed to delete session'
101
- });
11
+ logger.error('Failed to retrieve sessions:', error, LOG_MODULES.GATEWAY);
12
+ return reply.code(500).send({ error: 'Internal Server Error' });
102
13
  }
103
14
  });
104
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/app.ts"],"names":[],"mappings":"AAmCA,uDAAuD;AACvD,wBAAgB,kBAAkB;;;;;EAQjC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,QAAQ,mWAyJ7B"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/app.ts"],"names":[],"mappings":"AAqCA,uDAAuD;AACvD,wBAAgB,kBAAkB;;;;;EAQjC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,QAAQ,mWA6J7B"}
@@ -6,6 +6,7 @@ import { configManager } from './config/config-manager.js';
6
6
  import { setJsonPrettyConfigGetter } from './utils/json-utils.js';
7
7
  import { isIpAllowed } from './utils/network-security.js';
8
8
  import { logger, LOG_MODULES } from './utils/logger/index.js';
9
+ import { initGlobalTransport } from './services/gateway/global-transport.js';
9
10
  // MCP Protocol Routes
10
11
  import { mcpGatewayRoutes } from './api/mcp/gateway.js';
11
12
  // Web API Routes
@@ -17,6 +18,7 @@ import { configRoutes } from './api/web/config.js';
17
18
  import { webLogRoutes } from './api/web/logs.js';
18
19
  import { webHubToolsRoutes } from './api/web/hub-tools.js';
19
20
  import { webResourceRoutes } from './api/web/resources.js';
21
+ import { webSessionsRoutes } from './api/web/sessions.js';
20
22
  // WebSocket Routes
21
23
  import { webSocketRoutes } from './api/ws/events.js';
22
24
  // Get __dirname equivalent in ESM
@@ -153,6 +155,8 @@ export async function buildApp() {
153
155
  }
154
156
  done();
155
157
  });
158
+ // Initialize singleton MCP transport before registering routes
159
+ await initGlobalTransport();
156
160
  // Register API routes first (before static files)
157
161
  fastify.register(mcpGatewayRoutes);
158
162
  fastify.register(webServerRoutes);
@@ -163,6 +167,7 @@ export async function buildApp() {
163
167
  fastify.register(webLogRoutes);
164
168
  fastify.register(webHubToolsRoutes);
165
169
  fastify.register(webResourceRoutes);
170
+ fastify.register(webSessionsRoutes);
166
171
  fastify.register(webSocketRoutes);
167
172
  // Serve static files from dist/client (frontend build output)
168
173
  const clientPath = path.join(__dirname, '../../client');
@@ -136,6 +136,39 @@ function printFormattedStatus(status) {
136
136
  // Then display disconnected servers
137
137
  displayServerList(disconnectedServers, 'MCP Servers (Disconnected):', red);
138
138
  }
139
+ // Sessions section
140
+ if (status.sessions !== undefined) {
141
+ console.log('');
142
+ console.log(`${yellow}👥 Active MCP Sessions:${reset}`);
143
+ console.log(`${dim}══════════════════════════════${reset}`);
144
+ if (status.sessions.length === 0) {
145
+ console.log(`${dim} No active sessions${reset}`);
146
+ }
147
+ else {
148
+ let maxSidLen = 'Session ID'.length;
149
+ let maxClientLen = 'Client'.length;
150
+ let maxVerLen = 'Version'.length;
151
+ for (const s of status.sessions) {
152
+ maxSidLen = Math.max(maxSidLen, (s.sessionId || '').length);
153
+ maxClientLen = Math.max(maxClientLen, (s.clientName || '').length);
154
+ const ver = s.protocolVersion || '';
155
+ maxVerLen = Math.max(maxVerLen, ver.length);
156
+ }
157
+ const headerSid = 'Session ID'.padEnd(maxSidLen);
158
+ const headerClient = 'Client'.padEnd(maxClientLen);
159
+ const headerVer = 'Version'.padEnd(maxVerLen);
160
+ console.log(`${cyan}${headerSid} ${headerClient} ${headerVer} SSE${reset}`);
161
+ console.log(`${dim}${'─'.repeat(maxSidLen + maxClientLen + maxVerLen + 10)}${reset}`);
162
+ for (const s of status.sessions) {
163
+ const sid = (s.sessionId || '').padEnd(maxSidLen);
164
+ const client = (s.clientName || '').padEnd(maxClientLen);
165
+ const ver = (s.protocolVersion || '').padEnd(maxVerLen);
166
+ const sse = s.activeSseCount.toString().padStart(3);
167
+ console.log(`${sid} ${client} ${ver} ${sse}`);
168
+ }
169
+ console.log(`${dim} Total: ${status.sessions.length} active session(s)${reset}`);
170
+ }
171
+ }
139
172
  // MCP Client Configuration
140
173
  console.log('');
141
174
  console.log(`${yellow}🔌 MCP Client Configuration:${reset}`);
@@ -145,10 +178,15 @@ function printFormattedStatus(status) {
145
178
  console.log(`${dim}{${reset}`);
146
179
  console.log(`${dim} "mcpServers": {${reset}`);
147
180
  console.log(`${dim} "mcp-hub-lite": {${reset}`);
148
- console.log(`${dim} "url": "${cyan}${mcpEndpoint}${dim}"${reset}`);
181
+ console.log(`${dim} "url": "${cyan}${mcpEndpoint}${dim}",${reset}`);
182
+ console.log(`${dim} "headers": {${reset}`);
183
+ console.log(`${dim} "x-mcp-session-mode": "${cyan}stateful${dim}"${reset}`);
184
+ console.log(`${dim} }${reset}`);
149
185
  console.log(`${dim} }${reset}`);
150
186
  console.log(`${dim} }${reset}`);
151
187
  console.log(`${dim}}${reset}`);
188
+ console.log('');
189
+ console.log(`${dim}💡 Use ${cyan}"stateful"${dim} for session persistence / SSE, ${cyan}"stateless"${dim} for per-request mode${reset}`);
152
190
  // Quick Commands
153
191
  console.log('');
154
192
  console.log(`${yellow}💡 Quick Commands:${reset}`);
@@ -1,11 +1,3 @@
1
1
  import { Command } from 'commander';
2
- /**
3
- * CLI command for displaying the use guide in Markdown format.
4
- *
5
- * This command outputs the CLI usage guide, similar to how MCP Hub Lite
6
- * provides a use-guide resource for MCP protocol usage.
7
- *
8
- * @returns {Command} The configured use-guide command instance for registration with Commander.js
9
- */
10
2
  export declare const useGuideCommand: Command;
11
3
  //# sourceMappingURL=use-guide.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-guide.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/use-guide.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmKpC;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,SAKxB,CAAC"}
1
+ {"version":3,"file":"use-guide.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/use-guide.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BpC,eAAO,MAAM,eAAe,SAKxB,CAAC"}
@@ -1,175 +1,33 @@
1
1
  import { Command } from 'commander';
2
- /**
3
- * CLI use guide content
4
- */
5
- const USE_GUIDE_CONTENT = `# MCP Hub Lite CLI Use Guide
6
-
7
- ## Overview
8
-
9
- MCP Hub Lite CLI provides command-line interface for managing MCP servers. This guide covers CLI-specific usage only.
10
-
11
- ## Commands
12
-
13
- ### start
14
-
15
- Start the MCP Hub Lite server.
16
-
17
- \`\`\`bash
18
- # Start in daemon mode (default)
19
- mcp-hub-lite start
20
-
21
- # Start in foreground mode
22
- mcp-hub-lite start --foreground
23
-
24
- # Start with custom port
25
- mcp-hub-lite start --port 8080
26
- \`\`\`
27
-
28
- ### stop
29
-
30
- Stop the running MCP Hub Lite server.
31
-
32
- \`\`\`bash
33
- mcp-hub-lite stop
34
- \`\`\`
35
-
36
- ### status
37
-
38
- Display server status and connected MCP servers.
39
-
40
- \`\`\`bash
41
- mcp-hub-lite status
42
- \`\`\`
43
-
44
- ### ui
45
-
46
- Open the web UI in default browser.
47
-
48
- \`\`\`bash
49
- mcp-hub-lite ui
50
- \`\`\`
51
-
52
- ### list
53
-
54
- List all configured MCP servers.
55
-
56
- \`\`\`bash
57
- mcp-hub-lite list
58
- \`\`\`
59
-
60
- ### restart
61
-
62
- Restart the MCP Hub Lite server.
63
-
64
- \`\`\`bash
65
- mcp-hub-lite restart
66
- \`\`\`
67
-
68
- ### install
69
-
70
- Add a new MCP server to MCP Hub Lite.
71
-
72
- **Parametric Mode:**
73
-
74
- \`\`\`bash
75
- # stdio server
76
- mcp-hub-lite install github-mcp "npx github-mcp" --env API_KEY=xxx
77
-
78
- # HTTP server
79
- mcp-hub-lite install api-server https://api.example.com/mcp -t streamable-http -H "Authorization: Bearer xxx"
80
- \`\`\`
81
-
82
- **JSON Mode:**
83
-
84
- \`\`\`bash
85
- # stdio server
86
- mcp-hub-lite install --json '{"name":"github-mcp","type":"stdio","command":"npx github-mcp","env":{"API_KEY":"xxx"}}'
87
-
88
- # HTTP server
89
- mcp-hub-lite install --json '{"name":"api-server","type":"streamable-http","url":"https://api.example.com/mcp","headers":{"Authorization":"Bearer xxx"}}'
90
- \`\`\`
91
-
92
- **Options:**
93
-
94
- | Option | Description |
95
- | -------------------------- | ------------------------------------------------------------ |
96
- | \`-t, --transport <type>\` | Transport type: stdio, sse, streamable-http (default: stdio) |
97
- | \`-e, --env <env...>\` | Environment variables (KEY=VALUE) |
98
- | \`-H, --header <header...>\` | HTTP headers (Header-Key: Value) |
99
- | \`--timeout <seconds>\` | Timeout in seconds (default: 60) |
100
- | \`--strategy <strategy>\` | Instance selection: random, round-robin, tag-match-unique |
101
- | \`-a, --auto-start\` | Auto-start server (default: true) |
102
- | \`--no-auto-start\` | Disable auto-start |
103
- | \`-d, --description <desc>\` | Server description |
104
-
105
- **JSON Config Fields:**
106
-
107
- | Field | Required | Description |
108
- | --------------------------- | ----------- | ------------------------------- |
109
- | \`name\` | Yes | Server name |
110
- | \`type\` | No | Transport type (default: stdio) |
111
- | \`command\` | Yes (stdio) | Command to execute |
112
- | \`url\` | Yes (HTTP) | Server URL |
113
- | \`args\` | No | Command arguments |
114
- | \`env\` | No | Environment variables object |
115
- | \`headers\` | No | HTTP headers object |
116
- | \`timeout\` | No | Timeout in seconds |
117
- | \`enabled\` | No | Auto-start enabled |
118
- | \`description\` | No | Server description |
119
- | \`instanceSelectionStrategy\` | No | Instance selection strategy |
120
-
121
- ### tool-use
122
-
123
- Manage MCP server tools via API.
124
-
125
- \`\`\`bash
126
- # List all connected servers
127
- mcp-hub-lite tool-use list-servers
128
-
129
- # List system tools
130
- mcp-hub-lite tool-use list-tools
131
-
132
- # List tools from specific server
133
- mcp-hub-lite tool-use list-tools --server baidu-search
134
-
135
- # Get tool schema
136
- mcp-hub-lite tool-use get-tool --tool list_tools
137
-
138
- # Call a tool
139
- mcp-hub-lite tool-use call-tool --tool search --server baidu-search --args '{"query":"天气"}'
140
- \`\`\`
141
-
142
- **Options:**
143
-
144
- | Option | Description |
145
- | ----------------- | ------------------------------------------- |
146
- | \`--server <name>\` | Server name (default: mcp-hub-lite) |
147
- | \`--tool <name>\` | Tool name (required for get-tool/call-tool) |
148
- | \`--args <json>\` | Tool arguments JSON |
149
- | \`--tags <json>\` | Instance selection tags |
150
-
151
- **JSON Merge Form:**
152
-
153
- \`\`\`bash
154
- # All parameters in one JSON
155
- mcp-hub-lite tool-use call-tool --args '{"server":"baidu-search","tool":"search","query":"天气"}'
156
- \`\`\`
157
-
158
- ---
159
-
160
- _Last updated: 2026-04-20_
161
- `;
162
- /**
163
- * CLI command for displaying the use guide in Markdown format.
164
- *
165
- * This command outputs the CLI usage guide, similar to how MCP Hub Lite
166
- * provides a use-guide resource for MCP protocol usage.
167
- *
168
- * @returns {Command} The configured use-guide command instance for registration with Commander.js
169
- */
2
+ import { fileURLToPath } from 'url';
3
+ import { dirname, join } from 'path';
4
+ import fs from 'fs';
5
+ import { getConfigManager } from '../../config/config-manager.js';
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = dirname(__filename);
8
+ const USE_GUIDE_PATH_ZH = join(__dirname, '../../services/hub-tools/use-guide-zh.md');
9
+ const USE_GUIDE_PATH_EN = join(__dirname, '../../services/hub-tools/use-guide-en.md');
10
+ function loadUseGuideContent() {
11
+ let language = 'en';
12
+ try {
13
+ const configManager = getConfigManager();
14
+ const config = configManager.getConfig();
15
+ language = config.system.language;
16
+ }
17
+ catch {
18
+ // Config not available, use default English
19
+ }
20
+ const path = language === 'zh' ? USE_GUIDE_PATH_ZH : USE_GUIDE_PATH_EN;
21
+ try {
22
+ return fs.readFileSync(path, 'utf-8');
23
+ }
24
+ catch {
25
+ return '# MCP Hub Lite Use Guide\n\nThe use guide is currently unavailable.\n';
26
+ }
27
+ }
170
28
  export const useGuideCommand = new Command('use-guide')
171
- .description('Output CLI usage guide in Markdown format')
29
+ .description('Output usage guide in Markdown format')
172
30
  .action(() => {
173
- process.stdout.write(USE_GUIDE_CONTENT);
31
+ process.stdout.write(loadUseGuideContent());
174
32
  process.exit(0);
175
33
  });
@@ -17,6 +17,15 @@ interface McpServerStatus {
17
17
  resourcesCount: number;
18
18
  error?: string;
19
19
  }
20
+ export interface SessionInfo {
21
+ sessionId: string;
22
+ clientName?: string;
23
+ clientVersion?: string;
24
+ protocolVersion?: string;
25
+ createdAt: string;
26
+ lastAccessedAt: string;
27
+ activeSseCount: number;
28
+ }
20
29
  export interface EnhancedServerStatus {
21
30
  running: boolean;
22
31
  pid?: string;
@@ -25,6 +34,7 @@ export interface EnhancedServerStatus {
25
34
  message?: string;
26
35
  pidFilePath: string;
27
36
  mcpServers?: McpServerStatus[];
37
+ sessions?: SessionInfo[];
28
38
  }
29
39
  /**
30
40
  * Starts the MCP Hub Lite server with the specified configuration options.
@@ -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,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"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../../src/cli/server.ts"],"names":[],"mappings":"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"}
@@ -123,13 +123,15 @@ export async function getServerStatus(pid) {
123
123
  process.kill(parseInt(actualPid), 0); // Signal 0 just checks if process exists
124
124
  // Try to fetch runtime status via HTTP API
125
125
  const mcpServers = await fetchRuntimeStatus(host, port);
126
+ const sessions = await fetchSessionStatus(host, port);
126
127
  return {
127
128
  running: true,
128
129
  pid: actualPid,
129
130
  host,
130
131
  port,
131
132
  pidFilePath,
132
- mcpServers
133
+ mcpServers,
134
+ sessions
133
135
  };
134
136
  }
135
137
  catch {
@@ -187,6 +189,34 @@ async function fetchRuntimeStatus(host, port) {
187
189
  return undefined;
188
190
  }
189
191
  }
192
+ /**
193
+ * Fetches active session information from the running server via HTTP API.
194
+ *
195
+ * @param host - The host address to connect to
196
+ * @param port - The port number to connect to
197
+ * @returns Promise with array of session info, or undefined if API call fails
198
+ */
199
+ async function fetchSessionStatus(host, port) {
200
+ try {
201
+ const controller = new AbortController();
202
+ const timeoutId = setTimeout(() => controller.abort(), 500);
203
+ const response = await fetch(`http://${host}:${port}/web/sessions`, {
204
+ signal: controller.signal,
205
+ headers: {
206
+ Accept: 'application/json'
207
+ }
208
+ });
209
+ clearTimeout(timeoutId);
210
+ if (!response.ok) {
211
+ return undefined;
212
+ }
213
+ const data = (await response.json());
214
+ return data.sessions;
215
+ }
216
+ catch {
217
+ return undefined;
218
+ }
219
+ }
190
220
  /**
191
221
  * Restarts the MCP Hub Lite server with the same configuration options.
192
222
  *
@@ -2,6 +2,7 @@ import { buildApp } from '../app.js';
2
2
  import { configManager } from '../config/config-manager.js';
3
3
  import { logger, LOG_MODULES } from '../utils/logger/index.js';
4
4
  import { mcpConnectionManager } from '../services/connection/index.js';
5
+ import { sessionManager } from '../services/gateway/session-manager.js';
5
6
  import { PidManager } from '../pid/manager.js';
6
7
  import { collectConnectTasks, executeConnectTasks, ensureServerInstances } from './startup.js';
7
8
  // Set log level to debug for development server
@@ -130,6 +131,7 @@ async function startDevServer() {
130
131
  const shutdown = async (signal) => {
131
132
  logger.info(`Received ${signal}, shutting down gracefully...`, LOG_MODULES.DEV_SERVER);
132
133
  try {
134
+ sessionManager.shutdownAll();
133
135
  await mcpConnectionManager.disconnectAll();
134
136
  if (app) {
135
137
  await app.close();
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/server/runner.ts"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,iBAuD7E"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/server/runner.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,iBAwD7E"}
@@ -4,6 +4,7 @@ import { logger } from '../utils/logger/index.js';
4
4
  import { LOG_MODULES } from '../utils/logger/log-modules.js';
5
5
  import { setJsonPrettyConfigGetter } from '../utils/json-utils.js';
6
6
  import { mcpConnectionManager } from '../services/connection/index.js';
7
+ import { sessionManager } from '../services/gateway/session-manager.js';
7
8
  import { PidManager } from '../pid/manager.js';
8
9
  import { checkPortWithExit } from '../utils/port-checker.js';
9
10
  import { collectConnectTasks, executeConnectTasks, ensureServerInstances } from './startup.js';
@@ -62,6 +63,7 @@ export async function runServer(options = {}) {
62
63
  const shutdown = async (signal) => {
63
64
  logger.info(`Received ${signal}, shutting down...`, LOG_MODULES.SERVER);
64
65
  try {
66
+ sessionManager.shutdownAll();
65
67
  await mcpConnectionManager.disconnectAll();
66
68
  if (app) {
67
69
  await app.close();
@@ -115,6 +115,8 @@ export declare class McpConnectionManager {
115
115
  private publishConnectionEvents;
116
116
  /**
117
117
  * Refreshes server tools and resources (only for bidirectional transports).
118
+ *
119
+ * @param skipResources - Skip resources/list request when server doesn't support resources capability
118
120
  */
119
121
  private refreshServerResources;
120
122
  /**
@@ -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;AAanE,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;IAgInB;;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;IA6G3B;;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;IAiBpC;;;OAGG;YACW,wBAAwB;IAoBtC;;;;;;OAMG;YACW,eAAe;IA0E7B;;OAEG;YACW,qBAAqB;IA0BnC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA0C1B;;;;;;;;;;;;;;;;;;;;;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;;;;OAIG;IACI,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE;IAmBxD;;;;;;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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAanE,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;IAsInB;;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;IAgH3B;;OAEG;YACW,yBAAyB;IAgBvC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAuB7B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAgB/B;;;;OAIG;YACW,sBAAsB;IAqBpC;;;OAGG;YACW,wBAAwB;IAoBtC;;;;;;OAMG;YACW,eAAe;IA0E7B;;OAEG;YACW,qBAAqB;IA0BnC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA0C1B;;;;;;;;;;;;;;;;;;;;;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;;;;OAIG;IACI,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE;IAmBxD;;;;;;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"}
@@ -147,10 +147,15 @@ export class McpConnectionManager {
147
147
  this.updateConnectedStatus(compositeKey, client, pid);
148
148
  // 9. Publish connection events
149
149
  this.publishConnectionEvents(serverName, serverIndex);
150
- // 10. Refresh resources
151
- await this.refreshServerResources(serverName, serverIndex);
152
- // 11. Request log notifications from downstream server
153
- await this.requestLoggingFromServer(compositeKey, client);
150
+ // 10. Refresh tools and resources (skip resources if server capability is absent)
151
+ const capabilities = typeof client.getServerCapabilities === 'function'
152
+ ? client.getServerCapabilities()
153
+ : undefined;
154
+ await this.refreshServerResources(serverName, serverIndex, !capabilities?.resources);
155
+ // 11. Request log notifications from downstream server (only if logging capability present)
156
+ if (capabilities?.logging) {
157
+ await this.requestLoggingFromServer(compositeKey, client);
158
+ }
154
159
  return true;
155
160
  }
156
161
  catch (error) {
@@ -256,7 +261,7 @@ export class McpConnectionManager {
256
261
  transport.send = async (message, options) => {
257
262
  try {
258
263
  const logMessage = formatMcpMessageForLogging(message);
259
- logger.debug(`MCP message sent: ${logMessage}`, LOG_MODULES.CONNECTION_MANAGER);
264
+ logger.debug(`MCP message sent to [${compositeKey}]: ${logMessage}`, LOG_MODULES.CONNECTION_MANAGER);
260
265
  }
261
266
  catch {
262
267
  logger.debug(`MCP message sent: [Error formatting response]`, LOG_MODULES.CONNECTION_MANAGER);
@@ -379,10 +384,12 @@ export class McpConnectionManager {
379
384
  }
380
385
  /**
381
386
  * Refreshes server tools and resources (only for bidirectional transports).
387
+ *
388
+ * @param skipResources - Skip resources/list request when server doesn't support resources capability
382
389
  */
383
- async refreshServerResources(serverName, serverIndex) {
390
+ async refreshServerResources(serverName, serverIndex, skipResources = false) {
384
391
  const tools = await this.refreshTools(serverName, serverIndex);
385
- const resources = await this.refreshResources(serverName, serverIndex);
392
+ const resources = skipResources ? [] : await this.refreshResources(serverName, serverIndex);
386
393
  eventBus.publish(EventTypes.TOOLS_UPDATED, {
387
394
  serverName,
388
395
  serverIndex,
@@ -53,6 +53,19 @@ export declare class GatewayService {
53
53
  * @returns {McpServer} New MCP server instance with all handlers registered
54
54
  */
55
55
  createConnectionServer(): McpServer;
56
+ /**
57
+ * Returns the singleton McpServer instance used for HTTP transport.
58
+ */
59
+ getServer(): McpServer;
60
+ /**
61
+ * Subscribes to EventBus events and pushes MCP notifications
62
+ * (notifications/resources/list_changed, notifications/tools/list_changed)
63
+ * to connected SSE clients via the singleton transport.
64
+ *
65
+ * Tools are aggregated by ServerName (multi-instance deduplication).
66
+ * Resources are per-instance (Category 1: hub://servers/{name}, Category 2: hub://servers/{name}/{idx}/{path}).
67
+ */
68
+ private initNotifications;
56
69
  /**
57
70
  * Starts the MCP gateway service on stdio transport.
58
71
  *