@nitrostack/core 1.0.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/LICENSE +201 -0
- package/README.md +80 -0
- package/dist/auth/api-key.d.ts +118 -0
- package/dist/auth/api-key.d.ts.map +1 -0
- package/dist/auth/api-key.js +168 -0
- package/dist/auth/api-key.js.map +1 -0
- package/dist/auth/client.d.ts +151 -0
- package/dist/auth/client.d.ts.map +1 -0
- package/dist/auth/client.js +330 -0
- package/dist/auth/client.js.map +1 -0
- package/dist/auth/index.d.ts +31 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +46 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware.d.ts +95 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +260 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/pkce.d.ts +53 -0
- package/dist/auth/pkce.d.ts.map +1 -0
- package/dist/auth/pkce.js +105 -0
- package/dist/auth/pkce.js.map +1 -0
- package/dist/auth/quick-setup.d.ts +94 -0
- package/dist/auth/quick-setup.d.ts.map +1 -0
- package/dist/auth/quick-setup.js +210 -0
- package/dist/auth/quick-setup.js.map +1 -0
- package/dist/auth/secure-secret.d.ts +136 -0
- package/dist/auth/secure-secret.d.ts.map +1 -0
- package/dist/auth/secure-secret.js +182 -0
- package/dist/auth/secure-secret.js.map +1 -0
- package/dist/auth/server-integration.d.ts +97 -0
- package/dist/auth/server-integration.d.ts.map +1 -0
- package/dist/auth/server-integration.js +182 -0
- package/dist/auth/server-integration.js.map +1 -0
- package/dist/auth/server-metadata.d.ts +51 -0
- package/dist/auth/server-metadata.d.ts.map +1 -0
- package/dist/auth/server-metadata.js +106 -0
- package/dist/auth/server-metadata.js.map +1 -0
- package/dist/auth/simple-jwt.d.ts +174 -0
- package/dist/auth/simple-jwt.d.ts.map +1 -0
- package/dist/auth/simple-jwt.js +162 -0
- package/dist/auth/simple-jwt.js.map +1 -0
- package/dist/auth/token-store.d.ts +104 -0
- package/dist/auth/token-store.d.ts.map +1 -0
- package/dist/auth/token-store.js +205 -0
- package/dist/auth/token-store.js.map +1 -0
- package/dist/auth/token-validation.d.ts +59 -0
- package/dist/auth/token-validation.d.ts.map +1 -0
- package/dist/auth/token-validation.js +241 -0
- package/dist/auth/token-validation.js.map +1 -0
- package/dist/auth/types.d.ts +215 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +6 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/core/apikey-module.d.ts +69 -0
- package/dist/core/apikey-module.d.ts.map +1 -0
- package/dist/core/apikey-module.js +114 -0
- package/dist/core/apikey-module.js.map +1 -0
- package/dist/core/app-decorator.d.ts +59 -0
- package/dist/core/app-decorator.d.ts.map +1 -0
- package/dist/core/app-decorator.js +322 -0
- package/dist/core/app-decorator.js.map +1 -0
- package/dist/core/builders.d.ts +50 -0
- package/dist/core/builders.d.ts.map +1 -0
- package/dist/core/builders.js +139 -0
- package/dist/core/builders.js.map +1 -0
- package/dist/core/component.d.ts +111 -0
- package/dist/core/component.d.ts.map +1 -0
- package/dist/core/component.js +228 -0
- package/dist/core/component.js.map +1 -0
- package/dist/core/config-module.d.ts +62 -0
- package/dist/core/config-module.d.ts.map +1 -0
- package/dist/core/config-module.js +94 -0
- package/dist/core/config-module.js.map +1 -0
- package/dist/core/decorators/cache.decorator.d.ts +61 -0
- package/dist/core/decorators/cache.decorator.d.ts.map +1 -0
- package/dist/core/decorators/cache.decorator.js +115 -0
- package/dist/core/decorators/cache.decorator.js.map +1 -0
- package/dist/core/decorators/health-check.decorator.d.ts +80 -0
- package/dist/core/decorators/health-check.decorator.d.ts.map +1 -0
- package/dist/core/decorators/health-check.decorator.js +153 -0
- package/dist/core/decorators/health-check.decorator.js.map +1 -0
- package/dist/core/decorators/rate-limit.decorator.d.ts +63 -0
- package/dist/core/decorators/rate-limit.decorator.d.ts.map +1 -0
- package/dist/core/decorators/rate-limit.decorator.js +129 -0
- package/dist/core/decorators/rate-limit.decorator.js.map +1 -0
- package/dist/core/decorators.d.ts +190 -0
- package/dist/core/decorators.d.ts.map +1 -0
- package/dist/core/decorators.js +170 -0
- package/dist/core/decorators.js.map +1 -0
- package/dist/core/di/container.d.ts +64 -0
- package/dist/core/di/container.d.ts.map +1 -0
- package/dist/core/di/container.js +105 -0
- package/dist/core/di/container.js.map +1 -0
- package/dist/core/di/injectable.decorator.d.ts +62 -0
- package/dist/core/di/injectable.decorator.d.ts.map +1 -0
- package/dist/core/di/injectable.decorator.js +66 -0
- package/dist/core/di/injectable.decorator.js.map +1 -0
- package/dist/core/errors.d.ts +54 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +87 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/events/event-emitter.d.ts +50 -0
- package/dist/core/events/event-emitter.d.ts.map +1 -0
- package/dist/core/events/event-emitter.js +94 -0
- package/dist/core/events/event-emitter.js.map +1 -0
- package/dist/core/events/event.decorator.d.ts +48 -0
- package/dist/core/events/event.decorator.d.ts.map +1 -0
- package/dist/core/events/event.decorator.js +72 -0
- package/dist/core/events/event.decorator.js.map +1 -0
- package/dist/core/events/log-emitter.d.ts +14 -0
- package/dist/core/events/log-emitter.d.ts.map +1 -0
- package/dist/core/events/log-emitter.js +20 -0
- package/dist/core/events/log-emitter.js.map +1 -0
- package/dist/core/filters/exception-filter.decorator.d.ts +40 -0
- package/dist/core/filters/exception-filter.decorator.d.ts.map +1 -0
- package/dist/core/filters/exception-filter.decorator.js +54 -0
- package/dist/core/filters/exception-filter.decorator.js.map +1 -0
- package/dist/core/filters/exception-filter.interface.d.ts +39 -0
- package/dist/core/filters/exception-filter.interface.d.ts.map +1 -0
- package/dist/core/filters/exception-filter.interface.js +2 -0
- package/dist/core/filters/exception-filter.interface.js.map +1 -0
- package/dist/core/guards/apikey.guard.d.ts +22 -0
- package/dist/core/guards/apikey.guard.d.ts.map +1 -0
- package/dist/core/guards/apikey.guard.js +11 -0
- package/dist/core/guards/apikey.guard.js.map +1 -0
- package/dist/core/guards/guard.interface.d.ts +18 -0
- package/dist/core/guards/guard.interface.d.ts.map +1 -0
- package/dist/core/guards/guard.interface.js +2 -0
- package/dist/core/guards/guard.interface.js.map +1 -0
- package/dist/core/guards/jwt.guard.d.ts +18 -0
- package/dist/core/guards/jwt.guard.d.ts.map +1 -0
- package/dist/core/guards/jwt.guard.js +2 -0
- package/dist/core/guards/jwt.guard.js.map +1 -0
- package/dist/core/guards/oauth.guard.d.ts +35 -0
- package/dist/core/guards/oauth.guard.d.ts.map +1 -0
- package/dist/core/guards/oauth.guard.js +2 -0
- package/dist/core/guards/oauth.guard.js.map +1 -0
- package/dist/core/guards/use-guards.decorator.d.ts +25 -0
- package/dist/core/guards/use-guards.decorator.d.ts.map +1 -0
- package/dist/core/guards/use-guards.decorator.js +32 -0
- package/dist/core/guards/use-guards.decorator.js.map +1 -0
- package/dist/core/health/health-checks.resource.d.ts +14 -0
- package/dist/core/health/health-checks.resource.d.ts.map +1 -0
- package/dist/core/health/health-checks.resource.js +29 -0
- package/dist/core/health/health-checks.resource.js.map +1 -0
- package/dist/core/index.d.ts +57 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +59 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/interceptors/interceptor.decorator.d.ts +37 -0
- package/dist/core/interceptors/interceptor.decorator.d.ts.map +1 -0
- package/dist/core/interceptors/interceptor.decorator.js +51 -0
- package/dist/core/interceptors/interceptor.decorator.js.map +1 -0
- package/dist/core/interceptors/interceptor.interface.d.ts +31 -0
- package/dist/core/interceptors/interceptor.interface.d.ts.map +1 -0
- package/dist/core/interceptors/interceptor.interface.js +2 -0
- package/dist/core/interceptors/interceptor.interface.js.map +1 -0
- package/dist/core/jwt-module.d.ts +51 -0
- package/dist/core/jwt-module.d.ts.map +1 -0
- package/dist/core/jwt-module.js +52 -0
- package/dist/core/jwt-module.js.map +1 -0
- package/dist/core/logger.d.ts +18 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +53 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/middleware/middleware.decorator.d.ts +39 -0
- package/dist/core/middleware/middleware.decorator.d.ts.map +1 -0
- package/dist/core/middleware/middleware.decorator.js +53 -0
- package/dist/core/middleware/middleware.decorator.js.map +1 -0
- package/dist/core/middleware/middleware.interface.d.ts +29 -0
- package/dist/core/middleware/middleware.interface.d.ts.map +1 -0
- package/dist/core/middleware/middleware.interface.js +2 -0
- package/dist/core/middleware/middleware.interface.js.map +1 -0
- package/dist/core/module.d.ts +93 -0
- package/dist/core/module.d.ts.map +1 -0
- package/dist/core/module.js +87 -0
- package/dist/core/module.js.map +1 -0
- package/dist/core/oauth-module.d.ts +123 -0
- package/dist/core/oauth-module.d.ts.map +1 -0
- package/dist/core/oauth-module.js +324 -0
- package/dist/core/oauth-module.js.map +1 -0
- package/dist/core/pipes/pipe.decorator.d.ts +64 -0
- package/dist/core/pipes/pipe.decorator.d.ts.map +1 -0
- package/dist/core/pipes/pipe.decorator.js +85 -0
- package/dist/core/pipes/pipe.decorator.js.map +1 -0
- package/dist/core/pipes/pipe.interface.d.ts +41 -0
- package/dist/core/pipes/pipe.interface.d.ts.map +1 -0
- package/dist/core/pipes/pipe.interface.js +2 -0
- package/dist/core/pipes/pipe.interface.js.map +1 -0
- package/dist/core/prompt.d.ts +46 -0
- package/dist/core/prompt.d.ts.map +1 -0
- package/dist/core/prompt.js +76 -0
- package/dist/core/prompt.js.map +1 -0
- package/dist/core/resource.d.ts +47 -0
- package/dist/core/resource.d.ts.map +1 -0
- package/dist/core/resource.js +90 -0
- package/dist/core/resource.js.map +1 -0
- package/dist/core/server.d.ts +129 -0
- package/dist/core/server.d.ts.map +1 -0
- package/dist/core/server.js +617 -0
- package/dist/core/server.js.map +1 -0
- package/dist/core/tool.d.ts +108 -0
- package/dist/core/tool.d.ts.map +1 -0
- package/dist/core/tool.js +241 -0
- package/dist/core/tool.js.map +1 -0
- package/dist/core/transports/discovery-http-server.d.ts +19 -0
- package/dist/core/transports/discovery-http-server.d.ts.map +1 -0
- package/dist/core/transports/discovery-http-server.js +54 -0
- package/dist/core/transports/discovery-http-server.js.map +1 -0
- package/dist/core/transports/http-server.d.ts +108 -0
- package/dist/core/transports/http-server.d.ts.map +1 -0
- package/dist/core/transports/http-server.js +293 -0
- package/dist/core/transports/http-server.js.map +1 -0
- package/dist/core/transports/streamable-http.d.ts +177 -0
- package/dist/core/transports/streamable-http.d.ts.map +1 -0
- package/dist/core/transports/streamable-http.js +1287 -0
- package/dist/core/transports/streamable-http.js.map +1 -0
- package/dist/core/types.d.ts +195 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/widgets/widget-examples.resource.d.ts +17 -0
- package/dist/core/widgets/widget-examples.resource.d.ts.map +1 -0
- package/dist/core/widgets/widget-examples.resource.js +28 -0
- package/dist/core/widgets/widget-examples.resource.js.map +1 -0
- package/dist/core/widgets/widget-registry.d.ts +56 -0
- package/dist/core/widgets/widget-registry.d.ts.map +1 -0
- package/dist/core/widgets/widget-registry.js +75 -0
- package/dist/core/widgets/widget-registry.js.map +1 -0
- package/dist/testing/index.d.ts +103 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +161 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/ui-next/index.d.ts +31 -0
- package/dist/ui-next/index.d.ts.map +1 -0
- package/dist/ui-next/index.js +687 -0
- package/dist/ui-next/index.js.map +1 -0
- package/package.json +89 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Server Transport for MCP
|
|
3
|
+
*
|
|
4
|
+
* Implements HTTP transport with Server-Sent Events (SSE) for bidirectional communication.
|
|
5
|
+
* Required for OAuth 2.1 authentication as per MCP specification.
|
|
6
|
+
*
|
|
7
|
+
* This transport:
|
|
8
|
+
* - Exposes MCP over HTTP endpoints
|
|
9
|
+
* - Provides OAuth 2.1 metadata endpoints (RFC 9728)
|
|
10
|
+
* - Uses SSE for server-to-client messages
|
|
11
|
+
* - Uses POST for client-to-server messages
|
|
12
|
+
*/
|
|
13
|
+
import express from 'express';
|
|
14
|
+
/**
|
|
15
|
+
* HTTP Server Transport
|
|
16
|
+
*
|
|
17
|
+
* Implements MCP protocol over HTTP with SSE for real-time communication.
|
|
18
|
+
* Compatible with OAuth 2.1 authentication.
|
|
19
|
+
*/
|
|
20
|
+
export class HttpServerTransport {
|
|
21
|
+
app;
|
|
22
|
+
server = null;
|
|
23
|
+
sseClients = new Map();
|
|
24
|
+
messageHandler;
|
|
25
|
+
closeHandler;
|
|
26
|
+
errorHandler;
|
|
27
|
+
options;
|
|
28
|
+
constructor(options = {}) {
|
|
29
|
+
this.options = {
|
|
30
|
+
port: options.port || 3000,
|
|
31
|
+
host: options.host || '0.0.0.0',
|
|
32
|
+
basePath: options.basePath || '/mcp',
|
|
33
|
+
oauth: options.oauth,
|
|
34
|
+
};
|
|
35
|
+
this.app = options.app || express();
|
|
36
|
+
this.setupRoutes();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Setup HTTP routes for MCP protocol
|
|
40
|
+
*/
|
|
41
|
+
setupRoutes() {
|
|
42
|
+
const basePath = this.options.basePath;
|
|
43
|
+
// Enable CORS
|
|
44
|
+
this.app.use((req, res, next) => {
|
|
45
|
+
res.header('Access-Control-Allow-Origin', '*');
|
|
46
|
+
res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
|
|
47
|
+
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
|
|
48
|
+
if (req.method === 'OPTIONS') {
|
|
49
|
+
res.sendStatus(200);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
next();
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
// JSON parsing
|
|
56
|
+
this.app.use(express.json());
|
|
57
|
+
// SSE endpoint for server-to-client messages
|
|
58
|
+
this.app.get(`${basePath}/sse`, (req, res) => {
|
|
59
|
+
this.handleSSE(req, res);
|
|
60
|
+
});
|
|
61
|
+
// POST endpoint for client-to-server messages
|
|
62
|
+
this.app.post(`${basePath}/message`, async (req, res) => {
|
|
63
|
+
await this.handleMessage(req, res);
|
|
64
|
+
});
|
|
65
|
+
// OAuth 2.1 Protected Resource Metadata (RFC 9728)
|
|
66
|
+
if (this.options.oauth) {
|
|
67
|
+
this.app.get('/.well-known/oauth-protected-resource', (req, res) => {
|
|
68
|
+
this.handleProtectedResourceMetadata(req, res);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
// Root info endpoint
|
|
72
|
+
this.app.get(basePath, (req, res) => {
|
|
73
|
+
res.json({
|
|
74
|
+
name: 'NitroStack MCP Server',
|
|
75
|
+
version: '1.0.0',
|
|
76
|
+
transport: 'HTTP',
|
|
77
|
+
status: 'running',
|
|
78
|
+
endpoints: {
|
|
79
|
+
sse: `${basePath}/sse`,
|
|
80
|
+
message: `${basePath}/message`,
|
|
81
|
+
health: `${basePath}/health`,
|
|
82
|
+
},
|
|
83
|
+
docs: 'https://github.com/nitrostack/nitrostack',
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
// Health check
|
|
87
|
+
this.app.get(`${basePath}/health`, (req, res) => {
|
|
88
|
+
res.json({
|
|
89
|
+
status: 'ok',
|
|
90
|
+
transport: 'http',
|
|
91
|
+
uptime: process.uptime(),
|
|
92
|
+
timestamp: new Date().toISOString(),
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Handle SSE connection for server-to-client messages
|
|
98
|
+
*/
|
|
99
|
+
handleSSE(req, res) {
|
|
100
|
+
const clientId = req.query.clientId || `client_${Date.now()}`;
|
|
101
|
+
// Setup SSE
|
|
102
|
+
res.writeHead(200, {
|
|
103
|
+
'Content-Type': 'text/event-stream',
|
|
104
|
+
'Cache-Control': 'no-cache',
|
|
105
|
+
'Connection': 'keep-alive',
|
|
106
|
+
});
|
|
107
|
+
// Store client
|
|
108
|
+
this.sseClients.set(clientId, res);
|
|
109
|
+
// Send initial connection event
|
|
110
|
+
res.write(`data: ${JSON.stringify({ type: 'connected', clientId })}\n\n`);
|
|
111
|
+
// Handle client disconnect
|
|
112
|
+
req.on('close', () => {
|
|
113
|
+
this.sseClients.delete(clientId);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Handle incoming message from client
|
|
118
|
+
*/
|
|
119
|
+
async handleMessage(req, res) {
|
|
120
|
+
try {
|
|
121
|
+
const message = req.body;
|
|
122
|
+
if (!message || !message.jsonrpc) {
|
|
123
|
+
res.status(400).json({ error: 'Invalid JSON-RPC message' });
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
// Pass to message handler
|
|
127
|
+
if (this.messageHandler) {
|
|
128
|
+
await this.messageHandler(message);
|
|
129
|
+
}
|
|
130
|
+
res.json({ status: 'received' });
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
console.error('Error handling message:', error);
|
|
134
|
+
res.status(500).json({ error: error instanceof Error ? error.message : String(error) });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Handle OAuth Protected Resource Metadata request (RFC 9728)
|
|
139
|
+
*/
|
|
140
|
+
handleProtectedResourceMetadata(req, res) {
|
|
141
|
+
if (!this.options.oauth) {
|
|
142
|
+
res.status(404).json({ error: 'OAuth not configured' });
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const metadata = {
|
|
146
|
+
resource: this.options.oauth.resourceUri,
|
|
147
|
+
authorization_servers: this.options.oauth.authorizationServers,
|
|
148
|
+
...(this.options.oauth.scopesSupported && {
|
|
149
|
+
scopes_supported: this.options.oauth.scopesSupported,
|
|
150
|
+
}),
|
|
151
|
+
};
|
|
152
|
+
res.json(metadata);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Start the HTTP server
|
|
156
|
+
*/
|
|
157
|
+
async start() {
|
|
158
|
+
// Close existing server if any
|
|
159
|
+
if (this.server) {
|
|
160
|
+
await this.close();
|
|
161
|
+
}
|
|
162
|
+
return new Promise((resolve, reject) => {
|
|
163
|
+
// Set up error handler BEFORE calling listen
|
|
164
|
+
const errorHandler = (error) => {
|
|
165
|
+
console.error(`❌ Failed to start HTTP server: ${error.message}`);
|
|
166
|
+
this.server = null;
|
|
167
|
+
reject(error);
|
|
168
|
+
};
|
|
169
|
+
try {
|
|
170
|
+
const server = this.app.listen(this.options.port, this.options.host);
|
|
171
|
+
// Register error handler immediately
|
|
172
|
+
server.once('error', errorHandler);
|
|
173
|
+
// Success handler
|
|
174
|
+
server.once('listening', () => {
|
|
175
|
+
// Remove error handler since we're now listening
|
|
176
|
+
server.removeListener('error', errorHandler);
|
|
177
|
+
// Set up permanent error handler for runtime errors
|
|
178
|
+
server.on('error', (error) => {
|
|
179
|
+
if (this.errorHandler) {
|
|
180
|
+
this.errorHandler(error);
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
console.error('HTTP server error:', error);
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
this.server = server;
|
|
187
|
+
console.error(`🌐 HTTP MCP Server listening on http://${this.options.host}:${this.options.port}${this.options.basePath}`);
|
|
188
|
+
if (this.options.oauth) {
|
|
189
|
+
console.error(`🔐 OAuth 2.1 enabled`);
|
|
190
|
+
console.error(` Resource URI: ${this.options.oauth.resourceUri}`);
|
|
191
|
+
console.error(` Auth Servers: ${this.options.oauth.authorizationServers.join(', ')}`);
|
|
192
|
+
console.error(` Metadata: http://${this.options.host}:${this.options.port}/.well-known/oauth-protected-resource`);
|
|
193
|
+
}
|
|
194
|
+
resolve();
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
reject(error);
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Send message to client(s)
|
|
204
|
+
*/
|
|
205
|
+
async send(message) {
|
|
206
|
+
const data = `data: ${JSON.stringify(message)}\n\n`;
|
|
207
|
+
// Send to all connected SSE clients
|
|
208
|
+
for (const [clientId, res] of this.sseClients) {
|
|
209
|
+
try {
|
|
210
|
+
res.write(data);
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
console.error(`Error sending to client ${clientId}:`, error);
|
|
214
|
+
this.sseClients.delete(clientId);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Close the transport
|
|
220
|
+
*/
|
|
221
|
+
async close() {
|
|
222
|
+
// Close all SSE connections
|
|
223
|
+
for (const [clientId, res] of this.sseClients) {
|
|
224
|
+
try {
|
|
225
|
+
res.end();
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
// Ignore errors on close
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
this.sseClients.clear();
|
|
232
|
+
// Close HTTP server
|
|
233
|
+
if (this.server) {
|
|
234
|
+
return new Promise((resolve) => {
|
|
235
|
+
const server = this.server;
|
|
236
|
+
this.server = null; // Clear reference immediately
|
|
237
|
+
// Force close all connections
|
|
238
|
+
server.closeAllConnections?.(); // Available in Node 18+
|
|
239
|
+
server.close((err) => {
|
|
240
|
+
if (err) {
|
|
241
|
+
console.error('HTTP server close error (ignoring):', err.message);
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
console.error('🔌 HTTP MCP Server closed');
|
|
245
|
+
}
|
|
246
|
+
// Small delay to ensure port is fully released
|
|
247
|
+
setTimeout(() => {
|
|
248
|
+
if (this.closeHandler) {
|
|
249
|
+
this.closeHandler();
|
|
250
|
+
}
|
|
251
|
+
resolve();
|
|
252
|
+
}, 100);
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
if (this.closeHandler) {
|
|
257
|
+
this.closeHandler();
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Set message handler
|
|
262
|
+
*/
|
|
263
|
+
set onmessage(handler) {
|
|
264
|
+
this.messageHandler = handler;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Set close handler
|
|
268
|
+
*/
|
|
269
|
+
set onclose(handler) {
|
|
270
|
+
this.closeHandler = handler;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Set error handler
|
|
274
|
+
*/
|
|
275
|
+
set onerror(handler) {
|
|
276
|
+
this.errorHandler = handler;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Get the Express app (for adding custom routes)
|
|
280
|
+
*/
|
|
281
|
+
getApp() {
|
|
282
|
+
return this.app;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Register a custom route handler (compatible with DiscoveryHttpServer interface)
|
|
286
|
+
* @param path - The route path
|
|
287
|
+
* @param handler - The request handler (Node.js http.RequestListener format)
|
|
288
|
+
*/
|
|
289
|
+
on(path, handler) {
|
|
290
|
+
this.app.get(path, handler);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=http-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../../src/core/transports/http-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streamable HTTP Transport for MCP
|
|
3
|
+
*
|
|
4
|
+
* Implements the MCP Streamable HTTP transport specification (2025-06-18).
|
|
5
|
+
* https://modelcontextprotocol.io/specification/2025-06-18/basic/transports#streamable-http
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Single MCP endpoint supporting both POST and GET
|
|
9
|
+
* - POST for sending messages to server
|
|
10
|
+
* - GET for SSE streams from server
|
|
11
|
+
* - Session management with Mcp-Session-Id header
|
|
12
|
+
* - Resumability support with Last-Event-ID
|
|
13
|
+
* - Multiple concurrent client connections
|
|
14
|
+
* - Protocol version header support
|
|
15
|
+
*/
|
|
16
|
+
import { Express, Request, Response } from 'express';
|
|
17
|
+
import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
18
|
+
import { JSONRPCMessage, Tool as McpTool } from '@modelcontextprotocol/sdk/types.js';
|
|
19
|
+
export interface StreamableHttpTransportOptions {
|
|
20
|
+
/**
|
|
21
|
+
* Port to listen on (default: 3000)
|
|
22
|
+
*/
|
|
23
|
+
port?: number;
|
|
24
|
+
/**
|
|
25
|
+
* Host to bind to (default: 'localhost' for security)
|
|
26
|
+
*/
|
|
27
|
+
host?: string;
|
|
28
|
+
/**
|
|
29
|
+
* MCP endpoint path (default: '/mcp')
|
|
30
|
+
*/
|
|
31
|
+
endpoint?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Enable session management (default: true)
|
|
34
|
+
*/
|
|
35
|
+
enableSessions?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Session timeout in ms (default: 30 minutes)
|
|
38
|
+
*/
|
|
39
|
+
sessionTimeout?: number;
|
|
40
|
+
/**
|
|
41
|
+
* Custom Express app (optional)
|
|
42
|
+
*/
|
|
43
|
+
app?: Express;
|
|
44
|
+
/**
|
|
45
|
+
* Enable CORS (default: false for security)
|
|
46
|
+
*/
|
|
47
|
+
enableCors?: boolean;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Streamable HTTP Transport
|
|
51
|
+
* Implements MCP Streamable HTTP specification
|
|
52
|
+
*/
|
|
53
|
+
export declare class StreamableHttpTransport implements Transport {
|
|
54
|
+
private app;
|
|
55
|
+
private server;
|
|
56
|
+
private sessions;
|
|
57
|
+
private activeStreams;
|
|
58
|
+
private messageHandler?;
|
|
59
|
+
private closeHandler?;
|
|
60
|
+
private errorHandler?;
|
|
61
|
+
private options;
|
|
62
|
+
private sessionCleanupInterval?;
|
|
63
|
+
private getToolsCallback?;
|
|
64
|
+
private serverConfig?;
|
|
65
|
+
private logoBase64?;
|
|
66
|
+
constructor(options?: StreamableHttpTransportOptions);
|
|
67
|
+
/**
|
|
68
|
+
* Load logo image as base64 for embedding in documentation page
|
|
69
|
+
*/
|
|
70
|
+
private loadLogo;
|
|
71
|
+
/**
|
|
72
|
+
* Setup Express middleware
|
|
73
|
+
*/
|
|
74
|
+
private setupMiddleware;
|
|
75
|
+
/**
|
|
76
|
+
* Setup MCP endpoint routes
|
|
77
|
+
*/
|
|
78
|
+
private setupRoutes;
|
|
79
|
+
/**
|
|
80
|
+
* Handle POST requests (client sending messages to server)
|
|
81
|
+
*/
|
|
82
|
+
private handlePost;
|
|
83
|
+
/**
|
|
84
|
+
* Handle GET requests (client opening SSE stream)
|
|
85
|
+
*/
|
|
86
|
+
private handleGet;
|
|
87
|
+
/**
|
|
88
|
+
* Handle DELETE requests (session termination)
|
|
89
|
+
*/
|
|
90
|
+
private handleDelete;
|
|
91
|
+
/**
|
|
92
|
+
* Start SSE stream for a request
|
|
93
|
+
*/
|
|
94
|
+
private startSSEStream;
|
|
95
|
+
/**
|
|
96
|
+
* Send message to client(s)
|
|
97
|
+
*/
|
|
98
|
+
send(message: JSONRPCMessage): Promise<void>;
|
|
99
|
+
/**
|
|
100
|
+
* Send message to a specific stream
|
|
101
|
+
*/
|
|
102
|
+
private sendToStream;
|
|
103
|
+
/**
|
|
104
|
+
* Send response to the stream that made the request
|
|
105
|
+
*/
|
|
106
|
+
private sendToRequestStream;
|
|
107
|
+
/**
|
|
108
|
+
* Send message to a sessionless stream
|
|
109
|
+
*/
|
|
110
|
+
private sendToStreamSessionless;
|
|
111
|
+
/**
|
|
112
|
+
* Replay messages for resumability
|
|
113
|
+
*/
|
|
114
|
+
private replayMessages;
|
|
115
|
+
/**
|
|
116
|
+
* Start the HTTP server
|
|
117
|
+
*/
|
|
118
|
+
start(): Promise<void>;
|
|
119
|
+
/**
|
|
120
|
+
* Register additional HTTP routes
|
|
121
|
+
* Allows modules (like OAuthModule) to add custom endpoints
|
|
122
|
+
*/
|
|
123
|
+
on(path: string, handler: (req: Request, res: Response) => void): void;
|
|
124
|
+
/**
|
|
125
|
+
* Close the transport
|
|
126
|
+
*/
|
|
127
|
+
close(): Promise<void>;
|
|
128
|
+
/**
|
|
129
|
+
* Set message handler
|
|
130
|
+
*/
|
|
131
|
+
set onmessage(handler: (message: JSONRPCMessage) => Promise<void>);
|
|
132
|
+
/**
|
|
133
|
+
* Set close handler
|
|
134
|
+
*/
|
|
135
|
+
set onclose(handler: () => void);
|
|
136
|
+
/**
|
|
137
|
+
* Set error handler
|
|
138
|
+
*/
|
|
139
|
+
set onerror(handler: (error: Error) => void);
|
|
140
|
+
/**
|
|
141
|
+
* Start session cleanup interval
|
|
142
|
+
*/
|
|
143
|
+
private startSessionCleanup;
|
|
144
|
+
/**
|
|
145
|
+
* Helper methods
|
|
146
|
+
*/
|
|
147
|
+
private generateSessionId;
|
|
148
|
+
private getMessageType;
|
|
149
|
+
private isResponse;
|
|
150
|
+
private isInitializeRequest;
|
|
151
|
+
private isLocalhost;
|
|
152
|
+
/**
|
|
153
|
+
* Get the Express app (for adding custom routes)
|
|
154
|
+
*/
|
|
155
|
+
getApp(): Express;
|
|
156
|
+
/**
|
|
157
|
+
* Set callback to get tools list for documentation page
|
|
158
|
+
*/
|
|
159
|
+
setToolsCallback(callback: () => Promise<McpTool[]>): void;
|
|
160
|
+
/**
|
|
161
|
+
* Set server configuration for documentation page
|
|
162
|
+
*/
|
|
163
|
+
setServerConfig(config: {
|
|
164
|
+
name: string;
|
|
165
|
+
version: string;
|
|
166
|
+
description?: string;
|
|
167
|
+
}): void;
|
|
168
|
+
/**
|
|
169
|
+
* Generate HTML documentation page
|
|
170
|
+
*/
|
|
171
|
+
private generateDocumentationPage;
|
|
172
|
+
/**
|
|
173
|
+
* Escape HTML to prevent XSS
|
|
174
|
+
*/
|
|
175
|
+
private escapeHtml;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=streamable-http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamable-http.d.ts","sourceRoot":"","sources":["../../../src/core/transports/streamable-http.ts"],"names":[],"mappings":"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"}
|