Skip to main content
Glama
                         . . . 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

CI

An MCP server for the IvedaAI video analytics API. Point a client that launches local MCP processes, such as Claude Desktop or Claude Code, at your IvedaAI deployment and drive it in natural language: search footage, manage cameras and alert rules, run analysis jobs, work with face and licence-plate watchlists.

Transports: the default command uses stdio. An authenticated HTTP preview is available through node dist/http.js /protected/path/customer.json: read-only by default, with optional administrator-enabled actions and separate user consent to changes. It uses a fixed customer 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 callback configuration 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 start with 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 is published, 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 the configuration reference; --version prints the version.

Related MCP server: Discovery Engine MCP Server

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 verified query-only POSTs for alert statistics, search, and latest alerts. The two write-oriented convenience tools 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 rate limited: 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 versus DELETE /api/cameras/{cameraId}. The only subject would come from an optional request body, and what the API does when that body is omitted is not specified anywhere. One character of difference, and the mistake cannot be undone.

They are withheld by default: absent from the tool descriptions and the operation enum, and refused with an explanation naming the single-record alternative if a client sends one anyway. Set IVEDAAI_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 does about 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 rather than 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 LTS release in production; Node 20 is no longer supported. The bundled API document is 10.0; point IVEDAAI_SWAGGER_PATH at your own if you run something else.

Earlier Node 22 versions and Node 23 are unsupported because request deadlines depend on the AbortSignal.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 entry point has no HTTP listener. The separate HTTP preview uses existing IvedaAI login behind an operator-managed HTTPS proxy. Neither mode provisions a database, container or separate health 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 application permissions, 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 or malformed JSON is withheld when redaction is enabled, since its credential fields cannot be reliably 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 an application 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, whether anything this repo records now points at an operation that no longer exists.

License

MIT — see LICENSE.

Available Tools

66 tools
ivedaai_accountIvedaAI: AccountA
Destructive

IvedaAI API — Account operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/accounts — List accounts query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, nameContains?:string, userGroupId?:string, userGroupNameContains?:string, authenticationTypes?:string enum:Ldap|Local|OpenID, excludeSupremeAdmin?:boolean

POST /api/accounts — Create account body: AccountRequest — required: email, locale, name, password, userGroupId; ivedaai_get_schema for all fields

DELETE /api/accounts/{accountId} — Delete account by id path: accountId*:integer

GET /api/accounts/{accountId} — Find account by id path: accountId*:integer

PATCH /api/accounts/{accountId} — Patch account path: accountId*:integer body: AccountRequest — required: email, locale, name, password, userGroupId; ivedaai_get_schema for all fields NOTE: GET /api/accounts/{accountId} returns this field under a different key — userGroupId → userGroup.userGroupId. This endpoint has been confirmed to leave omitted fields alone, so this is for reading the value, not a warning about losing it.

PUT /api/accounts/{accountId} — Update account path: accountId*:integer body: AccountRequest — required: email, locale, name, password, userGroupId; ivedaai_get_schema for all fields NOTE: GET /api/accounts/{accountId} returns this field under a different key — userGroupId → userGroup.userGroupId. This endpoint refuses partial bodies outright, so the full object is required regardless.

GET /api/accounts/{accountId}/permissions — List account permissions path: accountId*:integer query: type?:string enum:Camera|FaceCategory|LicensePlateCategory

DELETE /api/accounts/api-keys — Delete API key in batch query: apiKeyIds*:string

GET /api/accounts/api-keys — Find all API keys for the account

POST /api/accounts/api-keys — Create API key for the specific account body: { isActive*:boolean, name?:string }

DELETE /api/accounts/api-keys/{keyId} — Delete API key path: keyId*:string

PATCH /api/accounts/api-keys/{keyId} — Patch API key path: keyId*:string body: { isActive*:boolean, name?:string }

GET /api/accounts/findByName — Find account by name query: accountName*:string

Inputs: operation (required), body, file, path, +1 more.

ivedaai_add_cameraIvedaAI: add cameras from an IP or RTSP URLA

Adds one or more cameras (e.g. from a list of IPs or RTSP stream URLs) and starts their connection. The raw CameraRequest schema has undocumented gotchas confirmed by live testing:

  • A schema-valid minimal body (name, streamUrl, engineProfileId, roiContour) still throws a bare server-side error unless several other optional-looking fields are also filled — this tool fills them with sane defaults automatically (resolution 1920x1080, frameRate 25, empty schedule/plugins, etc.).

  • Creating the record is NOT enough for the camera to actually connect or be fully visible in the product UI: a separate activation step (allocating a processing resource and starting the stream) is required, which this tool performs automatically unless activate: false is passed.

  • A creation error can still partially create the camera server-side before failing. This tool checks for that by exact name after any error and reports created_despite_error with the real cameraId instead of a false failed, so you don't end up with a confusing orphaned duplicate.

Only name plus either streamUrl or ip are required per camera — everything else is optional and defaulted (engineProfileId defaults to the first engine profile found; roiContour defaults to a full-frame rectangle). Providing the exact streamUrl is much more reliable than ip alone: this tool can only guess a generic RTSP root path from ip/account/password, which often doesn't match a specific camera's actual manufacturer-specific stream path.

IMPORTANT: activation starting successfully does NOT mean the stream is actually connected — that can take anywhere from under a second to failing after 90+ seconds with no error at all (observed live), which usually indicates a network-reachability problem between the IvedaAI server and the camera, not a problem with this tool. Check back later with the returned jobId via the ivedaai_job tool (GET /api/jobs/{jobId}), or re-check the camera via ivedaai_camera (GET /api/cameras/{cameraId}) for a populated status field, to confirm it actually connected.

Inputs: cameras (required), ainvrId, activate.

ivedaai_ainvrIvedaAI: AinvrA
Destructive

IvedaAI API — Ainvr operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/ainvrs — List Ainvrs query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean

POST /api/ainvrs — Create Ainvr body: AinvrRequest — required: host, name, password, port, scheme, username; ivedaai_get_schema for all fields

PUT /api/ainvrs — Sync Cluster(s) by id query: ainvrIds*:integer, notify?:boolean

DELETE /api/ainvrs/{ainvrId} — Delete ainvr by id path: ainvrId*:integer

GET /api/ainvrs/{ainvrId} — Find Ainvr by id path: ainvrId*:integer

PATCH /api/ainvrs/{ainvrId} — patch Ainvr path: ainvrId*:integer body: AinvrRequest — required: host, name, password, port, scheme, username; ivedaai_get_schema for all fields

PUT /api/ainvrs/{ainvrId} — Update Ainvr path: ainvrId*:integer body: AinvrRequest — required: host, name, password, port, scheme, username; ivedaai_get_schema for all fields

PUT /api/ainvrs/{ainvrId}/cameras — Sync Ainvr Cameras path: ainvrId*:integer

POST /api/ainvrs/validate — Check Ainvr connection body: AinvrRequest — required: host, name, password, port, scheme, username; ivedaai_get_schema for all fields

Inputs: operation (required), body, file, path, +1 more.

ivedaai_alertIvedaAI: AlertA
Destructive

IvedaAI API — Alert operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/alerts — Find alerts query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, start*:string(yyyy-MM-dd[ HH:mm:ss[Z]]), end*:string(yyyy-MM-dd[ HH:mm:ss[Z]]), timezone?:string, ainvrIds?:integer, cameraIds?:integer, alertRuleIds?:string, alertTypes?:string enum:CAMERA_ABNORMAL|CROWD_DETECTION|DWELL|FACE_RECOGNITION|FALL|INTRUSION|LPR|OBJECT_COUNTING, states?:string enum:InProgress|Resolved|Unresolved

PUT /api/alerts — Chage alert state body: { alertIds*:integer[], state*:enum(InProgress|Resolved|Unresolved) }

POST /api/alerts/_search — Search alerts body: AlertQuery — ivedaai_get_schema for all fields

DELETE /api/alerts/{alertId} — Delete alert by id path: alertId*:integer

GET /api/alerts/{alertId} — Get alert details path: alertId*:integer

GET /api/alerts/latest — Find latest alerts query: size?:integer, ainvrIds?:integer, alertRuleIds?:string, cameraIds?:integer, alertTypes?:string enum:CAMERA_ABNORMAL|CROWD_DETECTION|DWELL|FACE_RECOGNITION|FALL|INTRUSION|LPR|OBJECT_COUNTING, states?:string enum:InProgress|Resolved|Unresolved, start*:string(yyyy-MM-dd HH:mm:ss)

POST /api/alerts/latest — Query latest alerts body: AlertQuery — ivedaai_get_schema for all fields

POST /api/alerts/pairs — Find alerts with rule with camera pars body: AlertRequest — ivedaai_get_schema for all fields

POST /api/alerts/statistics — Get alert statistics query: by*:string enum:camera|day|hour|minute|month|rule|state|type body: AlertQuery — ivedaai_get_schema for all fields

