@butlr/butlr-mcp-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +195 -0
  3. package/dist/cache/occupancy-cache.d.ts +72 -0
  4. package/dist/cache/occupancy-cache.d.ts.map +1 -0
  5. package/dist/cache/occupancy-cache.js +166 -0
  6. package/dist/cache/occupancy-cache.js.map +1 -0
  7. package/dist/cache/topology-cache.d.ts +36 -0
  8. package/dist/cache/topology-cache.d.ts.map +1 -0
  9. package/dist/cache/topology-cache.js +74 -0
  10. package/dist/cache/topology-cache.js.map +1 -0
  11. package/dist/clients/auth-client.d.ts +22 -0
  12. package/dist/clients/auth-client.d.ts.map +1 -0
  13. package/dist/clients/auth-client.js +82 -0
  14. package/dist/clients/auth-client.js.map +1 -0
  15. package/dist/clients/graphql-client.d.ts +6 -0
  16. package/dist/clients/graphql-client.d.ts.map +1 -0
  17. package/dist/clients/graphql-client.js +106 -0
  18. package/dist/clients/graphql-client.js.map +1 -0
  19. package/dist/clients/queries/topology.d.ts +36 -0
  20. package/dist/clients/queries/topology.d.ts.map +1 -0
  21. package/dist/clients/queries/topology.js +252 -0
  22. package/dist/clients/queries/topology.js.map +1 -0
  23. package/dist/clients/reporting-client.d.ts +191 -0
  24. package/dist/clients/reporting-client.d.ts.map +1 -0
  25. package/dist/clients/reporting-client.js +353 -0
  26. package/dist/clients/reporting-client.js.map +1 -0
  27. package/dist/clients/stats-client.d.ts +119 -0
  28. package/dist/clients/stats-client.d.ts.map +1 -0
  29. package/dist/clients/stats-client.js +238 -0
  30. package/dist/clients/stats-client.js.map +1 -0
  31. package/dist/clients/types.d.ts +215 -0
  32. package/dist/clients/types.d.ts.map +1 -0
  33. package/dist/clients/types.js +6 -0
  34. package/dist/clients/types.js.map +1 -0
  35. package/dist/constants.d.ts +3 -0
  36. package/dist/constants.d.ts.map +1 -0
  37. package/dist/constants.js +3 -0
  38. package/dist/constants.js.map +1 -0
  39. package/dist/errors/mcp-errors.d.ts +63 -0
  40. package/dist/errors/mcp-errors.d.ts.map +1 -0
  41. package/dist/errors/mcp-errors.js +144 -0
  42. package/dist/errors/mcp-errors.js.map +1 -0
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +43 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/tools/butlr-available-rooms.d.ts +49 -0
  48. package/dist/tools/butlr-available-rooms.d.ts.map +1 -0
  49. package/dist/tools/butlr-available-rooms.js +492 -0
  50. package/dist/tools/butlr-available-rooms.js.map +1 -0
  51. package/dist/tools/butlr-fetch-entity-details.d.ts +42 -0
  52. package/dist/tools/butlr-fetch-entity-details.d.ts.map +1 -0
  53. package/dist/tools/butlr-fetch-entity-details.js +276 -0
  54. package/dist/tools/butlr-fetch-entity-details.js.map +1 -0
  55. package/dist/tools/butlr-get-asset-details.d.ts +51 -0
  56. package/dist/tools/butlr-get-asset-details.d.ts.map +1 -0
  57. package/dist/tools/butlr-get-asset-details.js +391 -0
  58. package/dist/tools/butlr-get-asset-details.js.map +1 -0
  59. package/dist/tools/butlr-get-current-occupancy.d.ts +21 -0
  60. package/dist/tools/butlr-get-current-occupancy.d.ts.map +1 -0
  61. package/dist/tools/butlr-get-current-occupancy.js +126 -0
  62. package/dist/tools/butlr-get-current-occupancy.js.map +1 -0
  63. package/dist/tools/butlr-get-occupancy-timeseries.d.ts +31 -0
  64. package/dist/tools/butlr-get-occupancy-timeseries.d.ts.map +1 -0
  65. package/dist/tools/butlr-get-occupancy-timeseries.js +145 -0
  66. package/dist/tools/butlr-get-occupancy-timeseries.js.map +1 -0
  67. package/dist/tools/butlr-hardware-snapshot.d.ts +55 -0
  68. package/dist/tools/butlr-hardware-snapshot.d.ts.map +1 -0
  69. package/dist/tools/butlr-hardware-snapshot.js +556 -0
  70. package/dist/tools/butlr-hardware-snapshot.js.map +1 -0
  71. package/dist/tools/butlr-list-topology.d.ts +27 -0
  72. package/dist/tools/butlr-list-topology.d.ts.map +1 -0
  73. package/dist/tools/butlr-list-topology.js +241 -0
  74. package/dist/tools/butlr-list-topology.js.map +1 -0
  75. package/dist/tools/butlr-search-assets.d.ts +53 -0
  76. package/dist/tools/butlr-search-assets.d.ts.map +1 -0
  77. package/dist/tools/butlr-search-assets.js +206 -0
  78. package/dist/tools/butlr-search-assets.js.map +1 -0
  79. package/dist/tools/butlr-space-busyness.d.ts +23 -0
  80. package/dist/tools/butlr-space-busyness.d.ts.map +1 -0
  81. package/dist/tools/butlr-space-busyness.js +304 -0
  82. package/dist/tools/butlr-space-busyness.js.map +1 -0
  83. package/dist/tools/butlr-traffic-flow.d.ts +39 -0
  84. package/dist/tools/butlr-traffic-flow.d.ts.map +1 -0
  85. package/dist/tools/butlr-traffic-flow.js +369 -0
  86. package/dist/tools/butlr-traffic-flow.js.map +1 -0
  87. package/dist/types/responses.d.ts +253 -0
  88. package/dist/types/responses.d.ts.map +1 -0
  89. package/dist/types/responses.js +8 -0
  90. package/dist/types/responses.js.map +1 -0
  91. package/dist/utils/asset-flattener.d.ts +50 -0
  92. package/dist/utils/asset-flattener.d.ts.map +1 -0
  93. package/dist/utils/asset-flattener.js +131 -0
  94. package/dist/utils/asset-flattener.js.map +1 -0
  95. package/dist/utils/asset-helpers.d.ts +8 -0
  96. package/dist/utils/asset-helpers.d.ts.map +1 -0
  97. package/dist/utils/asset-helpers.js +24 -0
  98. package/dist/utils/asset-helpers.js.map +1 -0
  99. package/dist/utils/field-validator.d.ts +29 -0
  100. package/dist/utils/field-validator.d.ts.map +1 -0
  101. package/dist/utils/field-validator.js +197 -0
  102. package/dist/utils/field-validator.js.map +1 -0
  103. package/dist/utils/fuzzy-match.d.ts +29 -0
  104. package/dist/utils/fuzzy-match.d.ts.map +1 -0
  105. package/dist/utils/fuzzy-match.js +70 -0
  106. package/dist/utils/fuzzy-match.js.map +1 -0
  107. package/dist/utils/graphql-helpers.d.ts +29 -0
  108. package/dist/utils/graphql-helpers.d.ts.map +1 -0
  109. package/dist/utils/graphql-helpers.js +43 -0
  110. package/dist/utils/graphql-helpers.js.map +1 -0
  111. package/dist/utils/natural-language.d.ts +73 -0
  112. package/dist/utils/natural-language.d.ts.map +1 -0
  113. package/dist/utils/natural-language.js +172 -0
  114. package/dist/utils/natural-language.js.map +1 -0
  115. package/dist/utils/occupancy-helpers.d.ts +63 -0
  116. package/dist/utils/occupancy-helpers.d.ts.map +1 -0
  117. package/dist/utils/occupancy-helpers.js +203 -0
  118. package/dist/utils/occupancy-helpers.js.map +1 -0
  119. package/dist/utils/path-builder.d.ts +10 -0
  120. package/dist/utils/path-builder.d.ts.map +1 -0
  121. package/dist/utils/path-builder.js +34 -0
  122. package/dist/utils/path-builder.js.map +1 -0
  123. package/dist/utils/time-range-validator.d.ts +13 -0
  124. package/dist/utils/time-range-validator.d.ts.map +1 -0
  125. package/dist/utils/time-range-validator.js +65 -0
  126. package/dist/utils/time-range-validator.js.map +1 -0
  127. package/dist/utils/timezone-helpers.d.ts +49 -0
  128. package/dist/utils/timezone-helpers.d.ts.map +1 -0
  129. package/dist/utils/timezone-helpers.js +209 -0
  130. package/dist/utils/timezone-helpers.js.map +1 -0
  131. package/dist/utils/tree-formatter.d.ts +23 -0
  132. package/dist/utils/tree-formatter.d.ts.map +1 -0
  133. package/dist/utils/tree-formatter.js +258 -0
  134. package/dist/utils/tree-formatter.js.map +1 -0
  135. package/package.json +93 -0
