. . . SIGNAL // LOCKED . . .
[CAM] [ALERT] [RULE]
\ | /
\ | /
[FACE] ----\------ [ MCP ] ------/---- [LPR]
\ | /
\ | /
[SEARCH] | [ANALYSIS]
|
██╗██╗ ██╗███████╗██████╗ █████╗ █████╗ ██╗ ███╗ ███╗ ██████╗██████╗
██║██║ ██║██╔════╝██╔══██╗██╔══██╗██╔══██╗██║ ████╗ ████║██╔════╝██╔══██╗
██║██║ ██║█████╗ ██║ ██║███████║███████║██║ ██╔████╔██║██║ ██████╔╝
██║╚██╗ ██╔╝██╔══╝ ██║ ██║██╔══██║██╔══██║██║ ██║╚██╔╝██║██║ ██╔═══╝
██║ ╚████╔╝ ███████╗██████╔╝██║ ██║██║ ██║██║ ██║ ╚═╝ ██║╚██████╗██║
╚═╝ ╚═══╝ ╚══════╝╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝
| |
| VIDEO INTELLIGENCE <-> AI TOOLS |
+-------------------+-------------------+
|
316 API OPERATIONS
63 MCP TOOLS
:: DECODE // OBSERVE // ACT ::
ivedaai-mcp-server
An MCP server for the IvedaAI video analytics API. Point a client that launches local MCPprocesses, such as Claude Desktop or Claude Code, at your IvedaAI deployment and drive it in naturallanguage: search footage, manage cameras and alert rules, run analysis jobs, work with face andlicence-plate watchlists.
Transports: the default command uses stdio. An authenticated HTTP previewis available through node dist/http.js /protected/path/customer.json: read-only by default, with optionaladministrator-enabled actions and separate user consent to changes. It uses a fixedcustomer server and isolated user accounts. Customers can use their existing IvedaAI login;no separate sign-in vendor is required. An HTTPS reverse proxy and approved AI-client callbackconfiguration are needed; real browser-client/TLS validation is still outstanding.See browser connection requirements for deployment options.Pilot teammates can use the team quickstart; operators should startwith the per-user pilot route.IVEDAAI_BASE_URL is the upstream application's address, not an MCP connection URL.
The bundled API defines 316 operations. By default, 295 are exposed through 63 resource tools,plus three helper tools; 21 collection-wide DELETEs are withheld. See why.
Quickstart
The npm package was not yet available when checked on 2026-09-04. Until the initial release ispublished, clone this repository, run npm ci and npm run build, then configure the client with command: "node"and args: ["/absolute/path/to/ivedaAI-mcp-server/dist/index.js"].
After publication, this configuration lets npx fetch the package:
{
"mcpServers": {
"ivedaai": {
"command": "npx",
"args": ["-y", "ivedaai-mcp-server"],
"env": {
"IVEDAAI_BASE_URL": "https://ivedaai.example.com",
"IVEDAAI_USERNAME": "your-username",
"IVEDAAI_PASSWORD": "your-password"
}
}
}
}
Where that file lives:
| client | path |
|---|---|
| Claude Desktop (macOS) | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Claude Desktop (Windows) | %APPDATA%\Claude\claude_desktop_config.json |
| Claude Code | claude mcp add ivedaai --env IVEDAAI_BASE_URL=… --env IVEDAAI_USERNAME=… --env IVEDAAI_PASSWORD=… -- npx -y ivedaai-mcp-server |
Restart the client, and ask it something like "list the cameras that are currently offline".
Try it without a client:
IVEDAAI_BASE_URL=https://ivedaai.example.com \
IVEDAAI_USERNAME=you IVEDAAI_PASSWORD=secret \
npx -y ivedaai-mcp-server
It speaks JSON-RPC over stdin/stdout and logs a startup line to stderr. --help prints theconfiguration reference; --version prints the version.
Read-only first
If you are evaluating this, or connecting it to anything you would not want to write to, start here:
"env": { "IVEDAAI_READ_ONLY": "true", "IVEDAAI_BASE_URL": "…", "IVEDAAI_USERNAME": "…", "IVEDAAI_PASSWORD": "…" }
Mutating operations are withheld from the tool list. Reads include GETs and the three verifiedquery-only POSTs for alert statistics, search, and latest alerts. The two write-oriented conveniencetools are withheld too.
Configuration
Only the first three are required.
| Variable | Default | Description |
|---|---|---|
IVEDAAI_BASE_URL |
— | Origin of your IvedaAI server, e.g. https://ivedaai.example.com. No path. |
IVEDAAI_USERNAME |
— | IvedaAI account username. |
IVEDAAI_PASSWORD |
— | IvedaAI account password. |
IVEDAAI_READ_ONLY |
false |
true serves GETs and verified query-only alert POSTs; mutating operations and the two write-oriented convenience tools are withheld. |
IVEDAAI_ALLOW_COLLECTION_DELETE |
false |
true permits the 21 DELETEs that name no record — see Destructive operations. |
IVEDAAI_REDACT_SECRETS |
true |
Masks credential-shaped fields (keys, secrets, passphrases) in responses. false disables it. |
IVEDAAI_ALLOW_INSECURE_TLS |
false |
true skips TLS certificate verification, for on-prem deployments with self-signed certificates. Traffic stays encrypted; the certificate is not checked. Scoped to this server's requests, not process-wide. |
IVEDAAI_TIMEOUT_MS |
30000 |
Per-request timeout, including reading the response body. Several IvedaAI endpoints block rather than failing fast when a camera is unreachable, so this matters. |
IVEDAAI_MAX_RESPONSE_BYTES |
28672 |
Response body bytes read before truncating. Sized for what a model client can receive, not for what the API can send — bisected against a real client, 38 KB reached the model and 57 KB did not. Larger responses come back flagged truncated with a note saying to narrow the request. |
IVEDAAI_INLINE_IMAGES |
true |
Image responses are handed to the client as viewable images. false returns only a description (type, size, filename). |
IVEDAAI_MAX_IMAGE_BYTES |
4194304 |
Separate budget for images, because a client charges for an image by its dimensions rather than the length of its base64 — holding them to the response cap above would truncate every one for no saving. An image larger than this is described rather than attached, since a partly-read image is a corrupt file, not a smaller one. |
IVEDAAI_UPLOAD_ROOT |
— | Directory containing files the server may upload. Local-file uploads are disabled until this is set. Symlinks that escape the directory are refused. |
IVEDAAI_ALLOW_UNCONFINED_UPLOADS |
false |
Emergency compatibility escape hatch. true permits uploads outside a configured root, but still refuses conventional credential paths, known Linux virtual kernel filesystems such as procfs and sysfs, non-regular files, and oversized files. Prefer IVEDAAI_UPLOAD_ROOT. |
IVEDAAI_MAX_UPLOAD_BYTES |
67108864 |
Maximum bytes read from an approved upload file. Reads are descriptor-bound and stop at the cap even if the file grows after validation. |
IVEDAAI_CLIENT_ID / IVEDAAI_CLIENT_SECRET |
— | Sent as HTTP Basic auth on the token request, if your deployment requires client credentials. |
IVEDAAI_ALLOW_LOSSY_UPDATE |
false |
true disables the lossy-update guard. Intended for the maintainers' CRUD probe; leave it unset. |
IVEDAAI_SWAGGER_PATH |
bundled | Path to an alternate OpenAPI 3 document, if your deployment's API differs from the bundled one. |
Copy .env.example if you prefer a file. The server does not load .env automatically:export its values into the environment or run a local build with node --env-file=.env dist/index.js.
Authentication
OAuth2 password grant against POST {base}/ainvr/api/oauth2/token. The server logs in on first use,caches the access token, and refreshes it as it nears expiry. Note that the token endpoint is ratelimited: a client that starts a fresh process per request will hit it.
Destructive operations
Twenty-one of this API's DELETEs take no id in the path — DELETE /api/cameras versusDELETE /api/cameras/{cameraId}. The only subject would come from an optional request body, and whatthe API does when that body is omitted is not specified anywhere. One character of difference, andthe mistake cannot be undone.
They are withheld by default: absent from the tool descriptions and the operation enum, andrefused with an explanation naming the single-record alternative if a client sends one anyway. SetIVEDAAI_ALLOW_COLLECTION_DELETE=true to permit them. IVEDAAI_READ_ONLY=true overrides that.
See SECURITY.md for the rest of the defaults, and for what leaves your deployment.
Using it
Every tool takes an operation and the arguments that operation needs:
{ "operation": "GET /api/cameras", "query": { "size": 20, "nameContains": "lobby" } }
- Usage guide — calling conventions and worked workflows: onboarding cameras,alert rules, analysis jobs, face and licence-plate watchlists.
- Tool reference — every tool, operation and parameter.
- Design and behaviour — why one tool per resource type, what the server doesabout partial updates the API silently discards, and the response format.
If a model needs the exact shape of a request body, ivedaai_get_schema returns it on demand ratherthan every tool description carrying it.
Requirements
Node 22.16.0+ in the 22.x line, or Node 24+, and an IvedaAI 10.0 deployment. Use the latest patched Node 22 or 24 LTSrelease in production; Node 20 is no longer supported. The bundled API document is 10.0; pointIVEDAAI_SWAGGER_PATH at your own if you run something else.
Earlier Node 22 versions and Node 23 are unsupported because request deadlines depend on theAbortSignal.any() timeout fix included in Node 22.16.0.CI covers the minimum supported Node 22 version and Node 24.
Production operation
For stdio, each MCP client starts its own process and communicates over stdin/stdout; that entrypoint has no HTTP listener. The separate HTTP preview uses existing IvedaAI loginbehind an operator-managed HTTPS proxy. Neither mode provisions a database, container or separatehealth endpoint. Successful MCP initialization and a small authorized read provide integration checks.
Use HTTPS with a valid certificate, a dedicated IvedaAI account with only the required applicationpermissions, and read-only mode for monitoring. The server adds read-only, collection-delete,lossy-update, and upload restrictions; record-level authorization remains IvedaAI's responsibility.Treat client configuration as a secret and approve an upload directory only when uploads are needed.After release, pin the approved npm version in your client configuration for reproducible installs.
Outbound redirects are refused. Configure the final deployment origin directly. Incomplete ormalformed JSON is withheld when redaction is enabled, since its credential fields cannot bereliably masked. Reduce the page size or narrow the filter; SSE reads retain only complete,redacted events. Cancellation and client disconnect stop further API work, but cannot undo anapplication write already received. Inspect uncertain writes before retrying.
Contributing
See CONTRIBUTING.md. Upgrading the API document?npm run diff:spec -- --against <new-spec.json> reports what changed and, more usefully, whetheranything this repo records now points at an operation that no longer exists.
License
MIT — see LICENSE.