Inputs: operation (required), body, file, path, +1 more.

ivedaai_alert_integrationIvedaAI: configure and test alert-routing integrationsA

Configures and tests AlertRule.trigger — the mechanism that routes IvedaAI alerts to external systems (generic HTTP webhooks, named VMS/PSIM platforms, email, Immix, mobile push). The raw API schema here is deeply nested and has undocumented gotchas (see below), confirmed by live testing rather than the spec alone.

Actions: list_types — no API call; returns this same type/testability reference as JSON. test — builds the correct trigger payload for type+config and calls POST /api/alertTriggers to live-test it, returning a plain-language verdict (success / unsupported / invalid_config / connection_failed). Only 'request', 'mobile', and the 13 VMS types are testable — 'mail'/'immix' always return 'unsupported' (confirmed against a real server). How long a VMS connection failure takes to report is unpredictable — repeated tests against the same unreachable address ranged from under a second to ~24s in testing, not tied to any particular vendor — the default 60000ms timeout is meant to cover the slow case regardless of which VMS type you're testing; override via timeoutMs if you need even more headroom. apply — attaches the built trigger to an existing alert rule (alertRuleId, its UUID). Does not require having called 'test' first, but doing so is recommended. It reads the rule first and re-sends everything the read exposes alongside the new trigger: name (returned as alertName), alertType, description, isEnabled, plus weekdays/enableForever from schedule and roiIds/cameraIds/hashtags/typeLogic/cooldownInterval parsed out of the condition JSON string. It refuses to write if that read fails or lacks the required fields. This is precaution rather than repair — PATCH /api/alertRules/{alertRuleId} was live-tested and merges, leaving omitted fields alone, so applying a trigger does not wipe the rule. (PUT on the same path is different: it rejects a partial body with a 500, so send the full object there.)

Config shape by category: webhook (request): { method, url, headers?, params?, authorization?, httpBody? } — authorization/httpBody default to {auth:"NONE"}/{type:"NONE"} automatically; the server requires them present even when unused, despite the spec marking them optional. vms (13 named platforms): { ip, port, username?, password?, protocol?, severity?, cameraIds?, ... } — see ivedaai_get_schema("AlertTriggerNvr") for the full field list. mail/immix: { emails: [{mailIds?, subject?, content?}], smtpServer, port } mobile: { enableCriticalAlertNotice? } (all fields optional)

Type reference: WEBHOOK: request — testable — Generic outbound HTTP webhook — POST/GET/etc. to any URL. MOBILE: mobile — testable — Push notification to the IvedaAI mobile app. VMS: milestone — testable — Milestone VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. genetec — testable — Genetec VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. nx — testable — Nx VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. dw — testable — Dw VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. lux — testable — Lux VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. salient — testable — Salient VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. axis — testable — Axis VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. ocularis — testable — Ocularis VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. digifort — testable — Digifort VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. avigilon — testable — Avigilon VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. hanwha — testable — Hanwha VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. amag — testable — Amag VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. idis — testable — Idis VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. MAIL: mail — NOT testable via 'test' — SMTP email notification. Not live-testable via POST /api/alertTriggers (confirmed: returns "Unsupported check connection alert trigger type"). immix — NOT testable via 'test' — Immix alarm-monitoring-station notification. Shares mail's underlying type; not live-testable either (confirmed).

Inputs: action (required), type, config, timeoutMs, +1 more.

ivedaai_alert_ruleIvedaAI: AlertRuleA
Destructive

IvedaAI API — AlertRule operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/alertRules — Find alert rules query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, ainvrIds?:integer, cameraIds?:integer, name?:string, camName?:string, eventTypes?:string enum:CAMERA_ABNORMAL|CROWD_DETECTION|DWELL|FACE_RECOGNITION|FALL|INTRUSION|LPR|OBJECT_COUNTING

POST /api/alertRules — Create alert rule body: AlertRuleRequest — ivedaai_get_schema for all fields

DELETE /api/alertRules/{alertRuleId} — Delete alert rule by id path: alertRuleId*:string

GET /api/alertRules/{alertRuleId} — Find alert rule by id path: alertRuleId*:string

PATCH /api/alertRules/{alertRuleId} — Patch alert rule path: alertRuleId*:string body: AlertRuleRequest — ivedaai_get_schema for all fields NOTE: GET /api/alertRules/{alertRuleId} returns these fields under a different key — cameraIds → condition (JSON string).cameras, cooldownInterval → condition (JSON string).cooldownInterval, enableForever → schedule.forever, hashtags → condition (JSON string).hashtags, name → alertName, roiIds → condition (JSON string).roiIds, typeLogic → condition (JSON string).typeLogic, weekdays → schedule.weekdays. This endpoint has been confirmed to leave omitted fields alone, so this is for reading the value, not a warning about losing it. NOTE: "abnormalTypes", "countingRule", "faceCategoryIds", "idrAccess", "lineIds", "lprCategoryIds", "lprTypes", "personTypes", "roiTypes" have no known equivalent in GET /api/alertRules/{alertRuleId}, so they cannot be read back — but this endpoint keeps omitted fields, so they survive an update that leaves them out.

PUT /api/alertRules/{alertRuleId} — Update alert rule path: alertRuleId*:string body: AlertRuleRequest — ivedaai_get_schema for all fields NOTE: GET /api/alertRules/{alertRuleId} returns these fields under a different key — cameraIds → condition (JSON string).cameras, cooldownInterval → condition (JSON string).cooldownInterval, enableForever → schedule.forever, hashtags → condition (JSON string).hashtags, name → alertName, roiIds → condition (JSON string).roiIds, typeLogic → condition (JSON string).typeLogic, weekdays → schedule.weekdays. This endpoint refuses partial bodies outright, so the full object is required regardless. NOTE: "abnormalTypes", "countingRule", "faceCategoryIds", "idrAccess", "lineIds", "lprCategoryIds", "lprTypes", "personTypes", "roiTypes" have no known equivalent in GET /api/alertRules/{alertRuleId}, so they cannot be read back — but this endpoint refuses partial bodies, so an update omitting them fails rather than resetting anything.

GET /api/alertRules/types — Find alert rule types

GET /api/alertTypes — Find alert rule types

Inputs: operation (required), body, file, path, +1 more.

ivedaai_alert_triggerIvedaAI: AlertTriggerA

IvedaAI API — AlertTrigger operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/alert-triggers/metadata — Get alert trigger metadata query: view?:string enum:All|Fr|Id|Lpr|Pc|Post|Vc

POST /api/alertTriggers — Test alert triggers body: { trigger?:AlertTrigger }

Inputs: operation (required), body, file, path, +1 more.

ivedaai_analytic_configIvedaAI: AnalyticConfigA
Destructive

IvedaAI API — AnalyticConfig operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/analytic-configs — Find analytic configs query: cameraId*:integer, engines?:string

POST /api/analytic-configs — Create analytic config body: { cameraId*:integer, config*:JsonObject, engine*:string }

DELETE /api/analytic-configs/{configId} — Delete analytic config path: configId*:integer

GET /api/analytic-configs/{configId} — Find analytic config path: configId*:integer

PATCH /api/analytic-configs/{configId} — Update analytic config path: configId*:integer body: { cameraId*:integer, config*:JsonObject, engine*:string }

Inputs: operation (required), body, file, path, +1 more.

ivedaai_audit_trailIvedaAI: AuditTrailA

IvedaAI API — AuditTrail operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/auditTrails — Find audit trails query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, start*:string(yyyy-MM-dd[ HH:mm:ss[Z]]), end*:string(yyyy-MM-dd[ HH:mm:ss[Z]]), accountName?:string, accountIds?:integer, keyword?:string, sourceIp?:string, action?:string enum:ACTIVATE|ADD|BATCH_DELETE|CANCEL|DEACTIVATE|DELETE|DISABLE|DOWNLOAD

POST /api/auditTrails — create audit trails body: AuditTrailRequest — required: action, message, objectType; ivedaai_get_schema for all fields

Inputs: operation (required), body, file, path, +1 more.

ivedaai_authenticationIvedaAI: AuthenticationA

IvedaAI API — Authentication operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

POST /api/auth — Get X-Auth-Token body: { password?:string, username?:string }

Inputs: operation (required), body, file, path, +1 more.

ivedaai_brandIvedaAI: BrandA
Read-only

IvedaAI API — Brand operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/brands — List brands

Inputs: operation (required), body, file, path, +1 more.

ivedaai_cameraIvedaAI: CameraA
Destructive

IvedaAI API — Camera operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/cameras — Find cameras query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, ainvrId?:integer, name?:string, nameContains?:string, cameraTypes?:string enum:App|External|Footage|General|Onvif|RecordedAnalytic|VideoSource, isLocal?:boolean, latitude?:number, longitude?:number, isActivate?:boolean, plugins?:string, pluginsAll?:string, floorPlanId?:string, cameraIds?:integer, cameraGroupIds?:string, groupNameContains?:string, fetchCameraGroups?:boolean

