@crypto512/jicon-mcp 2.2.1 → 2.3.19

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.
Files changed (228) hide show
  1. package/PROMPT.md +10 -28
  2. package/README.md +39 -6
  3. package/TOOL_LIST.md +542 -407
  4. package/dist/config/constants.d.ts +28 -0
  5. package/dist/config/constants.d.ts.map +1 -1
  6. package/dist/config/constants.js +34 -0
  7. package/dist/config/constants.js.map +1 -1
  8. package/dist/config/loader.d.ts.map +1 -1
  9. package/dist/config/loader.js +12 -2
  10. package/dist/config/loader.js.map +1 -1
  11. package/dist/config/types.d.ts +49 -6
  12. package/dist/config/types.d.ts.map +1 -1
  13. package/dist/config/types.js +18 -0
  14. package/dist/config/types.js.map +1 -1
  15. package/dist/confluence/client.d.ts.map +1 -1
  16. package/dist/confluence/client.js +7 -2
  17. package/dist/confluence/client.js.map +1 -1
  18. package/dist/confluence/formatters.d.ts +20 -0
  19. package/dist/confluence/formatters.d.ts.map +1 -1
  20. package/dist/confluence/formatters.js +74 -8
  21. package/dist/confluence/formatters.js.map +1 -1
  22. package/dist/confluence/tools.d.ts +16 -20
  23. package/dist/confluence/tools.d.ts.map +1 -1
  24. package/dist/confluence/tools.js +71 -68
  25. package/dist/confluence/tools.js.map +1 -1
  26. package/dist/credentials/extractor.d.ts +15 -5
  27. package/dist/credentials/extractor.d.ts.map +1 -1
  28. package/dist/credentials/extractor.js +99 -12
  29. package/dist/credentials/extractor.js.map +1 -1
  30. package/dist/credentials/index.d.ts +4 -3
  31. package/dist/credentials/index.d.ts.map +1 -1
  32. package/dist/credentials/index.js +3 -2
  33. package/dist/credentials/index.js.map +1 -1
  34. package/dist/credentials/types.d.ts +22 -0
  35. package/dist/credentials/types.d.ts.map +1 -1
  36. package/dist/credentials/types.js.map +1 -1
  37. package/dist/index.js +211 -176
  38. package/dist/index.js.map +1 -1
  39. package/dist/jira/activity-tools.d.ts +8 -15
  40. package/dist/jira/activity-tools.d.ts.map +1 -1
  41. package/dist/jira/activity-tools.js +131 -90
  42. package/dist/jira/activity-tools.js.map +1 -1
  43. package/dist/jira/client.d.ts +24 -0
  44. package/dist/jira/client.d.ts.map +1 -1
  45. package/dist/jira/client.js +65 -6
  46. package/dist/jira/client.js.map +1 -1
  47. package/dist/jira/formatters.d.ts +61 -0
  48. package/dist/jira/formatters.d.ts.map +1 -1
  49. package/dist/jira/formatters.js +83 -11
  50. package/dist/jira/formatters.js.map +1 -1
  51. package/dist/jira/tools.d.ts +78 -26
  52. package/dist/jira/tools.d.ts.map +1 -1
  53. package/dist/jira/tools.js +293 -130
  54. package/dist/jira/tools.js.map +1 -1
  55. package/dist/permissions/filter.d.ts.map +1 -1
  56. package/dist/permissions/filter.js +8 -4
  57. package/dist/permissions/filter.js.map +1 -1
  58. package/dist/permissions/tool-registry.d.ts +15 -13
  59. package/dist/permissions/tool-registry.d.ts.map +1 -1
  60. package/dist/permissions/tool-registry.js +19 -10
  61. package/dist/permissions/tool-registry.js.map +1 -1
  62. package/dist/session/context.d.ts +81 -0
  63. package/dist/session/context.d.ts.map +1 -0
  64. package/dist/session/context.js +107 -0
  65. package/dist/session/context.js.map +1 -0
  66. package/dist/session/index.d.ts +12 -0
  67. package/dist/session/index.d.ts.map +1 -0
  68. package/dist/session/index.js +22 -0
  69. package/dist/session/index.js.map +1 -0
  70. package/dist/session/manager.d.ts +186 -0
  71. package/dist/session/manager.d.ts.map +1 -0
  72. package/dist/session/manager.js +383 -0
  73. package/dist/session/manager.js.map +1 -0
  74. package/dist/tempo/client.d.ts +14 -0
  75. package/dist/tempo/client.d.ts.map +1 -1
  76. package/dist/tempo/client.js +57 -0
  77. package/dist/tempo/client.js.map +1 -1
  78. package/dist/tempo/formatters.d.ts +13 -0
  79. package/dist/tempo/formatters.d.ts.map +1 -1
  80. package/dist/tempo/formatters.js +106 -20
  81. package/dist/tempo/formatters.js.map +1 -1
  82. package/dist/tempo/tools.d.ts +14 -13
  83. package/dist/tempo/tools.d.ts.map +1 -1
  84. package/dist/tempo/tools.js +203 -33
  85. package/dist/tempo/tools.js.map +1 -1
  86. package/dist/tempo/types.d.ts +20 -6
  87. package/dist/tempo/types.d.ts.map +1 -1
  88. package/dist/transport/http.d.ts +21 -5
  89. package/dist/transport/http.d.ts.map +1 -1
  90. package/dist/transport/http.js +193 -22
  91. package/dist/transport/http.js.map +1 -1
  92. package/dist/transport/index.d.ts +7 -2
  93. package/dist/transport/index.d.ts.map +1 -1
  94. package/dist/transport/index.js +10 -4
  95. package/dist/transport/index.js.map +1 -1
  96. package/dist/utils/buffer-tools.d.ts +48 -724
  97. package/dist/utils/buffer-tools.d.ts.map +1 -1
  98. package/dist/utils/buffer-tools.js +337 -170
  99. package/dist/utils/buffer-tools.js.map +1 -1
  100. package/dist/utils/content-buffer.d.ts +10 -31
  101. package/dist/utils/content-buffer.d.ts.map +1 -1
  102. package/dist/utils/content-buffer.js +12 -86
  103. package/dist/utils/content-buffer.js.map +1 -1
  104. package/dist/utils/http-client.d.ts.map +1 -1
  105. package/dist/utils/http-client.js +99 -2
  106. package/dist/utils/http-client.js.map +1 -1
  107. package/dist/utils/jicon-help.d.ts +3 -3
  108. package/dist/utils/jicon-help.d.ts.map +1 -1
  109. package/dist/utils/jicon-help.js +164 -312
  110. package/dist/utils/jicon-help.js.map +1 -1
  111. package/dist/utils/logger.d.ts +43 -0
  112. package/dist/utils/logger.d.ts.map +1 -0
  113. package/dist/utils/logger.js +102 -0
  114. package/dist/utils/logger.js.map +1 -0
  115. package/dist/utils/plantuml/tools.d.ts.map +1 -1
  116. package/dist/utils/plantuml/tools.js +10 -9
  117. package/dist/utils/plantuml/tools.js.map +1 -1
  118. package/dist/utils/response-formatter.d.ts +20 -2
  119. package/dist/utils/response-formatter.d.ts.map +1 -1
  120. package/dist/utils/response-formatter.js +147 -17
  121. package/dist/utils/response-formatter.js.map +1 -1
  122. package/dist/utils/sandbox/formatters.d.ts +25 -0
  123. package/dist/utils/sandbox/formatters.d.ts.map +1 -0
  124. package/dist/utils/sandbox/formatters.js +690 -0
  125. package/dist/utils/sandbox/formatters.js.map +1 -0
  126. package/dist/utils/sandbox/helpers.d.ts +16 -0
  127. package/dist/utils/sandbox/helpers.d.ts.map +1 -0
  128. package/dist/utils/sandbox/helpers.js +252 -0
  129. package/dist/utils/sandbox/helpers.js.map +1 -0
  130. package/dist/utils/sandbox/index.d.ts +19 -0
  131. package/dist/utils/sandbox/index.d.ts.map +1 -0
  132. package/dist/utils/sandbox/index.js +269 -0
  133. package/dist/utils/sandbox/index.js.map +1 -0
  134. package/dist/utils/sandbox/schema.d.ts +55 -0
  135. package/dist/utils/sandbox/schema.d.ts.map +1 -0
  136. package/dist/utils/sandbox/schema.js +39 -0
  137. package/dist/utils/sandbox/schema.js.map +1 -0
  138. package/dist/utils/sandbox/types.d.ts +179 -0
  139. package/dist/utils/sandbox/types.d.ts.map +1 -0
  140. package/dist/utils/sandbox/types.js +8 -0
  141. package/dist/utils/sandbox/types.js.map +1 -0
  142. package/dist/utils/schemas/confluence.d.ts +41 -0
  143. package/dist/utils/schemas/confluence.d.ts.map +1 -0
  144. package/dist/utils/schemas/confluence.js +105 -0
  145. package/dist/utils/schemas/confluence.js.map +1 -0
  146. package/dist/utils/schemas/index.d.ts +77 -0
  147. package/dist/utils/schemas/index.d.ts.map +1 -0
  148. package/dist/utils/schemas/index.js +107 -0
  149. package/dist/utils/schemas/index.js.map +1 -0
  150. package/dist/utils/schemas/jira.d.ts +49 -0
  151. package/dist/utils/schemas/jira.d.ts.map +1 -0
  152. package/dist/utils/schemas/jira.js +153 -0
  153. package/dist/utils/schemas/jira.js.map +1 -0
  154. package/dist/utils/schemas/tempo.d.ts +29 -0
  155. package/dist/utils/schemas/tempo.d.ts.map +1 -0
  156. package/dist/utils/schemas/tempo.js +72 -0
  157. package/dist/utils/schemas/tempo.js.map +1 -0
  158. package/dist/utils/whoami-tools.d.ts +17 -0
  159. package/dist/utils/whoami-tools.d.ts.map +1 -0
  160. package/dist/utils/whoami-tools.js +90 -0
  161. package/dist/utils/whoami-tools.js.map +1 -0
  162. package/dist/utils/xhtml/error-locator.js +5 -5
  163. package/dist/utils/xhtml/error-locator.js.map +1 -1
  164. package/package.json +10 -9
  165. package/dist/credentials/client-factory.d.ts +0 -64
  166. package/dist/credentials/client-factory.d.ts.map +0 -1
  167. package/dist/credentials/client-factory.js +0 -110
  168. package/dist/credentials/client-factory.js.map +0 -1
  169. package/dist/credentials/context.d.ts +0 -25
  170. package/dist/credentials/context.d.ts.map +0 -1
  171. package/dist/credentials/context.js +0 -35
  172. package/dist/credentials/context.js.map +0 -1
  173. package/dist/utils/buffer-pipeline/index.d.ts +0 -30
  174. package/dist/utils/buffer-pipeline/index.d.ts.map +0 -1
  175. package/dist/utils/buffer-pipeline/index.js +0 -317
  176. package/dist/utils/buffer-pipeline/index.js.map +0 -1
  177. package/dist/utils/buffer-pipeline/output/csv.d.ts +0 -20
  178. package/dist/utils/buffer-pipeline/output/csv.d.ts.map +0 -1
  179. package/dist/utils/buffer-pipeline/output/csv.js +0 -117
  180. package/dist/utils/buffer-pipeline/output/csv.js.map +0 -1
  181. package/dist/utils/buffer-pipeline/output/json.d.ts +0 -16
  182. package/dist/utils/buffer-pipeline/output/json.d.ts.map +0 -1
  183. package/dist/utils/buffer-pipeline/output/json.js +0 -48
  184. package/dist/utils/buffer-pipeline/output/json.js.map +0 -1
  185. package/dist/utils/buffer-pipeline/output/markdown.d.ts +0 -15
  186. package/dist/utils/buffer-pipeline/output/markdown.d.ts.map +0 -1
  187. package/dist/utils/buffer-pipeline/output/markdown.js +0 -105
  188. package/dist/utils/buffer-pipeline/output/markdown.js.map +0 -1
  189. package/dist/utils/buffer-pipeline/output/xhtml-list.d.ts +0 -16
  190. package/dist/utils/buffer-pipeline/output/xhtml-list.d.ts.map +0 -1
  191. package/dist/utils/buffer-pipeline/output/xhtml-list.js +0 -81
  192. package/dist/utils/buffer-pipeline/output/xhtml-list.js.map +0 -1
  193. package/dist/utils/buffer-pipeline/output/xhtml-table.d.ts +0 -15
  194. package/dist/utils/buffer-pipeline/output/xhtml-table.d.ts.map +0 -1
  195. package/dist/utils/buffer-pipeline/output/xhtml-table.js +0 -176
  196. package/dist/utils/buffer-pipeline/output/xhtml-table.js.map +0 -1
  197. package/dist/utils/buffer-pipeline/schema.d.ts +0 -1878
  198. package/dist/utils/buffer-pipeline/schema.d.ts.map +0 -1
  199. package/dist/utils/buffer-pipeline/schema.js +0 -168
  200. package/dist/utils/buffer-pipeline/schema.js.map +0 -1
  201. package/dist/utils/buffer-pipeline/stages/filter.d.ts +0 -32
  202. package/dist/utils/buffer-pipeline/stages/filter.d.ts.map +0 -1
  203. package/dist/utils/buffer-pipeline/stages/filter.js +0 -208
  204. package/dist/utils/buffer-pipeline/stages/filter.js.map +0 -1
  205. package/dist/utils/buffer-pipeline/stages/format.d.ts +0 -45
  206. package/dist/utils/buffer-pipeline/stages/format.d.ts.map +0 -1
  207. package/dist/utils/buffer-pipeline/stages/format.js +0 -160
  208. package/dist/utils/buffer-pipeline/stages/format.js.map +0 -1
  209. package/dist/utils/buffer-pipeline/stages/group-by.d.ts +0 -25
  210. package/dist/utils/buffer-pipeline/stages/group-by.d.ts.map +0 -1
  211. package/dist/utils/buffer-pipeline/stages/group-by.js +0 -190
  212. package/dist/utils/buffer-pipeline/stages/group-by.js.map +0 -1
  213. package/dist/utils/buffer-pipeline/stages/select.d.ts +0 -54
  214. package/dist/utils/buffer-pipeline/stages/select.d.ts.map +0 -1
  215. package/dist/utils/buffer-pipeline/stages/select.js +0 -228
  216. package/dist/utils/buffer-pipeline/stages/select.js.map +0 -1
  217. package/dist/utils/buffer-pipeline/stages/sort.d.ts +0 -20
  218. package/dist/utils/buffer-pipeline/stages/sort.d.ts.map +0 -1
  219. package/dist/utils/buffer-pipeline/stages/sort.js +0 -96
  220. package/dist/utils/buffer-pipeline/stages/sort.js.map +0 -1
  221. package/dist/utils/buffer-pipeline/types.d.ts +0 -277
  222. package/dist/utils/buffer-pipeline/types.d.ts.map +0 -1
  223. package/dist/utils/buffer-pipeline/types.js +0 -8
  224. package/dist/utils/buffer-pipeline/types.js.map +0 -1
  225. package/dist/utils/plantuml/docker-manager.d.ts +0 -37
  226. package/dist/utils/plantuml/docker-manager.d.ts.map +0 -1
  227. package/dist/utils/plantuml/docker-manager.js +0 -284
  228. package/dist/utils/plantuml/docker-manager.js.map +0 -1
