On-camera · Model Context Protocol

The MCP server that lives
inside the AXIS IP camera.

The first on-camera Model Context Protocol server for AXIS cameras. One .eap opens the camera to Claude, Gemini, ChatGPT and Perplexity — no cloud, no middleware. Zero hops. Zero cloud.

Axis MCP Server: the bridge connecting AI agents directly to AI-native Axis cameras, with zero cloud dependency and intelligent read-only, operate, and full access guardrails
Axis MCP Server — the bridge to AI-native cameras: zero cloud, 55 tools across 12 modules, tiered access guardrails.

Edge AI, done right.

Claude, Gemini, ChatGPT and Perplexity talk to the device directly — the intelligence meets the camera on its own loopback.

On-camera native

A Node.js runtime bundled into a native AXIS OS 11/12 ACAP. No gateway, no relay — the MCP server runs on the device.

Streamable HTTP

Standards-compliant MCP over stateless Streamable HTTP — exactly what modern agents expect.

Model-agnostic

Claude, Gemini / Antigravity, ChatGPT Developer Mode, Perplexity, and any custom agent. Open protocol, open future.

265 VAPIX tools

Device health, snapshots, imaging, optics, autofocus, PTZ, guard tours, overlays, Zipstream, I/O, recordings, streaming, MQTT, audio, events, analytics, ops/diagnostics, device pairing, cloud recording, app control and guarded maintenance — as clean structured tools.

CamStreamer suite

Drive CamStreamer, CamSwitcher and CamOverlay. “Switch to the gate view and go live” — and it happens.

🔒Guardrailed by design

Operator-set access levels (read-only by a switch), rate limits, allow-listed writes, and a direct port that's off by default. See the security model →

What the AI can do

265 tools across 36 modules that return data an LLM can reason over — not raw CGI dumps.

Device & health

get_device_info · get_device_properties · get_system_status · get_time · get_view_areas

Imaging & optics

take_snapshot · get/set_image_settings · set_zoom_focus · get_optics · autofocus

PTZ

ptz_move · relative/absolute/continuous · ptz_query · ptz_preset_list (per view area, w/ pan/tilt/zoom) · presets (goto/save/remove)

Events & analytics

list_event_declarations · get_analytics_status

AXIS Object Analytics

aoa_get_scenarios · aoa_get_object_counts · aoa_get_triggered_alerts

Video Motion Detection 4

vmd4_get_profiles · vmd4_get_triggered_profiles

License Plate Verifier

lpv_get_recent_plates · lpv_get_plate_image · lpv_get_push_config · lpv_get_heartbeat_config

Queue Monitor

queue_get_live_count · queue_get_params · queue_get_history

Fence / Loitering / Motion Guard

*_get_profiles · *_get_triggered_profiles

Legacy analytics (VMD 2.1/3, cross line, autotracking)

*_get_config · *_get_triggered

Demographic Identifier

demographics_get_live_tracks · demographics_get_stats

People counting

peoplecounter_* · p8815_* (3D People Counter)

Application control

list_apps · control_app · get_params · set_param

System & maintenance

get_api_list · get_capabilities · get_firmware_properties · reboot_camera · factory_default

I/O & recordings

io_set_output · io_get_inputs · storage_list/start/stop_recording

Streaming URLs

get_rtsp_url · get_mjpeg_url · get_audio_urls · media_get_stream_url

CamStreamer

camstreamer_list_streams · stream_status · control_stream

CamSwitcher & CamOverlay

camswitcher_list/switch/queue · camoverlay_services · update_graphic_text

Overlays, Zipstream & View Areas

overlay_add_text/image · zipstream_set_strength/gop/profile · viewarea_list/set_geometry

Image tuning

daynight_* · light_* · imagestab_* · ratecontrol_* · capturemode_* · dewarp_*

Guard tours & PTZ patrol

guardtour_create/add_preset/set_running · recordedtour_record/play · autotracker_* · orientationaid_*

Ops & diagnostics

auditlog_get · get_server_report/system_log · get_systemready · network_get_tcp_retransmissions

Device identity & network info

find_my_device · mdnssd_discover · geolocation_* · ntp_get_info · network_get_info

Stream profiles, MQTT & metadata

streamprofile_* · streamstatus_list · mqtt_configure_client · mqtt_configure_event_publication · signedvideo_* · metadataproducer_*

Audio

audio_configure_source · audiodevice_get_settings · audioanalytics_* · audiomixer_* · mediaclip_play

Device configuration

dcparam_export/import · eventschedule_* · coordconv_convert · devicemode_get · objectsnapshot_set

Pairing & cloud recording

netpairing_add · camerapairing_add · recordinggroup_create · remotestorage_add · analyticsmqtt_add_publisher · datatransform_create

Gemini in Antigravity inspects the CamStreamer streams on an AXIS camera through the on-camera MCP server
Gemini in Antigravity inspects CamStreamer stream status via the camstreamer_list_streams tool.

