MCP App Store
by KeenEthics

Overview

Coram helps authorized users search recorded CCTV footage, inspect camera and access-control status, review security alerts and detections, and audit physical-security activity through ChatGPT.

Tools

get_access_control_alerts

ChatGPT
Get triggered access-control ALERT instances. Covers tailgating, access denied, door held open, door forced open, tampering, and controller status. Use for "show me tailgating alerts", "door held open alerts at the warehouse". This is the ONLY source of tailgating alerts — they never appear in get_recent_access_events (no device event exists for tailgating). For hardware-health questions, prefer query_controller_system_health. alert_categories values: tailgating, access_denied, door_held_open, door_forced_open, tampering, controller_status. NOTE: setting door_ids or location_ids restricts results to door-type alerts — controller_status alerts only appear when both filters are omitted. Omitting BOTH start_time and end_time queries the last 24 hours only — pass an explicit window for anything longer (ISO-8601; naïve timestamps are interpreted as UTC). search_query filters by the user-given alert name. limit defaults to 25, max 100. Returns alerts, returned_alerts, and has_more. Each item has door_id (door-type alerts only — for controller_status the raw device_id is the controller id; use controller_id / controller_name there), alert_category, alert_name, and status.

get_access_exceptions

ChatGPT
Get temporary access exceptions (overrides on normal schedules). Pass no arguments to get all. active filters to currently active exceptions; expired filters to expired ones. Use door_ids (from list_doors) or user_ids to narrow.

get_alert

ChatGPT
Get full details for one alert. All three arguments come from a get_recent_alerts entry and are required — the backend keys the lookup on the alert's timestamp: alert_type is the entry's alert_feed_type (one of User Alert, Person of Interest Alert, License Plate of Interest Alert, Halo Sensor Alert — NOT the alert_type/category field), alert_id is its numeric id, and timestamp is its trigger_time (ISO-8601). Returns the camera, location, time, and any alert-type-specific payload (matched face, plate, track, etc.).

get_alert_settings

ChatGPT
Get all alert settings (standard, premium, POI, plate, sensor). Paginated. Each entry's enabled/paused state is determined by paused_at (absent/null = enabled). For premium-only alerts, prefer get_premium_alert_settings.

get_all_articles_summary

ChatGPT
List all available KB articles (id, title, URL, description). Use to understand what topics exist or to pick article IDs for get_articles_by_ids. Returns a count and an articles list.

get_all_people_detections

ChatGPT
Query ALL person detections across cameras in a time window. Use for generic person-detection queries: "all person detections", "how many people today?", "how many people were on camera?". Captures everyone on camera regardless of whether their face was recognized. NOTE: the same person appearing multiple times = multiple entries (no re-identification). For specific named people, use query_face_detections; for enrolled profile activity (POIs), use query_face_detections_by_category. start_time / end_time are ISO-8601; naïve timestamps are interpreted as UTC. One journey-API call is made per camera, so prefer camera_ids / location_ids filters on large fleets. Returns a summary (total_tracks, cameras_queried, cameras_with_detections, locations_with_detections, and top-25 tracks_per_camera / tracks_per_location counts — cite the un-capped *_with_detections fields for "how many cameras saw activity?") plus up to the 100 most recent detections, each with a short-lived signed thumbnail URL.

get_articles_by_ids

ChatGPT
Get full content of specific KB articles by ID (max 25 per call). Use after search_knowledge_base or get_all_articles_summary to fetch detailed markdown content.

get_audit_capabilities

ChatGPT
Discover what configuration changes can be audited. Returns all available categories (e.g. cameras, access_control, alerts) and their specific actions. Call this first to understand what query_audit_logs filters are possible. No API call — the catalogue is static.

get_audit_logs

ChatGPT
Get audit log entries for a time range (max 90 days per request). start_time / end_time are ISO-8601; naïve timestamps are interpreted as UTC. Each entry carries action type, timestamp, user_email, ip_address, and detail. Use for "who deleted door X?", "show admin changes last week", etc. For longer ranges or category / action / user filtering, prefer query_audit_logs.

get_camera

