rhombus-node-mcp
Version:
MCP server for Rhombus API
62 lines (61 loc) • 2.84 kB
JavaScript
import { postApi } from "../network/network.js";
import { ActivityEnum } from "../types/schema.js";
import { formatTimestamp } from "../util.js";
/**
* Lenel S2 NetBox (Honeywell NetBox) activity enum values. Passing these as `activityTypes` to the
* generalized access-control event search scopes results to NetBox events only — exactly mirroring the
* OnGuard search, which is implicitly scoped to ONGUARD_* types server-side.
*/
export const NETBOX_ACTIVITY_TYPES = [
ActivityEnum.NETBOX_BADGE_AUTHORIZED,
ActivityEnum.NETBOX_BADGE_ANOMALY,
ActivityEnum.NETBOX_NO_ENTRY_MADE,
];
/**
* Calls the generalized webservice access-control event search
* (POST /eventSearchV2/searchIntegrationAccessEvents) scoped to Lenel S2 NetBox via `activityTypes`, and
* maps the raw seekpoints to the same agent-friendly shape as searchOnGuardEvents. Typed against the
* generated public OpenAPI schema (Eventsearch_SearchIntegrationAccessEventsWSRequest/Response).
*/
export async function searchNetboxEvents(args, timeZone, requestModifiers, sessionId) {
const body = {
deviceUuids: args.deviceUuids,
locationUuids: args.locationUuids,
afterMs: args.afterMs,
beforeMs: args.beforeMs,
cardholderQuery: args.cardholderQuery,
badgeStatus: args.badgeStatus,
badgeType: args.badgeType,
area: args.area,
anomalyOnly: args.anomalyOnly,
entryMade: args.entryMade,
limit: args.limit ?? 200,
activityTypes: [...NETBOX_ACTIVITY_TYPES],
};
const res = await postApi({
route: "/eventSearchV2/searchIntegrationAccessEvents",
body,
modifiers: requestModifiers,
sessionId,
});
if (res.error) {
throw new Error(res.status ?? res.errorMsg ?? "NetBox event search failed");
}
const events = (res.events ?? []).map((e) => ({
timestampMs: e.timestampMs ?? undefined,
datetime: e.timestampMs != null ? formatTimestamp(e.timestampMs, timeZone) : undefined,
deviceUuid: e.deviceUuid ?? undefined,
label: e.customDisplayName ?? e.objectType ?? undefined,
// Dedicated-event-types put the cardholder in its own `cardholderName` field (customDescription
// is null on those docs); keep customDescription as a legacy fallback. The generated schema
// predates the field, so read it through a cast until `assets/openapi.json` is regenerated.
cardholderName: e.cardholderName ?? e.customDescription ?? undefined,
badgeStatus: e.badgeStatus ?? undefined,
badgeType: e.badgeType ?? undefined,
areaEntering: e.areaEntering ?? undefined,
areaExiting: e.areaExiting ?? undefined,
entryMade: e.entryMade ?? undefined,
isAnomaly: e.alert ?? undefined,
}));
return { events };
}