mcp-server-db2i 1.2.1 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +90 -308
- package/dist/auth/authMiddleware.d.ts +66 -0
- package/dist/auth/authMiddleware.d.ts.map +1 -0
- package/dist/auth/authMiddleware.js +217 -0
- package/dist/auth/authMiddleware.js.map +1 -0
- package/dist/auth/index.d.ts +9 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +10 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/tokenManager.d.ts +114 -0
- package/dist/auth/tokenManager.d.ts.map +1 -0
- package/dist/auth/tokenManager.js +255 -0
- package/dist/auth/tokenManager.js.map +1 -0
- package/dist/auth/types.d.ts +103 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +10 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/config.d.ts +128 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +185 -0
- package/dist/config.js.map +1 -1
- package/dist/db/connection.d.ts +53 -3
- package/dist/db/connection.d.ts.map +1 -1
- package/dist/db/connection.js +154 -15
- package/dist/db/connection.js.map +1 -1
- package/dist/db/queries.d.ts +29 -6
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +35 -12
- package/dist/db/queries.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +97 -42
- package/dist/index.js.map +1 -1
- package/dist/openapi.d.ts +49 -0
- package/dist/openapi.d.ts.map +1 -0
- package/dist/openapi.js +634 -0
- package/dist/openapi.js.map +1 -0
- package/dist/server.d.ts +26 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +68 -22
- package/dist/server.js.map +1 -1
- package/dist/tools/metadata.d.ts +10 -0
- package/dist/tools/metadata.d.ts.map +1 -1
- package/dist/tools/metadata.js +10 -6
- package/dist/tools/metadata.js.map +1 -1
- package/dist/tools/query.d.ts +4 -0
- package/dist/tools/query.d.ts.map +1 -1
- package/dist/tools/query.js +5 -3
- package/dist/tools/query.js.map +1 -1
- package/dist/transports/http.d.ts +26 -0
- package/dist/transports/http.d.ts.map +1 -0
- package/dist/transports/http.js +552 -0
- package/dist/transports/http.js.map +1 -0
- package/dist/transports/index.d.ts +8 -0
- package/dist/transports/index.d.ts.map +1 -0
- package/dist/transports/index.js +8 -0
- package/dist/transports/index.js.map +1 -0
- package/dist/transports/sessionManager.d.ts +106 -0
- package/dist/transports/sessionManager.d.ts.map +1 -0
- package/dist/transports/sessionManager.js +260 -0
- package/dist/transports/sessionManager.js.map +1 -0
- package/package.json +9 -5
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Session Manager for HTTP Transport
|
|
3
|
+
*
|
|
4
|
+
* Manages stateful MCP sessions using the SDK's StreamableHTTPServerTransport.
|
|
5
|
+
* Each session maintains its own transport and server instance.
|
|
6
|
+
*/
|
|
7
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
9
|
+
/**
|
|
10
|
+
* MCP Session state
|
|
11
|
+
*/
|
|
12
|
+
export interface McpSession {
|
|
13
|
+
/** Unique session ID */
|
|
14
|
+
id: string;
|
|
15
|
+
/** The MCP server instance for this session */
|
|
16
|
+
server: McpServer;
|
|
17
|
+
/** The transport for this session */
|
|
18
|
+
transport: StreamableHTTPServerTransport;
|
|
19
|
+
/** Associated auth token */
|
|
20
|
+
authToken: string;
|
|
21
|
+
/** When the session was created */
|
|
22
|
+
createdAt: Date;
|
|
23
|
+
/** When the session was last accessed */
|
|
24
|
+
lastAccessedAt: Date;
|
|
25
|
+
/** Number of active requests */
|
|
26
|
+
activeRequests: number;
|
|
27
|
+
/** Whether the session is closing */
|
|
28
|
+
isClosing: boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Session Manager singleton for managing MCP sessions
|
|
32
|
+
*/
|
|
33
|
+
declare class SessionManager {
|
|
34
|
+
private static instance;
|
|
35
|
+
private sessions;
|
|
36
|
+
private cleanupTimer;
|
|
37
|
+
private readonly staleTimeoutMs;
|
|
38
|
+
private readonly cleanupIntervalMs;
|
|
39
|
+
private constructor();
|
|
40
|
+
/**
|
|
41
|
+
* Get the singleton instance
|
|
42
|
+
*/
|
|
43
|
+
static getInstance(): SessionManager;
|
|
44
|
+
/**
|
|
45
|
+
* Create a new MCP session
|
|
46
|
+
*
|
|
47
|
+
* @param server - The MCP server instance
|
|
48
|
+
* @param authToken - The associated auth token
|
|
49
|
+
* @returns The session ID and transport
|
|
50
|
+
*/
|
|
51
|
+
createSession(server: McpServer, authToken: string): Promise<{
|
|
52
|
+
sessionId: string;
|
|
53
|
+
transport: StreamableHTTPServerTransport;
|
|
54
|
+
}>;
|
|
55
|
+
/**
|
|
56
|
+
* Get a session by ID
|
|
57
|
+
*/
|
|
58
|
+
getSession(sessionId: string): McpSession | undefined;
|
|
59
|
+
/**
|
|
60
|
+
* Get a session by auth token
|
|
61
|
+
*/
|
|
62
|
+
getSessionByToken(authToken: string): McpSession | undefined;
|
|
63
|
+
/**
|
|
64
|
+
* Check if a session exists
|
|
65
|
+
*/
|
|
66
|
+
hasSession(sessionId: string): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Increment active request count
|
|
69
|
+
*/
|
|
70
|
+
incrementActiveRequests(sessionId: string): void;
|
|
71
|
+
/**
|
|
72
|
+
* Decrement active request count
|
|
73
|
+
*/
|
|
74
|
+
decrementActiveRequests(sessionId: string): void;
|
|
75
|
+
/**
|
|
76
|
+
* Close a session
|
|
77
|
+
*/
|
|
78
|
+
closeSession(sessionId: string): Promise<boolean>;
|
|
79
|
+
/**
|
|
80
|
+
* Close all sessions for a given auth token
|
|
81
|
+
*/
|
|
82
|
+
closeSessionsByToken(authToken: string): Promise<number>;
|
|
83
|
+
/**
|
|
84
|
+
* Get session statistics
|
|
85
|
+
*/
|
|
86
|
+
getStats(): {
|
|
87
|
+
totalSessions: number;
|
|
88
|
+
activeSessions: number;
|
|
89
|
+
staleSessions: number;
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Clean up stale sessions
|
|
93
|
+
*/
|
|
94
|
+
private cleanupStaleSessions;
|
|
95
|
+
/**
|
|
96
|
+
* Start the cleanup timer
|
|
97
|
+
*/
|
|
98
|
+
private startCleanupTimer;
|
|
99
|
+
/**
|
|
100
|
+
* Shutdown the session manager
|
|
101
|
+
*/
|
|
102
|
+
shutdown(): Promise<void>;
|
|
103
|
+
}
|
|
104
|
+
export declare function getSessionManager(): SessionManager;
|
|
105
|
+
export { SessionManager };
|
|
106
|
+
//# sourceMappingURL=sessionManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionManager.d.ts","sourceRoot":"","sources":["../../src/transports/sessionManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAKnG;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,+CAA+C;IAC/C,MAAM,EAAE,SAAS,CAAC;IAClB,qCAAqC;IACrC,SAAS,EAAE,6BAA6B,CAAC;IACzC,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,SAAS,EAAE,IAAI,CAAC;IAChB,yCAAyC;IACzC,cAAc,EAAE,IAAI,CAAC;IACrB,gCAAgC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,cAAM,cAAc;IAClB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkB;IACjD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAa;IAE/C,OAAO;IAKP;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,cAAc;IAOpC;;;;;;OAMG;IACG,aAAa,CACjB,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,6BAA6B,CAAA;KAAE,CAAC;IAiD3E;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IASrD;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAU5D;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAKtC;;OAEG;IACH,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQhD;;OAEG;IACH,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQhD;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoCvD;;OAEG;IACG,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB9D;;OAEG;IACH,QAAQ,IAAI;QACV,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;KACvB;IAuBD;;OAEG;YACW,oBAAoB;IAyBlC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoBzB;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAehC;AAGD,wBAAgB,iBAAiB,IAAI,cAAc,CAElD;AAGD,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Session Manager for HTTP Transport
|
|
3
|
+
*
|
|
4
|
+
* Manages stateful MCP sessions using the SDK's StreamableHTTPServerTransport.
|
|
5
|
+
* Each session maintains its own transport and server instance.
|
|
6
|
+
*/
|
|
7
|
+
import { randomUUID } from 'node:crypto';
|
|
8
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
9
|
+
import { createChildLogger } from '../utils/logger.js';
|
|
10
|
+
const log = createChildLogger({ component: 'session-manager' });
|
|
11
|
+
/**
|
|
12
|
+
* Session Manager singleton for managing MCP sessions
|
|
13
|
+
*/
|
|
14
|
+
class SessionManager {
|
|
15
|
+
static instance;
|
|
16
|
+
sessions = new Map();
|
|
17
|
+
cleanupTimer = null;
|
|
18
|
+
staleTimeoutMs = 30 * 60 * 1000; // 30 minutes
|
|
19
|
+
cleanupIntervalMs = 60 * 1000; // 1 minute
|
|
20
|
+
constructor() {
|
|
21
|
+
this.startCleanupTimer();
|
|
22
|
+
log.debug('Session manager initialized');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get the singleton instance
|
|
26
|
+
*/
|
|
27
|
+
static getInstance() {
|
|
28
|
+
if (!SessionManager.instance) {
|
|
29
|
+
SessionManager.instance = new SessionManager();
|
|
30
|
+
}
|
|
31
|
+
return SessionManager.instance;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Create a new MCP session
|
|
35
|
+
*
|
|
36
|
+
* @param server - The MCP server instance
|
|
37
|
+
* @param authToken - The associated auth token
|
|
38
|
+
* @returns The session ID and transport
|
|
39
|
+
*/
|
|
40
|
+
async createSession(server, authToken) {
|
|
41
|
+
const sessionId = randomUUID();
|
|
42
|
+
const transport = new StreamableHTTPServerTransport({
|
|
43
|
+
sessionIdGenerator: () => sessionId,
|
|
44
|
+
onsessioninitialized: (id) => {
|
|
45
|
+
log.info({ sessionId: id }, 'MCP session initialized');
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
// Handle transport close
|
|
49
|
+
transport.onclose = () => {
|
|
50
|
+
log.debug({ sessionId }, 'Transport closed, cleaning up session');
|
|
51
|
+
this.closeSession(sessionId).catch((err) => {
|
|
52
|
+
log.error({ err, sessionId }, 'Error during transport close cleanup');
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
// Connect server to transport with cleanup on failure
|
|
56
|
+
try {
|
|
57
|
+
await server.connect(transport);
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
// Clean up transport if connection fails to prevent resource leak
|
|
61
|
+
transport.onclose = undefined;
|
|
62
|
+
await transport.close().catch(() => { });
|
|
63
|
+
throw err;
|
|
64
|
+
}
|
|
65
|
+
const session = {
|
|
66
|
+
id: sessionId,
|
|
67
|
+
server,
|
|
68
|
+
transport,
|
|
69
|
+
authToken,
|
|
70
|
+
createdAt: new Date(),
|
|
71
|
+
lastAccessedAt: new Date(),
|
|
72
|
+
activeRequests: 0,
|
|
73
|
+
isClosing: false,
|
|
74
|
+
};
|
|
75
|
+
this.sessions.set(sessionId, session);
|
|
76
|
+
log.info({ sessionId, sessionCount: this.sessions.size }, 'MCP session created');
|
|
77
|
+
return { sessionId, transport };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get a session by ID
|
|
81
|
+
*/
|
|
82
|
+
getSession(sessionId) {
|
|
83
|
+
const session = this.sessions.get(sessionId);
|
|
84
|
+
if (session && !session.isClosing) {
|
|
85
|
+
session.lastAccessedAt = new Date();
|
|
86
|
+
return session;
|
|
87
|
+
}
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get a session by auth token
|
|
92
|
+
*/
|
|
93
|
+
getSessionByToken(authToken) {
|
|
94
|
+
for (const session of this.sessions.values()) {
|
|
95
|
+
if (session.authToken === authToken && !session.isClosing) {
|
|
96
|
+
session.lastAccessedAt = new Date();
|
|
97
|
+
return session;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Check if a session exists
|
|
104
|
+
*/
|
|
105
|
+
hasSession(sessionId) {
|
|
106
|
+
const session = this.sessions.get(sessionId);
|
|
107
|
+
return session !== undefined && !session.isClosing;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Increment active request count
|
|
111
|
+
*/
|
|
112
|
+
incrementActiveRequests(sessionId) {
|
|
113
|
+
const session = this.sessions.get(sessionId);
|
|
114
|
+
if (session) {
|
|
115
|
+
session.activeRequests++;
|
|
116
|
+
session.lastAccessedAt = new Date();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Decrement active request count
|
|
121
|
+
*/
|
|
122
|
+
decrementActiveRequests(sessionId) {
|
|
123
|
+
const session = this.sessions.get(sessionId);
|
|
124
|
+
if (session && session.activeRequests > 0) {
|
|
125
|
+
session.activeRequests--;
|
|
126
|
+
session.lastAccessedAt = new Date();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Close a session
|
|
131
|
+
*/
|
|
132
|
+
async closeSession(sessionId) {
|
|
133
|
+
const session = this.sessions.get(sessionId);
|
|
134
|
+
if (!session) {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
if (session.isClosing) {
|
|
138
|
+
log.debug({ sessionId }, 'Session already closing');
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
session.isClosing = true;
|
|
142
|
+
// Close transport and server independently to ensure both are attempted
|
|
143
|
+
try {
|
|
144
|
+
await session.transport.close();
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
log.error({ err, sessionId }, 'Error closing session transport');
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
await session.server.close();
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
log.error({ err, sessionId }, 'Error closing session server');
|
|
154
|
+
}
|
|
155
|
+
this.sessions.delete(sessionId);
|
|
156
|
+
log.info({ sessionId, sessionCount: this.sessions.size }, 'MCP session closed');
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Close all sessions for a given auth token
|
|
161
|
+
*/
|
|
162
|
+
async closeSessionsByToken(authToken) {
|
|
163
|
+
const sessionsToClose = [];
|
|
164
|
+
for (const [id, session] of this.sessions.entries()) {
|
|
165
|
+
if (session.authToken === authToken) {
|
|
166
|
+
sessionsToClose.push(id);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
let closedCount = 0;
|
|
170
|
+
for (const sessionId of sessionsToClose) {
|
|
171
|
+
if (await this.closeSession(sessionId)) {
|
|
172
|
+
closedCount++;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return closedCount;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get session statistics
|
|
179
|
+
*/
|
|
180
|
+
getStats() {
|
|
181
|
+
const now = Date.now();
|
|
182
|
+
let activeSessions = 0;
|
|
183
|
+
let staleSessions = 0;
|
|
184
|
+
for (const session of this.sessions.values()) {
|
|
185
|
+
if (session.isClosing)
|
|
186
|
+
continue;
|
|
187
|
+
const age = now - session.lastAccessedAt.getTime();
|
|
188
|
+
if (age > this.staleTimeoutMs) {
|
|
189
|
+
staleSessions++;
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
activeSessions++;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
totalSessions: this.sessions.size,
|
|
197
|
+
activeSessions,
|
|
198
|
+
staleSessions,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Clean up stale sessions
|
|
203
|
+
*/
|
|
204
|
+
async cleanupStaleSessions() {
|
|
205
|
+
const now = Date.now();
|
|
206
|
+
const staleSessionIds = [];
|
|
207
|
+
for (const [id, session] of this.sessions.entries()) {
|
|
208
|
+
if (session.isClosing)
|
|
209
|
+
continue;
|
|
210
|
+
const age = now - session.lastAccessedAt.getTime();
|
|
211
|
+
if (age > this.staleTimeoutMs && session.activeRequests === 0) {
|
|
212
|
+
staleSessionIds.push(id);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (staleSessionIds.length > 0) {
|
|
216
|
+
log.info({ staleCount: staleSessionIds.length }, 'Cleaning up stale sessions');
|
|
217
|
+
for (const sessionId of staleSessionIds) {
|
|
218
|
+
await this.closeSession(sessionId);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Start the cleanup timer
|
|
224
|
+
*/
|
|
225
|
+
startCleanupTimer() {
|
|
226
|
+
if (this.cleanupTimer) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
this.cleanupTimer = setInterval(() => {
|
|
230
|
+
this.cleanupStaleSessions().catch((err) => {
|
|
231
|
+
log.error({ err }, 'Error during stale session cleanup');
|
|
232
|
+
});
|
|
233
|
+
}, this.cleanupIntervalMs);
|
|
234
|
+
// Don't block process exit
|
|
235
|
+
this.cleanupTimer.unref();
|
|
236
|
+
log.debug({ intervalMs: this.cleanupIntervalMs, staleTimeoutMs: this.staleTimeoutMs }, 'Session cleanup timer started');
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Shutdown the session manager
|
|
240
|
+
*/
|
|
241
|
+
async shutdown() {
|
|
242
|
+
if (this.cleanupTimer) {
|
|
243
|
+
clearInterval(this.cleanupTimer);
|
|
244
|
+
this.cleanupTimer = null;
|
|
245
|
+
}
|
|
246
|
+
const sessionIds = Array.from(this.sessions.keys());
|
|
247
|
+
log.info({ sessionCount: sessionIds.length }, 'Shutting down session manager');
|
|
248
|
+
for (const sessionId of sessionIds) {
|
|
249
|
+
await this.closeSession(sessionId);
|
|
250
|
+
}
|
|
251
|
+
log.info('Session manager shutdown complete');
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// Export singleton getter
|
|
255
|
+
export function getSessionManager() {
|
|
256
|
+
return SessionManager.getInstance();
|
|
257
|
+
}
|
|
258
|
+
// Export the class type for testing
|
|
259
|
+
export { SessionManager };
|
|
260
|
+
//# sourceMappingURL=sessionManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionManager.js","sourceRoot":"","sources":["../../src/transports/sessionManager.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-server-db2i",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.1",
|
|
4
4
|
"description": "MCP server for IBM DB2 for i (DB2i) database queries and metadata inspection",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
11
|
"build": "tsc",
|
|
12
|
-
"start": "node dist/index.js",
|
|
13
|
-
"dev": "tsx src/index.ts",
|
|
12
|
+
"start": "node --env-file=.env dist/index.js",
|
|
13
|
+
"dev": "tsx --env-file=.env src/index.ts",
|
|
14
14
|
"test": "vitest run",
|
|
15
15
|
"test:watch": "vitest",
|
|
16
16
|
"lint": "eslint src tests",
|
|
@@ -27,7 +27,9 @@
|
|
|
27
27
|
"iseries",
|
|
28
28
|
"ibm-i",
|
|
29
29
|
"jt400",
|
|
30
|
-
"jdbc"
|
|
30
|
+
"jdbc",
|
|
31
|
+
"http",
|
|
32
|
+
"rest"
|
|
31
33
|
],
|
|
32
34
|
"author": "",
|
|
33
35
|
"license": "MIT",
|
|
@@ -41,6 +43,7 @@
|
|
|
41
43
|
"homepage": "https://github.com/Strom-Capital/mcp-server-db2i#readme",
|
|
42
44
|
"dependencies": {
|
|
43
45
|
"@modelcontextprotocol/sdk": "^1.25.2",
|
|
46
|
+
"express": "^5.2.1",
|
|
44
47
|
"node-jt400": "^6.0.1",
|
|
45
48
|
"node-sql-parser": "^5.4.0",
|
|
46
49
|
"pino": "^10.2.0",
|
|
@@ -49,6 +52,7 @@
|
|
|
49
52
|
},
|
|
50
53
|
"devDependencies": {
|
|
51
54
|
"@eslint/js": "^9.39.2",
|
|
55
|
+
"@types/express": "^5.0.6",
|
|
52
56
|
"@types/node": "^25.0.9",
|
|
53
57
|
"@vitest/coverage-v8": "^4.0.17",
|
|
54
58
|
"eslint": "^9.39.2",
|
|
@@ -59,7 +63,7 @@
|
|
|
59
63
|
"vitest": "^4.0.17"
|
|
60
64
|
},
|
|
61
65
|
"engines": {
|
|
62
|
-
"node": ">=
|
|
66
|
+
"node": ">=20.6"
|
|
63
67
|
},
|
|
64
68
|
"publishConfig": {
|
|
65
69
|
"access": "public"
|