ChatGPT
Get full detail for one camera by its integer ID. The ID is the numeric id field returned by list_cameras — not the MAC / serial / name. Returns the camera's location, stream state, last heartbeat, resolution, and more.

get_camera_pipeline_alerts

ChatGPT
Get recent pipeline errors and warnings for one camera. mac_address comes from list_cameras items[]. Returns recent pipeline alerts with type, timestamp, and error detail — useful for "why is camera X offline?" or "any pipeline errors in the last hour?".

get_camera_snapshot

ChatGPT
Fetch each camera's stored snapshot — latest by default, or nearest a timestamp. Use this for "what does camera X see right now?" or "grab a frame from camera X at 2pm". Cameras store periodic low-res full-field-of-view snapshots; this returns the most recent one per camera (or, when timestamp is set, the one closest to it within tolerance_s seconds). It is NOT a live frame grab — the snapshot can lag real time by the storage interval. camera_ids are the numeric id values from list_cameras (max 10 per call). timestamp is ISO-8601, UTC assumed if no offset. Returns, per camera, in structured_content.results: - signed_image_url — a short-lived, self-authenticating URL for the snapshot JPEG. Share it when the user wants to download or embed the image; it needs no extra auth but expires (typically within 24h). It is also accepted by get_video_frame for later re-inspection. - frame_timestamp — when the returned snapshot was actually captured (tell the user if it's older than they'd expect). - app_url — deep link into the Coram web app timeline at that moment, for watching the surrounding footage. The snapshot JPEGs are ALSO returned as inline image content blocks (in results order), so you can describe what's in frame without a follow-up call. Cameras with no stored snapshot in range appear in results with a null signed_image_url — widen tolerance_s or pick another time. Don't paste raw signed URLs into prose replies — they are very long; render them as markdown links instead.

get_camera_uptime

ChatGPT
Get uptime intervals for one camera over a time range. camera_id is the numeric ID from list_cameras. start_time and end_time are ISO-8601 (e.g. 2026-04-01T00:00:00Z); naïve timestamps are interpreted as UTC. For a fleet-wide health check, prefer the query_camera_uptime composite.

get_coram_guide

ChatGPT
Return the full Coram MCP usage guide. Call this once per session. The MCP handshake instructions field is truncated by some clients, so this tool serves the canonical, full-length guide: identity & tenants, entity hierarchy, time formats, smart defaults, per-domain patterns (devices, alerts, people, access control, video, audit, KB), and error / formatting conventions. Call this BEFORE the first user-facing answer or other tool call. The contents are session-static — do not call it again in the same conversation.

get_custom_alert_events

ChatGPT
Get events for user-configured custom alerts (by name). alert_names is a list of names from list_available_alert_names. Filters the alerts feed via search_query per-name and merges results. reduce works the same as get_security_alerts.

get_door

ChatGPT
Get full detail for one door. door_id comes from list_doors items[]. Returns status, schedule, access level, and connected devices.

get_license_plate_occurrences

ChatGPT
Get individual detection events for one exact license plate number. Each occurrence carries the camera MAC, timestamp, signed image URL, and detection attributes (bbox, score, vehicle type/color/make when known), newest first. Use for per-event timelines or detection times for one plate; pass the s3_signed_url values to get_video_frame to visually inspect detections. For distinct plate listings, exact detection checks, and per-plate counts, query_license_plates returns summary rows. The response carries count, match_mode, and truncated, and — whenever camera scope was resolved automatically or the result is empty — eligible_camera_count: the number of in-scope cameras with license plate detection enabled. Empty results additionally carry empty_reason: "no_lpr_cameras_in_scope" when eligible_camera_count is 0 (LPR is not recording in that scope), else "plate_not_found". plate_number is case-insensitive; spaces, dashes, and dots are ignored. start_time / end_time are ISO-8601 (naïve = UTC). camera_macs / location_ids: omit for all accessible cameras/locations. limit: max occurrences (newest first), 1 to 499; omit for all occurrences in range.

get_license_plates_of_interest