@@ -1,18 +1,34 @@
1
1
  /**
2
- * HTTP transport using StreamableHTTPServerTransport
2
+ * HTTP transport using StreamableHTTPServerTransport with per-session Server instances
3
+ *
4
+ * Architecture (following MCP SDK example pattern):
5
+ * - Each MCP session gets its own Transport AND Server instance
6
+ * - Transports are stored in a map by session ID
7
+ * - On initialization: create new transport + new server, connect them
8
+ * - On subsequent requests: reuse existing transport
9
+ * - Sessions are cleaned up after inactivity timeout (default: 1 hour)
3
10
  */
4
- import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
5
11
  import type { Server } from "@modelcontextprotocol/sdk/server/index.js";
6
12
  import type { Express } from "express";
7
13
  import type { HttpTransportConfig } from "./types.js";
8
14
  export interface HttpServer {
9
15
  app: Express;
10
- transport: StreamableHTTPServerTransport;
11
16
  start: () => Promise<void>;
12
17
  close: () => Promise<void>;
13
18
  }
14
19
  /**
15
- * Creates an HTTP server with StreamableHTTPServerTransport
20
+ * Factory function type for creating new Server instances
21
+ * Each session gets its own Server instance with all tools registered
16
22
  */
17
- export declare function createHttpServer(server: Server, config: HttpTransportConfig): HttpServer;
23
+ export type ServerFactory = () => Server;
24
+ /**
25
+ * Creates an HTTP server with per-session StreamableHTTPServerTransport instances
26
+ *
27
+ * Session management:
28
+ * - Each session gets its own Transport + Server pair (required by MCP SDK)
29
+ * - Transports are stored by session ID for request routing
30
+ * - Per-session state (buffers, clients) is managed by SessionManager
31
+ * - Sessions are automatically cleaned up after inactivity timeout
32
+ */
33
+ export declare function createHttpServer(createServer: ServerFactory, config: HttpTransportConfig): HttpServer;
18
34
  //# sourceMappingURL=http.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,SAAS,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,OAAO,CAAC;IACb,SAAS,EAAE,6BAA6B,CAAC;IACzC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,mBAAmB,GAC1B,UAAU,CA8DZ"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,SAAS,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAKtD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC;AAEzC;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,aAAa,EAC3B,MAAM,EAAE,mBAAmB,GAC1B,UAAU,CA2OZ"}