POST /api/cameras — Create camera query: ainvrId?:integer body: CameraRequest — required: cameraType; ivedaai_get_schema for all fields

DELETE /api/cameras/{cameraId} — Delete camera by id path: cameraId*:integer

GET /api/cameras/{cameraId} — Find camera by id path: cameraId*:integer

PATCH /api/cameras/{cameraId} — Patch cameara path: cameraId*:integer body: CameraRequest — required: cameraType; ivedaai_get_schema for all fields NOTE: GET /api/cameras/{cameraId} returns this field under a different key — nvrId → nvr.nvrId. This endpoint has been confirmed to leave omitted fields alone, so this is for reading the value, not a warning about losing it. NOTE: "doRecording", "engineConfig" have no known equivalent in GET /api/cameras/{cameraId}, so they cannot be read back — but this endpoint keeps omitted fields, so they survive an update that leaves them out.

PUT /api/cameras/{cameraId} — Update cameara path: cameraId*:integer body: CameraRequest — required: cameraType; ivedaai_get_schema for all fields NOTE: GET /api/cameras/{cameraId} returns this field under a different key — nvrId → nvr.nvrId. This endpoint refuses partial bodies outright, so the full object is required regardless. NOTE: "doRecording", "engineConfig" have no known equivalent in GET /api/cameras/{cameraId}, so they cannot be read back — but this endpoint refuses partial bodies, so an update omitting them fails rather than resetting anything.

POST /api/cameras/{cameraId}/jobs — Operate jobs by camera id path: cameraId*:integer query: activate*:boolean

GET /api/cameras/{cameraId}/rva-heatmap — Get RVA heatmap path: cameraId*:integer query: from?:string, to?:string

PUT /api/cameras/{cameraId}/status — Reset camera status path: cameraId*:integer query: resetHour?:integer

POST /api/cameras/pseudo — Create pseudo camera body: PseudoCameraRequest — required: name; ivedaai_get_schema for all fields

GET /api/cameras/recommend-engines — Get recommend engine for camera query: cameraIds*:integer, allCameras?:boolean, excludeEngines?:string enum:AgeGenderClassifier|CrossCameraTrackingEngine|CrowdDetectionEngine|DwellEngine|ExtraAlertTrigger|FaceGdpr|FaceRecognitionEngine|HumanAttributeEngine

POST /api/cameras/recommend-engines — Apply recommend engine to camera body: array of CameraAutoConfiguration — required: cameraId, recommendEngines; ivedaai_get_schema for all fields

GET /api/cameras/uri-schemes — List schemes for camera url connection

Inputs: operation (required), body, file, path, +1 more.

ivedaai_camera_groupIvedaAI: CameraGroupA
Destructive

IvedaAI API — CameraGroup operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/camera-groups — Find camera groups query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, nameContains?:string, ainvrIds?:integer, plugins?:string, numberOfCameras?:boolean, fetchCameras?:boolean, excludeNoCamera?:boolean, excludeNotInGroup?:boolean

POST /api/camera-groups — Create a camera group body: CameraGroupRequest — required: cameraIds, name; ivedaai_get_schema for all fields

DELETE /api/camera-groups/{cameraGroupId} — Remove camera group path: cameraGroupId*:string

GET /api/camera-groups/{cameraGroupId} — Get camera group path: cameraGroupId*:string query: ainvrIds?:integer, plugins?:string enum:AgeGenderClassifier|CrossCameraTrackingEngine|CrowdDetectionEngine|DwellEngine|ExtraAlertTrigger|FaceGdpr|FaceRecognitionEngine|HumanAttributeEngine

PUT /api/camera-groups/{cameraGroupId} — Update camera group path: cameraGroupId*:string body: CameraGroupRequest — required: cameraIds, name; ivedaai_get_schema for all fields NOTE: GET /api/camera-groups/{cameraGroupId} returns this field under a different key — cameraIds → cameras[].cameraId (item read only — the collection read returns null). This endpoint replaces the record, so omitted fields revert to their defaults — send the full object. CAUTION: "cameraGroupIds" has no known equivalent in GET /api/camera-groups/{cameraGroupId}, so its current value cannot be read back. Set it explicitly, or accept that it may be reset.

GET /api/camera-groups/{cameraGroupId}/all — Get camera group for group admin path: cameraGroupId*:string

DELETE /api/camera-groups/{cameraGroupId}/cameras — Remove cameras from camera group path: cameraGroupId*:string body: CameraGroupRequest — required: cameraIds, name; ivedaai_get_schema for all fields

PUT /api/camera-groups/{cameraGroupId}/cameras — Add cameras to camera group path: cameraGroupId*:string body: CameraGroupRequest — required: cameraIds, name; ivedaai_get_schema for all fields

Inputs: operation (required), body, file, path, +1 more.

ivedaai_camera_stateIvedaAI: Camera StateA
Read-only

IvedaAI API — Camera State operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/camerastatehistorys — Find camera state history query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, start*:string(yyyy-MM-dd[ HH:mm:ss[Z]]), end*:string(yyyy-MM-dd[ HH:mm:ss[Z]]), timezone?:string, cameraId*:integer

Inputs: operation (required), body, file, path, +1 more.

ivedaai_cloud_storageIvedaAI: CloudStorageA

IvedaAI API — CloudStorage operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/cloud-storages — Get cloud storage

POST /api/cloud-storages — Create cloud storage body: CloudStorage — required: cloudStorageType, lifecycleRules; ivedaai_get_schema for all fields

PUT /api/cloud-storages — Update cloud storage body: CloudStorage — required: cloudStorageType, lifecycleRules; ivedaai_get_schema for all fields

POST /api/cloud-storages/buckets — Create bucket on cloud storage body: CloudStorage — required: cloudStorageType, lifecycleRules; ivedaai_get_schema for all fields

POST /api/cloud-storages/buckets/list — Get bucket list from cloud storage body: CloudStorage — required: cloudStorageType, lifecycleRules; ivedaai_get_schema for all fields

GET /api/cloud-storages/object — Get cloud storage object query: objectKey*:string

POST /api/cloud-storages/regions — Get region list from cloud storage body: CloudStorage — required: cloudStorageType, lifecycleRules; ivedaai_get_schema for all fields

GET /api/cloud-storages/s3 — Get Qumulo S3 image file query: objectKey*:string

Inputs: operation (required), body, file, path, +1 more.

ivedaai_configurationIvedaAI: ConfigurationA

IvedaAI API — Configuration operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/configs — Find configurations query: properties*:string

PUT /api/configs/basic — Apply basic system settings body: SystemSetting — ivedaai_get_schema for all fields

GET /api/configs/certificate — Get certificate details

Inputs: operation (required), body, file, path, +1 more.

ivedaai_countingIvedaAI: CountingA
Read-only

IvedaAI API — Counting operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/counting/dashboard — Counting dashboard query: start*:string(yyyy-MM-dd HH:mm:ss[Z]), lineSetIds*:integer, types*:string

GET /api/countings — Counting history query: start*:string(yyyy-MM-dd HH:mm:ss[Z]), end*:string(yyyy-MM-dd HH:mm:ss[Z]), lineSetIds*:integer, types*:string, measure*:string enum:Daily|Fifteen_Minutely|Five_Minutely|Hourly|Minutely|Monthly|Ten_Minutely|Thirty_Minutely

Inputs: operation (required), body, file, path, +1 more.

ivedaai_detectionIvedaAI: DetectionA

IvedaAI API — Detection operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/detection/classifiers — List available classifier

POST /api/detection/classifiers/{classifierName} — Do classification path: classifierName*:string file: provide as {path, filename?, contentType?} — local file to upload as "file" form fields (pass via body): threshold?:number

POST /api/detection/clip/image — Use clip encode image file: provide as {path, filename?, contentType?} — local file to upload as "file"

POST /api/detection/clip/text — Use clip encode text body: array of string

POST /api/detection/colors — Detect colors file: provide as {path, filename?, contentType?} — local file to upload as "file"

POST /api/detection/colors.image — Detect and draw colors file: provide as {path, filename?, contentType?} — local file to upload as "file" form fields (pass via body): label?:boolean

POST /api/detection/objects — Detect objects query: plugins?:string enum:AgeGenderClassifier|CrossCameraTrackingEngine|CrowdDetectionEngine|DwellEngine|ExtraAlertTrigger|FaceGdpr|FaceRecognitionEngine|HumanAttributeEngine, profileId?:integer file: provide as {path, filename?, contentType?} — local file to upload as "file"

POST /api/detection/objects.image — Detect and draw objects query: plugins?:string enum:AgeGenderClassifier|CrossCameraTrackingEngine|CrowdDetectionEngine|DwellEngine|ExtraAlertTrigger|FaceGdpr|FaceRecognitionEngine|HumanAttributeEngine, profileId?:integer, label?:boolean file: provide as {path, filename?, contentType?} — local file to upload as "file"