ChatGPT
List enrolled license-plate-of-interest alert profiles and latest occurrences. Returns one summary per enrolled profile, including membership and alert configuration plus its most recent detection timestamp and camera when available. Profiles without a recorded latest occurrence remain in the roster. Use for roster, membership / configuration, and current-period questions answerable from each profile's latest occurrence. This tool does not return a historical occurrence timeline. For detections of arbitrary (non-enrolled) plates use query_license_plates / get_license_plate_occurrences; for individual License Plate of Interest alert instances, use get_security_alerts with alert_categories=["License Plate of Interest"] and reduce="raw".

get_nvr

ChatGPT
Get detail for one NVR by UUID. UUID comes from list_nvrs items[]. Returns online status, camera slots, retention, and disk health.

get_organization_licenses

ChatGPT
Return license counts (total / used) for one organization. tenant_id identifies which org to query — must be one of the UUIDs in list_tenants. Useful for "how many camera licenses do we have left?". Numbers are per license type (camera, premium-alert, access-control, etc.).

get_premium_alert_settings

ChatGPT
Get premium alert settings (Firearm, Slip & Fall, PPE detection). Premium alerts are AI-powered detections that require a premium license. Each entry includes the enabled state (paused_at absent/null = enabled, set = paused), schedule (days/times), sensitivity, monitored cameras / speakers, notification recipients, and trigger rules. For ALL alert settings (standard + premium + POI + sensor), use get_alert_settings instead.

get_recent_access_events

ChatGPT
Get recent access-control events (badges, door opens, forced entries). Pass no arguments to get the most recent events across all controllers. device_ids are controller IDs from list_controllers; door_ids from list_doors. event_types is a free list of strings — invalid values are silently dropped. start_time / end_time are ISO-8601; naïve timestamps are interpreted as UTC. Returns a wrapper with events, total_matching_events, and returned_events.

get_recent_alerts

ChatGPT
Get recent alerts in a time range. start_time / end_time are ISO-8601 (e.g. 2026-04-24T00:00:00Z); naïve timestamps are interpreted as UTC. alert_types filters by category — use values seen in prior alert tool output, or call list_available_alert_names first. search_query further restricts to alerts whose name matches. For alerts with thumbnails / media, use the get_security_alerts composite instead.

get_recent_face_detections

ChatGPT
Get face-detection events for one person in a time range. org_unique_face_id comes from search_detection_profiles or list_face_alert_profiles. start_time / end_time are ISO-8601; naïve timestamps are interpreted as UTC. Optionally narrow by mac_addresses (from list_cameras items[]) or location_ids (from list_locations). For UI-friendly output with thumbnails, use the query_face_detections composite instead.

get_security_alerts

ChatGPT
Get alerts filtered by standard category (Firearm, POI, etc.). Provide BOTH start_time and end_time, or omit both — naïve timestamps are interpreted as UTC. reduce controls output detail: - summary (default): counts only — by category / camera / location. Cheap; right for "how many?" / "compare days". - raw: full alert records with timestamps and metadata. Use when the user wants to see individual events. alert_categories accepts AlertCategory values plus aliases like firearm, trespassing, poi, lpr, loitering.

get_unlockable_doors

ChatGPT
Return door IDs the current user can unlock right now. Use for "which doors can I unlock?" or to check the user's per-door permissions before suggesting a remote unlock.

get_video_frame

ChatGPT
Fetch video-search thumbnail JPEGs as inline image content. Use this when the model needs to visually inspect frames returned by show_video_search_results — e.g. "what colour is the truck in result 1?", "is the person wearing a hard hat?", "is the door open?". Each URL is downloaded and returned as an MCP image content block (base64-encoded), in the same order as urls, so the multimodal model can see the pixels. Pass URLs verbatim from prior show_video_search_results output's signed_image_url field. They are short-lived (typically 24h) and self-authenticating — no tenant_id argument is needed. Constraints: - Maximum 10 URLs per call. Bigger batches blow out the multimodal context. For more frames, call again. - Failed fetches (expired signature, host unreachable) are silently dropped from the result; the leading text block reports the success / failure count. - This tool deliberately does NOT bind to the search widget. Calling it does not refresh the search gallery; it's an independent "look at these pixels" capability.