@@ -1,55 +1,226 @@
1
1
  /**
2
- * HTTP transport using StreamableHTTPServerTransport
2
+ * HTTP transport using StreamableHTTPServerTransport with per-session Server instances
3
+ *
4
+ * Architecture (following MCP SDK example pattern):
5
+ * - Each MCP session gets its own Transport AND Server instance
6
+ * - Transports are stored in a map by session ID
7
+ * - On initialization: create new transport + new server, connect them
8
+ * - On subsequent requests: reuse existing transport
9
+ * - Sessions are cleaned up after inactivity timeout (default: 1 hour)
3
10
  */
11
+ import { randomUUID } from "crypto";
4
12
  import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js";
5
13
  import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
14
+ import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
15
+ import { getSessionManager, runWithSession } from "../session/index.js";
16
+ import { extractCredentials } from "../credentials/extractor.js";
17
+ import { log, debug, error as logError } from "../utils/logger.js";
6
18
  /**
7
- * Creates an HTTP server with StreamableHTTPServerTransport
19
+ * Creates an HTTP server with per-session StreamableHTTPServerTransport instances
20
+ *
21
+ * Session management:
22
+ * - Each session gets its own Transport + Server pair (required by MCP SDK)
23
+ * - Transports are stored by session ID for request routing
24
+ * - Per-session state (buffers, clients) is managed by SessionManager
25
+ * - Sessions are automatically cleaned up after inactivity timeout
8
26
  */
