boondmanager-mcp-server 1.5.3 → 1.7.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.
@@ -2,12 +2,26 @@ import { createServer } from "node:http";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
4
4
  import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
5
+ import { logger, generateCorrelationId } from "../services/logger.js";
6
+ // Defaults: a half-hour idle window matches typical MCP gateway behaviour, and
7
+ // a 5-minute sweep keeps memory bounded without hammering the event loop.
8
+ const DEFAULT_SESSION_TTL_MS = 30 * 60_000;
9
+ const DEFAULT_SESSION_SWEEP_INTERVAL_MS = 5 * 60_000;
5
10
  function readEnv(key) {
6
11
  const v = process.env[key];
7
12
  if (!v || v.startsWith("${"))
8
13
  return undefined;
9
14
  return v;
10
15
  }
16
+ function readPositiveInt(key, fallback) {
17
+ const raw = readEnv(key);
18
+ if (!raw)
19
+ return fallback;
20
+ const parsed = Number(raw);
21
+ if (!Number.isFinite(parsed) || parsed <= 0)
22
+ return fallback;
23
+ return Math.floor(parsed);
24
+ }
11
25
  export function resolveHttpOptions() {
12
26
  const portRaw = readEnv("MCP_HTTP_PORT");
13
27
  const port = portRaw ? Number.parseInt(portRaw, 10) : 3000;
@@ -23,6 +37,8 @@ export function resolveHttpOptions() {
23
37
  stateless,
24
38
  bearerToken: readEnv("MCP_HTTP_BEARER_TOKEN"),
25
39
  enableJsonResponse,
40
+ sessionTtlMs: readPositiveInt("MCP_HTTP_SESSION_TTL_MS", DEFAULT_SESSION_TTL_MS),
41
+ sessionSweepIntervalMs: readPositiveInt("MCP_HTTP_SESSION_SWEEP_INTERVAL_MS", DEFAULT_SESSION_SWEEP_INTERVAL_MS),
26
42
  };
27
43
  }
28
44
  async function readJsonBody(req) {
@@ -49,9 +65,44 @@ function writeJsonRpcError(res, status, message) {
49
65
  id: null,
50
66
  }));
51
67
  }