list_access_control_alert_settings

ChatGPT
List CONFIGURED access-control alerts. Returns tailgating / door held open / door forced open / access denied / tampering / controller_status alert configurations with their categories, target doors, schedules, and active state. Use for "is tailgating set up on the front door?", "what access control alerts exist?". For triggered instances, use get_access_control_alerts. alert_categories values: tailgating, access_denied, door_held_open, door_forced_open, tampering, controller_status. search_query filters by alert name or description. limit defaults to 50, max 100. Returns alert_settings (each has id, name, is_active, alert_category, a devices list of target doors with id/type/name, schedules, recipients), returned_count, and has_more.

list_access_levels

ChatGPT
List access levels (groups of door permissions). Each level includes a user_count. Useful for "what access levels exist?", "how many users have X permissions?", or to get access_level_ids for filtering doors.

list_available_alert_names

ChatGPT
List standard alert categories and configured custom alert names. Combines get_premium_alert_settings and the user-alert portion of get_alert_settings. Returns: - categories: every standard AlertCategory value - custom_alert_names: unique names of user-defined alerts - details: per-name metadata (category, enabled, setting_id)

list_camera_groups

ChatGPT
List camera groups defined in tenant_id. Groups are a logical bucket of cameras independent of physical location — useful for "all entrance cameras" or "all parking-lot cameras". Use list_camera_groups_with_locations if you need the per-location membership.

list_camera_groups_with_locations

ChatGPT
List camera groups with their per-location memberships. Heavier than list_camera_groups — returns each group's location list. Use when the user wants to know which sites a group covers.

list_camera_models

ChatGPT
List supported camera models in tenant_id. Returns manufacturer, model name, and fisheye flag for each model the org has deployed. No need to cross-reference with list_cameras — this is the canonical list.

list_cameras

ChatGPT
List cameras accessible in tenant_id. nvr_uuid and location_id optionally narrow the result. Prefer reusing values you've already seen in prior-turn list_nvrs / list_devices output before re-calling those. exclude_disabled hides administratively-disabled cameras.

list_controllers

ChatGPT
List access-control controllers (door-management hardware). location_id filters client-side. Returns each controller's connection state and configuration. Useful for "list controllers" / "which controllers are offline?".

list_devices

ChatGPT
List devices (cameras and speakers, not NVRs or controllers). Use list_nvrs for NVRs and list_controllers for access control hardware. location_id filters client-side; pass it to narrow the result.

list_doors

ChatGPT
List doors, optionally filtered by site / building / etc. Pass no arguments to get all doors. Filters compose; use acb_ids to narrow by controller (from list_controllers).

list_face_alert_profiles

ChatGPT
List enrolled face profiles (people). category filters: pois (persons of interest only), non_pois, or all (default). profile_ids further restricts to specific org_unique_face_id values from a prior search_detection_profiles call. Returns raw profile records. For thumbnails-friendly results with display control, use the query_face_profiles composite instead.

list_locations

ChatGPT
List locations (physical sites) in tenant_id. Each location carries an id usable as the location_id filter on list_cameras, list_nvrs, list_doors, and many others. Prefer reusing IDs you've seen in prior tool output before re-listing.

list_lockdown_settings

ChatGPT
List lockdown settings (emergency configs that restrict door access). Pass active=True to see only currently-engaged lockdowns. door_ids and user_ids further narrow.

list_members

ChatGPT
List organization members (admins and users). tenant_id identifies which org. Returns each member's id, name, email, role, and last_login. Use for "who are the admins?", "list all members", or to look up a user's email before querying audit logs by user.

list_nvrs

ChatGPT
List NVR (Network Video Recorder) devices. location_id optionally filters to one site. Returns each NVR's UUID, online status, camera-slot count, retention days, and basic disk info.

list_organizations

ChatGPT
List organizations the authenticated user can access. Returns every org's id, name, and settings. Distinct from list_tenants (which returns the bare UUIDs with no metadata) — use this when the user asks about org metadata.

list_schedules

ChatGPT
List access-control schedules (when doors auto-lock/unlock). Returns time slots and door assignments. Useful for "what schedules exist?" or "when do doors lock?".