@@ -0,0 +1,145 @@
1
+ import { ReportingRequestBuilder } from "../clients/reporting-client.js";
2
+ import { z } from "zod";
3
+ import { validateTimeRange } from "../utils/time-range-validator.js";
4
+ import { fetchTopologyAndSensors, resolveAssetContext, getPresenceMeasurement, getTrafficMeasurement, getPresenceCoverageNote, getTrafficCoverageNote, buildRecommendation, } from "../utils/occupancy-helpers.js";
5
+ import { rethrowIfGraphQLError } from "../utils/graphql-helpers.js";
6
+ const GET_OCCUPANCY_TIMESERIES_DESCRIPTION = "Get occupancy timeseries data for floors, rooms, or zones. Automatically queries both traffic and presence measurements, " +
7
+ "analyzes which are available based on sensor configuration, and returns structured data with timezone context. " +
8
+ "Single tool call provides complete occupancy picture without guessing measurement types.";
9
+ /** Shared shape — used by both registerTool (SDK schema) and full validation */
10
+ const getOccupancyTimeseriesInputShape = {
11
+ asset_ids: z.array(z.string()).min(1).max(50).describe("Floor, room, or zone IDs"),
12
+ interval: z
13
+ .enum(["1m", "1h", "1d"])
14
+ .describe("Aggregation interval (1m=max 1hr range, 1h=max 48hrs, 1d=max 60 days)"),
15
+ start: z.string().describe("ISO-8601 timestamp or relative time (e.g., '-24h')"),
16
+ stop: z.string().describe("ISO-8601 timestamp or relative time (e.g., 'now')"),
17
+ };
18
+ export const GetOccupancyTimeseriesArgsSchema = z.object(getOccupancyTimeseriesInputShape).strict();
19
+ /**
20
+ * Query a single measurement type and map to TimeseriesPoint[].
21
+ * Returns the array on success, or undefined on failure (with warning set on data).
22
+ */
23
+ async function queryTimeseries(assetType, assetId, measurement, start, stop, interval) {
24
+ const response = await new ReportingRequestBuilder()
25
+ .assets(assetType, [assetId])
26
+ .measurements([measurement])
27
+ .timeRange(start, stop)
28
+ .window(interval, "median")
29
+ .execute();
30
+ if (response.data && Array.isArray(response.data)) {
31
+ return response.data.map((d) => ({
32
+ timestamp: new Date(d.time).toISOString(),
33
+ value: d.value,
34
+ }));
35
+ }
36
+ return [];
37
+ }
38
+ /**
39
+ * Execute unified occupancy timeseries tool
40
+ */
41
+ export async function executeGetOccupancyTimeseries(args) {
42
+ // Validate time range — let errors throw naturally
43
+ validateTimeRange(args.interval, args.start, args.stop);
44
+ if (process.env.DEBUG) {
45
+ console.error(`[butlr-get-occupancy-timeseries] Querying ${args.asset_ids.length} assets`);
46
+ }
47
+ // Fetch topology and sensors in parallel
48
+ const ctx = await fetchTopologyAndSensors();
49
+ // Process each asset
50
+ const assets = [];
51
+ for (const assetId of args.asset_ids) {
52
+ const asset = resolveAssetContext(assetId, ctx);
53
+ // Build presence measurement data
54
+ const presenceData = {
55
+ available: asset.presenceSensors.length > 0,
56
+ sensor_count: asset.presenceSensors.length,
57
+ coverage_note: getPresenceCoverageNote(asset.assetType, asset.presenceSensors.length),
58
+ timeseries: [],
59
+ };
60
+ if (asset.presenceSensors.length > 0) {
61
+ const measurement = getPresenceMeasurement(asset.assetType);
62
+ try {
63
+ const points = await queryTimeseries(asset.assetType, assetId, measurement, args.start, args.stop, args.interval);
64
+ if (points) {
65
+ presenceData.timeseries = points;
66
+ }
67
+ }
68
+ catch (error) {
69
+ console.error(`[occupancy-timeseries] Presence query failed:`, error);
70
+ presenceData.warning =
71
+ "Failed to retrieve presence timeseries data. Results may be incomplete.";
72
+ }
73
+ }
74
+ // Build traffic measurement data
75
+ const trafficData = {
76
+ available: asset.trafficSensors.length > 0,
77
+ entrance_sensor_count: asset.assetType === "floor" ? asset.trafficSensors.length : undefined,
78
+ sensor_count: asset.assetType === "room" ? asset.trafficSensors.length : undefined,
79
+ coverage_note: getTrafficCoverageNote(asset.assetType, asset.trafficSensors.length),
80
+ timeseries: [],
81
+ };
82
+ if (asset.trafficSensors.length > 0 && asset.assetType !== "zone") {
83
+ const measurement = getTrafficMeasurement(asset.assetType);
84
+ try {
85
+ const points = await queryTimeseries(asset.assetType, assetId, measurement, args.start, args.stop, args.interval);
86
+ if (points) {
87
+ trafficData.timeseries = points;
88
+ }
89
+ }
90
+ catch (error) {
91
+ console.error(`[occupancy-timeseries] Traffic query failed:`, error);
92
+ trafficData.warning =
93
+ "Failed to retrieve traffic timeseries data. Results may be incomplete.";
94
+ }
95
+ }
96
+ // Recommendation checks data success, not just sensor count
97
+ const recommendation = buildRecommendation(presenceData, trafficData, presenceData.timeseries.length > 0, trafficData.timeseries.length > 0);
98
+ assets.push({
99
+ asset_id: assetId,
100
+ asset_type: asset.assetType,
101
+ asset_name: asset.assetName,
102
+ ...asset.tzMetadata,
103
+ presence: presenceData,
104
+ traffic: trafficData,
105
+ ...recommendation,
106
+ });
107
+ }
108
+ return {
109
+ assets,
110
+ interval: args.interval,
111
+ start: args.start,
112
+ stop: args.stop,
113
+ timezone_note: "All timestamps are UTC (ISO-8601). Use site_timezone for each asset to convert to local time.",
114
+ timestamp: new Date().toISOString(),
115
+ };
116
+ }
117
+ /**
118
+ * Register butlr_get_occupancy_timeseries with an McpServer instance
119
+ */
120
+ export function registerGetOccupancyTimeseries(server) {
121
+ server.registerTool("butlr_get_occupancy_timeseries", {
122
+ title: "Get Occupancy Timeseries",
123
+ description: GET_OCCUPANCY_TIMESERIES_DESCRIPTION,
124
+ inputSchema: getOccupancyTimeseriesInputShape,
125
+ annotations: {
126
+ readOnlyHint: true,
127
+ destructiveHint: false,
128
+ idempotentHint: true,
129
+ openWorldHint: true,
130
+ },
131
+ }, async (args) => {
132
+ try {
133
+ const validated = GetOccupancyTimeseriesArgsSchema.parse(args);
134
+ const result = await executeGetOccupancyTimeseries(validated);
135
+ return {
136
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
137
+ };
138
+ }
139
+ catch (error) {
140
+ rethrowIfGraphQLError(error);
141
+ throw error;
142
+ }
143
+ });
144
+ }
145
+ //# sourceMappingURL=butlr-get-occupancy-timeseries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"butlr-get-occupancy-timeseries.js","sourceRoot":"","sources":["../../src/tools/butlr-get-occupancy-timeseries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { z } from "zod";
3
+ import type { Sensor } from "../clients/types.js";
4
+ import type { BatteryStatus, HardwareSnapshotResponse } from "../types/responses.js";
5
+ export declare const HardwareSnapshotArgsSchema: z.ZodEffects<z.ZodObject<{
6
+ scope_type: z.ZodDefault<z.ZodEnum<["org", "site", "building", "floor"]>>;
7
+ scope_id: z.ZodOptional<z.ZodString>;
8
+ include_battery_details: z.ZodDefault<z.ZodBoolean>;
9
+ battery_status_filter: z.ZodDefault<z.ZodEnum<["critical", "due_soon", "healthy", "all"]>>;
10
+ limit: z.ZodDefault<z.ZodNumber>;
11
+ offline_devices_limit: z.ZodDefault<z.ZodNumber>;
12
+ }, "strict", z.ZodTypeAny, {
13
+ scope_type: "site" | "building" | "floor" | "org";
14
+ include_battery_details: boolean;
15
+ battery_status_filter: "all" | "critical" | "due_soon" | "healthy";
16
+ limit: number;
17
+ offline_devices_limit: number;
18
+ scope_id?: string | undefined;
19
+ }, {
20
+ scope_type?: "site" | "building" | "floor" | "org" | undefined;
21
+ scope_id?: string | undefined;
22
+ include_battery_details?: boolean | undefined;
23
+ battery_status_filter?: "all" | "critical" | "due_soon" | "healthy" | undefined;
24
+ limit?: number | undefined;
25
+ offline_devices_limit?: number | undefined;
26
+ }>, {
27
+ scope_type: "site" | "building" | "floor" | "org";
28
+ include_battery_details: boolean;
29
+ battery_status_filter: "all" | "critical" | "due_soon" | "healthy";
30
+ limit: number;
31
+ offline_devices_limit: number;
32
+ scope_id?: string | undefined;
33
+ }, {
34
+ scope_type?: "site" | "building" | "floor" | "org" | undefined;
35
+ scope_id?: string | undefined;
36
+ include_battery_details?: boolean | undefined;
37
+ battery_status_filter?: "all" | "critical" | "due_soon" | "healthy" | undefined;
38
+ limit?: number | undefined;
39
+ offline_devices_limit?: number | undefined;
40
+ }>;
41
+ export type HardwareSnapshotArgs = z.output<typeof HardwareSnapshotArgsSchema>;
42
+ /**
43
+ * Calculate battery status for a sensor
44
+ * Exported for unit testing
45
+ */
46
+ export declare function getBatteryStatus(sensor: Sensor, currentDate?: Date): BatteryStatus;
47
+ /**
48
+ * Execute hardware snapshot tool
49
+ */
50
+ export declare function executeHardwareSnapshot(args: HardwareSnapshotArgs): Promise<HardwareSnapshotResponse>;
51
+ /**
52
+ * Register butlr_hardware_snapshot with an McpServer instance
53
+ */
54
+ export declare function registerHardwareSnapshot(server: McpServer): void;
55
+ //# sourceMappingURL=butlr-hardware-snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"butlr-hardware-snapshot.d.ts","sourceRoot":"","sources":["../../src/tools/butlr-hardware-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAyB,MAAM,EAAQ,MAAM,qBAAqB,CAAC;AAO/E,OAAO,KAAK,EAEV,aAAa,EAEb,wBAAwB,EAEzB,MAAM,uBAAuB,CAAC;AAqC/B,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAcpC,CAAC;AA8BJ,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,0BAA0B,CAAC,CAAC;AA0B/E;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,GAAE,IAAiB,GAAG,aAAa,CAqB9F;AAyFD;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,oBAAoB,qCAwYvE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsBhE"}