fdic-mcp-server 1.2.4 → 1.2.5

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.5" : 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;
@@ -33970,6 +33970,8 @@ function parseAllowedOrigins(rawOrigins, port) {
33970
33970
  `https://127.0.0.1:${port}`
33971
33971
  ];
33972
33972
  }
33973
+ var DEFAULT_SESSION_IDLE_TIMEOUT_MS = 30 * 60 * 1e3;
33974
+ var DEFAULT_SESSION_SWEEP_INTERVAL_MS = 5 * 60 * 1e3;
33973
33975
  async function closeSession(sessions, sessionId) {
33974
33976
  const session = sessions.get(sessionId);
33975
33977
  if (!session) {
@@ -33981,6 +33983,20 @@ async function closeSession(sessions, sessionId) {
33981
33983
  await session.transport.close().catch(() => {
33982
33984
  });
33983
33985
  }
33986
+ function touchSession(session, now) {
33987
+ session.lastActivityAt = now;
33988
+ }
33989
+ async function sweepIdleSessions(sessions, idleTimeoutMs, now) {
33990
+ const expiredSessionIds = [];
33991
+ for (const [sessionId, session] of sessions.entries()) {
33992
+ if (now - session.lastActivityAt >= idleTimeoutMs) {
33993
+ expiredSessionIds.push(sessionId);
33994
+ }
33995
+ }
33996
+ await Promise.all(
33997
+ expiredSessionIds.map((sessionId) => closeSession(sessions, sessionId))
33998
+ );
33999
+ }
33984
34000
  function sendInvalidSessionResponse(res) {
33985
34001
  res.status(400).json({
33986
34002
  jsonrpc: "2.0",
@@ -33996,7 +34012,13 @@ function createApp(options = {}) {
33996
34012
  const port = options.port ?? 3e3;
33997
34013
  const allowedOrigins = options.allowedOrigins ?? parseAllowedOrigins(void 0, port);
33998
34014
  const sessions = /* @__PURE__ */ new Map();
34015
+ const sessionIdleTimeoutMs = options.sessionIdleTimeoutMs ?? DEFAULT_SESSION_IDLE_TIMEOUT_MS;
34016
+ const sessionSweepIntervalMs = options.sessionSweepIntervalMs ?? DEFAULT_SESSION_SWEEP_INTERVAL_MS;
33999
34017
  app.use(import_express.default.json());
34018
+ const sessionSweepTimer = setInterval(() => {
34019
+ void sweepIdleSessions(sessions, sessionIdleTimeoutMs, Date.now());
34020
+ }, sessionSweepIntervalMs);
34021
+ sessionSweepTimer.unref?.();
34000
34022
  app.get("/health", (_req, res) => {
34001
34023
  res.json({ status: "ok", server: "fdic-mcp-server", version: VERSION });
34002
34024
  });
@@ -34017,6 +34039,7 @@ function createApp(options = {}) {
34017
34039
  });
34018
34040
  return;
34019
34041
  }
34042
+ touchSession(session, Date.now());
34020
34043
  await session.transport.handleRequest(req, res, req.body);
34021
34044
  if (req.method === "DELETE") {
34022
34045
  await closeSession(sessions, sessionId);
@@ -34034,7 +34057,11 @@ function createApp(options = {}) {
34034
34057
  enableDnsRebindingProtection: true,
34035
34058
  allowedOrigins,
34036
34059
  onsessioninitialized: (newSessionId) => {
34037
- sessions.set(newSessionId, { server, transport });
34060
+ sessions.set(newSessionId, {
34061
+ server,
34062
+ transport,
34063
+ lastActivityAt: Date.now()
34064
+ });
34038
34065
  }
34039
34066
  });
34040
34067
  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.5" : 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;
@@ -33984,6 +33984,8 @@ function parseAllowedOrigins(rawOrigins, port) {
33984
33984
  `https://127.0.0.1:${port}`
33985
33985
  ];
33986
33986
  }
33987
+ var DEFAULT_SESSION_IDLE_TIMEOUT_MS = 30 * 60 * 1e3;
33988
+ var DEFAULT_SESSION_SWEEP_INTERVAL_MS = 5 * 60 * 1e3;
33987
33989
  async function closeSession(sessions, sessionId) {
33988
33990
  const session = sessions.get(sessionId);
33989
33991
  if (!session) {
@@ -33995,6 +33997,20 @@ async function closeSession(sessions, sessionId) {
33995
33997
  await session.transport.close().catch(() => {
33996
33998
  });
33997
33999
  }
34000
+ function touchSession(session, now) {
34001
+ session.lastActivityAt = now;
34002
+ }
34003
+ async function sweepIdleSessions(sessions, idleTimeoutMs, now) {
34004
+ const expiredSessionIds = [];
34005
+ for (const [sessionId, session] of sessions.entries()) {
34006
+ if (now - session.lastActivityAt >= idleTimeoutMs) {
34007
+ expiredSessionIds.push(sessionId);
34008
+ }
34009
+ }
34010
+ await Promise.all(
34011
+ expiredSessionIds.map((sessionId) => closeSession(sessions, sessionId))
34012
+ );
34013
+ }
33998
34014
  function sendInvalidSessionResponse(res) {
33999
34015
  res.status(400).json({
34000
34016
  jsonrpc: "2.0",
@@ -34010,7 +34026,13 @@ function createApp(options = {}) {
34010
34026
  const port = options.port ?? 3e3;
34011
34027
  const allowedOrigins = options.allowedOrigins ?? parseAllowedOrigins(void 0, port);
34012
34028
  const sessions = /* @__PURE__ */ new Map();
34029
+ const sessionIdleTimeoutMs = options.sessionIdleTimeoutMs ?? DEFAULT_SESSION_IDLE_TIMEOUT_MS;
34030
+ const sessionSweepIntervalMs = options.sessionSweepIntervalMs ?? DEFAULT_SESSION_SWEEP_INTERVAL_MS;
34013
34031
  app.use(import_express.default.json());
34032
+ const sessionSweepTimer = setInterval(() => {
34033
+ void sweepIdleSessions(sessions, sessionIdleTimeoutMs, Date.now());
34034
+ }, sessionSweepIntervalMs);
34035
+ sessionSweepTimer.unref?.();
34014
34036
  app.get("/health", (_req, res) => {
34015
34037
  res.json({ status: "ok", server: "fdic-mcp-server", version: VERSION });
34016
34038
  });
@@ -34031,6 +34053,7 @@ function createApp(options = {}) {
34031
34053
  });
34032
34054
  return;
34033
34055
  }
34056
+ touchSession(session, Date.now());
34034
34057
  await session.transport.handleRequest(req, res, req.body);
34035
34058
  if (req.method === "DELETE") {
34036
34059
  await closeSession(sessions, sessionId);
@@ -34048,7 +34071,11 @@ function createApp(options = {}) {
34048
34071
  enableDnsRebindingProtection: true,
34049
34072
  allowedOrigins,
34050
34073
  onsessioninitialized: (newSessionId) => {
34051
- sessions.set(newSessionId, { server, transport });
34074
+ sessions.set(newSessionId, {
34075
+ server,
34076
+ transport,
34077
+ lastActivityAt: Date.now()
34078
+ });
34052
34079
  }
34053
34080
  });
34054
34081
  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.5",
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",