list_speakers

ChatGPT
List speaker devices in tenant_id. location_id filters client-side.

list_tenants

ChatGPT
List tenant UUIDs the authenticated user can access. Fetched from the backend's GET /organizations endpoint. Call this first to discover the tenants you can pass to other tools' tenant_id argument; pick the one that matches the user's question (ask them if it's ambiguous), then use it on every subsequent call.

query_audit_logs

ChatGPT
Query the audit trail of configuration changes, with filtering. Filtering (use get_audit_capabilities to see valid values): - category: filter by domain (cameras, access_control, alerts, …) - actions: list of specific action names for exact matching (takes precedence over category) - user_email_filter: substring match on user email Long ranges are fetched in parallel 10-day chunks; operational actions (searches, views, downloads) are filtered out. Results are sorted newest-first, so for "last time X happened" start with a 30-day window and read the first result — expand the range if empty. start_time / end_time are ISO-8601; naïve timestamps are interpreted as UTC. Returns logs grouped by category plus summary statistics. If partial is true, some time windows failed to fetch (listed in failed_windows) — present the results as incomplete for those windows, not exhaustive.

query_camera_health

ChatGPT
Summarise camera health (online / offline / disabled). Pass no filters to summarise the entire fleet. Filters are applied client-side after a single list_cameras call.

query_camera_uptime

ChatGPT
Get uptime intervals for cameras over a time range. start_time / end_time are ISO-8601; naïve timestamps are interpreted as UTC. detail_level: - summary (default): per-camera total uptime + percent. - detailed: include each individual uptime interval. Pass no filters to query every camera in the fleet (slower — one API call per camera). Prefer camera_ids from prior list_cameras output.

query_controller_system_health

ChatGPT
Check controller health (battery, lid tampering, fire alarms). Aggregates battery / lid / fire-alarm events from search_access_control_device_events over the time window. device_ids come from list_controllers. reduce: summary (counts by event type per controller — default) or raw.

query_door_access_history

ChatGPT
Query door access history (badge swipes / manual unlocks / etc.). start_time / end_time ISO-8601, naïve = UTC. door_ids, user_ids filter at the API. location_ids is applied client-side after the fetch. event_categories maps to event_types on the underlying search; auth_methods is applied as a post-filter on the event detail. reduce: summary (counts by user / by door / total — default) or raw (full event records).

query_face_detections

ChatGPT
Aggregate face detections for specific profiles in a time range. profile_ids are org_unique_face_id values from search_detection_profiles. reduce: summary (default) or raw.

query_face_detections_by_category

ChatGPT
Aggregate face detections in a time range, filtered by POI category. category: all (default), pois, or non_pois. reduce: summary (counts only — default) or raw (full records). For per-person history, use query_face_detections.

query_face_profiles

ChatGPT
List enrolled face profiles (POIs and non-POIs) with summary counts. Same data as list_face_alert_profiles but with summary stats included. category: all / pois / non_pois. profile_ids further restricts to specific org_unique_face_id values.

query_license_plates

ChatGPT
Search LPR detections as distinct plate summaries within a time and camera scope. With plate_query, returns an exact plate summary when found; otherwise it may return labeled prefix or OCR-confusion candidates. Without plate_query, it lists distinct detected plates. Each summary includes match_type, num_occurrences, latest camera/time, LPOI membership, and a representative thumbnail URL when available (pass to get_video_frame to inspect). Use for plate listings, exact detection checks, and per-plate counts. For individual event timestamps, use get_license_plate_occurrences. Envelope facts in the response: exact_match and candidate_count refer to the requested plate_query (exact_match is always false when plate_query is omitted); empty_reason is one of 'no_lpr_cameras_in_scope', 'window_fully_out_of_retention', 'plate_not_found' (queried, no hits), 'no_plates_in_window' (no-query listing, no hits), or null; malformed_rows appears only when unparseable backend rows were dropped. plate_query is case-insensitive; spaces, dashes, and dots are ignored. start_time / end_time are ISO-8601 (naïve = UTC). camera_macs / location_ids: omit for all accessible cameras/locations. limit: max plates to return (1-500).