68
+ async function destroySession(entry) {
69
+ // Close transport and server independently so a failure in one still lets
70
+ // the other release its resources. We swallow errors because the caller
71
+ // already lost interest in this session.
72
+ await Promise.allSettled([
73
+ Promise.resolve().then(() => entry.transport.close()),
74
+ Promise.resolve().then(() => entry.server.close()),
75
+ ]);
76
+ }
52
77
  export async function startHttpTransport(createServerFactory, options) {
53
78
  const sessions = new Map();
79
+ const sessionTtlMs = options.sessionTtlMs ?? DEFAULT_SESSION_TTL_MS;
80
+ const sessionSweepIntervalMs = options.sessionSweepIntervalMs ?? DEFAULT_SESSION_SWEEP_INTERVAL_MS;
81
+ const sweepIdleSessions = async () => {
82
+ const cutoff = Date.now() - sessionTtlMs;
83
+ const expired = [];
84
+ for (const [id, entry] of sessions) {
85
+ if (entry.lastActivityAt < cutoff) {
86
+ expired.push([id, entry]);
87
+ }
88
+ }
89
+ for (const [id] of expired)
90
+ sessions.delete(id);
91
+ await Promise.all(expired.map(([, entry]) => destroySession(entry)));
92
+ return expired.length;
93
+ };
94
+ // Periodic sweep — only meaningful in stateful mode. `unref()` lets the
95
+ // process exit naturally even when the timer is pending.
96
+ let sweepTimer;
97
+ if (!options.stateless) {
98
+ sweepTimer = setInterval(() => {
99
+ void sweepIdleSessions();
100
+ }, sessionSweepIntervalMs);
101
+ sweepTimer.unref?.();
102
+ }
54
103
  const httpServer = createServer(async (req, res) => {
104
+ const corrId = generateCorrelationId();
105
+ const reqLogger = logger.child({ corrId, method: req.method, path: req.url });
55
106
  try {
56
107
  const url = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
57
108
  if (url.pathname !== options.path) {
@@ -90,7 +141,9 @@ export async function startHttpTransport(createServerFactory, options) {
90
141
  const sessionIdHeader = req.headers["mcp-session-id"];
91
142
  const sessionId = Array.isArray(sessionIdHeader) ? sessionIdHeader[0] : sessionIdHeader;
92
143
  if (sessionId && sessions.has(sessionId)) {
93
- await sessions.get(sessionId).handleRequest(req, res);
144
+ const entry = sessions.get(sessionId);
145
+ entry.lastActivityAt = Date.now();
146
+ await entry.transport.handleRequest(req, res);
94
147
  return;
95
148
  }
96
149
  if (req.method !== "POST") {
@@ -107,22 +160,36 @@ export async function startHttpTransport(createServerFactory, options) {
107
160
  sessionIdGenerator: () => randomUUID(),
108
161
  enableJsonResponse: options.enableJsonResponse,
109
162
  onsessioninitialized: (id) => {
110
- sessions.set(id, transport);
163
+ sessions.set(id, { transport, server, lastActivityAt: Date.now() });
164
+ reqLogger.info({ sessionId: id, sessionCount: sessions.size }, "MCP session initialized");
111
165
  },
112
166
  onsessionclosed: (id) => {
113
- sessions.delete(id);
167
+ const entry = sessions.get(id);
168
+ if (entry) {
169
+ sessions.delete(id);
170
+ void destroySession(entry);
171
+ reqLogger.info({ sessionId: id, sessionCount: sessions.size }, "MCP session closed");
172
+ }
114
173
  },
115
174
  });
116
175
  transport.onclose = () => {
117
- if (transport.sessionId)
118
- sessions.delete(transport.sessionId);
176
+ const id = transport.sessionId;
177
+ if (!id)
178
+ return;
179
+ const entry = sessions.get(id);
180
+ if (entry) {
181
+ sessions.delete(id);
182
+ // Server is closed by destroySession — but if the transport's own
183
+ // close path already disposed it, the second call is a no-op.
184
+ void entry.server.close().catch(() => undefined);
185
+ }
119
186
  };
120
187
  const server = createServerFactory();
121
188
  await server.connect(transport);
122
189
  await transport.handleRequest(req, res, body);
123
190
  }
124
191
  catch (error) {
125
- console.error("HTTP transport error:", error);
192
+ reqLogger.error({ err: error }, "HTTP transport error");
126
193
  if (!res.headersSent) {
127
194
  writeJsonRpcError(res, 500, "Internal server error");
128
195
  }
@@ -140,9 +207,14 @@ export async function startHttpTransport(createServerFactory, options) {
140
207
  });
141
208
  return {
142
209
  address: { host: options.host, port: options.port, path: options.path },
210
+ sessionCount: () => sessions.size,
211
+ sweepIdleSessions,
143
212
  close: async () => {
144
- await Promise.all(Array.from(sessions.values()).map((t) => t.close()));
213
+ if (sweepTimer)
214
+ clearInterval(sweepTimer);
215
+ const entries = Array.from(sessions.values());
145
216
  sessions.clear();
217
+ await Promise.all(entries.map((e) => destroySession(e)));
146
218
  await new Promise((resolve, reject) => {
147
219
  httpServer.close((err) => (err ? reject(err) : resolve()));
148
220
  });
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"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"}
package/manifest.json CHANGED
@@ -2,8 +2,8 @@
2
2
  "manifest_version": "0.3",
3
3
  "name": "boondmanager-mcp-server",
4
4
  "display_name": "BoondManager MCP Server",
5
- "version": "1.5.3",
6
- "description": "MCP Server for BoondManager API - 158 tools across 36 domains for ERP/CRM data",
5
+ "version": "1.7.0",
6
+ "description": "MCP Server for BoondManager API - 156 tools, 11 prompts, 20 resources across 36 domains for ERP/CRM data",
7
7
  "author": {
8
8
  "name": "Frédéric Auguste",
9
9
  "url": "https://github.com/fauguste/boondmanager-mcp-server"
@@ -15,9 +15,7 @@
15
15
  "homepage": "https://github.com/fauguste/boondmanager-mcp-server#readme",
16
16
  "support": "https://github.com/fauguste/boondmanager-mcp-server/issues",
17
17
  "license": "Apache-2.0",
18
- "icons": [
19
- { "src": "icon.png", "size": "128x128" }
20
- ],
18
+ "icons": [{ "src": "icon.png", "size": "128x128" }],
21
19
  "server": {
22
20
  "type": "node",
23
21
  "entry_point": "dist/index.js",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "boondmanager-mcp-server",
3
- "version": "1.5.3",
3
+ "version": "1.7.0",
4
4
  "description": "MCP Server for BoondManager API - Resources, Candidates & CRM",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -32,12 +32,17 @@
32
32
  "dev": "tsc --watch",
33
33
  "lint": "eslint src/",
34
34
  "lint:fix": "eslint src/ --fix",
35
+ "format": "prettier --write \"src/**/*.{ts,js,json}\"",
36
+ "format:check": "prettier --check \"src/**/*.{ts,js,json}\"",
35
37
  "test": "vitest run",
36
38
  "test:watch": "vitest",
37
39
  "test:coverage": "vitest run --coverage",
38
40
  "typecheck": "tsc --noEmit",
39
41
  "docs:tools": "npm run build && node scripts/generate-tools-catalog.mjs",
40
42
  "docs:tools:check": "npm run build && node scripts/generate-tools-catalog.mjs --check",
43
+ "api:monitor:test": "node scripts/test-api-monitor.cjs",
44
+ "api:monitor:save": "node scripts/test-api-monitor.cjs --save",
45
+ "prepare": "husky",
41
46
  "prepublishOnly": "npm run build"
42
47
  },
43
48
  "keywords": [
@@ -53,6 +58,7 @@
53
58
  "license": "Apache-2.0",
54
59
  "dependencies": {
55
60
  "@modelcontextprotocol/sdk": "^1.12.1",
61
+ "pino": "^10.3.1",
56
62
  "zod": "^4.3.6"
57
63
  },
58
64
  "devDependencies": {
@@ -60,6 +66,10 @@
60
66
  "@types/node": "^25.3.0",
61
67
  "@vitest/coverage-v8": "^4.0.18",
62
68
  "eslint": "^10.0.2",
69
+ "husky": "^9.1.7",
70
+ "lint-staged": "^16.4.0",
71
+ "pino-pretty": "^13.1.3",
72
+ "prettier": "^3.8.3",
63
73
  "typescript": "^6.0.2",
64
74
  "typescript-eslint": "^8.0.0",
65
75
  "vitest": "^4.0.18"