@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.
- package/LICENSE +21 -0
- package/README.md +195 -0
- package/dist/cache/occupancy-cache.d.ts +72 -0
- package/dist/cache/occupancy-cache.d.ts.map +1 -0
- package/dist/cache/occupancy-cache.js +166 -0
- package/dist/cache/occupancy-cache.js.map +1 -0
- package/dist/cache/topology-cache.d.ts +36 -0
- package/dist/cache/topology-cache.d.ts.map +1 -0
- package/dist/cache/topology-cache.js +74 -0
- package/dist/cache/topology-cache.js.map +1 -0
- package/dist/clients/auth-client.d.ts +22 -0
- package/dist/clients/auth-client.d.ts.map +1 -0
- package/dist/clients/auth-client.js +82 -0
- package/dist/clients/auth-client.js.map +1 -0
- package/dist/clients/graphql-client.d.ts +6 -0
- package/dist/clients/graphql-client.d.ts.map +1 -0
- package/dist/clients/graphql-client.js +106 -0
- package/dist/clients/graphql-client.js.map +1 -0
- package/dist/clients/queries/topology.d.ts +36 -0
- package/dist/clients/queries/topology.d.ts.map +1 -0
- package/dist/clients/queries/topology.js +252 -0
- package/dist/clients/queries/topology.js.map +1 -0
- package/dist/clients/reporting-client.d.ts +191 -0
- package/dist/clients/reporting-client.d.ts.map +1 -0
- package/dist/clients/reporting-client.js +353 -0
- package/dist/clients/reporting-client.js.map +1 -0
- package/dist/clients/stats-client.d.ts +119 -0
- package/dist/clients/stats-client.d.ts.map +1 -0
- package/dist/clients/stats-client.js +238 -0
- package/dist/clients/stats-client.js.map +1 -0
- package/dist/clients/types.d.ts +215 -0
- package/dist/clients/types.d.ts.map +1 -0
- package/dist/clients/types.js +6 -0
- package/dist/clients/types.js.map +1 -0
- package/dist/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +3 -0
- package/dist/constants.js.map +1 -0
- package/dist/errors/mcp-errors.d.ts +63 -0
- package/dist/errors/mcp-errors.d.ts.map +1 -0
- package/dist/errors/mcp-errors.js +144 -0
- package/dist/errors/mcp-errors.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/butlr-available-rooms.d.ts +49 -0
- package/dist/tools/butlr-available-rooms.d.ts.map +1 -0
- package/dist/tools/butlr-available-rooms.js +492 -0
- package/dist/tools/butlr-available-rooms.js.map +1 -0
- package/dist/tools/butlr-fetch-entity-details.d.ts +42 -0
- package/dist/tools/butlr-fetch-entity-details.d.ts.map +1 -0
- package/dist/tools/butlr-fetch-entity-details.js +276 -0
- package/dist/tools/butlr-fetch-entity-details.js.map +1 -0
- package/dist/tools/butlr-get-asset-details.d.ts +51 -0
- package/dist/tools/butlr-get-asset-details.d.ts.map +1 -0
- package/dist/tools/butlr-get-asset-details.js +391 -0
- package/dist/tools/butlr-get-asset-details.js.map +1 -0
- package/dist/tools/butlr-get-current-occupancy.d.ts +21 -0
- package/dist/tools/butlr-get-current-occupancy.d.ts.map +1 -0
- package/dist/tools/butlr-get-current-occupancy.js +126 -0
- package/dist/tools/butlr-get-current-occupancy.js.map +1 -0
- package/dist/tools/butlr-get-occupancy-timeseries.d.ts +31 -0
- package/dist/tools/butlr-get-occupancy-timeseries.d.ts.map +1 -0
- package/dist/tools/butlr-get-occupancy-timeseries.js +145 -0
- package/dist/tools/butlr-get-occupancy-timeseries.js.map +1 -0
- package/dist/tools/butlr-hardware-snapshot.d.ts +55 -0
- package/dist/tools/butlr-hardware-snapshot.d.ts.map +1 -0
- package/dist/tools/butlr-hardware-snapshot.js +556 -0
- package/dist/tools/butlr-hardware-snapshot.js.map +1 -0
- package/dist/tools/butlr-list-topology.d.ts +27 -0
- package/dist/tools/butlr-list-topology.d.ts.map +1 -0
- package/dist/tools/butlr-list-topology.js +241 -0
- package/dist/tools/butlr-list-topology.js.map +1 -0
- package/dist/tools/butlr-search-assets.d.ts +53 -0
- package/dist/tools/butlr-search-assets.d.ts.map +1 -0
- package/dist/tools/butlr-search-assets.js +206 -0
- package/dist/tools/butlr-search-assets.js.map +1 -0
- package/dist/tools/butlr-space-busyness.d.ts +23 -0
- package/dist/tools/butlr-space-busyness.d.ts.map +1 -0
- package/dist/tools/butlr-space-busyness.js +304 -0
- package/dist/tools/butlr-space-busyness.js.map +1 -0
- package/dist/tools/butlr-traffic-flow.d.ts +39 -0
- package/dist/tools/butlr-traffic-flow.d.ts.map +1 -0
- package/dist/tools/butlr-traffic-flow.js +369 -0
- package/dist/tools/butlr-traffic-flow.js.map +1 -0
- package/dist/types/responses.d.ts +253 -0
- package/dist/types/responses.d.ts.map +1 -0
- package/dist/types/responses.js +8 -0
- package/dist/types/responses.js.map +1 -0
- package/dist/utils/asset-flattener.d.ts +50 -0
- package/dist/utils/asset-flattener.d.ts.map +1 -0
- package/dist/utils/asset-flattener.js +131 -0
- package/dist/utils/asset-flattener.js.map +1 -0
- package/dist/utils/asset-helpers.d.ts +8 -0
- package/dist/utils/asset-helpers.d.ts.map +1 -0
- package/dist/utils/asset-helpers.js +24 -0
- package/dist/utils/asset-helpers.js.map +1 -0
- package/dist/utils/field-validator.d.ts +29 -0
- package/dist/utils/field-validator.d.ts.map +1 -0
- package/dist/utils/field-validator.js +197 -0
- package/dist/utils/field-validator.js.map +1 -0
- package/dist/utils/fuzzy-match.d.ts +29 -0
- package/dist/utils/fuzzy-match.d.ts.map +1 -0
- package/dist/utils/fuzzy-match.js +70 -0
- package/dist/utils/fuzzy-match.js.map +1 -0
- package/dist/utils/graphql-helpers.d.ts +29 -0
- package/dist/utils/graphql-helpers.d.ts.map +1 -0
- package/dist/utils/graphql-helpers.js +43 -0
- package/dist/utils/graphql-helpers.js.map +1 -0
- package/dist/utils/natural-language.d.ts +73 -0
- package/dist/utils/natural-language.d.ts.map +1 -0
- package/dist/utils/natural-language.js +172 -0
- package/dist/utils/natural-language.js.map +1 -0
- package/dist/utils/occupancy-helpers.d.ts +63 -0
- package/dist/utils/occupancy-helpers.d.ts.map +1 -0
- package/dist/utils/occupancy-helpers.js +203 -0
- package/dist/utils/occupancy-helpers.js.map +1 -0
- package/dist/utils/path-builder.d.ts +10 -0
- package/dist/utils/path-builder.d.ts.map +1 -0
- package/dist/utils/path-builder.js +34 -0
- package/dist/utils/path-builder.js.map +1 -0
- package/dist/utils/time-range-validator.d.ts +13 -0
- package/dist/utils/time-range-validator.d.ts.map +1 -0
- package/dist/utils/time-range-validator.js +65 -0
- package/dist/utils/time-range-validator.js.map +1 -0
- package/dist/utils/timezone-helpers.d.ts +49 -0
- package/dist/utils/timezone-helpers.d.ts.map +1 -0
- package/dist/utils/timezone-helpers.js +209 -0
- package/dist/utils/timezone-helpers.js.map +1 -0
- package/dist/utils/tree-formatter.d.ts +23 -0
- package/dist/utils/tree-formatter.d.ts.map +1 -0
- package/dist/utils/tree-formatter.js +258 -0
- package/dist/utils/tree-formatter.js.map +1 -0
- 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"}
|