POST /api/detection/plates — Detect License Plate query: profileId?:integer file: provide as {path, filename?, contentType?} — local file to upload as "file"

POST /api/detection/plates.image — Detect and draw License Plate query: profileId?:integer, label?:boolean file: provide as {path, filename?, contentType?} — local file to upload as "file"

Inputs: operation (required), body, file, path, +1 more.

ivedaai_dwell_historyIvedaAI: DwellHistoryA
Read-only

IvedaAI API — DwellHistory operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/dwellHistories — Find dwell histories query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, start*:string(yyyy-MM-dd[ HH:mm:ss[Z]]), end*:string(yyyy-MM-dd[ HH:mm:ss[Z]]), dwellHistoryId?:integer, localTrackId?:integer, type?:string enum:bicycle|bus|car|motorcycle|person|truck|vehicle, cameraId?:integer, roiId?:integer, dwellTime?:integer, sceneObjectId?:integer

Inputs: operation (required), body, file, path, +1 more.

ivedaai_engine_modelIvedaAI: Engine ModelA
Destructive

IvedaAI API — Engine Model operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/engineModels — List AI Models query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, ainvrId?:integer

POST /api/engineModels — Upload AI Model file: provide as {path, filename?, contentType?} — local file to upload as "file"

DELETE /api/engineModels/{engineModelId} — Delete AI Model by Id path: engineModelId*:integer

POST /api/engineModels/{engineModelId} — Replace AI Model path: engineModelId*:integer file: provide as {path, filename?, contentType?} — local file to upload as "file"

PUT /api/engineModels/{engineModelIds} — Enable AI Model path: engineModelIds*:string

GET /api/engineModels/configuration — Get suggested configuration query: ainvrId?:integer

GET /api/engineModels/service/status — Is AI Model Loading

Inputs: operation (required), body, file, path, +1 more.

ivedaai_engine_objectIvedaAI: EngineObjectA
Read-only

IvedaAI API — EngineObject operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/engine-objects — List EngineObjects query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean

Inputs: operation (required), body, file, path, +1 more.

ivedaai_engine_profileIvedaAI: EngineProfileA
Destructive

IvedaAI API — EngineProfile operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/engineProfiles — Find profiles query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, nameContains?:string, engineModelIds?:integer, isDefault?:boolean, ainvrId?:integer

POST /api/engineProfiles — Create engine profile query: ainvrId?:integer body: EngineProfileRequest — required: name; ivedaai_get_schema for all fields

DELETE /api/engineProfiles/{profileId} — Delete profile by id path: profileId*:integer

GET /api/engineProfiles/{profileId} — Find profile by id path: profileId*:integer

PUT /api/engineProfiles/{profileId} — Update engine profile path: profileId*:integer body: EngineProfileRequest — required: name; ivedaai_get_schema for all fields NOTE: GET /api/engineProfiles/{profileId} returns this field under a different key — engineModelIds → engineModelId. This endpoint has been confirmed to leave omitted fields alone, so this is for reading the value, not a warning about losing it.

POST /api/engineProfiles/default/{engineModelIds} — Create default profile path: engineModelIds*:string query: ainvrId?:integer

Inputs: operation (required), body, file, path, +1 more.

ivedaai_eventIvedaAI: EventA
Destructive

IvedaAI API — Event operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/commonEvents — Find events query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, start*:string(yyyy-MM-dd[ HH:mm:ss[Z]]), end*:string(yyyy-MM-dd[ HH:mm:ss[Z]]), timezone?:string, types*:string enum:CROWD_DETECTION|DWELL|FALL|INTRUSION|OBJECT_LEFT_BEHIND|OBJECT_WRONG_DIRECTION|SCENE_CHANGE, ainvrIds?:integer, cameraIds?:integer, roiIds?:integer, allCameras?:boolean

DELETE /api/commonEvents/{commonEventId} — Delete event by id path: commonEventId*:integer

GET /api/commonEvents/{commonEventId} — Find event by id path: commonEventId*:integer

GET /api/commonEvents/latest — Find latest events query: types*:string enum:CROWD_DETECTION|DWELL|FALL|INTRUSION|OBJECT_LEFT_BEHIND|OBJECT_WRONG_DIRECTION|SCENE_CHANGE, ainvrIds?:integer, cameraIds?:integer, roiIds?:integer, allCameras?:boolean, start*:string(yyyy-MM-dd HH:mm:ss), size?:integer

Inputs: operation (required), body, file, path, +1 more.

ivedaai_external_cameraIvedaAI: ExternalCameraA

IvedaAI API — ExternalCamera operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/externalCameras/{mappingId} — Get camera analysis meta path: mappingId*:string query: applicationId?:string

POST /api/externalCameras/{mappingId} — put camera image path: mappingId*:string file: provide as {path, filename?, contentType?} — local file to upload as "file" form fields (pass via body): applicationId?:string, height?:integer, latitude?:number, longitude?:number, timestamp?:integer, width?:integer

GET /api/externalCameras/{mappingId}/meta — get camera meta path: mappingId*:string

Inputs: operation (required), body, file, path, +1 more.

ivedaai_faceIvedaAI: FaceA
Destructive

IvedaAI API — Face operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

POST /api/face — Face detection file: provide as {path, filename?, contentType?} — local file to upload as "file" form fields (pass via body): agQualityLevel?:string enum:high|low|medium, qualityLevel?:string enum:high|low|medium, sceneId?:integer, url?:string

DELETE /api/face/{faceKeyId} — Delete faceKey path: faceKeyId*:integer

POST /api/face/search — Face search query: ainvrIds?:integer, allCameras?:boolean, allFootages?:boolean, cameraIds?:integer, descriptor*:string, end*:string(yyyy-MM-dd[ HH:mm:ss[Z]]), footageIds?:integer, limit?:integer, scores?:number, start*:string(yyyy-MM-dd[ HH:mm:ss[Z]])

POST /api/face/similarity — Face similarity body: { descriptor1?:string, descriptor2?:string }

POST /api/face/statistics — Get face statistics body: FaceStatisticRequest — required: by; ivedaai_get_schema for all fields

Inputs: operation (required), body, file, path, +1 more.

ivedaai_face_categoryIvedaAI: FaceCategoryA
Destructive

IvedaAI API — FaceCategory operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/face/categories — List face categories

POST /api/face/categories — Create face category body: { colorCode?:string, name*:string }

DELETE /api/face/categories/{faceCategoryId} — Delete face category path: faceCategoryId*:string

PUT /api/face/categories/{faceCategoryId} — Update face category path: faceCategoryId*:string body: { colorCode?:string, name*:string }

Inputs: operation (required), body, file, path, +1 more.

ivedaai_face_matchIvedaAI: FaceMatchA
Destructive

IvedaAI API — FaceMatch operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/face/{faceKeyId}/matches — Get match list path: faceKeyId*:integer

GET /api/face/matches — Search face matches query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, start*:string(yyyy-MM-dd HH:mm:ss), unpaged?:boolean, end*:string(yyyy-MM-dd HH:mm:ss), ainvrIds?:integer, cameraIds?:integer, footageIds?:integer, categories?:string, nameContains?:string, scores?:number, age?:string enum:1-19|20-29|30-39|40-49|50-59|60-69|70-100, gender?:string enum:Female|Male|Unknown, emotion?:string enum:Angry|Happy|Neutral|Sad|Surprised|Unknown, hasMask?:boolean, allCameras?:boolean, allFootages?:boolean

DELETE /api/face/matches/{matchId} — Delete face match path: matchId*:integer

GET /api/face/matches/latest — Latest face matches query: ainvrIds?:integer, cameraIds*:integer, categories?:string, nameContains?:string, age?:string enum:1-19|20-29|30-39|40-49|50-59|60-69|70-100, gender?:string enum:Female|Male|Unknown, emotion?:string enum:Angry|Happy|Neutral|Sad|Surprised|Unknown, scores?:number, hasMask?:boolean, allCameras?:boolean, start*:string(yyyy-MM-dd HH:mm:ss), size?:integer

Inputs: operation (required), body, file, path, +1 more.

ivedaai_face_targetIvedaAI: FaceTargetA
Destructive

IvedaAI API — FaceTarget operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

POST /api/face/keys — Face Target Key Search query: descriptor*:string, limit?:integer, scores?:number

DELETE /api/face/keys/{targetKeyId} — Delete face target key path: targetKeyId*:string

GET /api/face/keys/{targetKeyId} — Find face target key path: targetKeyId*:string

POST /api/face/keys/{targetKeyId} — Update face target key path: targetKeyId*:string query: url?:string, faceKeyId?:integer, descriptor?:string file: provide as {path, filename?, contentType?} — local file to upload as "file"

GET /api/face/targets — List face targets query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, category?:string, nameContains?:string

POST /api/face/targets — Create face target body: FaceTargetRequest — required: name; ivedaai_get_schema for all fields

