Are you the author? Sign in to claim
๐ท The first on-camera Model Context Protocol server for AXIS cameras. One .eap opens the camera to Claude, Gemini, Chat
Any AI. Any camera. Zero cloud. Install one
.eap, and Claude, Gemini, ChatGPT, Perplexity, or your own agent can see, understand, and operate the camera โ directly, at the edge.
For twenty years, integrating an IP camera meant learning VAPIX, wiring up SOAP events, wrangling digest auth, and building a bespoke backend for every project. AI agents made it worse: each one needed a custom bridge, a cloud relay, and a security review.
Axis MCP Server collapses all of that into a single install. It runs a standards-compliant Model Context Protocol server inside the camera as a native ACAP โ no gateway, no middleware, no cloud round-trip. Point any MCP-capable AI client at http://<camera-ip>/mcp and it instantly gains a rich, structured toolset for the device.
This is edge AI in the truest sense: the intelligence talks to the camera on the camera's own loopback interface. Nothing leaves the LAN unless you choose to expose it.
It's genuinely first. MCP servers run on laptops and in the cloud. This one runs on the camera โ a Node.js runtime bundled into a native AXIS OS 12 ACAP, speaking Streamable HTTP the way modern agents expect. That combination did not exist before.
It unlocks a massive installed base. Axis has shipped millions of cameras; the ARTPEC-7/8/9 generation running AXIS OS 11โ12 numbers in the tens of thousands per large deployment alone. A single .eap makes every one of them addressable by AI โ no hardware change, no forklift upgrade.
It's model-agnostic by design. Because it speaks open MCP over HTTP, it works with Claude, Google Antigravity / Gemini, ChatGPT Developer Mode, Perplexity, Claude Code, and any custom agent โ today, and whatever ships next.
It respects the enterprise. Reverse-proxied behind the camera's own admin authentication, with an optional bearer-guarded direct port for LAN automation. Parameter writes are allow-listed. Nothing is exposed to the internet unless the operator deliberately tunnels it.
Out of the box, the server exposes a curated toolset over MCP:
Every tool returns clean, structured data an LLM can reason over โ not raw CGI dumps.
The built-in settings page is a live control room, not a form:
It's the kind of detail that wins awards and wins rooms.
aarch64), packaged with the official ACAP Native SDK.Axis MCP Server puts a Model Context Protocol server inside the camera โ opening tens of thousands of Axis devices to any AI, with no cloud, no middleware, and no compromise.
Install the .eap. Point your agent at the camera. Watch it come alive.
A standalone ACAP (.eap) that runs a Model Context Protocol server directly on an Axis camera
(ARTPEC-8, AXIS OS 12 โ e.g. Q1656). It exposes VAPIX-backed tools over Streamable HTTP so Claude
Desktop / Claude Code can connect to the camera and inspect/control it.
Built with the ACAP Native SDK (Node.js 20 bundled into the package). No Docker runs on the camera โ
Docker is only used to build the .eap on your Mac.
axis-mcp-acap/
โโโ Dockerfile # ACAP Native SDK build (aarch64)
โโโ build.sh # docker build + docker cp -> .eap
โโโ plan.md # design plan
โโโ app/
โโโ manifest.json # schemaVersion 1.7.4; appName axis_mcp
โโโ axis_mcp # launcher (filename == appName)
โโโ Makefile # no-op (acap-build runs make)
โโโ LICENSE
โโโ package.json # main: dist/bootstrap.js
โโโ tsconfig.json
โโโ src/
โ โโโ bootstrap.ts # HTTP servers: /mcp, /status.cgi, /settings.cgi
โ โโโ mcpServer.ts # McpServer + tool registration
โ โโโ vapix.ts # Digest auth client (MD5 + SHA-256)
โ โโโ settings.ts # persisted config (PERSISTENT_DATA_PATH)
โ โโโ tools/ # device, imaging, events, apps
โโโ html/index.html # settings UI (light default + theme switcher)
| Tool | VAPIX |
|---|---|
get_device_info | basicdeviceinfo.cgi (getAllProperties) |
get_system_status | param.cgi (Network/Brand/Firmware) + temperaturecontrol.cgi |
get_time | time.cgi |
take_snapshot | jpg/image.cgi โ MCP image content |
get_image_settings / set_image_settings | param.cgi ImageSource/Image |
get_optics | opticscontrol.cgi getOptics (ids + capabilities) |
autofocus | cascade: opticscontrol.cgi performAutofocus โ startFocusSearch โ opticssetup.cgi โ ptz.cgi?autofocus=on (caches the working method) |
set_zoom_focus | opticscontrol.cgi setMagnification / autofocus cascade |
list_event_declarations | SOAP GetEventInstances |
get_analytics_status | applications/list.cgi (filtered) |
list_apps / control_app | applications/list.cgi, control.cgi |
get_params / set_param | param.cgi (writes allowlisted) |
| Tool | Endpoint |
|---|---|
camstreamer_list_streams | /local/camstreamer/stream/list.cgi |
camstreamer_stream_status | /local/camstreamer/stream/status.cgi |
camstreamer_control_stream | /local/camstreamer/stream/set.cgi (start/stop) |
camswitcher_list_playlists | /local/camswitcher/playlists.cgi?action=get |
camswitcher_switch_playlist | /local/camswitcher/playlist_switch.cgi |
camswitcher_queue_playlist | /local/camswitcher/playlist_queue_push.cgi |
camswitcher_get_queue / camswitcher_play_next / camswitcher_clear_queue | playlist_queue_*.cgi |
camswitcher_output_info / camswitcher_list_clips | output_info.cgi, clips.cgi |
camoverlay_list_services | /local/camoverlay/api/services.cgi |
camoverlay_set_service_enabled | services.cgi?action=set |
camoverlay_update_graphic_text | customGraphics.cgi?action=update_text |
camoverlay_infoticker | infoticker.cgi |
These call the CamStreamer/CamSwitcher/CamOverlay CGIs on the same camera using the same digest auth. If the corresponding ACAP isn't installed, the tool returns a clear "not installed" error.
Requires Docker Desktop on your Mac.
cd axis-mcp-acap
sh build.sh arm64 # -> Axis_MCP_Server_1_0_0_aarch64.eap (or axis_mcp_*.eap)
Camera UI โ System โ Apps โ enable Allow unsigned apps โ Add app โ upload the aarch64 .eap โ
Start. Open the app's settings page, enter VAPIX admin credentials, click Run self-test.
Two endpoints:
http://<camera-ip>/local/axis_mcp/mcphttp://<camera-ip>:8000/mcpclaude mcp add --transport http axis-q1656 http://<camera-ip>:8000/mcp
Inspect with: npx @modelcontextprotocol/inspector
.eap installs and starts on FW 12.x without manifest errorscurl -X POST http://<ip>:8000/mcp with an initialize body returns server infotake_snapshot returns a viewable JPEGset_param refuses non-allowlisted groupsalgorithm directive (MD5 and SHA-256 + -sess) โ an MD5-only client
gets a silent 401 on modern AXIS OS.process.env.HTTP_PORT (AXIS OS assigns it; 32554 only for local dev).Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots
Google's universal MCP server supporting PostgreSQL, MySQL, MongoDB, Redis, and 10+ databases
Official GitHub integration for repos, issues, PRs, and CI/CD workflows