@1mcp/agent 0.15.0 → 0.17.0
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/README.md +115 -14
- package/build/commands/app/backups.d.ts +17 -0
- package/build/commands/app/backups.d.ts.map +1 -0
- package/build/commands/app/backups.js +162 -0
- package/build/commands/app/backups.js.map +1 -0
- package/build/commands/app/consolidate.d.ts +21 -0
- package/build/commands/app/consolidate.d.ts.map +1 -0
- package/build/commands/app/consolidate.js +383 -0
- package/build/commands/app/consolidate.js.map +1 -0
- package/build/commands/app/discover.d.ts +16 -0
- package/build/commands/app/discover.d.ts.map +1 -0
- package/build/commands/app/discover.js +79 -0
- package/build/commands/app/discover.js.map +1 -0
- package/build/commands/app/index.d.ts +12 -0
- package/build/commands/app/index.d.ts.map +1 -0
- package/build/commands/app/index.js +274 -0
- package/build/commands/app/index.js.map +1 -0
- package/build/commands/app/list.d.ts +16 -0
- package/build/commands/app/list.d.ts.map +1 -0
- package/build/commands/app/list.js +95 -0
- package/build/commands/app/list.js.map +1 -0
- package/build/commands/app/restore.d.ts +21 -0
- package/build/commands/app/restore.d.ts.map +1 -0
- package/build/commands/app/restore.js +265 -0
- package/build/commands/app/restore.js.map +1 -0
- package/build/commands/app/status.d.ts +16 -0
- package/build/commands/app/status.d.ts.map +1 -0
- package/build/commands/app/status.js +224 -0
- package/build/commands/app/status.js.map +1 -0
- package/build/commands/mcp/add.d.ts +19 -0
- package/build/commands/mcp/add.d.ts.map +1 -0
- package/build/commands/mcp/add.js +135 -0
- package/build/commands/mcp/add.js.map +1 -0
- package/build/commands/mcp/enable.d.ts +13 -0
- package/build/commands/mcp/enable.d.ts.map +1 -0
- package/build/commands/mcp/enable.js +100 -0
- package/build/commands/mcp/enable.js.map +1 -0
- package/build/commands/mcp/index.d.ts +12 -0
- package/build/commands/mcp/index.d.ts.map +1 -0
- package/build/commands/mcp/index.js +351 -0
- package/build/commands/mcp/index.js.map +1 -0
- package/build/commands/mcp/list.d.ts +11 -0
- package/build/commands/mcp/list.d.ts.map +1 -0
- package/build/commands/mcp/list.js +144 -0
- package/build/commands/mcp/list.js.map +1 -0
- package/build/commands/mcp/remove.d.ts +10 -0
- package/build/commands/mcp/remove.d.ts.map +1 -0
- package/build/commands/mcp/remove.js +89 -0
- package/build/commands/mcp/remove.js.map +1 -0
- package/build/commands/mcp/status.d.ts +10 -0
- package/build/commands/mcp/status.d.ts.map +1 -0
- package/build/commands/mcp/status.js +243 -0
- package/build/commands/mcp/status.js.map +1 -0
- package/build/commands/mcp/update.d.ts +18 -0
- package/build/commands/mcp/update.d.ts.map +1 -0
- package/build/commands/mcp/update.js +157 -0
- package/build/commands/mcp/update.js.map +1 -0
- package/build/commands/mcp/utils/configUtils.d.ts +64 -0
- package/build/commands/mcp/utils/configUtils.d.ts.map +1 -0
- package/build/commands/mcp/utils/configUtils.js +266 -0
- package/build/commands/mcp/utils/configUtils.js.map +1 -0
- package/build/commands/mcp/utils/doubleHyphenParser.d.ts +32 -0
- package/build/commands/mcp/utils/doubleHyphenParser.d.ts.map +1 -0
- package/build/commands/mcp/utils/doubleHyphenParser.js +61 -0
- package/build/commands/mcp/utils/doubleHyphenParser.js.map +1 -0
- package/build/commands/mcp/utils/validation.d.ts +33 -0
- package/build/commands/mcp/utils/validation.d.ts.map +1 -0
- package/build/commands/mcp/utils/validation.js +235 -0
- package/build/commands/mcp/utils/validation.js.map +1 -0
- package/build/constants.d.ts +12 -2
- package/build/constants.d.ts.map +1 -1
- package/build/constants.js +16 -2
- package/build/constants.js.map +1 -1
- package/build/core/capabilities/asyncLoadingOrchestrator.d.ts +96 -0
- package/build/core/capabilities/asyncLoadingOrchestrator.d.ts.map +1 -0
- package/build/core/capabilities/asyncLoadingOrchestrator.js +256 -0
- package/build/core/capabilities/asyncLoadingOrchestrator.js.map +1 -0
- package/build/core/capabilities/capabilityAggregator.d.ts +114 -0
- package/build/core/capabilities/capabilityAggregator.d.ts.map +1 -0
- package/build/core/capabilities/capabilityAggregator.js +234 -0
- package/build/core/capabilities/capabilityAggregator.js.map +1 -0
- package/build/core/client/clientManager.d.ts +28 -0
- package/build/core/client/clientManager.d.ts.map +1 -1
- package/build/core/client/clientManager.js +120 -0
- package/build/core/client/clientManager.js.map +1 -1
- package/build/core/loading/loadingStateTracker.d.ts +128 -0
- package/build/core/loading/loadingStateTracker.d.ts.map +1 -0
- package/build/core/loading/loadingStateTracker.js +209 -0
- package/build/core/loading/loadingStateTracker.js.map +1 -0
- package/build/core/loading/mcpLoadingManager.d.ts +139 -0
- package/build/core/loading/mcpLoadingManager.d.ts.map +1 -0
- package/build/core/loading/mcpLoadingManager.js +296 -0
- package/build/core/loading/mcpLoadingManager.js.map +1 -0
- package/build/core/notifications/notificationManager.d.ts +111 -0
- package/build/core/notifications/notificationManager.d.ts.map +1 -0
- package/build/core/notifications/notificationManager.js +232 -0
- package/build/core/notifications/notificationManager.js.map +1 -0
- package/build/core/server/agentConfig.d.ts +59 -0
- package/build/core/server/agentConfig.d.ts.map +1 -1
- package/build/core/server/agentConfig.js +82 -1
- package/build/core/server/agentConfig.js.map +1 -1
- package/build/core/server/serverManager.d.ts +1 -0
- package/build/core/server/serverManager.d.ts.map +1 -1
- package/build/core/server/serverManager.js +3 -0
- package/build/core/server/serverManager.js.map +1 -1
- package/build/index.js +123 -31
- package/build/index.js.map +1 -1
- package/build/server.d.ts +23 -2
- package/build/server.d.ts.map +1 -1
- package/build/server.js +83 -10
- package/build/server.js.map +1 -1
- package/build/services/healthService.d.ts +107 -0
- package/build/services/healthService.d.ts.map +1 -0
- package/build/services/healthService.js +294 -0
- package/build/services/healthService.js.map +1 -0
- package/build/transport/http/middlewares/mcpAvailabilityMiddleware.d.ts +79 -0
- package/build/transport/http/middlewares/mcpAvailabilityMiddleware.d.ts.map +1 -0
- package/build/transport/http/middlewares/mcpAvailabilityMiddleware.js +243 -0
- package/build/transport/http/middlewares/mcpAvailabilityMiddleware.js.map +1 -0
- package/build/transport/http/routes/healthRoutes.d.ts +8 -0
- package/build/transport/http/routes/healthRoutes.d.ts.map +1 -0
- package/build/transport/http/routes/healthRoutes.js +282 -0
- package/build/transport/http/routes/healthRoutes.js.map +1 -0
- package/build/transport/http/routes/sseRoutes.d.ts +2 -1
- package/build/transport/http/routes/sseRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/sseRoutes.js +13 -1
- package/build/transport/http/routes/sseRoutes.js.map +1 -1
- package/build/transport/http/routes/streamableHttpRoutes.d.ts +2 -1
- package/build/transport/http/routes/streamableHttpRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/streamableHttpRoutes.js +13 -1
- package/build/transport/http/routes/streamableHttpRoutes.js.map +1 -1
- package/build/transport/http/server.d.ts +7 -1
- package/build/transport/http/server.d.ts.map +1 -1
- package/build/transport/http/server.js +17 -3
- package/build/transport/http/server.js.map +1 -1
- package/build/transport/transportFactory.d.ts +4 -0
- package/build/transport/transportFactory.d.ts.map +1 -1
- package/build/transport/transportFactory.js +1 -1
- package/build/transport/transportFactory.js.map +1 -1
- package/build/utils/appDiscovery.d.ts +75 -0
- package/build/utils/appDiscovery.d.ts.map +1 -0
- package/build/utils/appDiscovery.js +358 -0
- package/build/utils/appDiscovery.js.map +1 -0
- package/build/utils/appPresets.d.ts +88 -0
- package/build/utils/appPresets.d.ts.map +1 -0
- package/build/utils/appPresets.js +430 -0
- package/build/utils/appPresets.js.map +1 -0
- package/build/utils/backupManager.d.ts +61 -0
- package/build/utils/backupManager.d.ts.map +1 -0
- package/build/utils/backupManager.js +314 -0
- package/build/utils/backupManager.js.map +1 -0
- package/build/utils/urlDetection.d.ts +35 -0
- package/build/utils/urlDetection.d.ts.map +1 -0
- package/build/utils/urlDetection.js +115 -0
- package/build/utils/urlDetection.js.map +1 -0
- package/build/utils/validationHelpers.d.ts +62 -0
- package/build/utils/validationHelpers.d.ts.map +1 -0
- package/build/utils/validationHelpers.js +252 -0
- package/build/utils/validationHelpers.js.map +1 -0
- package/package.json +25 -3
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import logger from '../../../logger/logger.js';
|
|
2
|
+
import { LoadingState } from '../../../core/loading/loadingStateTracker.js';
|
|
3
|
+
import { getValidatedTags } from './scopeAuthMiddleware.js';
|
|
4
|
+
import { McpConfigManager } from '../../../config/mcpConfigManager.js';
|
|
5
|
+
/**
|
|
6
|
+
* Default options for MCP availability middleware
|
|
7
|
+
*/
|
|
8
|
+
const DEFAULT_OPTIONS = {
|
|
9
|
+
allowPartialAvailability: true,
|
|
10
|
+
includeOAuthServers: false,
|
|
11
|
+
unavailableMessage: 'Some requested MCP servers are not available',
|
|
12
|
+
loadingMessage: 'Some requested MCP servers are still loading',
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Creates middleware that checks MCP server availability before processing requests
|
|
16
|
+
*
|
|
17
|
+
* This middleware examines the loading state of MCP servers and provides different
|
|
18
|
+
* behaviors based on server availability and configuration options.
|
|
19
|
+
*
|
|
20
|
+
* @param loadingManager - The MCP loading manager instance
|
|
21
|
+
* @param options - Configuration options for availability checking
|
|
22
|
+
* @returns Express middleware function
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const availabilityMiddleware = createMcpAvailabilityMiddleware(loadingManager, {
|
|
27
|
+
* allowPartialAvailability: true,
|
|
28
|
+
* includeOAuthServers: false,
|
|
29
|
+
* });
|
|
30
|
+
*
|
|
31
|
+
* router.post('/mcp', availabilityMiddleware, (req, res) => {
|
|
32
|
+
* // Handle MCP request with availability info in req.mcpAvailability
|
|
33
|
+
* });
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export function createMcpAvailabilityMiddleware(loadingManager, options = {}) {
|
|
37
|
+
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
38
|
+
return (req, res, next) => {
|
|
39
|
+
try {
|
|
40
|
+
// If no loading manager, assume all servers are available (legacy mode)
|
|
41
|
+
if (!loadingManager) {
|
|
42
|
+
logger.debug('No loading manager - assuming all servers available');
|
|
43
|
+
next();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
// Get requested tags from scope auth middleware
|
|
47
|
+
const requestedTags = getValidatedTags(res);
|
|
48
|
+
// If no specific tags requested, get all servers
|
|
49
|
+
const stateTracker = loadingManager.getStateTracker();
|
|
50
|
+
const allStates = stateTracker.getAllServerStates();
|
|
51
|
+
// Filter servers based on requested tags
|
|
52
|
+
// Tags are used to control which MCP servers are available for requests.
|
|
53
|
+
// When tags are specified, only servers that have ALL the requested tags will be included.
|
|
54
|
+
const allServers = Array.from(allStates.keys());
|
|
55
|
+
let relevantServers;
|
|
56
|
+
if (requestedTags && requestedTags.length > 0) {
|
|
57
|
+
// Get server configurations to access tags
|
|
58
|
+
const configManager = McpConfigManager.getInstance();
|
|
59
|
+
const transportConfig = configManager.getTransportConfig();
|
|
60
|
+
// Filter servers that have ALL requested tags
|
|
61
|
+
// This implements the "AND" logic: servers must have every requested tag
|
|
62
|
+
relevantServers = allServers.filter((serverName) => {
|
|
63
|
+
const serverConfig = transportConfig[serverName];
|
|
64
|
+
if (!serverConfig || !serverConfig.tags) {
|
|
65
|
+
// Server has no tags, so it doesn't match any tag request
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
// Check if server has ALL requested tags (case-insensitive matching)
|
|
69
|
+
const serverTags = serverConfig.tags.map((tag) => tag.toLowerCase());
|
|
70
|
+
const requestedTagsLower = requestedTags.map((tag) => tag.toLowerCase());
|
|
71
|
+
return requestedTagsLower.every((requestedTag) => serverTags.includes(requestedTag));
|
|
72
|
+
});
|
|
73
|
+
logger.debug(`Filtered ${relevantServers.length}/${allServers.length} servers ` + `with tags: ${requestedTags.join(', ')}`);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
relevantServers = allServers;
|
|
77
|
+
logger.debug(`Checking availability for all ${relevantServers.length} servers`);
|
|
78
|
+
}
|
|
79
|
+
// Categorize servers by state
|
|
80
|
+
const availableServers = [];
|
|
81
|
+
const unavailableServers = [];
|
|
82
|
+
const loadingServers = [];
|
|
83
|
+
const oauthRequiredServers = [];
|
|
84
|
+
for (const serverName of relevantServers) {
|
|
85
|
+
const serverInfo = stateTracker.getServerState(serverName);
|
|
86
|
+
if (!serverInfo) {
|
|
87
|
+
unavailableServers.push(serverName);
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
switch (serverInfo.state) {
|
|
91
|
+
case LoadingState.Ready:
|
|
92
|
+
availableServers.push(serverName);
|
|
93
|
+
break;
|
|
94
|
+
case LoadingState.Loading:
|
|
95
|
+
case LoadingState.Pending:
|
|
96
|
+
loadingServers.push(serverName);
|
|
97
|
+
break;
|
|
98
|
+
case LoadingState.AwaitingOAuth:
|
|
99
|
+
if (opts.includeOAuthServers) {
|
|
100
|
+
availableServers.push(serverName);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
oauthRequiredServers.push(serverName);
|
|
104
|
+
}
|
|
105
|
+
break;
|
|
106
|
+
case LoadingState.Failed:
|
|
107
|
+
case LoadingState.Cancelled:
|
|
108
|
+
default:
|
|
109
|
+
unavailableServers.push(serverName);
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Calculate availability metrics
|
|
114
|
+
const hasPartialAvailability = availableServers.length > 0;
|
|
115
|
+
const allServersReady = relevantServers.length > 0 && availableServers.length === relevantServers.length;
|
|
116
|
+
// Add availability info to request
|
|
117
|
+
req.mcpAvailability = {
|
|
118
|
+
availableServers,
|
|
119
|
+
unavailableServers,
|
|
120
|
+
loadingServers,
|
|
121
|
+
oauthRequiredServers,
|
|
122
|
+
hasPartialAvailability,
|
|
123
|
+
allServersReady,
|
|
124
|
+
requestedTags: requestedTags && requestedTags.length > 0 ? requestedTags : undefined,
|
|
125
|
+
totalServersBeforeFiltering: requestedTags && requestedTags.length > 0 ? allServers.length : undefined,
|
|
126
|
+
};
|
|
127
|
+
// Log availability status
|
|
128
|
+
const tagInfo = requestedTags && requestedTags.length > 0
|
|
129
|
+
? ` (filtered by tags: ${requestedTags.join(', ')}, ${allServers.length} total)`
|
|
130
|
+
: '';
|
|
131
|
+
logger.debug(`MCP Availability: ${availableServers.length}/${relevantServers.length} ready, ` +
|
|
132
|
+
`${loadingServers.length} loading, ${unavailableServers.length} failed, ` +
|
|
133
|
+
`${oauthRequiredServers.length} OAuth required${tagInfo}`);
|
|
134
|
+
// Decide whether to proceed based on availability
|
|
135
|
+
if (relevantServers.length === 0) {
|
|
136
|
+
// No servers configured - proceed normally
|
|
137
|
+
next();
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
if (allServersReady) {
|
|
141
|
+
// All servers ready - proceed normally
|
|
142
|
+
next();
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (!hasPartialAvailability) {
|
|
146
|
+
// No servers available - return error
|
|
147
|
+
logger.warn('No MCP servers available for request');
|
|
148
|
+
res.status(503).json({
|
|
149
|
+
error: 'service_unavailable',
|
|
150
|
+
message: 'No MCP servers are currently available',
|
|
151
|
+
details: {
|
|
152
|
+
total: relevantServers.length,
|
|
153
|
+
available: availableServers.length,
|
|
154
|
+
loading: loadingServers.length,
|
|
155
|
+
failed: unavailableServers.length,
|
|
156
|
+
oauthRequired: oauthRequiredServers.length,
|
|
157
|
+
},
|
|
158
|
+
loading: {
|
|
159
|
+
isComplete: stateTracker.isLoadingComplete(),
|
|
160
|
+
summary: loadingManager.getSummary(),
|
|
161
|
+
},
|
|
162
|
+
timestamp: new Date().toISOString(),
|
|
163
|
+
});
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
if (opts.allowPartialAvailability) {
|
|
167
|
+
// Some servers available - proceed with warning
|
|
168
|
+
logger.info(`Proceeding with partial MCP availability: ${availableServers.length}/${relevantServers.length} servers ready`);
|
|
169
|
+
// Add warning headers
|
|
170
|
+
res.setHeader('X-MCP-Partial-Availability', 'true');
|
|
171
|
+
res.setHeader('X-MCP-Available-Count', availableServers.length.toString());
|
|
172
|
+
res.setHeader('X-MCP-Total-Count', relevantServers.length.toString());
|
|
173
|
+
if (loadingServers.length > 0) {
|
|
174
|
+
res.setHeader('X-MCP-Loading-Count', loadingServers.length.toString());
|
|
175
|
+
}
|
|
176
|
+
next();
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
// Partial availability not allowed - return error
|
|
181
|
+
logger.warn('Partial MCP availability not allowed - blocking request');
|
|
182
|
+
const primaryReason = loadingServers.length > 0 ? 'loading' : 'unavailable';
|
|
183
|
+
const message = primaryReason === 'loading' ? opts.loadingMessage : opts.unavailableMessage;
|
|
184
|
+
res.status(primaryReason === 'loading' ? 202 : 503).json({
|
|
185
|
+
error: primaryReason === 'loading' ? 'servers_loading' : 'servers_unavailable',
|
|
186
|
+
message,
|
|
187
|
+
details: {
|
|
188
|
+
total: relevantServers.length,
|
|
189
|
+
available: availableServers.length,
|
|
190
|
+
loading: loadingServers.length,
|
|
191
|
+
failed: unavailableServers.length,
|
|
192
|
+
oauthRequired: oauthRequiredServers.length,
|
|
193
|
+
availableList: availableServers,
|
|
194
|
+
loadingList: loadingServers,
|
|
195
|
+
failedList: unavailableServers,
|
|
196
|
+
oauthRequiredList: oauthRequiredServers,
|
|
197
|
+
},
|
|
198
|
+
loading: {
|
|
199
|
+
isComplete: stateTracker.isLoadingComplete(),
|
|
200
|
+
summary: loadingManager.getSummary(),
|
|
201
|
+
},
|
|
202
|
+
retryAfter: primaryReason === 'loading' ? 30 : undefined, // Suggest retry in 30 seconds for loading
|
|
203
|
+
timestamp: new Date().toISOString(),
|
|
204
|
+
});
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
logger.error('MCP availability check failed:', error);
|
|
210
|
+
// On error, proceed normally to avoid blocking requests
|
|
211
|
+
// This ensures the system remains functional even if availability checking fails
|
|
212
|
+
next();
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Utility function to get MCP availability info from request
|
|
218
|
+
*/
|
|
219
|
+
export function getMcpAvailability(req) {
|
|
220
|
+
return req.mcpAvailability;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Utility function to check if all MCP servers are ready
|
|
224
|
+
*/
|
|
225
|
+
export function areAllMcpServersReady(req) {
|
|
226
|
+
const availability = getMcpAvailability(req);
|
|
227
|
+
return availability?.allServersReady ?? true; // Assume ready if no availability info
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Utility function to get list of available MCP servers
|
|
231
|
+
*/
|
|
232
|
+
export function getAvailableMcpServers(req) {
|
|
233
|
+
const availability = getMcpAvailability(req);
|
|
234
|
+
return availability?.availableServers ?? [];
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Utility function to get list of loading MCP servers
|
|
238
|
+
*/
|
|
239
|
+
export function getLoadingMcpServers(req) {
|
|
240
|
+
const availability = getMcpAvailability(req);
|
|
241
|
+
return availability?.loadingServers ?? [];
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=mcpAvailabilityMiddleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcpAvailabilityMiddleware.js","sourceRoot":"","sources":["../../../../src/transport/http/middlewares/mcpAvailabilityMiddleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
import { McpLoadingManager } from '../../../core/loading/mcpLoadingManager.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates health check routes
|
|
5
|
+
*/
|
|
6
|
+
export declare function createHealthRoutes(loadingManager?: McpLoadingManager): Router;
|
|
7
|
+
export default createHealthRoutes;
|
|
8
|
+
//# sourceMappingURL=healthRoutes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"healthRoutes.d.ts","sourceRoot":"","sources":["../../../../src/transport/http/routes/healthRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqC,MAAM,SAAS,CAAC;AAIpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AAG/E;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAgT7E;AAGD,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
import rateLimit from 'express-rate-limit';
|
|
3
|
+
import logger from '../../../logger/logger.js';
|
|
4
|
+
import { HealthService, HealthStatus } from '../../../services/healthService.js';
|
|
5
|
+
import { LoadingState } from '../../../core/loading/loadingStateTracker.js';
|
|
6
|
+
/**
|
|
7
|
+
* Creates health check routes
|
|
8
|
+
*/
|
|
9
|
+
export function createHealthRoutes(loadingManager) {
|
|
10
|
+
const router = Router();
|
|
11
|
+
const healthService = HealthService.getInstance();
|
|
12
|
+
// Rate limiter for health endpoints - more permissive than OAuth endpoints
|
|
13
|
+
const createHealthLimiter = () => {
|
|
14
|
+
return rateLimit({
|
|
15
|
+
windowMs: 5 * 60 * 1000, // 5 minutes
|
|
16
|
+
max: 200, // max requests per window per IP (higher limit for monitoring)
|
|
17
|
+
standardHeaders: true,
|
|
18
|
+
legacyHeaders: false,
|
|
19
|
+
message: {
|
|
20
|
+
error: 'Too many health check requests, please try again later.',
|
|
21
|
+
status: 'rate_limited',
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
router.use(createHealthLimiter());
|
|
26
|
+
/**
|
|
27
|
+
* Health check endpoint
|
|
28
|
+
* GET /health
|
|
29
|
+
*
|
|
30
|
+
* Returns comprehensive health status including:
|
|
31
|
+
* - Overall system status
|
|
32
|
+
* - MCP server connectivity status
|
|
33
|
+
* - System metrics (uptime, memory)
|
|
34
|
+
* - Configuration status
|
|
35
|
+
*/
|
|
36
|
+
const healthHandler = async (req, res) => {
|
|
37
|
+
try {
|
|
38
|
+
logger.debug('Health check requested');
|
|
39
|
+
const healthData = await healthService.performHealthCheck();
|
|
40
|
+
const httpStatusCode = healthService.getHttpStatusCode(healthData.status);
|
|
41
|
+
// Set appropriate headers
|
|
42
|
+
res.setHeader('Content-Type', 'application/json');
|
|
43
|
+
res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
|
|
44
|
+
// Add custom headers for monitoring tools
|
|
45
|
+
res.setHeader('X-Health-Status', healthData.status);
|
|
46
|
+
res.setHeader('X-Service-Version', healthData.version);
|
|
47
|
+
res.setHeader('X-Uptime-Seconds', healthData.system.uptime.toString());
|
|
48
|
+
logger.debug(`Health check completed with status: ${healthData.status}`);
|
|
49
|
+
res.status(httpStatusCode).json(healthData);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
logger.error('Health check failed:', error);
|
|
53
|
+
// Return error response with 500 status
|
|
54
|
+
res.status(500).json({
|
|
55
|
+
status: HealthStatus.UNHEALTHY,
|
|
56
|
+
timestamp: new Date().toISOString(),
|
|
57
|
+
error: 'Health check failed',
|
|
58
|
+
message: error instanceof Error ? error.message : 'Unknown error occurred',
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
router.get('/', healthHandler);
|
|
63
|
+
/**
|
|
64
|
+
* Simple liveness probe endpoint
|
|
65
|
+
* GET /health/live
|
|
66
|
+
*
|
|
67
|
+
* Returns minimal response for basic liveness checking
|
|
68
|
+
* Always returns 200 if the server is running
|
|
69
|
+
*/
|
|
70
|
+
const livenessHandler = (req, res) => {
|
|
71
|
+
res.setHeader('Content-Type', 'application/json');
|
|
72
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
73
|
+
res.status(200).json({
|
|
74
|
+
status: 'alive',
|
|
75
|
+
timestamp: new Date().toISOString(),
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
router.get('/live', livenessHandler);
|
|
79
|
+
/**
|
|
80
|
+
* Readiness probe endpoint
|
|
81
|
+
* GET /health/ready
|
|
82
|
+
*
|
|
83
|
+
* Returns 200 if service is ready to accept requests
|
|
84
|
+
* Returns 503 if service is not ready (e.g., configuration not loaded)
|
|
85
|
+
*/
|
|
86
|
+
const readinessHandler = async (req, res) => {
|
|
87
|
+
try {
|
|
88
|
+
const healthData = await healthService.performHealthCheck();
|
|
89
|
+
// Service is ready if configuration is loaded
|
|
90
|
+
const isReady = healthData.configuration.loaded;
|
|
91
|
+
const statusCode = isReady ? 200 : 503;
|
|
92
|
+
res.setHeader('Content-Type', 'application/json');
|
|
93
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
94
|
+
res.status(statusCode).json({
|
|
95
|
+
status: isReady ? 'ready' : 'not_ready',
|
|
96
|
+
timestamp: new Date().toISOString(),
|
|
97
|
+
configuration: healthData.configuration,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
logger.error('Readiness check failed:', error);
|
|
102
|
+
res.status(503).json({
|
|
103
|
+
status: 'not_ready',
|
|
104
|
+
timestamp: new Date().toISOString(),
|
|
105
|
+
error: 'Readiness check failed',
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
router.get('/ready', readinessHandler);
|
|
110
|
+
/**
|
|
111
|
+
* MCP servers loading status endpoint
|
|
112
|
+
* GET /health/mcp
|
|
113
|
+
*
|
|
114
|
+
* Returns real-time status of MCP server loading process
|
|
115
|
+
*/
|
|
116
|
+
const mcpLoadingHandler = (req, res) => {
|
|
117
|
+
try {
|
|
118
|
+
if (!loadingManager) {
|
|
119
|
+
res.status(404).json({
|
|
120
|
+
error: 'MCP loading manager not available',
|
|
121
|
+
timestamp: new Date().toISOString(),
|
|
122
|
+
});
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const summary = loadingManager.getSummary();
|
|
126
|
+
const allStates = loadingManager.getStateTracker().getAllServerStates();
|
|
127
|
+
// Group servers by state for better organization
|
|
128
|
+
const serversByState = {
|
|
129
|
+
pending: [],
|
|
130
|
+
loading: [],
|
|
131
|
+
ready: [],
|
|
132
|
+
failed: [],
|
|
133
|
+
awaitingOAuth: [],
|
|
134
|
+
cancelled: [],
|
|
135
|
+
};
|
|
136
|
+
const serverDetails = {};
|
|
137
|
+
for (const [name, info] of allStates) {
|
|
138
|
+
// Add to state groups
|
|
139
|
+
switch (info.state) {
|
|
140
|
+
case LoadingState.Pending:
|
|
141
|
+
serversByState.pending.push(name);
|
|
142
|
+
break;
|
|
143
|
+
case LoadingState.Loading:
|
|
144
|
+
serversByState.loading.push(name);
|
|
145
|
+
break;
|
|
146
|
+
case LoadingState.Ready:
|
|
147
|
+
serversByState.ready.push(name);
|
|
148
|
+
break;
|
|
149
|
+
case LoadingState.Failed:
|
|
150
|
+
serversByState.failed.push(name);
|
|
151
|
+
break;
|
|
152
|
+
case LoadingState.AwaitingOAuth:
|
|
153
|
+
serversByState.awaitingOAuth.push(name);
|
|
154
|
+
break;
|
|
155
|
+
case LoadingState.Cancelled:
|
|
156
|
+
serversByState.cancelled.push(name);
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
// Add detailed info
|
|
160
|
+
serverDetails[name] = {
|
|
161
|
+
state: info.state,
|
|
162
|
+
retryCount: info.retryCount,
|
|
163
|
+
duration: info.duration,
|
|
164
|
+
startTime: info.startTime,
|
|
165
|
+
endTime: info.endTime,
|
|
166
|
+
error: info.error?.message,
|
|
167
|
+
progress: info.progress,
|
|
168
|
+
authorizationUrl: info.authorizationUrl,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
res.setHeader('Content-Type', 'application/json');
|
|
172
|
+
res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
|
|
173
|
+
res.setHeader('X-Loading-Complete', summary.isComplete.toString());
|
|
174
|
+
res.setHeader('X-Success-Rate', summary.successRate.toFixed(1));
|
|
175
|
+
const responseData = {
|
|
176
|
+
loading: {
|
|
177
|
+
isComplete: summary.isComplete,
|
|
178
|
+
startTime: summary.startTime,
|
|
179
|
+
successRate: summary.successRate,
|
|
180
|
+
averageLoadTime: summary.averageLoadTime,
|
|
181
|
+
},
|
|
182
|
+
summary: {
|
|
183
|
+
total: summary.totalServers,
|
|
184
|
+
pending: summary.pending,
|
|
185
|
+
loading: summary.loading,
|
|
186
|
+
ready: summary.ready,
|
|
187
|
+
failed: summary.failed,
|
|
188
|
+
awaitingOAuth: summary.awaitingOAuth,
|
|
189
|
+
cancelled: summary.cancelled,
|
|
190
|
+
},
|
|
191
|
+
servers: {
|
|
192
|
+
byState: serversByState,
|
|
193
|
+
details: serverDetails,
|
|
194
|
+
},
|
|
195
|
+
timestamp: new Date().toISOString(),
|
|
196
|
+
};
|
|
197
|
+
// Set status code based on loading state
|
|
198
|
+
const statusCode = summary.isComplete ? 200 : 202; // 202 = Accepted (still processing)
|
|
199
|
+
res.status(statusCode).json(responseData);
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
logger.error('MCP loading status check failed:', error);
|
|
203
|
+
res.status(500).json({
|
|
204
|
+
error: 'MCP loading status check failed',
|
|
205
|
+
message: error instanceof Error ? error.message : 'Unknown error occurred',
|
|
206
|
+
timestamp: new Date().toISOString(),
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
router.get('/mcp', mcpLoadingHandler);
|
|
211
|
+
/**
|
|
212
|
+
* Detailed server-specific loading status
|
|
213
|
+
* GET /health/mcp/:serverName
|
|
214
|
+
*/
|
|
215
|
+
const serverSpecificHandler = (req, res) => {
|
|
216
|
+
try {
|
|
217
|
+
if (!loadingManager) {
|
|
218
|
+
res.status(404).json({
|
|
219
|
+
error: 'MCP loading manager not available',
|
|
220
|
+
timestamp: new Date().toISOString(),
|
|
221
|
+
});
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
const serverName = req.params.serverName;
|
|
225
|
+
const serverInfo = loadingManager.getStateTracker().getServerState(serverName);
|
|
226
|
+
if (!serverInfo) {
|
|
227
|
+
res.status(404).json({
|
|
228
|
+
error: `Server '${serverName}' not found`,
|
|
229
|
+
timestamp: new Date().toISOString(),
|
|
230
|
+
});
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
res.setHeader('Content-Type', 'application/json');
|
|
234
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
235
|
+
res.setHeader('X-Server-State', serverInfo.state);
|
|
236
|
+
const responseData = {
|
|
237
|
+
name: serverInfo.name,
|
|
238
|
+
state: serverInfo.state,
|
|
239
|
+
retryCount: serverInfo.retryCount,
|
|
240
|
+
duration: serverInfo.duration,
|
|
241
|
+
startTime: serverInfo.startTime,
|
|
242
|
+
endTime: serverInfo.endTime,
|
|
243
|
+
lastRetryTime: serverInfo.lastRetryTime,
|
|
244
|
+
error: serverInfo.error
|
|
245
|
+
? {
|
|
246
|
+
message: serverInfo.error.message,
|
|
247
|
+
name: serverInfo.error.name,
|
|
248
|
+
}
|
|
249
|
+
: undefined,
|
|
250
|
+
progress: serverInfo.progress,
|
|
251
|
+
authorizationUrl: serverInfo.authorizationUrl,
|
|
252
|
+
oauthStartTime: serverInfo.oauthStartTime,
|
|
253
|
+
timestamp: new Date().toISOString(),
|
|
254
|
+
};
|
|
255
|
+
// Set status code based on server state
|
|
256
|
+
let statusCode = 200;
|
|
257
|
+
if (serverInfo.state === LoadingState.Loading) {
|
|
258
|
+
statusCode = 202; // Still processing
|
|
259
|
+
}
|
|
260
|
+
else if (serverInfo.state === LoadingState.Failed) {
|
|
261
|
+
statusCode = 503; // Service unavailable
|
|
262
|
+
}
|
|
263
|
+
else if (serverInfo.state === LoadingState.AwaitingOAuth) {
|
|
264
|
+
statusCode = 401; // Unauthorized - needs OAuth
|
|
265
|
+
}
|
|
266
|
+
res.status(statusCode).json(responseData);
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
logger.error(`Server-specific loading status check failed for ${req.params.serverName}:`, error);
|
|
270
|
+
res.status(500).json({
|
|
271
|
+
error: 'Server-specific loading status check failed',
|
|
272
|
+
message: error instanceof Error ? error.message : 'Unknown error occurred',
|
|
273
|
+
timestamp: new Date().toISOString(),
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
router.get('/mcp/:serverName', serverSpecificHandler);
|
|
278
|
+
return router;
|
|
279
|
+
}
|
|
280
|
+
// Export the factory function as default
|
|
281
|
+
export default createHealthRoutes;
|
|
282
|
+
//# sourceMappingURL=healthRoutes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"healthRoutes.js","sourceRoot":"","sources":["../../../../src/transport/http/routes/healthRoutes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Router } from 'express';
|
|
2
2
|
import { ServerManager } from '../../../core/server/serverManager.js';
|
|
3
|
-
|
|
3
|
+
import { AsyncLoadingOrchestrator } from '../../../core/capabilities/asyncLoadingOrchestrator.js';
|
|
4
|
+
export declare function setupSseRoutes(router: Router, serverManager: ServerManager, authMiddleware: any, availabilityMiddleware?: any, asyncOrchestrator?: AsyncLoadingOrchestrator): void;
|
|
4
5
|
//# sourceMappingURL=sseRoutes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sseRoutes.d.ts","sourceRoot":"","sources":["../../../../src/transport/http/routes/sseRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAKpD,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"sseRoutes.d.ts","sourceRoot":"","sources":["../../../../src/transport/http/routes/sseRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAKpD,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAEtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wDAAwD,CAAC;AAIlG,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,GAAG,EACnB,sBAAsB,CAAC,EAAE,GAAG,EAC5B,iBAAiB,CAAC,EAAE,wBAAwB,GAC3C,IAAI,CAqFN"}
|
|
@@ -5,8 +5,12 @@ import { SSE_ENDPOINT, MESSAGES_ENDPOINT } from '../../../constants.js';
|
|
|
5
5
|
import { ServerStatus } from '../../../core/types/index.js';
|
|
6
6
|
import tagsExtractor from '../middlewares/tagsExtractor.js';
|
|
7
7
|
import { getValidatedTags } from '../middlewares/scopeAuthMiddleware.js';
|
|
8
|
-
export function setupSseRoutes(router, serverManager, authMiddleware) {
|
|
8
|
+
export function setupSseRoutes(router, serverManager, authMiddleware, availabilityMiddleware, asyncOrchestrator) {
|
|
9
9
|
const middlewares = [tagsExtractor, authMiddleware];
|
|
10
|
+
// Add availability middleware if provided
|
|
11
|
+
if (availabilityMiddleware) {
|
|
12
|
+
middlewares.push(availabilityMiddleware);
|
|
13
|
+
}
|
|
10
14
|
router.get(SSE_ENDPOINT, ...middlewares, async (req, res) => {
|
|
11
15
|
try {
|
|
12
16
|
const transport = new SSEServerTransport(MESSAGES_ENDPOINT, res);
|
|
@@ -17,6 +21,14 @@ export function setupSseRoutes(router, serverManager, authMiddleware) {
|
|
|
17
21
|
tags,
|
|
18
22
|
enablePagination: req.query.pagination === 'true',
|
|
19
23
|
});
|
|
24
|
+
// Initialize notifications for async loading if enabled
|
|
25
|
+
if (asyncOrchestrator) {
|
|
26
|
+
const inboundConnection = serverManager.getServer(transport.sessionId);
|
|
27
|
+
if (inboundConnection) {
|
|
28
|
+
asyncOrchestrator.initializeNotifications(inboundConnection);
|
|
29
|
+
logger.debug(`Async loading notifications initialized for SSE session ${transport.sessionId}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
20
32
|
transport.onclose = () => {
|
|
21
33
|
serverManager.disconnectTransport(transport.sessionId);
|
|
22
34
|
// Note: ServerManager already logs the disconnection
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sseRoutes.js","sourceRoot":"","sources":["../../../../src/transport/http/routes/sseRoutes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,MAAM,MAAM,2BAA2B,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"sseRoutes.js","sourceRoot":"","sources":["../../../../src/transport/http/routes/sseRoutes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Router } from 'express';
|
|
2
2
|
import { ServerManager } from '../../../core/server/serverManager.js';
|
|
3
|
-
|
|
3
|
+
import { AsyncLoadingOrchestrator } from '../../../core/capabilities/asyncLoadingOrchestrator.js';
|
|
4
|
+
export declare function setupStreamableHttpRoutes(router: Router, serverManager: ServerManager, authMiddleware: any, availabilityMiddleware?: any, asyncOrchestrator?: AsyncLoadingOrchestrator): void;
|
|
4
5
|
//# sourceMappingURL=streamableHttpRoutes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamableHttpRoutes.d.ts","sourceRoot":"","sources":["../../../../src/transport/http/routes/streamableHttpRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAMpD,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"streamableHttpRoutes.d.ts","sourceRoot":"","sources":["../../../../src/transport/http/routes/streamableHttpRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAMpD,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAEtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wDAAwD,CAAC;AAIlG,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,GAAG,EACnB,sBAAsB,CAAC,EAAE,GAAG,EAC5B,iBAAiB,CAAC,EAAE,wBAAwB,GAC3C,IAAI,CA2IN"}
|