DELETE /api/face/targets/{targetId} — Delete face target path: targetId*:string

GET /api/face/targets/{targetId} — Get face target path: targetId*:string

PATCH /api/face/targets/{targetId} — Patch face target path: targetId*:string body: FaceTargetRequest — required: name; ivedaai_get_schema for all fields

PUT /api/face/targets/{targetId} — Update face target path: targetId*:string body: FaceTargetRequest — required: name; ivedaai_get_schema for all fields

GET /api/face/targets/{targetId}/keys — List face target keys path: targetId*:string

POST /api/face/targets/{targetId}/keys — Add face target key path: targetId*:string form fields (pass via body): descriptor?:string, faceKeyId?:integer, url?:string

GET /api/face/targets/export — Export Face target lists query: fileType?:string, category?:string, nameContains?:string

GET /api/face/targets/unqualified — Get unqualified face target list

Inputs: operation (required), body, file, path, +1 more.

ivedaai_false_reportIvedaAI: False-reportA

IvedaAI API — False-report operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/false-report — Check the connection is available

POST /api/false-report — Send false detection report to server body: { description?:string, sceneId?:integer }

Inputs: operation (required), body, file, path, +1 more.

ivedaai_filterIvedaAI: FilterA
Destructive

IvedaAI API — Filter operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/filters — List filters query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean

POST /api/filters — Create filter body: FilterRequest — required: name, type; ivedaai_get_schema for all fields

DELETE /api/filters/{filterId} — Delete filter path: filterId*:integer

GET /api/filters/{filterId} — Find filter by id path: filterId*:integer

PUT /api/filters/{filterId} — Update filter path: filterId*:integer body: FilterRequest — required: name, type; ivedaai_get_schema for all fields NOTE: GET /api/filters/{filterId} returns these fields under a different key — cameraIds → expression.cameraIds, query → expression.query, type → expression.type. This endpoint refuses partial bodies outright, so the full object is required regardless.

Inputs: operation (required), body, file, path, +1 more.

ivedaai_footageIvedaAI: FootageB
Destructive

IvedaAI API — Footage operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/footages — List footages query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, ainvrIds?:integer, cameraIds?:integer, latitude?:number, longitude?:number, fileName?:string, fileNameContains?:string, startTime?:string(yyyy-MM-dd HH:mm:ss), endTime?:string(yyyy-MM-dd HH:mm:ss), statuses?:string enum:Complete|Failed|Waiting

DELETE /api/footages/{footageId} — Delete footage by id path: footageId*:integer

GET /api/footages/{footageId} — Find footage by id path: footageId*:integer

PUT /api/footages/{footageId} — Cancel footage by id path: footageId*:integer

Inputs: operation (required), body, file, path, +1 more.

ivedaai_gatewayIvedaAI: GatewayA

IvedaAI API — Gateway operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/gateways — List Gateway query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, name?:string, macAddress?:string

POST /api/gateways — Create Gateway body: GatewayReq — required: macAddress, name, type; ivedaai_get_schema for all fields

PUT /api/gateways/{gatewayId} — Update Gateway path: gatewayId*:string body: GatewayReq — required: macAddress, name, type; ivedaai_get_schema for all fields

GET /api/gateways/{gatewayId}/cameras — List Camera in Gateway path: gatewayId*:string

Inputs: operation (required), body, file, path, +1 more.

ivedaai_get_schemaIvedaAI: look up a request/response schema definitionA
Read-only

Looks up the full JSON schema for a named IvedaAI API definition (e.g. "CameraRequest"). Use this when a tool's body schema summary is truncated or you need the exact shape of a nested field. Call ivedaai_get_schema with no name to list all available definition names.

Inputs: name.

ivedaai_hashtagIvedaAI: HashtagA
Destructive

IvedaAI API — Hashtag operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/hashtags — Find hashtag query: prefix?:string

POST /api/hashtags — Create hashtag body: string

PUT /api/hashtags — Setup live hashtag body: { cameraId?:integer, hashtags?:string[] }

DELETE /api/hashtags/{keyword} — Delete hashtag path: keyword*:string

Inputs: operation (required), body, file, path, +1 more.

ivedaai_identity_recognitionIvedaAI: IdentityRecognitionA
Read-only

IvedaAI API — IdentityRecognition operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/identity-recognition — Identity recognition history query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, start*:string(yyyy-MM-dd HH:mm:ss), unpaged?:boolean, end*:string(yyyy-MM-dd HH:mm:ss), ainvrIds?:integer, cameraIds?:integer, categories?:string, nameContains?:string, dlnContains?:string, granted?:boolean

GET /api/identity-recognition/config — Identity recognition config

GET /api/identity-recognition/latest — Latest identity recognition query: ainvrIds?:integer, cameraIds?:integer, categories?:string, nameContains?:string, dlnContains?:string, granted?:boolean, allCameras?:boolean, size?:integer

Inputs: operation (required), body, file, path, +1 more.

ivedaai_imageIvedaAI: ImageB

IvedaAI API — Image operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

POST /api/image/rotate — Image Rotation form fields (pass via body): usrFileName?:string

Inputs: operation (required), body, file, path, +1 more.

ivedaai_indoor_mapIvedaAI: IndoorMapA
Destructive

IvedaAI API — IndoorMap operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/indoor-maps — List Indoor Maps query: sorted?:boolean, unsorted?:boolean, withPermission*:boolean

POST /api/indoor-maps — Create Indoor Map body: IndoorMapReq — required: location; ivedaai_get_schema for all fields

DELETE /api/indoor-maps/{indoorMapId} — Delete Indoor Map by ID path: indoorMapId*:string

GET /api/indoor-maps/{indoorMapId} — Find Indoor Map by ID path: indoorMapId*:string

PUT /api/indoor-maps/{indoorMapId} — Update Indoor Map path: indoorMapId*:string body: IndoorMapReq — required: location; ivedaai_get_schema for all fields

GET /api/indoor-maps/{indoorMapId}/floor-plans — Find Floor Plans for Indoor Map path: indoorMapId*:string query: sorted?:boolean, unsorted?:boolean

POST /api/indoor-maps/{indoorMapId}/floor-plans — Create Floor Plans for IndoorMap path: indoorMapId*:string body: array of FloorPlanReq — required: filePath, name; ivedaai_get_schema for all fields

DELETE /api/indoor-maps/floor-plans/{floorPlanId} — Delete Floor Plan by ID path: floorPlanId*:string

GET /api/indoor-maps/floor-plans/{floorPlanId} — Find Floor Plan by ID path: floorPlanId*:string

PUT /api/indoor-maps/floor-plans/{floorPlanId} — Update Floor Plan path: floorPlanId*:string body: FloorPlanReq — required: filePath, name; ivedaai_get_schema for all fields

Inputs: operation (required), body, file, path, +1 more.

ivedaai_jobIvedaAI: JobA
Destructive

IvedaAI API — Job operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/jobs — Get jobs query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, types*:string enum:RetrieveJob|StreamJob|UploadJob, cameraIds?:integer, footageIds?:integer, statuses?:string enum:Canceled|Completed|Delete|DuplicateExec|Failed|FailedRetry|Running|Suspended

POST /api/jobs — Create job query: type*:string enum:RetrieveJob|StreamJob|UploadJob, cameraId?:integer, channel?:string, startTime?:string, endTime?:string, description?:string, usrFileName?:string, brightness?:string, engineProfileId?:integer, plugins?:string enum:AgeGenderClassifier|CrossCameraTrackingEngine|CrowdDetectionEngine|DwellEngine|ExtraAlertTrigger|FaceGdpr|FaceRecognitionEngine|HumanAttributeEngine, faceFeatures?:string, url?:string, gdprThreshold?:number, nvrId?:string, channelName?:string, latitude?:number, longitude?:number, doTranscode?:boolean file: provide as {path, filename?, contentType?} — local file to upload as "file"

PUT /api/jobs — Operate all jobs query: action*:string enum:CANCEL|SUSPEND

POST /api/jobs/{cameraId} — Cancel job by camera path: cameraId*:integer query: doWait?:boolean

DELETE /api/jobs/{jobId} — Delete job by id path: jobId*:integer

GET /api/jobs/{jobId} — Get job by id path: jobId*:integer

PUT /api/jobs/{jobId} — Stop job by id path: jobId*:integer

POST /api/jobs/retrieve — Create retrieve job query: channel*:string, channelName*:string, description?:string, doTranscode?:boolean, endTime*:string(yyyy-MM-dd[T][hh:mm:ss][Z]), engineProfileId*:integer, faceFeatures?:string[], gdprThreshold?:number, latitude?:number, longitude?:number, nvrId*:string, plugins?:string[], startTime*:string(yyyy-MM-dd[T][hh:mm:ss][Z])

POST /api/jobs/stream — Create stream job query: cameraId*:integer, description?:string

