@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,58 @@
1
+ import chalk from "chalk";
2
+ import { createEvercamMcpServer } from "../server.js";
3
+ import { resolveConfig } from "../config/env.js";
4
+ import { startStdio } from "../transports/stdio.js";
5
+ import { startHttp } from "../transports/http.js";
6
+ import { disableMutationTools } from "../tools/mutations.js";
7
+ export async function serve(options) {
8
+ const transport = options.transport ?? "stdio";
9
+ const port = options.port ?? 4004;
10
+ const profile = options.profile;
11
+ const origins = options.allowedOrigins;
12
+ const timeout = options.timeout;
13
+ const apiKey = options.apiKey;
14
+ const allowedTools = options.allowedTools
15
+ ? options.allowedTools
16
+ .split(",")
17
+ .map((v) => v.trim())
18
+ .filter(Boolean)
19
+ : undefined;
20
+ const deniedTools = options.deniedTools
21
+ ? options.deniedTools
22
+ .split(",")
23
+ .map((v) => v.trim())
24
+ .filter(Boolean)
25
+ : undefined;
26
+ const rateLimit = options.rateLimit;
27
+ const enableMutations = options.enableMutations ?? false;
28
+ const config = resolveConfig(profile);
29
+ if (!config.credentials?.token) {
30
+ console.error(chalk.red("✗ Not authenticated. Run: evercam-mcp auth login"));
31
+ process.exit(1);
32
+ }
33
+ const { server, evercam } = await createEvercamMcpServer(config);
34
+ if (!enableMutations) {
35
+ const disabled = disableMutationTools(server);
36
+ if (disabled.length > 0) {
37
+ console.warn(chalk.yellow(`⚠ Mutating tools disabled by default (${disabled.length}). Use --enable-mutations to allow writes/deletes.`));
38
+ }
39
+ }
40
+ if (transport === "http") {
41
+ if (!origins || origins === "*") {
42
+ console.warn(chalk.yellow("⚠ CORS: allowing all origins (*). Use --allowed-origins in production."));
43
+ }
44
+ await startHttp(server, evercam, {
45
+ port,
46
+ allowedOrigins: origins ?? "*",
47
+ timeout,
48
+ apiKey,
49
+ allowedTools,
50
+ deniedTools,
51
+ rateLimit: rateLimit ? { maxPerMinute: rateLimit } : undefined,
52
+ });
53
+ }
54
+ else {
55
+ await startStdio(server);
56
+ }
57
+ }
58
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/cli/serve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const TOOL_DESCRIPTIONS: Record<string, string>;
2
+ export declare function toolsList(): void;
3
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/cli/tools.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAwEpD,CAAA;AAmED,wBAAgB,SAAS,IAAI,IAAI,CAahC"}
@@ -0,0 +1,151 @@
1
+ import chalk from "chalk";
2
+ export const TOOL_DESCRIPTIONS = {
3
+ // Cameras
4
+ "list-cameras": "List all accessible cameras",
5
+ "get-camera": "Get camera details by exid",
6
+ "update-camera": "Update camera properties",
7
+ // Snapshots
8
+ "get-live-snapshot-url": "Get live snapshot URL for a camera",
9
+ "get-snapshot-image": "Get snapshot image content (base64) or URL",
10
+ "get-snapshot-at": "Get recorded snapshot nearest to a timestamp",
11
+ "get-latest-snapshot": "Get most recent snapshot for a camera",
12
+ "get-oldest-snapshot": "Get oldest snapshot for a camera",
13
+ "list-available-days": "List days with recordings in a month",
14
+ "list-available-hours": "List hours with recordings on a specific day",
15
+ // Projects
16
+ "list-projects": "List all accessible projects",
17
+ "create-project": "Create a new project",
18
+ "list-project-cameras": "List cameras in a project",
19
+ "list-project-users": "List users in a project",
20
+ "list-project-members": "List members with roles in a project",
21
+ "invite-project-members": "Invite members to a project",
22
+ "remove-project-members": "Remove members from a project",
23
+ "update-project-members-role": "Update member roles in a project",
24
+ // Media
25
+ "list-timelapses": "List timelapses for a camera",
26
+ "create-timelapse": "Create a timelapse for a project",
27
+ "list-media-hub": "List clips in the media hub",
28
+ // BIM
29
+ "list-bim-layers": "List BIM layers for a camera",
30
+ "get-bim-snapshot": "Get BIM snapshot at a timestamp",
31
+ "get-bim-model": "Get BIM model info for a camera",
32
+ // Copilot
33
+ "list-copilot-conversations": "List AI Copilot conversations",
34
+ "create-copilot-conversation": "Create a Copilot conversation",
35
+ "get-copilot-conversation": "Get a Copilot conversation by ID",
36
+ "list-copilot-messages": "List messages in a conversation",
37
+ "send-copilot-message": "Send a message to a conversation",
38
+ "submit-copilot-feedback": "Submit feedback on a Copilot message",
39
+ // Detections
40
+ "get-presence-intervals": "Get presence detection intervals for a camera",
41
+ "get-luminance-readings": "Get light level readings for a camera",
42
+ "get-site-analytics-processing-status": "Get site analytics processing status",
43
+ "get-heatmap-intersections": "Get heatmap intersection data for a camera",
44
+ // ANPR / Gate Report
45
+ "list-anpr-events": "List ANPR license plate events",
46
+ "get-gate-report-events": "Get gate report events for a project",
47
+ "list-verified-days": "List verified gate report days",
48
+ "list-rois": "List ROI configurations for a project",
49
+ "create-roi": "Create a ROI configuration",
50
+ "update-roi": "Update a ROI configuration",
51
+ "delete-roi": "Delete a ROI configuration",
52
+ // Site Analytics
53
+ "smart-search": "Semantic/visual search over footage",
54
+ "list-smart-search-queries": "List saved smart search queries",
55
+ "get-detections-heatmap": "Get detection heatmap data for a camera",
56
+ "get-gate-report-counts": "Get event count statistics for gate report",
57
+ // PTZ
58
+ "list-ptz-presets": "List PTZ presets for a camera",
59
+ "go-to-ptz-preset": "Move a PTZ camera to a saved preset",
60
+ "move-camera-ptz": "Move or stop a PTZ camera",
61
+ // Notifications
62
+ "list-notifications": "List the current user's notifications",
63
+ "mark-notifications-read": "Mark one or all notifications as read",
64
+ // Weather
65
+ "get-project-weather": "Get current weather at a project site",
66
+ // Progress Photos
67
+ "list-progress-photos": "List progress photos for a project",
68
+ "get-progress-photo": "Get a specific progress photo by ID",
69
+ "create-progress-photo": "Create a progress photo entry",
70
+ "update-progress-photo": "Update a progress photo entry",
71
+ "delete-progress-photo": "Delete a progress photo entry",
72
+ // Shares
73
+ "delete-share-request": "Delete a share request",
74
+ };
75
+ const GROUPS = {
76
+ Cameras: ["list-cameras", "get-camera", "update-camera"],
77
+ Snapshots: [
78
+ "get-live-snapshot-url",
79
+ "get-snapshot-image",
80
+ "get-snapshot-at",
81
+ "get-latest-snapshot",
82
+ "get-oldest-snapshot",
83
+ "list-available-days",
84
+ "list-available-hours",
85
+ ],
86
+ Projects: [
87
+ "list-projects",
88
+ "create-project",
89
+ "list-project-cameras",
90
+ "list-project-users",
91
+ "list-project-members",
92
+ "invite-project-members",
93
+ "remove-project-members",
94
+ "update-project-members-role",
95
+ ],
96
+ Media: ["list-timelapses", "create-timelapse", "list-media-hub"],
97
+ BIM: ["list-bim-layers", "get-bim-snapshot", "get-bim-model"],
98
+ Copilot: [
99
+ "list-copilot-conversations",
100
+ "create-copilot-conversation",
101
+ "get-copilot-conversation",
102
+ "list-copilot-messages",
103
+ "send-copilot-message",
104
+ "submit-copilot-feedback",
105
+ ],
106
+ Detections: [
107
+ "get-presence-intervals",
108
+ "get-luminance-readings",
109
+ "get-site-analytics-processing-status",
110
+ "get-heatmap-intersections",
111
+ ],
112
+ "ANPR / Gate Report": [
113
+ "list-anpr-events",
114
+ "get-gate-report-events",
115
+ "list-verified-days",
116
+ "list-rois",
117
+ "create-roi",
118
+ "update-roi",
119
+ "delete-roi",
120
+ ],
121
+ "Site Analytics": [
122
+ "smart-search",
123
+ "list-smart-search-queries",
124
+ "get-detections-heatmap",
125
+ "get-gate-report-counts",
126
+ ],
127
+ PTZ: ["list-ptz-presets", "go-to-ptz-preset", "move-camera-ptz"],
128
+ Notifications: ["list-notifications", "mark-notifications-read"],
129
+ Weather: ["get-project-weather"],
130
+ "Progress Photos": [
131
+ "list-progress-photos",
132
+ "get-progress-photo",
133
+ "create-progress-photo",
134
+ "update-progress-photo",
135
+ "delete-progress-photo",
136
+ ],
137
+ Shares: ["delete-share-request"],
138
+ };
139
+ export function toolsList() {
140
+ const maxLen = Math.max(...Object.keys(TOOL_DESCRIPTIONS).map((k) => k.length));
141
+ console.log(chalk.bold(`\nEvercam MCP Tools (${Object.keys(TOOL_DESCRIPTIONS).length})\n`));
142
+ for (const [group, tools] of Object.entries(GROUPS)) {
143
+ console.log(chalk.cyan(` ${group}`));
144
+ for (const tool of tools) {
145
+ const desc = TOOL_DESCRIPTIONS[tool] ?? "";
146
+ console.log(` ${chalk.bold(tool.padEnd(maxLen + 2))} ${chalk.dim(desc)}`);
147
+ }
148
+ console.log();
149
+ }
150
+ }
151
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/cli/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD,UAAU;IACV,cAAc,EAAE,6BAA6B;IAC7C,YAAY,EAAE,4BAA4B;IAC1C,eAAe,EAAE,0BAA0B;IAC3C,YAAY;IACZ,uBAAuB,EAAE,oCAAoC;IAC7D,oBAAoB,EAAE,4CAA4C;IAClE,iBAAiB,EAAE,8CAA8C;IACjE,qBAAqB,EAAE,uCAAuC;IAC9D,qBAAqB,EAAE,kCAAkC;IACzD,qBAAqB,EAAE,sCAAsC;IAC7D,sBAAsB,EAAE,8CAA8C;IACtE,WAAW;IACX,eAAe,EAAE,8BAA8B;IAC/C,gBAAgB,EAAE,sBAAsB;IACxC,sBAAsB,EAAE,2BAA2B;IACnD,oBAAoB,EAAE,yBAAyB;IAC/C,sBAAsB,EAAE,sCAAsC;IAC9D,wBAAwB,EAAE,6BAA6B;IACvD,wBAAwB,EAAE,+BAA+B;IACzD,6BAA6B,EAAE,kCAAkC;IACjE,QAAQ;IACR,iBAAiB,EAAE,8BAA8B;IACjD,kBAAkB,EAAE,kCAAkC;IACtD,gBAAgB,EAAE,6BAA6B;IAC/C,MAAM;IACN,iBAAiB,EAAE,8BAA8B;IACjD,kBAAkB,EAAE,iCAAiC;IACrD,eAAe,EAAE,iCAAiC;IAClD,UAAU;IACV,4BAA4B,EAAE,+BAA+B;IAC7D,6BAA6B,EAAE,+BAA+B;IAC9D,0BAA0B,EAAE,kCAAkC;IAC9D,uBAAuB,EAAE,iCAAiC;IAC1D,sBAAsB,EAAE,kCAAkC;IAC1D,yBAAyB,EAAE,sCAAsC;IACjE,aAAa;IACb,wBAAwB,EAAE,+CAA+C;IACzE,wBAAwB,EAAE,uCAAuC;IACjE,sCAAsC,EAAE,sCAAsC;IAC9E,2BAA2B,EAAE,4CAA4C;IACzE,qBAAqB;IACrB,kBAAkB,EAAE,gCAAgC;IACpD,wBAAwB,EAAE,sCAAsC;IAChE,oBAAoB,EAAE,gCAAgC;IACtD,WAAW,EAAE,uCAAuC;IACpD,YAAY,EAAE,4BAA4B;IAC1C,YAAY,EAAE,4BAA4B;IAC1C,YAAY,EAAE,4BAA4B;IAC1C,iBAAiB;IACjB,cAAc,EAAE,qCAAqC;IACrD,2BAA2B,EAAE,iCAAiC;IAC9D,wBAAwB,EAAE,yCAAyC;IACnE,wBAAwB,EAAE,4CAA4C;IACtE,MAAM;IACN,kBAAkB,EAAE,+BAA+B;IACnD,kBAAkB,EAAE,qCAAqC;IACzD,iBAAiB,EAAE,2BAA2B;IAC9C,gBAAgB;IAChB,oBAAoB,EAAE,uCAAuC;IAC7D,yBAAyB,EAAE,uCAAuC;IAClE,UAAU;IACV,qBAAqB,EAAE,uCAAuC;IAC9D,kBAAkB;IAClB,sBAAsB,EAAE,oCAAoC;IAC5D,oBAAoB,EAAE,qCAAqC;IAC3D,uBAAuB,EAAE,+BAA+B;IACxD,uBAAuB,EAAE,+BAA+B;IACxD,uBAAuB,EAAE,+BAA+B;IACxD,SAAS;IACT,sBAAsB,EAAE,wBAAwB;CACjD,CAAA;AAED,MAAM,MAAM,GAA6B;IACvC,OAAO,EAAE,CAAC,cAAc,EAAE,YAAY,EAAE,eAAe,CAAC;IACxD,SAAS,EAAE;QACT,uBAAuB;QACvB,oBAAoB;QACpB,iBAAiB;QACjB,qBAAqB;QACrB,qBAAqB;QACrB,qBAAqB;QACrB,sBAAsB;KACvB;IACD,QAAQ,EAAE;QACR,eAAe;QACf,gBAAgB;QAChB,sBAAsB;QACtB,oBAAoB;QACpB,sBAAsB;QACtB,wBAAwB;QACxB,wBAAwB;QACxB,6BAA6B;KAC9B;IACD,KAAK,EAAE,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,CAAC;IAChE,GAAG,EAAE,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,CAAC;IAC7D,OAAO,EAAE;QACP,4BAA4B;QAC5B,6BAA6B;QAC7B,0BAA0B;QAC1B,uBAAuB;QACvB,sBAAsB;QACtB,yBAAyB;KAC1B;IACD,UAAU,EAAE;QACV,wBAAwB;QACxB,wBAAwB;QACxB,sCAAsC;QACtC,2BAA2B;KAC5B;IACD,oBAAoB,EAAE;QACpB,kBAAkB;QAClB,wBAAwB;QACxB,oBAAoB;QACpB,WAAW;QACX,YAAY;QACZ,YAAY;QACZ,YAAY;KACb;IACD,gBAAgB,EAAE;QAChB,cAAc;QACd,2BAA2B;QAC3B,wBAAwB;QACxB,wBAAwB;KACzB;IACD,GAAG,EAAE,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,iBAAiB,CAAC;IAChE,aAAa,EAAE,CAAC,oBAAoB,EAAE,yBAAyB,CAAC;IAChE,OAAO,EAAE,CAAC,qBAAqB,CAAC;IAChC,iBAAiB,EAAE;QACjB,sBAAsB;QACtB,oBAAoB;QACpB,uBAAuB;QACvB,uBAAuB;QACvB,uBAAuB;KACxB;IACD,MAAM,EAAE,CAAC,sBAAsB,CAAC;CACjC,CAAA;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;IAE/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAA;IAE3F,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAA;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;YAC1C,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC9E,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAA;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { EvercamConfig } from "@evercam/sdk";
2
+ export declare function resolveConfig(profileName?: string): EvercamConfig;
3
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../src/config/env.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAIjD,wBAAgB,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,aAAa,CAejE"}
@@ -0,0 +1,17 @@
1
+ import { DEFAULT_BASE_URLS } from "@evercam/sdk";
2
+ import { getProfileConfig } from "./profiles.js";
3
+ import { getToken } from "../auth/tokenStore.js";
4
+ export function resolveConfig(profileName) {
5
+ const profile = getProfileConfig(profileName);
6
+ const token = process.env.EVERCAM_TOKEN ?? getToken(profileName);
7
+ return {
8
+ credentials: token ? { token } : undefined,
9
+ baseUrls: {
10
+ baseUrl: process.env.EVERCAM_BASE_URL ?? profile.baseUrl ?? DEFAULT_BASE_URLS.baseUrl,
11
+ aiApiUrl: process.env.EVERCAM_AI_URL ?? profile.aiApiUrl ?? DEFAULT_BASE_URLS.aiApiUrl,
12
+ evercamLabsUrl: process.env.EVERCAM_LABS_URL ?? profile.evercamLabsUrl ?? DEFAULT_BASE_URLS.evercamLabsUrl,
13
+ ingestApiUrl: process.env.EVERCAM_INGEST_URL ?? profile.ingestApiUrl ?? DEFAULT_BASE_URLS.ingestApiUrl,
14
+ },
15
+ };
16
+ }
17
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/config/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAEhD,MAAM,UAAU,aAAa,CAAC,WAAoB;IAChD,MAAM,OAAO,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAA;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,QAAQ,CAAC,WAAW,CAAC,CAAA;IAEhE,OAAO;QACL,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS;QAC1C,QAAQ,EAAE;YACR,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,OAAO,IAAI,iBAAiB,CAAC,OAAO;YACrF,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,QAAQ,IAAI,iBAAiB,CAAC,QAAQ;YACtF,cAAc,EACZ,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,cAAc,IAAI,iBAAiB,CAAC,cAAc;YAC5F,YAAY,EACV,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,YAAY,IAAI,iBAAiB,CAAC,YAAY;SAC3F;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ export type ProfileConfig = {
2
+ baseUrl?: string;
3
+ aiApiUrl?: string;
4
+ evercamLabsUrl?: string;
5
+ ingestApiUrl?: string;
6
+ };
7
+ export declare function listProfiles(): {
8
+ name: string;
9
+ active: boolean;
10
+ config: ProfileConfig;
11
+ }[];
12
+ export declare function getActiveProfile(): string;
13
+ export declare function getProfileConfig(name?: string): ProfileConfig;
14
+ export declare function addProfile(name: string, profileConfig: ProfileConfig): void;
15
+ export declare function switchProfile(name: string): void;
16
+ export declare function deleteProfile(name: string): void;
17
+ //# sourceMappingURL=profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../../src/config/profiles.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAmBD,wBAAgB,YAAY,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,EAAE,CAOzF;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,CAI7D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,GAAG,IAAI,CAI3E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAOhD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAUhD"}
@@ -0,0 +1,56 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ const CONFIG_DIR = path.join(os.homedir(), ".evercam");
5
+ const CONFIG_FILE = path.join(CONFIG_DIR, "config.json");
6
+ function readConfig() {
7
+ if (!fs.existsSync(CONFIG_FILE)) {
8
+ return { activeProfile: "default", profiles: { default: {} } };
9
+ }
10
+ return JSON.parse(fs.readFileSync(CONFIG_FILE, "utf-8"));
11
+ }
12
+ function writeConfig(config) {
13
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
14
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
15
+ }
16
+ export function listProfiles() {
17
+ const config = readConfig();
18
+ return Object.entries(config.profiles).map(([name, profileConfig]) => ({
19
+ name,
20
+ active: name === config.activeProfile,
21
+ config: profileConfig,
22
+ }));
23
+ }
24
+ export function getActiveProfile() {
25
+ return readConfig().activeProfile;
26
+ }
27
+ export function getProfileConfig(name) {
28
+ const config = readConfig();
29
+ const profileName = name ?? config.activeProfile;
30
+ return config.profiles[profileName] ?? {};
31
+ }
32
+ export function addProfile(name, profileConfig) {
33
+ const config = readConfig();
34
+ config.profiles[name] = profileConfig;
35
+ writeConfig(config);
36
+ }
37
+ export function switchProfile(name) {
38
+ const config = readConfig();
39
+ if (!config.profiles[name]) {
40
+ throw new Error(`Profile "${name}" does not exist`);
41
+ }
42
+ config.activeProfile = name;
43
+ writeConfig(config);
44
+ }
45
+ export function deleteProfile(name) {
46
+ const config = readConfig();
47
+ if (!config.profiles[name]) {
48
+ throw new Error(`Profile "${name}" does not exist`);
49
+ }
50
+ if (config.activeProfile === name) {
51
+ throw new Error(`Cannot delete the active profile. Switch to another profile first.`);
52
+ }
53
+ delete config.profiles[name];
54
+ writeConfig(config);
55
+ }
56
+ //# sourceMappingURL=profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../../src/config/profiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAA;AACtD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;AAcxD,SAAS,UAAU;IACjB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAA;IAChE,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAe,CAAA;AACxE,CAAC;AAED,SAAS,WAAW,CAAC,MAAkB;IACrC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAChE,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,IAAI;QACJ,MAAM,EAAE,IAAI,KAAK,MAAM,CAAC,aAAa;QACrC,MAAM,EAAE,aAAa;KACtB,CAAC,CAAC,CAAA;AACL,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,UAAU,EAAE,CAAC,aAAa,CAAA;AACnC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC5C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,WAAW,GAAG,IAAI,IAAI,MAAM,CAAC,aAAa,CAAA;IAChD,OAAO,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,CAAA;AAC3C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,aAA4B;IACnE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,aAAa,CAAA;IACrC,WAAW,CAAC,MAAM,CAAC,CAAA;AACrB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,kBAAkB,CAAC,CAAA;IACrD,CAAC;IACD,MAAM,CAAC,aAAa,GAAG,IAAI,CAAA;IAC3B,WAAW,CAAC,MAAM,CAAC,CAAA;AACrB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,kBAAkB,CAAC,CAAA;IACrD,CAAC;IACD,IAAI,MAAM,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAA;IACvF,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC5B,WAAW,CAAC,MAAM,CAAC,CAAA;AACrB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { createEvercamMcpServer } from "./server.js";
2
+ export { resolveConfig } from "./config/env.js";
3
+ export { login, logout, getAuthStatus } from "./auth/auth.js";
4
+ export { listProfiles, addProfile, switchProfile, getActiveProfile } from "./config/profiles.js";
5
+ export { startStdio } from "./transports/stdio.js";
6
+ export { startHttp } from "./transports/http.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAChG,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,7 @@
1
+ export { createEvercamMcpServer } from "./server.js";
2
+ export { resolveConfig } from "./config/env.js";
3
+ export { login, logout, getAuthStatus } from "./auth/auth.js";
4
+ export { listProfiles, addProfile, switchProfile, getActiveProfile } from "./config/profiles.js";
5
+ export { startStdio } from "./transports/stdio.js";
6
+ export { startHttp } from "./transports/http.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAChG,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { Evercam } from "@evercam/sdk";
3
+ import type { EvercamConfig } from "@evercam/sdk";
4
+ export declare function createEvercamMcpServer(config: EvercamConfig): Promise<{
5
+ server: McpServer;
6
+ evercam: Evercam;
7
+ }>;
8
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAIjD,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAqBlD"}
@@ -0,0 +1,23 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { Evercam } from "@evercam/sdk";
3
+ import { registerAllTools } from "./tools/index.js";
4
+ import { validateCallToolInternals } from "./utils/callTool.js";
5
+ export async function createEvercamMcpServer(config) {
6
+ const evercam = new Evercam(config);
7
+ if (config.credentials?.token) {
8
+ evercam.setToken(config.credentials.token);
9
+ }
10
+ else if (config.credentials?.username && config.credentials?.password) {
11
+ await evercam.connect();
12
+ }
13
+ const server = new McpServer({
14
+ name: "evercam-mcp",
15
+ version: "0.1.0",
16
+ });
17
+ registerAllTools(server, evercam);
18
+ // Verify private SDK internals used by callTool.ts are still present.
19
+ // Throws clearly if @modelcontextprotocol/sdk changes its internal API.
20
+ validateCallToolInternals(server);
21
+ return { server, evercam };
22
+ }
23
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AAE/D,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAqB;IAErB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;IAEnC,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC;QAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IAC5C,CAAC;SAAM,IAAI,MAAM,CAAC,WAAW,EAAE,QAAQ,IAAI,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC;QACxE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;IACzB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAA;IAEF,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAEjC,sEAAsE;IACtE,wEAAwE;IACxE,yBAAyB,CAAC,MAAM,CAAC,CAAA;IAEjC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;AAC5B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { Evercam } from "@evercam/sdk";
3
+ export declare function registerAnprTools(server: McpServer, evercam: Evercam): void;
4
+ //# sourceMappingURL=anpr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anpr.d.ts","sourceRoot":"","sources":["../../../src/tools/anpr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAItC,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAgH3E"}
@@ -0,0 +1,75 @@
1
+ import { z } from "zod";
2
+ import { safeText } from "../utils/toolOutput.js";
3
+ export function registerAnprTools(server, evercam) {
4
+ server.tool("list-anpr-events", "List ANPR (license plate recognition) events for a project", {
5
+ projectExid: z.string().describe("Project exid"),
6
+ fromDate: z.string().optional().describe("Start date ISO 8601"),
7
+ toDate: z.string().optional().describe("End date ISO 8601"),
8
+ cameraExid: z.string().optional().describe("Filter by camera"),
9
+ plate: z.string().optional().describe("Filter by license plate"),
10
+ page: z.number().optional().describe("Page number"),
11
+ limit: z.number().optional().describe("Results per page"),
12
+ }, async ({ projectExid, page, limit, ...filters }) => {
13
+ const safeLimit = Math.min(limit ?? 50, 200);
14
+ const data = await evercam.ai.anpr.getAnprEvents(projectExid, {
15
+ page,
16
+ limit: safeLimit,
17
+ ...filters,
18
+ });
19
+ return safeText(data);
20
+ });
21
+ server.tool("get-gate-report-events", "Get gate report events for a project", {
22
+ projectExid: z.string().describe("Project exid"),
23
+ fromDate: z.string().describe("Start date ISO 8601"),
24
+ toDate: z.string().describe("End date ISO 8601"),
25
+ cameraExid: z.string().optional().describe("Filter by camera"),
26
+ page: z.number().optional().describe("Page number"),
27
+ limit: z.number().optional().describe("Results per page"),
28
+ }, async ({ projectExid, page, limit, ...filters }) => {
29
+ const safeLimit = Math.min(limit ?? 50, 200);
30
+ const data = await evercam.ai.gateReport.getEvents(projectExid, {
31
+ page,
32
+ limit: safeLimit,
33
+ ...filters,
34
+ });
35
+ return safeText(data);
36
+ });
37
+ server.tool("list-verified-days", "List verified days in gate report for a project", {
38
+ projectExid: z.string().describe("Project exid"),
39
+ fromDate: z.string().optional().describe("Start date ISO 8601"),
40
+ toDate: z.string().optional().describe("End date ISO 8601"),
41
+ }, async ({ projectExid, ...params }) => {
42
+ const data = await evercam.ai.gateReport.getVerifiedDays(projectExid, params);
43
+ return safeText(data);
44
+ });
45
+ server.tool("list-rois", "List Region of Interest (ROI) configurations for a project", {
46
+ projectExid: z.string().describe("Project exid"),
47
+ cameraExid: z.string().optional().describe("Filter by camera"),
48
+ }, async ({ projectExid, ...params }) => {
49
+ const data = await evercam.ai.roi.getROIs(projectExid, params);
50
+ return safeText(data);
51
+ });
52
+ server.tool("create-roi", "Create a Region of Interest (ROI)", {
53
+ createdBy: z.string().describe("User identifier/email creating this ROI"),
54
+ payload: z.record(z.any()).describe("ROI payload fields"),
55
+ }, async ({ createdBy, payload }) => {
56
+ const data = await evercam.ai.roi.createROI({ createdBy, ...payload });
57
+ return safeText(data);
58
+ });
59
+ server.tool("update-roi", "Update an existing ROI", {
60
+ id: z.number().describe("ROI id"),
61
+ updatedBy: z.string().describe("User identifier/email updating this ROI"),
62
+ payload: z.record(z.any()).optional().describe("Fields to update"),
63
+ }, async ({ id, updatedBy, payload }) => {
64
+ const data = await evercam.ai.roi.updateROI({ id, updatedBy, ...(payload ?? {}) });
65
+ return safeText(data);
66
+ });
67
+ server.tool("delete-roi", "Delete an ROI by id", {
68
+ id: z.number().describe("ROI id"),
69
+ updatedBy: z.string().describe("User identifier/email performing the delete"),
70
+ }, async ({ id, updatedBy }) => {
71
+ const data = await evercam.ai.roi.deleteROI({ id, updatedBy });
72
+ return safeText(data);
73
+ });
74
+ }
75
+ //# sourceMappingURL=anpr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anpr.js","sourceRoot":"","sources":["../../../src/tools/anpr.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 registerBimTools(server: McpServer, evercam: Evercam): void;
4
+ //# sourceMappingURL=bim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bim.d.ts","sourceRoot":"","sources":["../../../src/tools/bim.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAItC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAqC1E"}
@@ -0,0 +1,24 @@
1
+ import { z } from "zod";
2
+ import { safeText } from "../utils/toolOutput.js";
3
+ export function registerBimTools(server, evercam) {
4
+ server.tool("list-bim-layers", "List BIM layers for a camera", {
5
+ cameraExid: z.string().describe("Camera exid"),
6
+ }, async ({ cameraExid }) => {
7
+ const data = await evercam.api.layers.getLayer(cameraExid, {});
8
+ return safeText(data);
9
+ });
10
+ server.tool("get-bim-snapshot", "Get a BIM snapshot at a specific timestamp for a camera", {
11
+ cameraExid: z.string().describe("Camera exid"),
12
+ timestamp: z.string().describe("ISO 8601 timestamp"),
13
+ }, async ({ cameraExid, timestamp }) => {
14
+ const data = await evercam.api.bim.getBimSnapshot(cameraExid, timestamp, {});
15
+ return safeText(data);
16
+ });
17
+ server.tool("get-bim-model", "Get BIM model info for a camera", {
18
+ cameraExid: z.string().describe("Camera exid"),
19
+ }, async ({ cameraExid }) => {
20
+ const data = await evercam.api.bim.getBimModel(cameraExid, {});
21
+ return safeText(data);
22
+ });
23
+ }
24
+ //# sourceMappingURL=bim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bim.js","sourceRoot":"","sources":["../../../src/tools/bim.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAEjD,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,OAAgB;IAClE,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,8BAA8B,EAC9B;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;KAC/C,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAS,CAAC,CAAA;QACrE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC,CACF,CAAA;IAED,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,yDAAyD,EACzD;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC9C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;KACrD,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE;QAClC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,CAAC,CAAA;QAC5E,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC,CACF,CAAA;IAED,MAAM,CAAC,IAAI,CACT,eAAe,EACf,iCAAiC,EACjC;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;KAC/C,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU,EAAE,EAAS,CAAC,CAAA;QACrE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC,CACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { Evercam } from "@evercam/sdk";
3
+ export declare function registerCameraTools(server: McpServer, evercam: Evercam): void;
4
+ //# sourceMappingURL=cameras.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cameras.d.ts","sourceRoot":"","sources":["../../../src/tools/cameras.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAItC,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CA4C7E"}
@@ -0,0 +1,31 @@
1
+ import { z } from "zod";
2
+ import { safeText } from "../utils/toolOutput.js";
3
+ export function registerCameraTools(server, evercam) {
4
+ server.tool("list-cameras", "List all cameras accessible to the authenticated user, optionally filtered by project", {
5
+ projectExid: z.string().optional().describe("Filter cameras by project exid"),
6
+ page: z.number().optional().describe("Page number"),
7
+ limit: z.number().optional().describe("Results per page (max 200)"),
8
+ }, async ({ projectExid, page, limit }) => {
9
+ const safeLimit = Math.min(limit ?? 100, 200);
10
+ const data = await evercam.api.cameras.getCameras({
11
+ params: { projectExid, page, limit: safeLimit },
12
+ });
13
+ return safeText(data);
14
+ });
15
+ server.tool("get-camera", "Get details for a specific camera by its exid", {
16
+ cameraExid: z.string().describe("Camera exid"),
17
+ }, async ({ cameraExid }) => {
18
+ const data = await evercam.api.cameras.getCameraById(cameraExid);
19
+ return safeText(data);
20
+ });
21
+ server.tool("update-camera", "Update camera properties", {
22
+ cameraExid: z.string().describe("Camera exid"),
23
+ name: z.string().optional().describe("Camera display name"),
24
+ isOnline: z.boolean().optional().describe("Force online/offline status"),
25
+ timezone: z.string().optional().describe("Camera timezone"),
26
+ }, async ({ cameraExid, ...params }) => {
27
+ const data = await evercam.api.cameras.updateCamera(cameraExid, params);
28
+ return safeText(data);
29
+ });
30
+ }
31
+ //# sourceMappingURL=cameras.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cameras.js","sourceRoot":"","sources":["../../../src/tools/cameras.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAEjD,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,OAAgB;IACrE,MAAM,CAAC,IAAI,CACT,cAAc,EACd,uFAAuF,EACvF;QACE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QAC7E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QACnD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;KACpE,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,EAAE,GAAG,CAAC,CAAA;QAC7C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC;YAChD,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAS;SACvD,CAAC,CAAA;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC,CACF,CAAA;IAED,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,+CAA+C,EAC/C;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;KAC/C,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAA;QAChE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC,CACF,CAAA;IAED,MAAM,CAAC,IAAI,CACT,eAAe,EACf,0BAA0B,EAC1B;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC9C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAC3D,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QACxE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;KAC5D,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE;QAClC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,EAAE,MAAa,CAAC,CAAA;QAC9E,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC,CACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { Evercam } from "@evercam/sdk";
3
+ export declare function registerCopilotTools(server: McpServer, evercam: Evercam): void;
4
+ //# sourceMappingURL=copilot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot.d.ts","sourceRoot":"","sources":["../../../src/tools/copilot.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,CAwG9E"}