Arcane MCP
Click on "Install 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., "@Arcane MCPlist containers in environment env-abc123"
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.
Arcane MCP
TypeScript MCP server for the Arcane Docker management API. Exposes a single arcane tool that routes all Docker environment, project, container, image, network, volume, system, registry, image-update, vulnerability, and GitOps operations through the Arcane service.
Overview
Arcane MCP wraps the Arcane REST API behind a Model Context Protocol interface. An AI agent calls the arcane tool with an action and subaction. The server authenticates the request, enforces a confirmation gate on destructive operations, routes to the appropriate backend service, and returns JSON.
The server ships two MCP tools:
Tool | Purpose |
| Unified action/subaction router for all Arcane API operations |
| Returns the full action/subaction reference as formatted text |
Tools
arcane
Call this tool with action, subaction, and optional envId, id, and params.
{
"action": "container",
"subaction": "list",
"envId": "env-abc123"
}Parameter rules
Parameter | Type | Description |
| string (enum) | Resource family: |
| string (enum) | Operation to perform (see per-family tables below) |
| string (optional) | Target environment ID. Required by all families except |
| string (optional) | Resource ID for single-resource operations (get, delete, etc.) |
| object (optional) | Operation-specific payload. Pass |
Destructive operation gate
Any operation in the DESTRUCTIVE set (listed per family below) is blocked unless one of three conditions is met:
ARCANE_MCP_ALLOW_DESTRUCTIVE=true— all destructive ops auto-confirm, no re-call needed.ARCANE_MCP_ALLOW_YOLO=true— skips the interactive elicitation prompt; the tool must still be re-called withparams: { "confirm": true }to proceed.Default — if the MCP client supports elicitation forms, the server prompts the user interactively. If the client does not support elicitation, the server returns a prompt asking for a re-call with
params: { "confirm": true }.
Action families
environment
Top-level Docker host connections. envId and id are interchangeable for single-resource operations.
Subaction | Description | Destructive |
| List all environments | |
| Get an environment by ID | |
| Create a new environment; pass | |
| Update environment settings; pass | |
| Permanently delete an environment | yes |
| Test the environment's API connection |
Example:
{"action": "environment", "subaction": "list"}
{"action": "environment", "subaction": "get", "id": "env-abc123"}
{"action": "environment", "subaction": "create", "params": {"apiUrl": "https://host.example.com", "apiKey": "..."}}
{"action": "environment", "subaction": "delete", "id": "env-abc123", "params": {"confirm": true}}project
Docker Compose stacks running inside an environment. Requires envId.
Subaction | Description | Destructive |
| List all projects in the environment | |
| Get a project by ID | |
| Create a project; pass | |
| Update a project; pass | |
| Start a project (docker compose up) | |
| Stop a project (docker compose down) | yes |
| Restart all containers in the project | yes |
| Pull latest images without restarting | |
| Stop and remove containers, networks, volumes created by the compose file | yes |
| Pull images and recreate the project | yes |
| Build images for the project; pass optional |
Example:
{"action": "project", "subaction": "list", "envId": "env-abc123"}
{"action": "project", "subaction": "up", "envId": "env-abc123", "id": "my-stack"}
{"action": "project", "subaction": "down", "envId": "env-abc123", "id": "my-stack", "params": {"confirm": true}}
{"action": "project", "subaction": "build", "envId": "env-abc123", "id": "my-stack", "params": {"services": ["web"], "push": true}}container
Individual Docker containers inside an environment. Requires envId.
Note: container logs are not available via the Arcane REST API. Use the Arcane web UI or docker logs directly.
Subaction | Description | Destructive |
| List all containers | |
| Get a container by ID | |
| Create a container; pass | |
| Start a stopped container | |
| Stop a running container | yes |
| Restart a container | yes |
| Re-pull the container's image and recreate it using its existing config. No params accepted. | |
| Remove a container | yes |
| Get CPU, memory, and network stats for all containers in the environment |
Example:
{"action": "container", "subaction": "list", "envId": "env-abc123"}
{"action": "container", "subaction": "stats", "envId": "env-abc123"}
{"action": "container", "subaction": "stop", "envId": "env-abc123", "id": "container-id", "params": {"confirm": true}}
{"action": "container", "subaction": "create", "envId": "env-abc123", "params": {"name": "nginx", "image": "nginx:latest", "ports": {"80/tcp": [{"HostPort": "8080"}]}}}image
Docker images available in an environment. Requires envId.
Subaction | Description | Destructive |
| List all images | |
| Get an image by ID | |
| Pull an image; pass | |
| Delete an image by ID | yes |
| Remove all unused images | yes |
| Scan an image for vulnerabilities (triggers Trivy scan) |
Example:
{"action": "image", "subaction": "list", "envId": "env-abc123"}
{"action": "image", "subaction": "pull", "envId": "env-abc123", "params": {"imageName": "nginx", "tag": "latest"}}
{"action": "image", "subaction": "scan", "envId": "env-abc123", "id": "sha256:abc..."}
{"action": "image", "subaction": "prune", "envId": "env-abc123", "params": {"confirm": true}}network
Docker networks in an environment. Requires envId.
Subaction | Description | Destructive |
| List all networks | |
| Get a network by ID | |
| Create a network; pass | |
| Delete a network by ID | yes |
| Remove all unused networks | yes |
Example:
{"action": "network", "subaction": "list", "envId": "env-abc123"}
{"action": "network", "subaction": "create", "envId": "env-abc123", "params": {"name": "my-net", "options": {"driver": "bridge"}}}
{"action": "network", "subaction": "prune", "envId": "env-abc123", "params": {"confirm": true}}volume
Docker volumes in an environment, with full backup and restore support. Requires envId.
Subaction | Description | Destructive |
| List all volumes | |
| Get a volume by name | |
| Create a volume; pass | |
| Delete a volume by name | yes |
| Remove all unused volumes | yes |
| Browse a volume's directory tree; pass optional | |
| List all backups for a volume; requires | |
| Create a new backup snapshot; requires | |
| Delete a backup by ID; pass | yes |
| Restore a volume to a backup state; requires | yes |
| Restore specific files from a backup; requires | yes |
Volume backup/restore workflow
List available backups:
subaction=list-backups,id=<volumeName>Create a new snapshot:
subaction=create-backup,id=<volumeName>Inspect a backup's contents: use
list-backupsto get the backup ID, thenrestore-fileswithparams.pathsFull restore:
subaction=restore,id=<volumeName>,params: { backupId: "...", confirm: true }Partial restore:
subaction=restore-files,id=<volumeName>,params: { backupId: "...", paths: ["data/config.json"], confirm: true }Remove old snapshot:
subaction=delete-backup,params: { backupId: "...", confirm: true }
Example:
{"action": "volume", "subaction": "list-backups", "envId": "env-abc123", "id": "my-data-vol"}
{"action": "volume", "subaction": "create-backup", "envId": "env-abc123", "id": "my-data-vol"}
{"action": "volume", "subaction": "restore", "envId": "env-abc123", "id": "my-data-vol", "params": {"backupId": "bkp-xyz", "confirm": true}}
{"action": "volume", "subaction": "restore-files", "envId": "env-abc123", "id": "my-data-vol", "params": {"backupId": "bkp-xyz", "paths": ["etc/app.conf"], "confirm": true}}
{"action": "volume", "subaction": "browse", "envId": "env-abc123", "id": "my-data-vol", "params": {"path": "etc"}}system
Docker daemon-level operations for an environment. Requires envId.
Subaction | Description | Destructive |
| Get Docker daemon info (version, runtime, resources) | |
| Start all projects in the environment | |
| Stop all projects in the environment | yes |
| Prune unused Docker resources; pass | yes |
| Convert a |
Example:
{"action": "system", "subaction": "docker-info", "envId": "env-abc123"}
{"action": "system", "subaction": "prune", "envId": "env-abc123", "params": {"containers": true, "images": true, "networks": true, "volumes": false, "buildCache": true, "dangling": true, "confirm": true}}
{"action": "system", "subaction": "convert", "envId": "env-abc123", "params": {"dockerRunCommand": "docker run -d -p 80:80 nginx"}}image-update
Check whether images have newer versions available. Requires envId. Long-running checks use a 120-second timeout.
Subaction | Description |
| Check all images in the environment for updates; pass optional |
| Check a single image; pass either |
| Check multiple images; pass |
| Get a summary count: total images, images with updates, digest-only updates, errors |
The check subaction resolves the target in this order: id (Arcane internal imageId) → params.imageRef (image reference string). Passing both is undefined behavior; use one or the other.
Example:
{"action": "image-update", "subaction": "summary", "envId": "env-abc123"}
{"action": "image-update", "subaction": "check", "envId": "env-abc123", "params": {"imageRef": "nginx:latest"}}
{"action": "image-update", "subaction": "check", "envId": "env-abc123", "id": "img-abc123"}
{"action": "image-update", "subaction": "check-batch", "envId": "env-abc123", "params": {"imageRefs": ["nginx:latest", "redis:7"]}}
{"action": "image-update", "subaction": "check-all", "envId": "env-abc123"}vulnerability
Image vulnerability scanning powered by Trivy. Requires envId.
Subaction | Description |
| Get counts by severity (critical, high, medium, low, unknown) across all scanned images |
| List all vulnerability entries with full CVE detail |
| Get the Trivy scanner's current operational status |
| Add a vulnerability to the ignore list; pass |
| Remove an ignore entry; pass |
| List all active ignore entries |
Example:
{"action": "vulnerability", "subaction": "summary", "envId": "env-abc123"}
{"action": "vulnerability", "subaction": "list", "envId": "env-abc123"}
{"action": "vulnerability", "subaction": "ignore", "envId": "env-abc123", "params": {"imageId": "img-abc", "vulnerabilityId": "CVE-2024-1234", "pkgName": "openssl", "reason": "mitigated"}}
{"action": "vulnerability", "subaction": "unignore", "envId": "env-abc123", "id": "ignore-entry-id"}registry
Container registry credentials. Global resource — envId is not required and is ignored.
Subaction | Description | Destructive |
| List all configured registries | |
| Get a registry by ID | |
| Add a registry; pass | |
| Update a registry; pass | |
| Remove a registry | yes |
| Test connectivity to the registry |
Example:
{"action": "registry", "subaction": "list"}
{"action": "registry", "subaction": "create", "params": {"url": "registry.example.com", "username": "myuser", "token": "...", "enabled": true}}
{"action": "registry", "subaction": "test", "id": "reg-abc123"}
{"action": "registry", "subaction": "delete", "id": "reg-abc123", "params": {"confirm": true}}gitops
Git-backed Compose deployment syncs. Requires envId.
Warning: gitops:sync pulls from a remote repository and applies changes. This is a supply chain risk if the repository is compromised. Always confirm the sync target before proceeding.
Subaction | Description | Destructive |
| List all GitOps sync configurations | |
| Get a sync configuration by ID | |
| Create a sync config; pass | |
| Update a sync config; pass | |
| Delete a sync configuration | yes |
| Trigger an immediate sync from the remote repository | yes |
| Get the sync's last run status, commit, and next scheduled run | |
| Browse the repository's file tree; pass optional |
GitOps workflow
List existing syncs:
subaction=listCheck a sync's state:
subaction=status,id=<syncId>Inspect repository contents:
subaction=browse,id=<syncId>Trigger a sync:
subaction=sync,id=<syncId>,params: { confirm: true }
Example:
{"action": "gitops", "subaction": "list", "envId": "env-abc123"}
{"action": "gitops", "subaction": "status", "envId": "env-abc123", "id": "sync-abc123"}
{"action": "gitops", "subaction": "browse", "envId": "env-abc123", "id": "sync-abc123"}
{"action": "gitops", "subaction": "sync", "envId": "env-abc123", "id": "sync-abc123", "params": {"confirm": true}}
{"action": "gitops", "subaction": "create", "envId": "env-abc123", "params": {"name": "prod-stack", "repositoryId": "repo-abc", "branch": "main", "composePath": "stacks/web/docker-compose.yml", "autoSync": true, "syncInterval": 300}}Destructive operations reference
The following 22 operations require confirmation before execution:
Action | Subaction |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Installation
Plugin marketplace
/plugin marketplace add jmagar/claude-homelab
/plugin install arcane-mcp @jmagar-claude-homelabLocal development
npm install
npm run build
npm startFor watch mode:
just devDocker
just up
just logsConfiguration
Copy .env.example to .env and fill in the required values:
cp .env.example .env
chmod 600 .envEnvironment variables
Variable | Required | Default | Description |
| yes | — | Base URL of your Arcane instance, e.g. |
| yes | — | API key from Arcane Settings > API |
| yes | — | Bearer token for MCP server auth. Generate with: |
| no |
| Internal container port the server binds to |
| no |
| Host-side Docker port mapping |
| no |
| Transport mode: |
| no |
| Set to |
| no |
|
|
| no |
|
|
| no |
| Pino log level: |
Safety flag behavior
ARCANE_MCP_ALLOW_YOLO and ARCANE_MCP_ALLOW_DESTRUCTIVE control the confirmation gate independently:
Both
false(default): destructive ops show an elicitation dialog (if the MCP client supports it) or return a prompt to re-call withparams: { confirm: true }.ALLOW_YOLO=true: skips the elicitation dialog. The agent must still re-call withparams: { confirm: true }.ALLOW_DESTRUCTIVE=true: bypasses the gate entirely. No re-call needed. Use in CI or fully automated pipelines only.
Authentication
All MCP endpoints require a Bearer token unless ARCANE_MCP_AUTH_ENABLED=false.
The following paths bypass authentication:
GET /health— health check, always unauthenticated/.well-known/*— RFC 9728 OAuth discovery endpoint; reserved for future OAuth resource metadata
All other paths, including /mcp, require Authorization: Bearer <ARCANE_MCP_TOKEN>.
Token comparison uses timingSafeEqual to prevent timing attacks.
Session management
The HTTP transport maintains per-session MCP server instances (up to 200 concurrent sessions). Sessions idle for more than 30 minutes are evicted. When the session cap is reached, the least-recently-used idle session is evicted first.
Clients that do not send an initialize request are bootstrapped into a pre-initialized session. These clients cannot use elicitation (the confirmation dialog) — they will always receive the "re-call with params: { confirm: true }" response for destructive operations.
Development commands
just dev # Start with watch-mode TypeScript compilation
just build # Compile TypeScript to dist/
just typecheck # Type-check without emitting
just lint # Run Biome linter
just fmt # Run Biome formatter
just test # Run unit tests with Vitest
just up # Start Docker Compose service
just down # Stop Docker Compose service
just logs # Tail container logs
just health # Check /health endpoint
just setup # Create .env from .env.example
just gen-token # Generate a random Bearer token
just clean # Remove dist/, .cache/, coverage/Verification
After starting the server:
just typecheck
just lint
just test
just healthThe health endpoint returns:
{"status": "ok", "service": "arcane-mcp"}Related plugins
Plugin | Category | Description |
core | Core agents, commands, skills, and setup/health workflows for homelab management. | |
media | Search movies and TV shows, submit requests, and monitor failed requests via Overseerr. | |
infrastructure | Query, monitor, and manage Unraid servers: Docker, VMs, array, parity, and live telemetry. | |
infrastructure | Monitor and manage UniFi devices, clients, firewall rules, and network health. | |
utilities | Send and manage push notifications via a self-hosted Gotify server. | |
infrastructure | Create, edit, and manage SWAG nginx reverse proxy configurations. | |
infrastructure | Docker management (Flux) and SSH remote operations (Scout) across homelab hosts. | |
infrastructure | Receive, index, and search syslog streams from all homelab hosts via SQLite FTS5. | |
dev-tools | Scaffold, review, align, and deploy homelab MCP plugins with agents and canonical templates. |
License
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/jmagar/arcane-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server