query_unique_faces

ChatGPT
List unique faces seen in a time range, including unenrolled people. Uses the /face/unique_faces endpoint, which returns one entry per face cluster in the window — useful for "who showed up today?". category: all / pois / non_pois (filtered client-side after the fetch).

query_user_permissions

ChatGPT
Audit user access permissions (who can open which doors when). Joins list_access_levels with list_members. Pass user_ids to scope to specific users. Set include_schedules=False to drop time-window detail and keep the response compact.

search_ac_profiles

ChatGPT
Lightweight access-control user lookup by partial name. Wraps list_members and filters client-side. Returns id, name, email, role for each matching user.

search_detection_profiles

ChatGPT
Lightweight face-profile lookup by partial name. Use before query_face_detections / get_recent_face_detections to resolve a person's name to an org_unique_face_id. With no name, returns every enrolled profile in a compact form.

search_knowledge_base

ChatGPT
Search Coram help articles for product docs and troubleshooting. Covers cameras (setup, troubleshooting), NVRs (Coram Point), access control (doors, schedules), alerts (firearm, POI, LPR, etc.), video features (timeline, search, archiving), AI features (face / plate), user management, mobile app, and general troubleshooting. Rewrite the user's question into a focused retrieval query before calling — extract the topic + action, drop conversational filler, keep product names. E.g. "my camera isn't working" becomes "camera offline troubleshooting".

show_video_search_results

ChatGPT
Natural-language video search over recorded footage. Wraps POST /text_search/perform_multi_camera_search. CLIP searches by visual content only — translate non-English queries to English before calling, and pull time references out into start_time / end_time (e.g. "forklift yesterday afternoon" → text_query="forklift", start/end = yesterday 12:00–18:00). Maximum span 30 days. If the user asks for a wider range, ask which 30-day window. Each result includes the camera name, location, timestamp, CLIP score, a signed_image_url (the thumbnail JPEG — used by the widget to render the gallery) and an app_url (a deep link into the Coram web app's timeline view, centred on the moment of the hit with a ±10 s playback window). This tool does NOT return image bytes. That's intentional: when the response carries inline image content blocks alongside structuredContent, ChatGPT's Apps widget refuses to hydrate (it routes the result to its inline-image renderer instead) and the user sees an empty "Waiting for data…" widget. If you need to visually inspect specific frames — e.g. the user asks "what colour is the truck?" or "is there a person in result 3?" — call get_video_frame with the relevant signed_image_urls in a separate, follow-up tool call. That tool returns image bytes the model can see. Presenting results to the user: - ALWAYS render each hit as a markdown link using the app_url, e.g. [Loading Dock — Tue May 14, 2:31 PM](app_url). That opens the timeline view at the moment of the hit so the user can watch the actual footage, not just the still. Use signed_image_url only when the user explicitly asks for the raw thumbnail. - On the FIRST search response in a conversation, briefly tell the user they can click any thumbnail link (or the gallery thumbnail when the widget renders) to enable inline image previews for the rest of the session — both ChatGPT and Claude treat tool-returned images as untrusted until the user surfaces the host via a click. After that one gesture, previously-returned thumbnails will also render in place. - Don't paste the raw signed URL or the JSON payload into the reply. The URL is auth-bearing and very long; the model's job is to summarise hits and link them.

start_live_stream

ChatGPT
Resolve cameras for live viewing and return their stream metadata. On voice-agent this emits a UI command that opens the frontend's live-stream gallery. MCP clients (Claude / ChatGPT) don't have an embedded viewer, so this tool returns the identifying metadata (camera id, name, mac, online state, location) the calling client can use to render or link out.

whoami

ChatGPT
Return the authenticated Coram user profile and accessible tenants. Calls GET /users/me for the profile and GET /organizations for the tenant list. Use this to discover who you are and which tenants you can target.

Capabilities

Interactive

Example Prompts

Click any prompt to copy it.

App Stats

63

Tools

3

Prompts

ChatGPT

Platforms

Works with

ChatGPT

Data refreshed daily