axis-cam-mcp
# 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/
```
## Quick start
```bash
conda env create -f environment.yml
conda activate axis-cam-mcp
pytest -q
axis-cam-mcp --check
```
See `axis-camera.md` for camera configuration and AIDA wiring.
## Tools
| Tool | What it does |
|---|---|
| `list_cameras` | The configured names, descriptions and addresses. Never credentials. |
| `grab_frame` | One JPEG still. Optional `resolution`, `compression`, `rotation`, `channel`. |
| `camera_info` | Model, product number and firmware. The cheapest reachability proof. |
| `camera_capabilities` | 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: none` on 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** -- `channel` picks 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 let `grab_frame` retry at the closest
supported size and tell you it did. `axis-cam-mcp --check` flags a
configured resolution or channel the device will refuse.
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.