bi-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@bi-mcpWhat cameras are offline right now?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
bi-mcp: Blue Iris MCP Server
Ask Claude about your security cameras in plain English. It looks at your live Blue Iris install and answers, instead of guessing. What cameras are online, why an alert fired, what the AI saw, how a preset is configured.
What is this?
Blue Iris is a Windows NVR app for IP security cameras. It records footage, runs motion and AI detection, and manages PTZ cameras.
The Model Context Protocol is a standard way for AI assistants like Claude to call tools on your own computer.
bi-mcp is an MCP server that connects the two. Claude gets a set of read-only tools (and optional control tools) for inspecting your Blue Iris install. You talk to Claude, Claude talks to Blue Iris.
Some example questions you can ask once it's set up:
What cameras are offline right now?
Why did the front door camera fire an alert at 3:14 PM?
Show me the trigger zones on SecCam_3.
What's the current PTZ preset on the pan-tilt camera?
19 read-only tools register by default. 6 control tools (rename a
camera, switch profile, recall a PTZ preset, export a clip, and a couple
more) register only when you explicitly opt in by setting
BI_MCP_ALLOW_MUTATIONS=1. The project is MIT-licensed.
Compatibility note: bi-mcp is built and tested against Blue Iris 5.x (specifically 5.9.9.71). Blue Iris 6 is out but has not been tested. Some tools call undocumented BI endpoints whose response shapes may have changed in 6.x. If you run bi-mcp against Blue Iris 6 and something works (or breaks), open an issue so I can update this note.
Related MCP server: Rhombus MCP Server
Prerequisites
You need three things before installing.
First, Blue Iris 5.x running on Windows with the web server enabled (see the compatibility note above about Blue Iris 6). In Blue Iris that's under Settings, then Web server, then check "Enabled".
Second, Python 3.10 or newer on the machine that will run bi-mcp. To
check what you have, open a terminal and run python --version. If it's
missing or too old, install from
python.org.
Third, a Claude app. Either Claude Desktop, which most users want, or Claude Code, which is the terminal CLI.
bi-mcp itself can run on the Blue Iris box or on any other computer on the same LAN.
Install
bi-mcp is a command-line tool. The recommended way to install command-line
Python tools is with pipx, which gives each tool its own isolated
environment so they don't interfere with each other.
Open a terminal. On Windows that's PowerShell from the Start menu, on macOS it's Terminal from Spotlight, on Linux it's whatever terminal you already use.
Then run one of these:
# Most common, works on macOS, Linux, and Windows
pipx install bi-mcp
# Faster alternative, if you have uv (https://docs.astral.sh/uv/)
uv tool install bi-mcp
# Try it once without installing anything permanent
uvx bi-mcp-server checkYou can also install straight from the GitHub source if you want the latest unreleased changes:
pipx install git+https://github.com/whoamiTM/bi-mcp
# or with uv:
uv tool install git+https://github.com/whoamiTM/bi-mcp
# or one-shot:
uvx --from git+https://github.com/whoamiTM/bi-mcp bi-mcp-server checkIf you don't have pipx, install it with python -m pip install --user pipx followed by python -m pipx ensurepath. Close and reopen your
terminal so the new command lands on your PATH.
After installing, confirm the command works:
bi-mcp-server --helpIf you want to edit the source instead of installing a released version, see For contributors further down.
Create a Blue Iris user for bi-mcp
Don't point bi-mcp at your admin account. Create a dedicated low-privilege
user that bi-mcp will log in as. In Blue Iris, go to Settings then Users
and click the + button to add a user. Name it mcp-readonly (or
whatever you prefer) and set a password you'll paste into the config in
the next step. Set Access to "Local + LAN", leave Admin unchecked, and
check the PTZ and Clips boxes. Under Camera groups, tick the
groups you want Claude to be able to see.
The Security section further down has the full permission table and explains the optional admin user that a handful of tools need.
Quickstart with Claude Code
The simplest way to register an MCP server with Claude Code is the
claude mcp add command. From any terminal:
claude mcp add --transport stdio -s user \
-e BI_HOST=192.168.1.10 \
-e BI_PORT=81 \
-e BI_USER=mcp-readonly \
-e BI_PASS=your-password-here \
bi-mcp \
-- bi-mcp-serverReplace 192.168.1.10 with your Blue Iris box's LAN IP, and the user
and password with the ones you just created. The -s user flag makes
bi-mcp available in every project, not just the current directory.
Then restart Claude Code. Run /exit in any active session, then launch
claude again. In a fresh session, ask:
List my Blue Iris cameras.
Claude should call bi_list_cameras and show your camera list.
Editing the config file by hand
If you'd rather edit the config directly, it lives at ~/.claude.json on
every platform. Add a bi-mcp entry under mcpServers:
{
"mcpServers": {
"bi-mcp": {
"command": "bi-mcp-server",
"env": {
"BI_HOST": "192.168.1.10",
"BI_PORT": "81",
"BI_USER": "mcp-readonly",
"BI_PASS": "your-password-here"
}
}
}
}Same restart procedure as above.
Quickstart with Claude Desktop
I built bi-mcp against Claude Code and haven't tested it on Claude Desktop. The MCP protocol is the same so it should work the same, but the instructions below are lighter than the Claude Code path. PRs welcome if anything's off.
The friendliest way to edit the config is from inside Claude Desktop itself. Open the Claude menu, go to Settings, click the Developer tab, then click "Edit Config". Claude Desktop creates the file if it doesn't exist yet and opens it in your default editor.
If you'd rather find the file on disk, it lives at:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
Add a bi-mcp entry under mcpServers using the same JSON shape as the
Claude Code block above.
After saving, fully quit Claude Desktop and reopen it. Closing the window is not the same as quitting. Use the app menu's Quit option.
If you want a walkthrough that uses Claude Desktop with a different MCP server (the official filesystem one) as a template, Anthropic's user quickstart at modelcontextprotocol.io/quickstart/user covers the same Settings → Developer → Edit Config flow in more detail.
When the first run doesn't work
The most common cause is invalid JSON in the config file. Trailing commas, mismatched quotes, that kind of thing. Paste the file through a JSON validator if you're not sure.
The next most common cause is not actually restarting the Claude app.
For Claude Code, run /exit and then claude again. For Claude Desktop,
use the app menu's Quit option. Closing the window isn't enough.
If both of those check out, run the CLI smoke test from a terminal:
BI_HOST=192.168.1.10 BI_USER=mcp-readonly BI_PASS=... bi-mcp-server checkA passing run prints OK — connected to Blue Iris 5.x.y.z at HOST:PORT, N cameras found. If you see that, the server itself works and the
problem is on the Claude side: config not loaded, wrong file, app not
fully restarted. If the smoke test fails, jump to
Troubleshooting further down.
You can also call individual tools from the CLI to confirm they return real data:
bi-mcp-server bi_list_cameras
bi-mcp-server bi_get_camera_config --short=SecCam_3And for poking at tool schemas interactively, the MCP Inspector opens a browser UI:
npx @modelcontextprotocol/inspector uvx --from . bi-mcp-serverConfiguration reference
bi-mcp reads its settings from environment variables. The env block in
the Claude config above sets them, so you don't need a separate file.
Variable | Required | Purpose |
| yes | LAN IP or hostname of your Blue Iris box |
| yes | Blue Iris web-server port (default |
| yes | The low-privilege user you created |
| yes | That user's password |
| no | Optional admin user for admin-gated tools (see Security) |
| no | Admin user's password |
| no | Set to |
| no | Set to |
You can also put these in a .env file in the directory you launch the
server from, which is handy for the CLI smoke tests. The .env.example
file in this repo shows the format.
For contributors (editing the source)
git clone https://github.com/whoamiTM/bi-mcp
cd bi-mcp
uv sync
uv run bi-mcp-server checkIf you'd rather use plain pip, note that the development dependencies are
declared as a PEP 735 dependency group rather than as an extra, so they need
their own install step and a pip new enough to understand --group. Running
pip install -e .[dev] instead will quietly install nothing and exit 0,
leaving you without pytest.
python -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade "pip>=25.1"
pip install -e .
pip install --group dev
pytest tests/ -qTool reference
19 read tools register by default. The 6 mutating tools register only when
BI_MCP_ALLOW_MUTATIONS=1. Pass raw=true on any tool to get the unshaped
Blue Iris JSON.
For the canonical reference with routing tables, error taxonomy, and mutation-safety rules, see AGENTS.md.
Tool | Backing BI cmd | Admin? | Mutating? | Purpose |
|
| Active profile, schedule, CPU/RAM/disk, uptime, DIO, warnings. | ||
|
| BI version/capabilities, available profiles/schedules/streams. | ||
|
| ✓ | Archive/schedule/manrecsec + any DIO/MQTT inline. | |
|
| All cameras and groups: online state, trigger counts, stream health. | ||
|
| (deep) | Per-camera config (deep w/ admin, shallow w/o). | |
|
| ✓ | Live | |
|
| Current JPEG frame, returned as an MCP image block (renders inline in image-aware clients) plus base64. Useful for live coverage cross-reference and PTZ preset framing checks. | ||
|
| Stored alert image (the saved frame, not a live one), resolved by camera + optional | ||
|
| Recent alerts with AI memo, classification, zones, clip path. | ||
|
| AI per-frame bounding boxes inside one alert. | ||
|
| Forensic detail for one clip. | ||
|
| Recorded clip inventory; complementary to | ||
|
| Activity timeline (alert/clip spans) for a camera over a window; defaults to the last 24h. | ||
|
| Current PTZ position, preset list, lock state. | ||
|
| ✓ | Recent BI system log entries. | |
| (file parser) | Parse | ||
| (file parser) | Decoded semantic view of | ||
| (file parser) | Cross-camera cohort-divergence report. Surfaces action-row outliers (values that differ from the cohort majority) for user review. Outliers may be intentional per-camera customizations, not bugs. | ||
|
| ✓ | Diagnose one alert: alert facts, per-row filter decode, comparator verdicts for compound/threshold/wait/cross-zone cases, and a ±2-minute log cross-reference of what BI actually did. Refuses alerts older than 24h by default (override with | |
|
| ✓ | ✓ | Fire a synthetic motion trigger (mutations flag). |
|
| ✓ | Recall a PTZ preset 1-20 (mutations flag). | |
|
| ✓ | ✓ | Switch active profile (mutations flag). |
|
| ✓ | ✓ | Async MP4/AVI/WMV export from a clip range (modes: create / status / list). Requires BI user |
|
| ✓ | Set memo (≤35 chars) and/or flag bits on one alert or clip @record. Auto-preserves | |
|
| ✓ | ✓ | 10 ops: rename, hide, enable, audio, output, manrec, pause, profile+lock, reset, reboot. All verify post-write. |
Enabling mutating tools
Set BI_MCP_ALLOW_MUTATIONS=1 in .env (or in the MCP config env block).
With the flag off, the mutating tools are not registered at all, so the
MCP tool list stays clean. Read AGENTS.md § Mutation patterns before
flipping the flag.
bi_get_reg and the .reg parser
bi_get_reg parses Blue Iris's binary .reg camera exports to surface
settings the JSON API doesn't expose (trigger zone polygons, per-class AI
confidence thresholds, per-preset alert-skip flags, ONVIF event handlers,
alert action definitions). It expects:
A
cam settings/directory in the launch CWD with<short>.regexports, ORBI_MCP_REG_DIRpointing at the directory.
Parsing is in-process. python-registry ships as a normal bi-mcp
dependency, so the install is single-step.
The BI_MCP_REG_DIR default resolves relative to the current working
directory at call time, not the install location, so it works correctly
whether bi-mcp is run from an editable checkout, a wheel, or via uvx.
Camera short names are validated ([A-Za-z0-9_-]+) before being composed
into a path, so a malformed name can't escape the configured directory.
Re-export a camera from BI any time you tune settings (right-click camera → Camera settings → Copy/import → Export). Files older than 7 days trigger a staleness warning in the tool's response.
Troubleshooting
unreachable: cannot reach Blue Iris.
Check
BI_HOSTandBI_PORTin.env(default port is 81).Confirm Blue Iris's web server is enabled: BI → Settings → Web server.
From the same machine, try
curl -X POST -d '{"cmd":"login"}' http://HOST:PORT/json. You should get a JSON response.
auth: Blue Iris rejected the login.
Check
BI_USERandBI_PASS.The user must have LAN access enabled in BI → Settings → Users.
Don't keep retrying with wrong credentials. Blue Iris will lock the account.
not_found: requested camera, clip, or alert doesn't exist.
For
bi_get_camera_config short=…, the value must match a camera's short name, not its display name. Runbi_list_camerasto see the list.
Empty or weird responses: pass raw=true to see what BI actually returned, then file an issue with the raw JSON so the shaper can be improved.
Debug logging: set BI_MCP_DEBUG=1 in .env (or in the MCP config env).
Logs go to stderr and a rotating file under your platform's user-cache dir:
Linux:
~/.cache/bi-mcp/server.logmacOS:
~/Library/Caches/bi-mcp/server.logWindows:
%LOCALAPPDATA%\bi-mcp\server.log
Security
This server is designed to run locally, talking to a Blue Iris box on the same LAN. It does not listen on a network port; it speaks stdio to one MCP client at a time. It should not be exposed to the internet.
Create a dedicated low-privilege Blue Iris user for the read tools (BI → Settings → Users → +):
Setting | Value | Why |
Access | Local + LAN | Required for the server to authenticate. |
Admin | unchecked | Read tools don't need it; admin-gated reads use a separate user (below). |
Change profile | unchecked |
|
PTZ | checked | Needed for |
Audio | unchecked | Not used. |
Clips | checked | Needed for |
Clip create | checked only if you enable | Required by the BI |
Camera groups | (tick all you want Claude to see) |
If you work from a clone of this repo, .env is gitignored and you should
never commit it. If credentials end up in a commit by accident, delete the
Blue Iris user immediately and create a new one.
Admin-gated tools and the two-user setup
Blue Iris gates several JSON cmds behind admin, so the recommended pattern is a two-user setup:
BI_USERandBI_PASS: the low-privilege account with PTZ and Clips access, used for all read tools that don't need admin.BI_ADMIN_USERandBI_ADMIN_PASS: a dedicated admin account, used only for the admin-gated cmds (marked ✓ in the Admin? column of the tool table above). Coversbi_get_sysconfig,bi_list_log, the deep path ofbi_get_camera_config,bi_get_camera_motion_config,bi_trigger_camera,bi_set_profile,bi_export_clip, andbi_set_camera(all ops).
If only the read user is configured, admin-gated tools degrade gracefully
(deep bi_get_camera_config falls back to the shallow camlist view; other
admin-gated tools raise a clear admin_required error). See AGENTS.md
§ Mutation patterns before enabling the mutating tools.
License
MIT. See LICENSE.
Contributions welcome. Open an issue on GitHub before sending a large PR so we can agree on shape.
Available Tools
19 toolsbi_audit_actionsARead-only
Informational tool — surfaces cross-camera action-row outliers for user review. Walks every camera's .reg export, buckets action rows into cohorts by (type, description, type-specific key), and reports fields where one camera's value deviates from the cohort's modal value under 'outliers'. Per-camera path tokens (e.g. 'ai/SecCam_3/motion') are templated to '' before comparison so legitimate per-camera substitution doesn't false-positive. The 'enabled' field is reported separately under 'disabled_outliers' so a row left disabled by accident is easy to spot. Outliers are NOT necessarily bugs — they may be intentional per-camera customizations (e.g. one camera filtering different trigger sources, or running a narrower profile set). Present findings to the user as 'values worth confirming' and ask whether each is intentional. Pure read; no live BI connection.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | If true, return the raw Blue Iris JSON instead of the shaped view. | |
| hook | No | Which hook(s) to audit: 'on_trigger', 'on_reset', or 'both' (default). | |
| cameras | No | Optional list of camera short names to audit. Defaults to every camera with a .reg export. | |
| min_cohort | No | Minimum cohort size before outliers are computed. Cohorts smaller than this are listed under 'unbucketed' for visibility but not analyzed. Default 3. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the readOnlyHint annotation by explaining the audit algorithm, the cohort bucketing, the '<CAM>' path templating to avoid false positives, and the separate 'disabled_outliers' reporting. It also warns that outliers are not necessarily bugs and clarifies that there is no live BI connection. This is rich behavioral disclosure with no contradiction against annotations.
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 long but each sentence earns its place: purpose, methodology, false-positive avoidance, output organization, and user-handling guidance are all useful. It is front-loaded with the core purpose and only then dives into mechanics. Slight redundancy around 'informational' and 'pure read' is minor.
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?
There is no output schema, so the description carries the burden of explaining return behavior; it names the output keys ('outliers', 'disabled_outliers', 'unbucketed') and clarifies how outliers should be interpreted. It also covers the tool's read-only nature, the data source, and appropriate user interaction. No critical operational detail appears to be missing for an agent to call it 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 coverage is 100%, so the baseline is 3. The description adds general context about cohorts and modal values, which relates conceptually to min_cohort, but it does not add parameter-level meaning beyond what the schema already provides. This is adequate given the schema already documents each 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 opens with a precise verb and resource: 'surfaces cross-camera action-row outliers' by walking each camera's .reg export and bucketing action rows into cohorts. It clearly identifies what the tool does and why, and the mechanics distinguish it from simple getter tools like bi_get_actionset or bi_list_alerts. It is not a tautology and states a specific analytical 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 gives clear context for when to use the tool: when the user needs to review cross-camera action-row divergences, and it explicitly instructs the agent to present findings as 'values worth confirming' and ask whether each is intentional. It does not explicitly name alternative tools or list exclusion criteria, but the use case is clearly scoped as an informational audit rather than a live query.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bi_explain_alert_chainARead-only
Use after bi_list_alerts to decode what actions fired on a specific alert. Pass the alert's path from that response. Explain a specific alert's action chain. Given (camera, alert_path), returns the alert's facts (memo, profile/preset at trigger, zones), each action row with its decoded filters, comparator verdicts for the cases that need them (compound predicates like 'car+licenseplate', confidence thresholds like 'person:80', cross-zone sequencing, wait-row gating), and a ±2-minute log cross-reference of what BI actually did (MQTT publishes, email/SMS/FTP results, AI cancellations). Simple filter matches (object-in-list, profile, source bit) are surfaced as raw facts; the caller decides FIRED vs SUPPRESSED for those. Admin-gated (uses the log cmd).
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | If true, return the raw Blue Iris JSON instead of the shaped view. | |
| path | Yes | Alert path from bi_list_alerts (e.g. '@4473131744.bvr'). Required. | |
| camera | Yes | Camera short name (e.g. 'SecCam_3'). Required. | |
| max_alert_age_h | No | Refuse to query the log for alerts older than this many hours. Default 24. BI's log cmd has no upper-time bound, so older alerts trigger a global log slice; raise this only when forensic review is worth the cost. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals a safe read operation, so the bar for extra disclosure is lower. The description adds meaningful behavioral context beyond that: it returns raw facts for simple matches and leaves verdicts to the caller, it cross-references a ±2-minute log window, and it is Admin-gated via the log cmd. It does not contradict the readOnlyHint, and the only minor gap is the absence of explicit failure behavior, but the added context is strong.
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 dense paragraph but front-loads the key usage ('Use after bi_list_alerts') and continues with concrete details in order of importance. It earns its length by explaining complex return semantics and an important cost wrinkle. It is longer than minimal, but for a tool with this analytical complexity, the length is justified; a small structural improvement would be bullet points, so not a perfect 5.
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?
Despite lacking an output schema, the description covers what the tool returns, how to use it, the interpretation policy for simple matches, the time window of the log cross-reference, and the cost/privilege caveat. For a tool this complex, the description is unusually complete: an agent could decide to call it without needing to open the schema, and would know what to do with the response.
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%, so the schema already documents all four parameters. The description adds value by clarifying that 'path' comes specifically from bi_list_alerts and noting the cost trade-off for max_alert_age_h. It connects parameters to real usage, going slightly beyond bare schema entries, though it could have precisely linked 'camera' and 'path' examples to the decoded output.
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 identifies the tool as an alert-chain explainer that decodes what actions fired on a specific alert, with a specific verb ('explain'), a specific resource (alert action chain), and a concrete workflow context ('Use after bi_list_alerts'). It distinguishes itself from siblings by emphasizing decoded filters, comparator verdicts, and log cross-referencing, which none of the sibling names or descriptions suggest.
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 it: after bi_list_alerts, and exactly what to pass: the alert's path from that response. It also gives a clear exclusion for simple filter matches (caller decides FIRED vs SUPPRESSED) and a warning about admin-gating and log cost for older alerts. This is actionable guidance with no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bi_get_actionsetARead-only
Return the semantic action set (OnTrigger and/or OnReset) for a camera. Decodes the full action type map (0-13), the command table for type=12 do-commands (PTZ presets 2201-2456, action sets, brightness/contrast/gain, plus ~60 individual codes), web_proto1 (http/https/mqtt), run_action, trig_allzones, and the profiles/zones/diobits/trig_source bitmasks into readable lists. Unmapped values fall through with the raw int preserved alongside (e.g. command_raw, trig_source_raw). Source data comes from the camera's .reg export, so changes made via the BI UI mid-session won't be visible until a re-export.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | If true, return the raw Blue Iris JSON instead of the shaped view. | |
| hook | No | Which hook to return: 'on_trigger', 'on_reset', or 'both' (default). | |
| camera | Yes | Camera short name (e.g. 'SecCam_3'). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses detailed decoding behavior, unmapped-value fallthrough with raw ints preserved, and a staleness caveat tied to .reg export source. This gives the agent an accurate model of what the call will and won't reflect.
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?
Four dense sentences, each earning its place: purpose, decoding detail, fallback behavior, and data-source caveat. The main purpose is front-loaded, and no content is redundant with the schema.
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 complex read-only decoder with no output schema, the description is complete: it names the decoded fields, bitmask groups, raw fallbacks, and the source/staleness limitation. An agent has enough context 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?
Schema coverage is 100%, so the baseline is 3. The description adds value by explaining the shaped-output contents and raw fallthrough, which clarifies the meaning of the raw flag, and by enumerating hook-related fields (OnTrigger/OnReset) that map to the hook 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 opens with a specific verb and resource: 'Return the semantic action set (OnTrigger and/or OnReset) for a camera.' This precisely identifies the tool's function and distinguishes it from sibling getters that target alerts, clips, config, or PTZ status.
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 purpose is unambiguous, and the caveat about .reg export data implies it is for inspecting exported action sets rather than live UI state. However, it never names an alternative tool or explicitly states when not to use it, so it falls short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bi_get_alert_imageARead-only
Fetch the STORED alert image (the frame BI saved when an alert fired) for a camera, resolved by time — not a live frame (that's bi_get_camera_snapshot). Pass 'camera' (short name) and optional 'at' (the alert time: ISO-8601, unix epoch int, or relative like '-2h'); omit 'at' for the most recent alert. Returns the most-recent alert at-or-before 'at' as base64, plus its record/time/memo so you can confirm which alert came back. Optional 'markup' (bool) requests the AI-overlay variant (manual's v=2). Internally resolves via alertlist + the /alerts/@record endpoint. Use a specific camera, not 'Index'. MARKUP — when 'markup'=true draws no box, it's almost always the ALERT'S SOURCE, not a tool bug: a box exists ONLY if CodeProject.AI classified the alert (memo has a score, e.g. person:89%). A bare person memo (no %) is an ONVIF/camera-IVS alert that BI's AI never scored, so there is no box to burn — v=2 just re-encodes the frame. (Separately, low-res thumbnails come from the camera's Hi-res-JPEG alert setting being off; that's a distinct issue from markup.) The /alerts/ endpoint only serves what BI stored and ignores w/h/scale params. State the source-vs-bug distinction proactively.
| Name | Required | Description | Default |
|---|---|---|---|
| at | No | Alert time. ISO-8601, unix epoch int, or relative shorthand ('-2h', '-1d'). Resolves to the most-recent alert at-or-before this time. Omit for the latest alert. | |
| raw | No | If true, return the raw Blue Iris JSON instead of the shaped view. | |
| camera | Yes | Camera short name (e.g. 'SecCam_4'). Required. | |
| markup | No | If true, request the AI-markup overlay variant (v=2). Markup only appears when BI stored a detection box. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation merely indicates a safe read; the description adds substantial behavioral detail: it returns the most-recent alert at-or-before 'at', returns base64 plus record/time/memo, resolves internally via alertlist and /alerts/@record, and ignores w/h/scale params. It also explains the markup source-vs-bug distinction and the low-resolution thumbnail issue, so the agent can anticipate real-world failure modes.
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 long but every sentence earns its place: core behavior is front-loaded, followed by the time-resolution rule, the live-frame exclusion, the markup caveat, and the distinct low-resolution issue. The structure moves from primary use to edge cases without redundancy, which is appropriate for a tool with nuanced behavior.
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 tool has no output schema and complex semantics, yet the description covers what is returned, how time resolution works, how markup behaves, what endpoint it uses, and likely misdiagnoses. Even the raw parameter, while not explained in description, is sufficiently documented in the schema, so nothing an agent needs to call this correctly is missing.
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?
Even with 100% schema coverage, the description adds meaning beyond the schema: it explains that 'at' resolves to the most-recent alert at-or-before that time, that omitting it fetches the latest alert, that 'markup' only produces a box when BI stored a detection score, and that 'camera' must be a specific camera, not 'Index'. These are semantics the schema alone does not convey.
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 a specific verb and resource: 'Fetch the STORED alert image' for a camera, resolved by time. It also explicitly differentiates from bi_get_camera_snapshot, telling the agent this is not a live frame but the frame BI saved when an alert fired.
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 gives clear invocation guidance: pass 'camera' with optional 'at', omit 'at' for the most recent alert, and use a specific camera rather than 'Index'. It names the alternative tool for live snapshots and explains when to use that instead, plus how markup behavior should be interpreted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bi_get_alert_tracksARead-only
AI object tracks (per-frame bounding boxes) inside one alert. Pass the alert's 'path' from bi_list_alerts. KNOWN BROKEN on BI 5.9.9.71: returns 'Access denied' from both the read-user and admin-user paths. The tracks cmd appears in BI's JSON cmd list but the manual provides no spec for it, and its gating mechanism is undocumented. Uses admin if configured (in case a future build accepts it), otherwise uses the read client. Do not rely on this tool until the gating is characterized.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | If true, return the raw Blue Iris JSON instead of the shaped view. | |
| path | Yes | Alert path/identifier from bi_list_alerts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint annotation by disclosing that the tool is known broken on a specific version, that both read and admin paths return 'Access denied', that the gating mechanism is undocumented, and that it falls back between clients accordingly.
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 core purpose is front-loaded and the warnings are relevant, but the explanation is somewhat lengthy due to repeated broken-state warnings and speculative admin-client reasoning. Still, most sentences add necessary context.
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 two-parameter tool with no output schema, the description covers the input source, current known-broken behavior, authentication path behavior, and the practical instruction not to depend on it. Nothing essential for correct use is missing.
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 baseline is 3. The description adds meaningful provenance for the required 'path' parameter by pointing to bi_list_alerts as the source, which is not evident from the schema alone.
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 precisely what the tool does: returns AI object tracks (per-frame bounding boxes) inside one alert. This clearly distinguishes it from sibling tools like bi_get_alert_image or bi_list_alerts by naming the resource and scope.
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 gives a concrete prerequisite: pass the alert's 'path' from bi_list_alerts. It also warns not to rely on the tool until gating is characterized, but it does not explicitly name alternatives or enumerate when to prefer this over sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bi_get_camera_configARead-only
Per-camera config + state. With admin creds, calls camconfig to return motion sensitivity, AI zones, recording mode, stream paths, schedule/profile flags. Without admin, falls back to filtered camlist state. Trigger zone polygons, per-class AI thresholds, and alert action definitions are NOT exposed by BI's JSON API — use bi_get_reg for those.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | If true, return the raw Blue Iris JSON instead of the shaped view. | |
| short | Yes | Camera short name (e.g. 'SecCam_3'). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses authentication-dependent behavior, what each call path returns, and which fields are intentionally absent from the API. This prevents the agent from expecting unsupported data and fully explains the tool's actual behavior.
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?
Three dense sentences with no filler. The core purpose is front-loaded, the conditional behavior is explained compactly, and the limitation/alternative is placed at the end where it matters. Every sentence earns its place.
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?
Despite no output schema, the description adequately communicates the returned fields, the auth-dependent behavior, and the boundary of what is not available. For a read-only config retrieval tool, this is sufficient for an agent to call it 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 description coverage is 100%, so both 'short' and 'raw' are already documented clearly. The description adds some context by mentioning the shaped vs raw distinction indirectly, but it does not need to compensate for schema gaps, so a baseline score of 3 is appropriate.
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 identifies the tool as returning per-camera configuration and state, enumerates the specific data fields (motion sensitivity, AI zones, recording mode, stream paths, schedule/profile flags), and explicitly names what it does not expose. This differentiates it from siblings like bi_get_reg and bi_get_camera_motion_config.
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 gives explicit usage context: admin credentials trigger one call path, non-admin falls back to another. It also names an alternative tool (bi_get_reg) for data this tool cannot return, which directly guides an agent's tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bi_get_camera_motion_configARead-only
Live motion + post-trigger settings for a camera, read from BI's admin camconfig cmd. Use this instead of bi_get_reg(key_path='Motion') to avoid stale .reg exports when tuning sensitivity/contrast/breaktime. Returns motion (12 keys: sense, contrast, breaktime, maketime, usemask, objects, ai_zones, shadows, luminance, showmotion, audio_trigger, audio_sense) and post (timed, timed_interval) plus verbatim motion_raw / post_raw twins. AI thresholds (smartconf, smartlabels, periodic, static-objects) are NOT in camconfig — use bi_get_reg(key_path='AI\') for those. Trigger-zone polygons stay in bi_get_reg(key_path='Motion') under maskbits_*. Admin-required. Note: the camconfig set-half for setmotion/setpost is a silent no-op in 5.9.9.71 — this tool is read-only by design; tune in the BI UI.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | If true, return the raw Blue Iris JSON instead of the shaped view. | |
| short | Yes | Camera short name (e.g. 'SecCam_3'). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true, and the description reinforces this by explaining the tool is read-only by design and that the camconfig set-half is a silent no-op in 5.9.9.71. It also discloses admin-required access, stale-reg avoidance, and the exact return structure. No contradiction with annotations; a strong behavioral disclosure overall.
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 dense but information-rich, front-loading the core purpose and then delivering precise exclusions and edge-case behavior. It earns its length by distinguishing this sibling-heavy tool from nearby alternatives and naming specific return keys, though it could be marginally trimmed without losing meaning.
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 read-only, two-parameter tool with no output schema, the description provides a good picture of return shape and key limitations. It tells the agent the admin requirement, the no-op caveat, what is NOT included, and where to get AI thresholds and zone polygons. The only minor gap is the absence of the camera short-name discovery path, but that is already handled by the required parameter and sibling tools.
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% for both parameters (short and raw are documented there). The description doesn't dwell on parameters, but it adds useful context for what the raw flag returns (verbatim motion_raw/post_raw twins), which complements the schema without needing to repeat it.
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 reads live motion and post-trigger settings from BI's admin camconfig cmd, explicitly distinguishing it from bi_get_reg(key_path='Motion'). It also enumerates the returned fields (motion, post, motion_raw, post_raw), so an agent can confidently identify the tool's purpose and scope.
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 to use this tool instead of bi_get_reg(key_path='Motion') when tuning sensitivity/contrast/breaktime to avoid stale .reg exports, and explicitly directs AI threshold queries to bi_get_reg(key_path='AI\<n>'), noting trigger-zone polygons remain in bi_get_reg. This gives clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bi_get_camera_snapshotARead-only
Fetch a single current JPEG frame from a camera via GET /image/<short>. Returns the image as base64 — the calling agent decides where (if anywhere) to write it to disk. Useful for cross-referencing live camera coverage against spatial maps, verifying PTZ preset framing, or capturing a still without going through the alert/clip pipeline.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | If true, return the raw Blue Iris JSON instead of the shaped view. | |
| camera | Yes | Camera short name (e.g. 'SecCam_3'). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals safety; the description adds the base64 return format and clarifies that the agent, not the tool, is responsible for writing to disk. This goes beyond the annotation without describing every failure mode.
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 tightly written sentences lead with the operation and endpoint, then cover output format and use cases. Every phrase adds value and there is no repetition of schema content.
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 read-only action with no output schema, the description explains the HTTP endpoint, the return encoding (base64), the side-effect behavior, and intended use cases. The agent has enough information to invoke it 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 description coverage is 100%, so the schema already documents 'camera' and 'raw'. The description only reinforces the camera short name through the endpoint template, adding no meaningful semantic information 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 names a concrete verb ('Fetch'), a specific resource ('a single current JPEG frame from a camera'), and the underlying endpoint, making it easy to distinguish from alert/clip-based siblings like bi_get_alert_image.
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?
Three concrete use cases are given (live-coverage cross-referencing, PTZ preset verification, still capture) and it explicitly frames the tool as an alternative to the alert/clip pipeline. It does not name sibling tools directly, but the guidance is clear enough for an agent to know when to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bi_get_clip_infoARead-only
Forensic detail for one clip/alert: resolution, duration, AI/profile/schedule/zones active at trigger time. Pass clip 'path' from bi_list_alerts.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | If true, return the raw Blue Iris JSON instead of the shaped view. | |
| path | Yes | Clip path/identifier from bi_list_alerts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds meaningful behavioral detail about the trigger-time snapshot (AI/profile/schedule/zones), going beyond what the schema alone provides. No contradiction exists.
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 with no filler. The core purpose is front-loaded, and the path-source instruction is placed exactly where it is needed.
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 read-only tool with two parameters and no output schema, the description provides enough context: what data is returned and where the input comes from. The exact shaped output format is not described, but the listed fields and raw option cover the main use cases.
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 schema already documents both parameters well. The description adds extra value by clarifying that 'path' must come from bi_list_alerts and by implying the shaped view behavior of the tool.
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 verb 'get' is paired with a specific resource ('one clip/alert') and a concrete list of returned fields (resolution, duration, AI/profile/schedule/zones active at trigger time). This makes it easy to distinguish from siblings like bi_list_alerts or bi_get_alert_tracks.
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 tells the agent to pass the clip 'path' from bi_list_alerts, which is a clear usage instruction tied to a sibling tool. It does not enumerate exclusions or when to prefer an alternative, but the context is sufficient for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bi_get_ptz_statusARead-only
PTZ state for one camera. All fields BI returns are passed through (presets[], presetnum, brightness, contrast, irmode, powermode, talksamplerate). Adds two derived helpers: 'preset_map' = {N: description, ...} keyed by preset number (UI3 source: presets[] is 1-indexed by position; "(undefined)" and empty descriptions are dropped), and 'active_preset' = {num, description} when presetnum is set. Camera must have PTZ enabled in BI.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | If true, return the raw Blue Iris JSON instead of the shaped view. | |
| camera | Yes | PTZ camera short name. Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, and the description adds rich behavioral detail: all BI fields are passed through, two derived helpers are added, preset_map indexing and filtering behavior is explained, and active_preset is conditionally present. This goes well beyond the annotations and clearly shapes agent expectations.
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 front-loaded with a one-sentence purpose, then compactly lists pass-through fields and explains derived helpers and prerequisites. Every sentence adds necessary information and there is no filler or 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?
With no output schema, the description carries the full burden of explaining return data. It enumerates the pass-through fields, describes both derived helpers in detail, covers edge cases like undefined/empty descriptions, and states the required camera condition. Together with the schema, an agent has enough to 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?
Schema description coverage is 100%, so the input schema already fully documents both parameters. The description adds only the PTZ-enabled prerequisite relevant to the camera parameter and does not meaningfully expand on the raw parameter, leaving the baseline at 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 operation: retrieving PTZ state for one camera. It also distinguishes this from sibling camera-related tools by emphasizing PTZ-specific fields and derived helpers, making the tool's scope 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?
The description gives clear context for when to use the tool: to get PTZ state for a single camera. It also provides a key prerequisite, 'Camera must have PTZ enabled in BI,' which guides proper usage. It does not explicitly name alternatives or exclusion conditions, but the PTZ-focused purpose is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bi_get_regARead-only
Parse a camera's .reg export and return the requested key subtree. Use this for what the BI JSON API does NOT expose: trigger zone polygons (Motion<profile>\maskbits_*), per-class AI confidence thresholds (AI<profile>\smartconf), per-preset alert-skip flags (PTZ\Presets<n>\noalerts), ONVIF event handlers (camevents<n>), and alert action definitions (Alerts\OnTrigger). Optional 'key_path' limits the response to that subtree (e.g. 'AI\3' for profile 3 AI config). Returns staleness warning if the .reg file is >7 days old.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | If true, return the raw Blue Iris JSON instead of the shaped view. | |
| camera | Yes | Camera short name (e.g. 'SecCam_3'). Required. | |
| key_path | No | Optional registry subkey path relative to the hive root, e.g. 'AI\\3', 'Motion\\1', 'PTZ\\Presets', 'camevents'. Omit to return the full hive. Motion off-by-one quirk (per jaydeel on ipcamtalk, 'legacy reasons'): 'Motion' (no number) = profile 1; 'Motion\\1' = profile 2; 'Motion\\2' = profile 3; etc. AI\\<N> and PTZ\\Presets\\<N> use straight 1:1 indexing, NOT this offset. | |
| include_masks | No | Include `maskbits_*` hex blobs in the response. Default false — each blob is ~9KB and a full `PTZ\\Presets` read can exceed 250KB. Set true when you specifically need the polygon bytes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already disclosing safety, the description adds meaningful behavior: it parses a .reg export, optionally limits to a subtree, and returns a staleness warning when the file is older than 7 days. No trait contradicts the annotation.
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?
Three dense sentences carry purpose, use cases, optional parameter behavior, and a warning with no filler. The most important scoping statement is front-loaded, and every clause contributes.
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?
There is no output schema, but the description sufficiently indicates the return value (requested key subtree) and the staleness warning, while the raw parameter explains shaped vs raw output. A little more about failure or invalid key_path behavior would make it fully complete, but an agent can correctly call it from this 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?
Schema coverage is 100%, so the schema already documents camera, raw, key_path, and include_masks. The description only repeats the key_path limiting example and adds no semantics beyond the schema, so the baseline of 3 applies.
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 opens with a specific verb and resource: 'Parse a camera's .reg export and return the requested key subtree.' It then explicitly frames the tool as covering what 'the BI JSON API does NOT expose', which differentiates it from the sibling getters without requiring schema inspection.
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 provides clear when-to-use guidance by naming concrete use cases (trigger zone polygons, AI confidence thresholds, per-preset alert-skip flags, ONVIF handlers, alert actions) and positions the tool against the JSON API. It stops short of naming a specific alternative or stating when not to use it, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bi_get_sessionARead-only
Blue Iris version/license, time zone, capabilities of the current user (admin/ptz/clips/etc), and available profile/schedule/stream names.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | If true, return the raw Blue Iris JSON instead of the shaped view. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, covering the safety profile. The description adds useful context about what data is fetched, such as current user capabilities and available profiles, but it does not disclose other behavioral traits like authentication requirements or the distinction between the shaped and raw responses.
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, dense sentence that lists the returned data categories without any filler. It is front-loaded and every phrase 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?
For a read-only tool with zero required parameters and no output schema, the description gives a reasonable outline of the return contents, which helps an agent understand what to expect. It does not specify the exact response structure, but that is a minor gap for this simple, optional-parameter 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?
Input schema coverage is 100%, and the single parameter 'raw' is already fully documented in the schema. The description adds no additional parameter-level meaning, so the baseline score of 3 is appropriate.
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 identifies the resource—BI session information—by enumerating its contents: version/license, timezone, user capabilities, and profile/schedule/stream names. It differentiates this tool from siblings through that content list. However, it lacks an explicit verb like 'get' or 'returns', relying on the tool name and title for that.
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 implies this tool is for fetching session-level metadata, but it gives no explicit guidance on when to use it versus siblings such as bi_get_sysconfig or bi_get_status. No alternatives, exclusions, or preconditions are mentioned, leaving the agent to infer usage from the listed contents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bi_get_statusBRead-only
Snapshot of Blue Iris system state: active profile, schedule hold/run, CPU%, RAM, disk usage, uptime, DIO outputs, warnings.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | If true, return the raw Blue Iris JSON instead of the shaped view. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description's 'Snapshot' wording is consistent with a read-only operation. It adds context about the specific state fields covered, but beyond that it does not disclose additional behavioral traits such as response formatting, raw vs. shaped output, or potential delays. This is acceptable given the read-only annotation.
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?
A single, compact sentence with a colon-separated list of state elements. It is front-loaded with the primary purpose and every listed item adds useful specificity without wasted words.
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 read-only tool with one optional parameter and no output schema, the description provides a solid overview of the return content. It falls slightly short of full completeness because it does not mention the raw/toggle behavior or the overall output structure, but the schema covers the parameter and the field list gives adequate context.
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%, with the sole raw parameter fully described as toggling between raw and shaped view. The description does not discuss this parameter, but the baseline of 3 applies because the schema already carries the semantic weight.
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 identifies the tool as retrieving a snapshot of Blue Iris system state and enumerates the specific components (active profile, CPU%, RAM, disk usage, etc.). This distinguishes it from configuration-focused siblings like bi_get_sysconfig, though it does not name an alternative tool directly.
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 explicit when-to-use guidance is provided. There is no mention of when this should be preferred over sibling getters such as bi_get_sysconfig or bi_get_session, and no exclusions or prerequisites are stated. The usage context is only implied by the tool name and field list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bi_get_sysconfigARead-only
System config snapshot (admin required): FTP archive enable, global schedule on/off, manual record time limit, plus any DIO/MQTT state BI exposes inline. Use this instead of asking the user to screenshot Settings → Other.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | If true, return the raw Blue Iris JSON instead of the shaped view. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true, and the description adds an important behavioral detail: admin permission is required. It also discloses that it may expose DIO/MQTT state inline, which tells the agent the output can contain more than the named fields. No contradiction with annotations.
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, front-loaded with the core purpose and admin requirement, then a precise usage direction. Every clause contributes information: the config items enumerated, the DIO/MQTT note, and the 'instead of screenshot' 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?
For a single-optional-parameter read tool with full schema coverage and a readOnly annotation, the description covers what the tool returns, who can use it, and when to prefer it. No output schema exists, so the inline DIO/MQTT note helps set expectations without over-specifying.
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 covers the single 'raw' parameter at 100%, so the baseline is 3. The description's 'shaped view' language meaningfully elaborates the default return format, adding context beyond the schema's generic boolean 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?
Description names a specific verb and resource: 'Get BI system config' with a concrete snapshot listing (FTP archive enable, global schedule, manual record time limit). It also signals admin requirement, which distinguishes it from read tools that don't need elevated access.
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?
States 'Use this instead of asking the user to screenshot Settings → Other,' giving a clear when-to-use instruction. It lacks explicit exclusions (e.g., when not to use it), but it provides enough context about its unique purpose among the large sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bi_get_timelineARead-only
24-hour activity timeline (motion/trigger/alert buckets) for a camera. Requires 'camera' short name. If both 'startdate' and 'enddate' are omitted, defaults to the last 24 hours (BI returns empty spans for a rangeless query).
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | If true, return the raw Blue Iris JSON instead of the shaped view. | |
| camera | Yes | Camera short name. Required. | |
| msecpp | No | Display quantization (ms per pixel), min 128. | |
| enddate | No | Window end. Int (UTC sec), ISO-8601, or relative shorthand like '-2h', '-1d'. Defaults to now if omitted. | |
| startdate | No | Window start. Int (UTC sec), ISO-8601, or relative shorthand like '-2h', '-1d'. If given without 'enddate', the end defaults to now (so 'activity since T' works). Defaults to 24h before now when both bounds are omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds meaningful behavior beyond the annotation: omitted bounds default to the last 24 hours, and a rangeless query returns empty spans. This helps an agent predict response behavior for edge-case invocations.
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 short sentences with no filler: purpose is front-loaded, and the second sentence delivers the key default/edge-case behavior. Every clause earns its place, and the description stays compact despite covering an important behavioral nuance.
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 read-only tool with five well-documented parameters and no output schema, the description alongside the schema is largely sufficient: required parameter, default time window, and rangeless edge behavior are all stated. The return structure is only hinted at via 'buckets' and the raw-vs-shaped distinction, but nothing critical for a correct invocation is missing.
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%, so the schema already documents all five parameters. The description mostly restates the camera requirement and the default-window behavior already present in the startdate/enddate schema descriptions. It adds little semantic value beyond what the schema provides, so baseline 3 is appropriate.
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 identifies a camera-specific activity timeline with motion/trigger/alert buckets, and the tool name supplies the 'get' verb. This is readily distinguishable from sibling tools like bi_list_alerts or bi_get_clip_info because it returns an aggregated timeline rather than individual alerts or clips. The '24-hour' phrasing is slightly tied to the default window, but the second sentence resolves that ambiguity.
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 implies the use case—querying camera activity over a time window—but never explicitly states when to choose this over sibling tools such as bi_list_alerts or bi_get_camera_snapshot. It provides useful parameter-level guidance about startdate/enddate defaults and rangeless queries, but not tool-selection guidance, so usage context is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bi_list_alertsARead-only
Recent alerts with AI memo (object, confidence, license plate), zones triggered, and clip path. Requires 'camera' short name (or 'Index' for all). First stop for 'what fired when' / reconstructing an alert chain — per-alert timestamps and memos, no dedup. Use this before bi_list_log when investigating a specific event. Optional 'startdate'/'enddate' accept unix epoch int, ISO-8601 ('2026-05-27T14:09:02Z'), or relative shorthand ('-2h', '-1d'). 'view' (filter; see schema for full enum), 'search' (memo substring). 'limit' default 50. Crossover note: if 'view' is set to 'flagged', BI may also return clip items here; those clips lack the 'zones' field and their 'msec' is the clip length, not alert length.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | If true, return the raw Blue Iris JSON instead of the shaped view. | |
| view | No | Database view filter. Per BI manual § *alertlist*: 'all', 'new', 'stored', 'alerts', 'aux1'..'aux7', 'flagged', 'export', 'archive', 'people', 'vehicles', 'confirmed', 'canceled'. Per UI3 source (additional values it sends): 'zonea'..'zoneh', 'dio', 'onvif', 'audio', 'external', 'cancelled' (British). Crossover: 'flagged' may also return clip items (no 'zones' field); see manual § *cliplist* note on shared views. | |
| limit | No | Max alerts (default 50). | |
| camera | Yes | Camera short name (required). Use 'Index' for all cameras. | |
| search | No | Memo substring filter (server-side). | |
| enddate | No | Latest alert. Int (UTC sec), ISO-8601, or relative shorthand like '-2h', '-1d'. | |
| startdate | No | Earliest alert. Int (UTC sec), ISO-8601, or relative shorthand like '-2h', '-1d'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, and the description adds meaningful behavioral detail beyond that: no dedup, per-alert timestamps and memos, flexible date format parsing, default limit, and the important flagged-view crossover where clip items lack 'zones' and 'msec' means clip length instead of alert length. This exceeds what annotations alone communicate.
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 dense but well-organized: front-loaded output summary, then usage guidance, then parameter formats, then the critical crossover edge case. Every sentence contributes distinct information, and it links to the schema for the full view enum rather than duplicating it.
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 7-parameter list tool with no output schema, the description covers the essential operational context: what is returned, when to use it, date formats, filters, default limit, and an important view-related anomaly. A small gap is the lack of explicit response shape or ordering/pagination behavior, but the high schema coverage and readOnly annotation reduce the need for more.
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 baseline is 3. The description adds value beyond the schema by specifying the accepted formats for startdate/enddate (unix epoch int, ISO-8601, relative shorthand with examples), explaining that 'search' is a server-side memo substring, noting the 'Index' sentinel for camera, and giving the default for 'limit'. It does not redundantly restate every schema property.
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 uses a specific verb-resource combination ('Recent alerts...') and clearly states what the tool returns: AI memo (object, confidence, license plate), zones triggered, and clip path. It also distinguishes itself from nearby siblings by naming bi_list_log as the alternative to use after this tool and by calling itself the 'First stop' for alert-chain reconstruction.
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 explicitly says when to use this tool ('First stop for what fired when / reconstructing an alert chain') and when to prefer another ('Use this before bi_list_log when investigating a specific event'). The crossover note about 'flagged' view potentially returning clip items also warns the agent about a case that would otherwise look like a different tool's domain.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bi_list_camerasBRead-only
List of all cameras and groups: online state, motion/trigger/alert counts, stream bitrate/FPS/resolution, last alert time, error state.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | If true, return the raw Blue Iris JSON instead of the shaped view. | |
| limit | No | Cap number of cameras returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds useful content detail about what the list contains, but discloses no behavioral traits such as whether listing 'all cameras' triggers per-camera live queries, how groups are represented, or how the shaped view differs from the raw payload. No contradiction with the read-only annotation.
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 entire description is one dense sentence with no filler; the scope ('List of all cameras and groups') is front-loaded and every clause adds a specific field detail. Nothing could be trimmed without losing information.
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?
With no output schema present, the description's field enumeration is the agent's only view of the return shape, and it is reasonably informative. However, it doesn't explain how groups appear in the list, how the limit interacts with groups, or what distinguishes the shaped view from the raw one beyond the parameter 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?
Schema description coverage is 100%, with both 'raw' and 'limit' already documented in the input schema. The description adds no parameter-level meaning beyond what the schema provides, so the baseline of 3 applies.
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 names a specific verb ('List'), the resource ('all cameras and groups'), and enumerates the exact returned fields: online state, motion/trigger/alert counts, stream bitrate/FPS/resolution, last alert time, and error state. This clearly positions the tool as a status-overview listing rather than a config or snapshot tool. It doesn't explicitly contrast with any sibling, and the 'groups' inclusion is stated but not defined, which keeps it from a 5.
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?
There is no guidance on when to use this tool versus alternatives such as bi_get_status or bi_get_camera_config, and no exclusions or conditions are given. The intended use case must be inferred entirely from the field list, which is weak routing for an agent surveying 18 siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bi_list_clipsARead-only
Recent recorded clips for a camera: path, duration, resolution, flags, memo. Complementary to bi_list_alerts (clips include continuous recordings; alerts are AI/motion events). Requires 'camera' short name (or 'Index' for all). Optional 'view' (filter; see schema for full enum), 'startdate'/'enddate' accept unix epoch int, ISO-8601, or relative shorthand ('-2h', '-1d'). 'search' (memo substring, server-side), 'tiles' (true=one entry per day, useful for calendar views). 'limit' default 50. Crossover note: alert-side view values (e.g. 'alerts', 'people', 'zonea') will return alert items in this response — they have an 'msec' field meaning alert length (not clip length) and lack the 'zones' field. UI3 v91 fixed a bug where this was mishandled.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | If true, return the raw Blue Iris JSON instead of the shaped view. | |
| view | No | Database view filter. Per BI manual § *cliplist*: 'all', 'new', 'stored', 'alerts', 'aux1'..'aux5', 'flagged', 'export', 'archive', 'confirmed', 'canceled'. Per UI3 source (extra alert-side values that work here, returning alert items): 'people', 'vehicles', 'zonea'..'zoneh', 'dio', 'onvif', 'audio', 'external', 'cancelled' (British). | |
| limit | No | Max clips returned (default 50). | |
| tiles | No | If true, return one entry per day instead of one per clip. | |
| camera | Yes | Camera short name (required). Use 'Index' for all cameras. | |
| search | No | Memo substring filter (server-side). | |
| enddate | No | Latest clip. Int (UTC sec), ISO-8601, or relative shorthand like '-2h', '-1d'. | |
| startdate | No | Earliest clip. Int (UTC sec), ISO-8601, or relative shorthand like '-2h', '-1d'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only state readOnlyHint=true and a title; the description adds meaningful behavior: server-side search, tiles returning one entry per day, default limit of 50, and date parsing flexibility. It even discloses the UI3 v91 bug fix context. The crossover alert-side behavior is unusually transparent about a surprising response shape, though it doesn't enumerate all response fields beyond the listed ones. Since annotations are minimal, this description carries the behavioral burden well.
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 dense paragraph with no wasted words; it front-loads the core purpose and required parameter. The crossover note and UI3 v91 mention are relevant but add length; still, each sentence serves a purpose. It could be improved with slight formatting breaks, but it is efficiently packed.
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 list tool with 8 parameters and no output schema, the description covers the main parameters, their formats, and response-shape caveats. No output schema exists, so the description should explain what is returned; it does list returned clip fields and flags the alert crossover fields, but does not specify pagination or how limit interacts with tiles beyond the default. Given readOnlyHint annotation and the extensive parameter coverage, this is nearly complete.
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 a baseline of 3 applies. The description adds meaning beyond the schema by explaining why tiles is useful for calendar views, clarifying that the crossover view values return alert items with an 'msec' field that means alert length, and explaining server-side memo substring search. It also emphasizes that camera is required and 'Index' means all. However, some schema descriptions already cover the same semantics, so the added value is moderate, not exceptional.
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 opens with a clear verb-resource pair: 'Recent recorded clips for a camera: path, duration, resolution, flags, memo.' It explicitly contrasts with bi_list_alerts, noting that clips include continuous recordings while alerts are AI/motion events. This distinguishes it well from the sibling that appears most similar.
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 directly says it is 'Complementary to bi_list_alerts' and explains the difference. It also provides a crossover warning explaining that alert-side view values return alert items, a subtle but critical usage detail. Required camera parameter and optional view/date/search/tiles/limit semantics are all covered, including date format alternatives and relative shorthand.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bi_list_logARead-only
Recent Blue Iris system log entries with optional filters.
Pick the right tool: for reconstructing 'what fired when' on a camera, start with bi_list_alerts — per-alert timestamps with no dedup. This log is best for system events (profile changes, disk ops, logins, errors) and aggregate activity counts.
Filters:
since — UTC epoch sec, ISO-8601, or '-15m'/'-2h'/'-1d' (server-side via aftertime)
camera — exact match on entry.obj (clone cameras log under their own short names)
obj — exact match on entry.obj (escape hatch: 'App', 'MQTT', 'DB', 'AI_Input', drive letters, usernames)
levels — list of accepted level ints; empirical: 0=info, 1=warn, 2=error, 3=trigger/alert aggregate (deduped — use bi_list_alerts for per-event), 4=status change, 10=user
match — case-insensitive substring on entry.msg
regex — Python regex on entry.msg (IGNORECASE); xor with match
limit — applied AFTER filtering (default 100)
Returns {entries, scanned, matched, warning?}. raw=true bypasses the envelope and shaper. Admin required.
BI aggregates repeated messages: count is cumulative since BI startup (or last log clear), and date is when BI last summed the entry, not necessarily the most recent occurrence. To tell whether a message is actively firing now, re-query with a tight since=-5m window.
| Name | Required | Description | Default |
|---|---|---|---|
| obj | No | Exact match on entry.obj. Use for non-camera subsystems: 'App', 'MQTT', 'DB', 'AI_Input', 'Alerts', 'Log', drive letters ('A:', 'D:'), or usernames. | |
| raw | No | If true, return the raw Blue Iris JSON instead of the shaped view. | |
| limit | No | Max entries (default 100). | |
| match | No | Case-insensitive substring match on entry.msg. | |
| regex | No | Python regex on entry.msg (IGNORECASE). XOR with match. | |
| since | No | Earliest entry to return. Int (UTC sec), ISO-8601, or relative shorthand like '-15m', '-2h', '-1d'. | |
| camera | No | Exact match on entry.obj. Clone cameras (e.g. SecCam_11AI) have their own short names and log separately. | |
| levels | No | Keep entries whose level is in this list. Empirical: 0=info, 1=warn, 2=error, 3=trigger/alert aggregate (deduped — use bi_list_alerts for per-event), 4=status, 10=user. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description adds substantial behavioral context: admin requirement, return envelope shape ({entries, scanned, matched, warning?}), raw mode behavior, and the critical aggregation caveat that count is cumulative and date reflects last summation rather than most recent occurrence. It also warns that level 3 entries are deduped and points to bi_list_alerts for per-event data.
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 long but every section earns its place: routing, filter semantics, return shape, and aggregation caveat. It is front-loaded with the most important sibling distinction and remains scannable with clear labels. No filler or repetition of schema content.
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?
With 8 parameters, no output schema, and only a readOnly annotation, the description nevertheless covers return structure, permission requirements, filter behavior, dedup semantics, and how to detect actively firing messages. There are no critical gaps for an agent to call this safely and 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?
Even though schema coverage is 100%, the description adds meaning far beyond the schema: 'limit is applied AFTER filtering', 'regex is xor with match', 'since supports relative shorthand server-side via aftertime', clone cameras log under short names, and the empirical level meanings. This materially improves an agent's ability to call the tool 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 states a specific verb and resource: 'Recent Blue Iris system log entries with optional filters.' It clearly distinguishes itself from bi_list_alerts by explicitly positioning this tool for system events and aggregate counts versus per-alert timestamps. An agent can immediately tell this apart from its 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 'Pick the right tool' section explicitly tells the agent when to use bi_list_alerts instead, and what this log is best for: system events and aggregate activity counts. It gives concrete routing guidance without leaving the decision to inference.
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.
19 tool updates
v0.3.3- First observed
bi_audit_actions - First observed
bi_explain_alert_chain - First observed
bi_get_actionset - First observed
bi_get_alert_image - First observed
bi_get_alert_tracks - First observed
bi_get_camera_config - First observed
bi_get_camera_motion_config - First observed
bi_get_camera_snapshot - First observed
bi_get_clip_info - First observed
bi_get_ptz_status - First observed
bi_get_reg - First observed
bi_get_session - First observed
bi_get_status - First observed
bi_get_sysconfig - First observed
bi_get_timeline - First observed
bi_list_alerts - First observed
bi_list_cameras - First observed
bi_list_clips - First observed
bi_list_log
TDQS
Scored across 19 tools
Most tools target clearly distinct resources or workflows — alerts, clips, log, timeline, snapshots, config, and PTZ status are well separated. A few could be confused at first glance, particularly bi_get_actionset vs bi_audit_actions and bi_get_session vs bi_get_status vs bi_get_sysconfig, but the descriptions draw clear boundaries.
All tools follow a consistent bi_<verb>_<object> pattern with snake_case throughout. get is used for single-item/state lookups, list is used for collections, and explain/audit are appropriately used for analytical tools, so the naming is predictable and coherent.
Nineteen tools is slightly above the ideal 3-15 range, but the count is justified by the breadth of the Blue Iris domain: system health, per-camera config, alert/clip forensics, PTZ state, logs, and .reg inspection. It feels near the upper edge rather than bloated.
The read/investigation surface is deep, but there are no write or control tools at all — no PTZ movement, profile switching, camera trigger, or clip management — which makes the server one-directional. Additionally, bi_get_alert_tracks is documented as broken, creating a dead end for AI track workflows.
Maintenance
Related MCP Connectors
Ask your security cameras anything and set up alert rules in a sentence. Built into Agent DVR.
1Connect Claude to Fathom meeting recordings, transcripts, and summaries
- platform7nOAuthtech.p7n
Connect Claude to your Platform7n workspaces — chat, links, and tasks. One-click OAuth.
WHOOP recovery, strain, sleep and workouts in Claude via official WHOOP OAuth. Free, open source.
Related MCP Servers
- -licenseAqualityNot gradedmaintenanceA bridge between AI assistants like Claude and Anava-enabled Axis cameras, enabling real-time image analysis, event monitoring, and camera management through natural language commands.4-

Rhombus MCP Serverofficial
AlicenseAqualityBmaintenanceEnables AI assistants to interact with Rhombus physical security systems, providing access to smart cameras, access control, IoT sensors, and alarm monitoring through the Rhombus API.3117 npmMIT- AlicenseNot gradedqualityDmaintenanceConnects AI assistants like Claude to Jira projects, enabling natural language queries and operations for issue management, project tracking, comments, and workflows through the Jira REST API.11,401 npm74ISC
- FlicenseNot gradedqualityDmaintenanceConnects Claude to OpenNMS, allowing plain language interaction with alarms, nodes, events, asset records, categories, and service collection.1-