axis-cam-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@axis-cam-mcpgrab a still from the front door camera"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
axis-cam-mcp
MCP server for still images from Axis network cameras over VAPIX.
See axis-camera.md for full build, test and deployment instructions.
Layout
axis-cam-mcp/
├── LICENSE README.md CHANGELOG.md PLAN.md
├── environment.yml
├── pyproject.toml
├── examples/cameras.yaml
├── src/axis_cam_mcp/{__init__,cameras,vapix,server}.py
└── tests/Related MCP server: MCP Camera Tool
Quick start
conda env create -f environment.yml
conda activate axis-cam-mcp
pytest -q
axis-cam-mcp --checkSee axis-camera.md for camera configuration and AIDA wiring.
Tools
Tool | What it does |
| The configured names, descriptions and addresses. Never credentials. |
| One JPEG still. Optional |
| Model, product number and firmware. The cheapest reachability proof. |
| What a device actually supports: resolutions, rotations, video inputs. |
Devices
Works with native Axis IP cameras and with multi-channel video encoders, which differ in three ways the registry covers:
Anonymous access --
auth: noneon a camera that needs no login. Otherwise credentials come from the named environment variables, and a missing one is an error rather than a silent unauthenticated request.Several cameras behind one address --
channelpicks a video input ("1"-"4","quad"). Give each view its own registry entry so an agent can choose by description.Fixed resolution lists -- an encoder serves only a handful of sizes. Ask
camera_capabilities, or letgrab_frameretry at the closest supported size and tell you it did.axis-cam-mcp --checkflags a configured resolution or channel the device will refuse.
Available Tools
4 toolscamera_capabilitiesA
What camera actually supports: resolutions, rotations and video inputs.
Ask before guessing a resolution on an unfamiliar device, or to find out
which channel of a multi-channel encoder holds the view you want.
The listed resolutions are the WIDTHxHEIGHT values the device advertises. Most also accept named presets they do not advertise - an encoder taking 720x480 will usually take "D1", "4CIF", "CIF" and "QCIF" too.
| Name | Required | Description | Default |
|---|---|---|---|
| camera | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden of behavioral disclosure. It does this well by explaining that listed resolutions are only the advertised WIDTHxHEIGHT values and that named presets like 'D1' and 'CIF' may also be accepted even when unadvertised. This is useful caveat-level behavior information beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose. Each paragraph adds distinct information: what it returns, when to use it, and an important caveat about unadvertised presets. No filler or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter capability-inspection tool with an output schema, the description provides sufficient context: what to expect, when to call it, and a key behavioral caveat. The main gap is the unexplained camera parameter, but overall the agent can decide when and why to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the only required parameter, 'camera', is never defined in terms of how it should be specified (e.g., camera ID, name, or index). The description refers to devices and multi-channel encoders but does not explain what value the caller should pass for the camera parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states that the tool reports what a given camera supports: resolutions, rotations, and video inputs. This clearly identifies the resource and scope, and the content distinguishes it from siblings like list_cameras or grab_frame, though it does not use an explicit action verb like 'list' or 'get'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete usage guidance: use it before guessing a resolution on an unfamiliar device, or to determine which channel of a multi-channel encoder holds the desired view. It provides clear contexts, though it does not explicitly state when not to use it or name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
camera_infoA
Model, product number and firmware for camera.
The cheapest way to prove credentials and network reach are good without moving an image.
| Name | Required | Description | Default |
|---|---|---|---|
| camera | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden. It communicates an important behavioral trait: the call is lightweight and does not transfer an image, making it a safe connectivity check. It does not explicitly state read-only semantics, but the 'without moving an image' phrasing strongly implies no heavy side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, purposeful sentences with no filler. The first states the return data, and the second adds a valuable use case. It is front-loaded and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter lookup with an output schema, the description covers the returned information and a canonical use case. It does not specify where the camera value comes from, but that can be reasonably inferred from the sibling tool list_cameras.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero description coverage, and the description only says 'for `camera`', which adds little beyond the parameter name. It does not explain whether camera expects an ID, name, path, or how to obtain a valid value. The description should compensate for the missing schema documentation but does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool returns 'Model, product number and firmware' for a specific camera, which is a concrete resource and output. It is clear enough to distinguish from grab_frame because it explicitly notes it does not move an image, though it does not fully differentiate from camera_capabilities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear use context: 'The cheapest way to prove credentials and network reach are good without moving an image.' It implies a contrast with image-transfer operations like grab_frame, but it does not explicitly name alternatives or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grab_frameA
Capture one still frame from camera and return it as a JPEG.
If the device refuses the requested resolution, the frame is taken at the closest one it supports instead and the reply says so.
Args:
camera: A name from list_cameras.
resolution: "WIDTHxHEIGHT", e.g. "1280x720", or a device-specific
preset name such as "D1". The camera scales server-side; omit for
the camera's configured default. See camera_capabilities.
compression: 0-100, where 0 is best quality and the largest file.
rotation: 0, 90, 180 or 270 degrees.
channel: Which video input to read on a multi-channel encoder, e.g.
"3" or "quad". Omit on a single-sensor camera.
| Name | Required | Description | Default |
|---|---|---|---|
| camera | Yes | ||
| channel | No | ||
| rotation | No | ||
| resolution | No | ||
| compression | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, and it does so well. It discloses the non-obvious resolution fallback ('If the device refuses the requested resolution, the frame is taken at the closest one it supports instead'), server-side scaling, and the compression semantics (0 = best quality, largest file). The return type (JPEG) is stated. Slight gap: the mechanics of returning the JPEG (inline bytes, URL, base64) are unspecified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-organized: one-line purpose, a fallback note, then a clean Args block. Front-loaded with the main purpose. Slightly prose-heavy in the resolution and channel entries, but each sentence carries information - no padding or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter tool with 0% schema coverage, no annotations, and no output schema, the description covers all parameters thoroughly, the output type, and the key fallback behavior. The main gap is the response transport format (how the JPEG is delivered), which is left vague as 'return it as a JPEG' - a notable omission given there is no output schema to clarify it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully compensate - and it does for all 5 parameters. resolution gets format ('WIDTHxHEIGHT'), examples ('1280x720'), preset names ('D1'), scaling behavior, and default handling. rotation enumerates allowed values, channel explains multi-channel use with examples and omission rules, compression defines range and tradeoff. Every parameter carries semantic weight beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a precise verb-resource-output statement: 'Capture one still frame from `camera` and return it as a JPEG.' This clearly differentiates it from siblings list_cameras, camera_info, and camera_capabilities, which are listing/inspection operations, not capture operations. Purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Cross-references prerequisites well: 'A name from `list_cameras`' routes the agent to the listing tool, and 'See `camera_capabilities`' routes it to the capabilities tool for resolution options. It also gives omission guidance ('omit for the camera's configured default', 'Omit on a single-sensor camera'). Lacks explicit when-not-to-use statements, but the sibling operations are distinct enough that exclusions aren't critical.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_camerasA
List the configured cameras: name, description and address.
Never returns credentials - only the names of the environment variables they are read from.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It discloses a valuable behavioral detail—'Never returns credentials—only the names of the environment variables they are read from'—which goes beyond the schema. The verb also implies a read-only operation, though it does not elaborate on other side effects or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with zero filler. The primary purpose and the key security caveat are front-loaded, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple parameterless list operation with an output schema present, the description covers all essential call-time information: what is returned, and the credential-safety behavior. It does not address error conditions or cross-tool routing, but these are not critical for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the parameter-semantics burden is minimal. The baseline of 4 applies because there are no parameters to document, and the description sensibly focuses on result content rather than parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action and resource: 'List the configured cameras' with the returned fields (name, description, address). It does not explicitly compare against sibling tools like camera_info or grab_frame, but the verb and resource are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied by the verb 'List' and the subject 'configured cameras', but there is no explicit guidance on when to prefer this over sibling tools such as camera_info or camera_capabilities, nor any exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.1.0- First observed
camera_capabilities - First observed
camera_info - First observed
grab_frame - First observed
list_cameras
TDQS
Scored across 4 tools
Each tool has a distinct purpose: listing configured cameras, grabbing a frame, retrieving device metadata, and querying supported capabilities. The potential similarity between camera_info and camera_capabilities is resolved by clear descriptions covering different aspects of the camera.
Names are all lowercase snake_case and readable, but the convention is mixed: list_cameras and grab_frame use verb_noun while camera_info and camera_capabilities are noun phrases with no verb. This is not chaotic, but it lacks a single predictable pattern.
Four tools is well-scoped for a camera-focused MCP: enumeration, metadata, capabilities, and frame capture. Each tool earns its place and there is no redundant or filler functionality.
The tool set covers the core read-only camera workflow: discover cameras, verify connectivity, check capabilities, and capture still frames. Minor gaps such as continuous video capture, camera configuration, or PTZ control are plausible extensions but do not seem essential to the stated purpose.
Maintenance
Related MCP Connectors
Clean PNG/JPEG screenshots via REST or MCP, with goal-driven multi-step navigation.
Read-only PiPic CLI and HTTP API guidance; no image bytes are transferred.
Screenshot/PDF/HTML rendering API. API key or x402 required — keyless access disabled.
Create and manage real-world Huint photo verification tasks via hosted streamable HTTP.
Related MCP Servers
- -licenseAqualityNot gradedmaintenanceA bridge between AI assistants like Claude and Anava-enabled Axis cameras, enabling real-time image analysis, event monitoring, and camera management through natural language commands.4-
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to access and control network cameras to capture images and perform analysis including brightness detection, color distribution, and edge detection.MIT
- FlicenseNot gradedqualityCmaintenanceEnables control of Hikvision industrial cameras via MCP, including enumeration, image capture, parameter adjustment, and firmware upgrade.-
- AlicenseAqualityCmaintenanceMCP server for configuring Axis IP cameras via VAPIX, supporting device info, snapshots, image settings, overlays, network, PTZ, and system management.3701GPL 3.0