POST /api/jobs/upload — Create upload job file: provide as {path, filename?, contentType?} — local file to upload as "file" form fields (pass via body): cameraId*:integer, description?:string, doTranscode?:boolean, engineProfileId*:integer, faceFeatures?:string[], gdprThreshold?:number, latitude?:number, longitude?:number, plugins?:string[], startTime*:string(yyyy-MM-dd[T][hh:mm:ss][Z]), url?:string, usrFileName*:string

Inputs: operation (required), body, file, path, +1 more.

ivedaai_licenseIvedaAI: LicenseA

IvedaAI API — License operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/hardwareInfo — Get hardware info

GET /api/licenses — Get License query: ainvrIds?:integer

POST /api/licenses — Activate license query: activationType?:string enum:MANUAL|ONLINE file: provide as {path, filename?, contentType?} — local file to upload as "file"

GET /api/licenses/ainvr — Get AINVR License query: ainvrIds*:integer

GET /api/licenses/ainvr/date — Get license date

GET /api/licenses/lpr — Get LPR License query: ainvrId*:integer

Inputs: operation (required), body, file, path, +1 more.

ivedaai_license_plateIvedaAI: LicensePlateA
Destructive

IvedaAI API — LicensePlate operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/lpr/plates — List license plates query: ainvrIds?:integer, offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, start*:string(yyyy-MM-dd HH:mm:ss), end*:string(yyyy-MM-dd HH:mm:ss), cameraIds?:integer, footageIds?:integer, categories?:string, type?:string, color?:string, characters?:string, make?:string, model?:string, country?:string, state?:string, vehicleType?:string, disabled?:boolean, allCameras?:boolean, allFootages?:boolean

DELETE /api/lpr/plates/{licensePlateId} — Delete license plate path: licensePlateId*:integer

PUT /api/lpr/plates/{licensePlateId} — Update license plate path: licensePlateId*:integer body: { characters*:string }

GET /api/lpr/plates/latest — Latest license plates query: ainvrIds?:integer, cameraIds*:integer, categories?:string, type?:string, color?:string, characters?:string, make?:string, model?:string, country?:string, state?:string, vehicleType?:string, disabled?:boolean, size?:integer, allCameras?:boolean, start*:string(yyyy-MM-dd HH:mm:ss)

Inputs: operation (required), body, file, path, +1 more.

ivedaai_license_plate_categoryIvedaAI: LicensePlateCategoryA
Destructive

IvedaAI API — LicensePlateCategory operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/lpr/categories — List license plate categories

POST /api/lpr/categories — Create license plate category body: { colorCode?:string, name*:string }

DELETE /api/lpr/categories/{categoryId} — Delete license plate category path: categoryId*:string

POST /api/lpr/categories/{categoryId} — Import license plate target path: categoryId*:string query: columnSeperator?:string file: provide as {path, filename?, contentType?} — local file to upload as "file"

PUT /api/lpr/categories/{categoryId} — Update license plate category path: categoryId*:string body: { colorCode?:string, name*:string }

Inputs: operation (required), body, file, path, +1 more.

ivedaai_license_plate_targetIvedaAI: LicensePlateTargetA
Destructive

IvedaAI API — LicensePlateTarget operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/lpr/targets — List license plate targets query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, category?:string, plateNumber?:string, vehicleOwner?:string, address?:string, description?:string

POST /api/lpr/targets — Create license plate target body: LicensePlateTargetRequest — required: category, plateNumber; ivedaai_get_schema for all fields

DELETE /api/lpr/targets/{targetId} — Delete license plate target path: targetId*:string

GET /api/lpr/targets/{targetId} — Find license plate target path: targetId*:string

PUT /api/lpr/targets/{targetId} — Update license plate target path: targetId*:string body: LicensePlateTargetRequest — required: category, plateNumber; ivedaai_get_schema for all fields

GET /api/lpr/targets/export — Export license plate lists query: fileType?:string, category?:string, plateNumber?:string, vehicleOwner?:string, address?:string, description?:string

Inputs: operation (required), body, file, path, +1 more.

ivedaai_line_setIvedaAI: LineSetA
Destructive

IvedaAI API — LineSet operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/lineSets — Find lineSets query: ainvrIds?:integer, offset?:integer, pageNumber?:integer, pageSize?:integer, paged?:boolean, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, cameraIds?:integer, nameContains?:string, types?:string enum:Dwell|ObjectCounting|ObjectDirection, inCountingEnabled?:boolean, outCountingEnabled?:boolean, excludeUnused?:boolean, lineSetIds?:integer

POST /api/lineSets — Create lineSet body: LineSetRequest — required: cameraId, name; ivedaai_get_schema for all fields

DELETE /api/lineSets/{lineSetId} — Delete lineSet path: lineSetId*:integer

GET /api/lineSets/{lineSetId} — Get lineSet path: lineSetId*:integer

PATCH /api/lineSets/{lineSetId} — Patch lineSet path: lineSetId*:integer body: LineSetRequest — required: cameraId, name; ivedaai_get_schema for all fields NOTE: GET /api/lineSets/{lineSetId} returns this field under a different key — cameraId → camera.cameraId. This endpoint has been confirmed to leave omitted fields alone, so this is for reading the value, not a warning about losing it.

PUT /api/lineSets/{lineSetId} — Update lineSet path: lineSetId*:integer body: LineSetRequest — required: cameraId, name; ivedaai_get_schema for all fields NOTE: GET /api/lineSets/{lineSetId} returns this field under a different key — cameraId → camera.cameraId. This endpoint has been confirmed to leave omitted fields alone, so this is for reading the value, not a warning about losing it.

Inputs: operation (required), body, file, path, +1 more.

ivedaai_make_modelIvedaAI: MakeModelB
Read-only

IvedaAI API — MakeModel operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/make-models — Find make model list

Inputs: operation (required), body, file, path, +1 more.

ivedaai_mediaIvedaAI: MediaB

IvedaAI API — Media operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

POST /api/media/stream — Get stream info query: cameraId?:integer, doEstimate?:boolean body: CameraRequest — required: cameraType; ivedaai_get_schema for all fields

Inputs: operation (required), body, file, path, +1 more.

ivedaai_moduleIvedaAI: ModuleA
Destructive

IvedaAI API — Module operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

DELETE /api/modules — Uninstall module query: moduleId*:string

GET /api/modules — Find modules query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, name?:string, vendor?:string, version?:string

POST /api/modules — Install module file: provide as {path, filename?, contentType?} — local file to upload as "module"

PUT /api/modules — Reload module path: moduleId*:string

GET /api/modules/{moduleId} — Get module path: moduleId*:string

Inputs: operation (required), body, file, path, +1 more.

ivedaai_multi_factor_authenticationIvedaAI: MultiFactorAuthenticationA

IvedaAI API — MultiFactorAuthentication operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

POST /api/mfa/email — verify mfa query: access_token*:string, otp_code*:string

Inputs: operation (required), body, file, path, +1 more.

ivedaai_nvrIvedaAI: NvrA
Destructive

IvedaAI API — Nvr operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/nvrs — List Nvrs query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean

POST /api/nvrs — Create Nvr body: NvrRequest — required: brandId, ip, name, port; ivedaai_get_schema for all fields

DELETE /api/nvrs/{nvrId} — Delete Nvr by id path: nvrId*:string

GET /api/nvrs/{nvrId} — Find Nvr by id path: nvrId*:string

PUT /api/nvrs/{nvrId} — Update Nvr path: nvrId*:string body: NvrRequest — required: brandId, ip, name, port; ivedaai_get_schema for all fields NOTE: GET /api/nvrs/{nvrId} returns this field under a different key — brandId → brand.brandId. This endpoint refuses partial bodies outright, so the full object is required regardless.

GET /api/nvrs/{nvrId}/cameras — List cameras by nvr id path: nvrId*:string query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean

GET /api/nvrs/{nvrId}/channels — Find Nvr channels path: nvrId*:string

GET /api/nvrs/{nvrId}/preview-channel/{channelIndex} — Preview NVR channel snapshot path: nvrId*:string, channelIndex*:string query: protocol?:string enum:Both|TCP|UDP

GET /api/nvrs/{nvrType}/alerts — get the list of alert from NVR path: nvrType*:string enum:avigilon|digifort|ocularis query: ip*:string, port*:string, username*:string, password*:string, cameraIds?:integer

POST /api/nvrs/connection — Check Nvr connection body: NvrRequest — required: brandId, ip, name, port; ivedaai_get_schema for all fields

Inputs: operation (required), body, file, path, +1 more.

ivedaai_oauthIvedaAI: OAuthA

IvedaAI API — OAuth operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

POST /api/oauth2/token — Get token query: code?:string, code_verifier?:string, grant_type*:string enum:authorization_code|client_credentials|password|refresh_token, password?:string, refresh_token?:string, scope?:string, username?:string

Inputs: operation (required), body, file, path, +1 more.

