|
13 | 13 | */ |
14 | 14 |
|
15 | 15 | import { createServer, IncomingMessage, ServerResponse } from 'http'; |
| 16 | +import { Server } from '@modelcontextprotocol/sdk/server/index.js'; |
16 | 17 | import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'; |
17 | 18 | import { createMCPServer, getPackageVersion } from './server.js'; |
18 | 19 |
|
19 | | -// 会话存储:sessionId -> transport |
| 20 | +// 会话存储:sessionId -> session info |
20 | 21 | interface SessionInfo { |
| 22 | + server: Server; // 每个会话独立的 server 实例 |
21 | 23 | transport: StreamableHTTPServerTransport; |
22 | 24 | lastActivity: number; |
23 | 25 | requestQueue: Array<() => Promise<void>>; |
@@ -142,9 +144,6 @@ async function main() { |
142 | 144 | processedHosts = ['::']; |
143 | 145 | } |
144 | 146 |
|
145 | | - // 创建 MCP 服务器 |
146 | | - const server = createMCPServer(); |
147 | | - |
148 | 147 | console.log(`[${new Date().toISOString()}] MCP 服务器已启动`); |
149 | 148 | console.log(`[${new Date().toISOString()}] 模式: ${stateless ? '无状态 (Stateless)' : '有状态 (Stateful)'}`); |
150 | 149 |
|
@@ -194,24 +193,33 @@ async function main() { |
194 | 193 | req.on('end', async () => { |
195 | 194 | try { |
196 | 195 | let transport: StreamableHTTPServerTransport; |
| 196 | + let mcpServer: Server; |
197 | 197 |
|
198 | 198 | if (stateless) { |
| 199 | + // 无状态模式:每个请求创建独立的 server 和 transport |
| 200 | + mcpServer = createMCPServer(); |
199 | 201 | transport = new StreamableHTTPServerTransport({ |
200 | 202 | sessionIdGenerator: undefined, |
201 | 203 | }); |
202 | | - await server.connect(transport); |
| 204 | + await mcpServer.connect(transport); |
203 | 205 | } else { |
204 | 206 | if (sessionId && sessions.has(sessionId)) { |
205 | | - transport = sessions.get(sessionId)!.transport; |
206 | | - sessions.get(sessionId)!.lastActivity = Date.now(); |
| 207 | + // 复用已有会话 |
| 208 | + const session = sessions.get(sessionId)!; |
| 209 | + transport = session.transport; |
| 210 | + mcpServer = session.server; |
| 211 | + session.lastActivity = Date.now(); |
207 | 212 | } else { |
| 213 | + // 创建新会话:每个会话独立的 server 实例 |
208 | 214 | const newSessionId = sessionId || crypto.randomUUID(); |
| 215 | + mcpServer = createMCPServer(); |
209 | 216 | transport = new StreamableHTTPServerTransport({ |
210 | 217 | sessionIdGenerator: () => newSessionId, |
211 | 218 | }); |
212 | | - await server.connect(transport); |
| 219 | + await mcpServer.connect(transport); |
213 | 220 |
|
214 | 221 | sessions.set(newSessionId, { |
| 222 | + server: mcpServer, |
215 | 223 | transport, |
216 | 224 | lastActivity: Date.now(), |
217 | 225 | requestQueue: [], |
@@ -340,6 +348,7 @@ async function main() { |
340 | 348 | for (const [sessionId, info] of sessions) { |
341 | 349 | try { |
342 | 350 | await info.transport.close(); |
| 351 | + await info.server.close(); |
343 | 352 | } catch { |
344 | 353 | // 忽略关闭错误 |
345 | 354 | } |
|
0 commit comments