9
- export function createHttpServer(server, config) {
27
+ export function createHttpServer(createServer, config) {
10
28
  const { port, host, basePath } = config;
11
- // Create Express app with MCP defaults
29
+ // Store transports by session ID (following SDK example pattern)
30
+ const transports = new Map();
31
+ // Get session manager
32
+ const sessionManager = getSessionManager();
33
+ /**
34
+ * Clean up a session and its transport
35
+ */
36
+ function destroySession(sessionId) {
37
+ const transport = transports.get(sessionId);
38
+ if (transport) {
39
+ transport.close().catch((err) => {
40
+ logError(`Error closing transport for session ${sessionId}`, err);
41
+ });
42
+ transports.delete(sessionId);
43
+ }
44
+ sessionManager.destroySession(sessionId);
45
+ log(`Session destroyed: ${sessionId} (remaining: ${transports.size})`);
46
+ }
47
+ // Register cleanup callback with session manager
48
+ sessionManager.setSessionDestroyedCallback((sessionId) => {
49
+ transports.delete(sessionId);
50
+ });
51
+ // Create Express app
12
52
  const app = createMcpExpressApp({
13
53
  host,
14
- // When binding to 0.0.0.0, allow any host header for container deployments
15
54
  allowedHosts: host === "0.0.0.0" ? undefined : [host, "localhost"],
16
55
  });
17
56
  // Health check endpoint
18
57
  app.get("/health", (_req, res) => {
19
- res.json({ status: "ok" });
58
+ res.json({
59
+ status: "ok",
60
+ sessions: sessionManager.getSessionCount(),
61
+ transports: transports.size,
62
+ });
20
63
  });
21
- // Readiness endpoint (can be extended to check dependencies)
64
+ // Readiness endpoint
22
65
  app.get("/ready", (_req, res) => {
23
66
  res.json({ status: "ready" });
24
67
  });
25
- // Create transport in stateless mode for container deployments
26
- const transport = new StreamableHTTPServerTransport({
27
- sessionIdGenerator: undefined, // Stateless mode
28
- enableJsonResponse: true,
68
+ // Handle POST requests (initialization and tool calls)
69
+ app.post(basePath, async (req, res) => {
70
+ // Extract credentials from HTTP headers
71
+ const credentials = extractCredentials(req.headers);
72
+ // Get session ID from MCP session header
73
+ const sessionId = req.headers["mcp-session-id"];
74
+ try {
75
+ let transport;
76
+ if (sessionId && transports.has(sessionId)) {
77
+ // Reuse existing transport for this session
78
+ transport = transports.get(sessionId);
79
+ debug(`Request for existing session: ${sessionId}`);
80
+ // Get or update session data (handles credential changes)
81
+ const session = sessionManager.getOrCreateSession(sessionId, credentials);
82
+ // Run request within session context
83
+ await runWithSession({
84
+ sessionId,
85
+ credentials: session.credentials,
86
+ buffer: session.buffer,
87
+ jiraClient: session.clients.jira,
88
+ confluenceClient: session.clients.confluence,
89
+ tempoClient: session.clients.tempo,
90
+ writeHomeValidator: session.writeHomeValidator,
91
+ }, async () => {
92
+ await transport.handleRequest(req, res, req.body);
93
+ });
94
+ }
95
+ else if (!sessionId && isInitializeRequest(req.body)) {
96
+ // New initialization request - create new transport and server
97
+ debug(`Initialization request from ${req.ip}`);
98
+ transport = new StreamableHTTPServerTransport({
99
+ sessionIdGenerator: () => randomUUID(),
100
+ onsessioninitialized: (newSessionId) => {
101
+ // Store transport by session ID when session is initialized
102
+ transports.set(newSessionId, transport);
103
+ log(`MCP session initialized: ${newSessionId} (total: ${transports.size})`);
104
+ },
105
+ enableJsonResponse: true,
106
+ });
107
+ // Set up onclose handler to clean up when transport closes
108
+ transport.onclose = () => {
109
+ const sid = transport.sessionId;
110
+ if (sid && transports.has(sid)) {
111
+ log(`Transport closed for session ${sid}, cleaning up`);
112
+ destroySession(sid);
113
+ }
114
+ };
115
+ transport.onerror = (error) => {
116
+ logError(`Transport error for session ${transport.sessionId || "unknown"}`, error);
117
+ };
118
+ // Create new server instance and connect transport to it
119
+ const server = createServer();
120
+ await server.connect(transport);
121
+ // Handle the initialization request
122
+ await transport.handleRequest(req, res, req.body);
123
+ }
124
+ else {
125
+ // Invalid request - no session ID or not initialization request
126
+ res.status(400).json({
127
+ jsonrpc: "2.0",
128
+ error: {
129
+ code: -32600,
130
+ message: "Bad Request: No valid session ID provided",
131
+ },
132
+ id: null,
133
+ });
134
+ }
135
+ }
136
+ catch (error) {
137
+ logError("Error handling MCP request", error);
138
+ if (!res.headersSent) {
139
+ res.status(500).json({
140
+ jsonrpc: "2.0",
141
+ error: { code: -32603, message: "Internal server error" },
142
+ id: null,
143
+ });
144
+ }
145
+ }
29
146
  });
30
- // Mount MCP endpoint
31
- app.all(basePath, async (req, res) => {
32
- await transport.handleRequest(req, res, req.body);
147
+ // Handle GET requests for SSE streams
148
+ app.get(basePath, async (req, res) => {
149
+ const sessionId = req.headers["mcp-session-id"];
150
+ if (!sessionId || !transports.has(sessionId)) {
151
+ res.status(400).json({
152
+ jsonrpc: "2.0",
153
+ error: { code: -32600, message: "Invalid or missing session ID" },
154
+ id: null,
155
+ });
156
+ return;
157
+ }
158
+ const lastEventId = req.headers["last-event-id"];
159
+ if (lastEventId) {
160
+ debug(`Client reconnecting with Last-Event-ID: ${lastEventId}`);
161
+ }
162
+ else {
163
+ debug(`Establishing new SSE stream for session ${sessionId}`);
164
+ }
165
+ const transport = transports.get(sessionId);
166
+ await transport.handleRequest(req, res);
167
+ });
168
+ // Handle DELETE requests for session termination
169
+ app.delete(basePath, async (req, res) => {
170
+ const sessionId = req.headers["mcp-session-id"];
171
+ if (!sessionId || !transports.has(sessionId)) {
172
+ res.status(400).json({
173
+ jsonrpc: "2.0",
174
+ error: { code: -32600, message: "Invalid or missing session ID" },
175
+ id: null,
176
+ });
177
+ return;
178
+ }
179
+ log(`Session termination request for session ${sessionId}`);
180
+ try {
181
+ const transport = transports.get(sessionId);
182
+ await transport.handleRequest(req, res);
183
+ }
184
+ catch (error) {
185
+ logError("Error handling session termination", error);
186
+ if (!res.headersSent) {
187
+ res.status(500).send("Error processing session termination");
188
+ }
189
+ }
33
190
  });
34
191
  let httpServer = null;
35
192
  return {
36
193
  app,
37
- transport,
38
194
  start: async () => {
39
- // Connect server to transport
40
- await server.connect(transport);
41
- // Start HTTP server
195
+ // Start HTTP server (no transport created here - transports are per-session)
42
196
  return new Promise((resolve) => {
43
197
  httpServer = app.listen(port, host, () => {
44
- console.error(`HTTP server listening on http://${host}:${port}`);
45
- console.error(`MCP endpoint: http://${host}:${port}${basePath}`);
46
- console.error(`Health check: http://${host}:${port}/health`);
198
+ // Configure HTTP server timeouts for SSE
199
+ httpServer.setTimeout(0);
200
+ httpServer.keepAliveTimeout = 24 * 60 * 60 * 1000;
201
+ httpServer.headersTimeout = 60000;
202
+ httpServer.requestTimeout = 0;
203
+ log(`HTTP server listening on http://${host}:${port}`);
204
+ log(`MCP endpoint: http://${host}:${port}${basePath}`);
205
+ log(`Health check: http://${host}:${port}/health`);
206
+ log(`Session management: per-session transport + server`);
47
207
  resolve();
48
208
  });
49
209
  });
50
210
  },
51
211
  close: async () => {
52
- await transport.close();
212
+ // Close all transports
213
+ for (const [sessionId, transport] of transports) {
214
+ try {
215
+ await transport.close();
216
+ log(`Transport closed for session ${sessionId}`);
217
+ }
218
+ catch (err) {
219
+ logError(`Error closing transport for session ${sessionId}`, err);
220
+ }
221
+ }
222
+ transports.clear();
223
+ // Close HTTP server
53
224
  if (httpServer) {
54
225
  return new Promise((resolve, reject) => {
55
226
  httpServer.close((err) => {
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAClF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAYnG;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,MAA2B;IAE3B,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAExC,uCAAuC;IACvC,MAAM,GAAG,GAAG,mBAAmB,CAAC;QAC9B,IAAI;QACJ,2EAA2E;QAC3E,YAAY,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC;KACnE,CAAC,CAAC;IAEH,wBAAwB;IACxB,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;QAClD,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,6DAA6D;IAC7D,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;QACjD,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,+DAA+D;IAC/D,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;QAClD,kBAAkB,EAAE,SAAS,EAAE,iBAAiB;QAChD,kBAAkB,EAAE,IAAI;KACzB,CAAC,CAAC;IAEH,qBAAqB;IACrB,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QACtD,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,IAAI,UAAU,GAAyC,IAAI,CAAC;IAE5D,OAAO;QACL,GAAG;QACH,SAAS;QACT,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,8BAA8B;YAC9B,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAEhC,oBAAoB;YACpB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC7B,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;oBACvC,OAAO,CAAC,KAAK,CAAC,mCAAmC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;oBACjE,OAAO,CAAC,KAAK,CAAC,wBAAwB,IAAI,IAAI,IAAI,GAAG,QAAQ,EAAE,CAAC,CAAC;oBACjE,OAAO,CAAC,KAAK,CAAC,wBAAwB,IAAI,IAAI,IAAI,SAAS,CAAC,CAAC;oBAC7D,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;YACxB,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBACrC,UAAW,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;wBACxB,IAAI,GAAG;4BAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;4BAChB,OAAO,EAAE,CAAC;oBACjB,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,11 @@
1
1
  /**
2
2
  * Transport module - factory for creating stdio or HTTP transports
3
3
  */
4
- import type { Server } from "@modelcontextprotocol/sdk/server/index.js";
4
+ import { type ServerFactory } from "./http.js";
5
5
  import type { TransportConfig } from "./types.js";
6
6
  export type { TransportMode, HttpTransportConfig, TransportConfig } from "./types.js";
7
7
  export { DEFAULT_TRANSPORT_CONFIG } from "./types.js";
8
+ export type { ServerFactory } from "./http.js";
8
9
  export interface TransportResult {
9
10
  mode: "stdio" | "http";
10
11
  start: () => Promise<void>;
@@ -12,6 +13,10 @@ export interface TransportResult {
12
13
  }
13
14
  /**
14
15
  * Creates and starts a transport based on configuration
16
+ *
17
+ * @param createServer - Factory function to create Server instances
18
+ * For HTTP mode: called once per session (each session gets its own Server)
19
+ * For stdio mode: called once at startup
15
20
  */
16
- export declare function createTransport(server: Server, config: TransportConfig): TransportResult;
21
+ export declare function createTransport(createServer: ServerFactory, config: TransportConfig): TransportResult;
17
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAExE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,eAAe,GACtB,eAAe,CAsBjB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAoB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,aAAa,EAC3B,MAAM,EAAE,eAAe,GACtB,eAAe,CAuBjB"}
@@ -3,26 +3,32 @@
3
3
  */
4
4
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
5
  import { createHttpServer } from "./http.js";
6
+ import { log } from "../utils/logger.js";
6
7
  export { DEFAULT_TRANSPORT_CONFIG } from "./types.js";
7
8
  /**
8
9
  * Creates and starts a transport based on configuration
10
+ *
11
+ * @param createServer - Factory function to create Server instances
12
+ * For HTTP mode: called once per session (each session gets its own Server)
13
+ * For stdio mode: called once at startup
9
14
  */
10
- export function createTransport(server, config) {
15
+ export function createTransport(createServer, config) {
11
16
  if (config.mode === "http") {
12
- const httpServer = createHttpServer(server, config.http);
17
+ const httpServer = createHttpServer(createServer, config.http);
13
18
  return {
14
19
  mode: "http",
15
20
  start: httpServer.start,
16
21
  close: httpServer.close,
17
22
  };
18
23
  }
19
- // Default: stdio transport
24
+ // Default: stdio transport - create single server instance
25
+ const server = createServer();
20
26
  const transport = new StdioServerTransport();
21
27
  return {
22
28
  mode: "stdio",
23
29
  start: async () => {
24
30
  await server.connect(transport);
25
- console.error("Jicon MCP Server running on stdio");
31
+ log("Jicon MCP Server running on stdio");
26
32
  },
27
33
  close: async () => {
28
34
  await transport.close();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAI7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAQtD;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAc,EACd,MAAuB;IAEvB,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACzD,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,KAAK,EAAE,UAAU,CAAC,KAAK;SACxB,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,OAAO;QACL,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACrD,CAAC;QACD,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAsB,MAAM,WAAW,CAAC;AAEjE,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAGzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAStD;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,YAA2B,EAC3B,MAAuB;IAEvB,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,gBAAgB,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/D,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,KAAK,EAAE,UAAU,CAAC,KAAK;SACxB,CAAC;IACJ,CAAC;IAED,2DAA2D;IAC3D,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,OAAO;QACL,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAChC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QAC3C,CAAC;QACD,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC;KACF,CAAC;AACJ,CAAC"}