Rhombus MCP Server
Official🚀 Rhombus MCP 서버 - AI 도구의 성능을 극대화하세요!
이 최첨단 MCP 서버 구현으로 Rhombus API의 강력한 기능을 활용해 보세요! 고급 보안 및 감시 기능을 손끝에서 사용하여 챗봇 경험을 혁신할 수 있습니다.
🔍 Rhombus 소개
Rhombus는 보호를 위해 구축되고 적응하도록 설계된 업계 최고 등급의 상업용 보안 시스템입니다! 당사는 다음과 같은 기능을 결합하여 사이버 보안에 중점을 둔 엔터프라이즈급 물리적 보안을 제공합니다:
💡 스마트 카메라 - 혁신적인 돔, 어안, 불렛 및 다중 센서 보안 카메라
🚪 출입 통제 - 모바일, 카드 및 키팝 액세스를 지원하는 안전한 도어 컨트롤러, 리더기 및 인터폰
📡 IoT 센서 - 고급 오디오, 환경, 동작, 출입 및 다목적 패닉 센서
🔒 알람 모니터링 - TMA 5-다이아몬드 인증을 받은 실시간 상담원 확인 및 출동 서비스
당사의 플랫폼은 강력한 사이버 보안 원칙을 기반으로 하면서 실시간 감지를 통해 더 빠르게 대응할 수 있도록 돕는 실행 가능한 AI 인사이트로 구동됩니다.
Related MCP server: MCP Camera Tool
🧪 베타 테스트에 참여하세요!
AI 세대의 일원이 된 것을 환영합니다! MCP 서버 구현을 테스트하고 귀중한 피드백을 제공하여 AI 기반 보안의 미래를 함께 만들어 주세요.
여러분의 통찰력은 당사의 개발 로드맵에 직접적인 영향을 미치며, 시장에서 가장 강력한 AI 보안 도구를 만드는 데 도움이 될 것입니다!
🔧 빠른 설정
Smithery를 통한 설치
Smithery를 통해 Claude Desktop용 Rhombus MCP 서버를 자동으로 설치하려면:
npx -y @smithery/cli install @RhombusSystems/rhombus-node-mcp --client claude1단계: Rhombus 콘솔에 슈퍼파워 부여하기
2단계: Claude Desktop 성능 극대화하기
여기에서 놀라운 Claude 데스크톱을 다운로드하세요! 📥
claude_desktop_config.json에 다음을 추가하여 마법을 시작하세요:
DOCKER
{
"mcpServers": {
"rhombus": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"RHOMBUS_API_KEY=YOUR_API_KEY_HERE",
"rhombussystems/mcp-server-rhombus"
],
"env": {
"RHOMBUS_API_KEY": "YOUR_API_KEY_HERE"
}
}
}
}NPX
{
"mcpServers": {
"rhombus": {
"command": "npx",
"args": ["--yes", "--package", "rhombus-node-mcp", "mcp-server-rhombus"],
"env": {
"RHOMBUS_API_KEY": "YOUR_API_KEY_HERE"
}
}
}
}다음 경로를 사용하여 파일에 액세스할 수 있습니다:
vim ~/Library/Application\ Support/Claude/claude_desktop_config.json3단계: 직접 사용해 보기! 🎡
이제 마법이 일어날 시간입니다! Claude Desktop이 멋진 rhombus 서버 도구를 감지하는지 확인해 봅시다:
Claude 인터페이스에서 강력한 망치 아이콘을 찾으세요 ⚒️
클릭하여 새로운 도구 모음을 확인하세요
목록에서 Filesystem MCP Server 도구를 찾으세요
보인다면 성공입니다! 🎉 이제 통합이 완료되어 사용할 준비가 되었습니다! Claude는 이제 Rhombus 웹 앱과 동일한 놀라운 기능을 제공하면서도 Claude의 지능을 더해 Rhombus 시스템과 직접 통신할 수 있습니다!
🚀 로컬 실행: 개발자의 역량을 발휘하세요!
직접 Rhombus MCP 서버를 테스트하고 싶으신가요? 다음 단계에 따라 로컬 Docker 이미지를 빌드 및 실행하고 원하는 MCP 클라이언트에 연결해 보세요!
1. 로컬 Docker 이미지 빌드 🛠️
먼저 Docker 이미지를 빌드해 보겠습니다. 이를 통해 로컬 환경에서 MCP 서버를 실행할 수 있습니다.
npm install
docker build -t mcp-server-rhombus .2. 로컬 사용을 위한 Claude 설정 업데이트 ⚡
이제 새로 빌드한 로컬 Docker 이미지를 가리키도록 claude_desktop_config.json을 조정해야 합니다.
참고: 로컬에서 실행할 때 Docker 이미지 이름은
rhombussystems/mcp-server-rhombus에서mcp-server-rhombus로 변경됩니다. 구성에서 이 부분을 업데이트했는지 확인하세요!
{
"mcpServers": {
"rhombus": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"RHOMBUS_API_KEY=YOUR_API_KEY_HERE",
"mcp-server-rhombus"
],
"env": {
"RHOMBUS_API_KEY": "YOUR_API_KEY_HERE"
}
}
}
}새 도구 만들기
기존 도구 세트 외에 새로운 도구 개발을 시작할 수 있도록 스크립트를 작성했습니다. 간단히 다음을 호출하면 됩니다:
npm run create:tool🧪 테스트 실행
테스트는 Vitest로 작성되었으며 소스 파일과 함께 *.test.ts로 존재합니다.
1. 테스트 환경 설정
템플릿을 복사하고 값을 입력하세요:
cp .env.test.template .env.test그런 다음 .env.test를 편집하세요:
변수 | 설명 |
| Rhombus API 키 — API 관리에서 생성 |
| API 기본 URL — 기본값은 |
| 통합 테스트에 사용할 조직 내 카메라의 UUID |
.env.test는 gitignore 처리되어 있으므로 실제 자격 증명을 커밋하지 마십시오.
2. 테스트 실행
# Run all tests once
npm test
# Watch mode — re-runs on file changes
npm run test:watch문제가 발생했나요? 저희가 도와드리겠습니다! 🛟
빠른 해결을 위해 Claude의 환상적인 문제 해결 가이드를 확인하세요! 여전히 해결되지 않나요? 전문가 팀이 도와드릴 준비가 되어 있습니다!
이메일 문의: developer@rhombus.com 📧
베타 테스트 양식을 통해 피드백 공유 🌟
당사는 귀하의 경험을 완벽하게 만들기 위해 최선을 다하고 있으며, 당사의 도구로 어떤 놀라운 애플리케이션을 만들고 계신지 매우 기대됩니다!
🤝 피드백을 기다립니다!
AI 세대의 선구자로서, 당사는 고급 물리적 보안과 최첨단 AI 도구를 결합할 때 가능한 것의 경계를 넓히는 데 열정을 쏟고 있습니다. 혁신과 개선을 지속하는 데 있어 여러분의 피드백은 매우 소중합니다.
워크플로우를 더 개선할 수 있는 기능은 무엇인가요?
프로젝트에서 당사의 MCP 서버를 어떻게 사용하고 계신가요?
다음에 보고 싶은 통합 기능은 무엇인가요?
여러분의 생각, 아이디어, 성공 사례를 공유해 주세요! 우리는 함께 지능형 보안의 미래를 만들어가고 있습니다.
📜 라이선스
이 멋진 MCP 서버는 MIT 라이선스의 자유와 함께 제공됩니다! ✅ 사용, ✅ 수정, ✅ 공유가 가능하며 가능성은 무궁무진합니다! MIT 라이선스 약관을 준수하는 것을 잊지 마세요. 자세한 내용은 저장소의 LICENSE 파일을 확인하세요.
Available Tools
31 toolsaccess-control-toolA
This tool manages Rhombus access control operations including door unlocking, access groups, credentials, lockdown plans, door schedules, and access grants.
It has the following modes of operation, determined by the "requestType" parameter:
unlock-door: Remotely unlock an access controlled door. Requires doorUuid.
get-groups: List all access control groups in the organization.
get-credentials-by-user: List all access control credentials for a specific user. Requires userUuid.
get-lockdown-plans: List all lockdown plans in the organization.
activate-lockdown: Activate a lockdown plan at a location. Requires locationUuid and lockdownPlanUuid.
deactivate-lockdown: Deactivate a lockdown plan at a location. Requires locationUuid and lockdownPlanUuid.
get-door-schedules: Get door schedule exceptions for a location. Requires locationUuid.
get-access-grants: List location access grants (physical badge/card access). Optionally accepts locationUuid to filter by location. Each grant includes userUuids (directly assigned users), groupUuids (assigned access control groups), and doorUuids (the doors this grant provides access to).
get-remote-unlock-users: Get all users who have permission to remotely unlock doors at a location. Requires locationUuid. Returns a list of doors with remote unlock enabled and the users who can unlock each door, based on their permission group roles. This is the correct tool for questions about remote unlock permissions.
Use the get-entity-tool with entityType ACCESS_CONTROL_DOOR to get door UUIDs. Use the user-tool to look up user UUIDs and resolve them to names/emails. Use the location-tool to get location UUIDs.
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| requestType | Yes | The type of access control request to make. | |
| doorUuid | Yes | The UUID of the access controlled door. Required for 'unlock-door'. | |
| userUuid | Yes | The UUID of the user. Required for 'get-credentials-by-user'. | |
| locationUuid | Yes | The UUID of the location. Required for 'activate-lockdown', 'deactivate-lockdown', 'get-door-schedules', and 'get-remote-unlock-users'. Optional for 'get-access-grants' to filter by location. | |
| lockdownPlanUuid | Yes | The UUID of the lockdown plan. Required for 'activate-lockdown' and 'deactivate-lockdown'. | |
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| unlockResult | No | Result of unlocking a door |
| accessControlGroups | No | List of access control groups |
| credentials | No | List of access control credentials for a user |
| lockdownPlans | No | List of lockdown plans |
| lockdownResult | No | Result of activating or deactivating a lockdown |
| doorScheduleExceptions | No | Door schedule exceptions |
| accessGrants | No | List of location access grants. Each grant contains userUuids and groupUuids that have access to the doorUuids in the grant. |
| remoteUnlockUsers | No | Users who can remotely unlock doors at a location, grouped by permission group. Always present the COMPLETE list of all users to the end user. |
| error | No | An error message if the request failed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the behavior of each mode (e.g., unlock-door is a write operation, get-groups is read-only) and warns about large responses. However, it lacks details on side effects, error handling, or permission requirements, which is a moderate gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with bullet points for modes, making it easy to scan. It front-loads the purpose. While it is lengthy due to the number of modes, every section serves a purpose; minor redundancy in parameter explanations could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 parameters, 9 modes) and the existence of an output schema, the description covers modes, required parameters, output filtering, and related tools. It could be more complete by briefly noting what each mode returns, but the output schema reduces that need.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds significant value by clarifying which parameters are required for each mode and providing examples for includeFields and filterBy. This goes beyond the schema's generic descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool manages Rhombus access control operations and enumerates nine specific modes via requestType. It differentiates from sibling tools by explicitly directing users to get-entity-tool, user-tool, and location-tool for UUID lookups, and states that this is the correct tool for remote unlock permissions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance for each mode, including required parameters. It names alternative tools for prerequisite lookups and includes a warning about large responses. However, it does not explicitly state when not to use this tool versus a sibling beyond those mentions, leaving some implicit inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alarm-monitoring-toolA
This tool retrieves alarm monitoring status and threat case information across Rhombus locations.
It has the following modes of operation, determined by the "requestType" parameter:
org-status: Get the armed/disarmed alarm monitoring status for ALL locations in the organization in a single call.
get-threat-cases: Retrieve alarm monitoring threat cases (security incidents). Supports filtering by time range and max results.
location-status: Get detailed alarm monitoring status for a specific location. Requires locationUuid.
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| requestType | Yes | The type of alarm monitoring request to make. | |
| locationUuid | Yes | Location UUID. Required for 'location-status'. | |
| startTimeMs | Yes | Filter threat cases after this timestamp (ms since epoch). Optional for 'get-threat-cases'. | |
| endTimeMs | Yes | Filter threat cases before this timestamp (ms since epoch). Optional for 'get-threat-cases'. | |
| maxResults | Yes | Maximum number of threat cases to return. Optional for 'get-threat-cases'. | |
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| locationStatuses | No | Alarm monitoring status for each location |
| threatCases | No | List of alarm monitoring threat cases |
| locationDetail | No | Detailed alarm monitoring status for a single location |
| error | No | An error message if the request failed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It warns about large response sizes exceeding 400k characters and explains output filtering parameters to mitigate this. However, it does not explicitly state whether the tool is read-only or mention any other behavioral traits like authentication requirements or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections for each mode and output filtering. It is concise, front-loading the core purpose and modes, and every sentence adds value (e.g., warnings about large responses). No unnecessary repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool has an output schema, the description does not need to detail return values. It covers all parameters, modes, and provides important warnings about response size. It lacks information about error conditions or prerequisites (e.g., whether a location UUID is required for location-status), but overall it is sufficiently complete for a multi-mode retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for all 7 parameters, but the description adds significant value by explaining the modes of operation driven by requestType, detailing the output filtering parameters (includeFields and filterBy) with examples, and warning about large responses. This goes well beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves alarm monitoring status and threat case information, with specific modes (org-status, get-threat-cases, location-status) that differentiate the tool's capabilities. It uses specific verbs ('retrieves') and resources ('alarm monitoring status and threat case information'), making its purpose unambiguous and distinct from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly lists the three modes of operation and explains when each should be used based on the requestType parameter. It provides context for each mode but does not explicitly advise when not to use this tool or suggest alternatives among sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analytics-toolA
This tool generates composite operational analytics reports by combining multiple data sources. Use it for high-level business questions about space utilization, traffic patterns, and real-time scene analysis.
It has the following modes of operation, determined by the "requestType" parameter:
space-utilization: Compare per-camera people counts against running averages at a location. Answers: "How busy is each area vs normal?"
traffic-flow: Compare ingress/egress across ALL line-crossing cameras at a location. Answers: "Which entrance gets the most traffic?"
peak-vs-average: Show hourly actual counts vs historical averages. Answers: "When is it busiest? Is today above or below normal?"
scene-intelligence: Ask a camera an arbitrary question using AI vision (e.g. "How many treadmills are in use?"). Works in real-time or at a historical timestamp.
location-summary: Generate a comprehensive multi-metric analytics summary for a location including people counts, traffic flow, and trend comparisons.
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| requestType | Yes | The type of analytics report to generate. | |
| spaceUtilizationRequest | Yes | Request for space utilization report. Compares per-camera people counts against running averages. Required for 'space-utilization'. | |
| trafficFlowRequest | Yes | Request for multi-camera traffic flow report. Compares ingress/egress across all line-crossing cameras at a location. Required for 'traffic-flow'. | |
| peakVsAverageRequest | Yes | Request for peak-vs-average analysis. Shows hourly actual counts vs historical running averages. Required for 'peak-vs-average'. | |
| sceneIntelligenceRequest | Yes | Request for real-time scene intelligence. Asks a camera an arbitrary question using AI. Required for 'scene-intelligence'. | |
| locationSummaryRequest | Yes | Request for a comprehensive location analytics summary covering people counts, traffic flow, occupancy, and comparison to averages. Required for 'location-summary'. | |
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| spaceUtilization | No | Space utilization report with per-camera counts vs running averages. |
| trafficFlow | No | Multi-camera traffic flow comparison with ingress/egress ranking. |
| peakVsAverage | No | Hour-by-hour actual vs. average analysis with peak/quiet hour identification. |
| sceneIntelligence | No | Real-time AI answer from a camera about what it currently sees. |
| locationSummary | No | Comprehensive multi-metric location analytics summary. |
| error | No | An error message if the request failed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It details the five modes, explains output filtering (includeFields, filterBy), and warns about large responses exceeding 400k characters. However, it does not explicitly state whether the tool is read-only or has side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with bullet points for modes and a separate section for output filtering. It is front-loaded with the purpose. Every sentence serves a purpose, though it is slightly verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (8 parameters, no annotations, output schema present), the description covers all necessary aspects: five modes, request objects, output filtering with examples, and a warning about large responses. It is comprehensive enough for an AI agent to understand how and when to invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds significant value by explaining what each mode answers in plain language (e.g., 'How busy is each area vs normal?'), which goes beyond the schema's formal parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states it generates composite operational analytics reports by combining multiple data sources, and lists five specific modes of operation with clear answers to business questions. This distinguishes it from simpler data retrieval tools like count-tool or events-tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description recommends using the tool for high-level business questions, but does not explicitly state when not to use it or suggest alternative tools. It provides context for usage but lacks exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
automated-prompts-toolA
This tool manages Rhombus MIND automated prompts - scheduled chatbot jobs that run a prompt at a recurring interval and store each response. Use it to list, inspect, create, update, delete, page through past responses for, share, or re-verify the schedule of an automated prompt.
Modes (set "requestType"):
list: List all automated prompts in the org. Optional 'lastEvaluatedKey' / 'maxPageSize' for pagination.
get: Get a single automated prompt's settings. Requires 'promptUuid'.
create: Create a new automated prompt. Requires 'prompt', 'invokeAt' (ISO 8601 with offset, must be at least 15 minutes in the future), 'frequencyValue', 'frequencyUnit', and 'permissionGroupUuid'. Optional 'responseTemplate' and 'notifyUserUuids'.
update: Selectively update an automated prompt. Requires 'promptUuid'; only the fields you set will be changed. To change the role, the caller must have access to both the current and new role. Pass an empty 'notifyUserUuids' array to clear notifyees.
delete: Delete an automated prompt and all of its stored responses. Requires 'promptUuid'.
get-history: Page through responses generated by an automated prompt. Requires 'promptUuid'. Optional 'lastEvaluatedKey' / 'maxPageSize'.
share-response: Update the visibility of one stored response. Requires 'chatUuid' and 'visibility' (PUBLIC, ORG_WIDE, SELECT_USERS, PRIVATE).
verify-scheduled: Re-verify that the job is scheduled to trigger; the server reschedules it if missing. Requires 'promptUuid'.
Notes:
Use 'user-tool' to look up user UUIDs and resolve them to names/emails. 'notifyUserUuids' must be members of the chosen 'permissionGroupUuid'.
'invokeAt' is an ISO 8601 timestamp; both 'Z' and '+/-HH:mm' offsets are accepted. The tool converts it to milliseconds for the API.
Timestamps in the output are ISO 8601 strings with timezone offset (defaults to America/Los_Angeles when no org timezone is available).
'submitTestPrompt' is intentionally not exposed by this tool.
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| requestType | Yes | The type of automated prompt request to make. | |
| promptUuid | Yes | UUID of the automated prompt. Required for 'get', 'update', 'delete', 'get-history', and 'verify-scheduled'. | |
| chatUuid | Yes | UUID of a chat record (an individual response generated by an automated prompt). Required for 'share-response'. | |
| visibility | Yes | Visibility for a shared chat response. Required for 'share-response'. One of PUBLIC, ORG_WIDE, SELECT_USERS, PRIVATE. | |
| prompt | Yes | The prompt MIND will execute every time the job runs. Required for 'create', recommended for 'update'. | |
| responseTemplate | Yes | Optional template that guides the shape of MIND's response. Used by 'create' and 'update'. | |
| frequencyValue | Yes | How many time units between runs (e.g. 1 for 'every 1 day'). Required for 'create' alongside frequencyUnit. | |
| frequencyUnit | Yes | Unit for the recurrence (HOURS, DAYS, WEEKS, MONTHS). Required for 'create' alongside frequencyValue. | |
| invokeAt | Yes | When the automated prompt should first run. Required for 'create'. Must be at least 15 minutes in the future. Time format is in ISO 8601 format. Both UTC ("2025-08-04T20:54:27.123Z") and time zone offsets ("2025-08-04T13:54:27.123-07:00") are accepted to ensure an unambiguous point in time. | |
| permissionGroupUuid | Yes | UUID of the permission group/role that owns the job. Users in this role (or a higher role) can view and edit the job, and MIND uses this role's permissions when running the prompt. Required for 'create'. | |
| notifyUserUuids | Yes | User UUIDs to email-notify when MIND finishes a run. These users must be members of the permission group set above. Used by 'create' and 'update'. Pass an empty array to clear existing notifyees on 'update'. | |
| lastEvaluatedKey | Yes | Pagination cursor returned by a previous 'list' or 'get-history' call. Pass to fetch the next page. | |
| maxPageSize | Yes | Maximum number of items per page for 'list' and 'get-history'. | |
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| settings | No | Returned by 'get', 'create', and 'update'. |
| settingsList | No | Returned by 'list'. |
| lastEvaluatedKey | No | Pagination cursor for the next page; absent when no more pages. |
| chatHistory | No | Returned by 'get-history'. |
| verifyResult | No | Returned by 'verify-scheduled'. Schedule expression and timezone for the next trigger. |
| success | No | Returned by 'delete' and 'share-response'. |
| error | No | An error message if the request failed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It discloses that deleting removes stored responses, timestamps are ISO 8601, and includes warnings about large responses with filtering options. It lacks details on rate limits or auth requirements, but overall is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (overview, modes, notes, output filtering) and front-loaded with a summary. It is thorough but not overly verbose; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (15 parameters, conditional requirements, multiple modes), the description is highly complete. It explains each mode's parameters, pagination, output filtering, and edge cases. Output schema exists, so return values need not be described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds significant value beyond the schema: it explains conditional requirements (e.g., invokeAt must be 15+ minutes future), relationships between parameters (notifyUserUuids must be in permissionGroupUuid), and usage of pagination cursors.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it manages automated prompts with explicit verbs like list, inspect, create, update, delete, page, share, verify. It distinguishes itself from sibling tools by focusing solely on automated prompts, with no overlap in purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides detailed usage guidance for each mode, including required and optional parameters, pagination, and a note to use 'user-tool' for UUID lookup. It does not explicitly state when not to use this tool, but the alternative is clear given its unique functionality.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
camera-toolC
This tool can perform some action pertaining to the video stream of a camera. There are four types of requests that can be passed into "requestType":
image
get-settings
get-media-uris
get-ai-thresholds
What follows is a description of the behavior of this tool given the requestType "image"
This tool should be used any time someone wants to specify a subset of cameras to use for a task, based on some features that the camera sees. For example, interior cameras, cameras facing the street, cameras with a view of X, Y, Z, etc.
For instance if someone says "I want X using cameras with Y" then this tool should get a snapshot of the image to answer the question of if the camera satisfies the Y predicate.
This tool captures and returns a real-time snapshot from a designated security camera. The image reflects the current scene in the camera's field of view and serves as a contextual input source for downstream tasks such as object recognition, anomaly detection, incident investigation, or situational assessment. When invoked, the tool provides the following:
Visual Scene Capture: A high-resolution image of what the camera is actively observing, including people, vehicles, license plates, and any detectable objects.
The frameUri that was used to fetch the image. It may be useful to show the user this image as well through the frameUri.
What follows is a description of the behavior of this tool given the requestType "get-settings"
This tool retrieves the current configuration for a specified camera or associated device (e.g., sensor, access controller). The returned JSON object can include detailed camera settings (e.g., resolution, bitrate) and various device-specific configurations (e.g. storage settings).
NOTE: To update camera settings, use the update-tool instead.
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| cameraUuid | Yes | the camera uuid requested | |
| timestampISO | Yes | the timestamp for the image. This will default to 5 minutes before the current time. You can also call time-tool to parse the user's time description. Time format is in ISO 8601 format. Both UTC ("2025-08-04T20:54:27.123Z") and time zone offsets ("2025-08-04T13:54:27.123-07:00") are accepted to ensure an unambiguous point in time. | |
| requestType | Yes | ||
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is inconsistent: it claims 'real-time snapshot' for 'image' but the timestampISO defaults to 5 minutes ago. There is no mention of destructive side effects, authentication needs, or rate limits. The behavior for two request types is completely omitted. Annotations are absent, so the description fails to provide sufficient transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is verbose, with redundant statements (e.g., multiple mentions of snapshot behavior). The structure is split by request type but includes a general 'Output filtering' section that could be better integrated. Some sentences are unnecessary, and the overall length could be reduced.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema, the description should explain return values for all request types. It partially does for 'image' (image and frameUri) and 'get-settings' (JSON object), but ignores 'get-media-uris' and 'get-ai-thresholds'. The filtering parameters are described, but the data structure for settings is not detailed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds value to requestType (lists enum values), timestampISO (default and format), and the filtering parameters (includeFields, filterBy) with warnings about large responses. For cameraUuid, it relies on the schema's description. With 80% schema coverage, the description effectively supplements the remaining details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description lists four request types but only describes 'image' and 'get-settings' in detail. The general introduction ('perform some action pertaining to the video stream') is vague, and the usage example about selecting cameras based on features is mixed into the 'image' section, causing confusion. The other two request types remain undefined, reducing clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
For 'image', an example scenario is provided (selecting cameras based on features). For 'get-settings', a clear note directs to use update-tool for changes. However, no guidance is given for 'get-media-uris' and 'get-ai-thresholds', and the overall context of when to use each request type is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
camera-uptime-toolA
This tool analyzes camera uptime and reliability over a time period. It computes uptime percentages, outage counts, and longest outage durations.
It has the following modes of operation, determined by the "requestType" parameter:
get-camera-uptime: Get uptime statistics for a single camera. Requires cameraUuid, startTimeSec, and endTimeSec.
get-fleet-uptime: Get uptime statistics for ALL cameras in the organization, sorted by worst uptime first. Includes a fleet-wide summary with averages. Requires startTimeSec and endTimeSec.
startTimeSec and endTimeSec are UNIX timestamps in seconds.
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| requestType | Yes | The type of uptime request to make. | |
| cameraUuid | Yes | Camera UUID. Required for 'get-camera-uptime'. | |
| startTimeSec | Yes | Start time as UNIX timestamp in seconds. Required for all requests. | |
| endTimeSec | Yes | End time as UNIX timestamp in seconds. Required for all requests. | |
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cameraUptime | No | Uptime stats for a single camera |
| fleetUptime | No | Uptime stats for all cameras in the fleet, sorted by worst uptime first |
| fleetSummary | No | Fleet-wide uptime summary |
| error | No | An error message if the request failed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It thoroughly discloses the tool's behavior: computes statistics, requires timestamps, enumerates modes, and warns about large responses with advice on includeFields/filterBy. The only minor gap is not explicitly stating that it is a read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured into sections (summary, modes, timestamps, output filtering). It is slightly verbose due to repeated examples for filterBy/includeFields, but overall it is efficient and front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (6 params, enums, large responses) and the presence of an output schema (not shown but declared), the description is largely complete. It covers all modes, parameter requirements, and output filtering. It does not detail the exact return fields, but that is acceptable since an output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds value by explaining how parameters relate to modes (cameraUuid required only for get-camera-uptime), specifying that startTimeSec and endTimeSec are UNIX timestamps, and reiterating the filterBy/includeFields usage with detailed examples and warnings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool analyzes camera uptime and reliability, computing uptime percentages, outage counts, and longest outage durations. It distinguishes two specific modes (single camera vs fleet), which helps the agent differentiate from sibling tools like 'camera-tool' or 'events-tool'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly defines when to use each mode (single camera vs fleet), but it lacks guidance on when to prefer this tool over similar tools (e.g., 'camera-tool' for broader camera data). No when-not-to-use or alternative recommendations are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clips-toolA
Retrieves saved video clips from the Rhombus system. Saved clips can be viewed for up to 2 years and are typically found in the "Clips" tab of the "Saved Video" section of the Rhombus Console. Clips are either manually saved by the user, or automatically by some defined policy. Therefore, this tool is not for looking up the events that have occured.
This tool allows you to:
Get saved clips or clips expiring soon (filter by devices, locations, search string, time range).
Get all shared live video streams for the organization.
Get all timelapse clips for the organization.
Filter options (for saved and expiringSoon only):
Specific devices using their UUIDs (deviceUuidFilters).
Specific locations using their UUIDs (locationUuidFilters).
A simple string search on clip names (searchFilter).
A time range: start (timestampISOAfter) and/or end (timestampISOBefore) timestamp in ISO 8601 format.
The tool returns a JSON object with the following structure and important fields:
errorMsg (string | null): An error message if the request failed.
objecterror (boolean | null): Indicates if an object-level error occurred.
pageToken (string | null): A token to be supplied on the next search request to get the next page of results. If this token is null, there is no more data available.
savedClips (array of objects | null): An array where each object represents a saved video clip. Each clip object contains the following important fields:
uuid (string): The unique identifier for the video clip.
title (string): The name given to the video clip.
description (string | null): An optional description for the clip.
timestampMs (int64): The start time of the video clip in milliseconds since epoch.
createdAtMs (int64): The creation timestamp of the clip in milliseconds since epoch.
createdAtTimestamp (string): The creation timestamp of the clip in ISO 8601 format.
deviceUuid (string): The UUID of the primary device (e.g., camera) that recorded the clip.
deviceUuids (array of strings or null): A list of UUIDs for all devices associated with the clip.
durationSec (int32): The length of the video clip in seconds.
status (string): The current processing status of the clip, with possible values such as INITIATING, UPLOADING, RENDERING, FAILED, COMPLETE, OFFLINE, or UNKNOWN.
userUuid (string | null): The UUID of the user associated with the clip, if applicable.
sourceAlertUuid (string | null): The UUID of the alert that triggered the creation of this clip, if any.
sharedLiveVideoStreams (array): When requestType is sharedLiveStreams, list of shared live video stream objects.
timelapseClips (array): When requestType is timelapseClips, list of timelapse clip objects.
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| requestType | Yes | The type of data to retrieve. Use "saved" for regular saved clips, "expiringSoon" for clips nearing expiration, "sharedLiveStreams" for all shared live video streams, or "timelapseClips" for all timelapse clips. | |
| deviceUuidFilters | Yes | A list of UUIDs representing specific devices to filter clips by. Only clips emitted by these devices will be returned. Please truncate any facets, such as .v0. It is always 22 characters long. | |
| locationUuidFilters | Yes | A list of UUIDs representing specific locations to filter clips by. Only clips associated with these locations will be returned. Please truncate any facets, such as .v0. It is always 22 characters long. | |
| searchFilter | Yes | A simple string to search for within the names of the clips. | |
| timestampISOAfter | Yes | The start of the time range for which to retrieve clips. Only clips that occurred AFTER this timestamp will be returned. Required when requestType is saved or expiringSoon.Time format is in ISO 8601 format. Both UTC ("2025-08-04T20:54:27.123Z") and time zone offsets ("2025-08-04T13:54:27.123-07:00") are accepted to ensure an unambiguous point in time. | |
| timestampISOBefore | Yes | The end of the time range for which to retrieve clips. Only clips that occurred BEFORE this timestamp will be returned. Required when requestType is saved or expiringSoon.Time format is in ISO 8601 format. Both UTC ("2025-08-04T20:54:27.123Z") and time zone offsets ("2025-08-04T13:54:27.123-07:00") are accepted to ensure an unambiguous point in time. | |
| clipUuid | Yes | UUID of a clip. Required for 'deleteClip'. | |
| spliceRequest | Yes | Required for 'createClip'. Specifies the camera and time range for the new clip. | |
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| savedClips | No | |
| expiringClips | No | |
| sharedLiveVideoStreams | No | |
| timelapseClips | No | |
| clipGroups | No | List of clip groups/folders |
| sharedClipGroups | No | List of shared clip groups |
| spliceResult | No | Result of creating a new clip |
| deleteResult | No | Result of deleting a clip |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. The description focuses on retrieving clips but the input schema includes createClip and deleteClip requestTypes, which are not mentioned in the description text. This creates a mismatch; the agent might not know the tool can also create or delete clips. The description does not disclose any destructive behavior or mutations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed and structured with bullet points and sections, but it is quite lengthy. It front-loads the main purpose, but includes extensive output schema details that could be in the output schema itself. Some redundancy exists (e.g., warning about large responses appears in both description and parameter descriptions). Could be more concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (10 parameters, output schema exists), the description is fairly complete regarding retrieval operations and output filtering. It mentions retention period and warns about large responses. However, it omits the create/delete capabilities, which are part of the tool's functionality, making it incomplete for a full understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds significant meaning beyond the schema by explaining filter options, output structure, and output filtering (includeFields, filterBy). It provides context for requestType values and clarifies that timestamps are in ISO 8601 format with examples. This adds value beyond the schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves saved video clips from the Rhombus system, with specific verb and resource. It distinguishes itself from the events-tool by explicitly saying 'This tool is not for looking up the events that have occured.' It also lists multiple request types, making the purpose clear and differentiating from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit context for when to use the tool (retrieving clips) and when not (events). It explains filter options and output filtering. However, it does not mention alternatives among siblings beyond events-tool, and does not give guidance on when to use different requestTypes like createClip or deleteClip.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
count-toolA
This tool counts the number of items by accepting an array of UUIDs. It can count anything that has UUIDs - users, devices, records, or any other entities. Simply provide an array of UUID strings and it will return the precise count.
| Name | Required | Description | Default |
|---|---|---|---|
| uuids | Yes | An array of UUID strings representing the items to count. Each string should be a valid UUID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It states it returns a 'precise count' but does not specify whether duplicates are counted, how invalid UUIDs are handled, or if the operation has side effects. The description is basic and omits important details for full transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loads the purpose, and contains no unnecessary wording. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and lack of output schema, the description adequately explains the input and return value. It could mention edge cases (empty array, invalid UUIDs), but is sufficient for basic usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both the array and its items. The description adds no significant meaning beyond what the schema already provides, meeting the baseline for a well-documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool counts items by accepting UUIDs. It specifies the verb 'count' and resource 'items by UUIDs', distinguishing it from siblings like search-tool which return data rather than counts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells the agent to use this tool when needing a count of UUID-identified items, but does not explicitly exclude alternatives or mention when not to use it. The context is clear but lacks explicit differentiation from siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create-camera-policy-toolB
A tool for creating a camera policy that walks users through a multi-step process.
The step begins with the user providing a policy name, description, and organization UUID. Then, the user is presented with a form to configure the schedules for the policy. Finally, the user is presented with a form to assign the policy to cameras.
Uses elicitation forms for rich user interaction.
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Policy name (for creating policy) | |
| description | Yes | Policy description (for creating policy) | |
| orgUuid | Yes | Organization UUID (for creating policy) | |
| policyUuid | Yes | Policy UUID (for configuring schedules) | |
| scheduleConfigs | Yes | JSON string of schedule configurations | |
| cameraUuids | Yes | Comma-separated camera UUIDs to assign policy to | |
| policyName | Yes | Policy name (for reference) | |
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| needUserInput | No | |
| message | No | The message for this stage in the policy creation process. This message will be displayed to the user. |
| requestType | No | The type of form to display to the user as the next step in the policy creation process |
| submitAction | No | The action to take when the user completes the form, corresponds to the tool name to interact with next |
| policyUuid | No | The UUID of the policy that was created during this workflow |
| policyName | No | The name of the policy that was created during this workflow |
| scheduleData | No | The schedules that were created during this workflow, can be null or undefined if user has not created them yet with schedule-trigger-configuration |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It mentions the multi-step process and 'uses elicitation forms for rich user interaction,' hinting at interactive behavior. However, it does not disclose side effects (e.g., persistent resource creation), required permissions, or error states. The generic output filtering warnings are not behavioral.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is verbose, with a large block of generic output filtering instructions that are not specific to this tool. The core purpose and steps are stated concisely, but the boilerplate text should be removed or placed elsewhere. This hurts readability and conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (9 required parameters, multi-step process, output schema exists), the description covers the workflow adequately but does not explain the return value, success indications, or error conditions. The output filtering section adds noise rather than completeness. The description is sufficient but not thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the input schema already describes all 9 parameters. The description adds some context by explaining the steps (e.g., first three parameters for creation, then scheduleConfigs, then cameraUuids). However, it does not add significant semantics beyond what the schema descriptions already provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: creating a camera policy via a multi-step process. It distinguishes from siblings like policy-alerts-tool by focusing on policy creation. However, the generic output filtering section slightly clutters the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description outlines the three steps (create, configure schedules, assign cameras), which helps the agent understand the workflow. However, it lacks explicit instructions on when to use this tool over alternatives or when not to use it. No sibling tool directly competes, so the guidance is adequate but not exemplary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
door-schedule-exception-toolA
This tool manages Rhombus door schedule exceptions. A door lock/unlock exception is a one-time rule used to change an access controlled door's locked/unlocked state. If a lock/unlock exception is enabled, it will overwrite the existing lock/unlock schedule. A schedule exception allows you to create a custom schedule that is only active for the specified dates/times. Once the date/time a schedule exception is set for passes, the original schedule will resume.
Door schedule exceptions can be either expired or not expired. If its scheduled date is in the past, then it is expired. Users through the web console can toggle whether to see expired door schedule exceptions or not. Please mirror this behavior when responding to the user.
It has the following modes of operation, determined by the "requestType" parameter:
create-exception: Create a door schedule exception. Requires exception (DoorScheduleExceptionType object). If locationUuid is missing but doorUuids are provided, the tool will resolve the location automatically.
delete-exception: Delete a door schedule exception. Requires exceptionUuid.
find-exceptions: Find door schedule exceptions across the organization, optionally filtered by date range.
find-exceptions-for-location: Find door schedule exceptions for a location. Requires locationUuid. Supports optional date range filters.
find-exceptions-for-door: Find door schedule exceptions for a door. Requires doorUuid. Supports optional date range filters.
get-exception: Get a single door schedule exception by UUID. Requires exceptionUuid.
update-exception: Update a door schedule exception. Requires exception (DoorScheduleExceptionType object). If intervals are omitted but defaultState and date range are provided, the tool will generate a full-day interval.
Use get-entity-tool to look up location and door UUIDs when needed.
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| requestType | Yes | The type of door schedule exception request to make. | |
| exceptionUuid | Yes | Door schedule exception UUID. Required for 'get-exception' and 'delete-exception'. | |
| locationUuid | Yes | Location UUID. Required for 'find-exceptions-for-location'. | |
| doorUuid | Yes | Door UUID. Required for 'find-exceptions-for-door'. | |
| exception | Yes | DoorScheduleExceptionType object. Required for 'create-exception' and 'update-exception'. | |
| localStartDateRangeStart | No | Optional date range filter (inclusive) for local start date beginning (yyyy-MM-dd). | |
| localStartDateRangeEnd | No | Optional date range filter (inclusive) for local start date end (yyyy-MM-dd). | |
| localEndDateRangeStart | No | Optional date range filter (inclusive) for local end date beginning (yyyy-MM-dd). | |
| localEndDateRangeEnd | No | Optional date range filter (inclusive) for local end date end (yyyy-MM-dd). | |
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| exception | No | Single door schedule exception result. |
| exceptions | No | List of door schedule exceptions. |
| deleted | No | Delete result. |
| expiredACDLicensesDoorUuids | No | Door UUIDs with expired access control licenses. |
| unassignedACDLicensesDoorUuids | No | Door UUIDs with unassigned access control licenses. |
| warningMsg | No | Warning returned by backend, if any. |
| error | No | An error message if the request failed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that exceptions overwrite existing schedules temporarily, that expired exceptions are in the past, and that omitting intervals can generate full-day intervals. Since no annotations exist, the description adequately covers behavior without contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a general overview, mode list, and output filtering section. While thorough, some repetition (e.g., definition of expired) lengthens it slightly without significant loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is highly complete given the tool's complexity. It explains the domain (schedule exceptions), all modes, parameter relationships, output filtering, and response size warnings. No gaps are apparent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All input parameters have schema descriptions (100% coverage). The description adds valuable context beyond the schema, such as automatic location resolution when missing and default interval generation. This goes above the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it manages door schedule exceptions and enumerates all modes of operation with specific actions. It differentiates from siblings by focusing on temporary schedule overrides, but does not explicitly contrast with other tools like door-tool or access-control-tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance for each requestType, explains automatic location resolution, references get-entity-tool for UUID lookups, and notes mirroring web console behavior for expired exceptions. Lacks explicit when-not-to-use instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
door-toolB
This tool manages Rhombus door controller rules and door policies.
It has the following modes of operation, determined by the "requestType" parameter:
get-door-controller-rules: Get all rules for a specific door controller. Requires doorControllerUuid.
create-door-controller-rule: Create a new rule for a door controller. Requires doorControllerUuid and ruleConfig (JSON string).
get-door-policies: Get all door alert policies in the organization.
create-door-policy: Create a new door policy. Requires policyName and policyConfig (JSON string).
Use the get-entity-tool to find door controller and access controlled door UUIDs.
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| requestType | Yes | The type of door operation to perform. | |
| doorControllerUuid | Yes | The UUID of the door controller device. Required for 'get-door-controller-rules' and 'create-door-controller-rule'. | |
| ruleConfig | Yes | JSON string of the door controller rule configuration. Required for 'create-door-controller-rule'. | |
| policyName | Yes | The name for the new door policy. Required for 'create-door-policy'. | |
| policyConfig | Yes | JSON string of door policy configuration. Required for 'create-door-policy'. | |
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| doorControllerRules | No | List of door controller rules |
| createdRule | No | Result of creating a door controller rule |
| doorPolicies | No | List of door policies |
| createdPolicy | No | Result of creating a door policy |
| error | No | An error message if the request failed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It explains the four modes and warns about large responses, but omits behavioral traits like error handling, idempotency of creation operations, required permissions, or side effects. This is a partial disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections for modes and output filtering. It is front-loaded with the core purpose. Minor redundancy (e.g., repeating 'Requires' in each bullet) could be trimmed, but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the multi-mode complexity and presence of an output schema, the description covers the basics: modes, required params for each, and filtering. Missing context includes error conditions, dependency availability, and what the response contains for creation operations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. The description adds value by organizing parameters by requestType, explaining required dependencies, and providing examples for includeFields and filterBy. This goes beyond the schema's own descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it manages Rhombus door controller rules and door policies, and lists four specific operation modes with required parameters. However, it does not explicitly differentiate this tool from sibling tools like 'rules-tool' or 'access-control-tool', which could cause confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions using get-entity-tool to find UUIDs, but provides no guidance on when to use this tool versus other sibling tools (e.g., rules-tool for non-door rules). There is no 'when not to use' or alternative tool suggestions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
entity-lookup-toolA
Retrieves specific entities (or devices) by their UUIDs. Takes a list of device UUIDs and returns the device information for those specific devices. Use this tool when the user asks for details on devices' states and details about their licenses and features. The return structure is a JSON object that contains the states of the requested entities. This data is exact. Only devices with matching UUIDs will be returned.
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| deviceUuids | Yes | The UUIDs of the devices to look up. | |
| timeZone | Yes | The timezone for formatting timestamps. This is necessary for the tool to produce accurate formatted timestamps. | |
| tempUnit | Yes | The unit of temperature to return, if applicable. Default is Celsius. | |
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cameras | No | List of cameras matching the provided UUIDs |
| camerasCount | No | Number of cameras found |
| doorbellCameras | No | List of doorbell cameras matching the provided UUIDs |
| doorbellCamerasCount | No | Number of doorbell cameras found |
| badgeReaders | No | List of badge readers matching the provided UUIDs |
| badgeReadersCount | No | Number of badge readers found |
| accessControlledDoors | No | List of access controlled doors matching the provided UUIDs |
| accessControlledDoorsCount | No | Number of access controlled doors found |
| audioGateways | No | List of audio gateways matching the provided UUIDs |
| audioGatewaysCount | No | Number of audio gateways found |
| doorStates | No | List of door sensors matching the provided UUIDs |
| doorStatesCount | No | Number of door sensors found |
| climateStates | No | List of environmental sensors matching the provided UUIDs |
| climateStatesCount | No | Number of environmental sensors found |
| occupancySensorStates | No | List of motion sensors matching the provided UUIDs |
| occupancySensorStatesCount | No | Number of motion sensors found |
| buttonStates | No | List of buttons matching the provided UUIDs |
| buttonStatesCount | No | Number of buttons found |
| keypadStates | No | List of keypads matching the provided UUIDs |
| keypadStatesCount | No | Number of keypads found |
| minimalEnvironmentalGatewayStates | No | List of environmental gateways matching the provided UUIDs |
| minimalEnvironmentalGatewayStatesCount | No | Number of environmental gateways found |
| error | No | An error message if the request failed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses exactness ('Only devices with matching UUIDs will be returned') and large response warnings, but omits safety, idempotency, or permission details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise paragraphs: first states purpose, second provides critical output filtering guidance. Front-loaded main purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Explains return structure as JSON of device states. Output schema exists so full detail isn't needed. Covers essential usage aspects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, baseline 3. Description adds extra value beyond schema by warning about 400k character responses and advising use of includeFields/filterBy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves entities by UUIDs and returns device information including licenses and features, distinguishing it from sibling tools like search-tool which do free-text search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit context: 'Use this tool when the user asks for details on devices' states and details about their licenses and features.' Lacks explicit when-not-to-use but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
events-toolA
Scope: This tool returns raw, event-level data (individual events with timestamps). Use report-tool when you need aggregated counts, time-series summaries, or analytics over intervals.
Vehicles vs lpr-tool: eventType "camera" returns footage seekpoints from that camera's recording timeline—every activity type the API returns for the window (human motion, vehicle motion, and others depending on the camera and analytics). Some rows may include plate or vehicle metadata on the seekpoint. lpr-tool is still the right choice for org LPR workflows: saved vehicles, vehicle labels, fuzzy plate search, and vehicle event APIs—not a replacement for "everything this camera logged on its timeline."
This tool has multiple modes, set by "eventType": access-control, brivo-access-control, environmental-gateway, climate-sensor, component-events, camera. Use it when the user asks for specific events (unlocks, badge ins, credentials, arrivals, environmental readings, climate data, camera timeline activity, or other component events). It can return large result sets; keep time ranges narrow. For ranges spanning more than ~24 hours, prefer report-tool for aggregates. For maximum flexibility across event types at a location, use eventType "component-events".
When eventType is "brivo-access-control":
Retrieves badge/credential events from Brivo-integrated doors. Automatically fetches the Brivo integration configuration to determine which locations have Brivo doors mapped. No door UUIDs are required.
Use this when the user asks specifically about Brivo events, Brivo badge ins, Brivo access control, or events from Brivo doors.
Arguments:
startTime (string): Start of the time range (ISO 8601).
endTime (string): End of the time range (ISO 8601).
Returns:
integrationEnabled: Whether the Brivo integration is currently enabled.
brivoDoorsConfigured: Number of Brivo doors configured in the integration.
brivoDoors: List of Brivo doors with their IDs, names, and associated Rhombus location UUIDs.
events: Credential received events from all locations that have Brivo doors configured, sorted newest first.
Note: Events are fetched at the location level, so results may include events from all access-controlled doors at locations where Brivo is configured.
When eventType is "access-control":
Retrieves access control events (arrivals, badge ins, credentials, unlocks) for the given door(s). Can return a lot of data—use a narrow time range.
Arguments:
accessControlledDoorUuids (array of strings): UUIDs of the access-controlled doors.
startTime (string): Start of the time range (ISO 8601).
endTime (string): End of the time range (ISO 8601).
The credSource field indicates how the event was triggered:
REMOTE: Rhombus Key app remote unlock.
REMOTE (Admin): Unlock via Rhombus console or browser/mobile app.
BLE_WAVE: User waved hand over the reader.
NFC: User tapped badge or phone on the reader.
Retrieves environmental gateway events (sensor readings, derived values) for a device in a time range. Timestamps are in the device timezone, not necessarily UTC.
Arguments:
deviceUuid (string): UUID of the environmental gateway device.
startTime (string): Start of range (ISO 8601).
endTime (string): End of range (ISO 8601).
When eventType is "climate-sensor":
Retrieves climate sensor events (temperature, humidity, air quality, etc.) for a sensor in a time range. Timestamps are in the sensor timezone, not necessarily UTC.
Arguments:
sensorUuid (string): UUID of the climate sensor.
startTime (string): Start of range (ISO 8601).
endTime (string): End of range (ISO 8601).
limit (number, optional): Max events to return. Default 1000.
When eventType is "component-events":
Retrieves all component event types for a location in a time range. Most flexible option; filter by event type via componentEventTypes. Timestamps are in the location timezone, not necessarily UTC.
Arguments:
locationUuid (string): UUID of the location.
componentEventTypes (array, optional): Event types to include. If empty or omitted, returns all types.
startTime (string): Start of range (ISO 8601).
endTime (string): End of range (ISO 8601).
Valid event types include:
DoorbellEvent: Doorbell button press events
CredentialReceivedEvent: Badge/credential scans (NFC, BLE_WAVE, REMOTE unlocks)
DoorStateChangeEvent: Door state changes (locked/unlocked)
ButtonEvent: Generic button press events
PanicButtonEvent: Panic/emergency button activations
DoorReaderStateChangeEvent: Changes in door reader state
DoorRelayStateChangeEvent: Changes in door relay state
AccessControlUnitTamperEvent: Tamper detection events
AccessControlUnitBatteryStateChangeEvent: Battery state changes
WaveToUnlockIntentExpiredEvent: Wave-to-unlock timeout events
DoorAuthFirstInStateEvent: First-in authentication state events
DoorScheduleFirstInStateEvent: First-in schedule state events
And more (see input schema for full list).
When eventType is "camera":
Retrieves footage seekpoints for one camera: all activity types returned for the search window (not limited to human motion). Each item includes an activity string plus timestamp; plate/vehicle/face fields appear when the API provides them. Use lpr-tool for org LPR saved vehicles, labels, and dedicated plate search.
Arguments:
cameraUuid (string): UUID of the camera.
startTime (string): Start of range (ISO 8601).
duration (number): Search window in seconds. Default 3600 (1 hour).
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| eventType | Yes | The type of events to retrieve. access-control: Access control events like unlocks, badge ins, credentials, arrivals. brivo-access-control: Badge/credential events from Brivo-integrated doors. Does not require door UUIDs — automatically looks up which doors are configured via the Brivo integration. environmental-gateway: Environmental gateway events with sensor readings and derived values. climate-sensor: Climate sensor events with temperature, humidity, air quality readings. component-events: All types of component events for a location (most flexible option). camera: Footage seekpoints for one camera—all timeline activity types that camera recorded (human motion, vehicle motion, etc., depending on device/analytics). For org LPR saved vehicles, labels, and plate search APIs, use lpr-tool. button-press: Button press events from button sensors. occupancy: Occupancy sensor events with people count. proximity: Proximity tag events with RSSI readings. doorbell: Doorbell camera events. | |
| startTime | Yes | A timestamp representing when to start the search for access control events.Time format is in ISO 8601 format. Both UTC ("2025-08-04T20:54:27.123Z") and time zone offsets ("2025-08-04T13:54:27.123-07:00") are accepted to ensure an unambiguous point in time. | |
| endTime | Yes | A timestamp representing when to end the search for access control events.Time format is in ISO 8601 format. Both UTC ("2025-08-04T20:54:27.123Z") and time zone offsets ("2025-08-04T13:54:27.123-07:00") are accepted to ensure an unambiguous point in time. | |
| accessControlledDoorUuids | Yes | The UUIDs (array) of the access controlled doors. Required when eventType is 'access-control'. | |
| deviceUuid | Yes | The UUID of the environmental gateway device. Required when eventType is 'environmental-gateway' Can be obtained from the get-entity-tool for ENVIRONMENTAL_GATEWAY. | |
| sensorUuid | Yes | The UUID of the climate sensor. Required when eventType is 'climate-sensor'. Can be obtained from the get-entity-tool for SENSOR. | |
| limit | Yes | Maximum number of climate events to return. Only applicable when eventType is 'climate-sensor'. Default is 1000. Pass null for other event types. | |
| locationUuid | Yes | The UUID of the location. Required when eventType is 'component-events'. | |
| componentEventTypes | Yes | Array of component event types to filter by. Only applicable when eventType is 'component-events'. If empty or null, returns all event types. Valid values: DoorbellEvent, DoorReaderStateChangeEvent, DoorRelayStateChangeEvent, DoorPositionIndicatorStateChangeEvent, RequestToExitStateChangeEvent, CredentialReceivedEvent, ButtonEvent, GenericInputStateChangeEvent, GenericRelayStateChangeEvent, AccessControlUnitTamperEvent, AccessControlUnitLocationLockdownStateEvent, DoorLocationLockdownStateEvent, PanicButtonEvent, AccessControlUnitBatteryStateChangeEvent, WaveToUnlockIntentExpiredEvent, DoorStateChangeEvent, DoorAuthFirstInStateEvent, DoorScheduleFirstInStateEvent, AccessControlUnitDoorFirstInStateEvent, AperioDoorExtensionStateEvent, AperioGatewayStateEvent, AperioGatewayConnectionStateChangeEvent, AperioDtcEvent, AperioTamperStateEvent. | |
| timeZone | Yes | The timezone of the requested locations or devices. This is necessary for the tool to produce accurate formatted timestamps. | |
| cameraUuid | Yes | The unique identifier for the camera. Required when eventType is 'camera'. Can be obtained from the get-entity-tool for CAMERA. | |
| duration | Yes | Duration in seconds to search footage seekpoints. Required when eventType is 'camera'. Default is 3600 (1 hour). | |
| buttonSensorUuid | Yes | The UUID of the button sensor. Required when eventType is 'button-press'. | |
| occupancySensorUuid | Yes | The UUID of the occupancy sensor. Required when eventType is 'occupancy'. | |
| proximityTagUuids | Yes | Array of proximity tag UUIDs. Required when eventType is 'proximity'. | |
| doorbellCameraUuid | Yes | The UUID of the doorbell camera. Required when eventType is 'doorbell'. | |
| tempUnit | Yes | The unit of temperature to return. Default is Celsius. | |
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| eventType | No | |
| brivoAccessControlEvents | No | Brivo access control events. Fetches credential events from all locations that have Brivo doors configured in the integration. |
| accessControlEvents | No | Access control events data including badge ins, credentials, arrivals, etc., sorted by timestamp (newest first). |
| environmentalGatewayEvents | No | Environmental gateway events data including sensor readings and derived values |
| climateSensorEvents | No | Climate sensor events data including temperature, humidity, air quality, and other readings |
| componentEvents | No | Component events data for all types of access control events at a location, sorted by timestamp (newest first) |
| cameraEvents | No | Footage timeline seekpoints for the camera (all activity types returned in the window). Use with eventType "camera". |
| buttonPressEvents | No | Button press events |
| occupancyEvents | No | Occupancy sensor events |
| proximityEvents | No | Proximity tag events |
| doorbellEvents | No | Doorbell camera events |
| needUserInput | No | |
| commandForUser | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses behavioral traits like timezone handling for different modes, that camera mode returns all activity types, and that brivo access-control automatically fetches configuration. Warns about response size. No annotations are provided, so the description carries the full burden. Minor omissions like pagination or rate limits prevent a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear headers for each mode and a scope section. However, some repetition of start/end time descriptions across modes could be trimmed. Still efficient for a multi-mode tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all aspects: scope, mode selection, parameter requirements, output descriptions, filtering options, and sibling tool comparisons. Despite complexity, no obvious gaps. Output schema exists to supplement return value details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% description coverage, but the description adds significant value: clarifies which parameters are required per mode, explains defaults (duration=3600, limit=1000), and describes output structure for brivo mode. This is above baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns raw event-level data and distinguishes itself from siblings: report-tool for aggregates, lpr-tool for LPR workflows. Each eventType mode is explicitly described.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use this tool vs alternatives (report-tool, lpr-tool) and within the tool, which eventType to choose. Includes warnings about large result sets and suggests narrow time ranges.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faces-toolA
This tool interacts with the Rhombus face recognition system to retrieve information about face sightings and registered faces.
If the user is asking about how many people were seen (head count / occupancy), use the report-tool with GET_OCCUPANCY_ENABLED_CAMERAS and GET_OCCUPANCY_COUNT_REPORT instead. This tool (faces-tool) is best for identifying who was seen (unique individuals by name), and its face count data is also automatically included in report-tool people-counting responses via the faceCountEnrichment field.
Important for person-presence questions: When asked whether specific people were seen or are present, you should ALSO call events-tool with eventType "access-control" to check badge-in records. Face recognition and access control are complementary — someone may badge in without face recognition triggering, or be seen by a camera without badging in.
If the requestType is "get-face-events":
Use this tool to answer questions about face sightings, including questions like "who was in the office" or "who was seen today". Can be used for reporting, to generate a report on who was seen by the camera system.
Automatic name resolution: You can pass partial or first-name-only names in faceNames (e.g., "Brandon", "Omar"). The tool automatically looks up the registered faces directory and resolves them to exact names and person UUIDs before searching. Check the "resolvedNames" field in the response to see what each queried name was matched to (null means no match found).
You can filter face events using parameters like 'faceNames', 'hasEmbedding', 'hasName', 'labels', 'locationUuids', 'personUuids', and a time range using 'rangeStart' and 'rangeEnd' (timestamps in milliseconds).
If you'd like to know about all face events at a location, pass in a location UUID and no device UUIDs. This will correctly return all face events at that location.
When the user asks about a specific person at a location (e.g. "Jane Doe at Main Office"), call get-registered-faces first to get the list of registered names, find the best match, then call get-face-events with that precise name. The tool expects precise names as stored in the system.
When querying faces at a location, pass only the location UUID in searchFilter; do not pass device UUIDs in searchFilter.deviceUuids, so the API returns all faces detected at that location.
If the requestType is "get-registered-faces":
This tool retrieves a list of all people (registered faces) currently known to the Rhombus system for your organization. This list includes information about each registered person, including their assigned labels.
This returns ALL people registered in the system, regardless of the provided timestampFilter.
Each person in the response includes a "labels" array showing which label groups they belong to (e.g., "Engineering", "Visitors"). Use these labels to answer questions about groups of people.
If the requestType is "get-person-labels":
This retrieves a mapping of all person UUIDs to their assigned labels across the organization.
Use this to discover what label groups exist and which registered faces belong to each group.
Useful when the user asks about a group (e.g., "was anyone from Engineering seen today?") — get the labels first, find the person UUIDs for that label, then query face events filtered by those personUuids or labels.
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| requestType | Yes | ||
| faceEventFilter | Yes | ||
| timeZone | Yes | The timezone for formatting timestamps which should come from the location of the camera for the face event. This is necessary for the tool to produce accurate formatted timestamps. | |
| faceEventUuid | Yes | UUID of a face event to search similar faces from. Required for 'search-similar-faces'. | |
| personUuid | Yes | UUID of a person to get face events for. Required for 'get-face-events-by-person'. | |
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| requestType | Yes | |
| getFaceEventsResponse | No | A list of all people seen over the given time period. |
| getSavedFacesResponse | No | A list of all people (registered faces) currently known to the Rhombus system for your organization. |
| getPersonLabelsResponse | No | A map of person UUIDs to their assigned label arrays. Use this to discover what label groups exist and which people belong to them. |
| resolvedNames | No | When faceNames are provided in a get-face-events request, this shows how each queried name was automatically resolved to a registered face. Key is the queried name (e.g., 'Brandon'), value is the matched registered name (e.g., 'Brandon Salzberg') or null if no match was found. Use these resolved names when reporting results to the user. |
| similarFaceEvents | No | Similar face event results |
| faceMatchmakers | No | Face matchmaker records |
| personFaceEvents | No | Face events for a specific person |
| lastEvaluatedKey | No | For paginated requests, this is the returned last evaluated key that can be passed back in on the next request to get the next page of results |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It explains automatic name resolution, filtering behavior, large response warnings, and the faceEventFilter scope. However, it does not explicitly state if the tool is read-only or mention any rate limits. Overall, it adds significant behavioral context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with headings for each requestType and output filtering, but it is verbose and contains some repetition (e.g., location UUID advice appears twice). It could be more concise while retaining clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 parameters, multiple requestTypes, nested objects, and an output schema), the description is comprehensive. It covers all requestType behaviors, sibling tool relationships, parameter usage, and response size warnings. The presence of an output schema does not detract from the description's completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 71%, but the description adds substantial value: it explains automatic name resolution for faceNames, precedence of faceNameContains, default time range of 7 days, and the use of includeFields/filterBy to manage large responses. It also clarifies that searchFilter only applies to get-face-events. This enhances understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: interacting with the Rhombus face recognition system to retrieve face sightings and registered faces. It distinguishes itself from sibling tools like report-tool (for head count) and events-tool (for access control), and provides specific usage for each requestType.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool vs alternatives, e.g., 'If the user is asking about how many people were seen, use the report-tool' and 'When asked whether specific people were seen... also call events-tool'. It provides clear context and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-entity-toolA
Retrieves entities (or devices) of certain types. Can request multiple entity types at once. The return structure is a JSON string that contains the states of the requested entities. This data is exact. Whatever entities exist will be returned here.
This is the primary tool for checking device health and connectivity status. Each device in the response includes a "connected" boolean field indicating whether it is currently online (true) or offline (false). When asked about device health, offline devices, or connectivity issues, use this tool to fetch all device types and check the "connected" field to identify which devices are offline or unreachable.
| Name | Required | Description | Default |
|---|---|---|---|
| entityTypes | Yes | What type of entities to retrieve. | |
| filterBy | No | Additional filters that can be applied to the result. Omit or pass null for no filtering. | |
| timeZone | Yes | The timezone for formatting timestamps. This is necessary for the tool to produce accurate formatted timestamps. | |
| tempUnit | Yes | The unit of temperature to return, if applicable. Default is Celsius. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses that data is exact and includes a 'connected' boolean field. However, it does not mention potential side effects, access restrictions, or response size limits. Adequate but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two paragraphs, front-loaded with the core action. The second paragraph elaborates on the primary use case. Concise overall; no unnecessary fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description covers the essential aspects: purpose, use case, return structure (JSON string with states), and key behavioral detail (connected field). Could clarify that all entity types are considered 'devices' for health checks.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, baseline is 3. The description adds minimal new meaning to parameters beyond the schema's own descriptions. It notes the tool can request multiple types at once, which is already implied by the array schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it retrieves entities/devices and specifies it is the primary tool for device health checks. It distinguishes from siblings by implication but does not explicitly differentiate from entity-lookup-tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: 'When asked about device health, offline devices, or connectivity issues, use this tool.' Does not mention when not to use or provide alternatives, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-org-informationB
Get general information about the organization including org name, camera configuration defaults, contact information, and org settings.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description does not disclose any behavioral traits beyond the basic function. There are no annotations, so the description carries full burden but fails to mention if it is read-only, if authentication is needed, or any side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler. It is concise and well-structured, though brief.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters, no output schema), the description is mostly complete. It lists key outputs but could mention behavior like caching or error handling. Still, it is adequate for a basic info getter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the schema coverage is 100%. The description adds value by listing the types of information returned, which goes beyond the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool retrieves organization information and lists examples (org name, camera config defaults, etc.). It is specific and uses a verb-resource pair, but does not distinguish from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. There is no mention of context, prerequisites, or when not to use it. Given many sibling tools, this is a gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
guest-management-toolA
This tool manages Rhombus guest/visitor operations. It can list all guests, retrieve activity logs, and filter activities by location.
It has the following modes of operation, determined by the "requestType" parameter:
get-all-guests: List all guests across the organization with their check-in status, host, company, and contact info.
get-activity-logs: Get org-wide guest activity logs (sign-ins, sign-outs). Supports optional time range filtering via startTimeMs/endTimeMs.
get-activities-for-location: Get guest activity logs for a specific location. Requires locationUuid. Supports optional time range filtering.
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| requestType | Yes | The type of guest management request to make. | |
| locationUuid | Yes | Location UUID. Required for 'get-activities-for-location'. | |
| startTimeMs | Yes | Start time filter in milliseconds since epoch. Optional for activity queries. | |
| endTimeMs | Yes | End time filter in milliseconds since epoch. Optional for activity queries. | |
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| guests | No | List of guests in the organization |
| activities | No | List of guest activity log entries |
| error | No | An error message if the request failed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that responses can exceed 400k characters and provides filtering mechanisms. It implies read-only operations (listing, retrieving logs) without stating destructive effects, which is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with modes enumerated in bullet points, but it is somewhat lengthy. Every sentence adds value, including the warnings about large responses. Could be slightly more concise, but structure is good.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (three modes, six parameters, output schema exists), the description covers all essential aspects: modes, required parameters, optional time filters, and output filtering. The warning about large responses is critical. Output schema existence reduces need to describe return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, baseline 3. The description adds context about the three request types and explains the filterBy and includeFields parameters with examples and warnings, providing value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it manages Rhombus guest/visitor operations and lists three specific modes (get-all-guests, get-activity-logs, get-activities-for-location), each with a clear purpose. It distinguishes from sibling tools by the guest management focus.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use each mode based on the requestType parameter and provides filtering guidance (includeFields, filterBy) to handle large responses. It doesn't explicitly state when not to use this tool vs alternatives, but the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
location-toolB
This tool performs operations on locations.
'get': Retrieves all locations. When generating reports with location details, use location names not uuids.
'create': Creates a new location with a name and optional address.
'update': Updates an existing location (requires locationUuid).
'get-labels': Retrieves all location labels for the organization.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| locationUpdate | Yes | ||
| locationName | Yes | Name for the new location. Required for 'create'. | |
| locationAddress | Yes | Address for the location. Optional for 'create' and 'update'. | |
| locationUuid | Yes | UUID of the location. Required for 'update'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must fully disclose behavior. It mentions actions but fails to explain side effects, error handling, authentication needs, or conditional parameter usage clearly. The required parameters in schema conflict with conditional actual use, creating potential confusion.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and structured by action with hyphens. The opening sentence is slightly redundant but overall it is well-organized and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-action tool with 5 conditional parameters and no output schema, the description lacks critical details—such as mapping parameters to actions explicitly. It omits information about the locationUpdate parameter and fails to clarify that most parameters are only required for specific actions, leaving the agent underinformed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, with three parameters having descriptions. The description adds marginal value by noting name vs UUID preference, but does not clarify the locationUpdate object or action enum beyond what schema provides. It does not significantly enhance schema meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it performs operations on locations and lists four specific actions (get, create, update, get-labels). However, it lacks differentiation from sibling tools like camera-tool or door-tool, which might overlap conceptually.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides some usage hints, such as using location names over UUIDs for reports, and notes requirements for update and create actions. However, it does not explicitly guide when to use this tool versus siblings, or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lpr-toolA
This tool interacts with the Rhombus LPR system to retrieve information about license plate recognition events and registered license plates.
Vs events-tool (camera): events-tool with eventType camera returns that camera’s VOD footage seekpoints (many activity types on the timeline, including vehicle-related activity when present). lpr-tool is for the LPR product surface: plate events, saved vehicles, labels, and plate search APIs across the org—use it when the user needs registry, labeling, or org-wide LPR queries, not only “what showed up on this camera’s timeline.”
The system's cameras may have LPR enabled, and when it is enabled, it will detect "license plate recognition" events when it sees a license plate come into view. However, it is possible that the recognized license is only a partial match, so keep that in mind when using this tool. Users will be able to save license plates into the system, and then additionally label them with a name.
Regarding vehicle labels: Users in the Rhombus LPR system can assign labels to vehicles. When a vehicle (license plate) is assigned a label, and then later is recognized by a rhombus security camera, it will attach the label to the event and will be available on the events returned from (get-saved-vehicles).
You should use the location-tool if trying to pair vehicle events to a particular location. Never use location UUIDs in reports, use names.
As such, if the user is asking anything about a label or labels it would be best practice to first call get-vehicle-labels and then get-vehicle-events or get-vehicle-events.
This tool has 3 modes of operation, determined by the "requestType" parameter:
get-vehicle-events: Retrieves a list of vehicle events that have been detected by the system. Please keep in mind that this has the potential to return a lot of data. However, 7 days should be a reasonable time range to start from if the user is not specific.
get-saved-vehicles: Retrieves a list of saved vehicles that have been saved in the organization.
get-vehicle-labels: Retrieves a list of vehicle labels that have been saved in the organization.
Its very likely that "vehicle", "car", and "license plates" are used interchangeably. Please keep this in mind.
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| requestType | Yes | Org LPR operation (vehicle events, saved vehicles, labels, plate search, save vehicle). Per-camera VOD timeline seekpoints use events-tool (eventType camera). | |
| vehicleEventsArgs | Yes | Only necessary for requestType 'get-vehicle-events' | |
| timeZone | Yes | The timezone for formatting timestamps which should come from the location of the device for the LPR event, or the user's timezone. This is necessary for the tool to produce accurate formatted timestamps. | |
| licensePlateQuery | Yes | License plate number to search. Required for 'search-license-plates'. | |
| vehicleName | Yes | Name for the vehicle. Required for 'save-vehicle'. | |
| vehicleLicensePlate | Yes | License plate for the vehicle. Required for 'save-vehicle'. | |
| vehicleDescription | Yes | Description for the vehicle. Optional for 'save-vehicle'. | |
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| vehicleEvents | No | A list of license plate events, as requested by the request typeget-vehicle-events |
| vehicleLabels | No | A list of vehicle labels, as requested by the request typeget-vehicle-labels |
| savedVehicles | No | A list of saved vehicles, as requested by the request typeget-saved-vehicles |
| licensePlateSearchResults | No | License plate search results |
| saveVehicleResult | No | Result of saving a vehicle |
| error | No | An error message if the request failed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It warns about potential large responses and partial matches. However, it claims '3 modes' while the schema includes 5 modes (missing search-license-plates and save-vehicle), which is a significant omission.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections, bold text for sibling tool comparison, and bullet-like formatting for modes. It front-loads the purpose. However, it is somewhat lengthy and repeats mode names unnecessarily.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers most aspects but misses two schema modes (search-license-plates, save-vehicle). Also lacks explanation of the output schema (though output exists). The description is fragmented with mode details mixed with general notes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by explaining which parameters are used for which modes and providing context like date range recommendation. It enhances understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool interacts with the Rhombus LPR system for license plate events and registered plates. It explicitly distinguishes itself from the events-tool, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use this tool vs. events-tool (camera), and mentions location-tool for pairing events with locations. Also gives a best practice for labels: first call get-vehicle-labels then get-vehicle-events.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
policy-alerts-toolA
Retrieves Rhombus policy alerts. Policy alerts in the Rhombus system are generated based on user-defined alert policies configured in the Rhombus Console. These policies trigger alerts when specific events occur, such as:
AI & Computer Vision Events: Based on intelligent video analytics for motion, people, vehicles, facial recognition, license plate recognition, or unusual behavior.
Device Status Changes: Like camera disconnections or sensor low battery.
Physical or Visual Tamper: Detection of physical movement of a device or obstruction of a camera's field of view.
Access Control Events: Such as unauthorized access attempts in restricted areas.
Alerts are generated on triggers, but are NOT the same as notifications. Only certain alerts generate notifications based on user settings.
Can inquire about labels that have been seen.
Please note, this is not an exhaustive list, and there may be other types of triggers or events that generate policy alerts within the Rhombus system.
This tool allows you to filter existing alerts by existing/expiring, a specific time range (before or after a timestamp in ISO 8601 format), by a list of device UUIDs, or by a list of location UUIDs. You can also specify the maximum number of results to return. The output is provided in JSON format.
Pagination: Results are paginated and have a maximum page size. If the response includes a lastEvaluatedKey (for queryType "expiringSoon") or both lastTimestampISO and lastUuid (for queryTypes "existing" and "alert-groups"), more results are available. Pass these values back in the next call using the corresponding input parameters (lastEvaluatedKey, or lastTimestampISO and lastUuid) to retrieve the next page. Repeat until the response no longer includes these fields.
IMPORTANT: The "unhealthy-devices" queryType returns historical alert notifications that were triggered for device health issues. It does NOT return live/real-time device connection status. If no device health alert policies are configured, or alerts were dismissed, this may return empty even when devices are offline.
To check which devices are currently online/offline, use the get-entity-tool instead. The get-entity-tool returns the current state of all devices including their live connection status (the "connected" field). Request all entity types (CAMERA, DOORBELL_CAMERA, BADGE_READER, etc.) and check the "connected" field on each device to determine which are offline.
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| queryType | Yes | The type of policy alerts to retrieve. Use "existing" to get current policy alerts, and "expiringSoon" to get policy alerts that are nearing their expiration date. | |
| afterTimestampISO | Yes | The start of the time range for which to retrieve alerts. Only alerts that occurred AFTER this timestamp will be returned.Time format is in ISO 8601 format. Both UTC ("2025-08-04T20:54:27.123Z") and time zone offsets ("2025-08-04T13:54:27.123-07:00") are accepted to ensure an unambiguous point in time. | |
| beforeTimestampISO | Yes | The end of the time range for which to retrieve alerts. Only alerts that occurred BEFORE this timestamp will be returned.Time format is in ISO 8601 format. Both UTC ("2025-08-04T20:54:27.123Z") and time zone offsets ("2025-08-04T13:54:27.123-07:00") are accepted to ensure an unambiguous point in time. | |
| deviceFilter | Yes | A list of UUIDs representing the specific devices to filter alerts by. Only alerts emitted by these devices will be returned. Please truncate any facets, such as .v0 | |
| locationFilter | Yes | A list of UUIDs representing the specific locations to filter alerts by. Only alerts associated with these locations will be returned. Please truncate any facets, such as .v0 | |
| maxResults | Yes | The maximum number of policy alerts to return. A good default is 100, but you may increase or decrease this number as needed. A reasonable hard maximum is 1000 alerts. | |
| lastEvaluatedKey | Yes | Opaque pagination cursor from a previous response. When the response includes lastEvaluatedKey, pass it here on the next call to retrieve the next page. Used by queryType 'expiringSoon'. | |
| lastTimestampISO | Yes | Pagination cursor (ISO 8601 timestamp). When the response includes lastTimestampISO, pass it here with lastUuid on the next call for the next page. Used by queryTypes 'existing' and 'alert-groups'.Time format is in ISO 8601 format. Both UTC ("2025-08-04T20:54:27.123Z") and time zone offsets ("2025-08-04T13:54:27.123-07:00") are accepted to ensure an unambiguous point in time. | |
| lastUuid | Yes | Pagination cursor (UUID of last item). Pass together with lastTimestampISO from the previous response to fetch the next page. Used by queryTypes 'existing' and 'alert-groups'. | |
| timeZone | Yes | The timezone from the location of the camera of the policy alert, for formatting timestamps. This is necessary for the tool to produce accurate formatted timestamps. | |
| alertUuid | Yes | The UUID of a specific policy alert. Required for 'details' and 'dismiss'. | |
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| errorMsg | No | |
| policyAlerts | Yes | |
| lastEvaluatedKey | No | If present, more results are available. Pass this value as lastEvaluatedKey on the next call to get the next page (queryType 'expiringSoon'). |
| lastTimestampISO | No | If present with lastUuid, more results are available. Pass both as lastTimestampISO and lastUuid on the next call for the next page ('existing' or 'alert-groups'). ISO 8601 format. |
| lastUuid | No | If present with lastTimestampISO, more results are available. Pass both on the next call for the next page ('existing' or 'alert-groups'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: alerts vs notifications, unhealthy-devices returns historical not live data, large response warning, pagination details for different query types. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very long and dense, covering many aspects but lacking conciseness. It repeats some schema info and could be more streamlined. However, it is well-structured with sections.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (13 params, multiple query types, pagination, output filtering), the description is highly complete. It covers pagination per query type, output filtering warnings, and sibling tool differentiation. It explicitly states it's not exhaustive, setting expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. Description adds meaning for queryType enum values, time format details, pagination cursors, and output filtering. It goes beyond schema by explaining when to use each pagination parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Retrieves Rhombus policy alerts' and distinguishes them from notifications. It explains what triggers alerts and contrasts with get-entity-tool for live device status, effectively differentiating from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance on when to use this tool (for policy alerts) and when not to (for live device status, use get-entity-tool). It also explains pagination and output filtering, providing clear context for alternative usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reboot-camerasB
this tool is for rebooting one or more cameras causing them to reconnect to the server, this is a helpful option when a camera is experiencing connectivity issues or is in need of troubleshooting. THIS TOOL PERFORMS AN ACTION.
| Name | Required | Description | Default |
|---|---|---|---|
| cameraUuids | Yes | An array of camera UUID strings which are unique identifiers for cameras | |
| confirmationId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must disclose behavioral traits. Only states 'performs an action' and reconnection effect. Does not mention potential side effects like service interruption, permission requirements, or confirmation process.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is adequately concise but includes redundant phrases like 'this is a helpful option' and all-caps 'THIS TOOL PERFORMS AN ACTION'. Front-loaded with purpose, but could be more direct.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with no output schema, description lacks details on synchronous/asynchronous behavior, effect on ongoing operations, and purpose of confirmationId. Incomplete for reliable invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% (only cameraUuids has description). Description adds no parameter-specific information beyond the schema. The confirmationId parameter is left completely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool reboots cameras and causes reconnection, distinctly different from sibling tools like 'camera-tool' or 'camera-uptime-tool'. Verb+resource is specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Mentions usage when camera has connectivity issues or needs troubleshooting, providing clear context. Does not explicitly compare to alternatives or state when not to use, but guidance is helpful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report-toolA
Scope: This tool returns aggregated counts and time-series summaries over specified intervals and scopes. Use events-tool when you need raw, event-level data (individual events with timestamps). Use this tool for high-level reports, analytics, and trends—especially over periods of a day or more.
People / occupancy counting strategy
When asked to count people on a camera or at a location, follow this strategy:
Always call GET_OCCUPANCY_ENABLED_CAMERAS first to discover which cameras have occupancy counting enabled.
If the target camera IS in the list, call GET_OCCUPANCY_COUNT_REPORT for that device. The response will automatically include a
faceCountEnrichmentfield with the number of unique individuals identified by face recognition in the same time range. Present both data sources: occupancy estimate and unique face count.If the target camera is NOT in the list, tell the user that camera does not have occupancy counting enabled, and list the cameras that do. You can still call GET_SUMMARY_COUNT_REPORT with PEOPLE type — its response will also include
faceCountEnrichmentwith unique face data as a fallback. If the PEOPLE count returns zero, the response will also include the list of occupancy-enabled cameras and a hint.When both occupancy data and face recognition data are available, synthesize both in your answer (e.g., "Occupancy estimates ~15 people. Face recognition identified 9 unique individuals during this period.").
PEOPLE type (in GET_SUMMARY_COUNT_REPORT): Not a unique person count; it counts people-detection events. Requires people detection to be enabled on the camera. Use for high-level activity trends, not for deduplicated head counts.
Summary and occupancy
GET_SUMMARY_COUNT_REPORT: Aggregated counts (people, faces, motion, vehicles, etc.) over time at device, location, or org scope. Interval: minutely, hourly, daily, weekly, monthly, yearly. When called with PEOPLE type at DEVICE scope, the response is automatically enriched with face recognition data.
GET_OCCUPANCY_ENABLED_CAMERAS: List of cameras with occupancy reporting enabled. Always call this first before any people/occupancy counting request to verify camera support.
GET_OCCUPANCY_COUNT_REPORT: Occupancy count time series for a specific device over a time range. Response is automatically enriched with face recognition data. If the device does not support occupancy, the response will include a hint and the list of cameras that do.
Line crossing
GET_LINE_CROSSING_ENABLED_CAMERAS: Cameras at a location with line crossing enabled, plus their configs. Call first to see which cameras support threshold crossing reports.
GET_THRESHOLD_CROSSING_COUNT_REPORT: Ingress/egress counts for line crossings over time. Supports human and vehicle detection; bucket size: quarter hour, hour, day, week. Response includes computed metrics: average entries/exits per hour, hour with most entries/exits, busiest hour (with breakdown).
Custom LLM events
FIND_PROMPT_CONFIGURATIONS: All custom event prompt configurations (e.g. "black dog sightings", "delivery truck arrivals", "parking availability %"). Each has prompt text, UUID, and promptType (COUNT, PERCENT, BOOLEAN). Call first to discover available custom events.
GET_CUSTOM_LLM_REPORT: This is the PRIMARY way to get custom event reports. Aggregated time-series for one custom event by prompt UUID. Automatically selects the correct API based on promptType: COUNT (numeric counts), PERCENT (percentages), BOOLEAN (true/false). Intervals: minutely, quarter-hourly, hourly, daily, weekly, monthly. Always use this for custom event reports, trends, and analytics. Use FIND_PROMPT_CONFIGURATIONS first to get the promptUuid and promptType.
GET_CUSTOM_EVENTS_REPORT: Raw individual event values only (not aggregated). Use only when you need per-event granularity, not for reports or trends.
Audit and diagnostics
GET_AUDIT_FEED: Audit log of all user/admin actions in the org over a time range. Returns who did what and when (principalName, targetName, action, displayText).
GET_DIAGNOSTIC_FEED: Device diagnostic events over a time range.
GET_THRESHOLD_CROSSING_EVENTS: Individual line-crossing events (not aggregated counts).
GET_PEOPLE_COUNT_EVENTS: Most recent people count readings for specified devices.
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| requestType | Yes | ||
| occupancyCountRequest | Yes | Required for requestType === 'get-occupancy-count-report', null for other request types. | |
| summaryCountRequest | Yes | Required for requestType === 'get-summary-count-report', null for other request types. | |
| occupancyEnabledCamerasRequest | Yes | Required for requestType === 'get-occupancy-enabled-cameras', null for other request types. | |
| lineCrossingEnabledCamerasRequest | Yes | Required for requestType === 'get-line-crossing-enabled-cameras', null for other request types. | |
| thresholdCrossingCountRequest | Yes | Required for requestType === 'get-threshold-crossing-count-report', null for other request types. | |
| findPromptConfigurationsRequest | Yes | Required for requestType === 'find-prompt-configurations', null for other request types. | |
| customLLMReportRequest | Yes | Required for requestType === 'get-custom-llm-report', null for other request types. | |
| auditFeedRequest | Yes | Required for requestType === 'get-audit-feed', null for other request types. | |
| diagnosticFeedRequest | Yes | Required for requestType === 'get-diagnostic-feed', null for other request types. | |
| thresholdCrossingEventsRequest | Yes | Required for requestType === 'get-threshold-crossing-events', null for other request types. | |
| customEventsReportRequest | Yes | Required for requestType === 'get-custom-events-report', null for other request types. | |
| peopleCountEventsRequest | Yes | Required for requestType === 'get-people-count-events', null for other request types. | |
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| errorMsg | No | |
| summaryCountReport | No | Report data for various high level organization metrics like people counts, bandwidth counts, face counts, etc. |
| occupancyCountReport | No | |
| occupancyEnabledCamerasReport | No | List of cameras that have occupancy reporting enabled |
| lineCrossingEnabledCamerasReport | No | Cameras at a location that have line crossing enabled with their configurations |
| thresholdCrossingCountReport | No | Threshold crossing count report showing ingress and egress counts over time with calculated metrics |
| promptConfigurationsReport | No | List of custom event prompt configurations |
| customLLMReport | No | Custom LLM report showing event data over time - supports COUNT, PERCENT, and BOOLEAN prompt types |
| auditFeedReport | No | Audit feed showing user actions |
| diagnosticFeedReport | No | Diagnostic feed showing device events |
| thresholdCrossingEventsReport | No | Individual threshold crossing events |
| customEventsReport | No | Custom events report time series |
| peopleCountEventsReport | No | Most recent people count events |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It details response enrichment (faceCountEnrichment), fallback behavior, auto-selection of API based on promptType, and output filtering warnings (responses may exceed 400k characters). However, it does not mention rate limits, permissions, or whether operations are read-only, though these are less critical for a report tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (Scope, People/occupancy counting strategy, Summary and occupancy, Line crossing, Custom LLM events, Audit and diagnostics, Output filtering). It is front-loaded with the core purpose and key distinction. While comprehensive, some repetition (e.g., faceCountEnrichment mentioned multiple times) slightly reduces conciseness, but every section earns its place with actionable guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (12 sub-tools) and that an output schema exists, the description is remarkably complete. It covers all sub-tool use cases, provides lookup strategies for cameras and prompts, explains fallback behavior, and warns about large responses with output filtering options. It also instructs the agent on error handling (e.g., telling user when camera lacks occupancy). No gaps identified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 93%, so baseline is 3. The description adds significant context beyond the schema: it explains when each requestType is appropriate, how parameters relate to sub-requests (e.g., 'Required for requestType ===...'), and provides usage warnings for includeFields and filterBy. This adds practical meaning that helps the agent construct correct requests.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns aggregated counts and time-series summaries. It explicitly contrasts with events-tool (raw event-level data), providing a specific verb and resource distinction. The scope is well-defined: high-level reports, analytics, trends over periods of a day or more.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use and when-not-to-use guidance, including a direct comparison with events-tool for raw data. It also gives step-by-step strategies for people counting (always call GET_OCCUPANCY_ENABLED_CAMERAS first), line crossing, and custom events, with fallback instructions and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rules-toolA
This tool manages Rhombus automation rules for triggering actions based on events.
It has the following modes of operation, determined by the "requestType" parameter:
list: List all automation rules in the organization.
create: Create a new automation rule. Requires ruleName and ruleConfig (JSON string with the rule definition).
update: Update an existing rule. Requires ruleUuid and ruleConfig (JSON string with updated fields).
delete: Delete a rule. Requires ruleUuid.
get-records: Get the event trigger history for a specific rule. Requires ruleUuid.
Rules can trigger notifications, recordings, and other actions based on events from cameras, sensors, doors, etc.
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| requestType | Yes | The type of rules operation to perform. | |
| ruleUuid | Yes | The UUID of the rule. Required for 'update', 'delete', and 'get-records'. | |
| ruleName | Yes | The name of the rule. Required for 'create'. | |
| ruleConfig | Yes | JSON string of the rule configuration. Required for 'create' and 'update'. Contains the rule definition. | |
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rules | No | List of rules |
| rule | No | Result of create/update/delete operation |
| ruleRecords | No | Rule trigger event records |
| error | No | An error message if the request failed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions that create/update require JSON config and that responses can be large, but it does not specify side effects (e.g., whether updates are idempotent, if deletion is permanent), authentication requirements, or potential errors. More detail would improve transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear list of modes followed by output filtering details. It front-loads the purpose and uses bullet-like formatting for readability. However, it could be slightly more concise by merging redundant warnings about response size.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (5 modes, 6 params) and the presence of an output schema, the description covers the essential operational modes and parameter roles. It lacks information about prerequisites (e.g., permissions) and error handling, but overall it provides sufficient context for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage, so parameters are already described. The description adds value by grouping parameters by mode (e.g., list requires no ruleUuid) and clarifying output filtering parameters' purpose. It also explains that ruleConfig is a JSON string for rule definition, beyond the schema's basic description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool manages Rhombus automation rules for triggering actions based on events. It lists specific modes (list, create, update, delete, get-records) and provides context that rules can trigger notifications, recordings, etc. This distinguishes it from sibling tools like camera-tool or events-tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains each mode of operation and when to use each one, including required parameters per mode. It also warns about large responses and recommends using includeFields and filterBy. However, it does not explicitly state when NOT to use this tool or compare it to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search-toolA
This tool performs visual and data searches across Rhombus camera footage and events.
It has the following modes of operation, determined by the "requestType" parameter:
license-plate: Search for license plate sightings by plate number. Requires query (the plate number or partial match).
object-by-color: Search for objects by color in camera footage. Requires query (color name) and cameraUuid.
object-by-text: Semantic search for objects in footage using a text description. Requires query (text description).
motion-search: Search for motion events in a camera's field of view. Requires cameraUuid, startTime, and endTime.
All search types support optional startTime and endTime to narrow the search window. Use the get-entity-tool with entityType CAMERA to get camera UUIDs.
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| requestType | Yes | The type of search to perform. | |
| query | Yes | The search query string. Required for 'license-plate' (plate number), 'object-by-text' (text description of object), 'object-by-color' (color name). | |
| cameraUuid | Yes | The UUID of the camera to search. Required for 'motion-search' and 'object-by-color'. | |
| startTime | Yes | Start time for the search range.Time format is in ISO 8601 format. Both UTC ("2025-08-04T20:54:27.123Z") and time zone offsets ("2025-08-04T13:54:27.123-07:00") are accepted to ensure an unambiguous point in time. | |
| endTime | Yes | End time for the search range.Time format is in ISO 8601 format. Both UTC ("2025-08-04T20:54:27.123Z") and time zone offsets ("2025-08-04T13:54:27.123-07:00") are accepted to ensure an unambiguous point in time. | |
| deviceUuids | Yes | Optional list of device UUIDs to filter search results. | |
| locationUuids | Yes | Optional list of location UUIDs to filter search results. | |
| timeZone | Yes | The timezone for formatting timestamps. | |
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| licensePlateResults | No | License plate search results |
| objectColorResults | No | Object color search results |
| objectTextResults | No | Object text search results |
| motionResults | No | Motion search results |
| error | No | An error message if the request failed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must cover behavioral traits. It discloses that responses can exceed 400k characters and suggests using includeFields/filterBy. It does not mention rate limits, authentication needs, or side effects, which is acceptable for a read-only search tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with bullet points and clear sections. It is detailed but could be slightly more concise by reducing redundancy (e.g., repeating the warning about large responses). Overall, it is effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (10 params, multiple modes, output schema exists), the description covers operation modes, parameter requirements, and output filtering. It does not explain the return structure, but the output schema handles that. It is mostly complete for agent use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by specifying which parameters are required per requestType, and provides examples and warnings for includeFields and filterBy, which goes beyond the schema's descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states it performs visual and data searches across Rhombus camera footage and events, with four distinct modes of operation. This clearly identifies the tool's purpose and differentiates it from sibling tools like lpr-tool or camera-tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly outlines when to use each mode by specifying required parameters. It advises using get-entity-tool to obtain camera UUIDs and warns about large response sizes. However, it does not explicitly state when NOT to use this tool (e.g., for simpler lookups).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
time-conversion-toolA
This tool is capable of converting to and from epoch and ISO 8601 timestamps. Use this tool when you have one time format and need to convert to the other format. The tool will automatically detect the input format and convert to the other format.
| Name | Required | Description | Default |
|---|---|---|---|
| time_to_convert | Yes | The time to convert. This can be either an ISO 8601 timestamp string (e.g., '2023-10-05T14:48:00.000Z') or a Unix timestamp in milliseconds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must cover behavioral traits. It states auto-detection and conversion, which is constructive. However, it omits details like error handling, output format, or restrictions, leaving some ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only two sentences, concise and front-loaded with the core purpose. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple conversion tool with one parameter and no output schema, the description adequately covers inputs, behavior, and usage. It lacks details on output format, but the context of bidirectional conversion implies the result will be the opposite format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of parameters and includes a description. The tool description adds auto-detection context, but does not significantly enhance parameter understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'convert' and the resources 'epoch and ISO 8601 timestamps', indicating bidirectional conversion with auto-detection. It distinguishes itself from sibling tools like 'time-tool' which may handle different time operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use the tool: 'when you have one time format and need to convert to the other format'. It does not provide alternatives or exclusions, but the context is clear enough for a simple conversion tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
time-toolA
This tool is capable of returning the time from a natural language query. If the user asks about the 'current time' use this tool. Try to kee time_description as close to the users initial query as possible. For example if someone says 'was X person seen today?' then time_description should be 'today'.
| Name | Required | Description | Default |
|---|---|---|---|
| time_description | Yes | A natural language description of the time (e.g., '2pm today', 'tomorrow at noon'). | |
| timezone | Yes | Optional IANA timezone string (e.g., 'America/Los_Angeles', 'UTC'). Will default to system timezone if not provided. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It describes a read-like operation but does not explicitly state it is safe or has side effects. For a simple query tool, this is adequate but not thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences plus an example, all highly relevant. No wasted words. The instructions are front-loaded and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the description covers what the tool does, when to use it, and how to set parameters. Lacks details on return format, but for a time tool that is often acceptable. Overall sufficient for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema provides 100% coverage for both parameters. The description adds valuable context by advising to keep time_description close to the user's query, which helps the agent formulate the parameter correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns time from a natural language query, distinguishing it from sibling tools like time-conversion-tool. However, it could be slightly more explicit that it handles both current time queries and time descriptions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear guidance on when to use (e.g., 'if user asks about current time') and how to construct the time_description parameter. Lacks explicit exclusion of alternatives, but the sibling list includes time-conversion-tool which implies different use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update-toolA
This tool allows updating configuration settings for various Rhombus entities. Currently supports:
Cameras: Update video settings (resolution, HDR, WDR, brightness, contrast, etc.), audio settings (recording, microphone, speaker), and device settings (name, timezone, LED control).
For LED control, use EXACTLY these field names in cameraDeviceSettings:
To turn LED off: {"led_stealth_mode": true} (recommended) or {"led_mode": "always_off"}
To turn LED on: {"led_stealth_mode": false} or {"led_mode": "always_on"} or {"led_mode": "auto"}
IMPORTANT: Use underscore in field names (led_mode, led_stealth_mode), not camelCase
The tool supports faceted UUIDs (e.g., "cameraUuid.v0" or "cameraUuid.v1") to update specific camera facets. If no facet is specified, defaults to "v0".
The tool guides users through a multi-step process:
Entity selection (if not provided)
Settings configuration with current values shown
Confirmation and application of changes
Future support planned for:
Climate sensors
Door controllers
Environmental gateways
Audio gateways
Doorbell cameras
Badge readers
The tool uses elicitation forms for rich user interaction and shows current settings before updates.
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| entityType | Yes | Type of entity to update | |
| entityUuid | Yes | UUID of the entity to update | |
| cameraVideoSettings | Yes | JSON string of video settings to update for camera | |
| cameraAudioSettings | Yes | JSON string of audio settings to update for camera | |
| cameraDeviceSettings | Yes | JSON string of device settings to update for camera | |
| step | Yes | Current step in the update process | |
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| needUserInput | No | |
| message | No | |
| requestType | No | |
| submitAction | No | |
| entityType | No | |
| entityUuid | No | |
| currentSettings | No | |
| success | No | |
| error | No | |
| updatedSettings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description must disclose all behavioral traits. It reveals that the tool mutates settings and uses a multi-step process with current value display, but lacks information on error handling, idempotency, authorization needs, or potential side effects like camera reboots.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy and includes a mix of core functionality, specific instructions, and a generic output filtering section. It is front-loaded with the main purpose and structured with bullet points, but some parts like the future support list could be trimmed for conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 8 parameters, a multi-step process, and faceted UUIDs, the description covers entity types, settings categories, process flow, and output filtering. It has an output schema so return values are covered. Missing details on error handling and validation slightly reduce completeness, but overall it is thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, giving a baseline of 3. The description adds significant value beyond the schema, especially for cameraDeviceSettings (exact LED field names, underscore note) and includeFields/filterBy (warning about large responses and usage examples). This enrichment justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool updates configuration settings for Rhombus entities, specifically cameras currently, and lists the supported settings. It differentiates from sibling tools by focusing on updates rather than other operations, but does not explicitly contrast with other update tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides step-by-step guidance and specific instructions for LED control, and mentions the faceted UUID default. However, it does not specify when to use this tool versus alternatives, nor does it provide when-not-to-use guidance or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
user-access-trail-toolA
This tool traces a specific user's physical access events across all doors and access points. It answers questions like "Where did this person badge in?" or "Show me all access events for this user."
It has the following modes of operation, determined by the "requestType" parameter:
get-access-events-by-user: Get access events using a known userUuid. Requires userUuid.
get-access-events-by-email: Get access events by looking up the user's email first. Requires email. Automatically resolves the user UUID.
Both modes support optional startTimeMs, endTimeMs, and limit parameters. Use the user-tool to find user UUIDs if needed, or use the email-based lookup directly.
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| requestType | Yes | The type of access trail request. | |
| userUuid | Yes | User UUID. Required for 'get-access-events-by-user'. | |
| Yes | User email address. Required for 'get-access-events-by-email'. Will resolve to userUuid automatically. | ||
| startTimeMs | Yes | Start time filter in milliseconds since epoch. | |
| endTimeMs | Yes | End time filter in milliseconds since epoch. | |
| limit | Yes | Maximum number of events to return. Defaults to 100. | |
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| userUuid | No | Resolved user UUID |
| userName | No | Resolved user name |
| accessEvents | No | List of access control events for the user, ordered by time |
| error | No | An error message if the request failed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry full burden. It explains modes, output filtering, and warns about large responses. But it doesn't disclose read-only nature, authentication needs, or error handling for missing users.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: first paragraph states purpose, second details modes, third covers output filtering. No fluff, every sentence adds value. Front-loaded with key info.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given complexity (8 params, modes, output filtering), the description covers all necessary parts: modes, parameter dependencies, default limit, output filtering syntax and warning. With output schema present, return value explanation is not needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaning by explaining how requestType determines mode, role of email vs userUuid, and output filtering with examples. This extra context justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it traces physical access events for a specific user across all doors and access points, and gives example questions. It distinguishes from sibling tools like user-tool by indicating when to use user-tool for UUID lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains two modes of operation and when to use each, and recommends user-tool for UUID lookup. However, it doesn't explicitly exclude other tools (e.g., events-tool) or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
user-audit-toolA
This tool retrieves configuration audit trails for specific users or specific targets (devices, policies, etc.). Unlike the general audit feed, this focuses on a SINGLE user or a SINGLE target entity.
It has the following modes of operation, determined by the "requestType" parameter:
audit-by-user: Get all configuration changes made BY a specific user. Requires userUuid (use user-tool to find it). Answers: "What did this admin change recently?"
audit-by-target: Get all configuration changes made TO a specific entity (camera, door, policy, etc.). Requires targetUuid. Answers: "Who changed the settings on this camera?"
Both modes return audit events with action, display text, who did it, what was changed, and when.
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| requestType | Yes | The type of audit request to make. | |
| userUuid | Yes | User UUID whose actions to audit. Required for 'audit-by-user'. Use user-tool to find this. | |
| targetUuid | Yes | Target entity UUID (camera, door, policy, etc.) to see what has been done to it. Required for 'audit-by-target'. | |
| maxResults | Yes | Maximum number of audit events to return. Defaults to 50. | |
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| auditEvents | No | List of audit events, most recent first |
| error | No | An error message if the request failed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description covers behavior well: it describes two modes, the structure of returned audit events, and warns about large responses. It does not mention authentication or side effects, but these are not critical for this read-only tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections, front-loaded with the main purpose. It is slightly verbose but every sentence adds value, making it efficient for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema and schema coverage, the description is complete. It covers all parameters, provides usage context, and warns about large responses. It could mention the default maxResults explicitly, but overall it's sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by explaining the meaning of requestType and the relationship between userUuid/targetUuid and modes, and by detailing the filtering parameters with examples and warnings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states it retrieves configuration audit trails for specific users or targets, distinguishing it from a general audit feed. It clearly lists two modes and their purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear guidance on when to use each mode, prerequisites like using user-tool to find userUuid, and explains output filtering to manage large responses. It does not explicitly state when not to use the tool, but the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
user-toolA
This tool manages Rhombus user operations including listing users, finding users by email, and viewing permissions.
It has the following modes of operation, determined by the "requestType" parameter:
list-users: List all users in the organization with their details and roles.
find-by-email: Find a specific user by their email address. Requires the email parameter.
get-permissions: Get the permissions for the current API user/token.
get-permission-groups: List all permission groups defined in the organization. Each row can be very large — see below.
User UUIDs returned here can be used with the access-control-tool to look up credentials.
IMPORTANT for 'get-permission-groups': Each permission group row includes five access maps whose size scales with the org's locations, devices, and other permission groups. The total payload for 'userPermissionGroupAccessMap' across all rows grows O(N^2) in the number of permission groups. Before calling, decide which fields you actually need and pass them via 'includeFields':
Safe/small fields (O(1) per row): 'permissionGroups.uuid', 'permissionGroups.name', 'permissionGroups.description', 'permissionGroups.mutable', 'permissionGroups.superAdmin', 'permissionGroups.installer', 'permissionGroups.defaultPermissionForNewLocations', 'permissionGroups.defaultAccessControlPermissionForNewLocations'.
Bounded fields (O(K) per row): 'permissionGroups.functionalityList', 'permissionGroups.accessibleLocations', 'permissionGroups.assignablePermissionGroups'.
Heavy fields (O(locations) / O(devices) / O(groups) per row): 'permissionGroups.locationAccessMap', 'permissionGroups.accessControlLocationAccessMap', 'permissionGroups.deviceAccessMap', 'permissionGroups.userPermissionGroupAccessMap', 'permissionGroups.locationGranularAccessMap'. Only request these when you specifically need them for a user. Typical usage when just picking a role uuid: 'includeFields: ["permissionGroups.uuid", "permissionGroups.name", "permissionGroups.description"]'.
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| requestType | Yes | The type of user request to make. | |
| Yes | The email address of the user to find. Required for 'find-by-email'. | ||
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| users | No | List of users in the organization |
| user | No | A single user found by email |
| permissions | No | Current user permissions |
| permissionGroups | No | List of permission groups in the organization. |
| error | No | An error message if the request failed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the burden of behavioral disclosure. It warns about response sizes (400k+ characters), explains the O(N^2) growth for permission group access maps, and recommends field filtering. This is comprehensive for a user management tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively long but well-structured with sections and bullet points. It is front-loaded with the tool's purpose and then dives into details. Each sentence seems necessary, though some redundancy could be trimmed (e.g., repeating the warning about response size in includeFields description).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (four modes, output filtering, heavy payload warnings) and the existence of an output schema, the description is mostly complete. It covers all modes, filter parameters, and performance considerations. It does not mention error handling or rate limits, but those are beyond typical expectations for a tool description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds significant meaning beyond the input schema. For requestType, it explains each mode. For includeFields and filterBy, it provides examples and notes on performance. The schema coverage is 100% but the description enriches understanding, especially for the complex filtering and mode selection.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool manages Rhombus user operations with four specific modes. It mentions using UUIDs with access-control-tool, which helps differentiate, but does not explicitly contrast with other user-related sibling tools like user-audit-tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides guidance on when to use each requestType and warns about heavy payloads for get-permission-groups. It also suggests using includeFields and filterBy to control output. However, it does not compare with sibling tools or specify when to use this tool versus alternatives like user-audit-tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
video-walls-toolB
This tool interacts with Rhombus video walls. Rhombus video walls are a collection of camera feeds combined into a single view, allowing users to monitor multiple cameras.
The layout of created video walls is automatically determined by the number of cameras in video wall settings "numVisibleDevicesAtOnce".
Output filtering (all tools):
includeFields(string[]): Dot-notation paths to keep in the response (e.g."vehicleEvents.vehicleLicensePlate"). Omit to return all fields.filterBy(array): Predicates to filter array items. Each entry:{field, op, value}where op is one of= != > >= < <= contains. All conditions are ANDed. Example:[{field:"vehicleLicensePlate", op:"=", value:"ABC123"}]WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.
| Name | Required | Description | Default |
|---|---|---|---|
| requestType | Yes | The type of request to make. | |
| videoWallCreateOptions | Yes | The options for creating a video wall. This is required if your requestType === `create` | |
| includeFields | Yes | Dot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer. | |
| filterBy | Yes | Filter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | If this field exists, then an error occured and contains the error message. |
| needUserInput | No | If this field exists and is true, then the tool requires additional input from the user. |
| commandForUser | No | If this field exists, then the tool requires additional input from the user. |
| videoWalls | No | If requestType is `list`, then this field will be populated with the list of video walls. |
| videoWall | No | If requestType is `get`, then this field will be populated with the video wall. |
| uuid | No | The uuid of the created video wall. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description warns about large responses (400k characters) and recommends includeFields and filterBy, which is helpful. However, it does not disclose mutation safety, permissions, or side effects of creating a video wall. With no annotations, more detail on behavioral traits is expected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description includes a lengthy generic section on output filtering that is likely repeated across tools. The purpose is front-loaded, but overall verbosity could be reduced. It is adequately structured but not concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, the description covers core aspects: purpose, parameter behavior (layout determination), and output size warnings. It adequately equips an agent to invoke the tool, though some edge cases (e.g., error handling) are omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds value by explaining how 'numVisibleDevicesAtOnce' determines layout and providing extensive context on output filtering. This goes beyond the schema definitions, earning a score above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool interacts with Rhombus video walls and lists the supported actions (list, create) via requestType enum. It clearly identifies the resource and verbs, but does not explicitly differentiate from sibling tools like camera-tool or clips-tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, nor does it explain when to use list vs create beyond the schema. Prerequisites or context for using the tool are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
31 tool updates
v0.1.33- First observed
access-control-tool - First observed
alarm-monitoring-tool - First observed
analytics-tool - First observed
automated-prompts-tool - First observed
camera-tool - First observed
camera-uptime-tool - First observed
clips-tool - First observed
count-tool - First observed
create-camera-policy-tool - First observed
door-schedule-exception-tool - First observed
door-tool - First observed
entity-lookup-tool - First observed
events-tool - First observed
faces-tool - First observed
get-entity-tool - First observed
get-org-information - First observed
guest-management-tool - First observed
location-tool - First observed
lpr-tool - First observed
policy-alerts-tool - First observed
reboot-cameras - First observed
report-tool - First observed
rules-tool - First observed
search-tool - First observed
time-conversion-tool - First observed
time-tool - First observed
update-tool - First observed
user-access-trail-tool - First observed
user-audit-tool - First observed
user-tool - First observed
video-walls-tool
TDQS
Most tools have clearly distinct purposes, with detailed descriptions that differentiate similar ones like events-tool vs report-tool or multiple door-related tools. However, some potential overlap exists between camera-tool and update-tool for camera settings, and between get-entity-tool and entity-lookup-tool, but the descriptions mitigate confusion.
Tool names consistently use snake_case and follow a <domain>-tool pattern (e.g., access-control-tool, alarm-monitoring-tool). A few names like create-camera-policy-tool deviate slightly from the verb-noun pattern, but overall naming is predictable.
With 31 tools, the server is on the high side for a typical MCP server. While the domain (physical security) is broad enough to justify many tools, some tools could be consolidated (e.g., multiple door-related tools). The count feels slightly heavy but still manageable.
The tool surface covers a wide range of operations across various domains (access control, cameras, analytics, LPR, etc.) but has notable gaps. Missing user creation, alarm management beyond monitoring, and full CRUD for locations (only create and update). Some operations require workarounds.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Give AI agents secure access to RevDesk calling, SMS, phone numbers, caller IDs, and usage.
Connects AI assistants to CloudQuell multi-cloud and AI cost, savings, anomaly, and budget data.
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
Control your Tesla from your AI assistant - climate, charging, access, and security.
Related MCP Servers
- AlicenseCqualityBmaintenanceEnables AI assistants to control SwitchBot devices, providing functionalities like device management, scene execution, and sensor information monitoring through the SwitchBot API.37ISC
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to access and control network cameras to capture images and perform analysis including brightness detection, color distribution, and edge detection.MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to control Home Assistant via natural language, including device control, automation management, and system monitoring.MIT

CastHub MCP Serverofficial
AlicenseNot gradedqualityCmaintenanceEnables AI assistants to control digital signage networks by managing device groups, presentations, schedules, and emergency alerts.62MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/RhombusSystems/rhombus-node-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server