ivedaai_object_typeIvedaAI: ObjectTypeA
Read-only

IvedaAI API — ObjectType operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/objectTypes — List all object types contain synonyms query: ainvrId?:integer

GET /api/types — List object types query: ainvrIds?:integer

GET /api/types/{category} — List object types by category path: category*:string enum:animal|car|human|object|others|transportation query: ainvrIds?:integer

Inputs: operation (required), body, file, path, +1 more.

ivedaai_onvifIvedaAI: OnvifA

IvedaAI API — Onvif operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/onvif/cameras — Discover onvif cameras

POST /api/onvif/rtsps — List onvif camera rtsp body: CameraRequest — required: cameraType; ivedaai_get_schema for all fields

Inputs: operation (required), body, file, path, +1 more.

ivedaai_openidIvedaAI: OpenidA

IvedaAI API — Openid operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

POST /api/openid-providers — Create OpenID provider body: OpenidProviderReq — required: clientCredentialScope, clientId, clientSecret, groupClaim, issuer, redirectUri; ivedaai_get_schema for all fields

PUT /api/openid-providers/{openidProviderId} — Update OpenID provider path: openidProviderId*:string body: OpenidProviderReq — required: clientCredentialScope, clientId, clientSecret, groupClaim, issuer, redirectUri; ivedaai_get_schema for all fields

POST /api/openid-providers/connection — Test connect with OpenID provider body: OpenidProviderReq — required: clientCredentialScope, clientId, clientSecret, groupClaim, issuer, redirectUri; ivedaai_get_schema for all fields

Inputs: operation (required), body, file, path, +1 more.

ivedaai_passwordIvedaAI: PasswordA

IvedaAI API — Password operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/passwords — Get available token query: token*:string

POST /api/passwords — Forget password by email body: { email*:string }

POST /api/passwords/{keys} — Reset password by key path: keys*:string body: { password*:string, username*:string }

GET /api/passwords/{keys}/expired — Check if the password reset key has expired path: keys*:string

Inputs: operation (required), body, file, path, +1 more.

ivedaai_pluginIvedaAI: PluginA
Destructive

IvedaAI API — Plugin operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/plugins — List Plugins query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean

POST /api/plugins — Import Plugin file: provide as {path, filename?, contentType?} — local file to upload as "file" form fields (pass via body): filePath?:string, password*:string, username*:string

DELETE /api/plugins/{pluginId} — Delete Plugin by Id path: pluginId*:integer

PATCH /api/plugins/{pluginId} — Update Plugin metadata by Id path: pluginId*:integer body: VoPlugin — ivedaai_get_schema for all fields

Inputs: operation (required), body, file, path, +1 more.

ivedaai_resourceIvedaAI: ResourceA

IvedaAI API — Resource operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/resources — List resources query: direction?:string enum:asc|desc

GET /api/resources/costs — Get resource cost of plugin

POST /api/resources/estimation — Get estimation resource usage for recommend engines body: array of CameraAutoConfiguration — required: cameraId, recommendEngines; ivedaai_get_schema for all fields

GET /api/resources/usage — Get resource information query: ainvrIds?:integer

Inputs: operation (required), body, file, path, +1 more.

ivedaai_roiIvedaAI: RoiA
Destructive

IvedaAI API — Roi operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/rois — Find rois query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, ainvrIds?:integer, nameContains?:string, cameraIds?:integer, types?:string enum:CAMERA_ABNORMAL|CROWD_DETECTION|DWELL|FACE_RECOGNITION|FALL|HUMAN_ATTRIBUTE|INTRUSION|LPR, excludeUnused?:boolean, roiIds?:integer, roiParameters?:string

POST /api/rois — Create roi body: RoiRequest — required: cameraId, condition, name, parameter, roiContour; ivedaai_get_schema for all fields

DELETE /api/rois/{roiId} — Delete roi by id path: roiId*:integer

GET /api/rois/{roiId} — Find roi by id path: roiId*:integer

PATCH /api/rois/{roiId} — Patch roi path: roiId*:integer body: RoiRequest — required: cameraId, condition, name, parameter, roiContour; ivedaai_get_schema for all fields NOTE: GET /api/rois/{roiId} returns these fields under a different key — cameraId → camera.cameraId, condition → types, conditionLogic → logical, excludeRoiContour → excludedRegion, isEnabled → enabled, name → eventName, parameter → parameters, roiContour → region[].contour, type → eventType. This endpoint has been confirmed to leave omitted fields alone, so this is for reading the value, not a warning about losing it.

PUT /api/rois/{roiId} — Update roi path: roiId*:integer body: RoiRequest — required: cameraId, condition, name, parameter, roiContour; ivedaai_get_schema for all fields NOTE: GET /api/rois/{roiId} returns these fields under a different key — cameraId → camera.cameraId, condition → types, conditionLogic → logical, excludeRoiContour → excludedRegion, isEnabled → enabled, name → eventName, parameter → parameters, roiContour → region[].contour, type → eventType. This endpoint has been confirmed to leave omitted fields alone, so this is for reading the value, not a warning about losing it.

Inputs: operation (required), body, file, path, +1 more.

ivedaai_sceneIvedaAI: SceneA

IvedaAI API — Scene operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/scenes — Search scenes query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, start*:string(yyyy-MM-dd HH:mm:ss), unpaged?:boolean, end*:string(yyyy-MM-dd HH:mm:ss), cameraIds?:integer, footageIds?:integer, query?:string, hashtags?:string, roiPoints?:number, allCameras?:boolean, allFootages?:boolean

POST /api/scenes — Create scene file: provide as {path, filename?, contentType?} — local file to upload as "file" form fields (pass via body): cameraId*:integer, datetime?:string(yyyy-MM-dd'T'HH:mm:ss), forceSave?:boolean, frameIndex?:integer, hashtags?:string[], latitude?:number, longitude?:number, profileId?:integer, requiredEngines?:string, sceneObjects[0].confidence?:number, sceneObjects[0].h*:integer, sceneObjects[0].metadata.colors?:string[], sceneObjects[0].metadata.face.age?:integer, sceneObjects[0].metadata.face.ageGroup?:string enum:-|1-19|20-29|30-39|40-49|50-59|60-69|70-100, sceneObjects[0].metadata.face.categoryName?:string, sceneObjects[0].metadata.face.categoryUuid?:string, sceneObjects[0].metadata.face.confidence?:number, sceneObjects[0].metadata.face.emotion?:string enum:Angry|Happy|Neutral|Sad|Surprised|Unknown, sceneObjects[0].metadata.face.features*:number[], sceneObjects[0].metadata.face.gender?:string enum:Female|Male|Unknown, sceneObjects[0].metadata.face.matchConfidence?:number, sceneObjects[0].metadata.face.qualified?:boolean, sceneObjects[0].metadata.face.rect.height?:integer, sceneObjects[0].metadata.face.rect.width?:integer, sceneObjects[0].metadata.face.rect.x?:integer, sceneObjects[0].metadata.face.rect.y?:integer, sceneObjects[0].metadata.face.targetName?:string, sceneObjects[0].metadata.face.targetUuid?:string, sceneObjects[0].metadata.licensePlate.categoryId?:integer, sceneObjects[0].metadata.licensePlate.categoryName?:string, sceneObjects[0].metadata.licensePlate.categoryUuid?:string, sceneObjects[0].metadata.licensePlate.confidence?:number, sceneObjects[0].metadata.licensePlate.country?:string, sceneObjects[0].metadata.licensePlate.disabled?:boolean, sceneObjects[0].metadata.licensePlate.number?:string, sceneObjects[0].metadata.licensePlate.rect.height?:integer, sceneObjects[0].metadata.licensePlate.rect.width?:integer, sceneObjects[0].metadata.licensePlate.rect.x?:integer, sceneObjects[0].metadata.licensePlate.rect.y?:integer, sceneObjects[0].metadata.licensePlate.state?:string, sceneObjects[0].metadata.licensePlate.vehicleOwner?:string, sceneObjects[0].metadata.licensePlate.vehicleType?:string, sceneObjects[0].metadata.makeModel.make?:string, sceneObjects[0].metadata.makeModel.model?:string, sceneObjects[0].metadata.makeModel.possibility?:number, sceneObjects[0].metadata.mask.confidence?:number, sceneObjects[0].metadata.mask.hasMask?:boolean, sceneObjects[0].metadata.person.hasHelmet?:boolean, sceneObjects[0].metadata.person.hasVest?:boolean, sceneObjects[0].metadata.person.helmetConfidence?:number, sceneObjects[0].metadata.person.vestConfidence?:number, sceneObjects[0].metadata.speed?:string enum:AboveAverage|Average|BelowAverage, sceneObjects[0].objectType*:string, sceneObjects[0].w*:integer, sceneObjects[0].x*:integer, sceneObjects[0].y*:integer

GET /api/scenes/{sceneId} — Get scene details path: sceneId*:integer

