@1mcp/agent 0.14.0 → 0.16.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 +118 -30
- package/build/constants.d.ts +2 -1
- package/build/constants.d.ts.map +1 -1
- package/build/constants.js +2 -1
- package/build/constants.js.map +1 -1
- package/build/core/server/agentConfig.d.ts +16 -0
- package/build/core/server/agentConfig.d.ts.map +1 -1
- package/build/core/server/agentConfig.js +32 -7
- package/build/core/server/agentConfig.js.map +1 -1
- package/build/index.js +20 -0
- package/build/index.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/routes/healthRoutes.d.ts +7 -0
- package/build/transport/http/routes/healthRoutes.d.ts.map +1 -0
- package/build/transport/http/routes/healthRoutes.js +113 -0
- package/build/transport/http/routes/healthRoutes.js.map +1 -0
- package/build/transport/http/routes/sseRoutes.d.ts +1 -1
- package/build/transport/http/routes/sseRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/sseRoutes.js +4 -3
- package/build/transport/http/routes/sseRoutes.js.map +1 -1
- package/build/transport/http/routes/streamableHttpRoutes.d.ts +1 -1
- package/build/transport/http/routes/streamableHttpRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/streamableHttpRoutes.js +5 -4
- package/build/transport/http/routes/streamableHttpRoutes.js.map +1 -1
- package/build/transport/http/server.d.ts.map +1 -1
- package/build/transport/http/server.js +16 -3
- package/build/transport/http/server.js.map +1 -1
- package/build/utils/logo.d.ts +8 -0
- package/build/utils/logo.d.ts.map +1 -0
- package/build/utils/logo.js +26 -0
- package/build/utils/logo.js.map +1 -0
- package/package.json +18 -3
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import { ClientStatus } from '../core/types/index.js';
|
|
2
|
+
import { ServerManager } from '../core/server/serverManager.js';
|
|
3
|
+
import { McpConfigManager } from '../config/mcpConfigManager.js';
|
|
4
|
+
import { AgentConfigManager } from '../core/server/agentConfig.js';
|
|
5
|
+
import { MCP_SERVER_VERSION } from '../constants.js';
|
|
6
|
+
import logger from '../logger/logger.js';
|
|
7
|
+
/**
|
|
8
|
+
* Health status levels
|
|
9
|
+
*/
|
|
10
|
+
export var HealthStatus;
|
|
11
|
+
(function (HealthStatus) {
|
|
12
|
+
HealthStatus["HEALTHY"] = "healthy";
|
|
13
|
+
HealthStatus["DEGRADED"] = "degraded";
|
|
14
|
+
HealthStatus["UNHEALTHY"] = "unhealthy";
|
|
15
|
+
})(HealthStatus || (HealthStatus = {}));
|
|
16
|
+
/**
|
|
17
|
+
* Health service for monitoring system and MCP server status
|
|
18
|
+
*/
|
|
19
|
+
export class HealthService {
|
|
20
|
+
static instance;
|
|
21
|
+
startTime;
|
|
22
|
+
agentConfig;
|
|
23
|
+
constructor() {
|
|
24
|
+
this.startTime = Date.now();
|
|
25
|
+
this.agentConfig = AgentConfigManager.getInstance();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get singleton instance
|
|
29
|
+
*/
|
|
30
|
+
static getInstance() {
|
|
31
|
+
if (!HealthService.instance) {
|
|
32
|
+
HealthService.instance = new HealthService();
|
|
33
|
+
}
|
|
34
|
+
return HealthService.instance;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Perform complete health check
|
|
38
|
+
*/
|
|
39
|
+
async performHealthCheck() {
|
|
40
|
+
try {
|
|
41
|
+
const systemHealth = this.getSystemHealth();
|
|
42
|
+
const serverHealth = await this.getServerHealth();
|
|
43
|
+
const configHealth = this.getConfigurationHealth();
|
|
44
|
+
const overallStatus = this.determineOverallHealth(serverHealth, configHealth);
|
|
45
|
+
const fullResponse = {
|
|
46
|
+
status: overallStatus,
|
|
47
|
+
timestamp: new Date().toISOString(),
|
|
48
|
+
version: MCP_SERVER_VERSION,
|
|
49
|
+
system: systemHealth,
|
|
50
|
+
servers: serverHealth,
|
|
51
|
+
configuration: configHealth,
|
|
52
|
+
};
|
|
53
|
+
// Apply security configuration to sanitize response
|
|
54
|
+
return this.sanitizeHealthResponse(fullResponse);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
logger.error('Health check failed:', error);
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Sanitize health response based on security configuration
|
|
63
|
+
*/
|
|
64
|
+
sanitizeHealthResponse(response) {
|
|
65
|
+
const detailLevel = this.agentConfig.getHealthDetailLevel();
|
|
66
|
+
// Apply detail level restrictions
|
|
67
|
+
switch (detailLevel) {
|
|
68
|
+
case 'minimal':
|
|
69
|
+
// Minimal: Only basic status, no sensitive details
|
|
70
|
+
return {
|
|
71
|
+
status: response.status,
|
|
72
|
+
timestamp: response.timestamp,
|
|
73
|
+
version: response.version,
|
|
74
|
+
system: {
|
|
75
|
+
uptime: response.system.uptime,
|
|
76
|
+
memory: { used: 0, total: 0, percentage: 0 },
|
|
77
|
+
process: { pid: 0, nodeVersion: '', platform: '', arch: '' },
|
|
78
|
+
},
|
|
79
|
+
servers: {
|
|
80
|
+
total: response.servers.total,
|
|
81
|
+
healthy: response.servers.healthy,
|
|
82
|
+
unhealthy: response.servers.unhealthy,
|
|
83
|
+
details: [],
|
|
84
|
+
},
|
|
85
|
+
configuration: {
|
|
86
|
+
loaded: response.configuration.loaded,
|
|
87
|
+
serverCount: 0,
|
|
88
|
+
enabledCount: 0,
|
|
89
|
+
disabledCount: 0,
|
|
90
|
+
authEnabled: false,
|
|
91
|
+
transport: 'http',
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
case 'basic':
|
|
95
|
+
// Basic: Some server info but sanitized errors and no sensitive system details
|
|
96
|
+
return {
|
|
97
|
+
...response,
|
|
98
|
+
system: {
|
|
99
|
+
uptime: response.system.uptime,
|
|
100
|
+
memory: {
|
|
101
|
+
used: Math.round(response.system.memory.used),
|
|
102
|
+
total: Math.round(response.system.memory.total),
|
|
103
|
+
percentage: response.system.memory.percentage,
|
|
104
|
+
},
|
|
105
|
+
process: { pid: 0, nodeVersion: '', platform: '', arch: '' },
|
|
106
|
+
},
|
|
107
|
+
servers: {
|
|
108
|
+
...response.servers,
|
|
109
|
+
details: response.servers.details.map((server) => ({
|
|
110
|
+
name: server.name,
|
|
111
|
+
status: server.status,
|
|
112
|
+
healthy: server.healthy,
|
|
113
|
+
lastConnected: server.lastConnected,
|
|
114
|
+
lastError: this.sanitizeErrorMessage(server.lastError),
|
|
115
|
+
tags: server.tags,
|
|
116
|
+
})),
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
case 'full':
|
|
120
|
+
default:
|
|
121
|
+
// Full: All details but with basic error sanitization
|
|
122
|
+
return {
|
|
123
|
+
...response,
|
|
124
|
+
servers: {
|
|
125
|
+
...response.servers,
|
|
126
|
+
details: response.servers.details.map((server) => ({
|
|
127
|
+
...server,
|
|
128
|
+
lastError: this.sanitizeErrorMessage(server.lastError),
|
|
129
|
+
})),
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Sanitize error messages to prevent information leakage
|
|
136
|
+
*/
|
|
137
|
+
sanitizeErrorMessage(errorMessage) {
|
|
138
|
+
if (!errorMessage)
|
|
139
|
+
return undefined;
|
|
140
|
+
// Remove potentially sensitive information from error messages
|
|
141
|
+
return errorMessage
|
|
142
|
+
.replace(/\b(?:password|token|key|secret|auth)\s*[:=]\s*[^\s]+/gi, '[REDACTED_CREDENTIAL]') // Key-value credentials
|
|
143
|
+
.replace(/\b[\w.-]+:[\w.-]+@/gi, '[REDACTED_CREDENTIAL]') // User:password@ patterns
|
|
144
|
+
.replace(/\bhttps?:\/\/[\w.-]+(?::\d+)?(?:\/[^\s]*)?/gi, '[REDACTED_URL]') // Complete URLs
|
|
145
|
+
.replace(/(?:[A-Za-z]:)?[/\\][\w.-]+(?:[/\\][\w.-]+)*\.(?:json|js|ts|py|yml|yaml|conf|ini)\b/g, '[REDACTED_PATH]') // File paths
|
|
146
|
+
.replace(/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/g, '[REDACTED_IP]') // IP addresses
|
|
147
|
+
.replace(/\blocalhost(?::\d+)?\b/gi, '[REDACTED_HOST]') // Localhost references
|
|
148
|
+
.substring(0, 100); // Limit error message length
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get system health metrics
|
|
152
|
+
*/
|
|
153
|
+
getSystemHealth() {
|
|
154
|
+
const memUsage = process.memoryUsage();
|
|
155
|
+
return {
|
|
156
|
+
uptime: Math.floor((Date.now() - this.startTime) / 1000),
|
|
157
|
+
memory: {
|
|
158
|
+
used: Math.round((memUsage.heapUsed / 1024 / 1024) * 100) / 100, // MB
|
|
159
|
+
total: Math.round((memUsage.heapTotal / 1024 / 1024) * 100) / 100, // MB
|
|
160
|
+
percentage: Math.round((memUsage.heapUsed / memUsage.heapTotal) * 100 * 100) / 100,
|
|
161
|
+
},
|
|
162
|
+
process: {
|
|
163
|
+
pid: process.pid,
|
|
164
|
+
nodeVersion: process.version,
|
|
165
|
+
platform: process.platform,
|
|
166
|
+
arch: process.arch,
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Get MCP server health status
|
|
172
|
+
*/
|
|
173
|
+
async getServerHealth() {
|
|
174
|
+
try {
|
|
175
|
+
const serverManager = ServerManager.current;
|
|
176
|
+
if (!serverManager) {
|
|
177
|
+
return {
|
|
178
|
+
total: 0,
|
|
179
|
+
healthy: 0,
|
|
180
|
+
unhealthy: 0,
|
|
181
|
+
details: [],
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
const clients = serverManager.getClients();
|
|
185
|
+
const serverDetails = [];
|
|
186
|
+
let healthyCount = 0;
|
|
187
|
+
let unhealthyCount = 0;
|
|
188
|
+
for (const [name, clientInfo] of clients.entries()) {
|
|
189
|
+
const isHealthy = clientInfo.status === ClientStatus.Connected;
|
|
190
|
+
if (isHealthy) {
|
|
191
|
+
healthyCount++;
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
unhealthyCount++;
|
|
195
|
+
}
|
|
196
|
+
serverDetails.push({
|
|
197
|
+
name,
|
|
198
|
+
status: clientInfo.status,
|
|
199
|
+
healthy: isHealthy,
|
|
200
|
+
lastConnected: clientInfo.lastConnected,
|
|
201
|
+
lastError: clientInfo.lastError?.message,
|
|
202
|
+
tags: clientInfo.transport.tags,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
total: clients.size,
|
|
207
|
+
healthy: healthyCount,
|
|
208
|
+
unhealthy: unhealthyCount,
|
|
209
|
+
details: serverDetails,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
logger.error('Error getting server health:', error);
|
|
214
|
+
return {
|
|
215
|
+
total: 0,
|
|
216
|
+
healthy: 0,
|
|
217
|
+
unhealthy: 0,
|
|
218
|
+
details: [],
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Get configuration health status
|
|
224
|
+
*/
|
|
225
|
+
getConfigurationHealth() {
|
|
226
|
+
try {
|
|
227
|
+
const mcpConfig = McpConfigManager.getInstance();
|
|
228
|
+
const agentConfig = AgentConfigManager.getInstance();
|
|
229
|
+
const config = mcpConfig.getTransportConfig();
|
|
230
|
+
const serverCount = Object.keys(config).length;
|
|
231
|
+
const enabledCount = Object.values(config).filter((server) => !server.disabled).length;
|
|
232
|
+
const disabledCount = serverCount - enabledCount;
|
|
233
|
+
return {
|
|
234
|
+
loaded: true,
|
|
235
|
+
serverCount,
|
|
236
|
+
enabledCount,
|
|
237
|
+
disabledCount,
|
|
238
|
+
authEnabled: agentConfig.isAuthEnabled(),
|
|
239
|
+
transport: 'http', // Since this is the HTTP transport layer
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
logger.error('Error getting configuration health:', error);
|
|
244
|
+
return {
|
|
245
|
+
loaded: false,
|
|
246
|
+
serverCount: 0,
|
|
247
|
+
enabledCount: 0,
|
|
248
|
+
disabledCount: 0,
|
|
249
|
+
authEnabled: false,
|
|
250
|
+
transport: 'unknown',
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Determine overall health status based on component status
|
|
256
|
+
*/
|
|
257
|
+
determineOverallHealth(serverHealth, configHealth) {
|
|
258
|
+
// Configuration must be loaded
|
|
259
|
+
if (!configHealth.loaded) {
|
|
260
|
+
return HealthStatus.UNHEALTHY;
|
|
261
|
+
}
|
|
262
|
+
// If no servers are configured, system is healthy but degraded
|
|
263
|
+
if (serverHealth.total === 0) {
|
|
264
|
+
return HealthStatus.DEGRADED;
|
|
265
|
+
}
|
|
266
|
+
// If all servers are healthy, system is healthy
|
|
267
|
+
if (serverHealth.healthy === serverHealth.total) {
|
|
268
|
+
return HealthStatus.HEALTHY;
|
|
269
|
+
}
|
|
270
|
+
// If more than half servers are healthy, system is degraded
|
|
271
|
+
if (serverHealth.healthy > serverHealth.total / 2) {
|
|
272
|
+
return HealthStatus.DEGRADED;
|
|
273
|
+
}
|
|
274
|
+
// If less than half servers are healthy, system is unhealthy
|
|
275
|
+
return HealthStatus.UNHEALTHY;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Get HTTP status code based on health status
|
|
279
|
+
*/
|
|
280
|
+
getHttpStatusCode(healthStatus) {
|
|
281
|
+
switch (healthStatus) {
|
|
282
|
+
case HealthStatus.HEALTHY:
|
|
283
|
+
return 200;
|
|
284
|
+
case HealthStatus.DEGRADED:
|
|
285
|
+
return 200; // Still operational, but with warnings
|
|
286
|
+
case HealthStatus.UNHEALTHY:
|
|
287
|
+
return 503; // Service unavailable
|
|
288
|
+
default:
|
|
289
|
+
return 500; // Internal server error
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
export default HealthService;
|
|
294
|
+
//# sourceMappingURL=healthService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"healthService.js","sourceRoot":"","sources":["../../src/services/healthService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,MAAM,MAAM,qBAAqB,CAAC;AAEzC;;GAEG;AACH,MAAM,CAAN,IAAY,YAIX;AAJD,WAAY,YAAY;IACtB,mCAAmB,CAAA;IACnB,qCAAqB,CAAA;IACrB,uCAAuB,CAAA;AACzB,CAAC,EAJW,YAAY,KAAZ,YAAY,QAIvB;AAwDD;;GAEG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,CAAC,QAAQ,CAAgB;IAC/B,SAAS,CAAS;IAClB,WAAW,CAAqB;IAExC;QACE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;IACtD,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC5B,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,aAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,kBAAkB;QAC7B,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YAC5C,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAClD,MAAM,YAAY,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAEnD,MAAM,aAAa,GAAG,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YAE9E,MAAM,YAAY,GAAwB;gBACxC,MAAM,EAAE,aAAa;gBACrB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,OAAO,EAAE,kBAAkB;gBAC3B,MAAM,EAAE,YAAY;gBACpB,OAAO,EAAE,YAAY;gBACrB,aAAa,EAAE,YAAY;aAC5B,CAAC;YAEF,oDAAoD;YACpD,OAAO,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC5C,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,sBAAsB,CAAC,QAA6B;QAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,oBAAoB,EAAE,CAAC;QAE5D,kCAAkC;QAClC,QAAQ,WAAW,EAAE,CAAC;YACpB,KAAK,SAAS;gBACZ,mDAAmD;gBACnD,OAAO;oBACL,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,SAAS,EAAE,QAAQ,CAAC,SAAS;oBAC7B,OAAO,EAAE,QAAQ,CAAC,OAAO;oBACzB,MAAM,EAAE;wBACN,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM;wBAC9B,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;wBAC5C,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;qBAC7D;oBACD,OAAO,EAAE;wBACP,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK;wBAC7B,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO;wBACjC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS;wBACrC,OAAO,EAAE,EAAE;qBACZ;oBACD,aAAa,EAAE;wBACb,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,MAAM;wBACrC,WAAW,EAAE,CAAC;wBACd,YAAY,EAAE,CAAC;wBACf,aAAa,EAAE,CAAC;wBAChB,WAAW,EAAE,KAAK;wBAClB,SAAS,EAAE,MAAM;qBAClB;iBACF,CAAC;YAEJ,KAAK,OAAO;gBACV,+EAA+E;gBAC/E,OAAO;oBACL,GAAG,QAAQ;oBACX,MAAM,EAAE;wBACN,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM;wBAC9B,MAAM,EAAE;4BACN,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;4BAC7C,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;4BAC/C,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU;yBAC9C;wBACD,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;qBAC7D;oBACD,OAAO,EAAE;wBACP,GAAG,QAAQ,CAAC,OAAO;wBACnB,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;4BACjD,IAAI,EAAE,MAAM,CAAC,IAAI;4BACjB,MAAM,EAAE,MAAM,CAAC,MAAM;4BACrB,OAAO,EAAE,MAAM,CAAC,OAAO;4BACvB,aAAa,EAAE,MAAM,CAAC,aAAa;4BACnC,SAAS,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,SAAS,CAAC;4BACtD,IAAI,EAAE,MAAM,CAAC,IAAI;yBAClB,CAAC,CAAC;qBACJ;iBACF,CAAC;YAEJ,KAAK,MAAM,CAAC;YACZ;gBACE,sDAAsD;gBACtD,OAAO;oBACL,GAAG,QAAQ;oBACX,OAAO,EAAE;wBACP,GAAG,QAAQ,CAAC,OAAO;wBACnB,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;4BACjD,GAAG,MAAM;4BACT,SAAS,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,SAAS,CAAC;yBACvD,CAAC,CAAC;qBACJ;iBACF,CAAC;QACN,CAAC;IACH,CAAC;IAED;;OAEG;IACK,oBAAoB,CAAC,YAAqB;QAChD,IAAI,CAAC,YAAY;YAAE,OAAO,SAAS,CAAC;QAEpC,+DAA+D;QAC/D,OAAO,YAAY;aAChB,OAAO,CAAC,wDAAwD,EAAE,uBAAuB,CAAC,CAAC,wBAAwB;aACnH,OAAO,CAAC,sBAAsB,EAAE,uBAAuB,CAAC,CAAC,0BAA0B;aACnF,OAAO,CAAC,8CAA8C,EAAE,gBAAgB,CAAC,CAAC,gBAAgB;aAC1F,OAAO,CAAC,qFAAqF,EAAE,iBAAiB,CAAC,CAAC,aAAa;aAC/H,OAAO,CAAC,yCAAyC,EAAE,eAAe,CAAC,CAAC,eAAe;aACnF,OAAO,CAAC,0BAA0B,EAAE,iBAAiB,CAAC,CAAC,uBAAuB;aAC9E,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,6BAA6B;IACrD,CAAC;IAED;;OAEG;IACK,eAAe;QACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAEvC,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;YACxD,MAAM,EAAE;gBACN,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK;gBACtE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK;gBACxE,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG;aACnF;YACD,OAAO,EAAE;gBACP,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,WAAW,EAAE,OAAO,CAAC,OAAO;gBAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC;YAC5C,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAO;oBACL,KAAK,EAAE,CAAC;oBACR,OAAO,EAAE,CAAC;oBACV,SAAS,EAAE,CAAC;oBACZ,OAAO,EAAE,EAAE;iBACZ,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,EAAE,CAAC;YAC3C,MAAM,aAAa,GAAsB,EAAE,CAAC;YAC5C,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,IAAI,cAAc,GAAG,CAAC,CAAC;YAEvB,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;gBACnD,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,KAAK,YAAY,CAAC,SAAS,CAAC;gBAE/D,IAAI,SAAS,EAAE,CAAC;oBACd,YAAY,EAAE,CAAC;gBACjB,CAAC;qBAAM,CAAC;oBACN,cAAc,EAAE,CAAC;gBACnB,CAAC;gBAED,aAAa,CAAC,IAAI,CAAC;oBACjB,IAAI;oBACJ,MAAM,EAAE,UAAU,CAAC,MAAM;oBACzB,OAAO,EAAE,SAAS;oBAClB,aAAa,EAAE,UAAU,CAAC,aAAa;oBACvC,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,OAAO;oBACxC,IAAI,EAAE,UAAU,CAAC,SAAS,CAAC,IAAI;iBAChC,CAAC,CAAC;YACL,CAAC;YAED,OAAO;gBACL,KAAK,EAAE,OAAO,CAAC,IAAI;gBACnB,OAAO,EAAE,YAAY;gBACrB,SAAS,EAAE,cAAc;gBACzB,OAAO,EAAE,aAAa;aACvB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACpD,OAAO;gBACL,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,CAAC;gBACV,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,EAAE;aACZ,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,sBAAsB;QAC5B,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,gBAAgB,CAAC,WAAW,EAAE,CAAC;YACjD,MAAM,WAAW,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;YAErD,MAAM,MAAM,GAAG,SAAS,CAAC,kBAAkB,EAAE,CAAC;YAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;YAC/C,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;YACvF,MAAM,aAAa,GAAG,WAAW,GAAG,YAAY,CAAC;YAEjD,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,WAAW;gBACX,YAAY;gBACZ,aAAa;gBACb,WAAW,EAAE,WAAW,CAAC,aAAa,EAAE;gBACxC,SAAS,EAAE,MAAM,EAAE,yCAAyC;aAC7D,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;YAC3D,OAAO;gBACL,MAAM,EAAE,KAAK;gBACb,WAAW,EAAE,CAAC;gBACd,YAAY,EAAE,CAAC;gBACf,aAAa,EAAE,CAAC;gBAChB,WAAW,EAAE,KAAK;gBAClB,SAAS,EAAE,SAAS;aACrB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,sBAAsB,CAC5B,YAAmE,EACnE,YAAiC;QAEjC,+BAA+B;QAC/B,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YACzB,OAAO,YAAY,CAAC,SAAS,CAAC;QAChC,CAAC;QAED,+DAA+D;QAC/D,IAAI,YAAY,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,YAAY,CAAC,QAAQ,CAAC;QAC/B,CAAC;QAED,gDAAgD;QAChD,IAAI,YAAY,CAAC,OAAO,KAAK,YAAY,CAAC,KAAK,EAAE,CAAC;YAChD,OAAO,YAAY,CAAC,OAAO,CAAC;QAC9B,CAAC;QAED,4DAA4D;QAC5D,IAAI,YAAY,CAAC,OAAO,GAAG,YAAY,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YAClD,OAAO,YAAY,CAAC,QAAQ,CAAC;QAC/B,CAAC;QAED,6DAA6D;QAC7D,OAAO,YAAY,CAAC,SAAS,CAAC;IAChC,CAAC;IAED;;OAEG;IACI,iBAAiB,CAAC,YAA0B;QACjD,QAAQ,YAAY,EAAE,CAAC;YACrB,KAAK,YAAY,CAAC,OAAO;gBACvB,OAAO,GAAG,CAAC;YACb,KAAK,YAAY,CAAC,QAAQ;gBACxB,OAAO,GAAG,CAAC,CAAC,uCAAuC;YACrD,KAAK,YAAY,CAAC,SAAS;gBACzB,OAAO,GAAG,CAAC,CAAC,sBAAsB;YACpC;gBACE,OAAO,GAAG,CAAC,CAAC,wBAAwB;QACxC,CAAC;IACH,CAAC;CACF;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -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;AAKpE;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAwH3C;AAGD,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
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
|
+
/**
|
|
6
|
+
* Creates health check routes
|
|
7
|
+
*/
|
|
8
|
+
export function createHealthRoutes() {
|
|
9
|
+
const router = Router();
|
|
10
|
+
const healthService = HealthService.getInstance();
|
|
11
|
+
// Rate limiter for health endpoints - more permissive than OAuth endpoints
|
|
12
|
+
const createHealthLimiter = () => {
|
|
13
|
+
return rateLimit({
|
|
14
|
+
windowMs: 5 * 60 * 1000, // 5 minutes
|
|
15
|
+
max: 200, // max requests per window per IP (higher limit for monitoring)
|
|
16
|
+
standardHeaders: true,
|
|
17
|
+
legacyHeaders: false,
|
|
18
|
+
message: {
|
|
19
|
+
error: 'Too many health check requests, please try again later.',
|
|
20
|
+
status: 'rate_limited',
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
router.use(createHealthLimiter());
|
|
25
|
+
/**
|
|
26
|
+
* Health check endpoint
|
|
27
|
+
* GET /health
|
|
28
|
+
*
|
|
29
|
+
* Returns comprehensive health status including:
|
|
30
|
+
* - Overall system status
|
|
31
|
+
* - MCP server connectivity status
|
|
32
|
+
* - System metrics (uptime, memory)
|
|
33
|
+
* - Configuration status
|
|
34
|
+
*/
|
|
35
|
+
const healthHandler = async (req, res) => {
|
|
36
|
+
try {
|
|
37
|
+
logger.debug('Health check requested');
|
|
38
|
+
const healthData = await healthService.performHealthCheck();
|
|
39
|
+
const httpStatusCode = healthService.getHttpStatusCode(healthData.status);
|
|
40
|
+
// Set appropriate headers
|
|
41
|
+
res.setHeader('Content-Type', 'application/json');
|
|
42
|
+
res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
|
|
43
|
+
// Add custom headers for monitoring tools
|
|
44
|
+
res.setHeader('X-Health-Status', healthData.status);
|
|
45
|
+
res.setHeader('X-Service-Version', healthData.version);
|
|
46
|
+
res.setHeader('X-Uptime-Seconds', healthData.system.uptime.toString());
|
|
47
|
+
logger.debug(`Health check completed with status: ${healthData.status}`);
|
|
48
|
+
res.status(httpStatusCode).json(healthData);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
logger.error('Health check failed:', error);
|
|
52
|
+
// Return error response with 500 status
|
|
53
|
+
res.status(500).json({
|
|
54
|
+
status: HealthStatus.UNHEALTHY,
|
|
55
|
+
timestamp: new Date().toISOString(),
|
|
56
|
+
error: 'Health check failed',
|
|
57
|
+
message: error instanceof Error ? error.message : 'Unknown error occurred',
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
router.get('/', healthHandler);
|
|
62
|
+
/**
|
|
63
|
+
* Simple liveness probe endpoint
|
|
64
|
+
* GET /health/live
|
|
65
|
+
*
|
|
66
|
+
* Returns minimal response for basic liveness checking
|
|
67
|
+
* Always returns 200 if the server is running
|
|
68
|
+
*/
|
|
69
|
+
const livenessHandler = (req, res) => {
|
|
70
|
+
res.setHeader('Content-Type', 'application/json');
|
|
71
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
72
|
+
res.status(200).json({
|
|
73
|
+
status: 'alive',
|
|
74
|
+
timestamp: new Date().toISOString(),
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
router.get('/live', livenessHandler);
|
|
78
|
+
/**
|
|
79
|
+
* Readiness probe endpoint
|
|
80
|
+
* GET /health/ready
|
|
81
|
+
*
|
|
82
|
+
* Returns 200 if service is ready to accept requests
|
|
83
|
+
* Returns 503 if service is not ready (e.g., configuration not loaded)
|
|
84
|
+
*/
|
|
85
|
+
const readinessHandler = async (req, res) => {
|
|
86
|
+
try {
|
|
87
|
+
const healthData = await healthService.performHealthCheck();
|
|
88
|
+
// Service is ready if configuration is loaded
|
|
89
|
+
const isReady = healthData.configuration.loaded;
|
|
90
|
+
const statusCode = isReady ? 200 : 503;
|
|
91
|
+
res.setHeader('Content-Type', 'application/json');
|
|
92
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
93
|
+
res.status(statusCode).json({
|
|
94
|
+
status: isReady ? 'ready' : 'not_ready',
|
|
95
|
+
timestamp: new Date().toISOString(),
|
|
96
|
+
configuration: healthData.configuration,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
logger.error('Readiness check failed:', error);
|
|
101
|
+
res.status(503).json({
|
|
102
|
+
status: 'not_ready',
|
|
103
|
+
timestamp: new Date().toISOString(),
|
|
104
|
+
error: 'Readiness check failed',
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
router.get('/ready', readinessHandler);
|
|
109
|
+
return router;
|
|
110
|
+
}
|
|
111
|
+
// Export the factory function as default
|
|
112
|
+
export default createHealthRoutes;
|
|
113
|
+
//# 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,4 @@
|
|
|
1
1
|
import { Router } from 'express';
|
|
2
2
|
import { ServerManager } from '../../../core/server/serverManager.js';
|
|
3
|
-
export declare function setupSseRoutes(router: Router, serverManager: ServerManager): void;
|
|
3
|
+
export declare function setupSseRoutes(router: Router, serverManager: ServerManager, authMiddleware: any): void;
|
|
4
4
|
//# 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;AAKtE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,GAAG,IAAI,
|
|
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;AAKtE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,GAAG,IAAI,CAuEtG"}
|
|
@@ -5,8 +5,9 @@ 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) {
|
|
9
|
-
|
|
8
|
+
export function setupSseRoutes(router, serverManager, authMiddleware) {
|
|
9
|
+
const middlewares = [tagsExtractor, authMiddleware];
|
|
10
|
+
router.get(SSE_ENDPOINT, ...middlewares, async (req, res) => {
|
|
10
11
|
try {
|
|
11
12
|
const transport = new SSEServerTransport(MESSAGES_ENDPOINT, res);
|
|
12
13
|
// Use validated tags from scope auth middleware
|
|
@@ -34,7 +35,7 @@ export function setupSseRoutes(router, serverManager) {
|
|
|
34
35
|
res.status(500).end();
|
|
35
36
|
}
|
|
36
37
|
});
|
|
37
|
-
router.post(MESSAGES_ENDPOINT, async (req, res) => {
|
|
38
|
+
router.post(MESSAGES_ENDPOINT, ...middlewares, async (req, res) => {
|
|
38
39
|
try {
|
|
39
40
|
const sessionId = req.query.sessionId;
|
|
40
41
|
if (!sessionId) {
|
|
@@ -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;AAC5D,OAAO,aAAa,MAAM,iCAAiC,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAEzE,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,aAA4B;
|
|
1
|
+
{"version":3,"file":"sseRoutes.js","sourceRoot":"","sources":["../../../../src/transport/http/routes/sseRoutes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { Router } from 'express';
|
|
2
2
|
import { ServerManager } from '../../../core/server/serverManager.js';
|
|
3
|
-
export declare function setupStreamableHttpRoutes(router: Router, serverManager: ServerManager): void;
|
|
3
|
+
export declare function setupStreamableHttpRoutes(router: Router, serverManager: ServerManager, authMiddleware: any): void;
|
|
4
4
|
//# 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;AAKtE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,GAAG,IAAI,
|
|
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;AAKtE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,GAAG,IAAI,CA6HjH"}
|
|
@@ -6,8 +6,9 @@ import { STREAMABLE_HTTP_ENDPOINT } from '../../../constants.js';
|
|
|
6
6
|
import { ServerStatus } from '../../../core/types/index.js';
|
|
7
7
|
import tagsExtractor from '../middlewares/tagsExtractor.js';
|
|
8
8
|
import { getValidatedTags } from '../middlewares/scopeAuthMiddleware.js';
|
|
9
|
-
export function setupStreamableHttpRoutes(router, serverManager) {
|
|
10
|
-
|
|
9
|
+
export function setupStreamableHttpRoutes(router, serverManager, authMiddleware) {
|
|
10
|
+
const middlewares = [tagsExtractor, authMiddleware];
|
|
11
|
+
router.post(STREAMABLE_HTTP_ENDPOINT, ...middlewares, async (req, res) => {
|
|
11
12
|
try {
|
|
12
13
|
let transport;
|
|
13
14
|
const sessionId = req.headers['mcp-session-id'];
|
|
@@ -66,7 +67,7 @@ export function setupStreamableHttpRoutes(router, serverManager) {
|
|
|
66
67
|
res.status(500).end();
|
|
67
68
|
}
|
|
68
69
|
});
|
|
69
|
-
router.get(STREAMABLE_HTTP_ENDPOINT, async (req, res) => {
|
|
70
|
+
router.get(STREAMABLE_HTTP_ENDPOINT, ...middlewares, async (req, res) => {
|
|
70
71
|
try {
|
|
71
72
|
const sessionId = req.headers['mcp-session-id'];
|
|
72
73
|
if (!sessionId) {
|
|
@@ -95,7 +96,7 @@ export function setupStreamableHttpRoutes(router, serverManager) {
|
|
|
95
96
|
res.status(500).end();
|
|
96
97
|
}
|
|
97
98
|
});
|
|
98
|
-
router.delete(STREAMABLE_HTTP_ENDPOINT, async (req, res) => {
|
|
99
|
+
router.delete(STREAMABLE_HTTP_ENDPOINT, ...middlewares, async (req, res) => {
|
|
99
100
|
try {
|
|
100
101
|
const sessionId = req.headers['mcp-session-id'];
|
|
101
102
|
if (!sessionId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamableHttpRoutes.js","sourceRoot":"","sources":["../../../../src/transport/http/routes/streamableHttpRoutes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,MAAM,MAAM,2BAA2B,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,aAAa,MAAM,iCAAiC,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAEzE,MAAM,UAAU,yBAAyB,CAAC,MAAc,EAAE,aAA4B;
|
|
1
|
+
{"version":3,"file":"streamableHttpRoutes.js","sourceRoot":"","sources":["../../../../src/transport/http/routes/streamableHttpRoutes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/transport/http/server.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/transport/http/server.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAWnE;;;;;;;;;;;;GAYG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,aAAa,CAAqB;IAE1C;;;;;;;OAOG;gBACS,aAAa,EAAE,aAAa;IAiBxC;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;IAiBvB;;;;;;;;;OASG;IACH,OAAO,CAAC,WAAW;IA+DnB;;;;;;;;OAQG;IACI,KAAK,IAAI,IAAI;IASpB;;;;;;;OAOG;IACI,QAAQ,IAAI,IAAI;CAGxB"}
|
|
@@ -10,9 +10,11 @@ import { SDKOAuthServerProvider } from '../../auth/sdkOAuthServerProvider.js';
|
|
|
10
10
|
import { setupStreamableHttpRoutes } from './routes/streamableHttpRoutes.js';
|
|
11
11
|
import { setupSseRoutes } from './routes/sseRoutes.js';
|
|
12
12
|
import createOAuthRoutes from './routes/oauthRoutes.js';
|
|
13
|
+
import createHealthRoutes from './routes/healthRoutes.js';
|
|
13
14
|
import { AgentConfigManager } from '../../core/server/agentConfig.js';
|
|
14
15
|
import { RATE_LIMIT_CONFIG } from '../../constants.js';
|
|
15
16
|
import { createScopeAuthMiddleware } from './middlewares/scopeAuthMiddleware.js';
|
|
17
|
+
import { McpConfigManager } from '../../config/mcpConfigManager.js';
|
|
16
18
|
/**
|
|
17
19
|
* ExpressServer orchestrates the HTTP/SSE transport layer for the MCP server.
|
|
18
20
|
*
|
|
@@ -43,6 +45,8 @@ export class ExpressServer {
|
|
|
43
45
|
this.app = express();
|
|
44
46
|
this.serverManager = serverManager;
|
|
45
47
|
this.configManager = AgentConfigManager.getInstance();
|
|
48
|
+
// Configure trust proxy setting before any middleware
|
|
49
|
+
this.app.set('trust proxy', this.configManager.getTrustProxy());
|
|
46
50
|
// Initialize OAuth provider with custom session storage path if configured
|
|
47
51
|
const sessionStoragePath = this.configManager.getSessionStoragePath();
|
|
48
52
|
this.oauthProvider = new SDKOAuthServerProvider(sessionStoragePath);
|
|
@@ -92,9 +96,17 @@ export class ExpressServer {
|
|
|
92
96
|
standardHeaders: true,
|
|
93
97
|
legacyHeaders: false,
|
|
94
98
|
};
|
|
99
|
+
// Get available scopes from MCP config
|
|
100
|
+
const mcpConfigManager = McpConfigManager.getInstance();
|
|
101
|
+
const availableTags = mcpConfigManager.getAvailableTags();
|
|
102
|
+
// Convert tags to supported scopes
|
|
103
|
+
const scopesSupported = availableTags.map((tag) => `tag:${tag}`);
|
|
95
104
|
const authRouter = mcpAuthRouter({
|
|
96
105
|
provider: this.oauthProvider,
|
|
97
106
|
issuerUrl,
|
|
107
|
+
baseUrl: issuerUrl,
|
|
108
|
+
scopesSupported,
|
|
109
|
+
resourceName: '1MCP Agent - Universal MCP Server Proxy',
|
|
98
110
|
authorizationOptions: {
|
|
99
111
|
rateLimit: rateLimitConfig,
|
|
100
112
|
},
|
|
@@ -111,12 +123,13 @@ export class ExpressServer {
|
|
|
111
123
|
this.app.use(authRouter);
|
|
112
124
|
// Setup OAuth management routes (no auth required)
|
|
113
125
|
this.app.use('/oauth', createOAuthRoutes(this.oauthProvider));
|
|
126
|
+
// Setup health check routes (no auth required for monitoring)
|
|
127
|
+
this.app.use('/health', createHealthRoutes());
|
|
114
128
|
// Setup MCP transport routes (auth is handled per-route via scopeAuthMiddleware)
|
|
115
129
|
const router = express.Router();
|
|
116
130
|
const scopeAuthMiddleware = createScopeAuthMiddleware(this.oauthProvider);
|
|
117
|
-
router.
|
|
118
|
-
|
|
119
|
-
setupSseRoutes(router, this.serverManager);
|
|
131
|
+
setupStreamableHttpRoutes(router, this.serverManager, scopeAuthMiddleware);
|
|
132
|
+
setupSseRoutes(router, this.serverManager, scopeAuthMiddleware);
|
|
120
133
|
this.app.use(router);
|
|
121
134
|
// Log authentication status
|
|
122
135
|
if (this.configManager.isAuthEnabled()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/transport/http/server.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,iDAAiD,CAAC;AAChF,OAAO,MAAM,MAAM,wBAAwB,CAAC;AAC5C,OAAO,YAAY,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAEvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,iBAAiB,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/transport/http/server.ts"],"names":[],"mappings":"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"}
|