fdic-mcp-server 1.2.4 → 1.2.6

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/dist/index.js CHANGED
@@ -32,7 +32,7 @@ var import_types = require("@modelcontextprotocol/sdk/types.js");
32
32
  var import_express = __toESM(require("express"));
33
33
 
34
34
  // src/constants.ts
35
- var VERSION = true ? "1.2.4" : process.env.npm_package_version ?? "0.0.0-dev";
35
+ var VERSION = true ? "1.2.6" : process.env.npm_package_version ?? "0.0.0-dev";
36
36
  var FDIC_API_BASE_URL = "https://banks.data.fdic.gov/api";
37
37
  var CHARACTER_LIMIT = 5e4;
38
38
  var DEFAULT_FDIC_MAX_RESPONSE_BYTES = 5 * 1024 * 1024;
@@ -31242,10 +31242,9 @@ var QUERY_CACHE_MAX_ENTRIES = 500;
31242
31242
  var queryCache = /* @__PURE__ */ new Map();
31243
31243
  function pruneExpiredQueryCache(now) {
31244
31244
  for (const [key, entry] of queryCache.entries()) {
31245
- if (entry.expiresAt > now) {
31246
- break;
31245
+ if (entry.expiresAt <= now) {
31246
+ queryCache.delete(key);
31247
31247
  }
31248
- queryCache.delete(key);
31249
31248
  }
31250
31249
  }
31251
31250
  function evictOverflowQueryCache() {
@@ -33970,6 +33969,8 @@ function parseAllowedOrigins(rawOrigins, port) {
33970
33969
  `https://127.0.0.1:${port}`
33971
33970
  ];
33972
33971
  }
33972
+ var DEFAULT_SESSION_IDLE_TIMEOUT_MS = 30 * 60 * 1e3;
33973
+ var DEFAULT_SESSION_SWEEP_INTERVAL_MS = 5 * 60 * 1e3;
33973
33974
  async function closeSession(sessions, sessionId) {
33974
33975
  const session = sessions.get(sessionId);
33975
33976
  if (!session) {
@@ -33981,6 +33982,20 @@ async function closeSession(sessions, sessionId) {
33981
33982
  await session.transport.close().catch(() => {
33982
33983
  });
33983
33984
  }
33985
+ function touchSession(session, now) {
33986
+ session.lastActivityAt = now;
33987
+ }
33988
+ async function sweepIdleSessions(sessions, idleTimeoutMs, now) {
33989
+ const expiredSessionIds = [];
33990
+ for (const [sessionId, session] of sessions.entries()) {
33991
+ if (now - session.lastActivityAt >= idleTimeoutMs) {
33992
+ expiredSessionIds.push(sessionId);
33993
+ }
33994
+ }
33995
+ await Promise.all(
33996
+ expiredSessionIds.map((sessionId) => closeSession(sessions, sessionId))
33997
+ );
33998
+ }
33984
33999
  function sendInvalidSessionResponse(res) {
33985
34000
  res.status(400).json({
33986
34001
  jsonrpc: "2.0",
@@ -33996,7 +34011,13 @@ function createApp(options = {}) {
33996
34011
  const port = options.port ?? 3e3;
33997
34012
  const allowedOrigins = options.allowedOrigins ?? parseAllowedOrigins(void 0, port);
33998
34013
  const sessions = /* @__PURE__ */ new Map();
34014
+ const sessionIdleTimeoutMs = options.sessionIdleTimeoutMs ?? DEFAULT_SESSION_IDLE_TIMEOUT_MS;
34015
+ const sessionSweepIntervalMs = options.sessionSweepIntervalMs ?? DEFAULT_SESSION_SWEEP_INTERVAL_MS;
33999
34016
  app.use(import_express.default.json());
34017
+ const sessionSweepTimer = setInterval(() => {
34018
+ void sweepIdleSessions(sessions, sessionIdleTimeoutMs, Date.now());
34019
+ }, sessionSweepIntervalMs);
34020
+ sessionSweepTimer.unref?.();
34000
34021
  app.get("/health", (_req, res) => {
34001
34022
  res.json({ status: "ok", server: "fdic-mcp-server", version: VERSION });
34002
34023
  });
@@ -34017,6 +34038,7 @@ function createApp(options = {}) {
34017
34038
  });
34018
34039
  return;
34019
34040
  }
34041
+ touchSession(session, Date.now());
34020
34042
  await session.transport.handleRequest(req, res, req.body);
34021
34043
  if (req.method === "DELETE") {
34022
34044
  await closeSession(sessions, sessionId);
@@ -34034,7 +34056,11 @@ function createApp(options = {}) {
34034
34056
  enableDnsRebindingProtection: true,
34035
34057
  allowedOrigins,
34036
34058
  onsessioninitialized: (newSessionId) => {
34037
- sessions.set(newSessionId, { server, transport });
34059
+ sessions.set(newSessionId, {
34060
+ server,
34061
+ transport,
34062
+ lastActivityAt: Date.now()
34063
+ });
34038
34064
  }
34039
34065
  });
34040
34066
  transport.onclose = () => {
package/dist/server.js CHANGED
@@ -46,7 +46,7 @@ var import_types = require("@modelcontextprotocol/sdk/types.js");
46
46
  var import_express = __toESM(require("express"));
47
47
 
48
48
  // src/constants.ts
49
- var VERSION = true ? "1.2.4" : process.env.npm_package_version ?? "0.0.0-dev";
49
+ var VERSION = true ? "1.2.6" : process.env.npm_package_version ?? "0.0.0-dev";
50
50
  var FDIC_API_BASE_URL = "https://banks.data.fdic.gov/api";
51
51
  var CHARACTER_LIMIT = 5e4;
52
52
  var DEFAULT_FDIC_MAX_RESPONSE_BYTES = 5 * 1024 * 1024;
@@ -31256,10 +31256,9 @@ var QUERY_CACHE_MAX_ENTRIES = 500;
31256
31256
  var queryCache = /* @__PURE__ */ new Map();
31257
31257
  function pruneExpiredQueryCache(now) {
31258
31258
  for (const [key, entry] of queryCache.entries()) {
31259
- if (entry.expiresAt > now) {
31260
- break;
31259
+ if (entry.expiresAt <= now) {
31260
+ queryCache.delete(key);
31261
31261
  }
31262
- queryCache.delete(key);
31263
31262
  }
31264
31263
  }
31265
31264
  function evictOverflowQueryCache() {
@@ -33984,6 +33983,8 @@ function parseAllowedOrigins(rawOrigins, port) {
33984
33983
  `https://127.0.0.1:${port}`
33985
33984
  ];
33986
33985
  }
33986
+ var DEFAULT_SESSION_IDLE_TIMEOUT_MS = 30 * 60 * 1e3;
33987
+ var DEFAULT_SESSION_SWEEP_INTERVAL_MS = 5 * 60 * 1e3;
33987
33988
  async function closeSession(sessions, sessionId) {
33988
33989
  const session = sessions.get(sessionId);
33989
33990
  if (!session) {
@@ -33995,6 +33996,20 @@ async function closeSession(sessions, sessionId) {
33995
33996
  await session.transport.close().catch(() => {
33996
33997
  });
33997
33998
  }
33999
+ function touchSession(session, now) {
34000
+ session.lastActivityAt = now;
34001
+ }
34002
+ async function sweepIdleSessions(sessions, idleTimeoutMs, now) {
34003
+ const expiredSessionIds = [];
34004
+ for (const [sessionId, session] of sessions.entries()) {
34005
+ if (now - session.lastActivityAt >= idleTimeoutMs) {
34006
+ expiredSessionIds.push(sessionId);
34007
+ }
34008
+ }
34009
+ await Promise.all(
34010
+ expiredSessionIds.map((sessionId) => closeSession(sessions, sessionId))
34011
+ );
34012
+ }
33998
34013
  function sendInvalidSessionResponse(res) {
33999
34014
  res.status(400).json({
34000
34015
  jsonrpc: "2.0",
@@ -34010,7 +34025,13 @@ function createApp(options = {}) {
34010
34025
  const port = options.port ?? 3e3;
34011
34026
  const allowedOrigins = options.allowedOrigins ?? parseAllowedOrigins(void 0, port);
34012
34027
  const sessions = /* @__PURE__ */ new Map();
34028
+ const sessionIdleTimeoutMs = options.sessionIdleTimeoutMs ?? DEFAULT_SESSION_IDLE_TIMEOUT_MS;
34029
+ const sessionSweepIntervalMs = options.sessionSweepIntervalMs ?? DEFAULT_SESSION_SWEEP_INTERVAL_MS;
34013
34030
  app.use(import_express.default.json());
34031
+ const sessionSweepTimer = setInterval(() => {
34032
+ void sweepIdleSessions(sessions, sessionIdleTimeoutMs, Date.now());
34033
+ }, sessionSweepIntervalMs);
34034
+ sessionSweepTimer.unref?.();
34014
34035
  app.get("/health", (_req, res) => {
34015
34036
  res.json({ status: "ok", server: "fdic-mcp-server", version: VERSION });
34016
34037
  });
@@ -34031,6 +34052,7 @@ function createApp(options = {}) {
34031
34052
  });
34032
34053
  return;
34033
34054
  }
34055
+ touchSession(session, Date.now());
34034
34056
  await session.transport.handleRequest(req, res, req.body);
34035
34057
  if (req.method === "DELETE") {
34036
34058
  await closeSession(sessions, sessionId);
@@ -34048,7 +34070,11 @@ function createApp(options = {}) {
34048
34070
  enableDnsRebindingProtection: true,
34049
34071
  allowedOrigins,
34050
34072
  onsessioninitialized: (newSessionId) => {
34051
- sessions.set(newSessionId, { server, transport });
34073
+ sessions.set(newSessionId, {
34074
+ server,
34075
+ transport,
34076
+ lastActivityAt: Date.now()
34077
+ });
34052
34078
  }
34053
34079
  });
34054
34080
  transport.onclose = () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fdic-mcp-server",
3
- "version": "1.2.4",
3
+ "version": "1.2.6",
4
4
  "description": "MCP server for the FDIC BankFind Suite API",
5
5
  "mcpName": "io.github.jflamb/fdic-mcp-server",
6
6
  "main": "dist/server.js",