A console you'll want to demo

The live console recognizes which AI is connected — and greets it in living ASCII.

axis_mcp — Live Log

      
12:31:03 primary HTTP server listening on 32554
12:31:38 POST /mcp
12:31:38 MCP initialize
12:31:38 MCP tools/list
12:32:09 MCP tools/call → take_snapshot
12:32:57 MCP tools/call → camswitcher_switch_playlist
12:33:07 MCP tools/call → autofocus
The AXIS MCP Server settings console with Claude connected and a live log streaming MCP tool calls
The operator console — status, endpoints, credentials, and a real-time Live Log.

Real agents. Real camera.

No scripts, no SDK glue — just natural language over MCP, against a live AXIS Q1656.

Zero hops. Zero cloud.

The agent speaks MCP over Streamable HTTP to the camera itself. VAPIX calls never leave the device.

AI AGENT
Claude · Gemini · ChatGPT · Perplexity
AXIS CAMERA (the edge)
Node.js on ARTPEC-8 · VAPIX on loopback

Nothing leaves the LAN unless you deliberately expose it. The intelligence runs where the pixels are.

Not a backdoor. A guarded front door.

The AI gets exactly the access the operator grants — nothing more. Enforced in code, visible in the log.

🚫No user management

The MCP cannot create users or touch credentials, network or system config — parameter writes are hard allow-listed to imaging, time, audio, events and overlays.

🎚Access levels

A three-position operator switch: Read-only (138 inspection tools), Operate (default, +76 control tools), Full (+38 config/maintenance tools). Blocked tools return a polite refusal. See the map →

Rate limits & caps

60 tool calls/min, 20 writes/min, and a hard cap of 20 PTZ presets — an agent loop can't flood or vandalize the camera.

Confirmed destruction

Reboot and factory default demand an explicit confirm: true on top of Full access. No accidental resets.

🔑Auth by default

The direct LAN port is off by default; enabling it auto-generates a bearer token. The sanctioned route sits behind the camera's own admin digest auth.

📜Full audit trail

Every request, tool call and guardrail refusal streams into the Live Log and the AXIS system log. The operator always sees what the AI did.

Details in SECURITY.md.

The access-level map

Every one of the 252 tools is classified in guardrails.ts. Each level includes everything below it; unknown tools fail closed to Full.

👁Read-only 138 tools

Pure inspection — nothing on the camera changes. Device info & health, snapshots, view areas, param reads, PTZ position/limits, event topics, analytics counts (AOA, people counter, queue, demographics, LPV plates), audio/imaging/zipstream status, stream URLs & profiles, recordings list, audit & system logs, MQTT/pairing/storage status, CamStreamer/CamSwitcher/CamOverlay listings.

🕹Operate +76 tools · default

Day-to-day control. PTZ moves & presets, guard/recorded tours, autotracking, focus/zoom, image tuning (day-night, stabilizer, rotation, rate control), view-area geometry, native & CamOverlay overlays, audio operation & media clips, relay outputs, start/stop recordings, stream & profile control, zipstream tuning, event schedules, CamStreamer/CamSwitcher control.

🔧Full +38 tools

Persistent configuration & maintenance. Reboot and factory default (each also needs confirm: true), raw set_param, ACAP start/stop, config import, capture & device mode, network/NTP/mDNS/geolocation/regional settings, MQTT wiring, signed video, analytics data plumbing, device & camera pairing, recording groups and remote storage topology, log administration.

The AXIS MCP Server settings page with the three-position access level selector: Read-only, Operate, Full
The operator picks the level on the settings page — it applies immediately, no restart.

Up and running in minutes

Build with Docker on your machine, install the .eap, point your agent at the camera.

Get the package

Download a prebuilt .eap from Releases, or build it yourself (ARTPEC-8 / aarch64; Docker is used only to build).

cd axis-mcp-acap
sh build.sh arm64   # → Axis_MCP_Server_1_2_0_aarch64.eap

Install on the camera

System → Apps → enable Allow unsigned apps → upload the .eap → Start. Then enter VAPIX admin credentials on the settings page.

The AXIS MCP Server ACAP installed and running on an AXIS Q1656 Box Camera
Installed as a native ACAP on the AXIS Q1656.

Connect any MCP client

Enable the direct LAN port on the settings page (a bearer token is generated automatically) — and tag the client so the console shows its logo.

claude mcp add --transport http axis-q1656 \
  http://<camera-ip>:8000/mcp

# tag a client for its own logo
http://<camera-ip>:8000/mcp?client=antigravity

Works with your stack

Local clients reach the camera directly; cloud clients connect via an HTTPS tunnel.

Claude & Claude Code Gemini / Antigravity ChatGPT Developer Mode Perplexity Any MCP agent

Open tens of thousands of AXIS cameras to AI.

Install the .eap. Point your agent at the camera. Watch it come alive.