@evercam/mcp 0.0.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.
Files changed (146) hide show
  1. package/README.md +1017 -0
  2. package/dist/bin/evercam-mcp.d.ts +3 -0
  3. package/dist/bin/evercam-mcp.d.ts.map +1 -0
  4. package/dist/bin/evercam-mcp.js +87 -0
  5. package/dist/bin/evercam-mcp.js.map +1 -0
  6. package/dist/src/auth/auth.d.ts +9 -0
  7. package/dist/src/auth/auth.d.ts.map +1 -0
  8. package/dist/src/auth/auth.js +44 -0
  9. package/dist/src/auth/auth.js.map +1 -0
  10. package/dist/src/auth/tokenStore.d.ts +9 -0
  11. package/dist/src/auth/tokenStore.d.ts.map +1 -0
  12. package/dist/src/auth/tokenStore.js +42 -0
  13. package/dist/src/auth/tokenStore.js.map +1 -0
  14. package/dist/src/cli/auth.d.ts +13 -0
  15. package/dist/src/cli/auth.d.ts.map +1 -0
  16. package/dist/src/cli/auth.js +98 -0
  17. package/dist/src/cli/auth.js.map +1 -0
  18. package/dist/src/cli/doctor.d.ts +4 -0
  19. package/dist/src/cli/doctor.d.ts.map +1 -0
  20. package/dist/src/cli/doctor.js +54 -0
  21. package/dist/src/cli/doctor.js.map +1 -0
  22. package/dist/src/cli/profile.d.ts +10 -0
  23. package/dist/src/cli/profile.d.ts.map +1 -0
  24. package/dist/src/cli/profile.js +53 -0
  25. package/dist/src/cli/profile.js.map +1 -0
  26. package/dist/src/cli/run.d.ts +5 -0
  27. package/dist/src/cli/run.d.ts.map +1 -0
  28. package/dist/src/cli/run.js +63 -0
  29. package/dist/src/cli/run.js.map +1 -0
  30. package/dist/src/cli/serve.d.ts +13 -0
  31. package/dist/src/cli/serve.d.ts.map +1 -0
  32. package/dist/src/cli/serve.js +58 -0
  33. package/dist/src/cli/serve.js.map +1 -0
  34. package/dist/src/cli/tools.d.ts +3 -0
  35. package/dist/src/cli/tools.d.ts.map +1 -0
  36. package/dist/src/cli/tools.js +151 -0
  37. package/dist/src/cli/tools.js.map +1 -0
  38. package/dist/src/config/env.d.ts +3 -0
  39. package/dist/src/config/env.d.ts.map +1 -0
  40. package/dist/src/config/env.js +17 -0
  41. package/dist/src/config/env.js.map +1 -0
  42. package/dist/src/config/profiles.d.ts +17 -0
  43. package/dist/src/config/profiles.d.ts.map +1 -0
  44. package/dist/src/config/profiles.js +56 -0
  45. package/dist/src/config/profiles.js.map +1 -0
  46. package/dist/src/index.d.ts +7 -0
  47. package/dist/src/index.d.ts.map +1 -0
  48. package/dist/src/index.js +7 -0
  49. package/dist/src/index.js.map +1 -0
  50. package/dist/src/server.d.ts +8 -0
  51. package/dist/src/server.d.ts.map +1 -0
  52. package/dist/src/server.js +23 -0
  53. package/dist/src/server.js.map +1 -0
  54. package/dist/src/tools/anpr.d.ts +4 -0
  55. package/dist/src/tools/anpr.d.ts.map +1 -0
  56. package/dist/src/tools/anpr.js +75 -0
  57. package/dist/src/tools/anpr.js.map +1 -0
  58. package/dist/src/tools/bim.d.ts +4 -0
  59. package/dist/src/tools/bim.d.ts.map +1 -0
  60. package/dist/src/tools/bim.js +24 -0
  61. package/dist/src/tools/bim.js.map +1 -0
  62. package/dist/src/tools/cameras.d.ts +4 -0
  63. package/dist/src/tools/cameras.d.ts.map +1 -0
  64. package/dist/src/tools/cameras.js +31 -0
  65. package/dist/src/tools/cameras.js.map +1 -0
  66. package/dist/src/tools/copilot.d.ts +4 -0
  67. package/dist/src/tools/copilot.d.ts.map +1 -0
  68. package/dist/src/tools/copilot.js +58 -0
  69. package/dist/src/tools/copilot.js.map +1 -0
  70. package/dist/src/tools/detections.d.ts +4 -0
  71. package/dist/src/tools/detections.d.ts.map +1 -0
  72. package/dist/src/tools/detections.js +40 -0
  73. package/dist/src/tools/detections.js.map +1 -0
  74. package/dist/src/tools/index.d.ts +4 -0
  75. package/dist/src/tools/index.d.ts.map +1 -0
  76. package/dist/src/tools/index.js +31 -0
  77. package/dist/src/tools/index.js.map +1 -0
  78. package/dist/src/tools/media.d.ts +4 -0
  79. package/dist/src/tools/media.d.ts.map +1 -0
  80. package/dist/src/tools/media.js +38 -0
  81. package/dist/src/tools/media.js.map +1 -0
  82. package/dist/src/tools/mutations.d.ts +8 -0
  83. package/dist/src/tools/mutations.d.ts.map +1 -0
  84. package/dist/src/tools/mutations.js +41 -0
  85. package/dist/src/tools/mutations.js.map +1 -0
  86. package/dist/src/tools/notifications.d.ts +4 -0
  87. package/dist/src/tools/notifications.d.ts.map +1 -0
  88. package/dist/src/tools/notifications.js +21 -0
  89. package/dist/src/tools/notifications.js.map +1 -0
  90. package/dist/src/tools/progressPhotos.d.ts +4 -0
  91. package/dist/src/tools/progressPhotos.d.ts.map +1 -0
  92. package/dist/src/tools/progressPhotos.js +36 -0
  93. package/dist/src/tools/progressPhotos.js.map +1 -0
  94. package/dist/src/tools/projects.d.ts +4 -0
  95. package/dist/src/tools/projects.d.ts.map +1 -0
  96. package/dist/src/tools/projects.js +56 -0
  97. package/dist/src/tools/projects.js.map +1 -0
  98. package/dist/src/tools/ptz.d.ts +4 -0
  99. package/dist/src/tools/ptz.d.ts.map +1 -0
  100. package/dist/src/tools/ptz.js +38 -0
  101. package/dist/src/tools/ptz.js.map +1 -0
  102. package/dist/src/tools/shares.d.ts +4 -0
  103. package/dist/src/tools/shares.d.ts.map +1 -0
  104. package/dist/src/tools/shares.js +11 -0
  105. package/dist/src/tools/shares.js.map +1 -0
  106. package/dist/src/tools/siteAnalytics.d.ts +4 -0
  107. package/dist/src/tools/siteAnalytics.d.ts.map +1 -0
  108. package/dist/src/tools/siteAnalytics.js +51 -0
  109. package/dist/src/tools/siteAnalytics.js.map +1 -0
  110. package/dist/src/tools/snapshots.d.ts +4 -0
  111. package/dist/src/tools/snapshots.d.ts.map +1 -0
  112. package/dist/src/tools/snapshots.js +83 -0
  113. package/dist/src/tools/snapshots.js.map +1 -0
  114. package/dist/src/tools/weather.d.ts +4 -0
  115. package/dist/src/tools/weather.d.ts.map +1 -0
  116. package/dist/src/tools/weather.js +11 -0
  117. package/dist/src/tools/weather.js.map +1 -0
  118. package/dist/src/transports/http.d.ts +24 -0
  119. package/dist/src/transports/http.d.ts.map +1 -0
  120. package/dist/src/transports/http.js +373 -0
  121. package/dist/src/transports/http.js.map +1 -0
  122. package/dist/src/transports/stdio.d.ts +3 -0
  123. package/dist/src/transports/stdio.d.ts.map +1 -0
  124. package/dist/src/transports/stdio.js +6 -0
  125. package/dist/src/transports/stdio.js.map +1 -0
  126. package/dist/src/utils/callTool.d.ts +18 -0
  127. package/dist/src/utils/callTool.d.ts.map +1 -0
  128. package/dist/src/utils/callTool.js +54 -0
  129. package/dist/src/utils/callTool.js.map +1 -0
  130. package/dist/src/utils/errors.d.ts +7 -0
  131. package/dist/src/utils/errors.d.ts.map +1 -0
  132. package/dist/src/utils/errors.js +70 -0
  133. package/dist/src/utils/errors.js.map +1 -0
  134. package/dist/src/utils/logger.d.ts +10 -0
  135. package/dist/src/utils/logger.d.ts.map +1 -0
  136. package/dist/src/utils/logger.js +4 -0
  137. package/dist/src/utils/logger.js.map +1 -0
  138. package/dist/src/utils/retry.d.ts +12 -0
  139. package/dist/src/utils/retry.d.ts.map +1 -0
  140. package/dist/src/utils/retry.js +29 -0
  141. package/dist/src/utils/retry.js.map +1 -0
  142. package/dist/src/utils/toolOutput.d.ts +21 -0
  143. package/dist/src/utils/toolOutput.d.ts.map +1 -0
  144. package/dist/src/utils/toolOutput.js +35 -0
  145. package/dist/src/utils/toolOutput.js.map +1 -0
  146. package/package.json +65 -0
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { Evercam } from "@evercam/sdk";
3
+ export declare function registerSnapshotTools(server: McpServer, evercam: Evercam): void;
4
+ //# sourceMappingURL=snapshots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshots.d.ts","sourceRoot":"","sources":["../../../src/tools/snapshots.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAItC,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CA6H/E"}
@@ -0,0 +1,83 @@
1
+ import { z } from "zod";
2
+ import { imageContent, safeText } from "../utils/toolOutput.js";
3
+ export function registerSnapshotTools(server, evercam) {
4
+ server.tool("get-live-snapshot-url", "Get the live snapshot URL for a camera", {
5
+ cameraExid: z.string().describe("Camera exid"),
6
+ }, async ({ cameraExid }) => {
7
+ const camera = await evercam.getCamera(cameraExid);
8
+ const url = camera.getSnapshotUrl({ timestamp: new Date() });
9
+ return safeText({ url });
10
+ });
11
+ server.tool("get-snapshot-image", "Get a camera snapshot as MCP image content (base64) or as a URL", {
12
+ cameraExid: z.string().describe("Camera exid"),
13
+ timestamp: z.string().optional().describe("Optional ISO 8601 timestamp"),
14
+ mode: z.enum(["image", "url"]).optional().describe("Return mode: image (base64) or url"),
15
+ maxBytes: z
16
+ .number()
17
+ .optional()
18
+ .describe("Maximum allowed image size in bytes (default: 2,000,000)"),
19
+ }, async ({ cameraExid, timestamp, mode, maxBytes }) => {
20
+ const camera = await evercam.getCamera(cameraExid);
21
+ const snapTime = timestamp ? new Date(timestamp) : new Date();
22
+ const url = camera.getSnapshotUrl({ timestamp: snapTime });
23
+ const selectedMode = mode ?? "image";
24
+ if (selectedMode === "url") {
25
+ return safeText({ url, cameraExid, timestamp: snapTime.toISOString() });
26
+ }
27
+ const axiosInstance = evercam.axios ?? evercam.api?.axios;
28
+ const response = await axiosInstance.get(url, { responseType: "arraybuffer" });
29
+ const bytes = Buffer.from(response.data);
30
+ const limit = maxBytes ?? 2_000_000;
31
+ if (bytes.length > limit) {
32
+ throw new Error(`Snapshot too large (${bytes.length} bytes). Increase maxBytes or use mode=url`);
33
+ }
34
+ const mimeType = response.headers["content-type"] ?? "image/jpeg";
35
+ return imageContent(bytes.toString("base64"), mimeType);
36
+ });
37
+ server.tool("get-snapshot-at", "Get the recorded snapshot nearest to a given timestamp", {
38
+ cameraExid: z.string().describe("Camera exid"),
39
+ timestamp: z.string().describe("ISO 8601 timestamp"),
40
+ }, async ({ cameraExid, timestamp }) => {
41
+ const data = await evercam.api.recordings.nearest(cameraExid, timestamp);
42
+ return safeText(data);
43
+ });
44
+ server.tool("get-latest-snapshot", "Get the most recent recorded snapshot for a camera", {
45
+ cameraExid: z.string().describe("Camera exid"),
46
+ }, async ({ cameraExid }) => {
47
+ const data = await evercam.api.recordings.latest(cameraExid);
48
+ return safeText(data);
49
+ });
50
+ server.tool("get-oldest-snapshot", "Get the oldest recorded snapshot for a camera", {
51
+ cameraExid: z.string().describe("Camera exid"),
52
+ }, async ({ cameraExid }) => {
53
+ const data = await evercam.api.recordings.oldest(cameraExid);
54
+ return safeText(data);
55
+ });
56
+ server.tool("list-available-days", "List days that have recorded snapshots for a camera in a given month", {
57
+ cameraExid: z.string().describe("Camera exid"),
58
+ year: z.number().describe("Year (e.g. 2024)"),
59
+ month: z.number().describe("Month 1-12"),
60
+ }, async ({ cameraExid, year, month }) => {
61
+ const data = await evercam.api.recordings.availableDays({
62
+ cameraId: cameraExid,
63
+ year: String(year),
64
+ month: String(month),
65
+ });
66
+ return safeText(data);
67
+ });
68
+ server.tool("list-available-hours", "List hours within a specific day that have recordings for a camera", {
69
+ cameraExid: z.string().describe("Camera exid"),
70
+ year: z.number().describe("Year (e.g. 2024)"),
71
+ month: z.number().describe("Month 1-12"),
72
+ day: z.number().describe("Day 1-31"),
73
+ }, async ({ cameraExid, year, month, day }) => {
74
+ const data = await evercam.api.recordings.availableHours({
75
+ cameraId: cameraExid,
76
+ year: String(year),
77
+ month: String(month),
78
+ day: String(day),
79
+ });
80
+ return safeText(data);
81
+ });
82
+ }
83
+ //# sourceMappingURL=snapshots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshots.js","sourceRoot":"","sources":["../../../src/tools/snapshots.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { Evercam } from "@evercam/sdk";
3
+ export declare function registerWeatherTools(server: McpServer, evercam: Evercam): void;
4
+ //# sourceMappingURL=weather.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weather.d.ts","sourceRoot":"","sources":["../../../src/tools/weather.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAItC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAY9E"}
@@ -0,0 +1,11 @@
1
+ import { z } from "zod";
2
+ import { safeText } from "../utils/toolOutput.js";
3
+ export function registerWeatherTools(server, evercam) {
4
+ server.tool("get-project-weather", "Get current weather conditions at a project site", {
5
+ projectExid: z.string().describe("Project exid"),
6
+ }, async ({ projectExid }) => {
7
+ const data = await evercam.weather.current(projectExid, {});
8
+ return safeText(data);
9
+ });
10
+ }
11
+ //# sourceMappingURL=weather.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weather.js","sourceRoot":"","sources":["../../../src/tools/weather.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAEjD,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,OAAgB;IACtE,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,kDAAkD,EAClD;QACE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;KACjD,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAS,CAAC,CAAA;QAClE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC,CACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { Evercam } from "@evercam/sdk";
3
+ export type HttpOptions = {
4
+ port?: number;
5
+ /** Origins allowed for browser requests. Defaults to * — change in production. */
6
+ allowedOrigins?: string | string[];
7
+ /** Tool call timeout in milliseconds. Defaults to 30 000. */
8
+ timeout?: number;
9
+ /**
10
+ * If set, all /tools and /mcp requests must include:
11
+ * Authorization: ApiKey <apiKey>
12
+ */
13
+ apiKey?: string;
14
+ /** If set, only these tool names are callable via the HTTP REST endpoint. */
15
+ allowedTools?: string[];
16
+ /** Tool names blocked from the HTTP REST endpoint. */
17
+ deniedTools?: string[];
18
+ /** Rate limit for POST /tools/:toolName. Defaults to 60 req/min per IP. */
19
+ rateLimit?: {
20
+ maxPerMinute: number;
21
+ };
22
+ };
23
+ export declare function startHttp(server: McpServer, evercam: Evercam | null, portOrOptions?: number | HttpOptions): Promise<void>;
24
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/transports/http.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAInE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAK3C,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAClC,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,2EAA2E;IAC3E,SAAS,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;CACrC,CAAA;AA6HD,wBAAsB,SAAS,CAC7B,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,OAAO,GAAG,IAAI,EACvB,aAAa,GAAE,MAAM,GAAG,WAAkB,GACzC,OAAO,CAAC,IAAI,CAAC,CAgRf"}
@@ -0,0 +1,373 @@
1
+ import express from "express";
2
+ import cors from "cors";
3
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
4
+ import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
5
+ import { randomUUID } from "node:crypto";
6
+ import { callToolDirect } from "../utils/callTool.js";
7
+ import { log } from "../utils/logger.js";
8
+ import { normalizeError } from "../utils/errors.js";
9
+ // ── Rate limiter ─────────────────────────────────────────────────────────────
10
+ const rateLimitStore = new Map();
11
+ function checkRateLimit(ip, maxPerMinute) {
12
+ const now = Date.now();
13
+ const entry = rateLimitStore.get(ip) ?? { count: 0, windowStart: now };
14
+ if (now - entry.windowStart > 60_000) {
15
+ entry.count = 0;
16
+ entry.windowStart = now;
17
+ }
18
+ entry.count++;
19
+ rateLimitStore.set(ip, entry);
20
+ return entry.count <= maxPerMinute;
21
+ }
22
+ // ── Circuit breaker ───────────────────────────────────────────────────────────
23
+ const CIRCUIT_FAILURE_THRESHOLD = 5;
24
+ const CIRCUIT_OPEN_MS = 30_000;
25
+ const circuitBreakers = new Map();
26
+ function getCircuit(toolName) {
27
+ if (!circuitBreakers.has(toolName)) {
28
+ circuitBreakers.set(toolName, { failures: 0, openUntil: null, halfOpen: false });
29
+ }
30
+ return circuitBreakers.get(toolName);
31
+ }
32
+ function isCircuitOpen(toolName) {
33
+ const cb = getCircuit(toolName);
34
+ if (!cb.openUntil)
35
+ return false;
36
+ if (Date.now() >= cb.openUntil) {
37
+ cb.halfOpen = true;
38
+ cb.openUntil = null;
39
+ return false;
40
+ }
41
+ return true;
42
+ }
43
+ function recordCircuitSuccess(toolName) {
44
+ const cb = getCircuit(toolName);
45
+ cb.failures = 0;
46
+ cb.openUntil = null;
47
+ cb.halfOpen = false;
48
+ }
49
+ function recordCircuitFailure(toolName) {
50
+ const cb = getCircuit(toolName);
51
+ cb.failures++;
52
+ if (cb.failures >= CIRCUIT_FAILURE_THRESHOLD || cb.halfOpen) {
53
+ cb.openUntil = Date.now() + CIRCUIT_OPEN_MS;
54
+ cb.halfOpen = false;
55
+ log("warn", "circuit_open", { tool: toolName, openForMs: CIRCUIT_OPEN_MS });
56
+ }
57
+ }
58
+ const metrics = new Map();
59
+ function recordMetric(toolName, durationMs, isError) {
60
+ const m = metrics.get(toolName) ?? { calls: 0, errors: 0, latencySum: 0 };
61
+ m.calls++;
62
+ m.latencySum += durationMs;
63
+ if (isError)
64
+ m.errors++;
65
+ metrics.set(toolName, m);
66
+ }
67
+ function renderMetrics(activeSessions) {
68
+ const lines = [
69
+ "# HELP tool_calls_total Total tool invocations",
70
+ "# TYPE tool_calls_total counter",
71
+ "# HELP tool_errors_total Total tool error responses",
72
+ "# TYPE tool_errors_total counter",
73
+ "# HELP tool_latency_ms_sum Sum of tool call latencies in milliseconds",
74
+ "# TYPE tool_latency_ms_sum counter",
75
+ "# HELP tool_latency_ms_count Count of observed tool latencies",
76
+ "# TYPE tool_latency_ms_count counter",
77
+ "# HELP mcp_sessions_active Active MCP sessions",
78
+ "# TYPE mcp_sessions_active gauge",
79
+ `mcp_sessions_active ${activeSessions}`,
80
+ ];
81
+ for (const [tool, m] of metrics) {
82
+ lines.push(`tool_calls_total{tool="${tool}"} ${m.calls}`);
83
+ lines.push(`tool_errors_total{tool="${tool}"} ${m.errors}`);
84
+ lines.push(`tool_latency_ms_sum{tool="${tool}"} ${m.latencySum}`);
85
+ lines.push(`tool_latency_ms_count{tool="${tool}"} ${m.calls}`);
86
+ }
87
+ return lines.join("\n") + "\n";
88
+ }
89
+ // ── HTTP status mapping ───────────────────────────────────────────────────────
90
+ function httpStatusFor(err, message) {
91
+ const normalized = normalizeError(err);
92
+ if (typeof normalized.status === "number")
93
+ return normalized.status;
94
+ if (/unauthorized|invalid token/i.test(message))
95
+ return 401;
96
+ if (/forbidden|not allowed|disabled/i.test(message))
97
+ return 403;
98
+ if (/not found/i.test(message))
99
+ return 404;
100
+ if (/rate limit|too many/i.test(message))
101
+ return 429;
102
+ if (err && typeof err === "object" && "response" in err) {
103
+ const status = err.response?.status;
104
+ if (typeof status === "number")
105
+ return status;
106
+ }
107
+ if (err && typeof err === "object" && "issues" in err)
108
+ return 400;
109
+ return 500;
110
+ }
111
+ // ── API key middleware ────────────────────────────────────────────────────────
112
+ function requireApiKey(apiKey) {
113
+ return (req, res, next) => {
114
+ if (req.headers.authorization === `ApiKey ${apiKey}`)
115
+ return next();
116
+ res.status(401).json({ error: "Invalid or missing API key" });
117
+ };
118
+ }
119
+ // ── Main server ───────────────────────────────────────────────────────────────
120
+ export async function startHttp(server, evercam, portOrOptions = 4004) {
121
+ const options = typeof portOrOptions === "number" ? { port: portOrOptions } : portOrOptions;
122
+ const port = options.port ?? 4004;
123
+ const origins = options.allowedOrigins ?? "*";
124
+ const timeoutMs = options.timeout ?? 30_000;
125
+ const maxPerMinute = options.rateLimit?.maxPerMinute ?? 60;
126
+ const app = express();
127
+ app.use(express.json({ limit: "1mb" }));
128
+ // ── In-flight tracking for graceful shutdown ────────────────────────────
129
+ let inFlight = 0;
130
+ app.use((_req, res, next) => {
131
+ inFlight++;
132
+ res.on("finish", () => inFlight--);
133
+ next();
134
+ });
135
+ // ── Request logging middleware ─────────────────────────────────────────
136
+ app.use((req, res, next) => {
137
+ const requestId = randomUUID().slice(0, 8);
138
+ req.__requestId = requestId;
139
+ res.setHeader("X-Request-Id", requestId);
140
+ const start = Date.now();
141
+ res.on("finish", () => {
142
+ log("info", "http_request", {
143
+ requestId,
144
+ method: req.method,
145
+ path: req.path,
146
+ status: res.statusCode,
147
+ durationMs: Date.now() - start,
148
+ });
149
+ });
150
+ next();
151
+ });
152
+ app.use(cors({
153
+ origin: origins,
154
+ methods: ["GET", "POST", "OPTIONS"],
155
+ allowedHeaders: ["Content-Type", "Authorization"],
156
+ }));
157
+ // Apply API key gate if configured
158
+ if (options.apiKey) {
159
+ app.use("/tools", requireApiKey(options.apiKey));
160
+ app.use("/mcp", requireApiKey(options.apiKey));
161
+ }
162
+ const transports = new Map();
163
+ const sessionLastSeen = new Map();
164
+ const SESSION_IDLE_TTL_MS = 15 * 60_000;
165
+ const sessionGcTimer = setInterval(() => {
166
+ const now = Date.now();
167
+ for (const [sid, ts] of sessionLastSeen) {
168
+ if (now - ts > SESSION_IDLE_TTL_MS) {
169
+ transports.delete(sid);
170
+ sessionLastSeen.delete(sid);
171
+ log("warn", "mcp_session_evicted_idle", { sessionId: sid, idleMs: now - ts });
172
+ }
173
+ }
174
+ }, 60_000);
175
+ sessionGcTimer.unref();
176
+ // ── Health / readiness ─────────────────────────────────────────────────
177
+ app.get("/health", async (req, res) => {
178
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
179
+ const toolCount = Object.keys(server._registeredTools ?? {}).length;
180
+ if (req.query.ready === "1" && evercam) {
181
+ try {
182
+ await evercam.api.projects.index();
183
+ res.json({ status: "ready", tools: toolCount });
184
+ }
185
+ catch (err) {
186
+ const msg = normalizeError(err).message;
187
+ res.status(503).json({ status: "degraded", error: msg, tools: toolCount });
188
+ }
189
+ }
190
+ else {
191
+ res.json({ status: "ok", tools: toolCount });
192
+ }
193
+ });
194
+ // ── Metrics ────────────────────────────────────────────────────────────
195
+ app.get("/metrics", (_req, res) => {
196
+ res.setHeader("Content-Type", "text/plain; version=0.0.4; charset=utf-8");
197
+ res.send(renderMetrics(transports.size));
198
+ });
199
+ // ── Authenticated snapshot proxy ───────────────────────────────────────
200
+ app.get("/snapshot/:cameraExid", async (req, res) => {
201
+ if (!evercam) {
202
+ res.status(503).json({ error: "Evercam not configured" });
203
+ return;
204
+ }
205
+ const { cameraExid } = req.params;
206
+ try {
207
+ const camera = await evercam.getCamera(cameraExid);
208
+ const url = camera.getSnapshotUrl({ timestamp: new Date() });
209
+ const axiosInstance = evercam.axios ?? evercam.api?.axios;
210
+ const response = await axiosInstance.get(url, { responseType: "stream" });
211
+ res.setHeader("Content-Type", response.headers["content-type"] ?? "image/jpeg");
212
+ res.setHeader("Cache-Control", "public, max-age=10");
213
+ response.data.pipe(res);
214
+ }
215
+ catch {
216
+ if (!res.headersSent)
217
+ res.status(404).end();
218
+ }
219
+ });
220
+ // ── REST tool endpoint ─────────────────────────────────────────────────
221
+ app.post("/tools/:toolName", async (req, res) => {
222
+ const requestId = req.__requestId;
223
+ const { toolName } = req.params;
224
+ const ip = req.ip ?? "unknown";
225
+ // Rate limit
226
+ if (!checkRateLimit(ip, maxPerMinute)) {
227
+ res.status(429).setHeader("Retry-After", "60").json({ error: "Rate limit exceeded" });
228
+ return;
229
+ }
230
+ // Tool allowlist / denylist
231
+ if (options.allowedTools?.length && !options.allowedTools.includes(toolName)) {
232
+ res.status(403).json({ error: `Tool '${toolName}' not allowed in HTTP mode` });
233
+ return;
234
+ }
235
+ if (options.deniedTools?.includes(toolName)) {
236
+ res.status(403).json({ error: `Tool '${toolName}' is disabled in HTTP mode` });
237
+ return;
238
+ }
239
+ // Circuit breaker check
240
+ if (isCircuitOpen(toolName)) {
241
+ res
242
+ .status(503)
243
+ .json({ error: `Circuit open for tool '${toolName}' — upstream failing, retry in 30s` });
244
+ return;
245
+ }
246
+ const start = Date.now();
247
+ try {
248
+ const result = await Promise.race([
249
+ callToolDirect(server, toolName, req.body ?? {}),
250
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Tool call timed out after ${timeoutMs}ms`)), timeoutMs)),
251
+ ]);
252
+ const durationMs = Date.now() - start;
253
+ const isError = !!result?.isError;
254
+ recordCircuitSuccess(toolName);
255
+ recordMetric(toolName, durationMs, isError);
256
+ log("info", "tool_call", {
257
+ requestId,
258
+ tool: toolName,
259
+ durationMs,
260
+ status: isError ? "error" : "success",
261
+ });
262
+ res.json(result);
263
+ }
264
+ catch (err) {
265
+ const durationMs = Date.now() - start;
266
+ const message = normalizeError(err).message;
267
+ recordCircuitFailure(toolName);
268
+ recordMetric(toolName, durationMs, true);
269
+ log("error", "tool_call_failed", { requestId, tool: toolName, durationMs, error: message });
270
+ res.status(httpStatusFor(err, message)).json({ error: message });
271
+ }
272
+ });
273
+ // Expose registered tool metadata so clients can render dynamic tool pickers.
274
+ app.get("/tools", (_req, res) => {
275
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
276
+ const tools = server._registeredTools;
277
+ if (!tools) {
278
+ res.json([]);
279
+ return;
280
+ }
281
+ const list = Object.entries(tools).map(([name, tool]) => ({
282
+ name,
283
+ description: tool.description ?? "",
284
+ inputSchema: tool.inputSchema ?? {},
285
+ enabled: tool.enabled !== false,
286
+ }));
287
+ res.json(list);
288
+ });
289
+ // ── MCP Streamable HTTP transport ─────────────────────────────────────
290
+ app.all("/mcp", async (req, res) => {
291
+ const sessionId = req.headers["mcp-session-id"];
292
+ let transport;
293
+ if (sessionId) {
294
+ transport = transports.get(sessionId);
295
+ if (!transport) {
296
+ res.status(404).json({ error: "Session not found" });
297
+ return;
298
+ }
299
+ sessionLastSeen.set(sessionId, Date.now());
300
+ }
301
+ else if (req.method === "POST" && isInitializeRequest(req.body)) {
302
+ transport = new StreamableHTTPServerTransport({
303
+ sessionIdGenerator: () => randomUUID(),
304
+ onsessioninitialized: (sid) => {
305
+ transports.set(sid, transport);
306
+ sessionLastSeen.set(sid, Date.now());
307
+ },
308
+ });
309
+ transport.onclose = () => {
310
+ const sid = transport?.sessionId;
311
+ if (sid) {
312
+ transports.delete(sid);
313
+ sessionLastSeen.delete(sid);
314
+ }
315
+ };
316
+ await server.connect(transport);
317
+ }
318
+ else {
319
+ res.status(400).json({
320
+ jsonrpc: "2.0",
321
+ error: { code: -32000, message: "Bad Request: No valid session ID provided" },
322
+ id: null,
323
+ });
324
+ return;
325
+ }
326
+ try {
327
+ await transport.handleRequest(req, res, req.body);
328
+ }
329
+ catch (err) {
330
+ const message = normalizeError(err).message;
331
+ log("error", "mcp_transport_error", { error: message });
332
+ if (!res.headersSent) {
333
+ res.status(500).json({ jsonrpc: "2.0", error: { code: -32603, message }, id: null });
334
+ }
335
+ }
336
+ });
337
+ const httpServer = app.listen(port, () => {
338
+ log("info", "server_started", { port });
339
+ console.log(`\nEvercam MCP server listening on http://localhost:${port}`);
340
+ console.log(` Health: GET http://localhost:${port}/health`);
341
+ console.log(` Readiness: GET http://localhost:${port}/health?ready=1`);
342
+ console.log(` Metrics: GET http://localhost:${port}/metrics`);
343
+ console.log(` Tools list: GET http://localhost:${port}/tools`);
344
+ console.log(` Call a tool: POST http://localhost:${port}/tools/:toolName`);
345
+ console.log(` MCP endpoint: ALL http://localhost:${port}/mcp\n`);
346
+ });
347
+ // ── Graceful shutdown ──────────────────────────────────────────────────
348
+ const shutdown = () => {
349
+ log("info", "shutdown_initiated");
350
+ console.log("\n[evercam-mcp] Shutting down...");
351
+ httpServer.close();
352
+ const deadline = Date.now() + 5_000;
353
+ const poll = () => {
354
+ if (inFlight === 0 || Date.now() >= deadline) {
355
+ log("info", "shutdown_complete", { inFlight });
356
+ clearInterval(sessionGcTimer);
357
+ process.exit(0);
358
+ }
359
+ else {
360
+ setTimeout(poll, 100);
361
+ }
362
+ };
363
+ poll();
364
+ };
365
+ process.on("SIGTERM", shutdown);
366
+ process.on("SIGINT", shutdown);
367
+ // Last-resort guard — individual tool errors are caught per-request above.
368
+ process.on("unhandledRejection", (reason) => {
369
+ const message = normalizeError(reason).message;
370
+ log("error", "unhandled_rejection", { error: message });
371
+ });
372
+ }
373
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/transports/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function startStdio(server: McpServer): Promise<void>;
3
+ //# sourceMappingURL=stdio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../../src/transports/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGnE,wBAAsB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjE"}
@@ -0,0 +1,6 @@
1
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
2
+ export async function startStdio(server) {
3
+ const transport = new StdioServerTransport();
4
+ await server.connect(transport);
5
+ }
6
+ //# sourceMappingURL=stdio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../../src/transports/stdio.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAEhF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAiB;IAChD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAA;IAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;AACjC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * Call an MCP tool handler directly without going through a transport.
4
+ * Used by the HTTP REST endpoint (POST /tools/:toolName).
5
+ *
6
+ * This function accesses private fields on McpServer (_registeredTools,
7
+ * validateToolInput, executeToolHandler). These are undocumented internals.
8
+ * Call validateCallToolInternals() at server startup to catch SDK version
9
+ * breakage early rather than at runtime.
10
+ */
11
+ export declare function callToolDirect(server: McpServer, toolName: string, args: unknown): Promise<unknown>;
12
+ /**
13
+ * Verify that the private MCP SDK fields this module depends on still exist.
14
+ * Call once after McpServer is created and tools are registered.
15
+ * Throws with a clear message if the SDK has changed its internals.
16
+ */
17
+ export declare function validateCallToolInternals(server: McpServer): void;
18
+ //# sourceMappingURL=callTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callTool.d.ts","sourceRoot":"","sources":["../../../src/utils/callTool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAIxE;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,OAAO,CAAC,CAsBlB;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAajE"}