PATCH /api/scenes/{sceneId} — update scene path: sceneId*:integer body: SceneUpdateRequest — ivedaai_get_schema for all fields

GET /api/scenes/{sceneId}/{type} — Get original image path: sceneId*:integer, type*:string enum:Alert|CommonEvent|VideoSearch query: eventType?:string enum:CAMERA_ABNORMAL|CROWD_DETECTION|DWELL|FACE_RECOGNITION|FALL|HUMAN_ATTRIBUTE|INTRUSION|LPR

GET /api/scenes/{sceneId}/objects — Get detail objects path: sceneId*:integer query: commonEventId?:integer, query?:string

GET /api/scenes/{sceneId}/playback — Get scene's playback path: sceneId*:integer query: duration?:integer, start?:string(yyyy-MM-dd HH:mm:ss)

POST /api/scenes/image — Search scenes by image file: provide as {path, filename?, contentType?} — local file to upload as "file"

GET /api/scenes/metadata — Get example of create scene metadata

GET /api/scenes/objects/count — Get total number of objects

Inputs: operation (required), body, file, path, +1 more.

ivedaai_scene_objectIvedaAI: SceneObjectA

IvedaAI API — SceneObject operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/scene-objects/{id} — Find scene object by id path: id*:integer query: needDescriptor?:boolean

GET /api/scene-objects/search — Search similar scene object query: offset?:integer, pageNumber?:integer, pageSize?:integer, paged?:boolean, sort.sorted?:boolean, sort.unsorted?:boolean, start*:string(yyyy-MM-dd HH:mm:ss), unpaged?:boolean, end*:string(yyyy-MM-dd HH:mm:ss), cameraIds?:integer, footageIds?:integer, allCameras?:boolean, allFootages?:boolean, queryObjIds*:integer, removedObjIds?:integer, similarity?:number

POST /api/scene-objects/search — Search similar scene object query: allCameras?:boolean, allFootages?:boolean, cameraIds?:integer, descriptors*:string, end*:string(yyyy-MM-dd HH:mm:ss), footageIds?:integer, offset?:integer, pageNumber?:integer, pageSize?:integer, paged?:boolean, removedTargetDescriptors?:string, similarity?:number, sort.sorted?:boolean, sort.unsorted?:boolean, start*:string(yyyy-MM-dd HH:mm:ss), trackType*:string enum:Person|Vehicle, unpaged?:boolean

POST /api/scene-objects/search/image — Search similar scene object by image file: provide as {path, filename?, contentType?} — local file to upload as "file" form fields (pass via body): allCameras?:boolean, allFootages?:boolean, cameraIds?:integer, end*:string(yyyy-MM-dd HH:mm:ss), footageIds?:integer, offset?:integer, pageNumber?:integer, pageSize?:integer, paged?:boolean, similarity?:number, sort.sorted?:boolean, sort.unsorted?:boolean, start*:string(yyyy-MM-dd HH:mm:ss), trackType*:string enum:Person|Vehicle, unpaged?:boolean

Inputs: operation (required), body, file, path, +1 more.

ivedaai_soundIvedaAI: SoundA

IvedaAI API — Sound operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/sounds — List sounds query: isDeleted?:boolean, types?:string enum:alert|all|intrusion

POST /api/sounds — Upload sound query: type*:string enum:alert|all|intrusion file: provide as {path, filename?, contentType?} — local file to upload as "file"

GET /api/sounds/{soundId} — Find sound by id path: soundId*:integer

GET /api/sounds/findByType — Find sounds by event type query: type*:string enum:alert|all

Inputs: operation (required), body, file, path, +1 more.

ivedaai_sseIvedaAI: SseA
Read-only

IvedaAI API — Sse operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/system/events — Server sent event query: filter?:string enum:CameraAbnormal|ChannelEstablished|Cluster|ClusterAbnormal|ClusterSync|EngineModelFailed|EngineModelLoaded|EngineModelLoading, streamCameraIds?:integer

Inputs: operation (required), body, file, path, +1 more.

ivedaai_statisticIvedaAI: StatisticA
Read-only

IvedaAI API — Statistic operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/statistic/heatmap — Generate heatmap query: start*:string(yyyy-MM-dd HH:mm:ss), end*:string(yyyy-MM-dd HH:mm:ss), cameraId?:integer, footageId?:integer, query?:string, fineness?:integer, threshold?:number, forceRefresh?:boolean

Inputs: operation (required), body, file, path, +1 more.

ivedaai_streamingIvedaAI: StreamingA
Read-only

IvedaAI API — Streaming operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/streaming/{cameraId}/{type}.jpg — Get camera streaming image path: cameraId*:integer, type*:string enum:live

GET /api/streaming/{cameraId}/{type}.mjpeg — Get camera streaming motion jpeg path: cameraId*:integer, type*:string enum:live

Inputs: operation (required), body, file, path, +1 more.

ivedaai_timeIvedaAI: TimeA
Read-only

IvedaAI API — Time operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/time — Find time configurations

Inputs: operation (required), body, file, path, +1 more.

ivedaai_trackingIvedaAI: TrackingA

IvedaAI API — Tracking operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

PUT /api/cameras/{cameraId}/tracking — Set AI tracking target path: cameraId*:integer query: targetId*:integer

Inputs: operation (required), body, file, path, +1 more.

ivedaai_user_groupIvedaAI: UserGroupA
Destructive

IvedaAI API — UserGroup operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/user-groups — List user group query: nameContains?:string, offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean

POST /api/user-groups — Create user group body: UserGroupRequest — required: externalId, name; ivedaai_get_schema for all fields

DELETE /api/user-groups/{userGroupId} — Delete user group path: userGroupId*:string

PATCH /api/user-groups/{userGroupId} — Patch user group path: userGroupId*:string body: UserGroupRequest — required: externalId, name; ivedaai_get_schema for all fields CAUTION: this endpoint nulls "externalId" if the body omits it, and still returns 200. Send the full object, including the current value of that field. Omitting it is refused by this tool; pass it as null to clear it deliberately. NOTE: "accountIds" is not on the record at all, but a second endpoint returns it — read accountIds from GET /api/user-groups/{userGroupId}/accounts at content[].accountId. Read it there if you need the current value.

PUT /api/user-groups/{userGroupId} — Update user group path: userGroupId*:string body: UserGroupRequest — required: externalId, name; ivedaai_get_schema for all fields NOTE: "accountIds" is not on the record at all, but a second endpoint returns it — read accountIds from GET /api/user-groups/{userGroupId}/accounts at content[].accountId. Read it there if you need the current value.

DELETE /api/user-groups/{userGroupId}/accounts — Remove user from group path: userGroupId*:string body: array of integer

GET /api/user-groups/{userGroupId}/accounts — List user in group path: userGroupId*:string query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, nameContains?:string

POST /api/user-groups/{userGroupId}/accounts — Add users to group path: userGroupId*:string body: array of integer

PUT /api/user-groups/{userGroupId}/accounts — Set users in group path: userGroupId*:string body: array of integer

GET /api/user-groups/{userGroupId}/permissions — List user group permissions path: userGroupId*:string query: type?:string enum:Camera|FaceCategory|LicensePlateCategory

POST /api/user-groups/{userGroupId}/permissions — Grant user group permissions path: userGroupId*:string body: array of Permission — required: actions, id, type; ivedaai_get_schema for all fields

Inputs: operation (required), body, file, path, +1 more.

ivedaai_utilityIvedaAI: UtilityB

IvedaAI API — Utility operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

POST /api/utility — Diagnose System query: method*:string, target*:string, parameters?:string

Inputs: operation (required), body, file, path, +1 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.3/5.0

    Scored across 66 tools

    Disambiguation2/5

    With 66 tools spanning many overlapping domains, several tools have unclear boundaries—e.g., ivedaai_camera vs ivedaai_add_camera, ivedaai_alert_rule vs ivedaai_alert_trigger vs ivedaai_alert_integration, and ivedaai_alert vs ivedaai_event. Despite detailed descriptions, the volume and conceptual overlap make misselection likely.

    Naming Consistency2/5

    All tools share the 'ivedaai_' prefix, but the remainder mixes singular and plural nouns (account, accounts), acronyms (ainvr), and verbs (get_schema, add_camera), with no consistent verb_noun pattern. While snake_case is used for multi-word names, the convention is resource-name based rather than action-based.

    Tool Count1/5

    66 tools is far beyond the typical well-scoped range and falls into the extreme mismatch category (50+). Even for a comprehensive API, this is an enormous surface that burdens discovery and selection.

    Completeness4/5

    The surface is remarkably comprehensive for the IvedaAI domain, covering CRUD for cameras, accounts, groups, alerts, rules, faces, license plates, scenes, jobs, NVRs, and more. Minor gaps exist (e.g., no delete for cloud storage, read-only histories for camera state), but core workflows are well covered.

    Maintenance

    ActivityStale
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers