Resources
Besides its tools, arcane-mcp publishes MCP resources: documents a client can attach to a conversation as context (Claude’s and VS Code’s “add context” menus) or a model can read with resources/read. They are the same on every tool surface. resources/list returns the fixed URIs and resources/templates/list the templates.
There are three kinds:
- Docker state as JSON, read from Arcane when the resource is read.
- Workflow guides as Markdown: step-by-step procedures that name the actions to call.
- The action catalog:
arcane://toolsandarcane://tools/{id}, the actions this server offers with their parameters.
Docker state
Section titled “Docker state”Each data resource is a view of one catalog action. Reading it runs that action, with the URI’s parts as arguments, and returns the action’s value (what a tool call returns as structuredContent) with its secrets redacted (see Redaction).
| URI | Action | Contents |
|---|---|---|
arcane://environments | environment.list | Every environment (Docker host) the caller can see: id (the environmentId of the other URIs; 0 is Arcane’s local host), name, apiUrl, status |
arcane://version | server.app_version | Arcane’s version and build, and whether an update is available |
arcane://environment/{environmentId} | environment.get | One environment’s full record |
arcane://environment/{environmentId}/containers | container.list | Every container, stopped ones included, with running/stopped/total counts |
arcane://environment/{environmentId}/container/{containerId} | container.get | One container’s inspect details (state and health, configuration, mounts, networks); containerId is an ID or a name |
arcane://environment/{environmentId}/projects | project.list | Every Compose project that is not archived |
arcane://environment/{environmentId}/project/{projectId} | project.get | One project’s summary: status, service counts, configuration errors |
arcane://environment/{environmentId}/images | image.list | Every local image, with stored update and vulnerability results |
Clients that support completions suggest the template variables (environmentId, containerId, projectId) as you type (see Completions). The results of environment.get, container.get and project.get end with a resource_link to the object’s template, filled in (see Output format).
What a read does:
- Whole lists. A list resource asks Arcane for every item (
limit=-1), since a resource cannot be paged. The list actions keep their pages of 20 by default; use them to filter or sort. - Your credential. The read uses the server’s Arcane client: over stdio the configured API key or login; over HTTP the key the client sent in
X-Arcane-API-Key(each key has its own server), so a read never sees more than the same key would through a tool.arcane://versionsends no credential, asserver.app_versionnever does. - Every mode. Reads do not change anything, so read-only and safe mode keep the resources. An action removed with
ARCANE_MCP_EXCLUDE_TOOLStakes its resource with it: excludingcontainer.getalso removes the container template (see Configuration). - The action deadline (
ARCANE_MCP_ACTION_TIMEOUT) and the per-request timeout apply as they do to tool calls. - Audit log. Each read leaves one audit record, with message
resource read,surface=resource,tool=resources/read, the action and the outcome (and in HTTP mode the key fingerprint): the fields of a tool call’s record. - Not cached. Results carry
cacheScope: privateandttlMs: 0: the data belongs to one credential and Docker state can change at any time. - JSON only. The contents are the indented JSON value with MIME type
application/json. There is no Markdown rendering; call the action instead when you want the rendered text.
Redaction
Section titled “Redaction”A client can attach a resource to the conversation, show it or cache it without anyone asking for a particular field, so the data resources leave out the secrets Docker and Compose keep next to the state they show. Tool calls are not redacted: the action named in each resource returns everything to whoever holds the key.
| Resource | Redacted |
|---|---|
arcane://environments, arcane://environment/{environmentId} | Each environment’s apiKey and edgeSessionId |
arcane://environment/{environmentId}/containers | Each container’s command and its label values |
arcane://environment/{environmentId}/container/{containerId} | The values of config.env (the variable names stay: GH_PAT=[redacted: use container.get]), config.cmd, config.entrypoint, config.healthcheck.test, the health check output (state.health.log[].output) and the label values |
arcane://environment/{environmentId}/projects, arcane://environment/{environmentId}/project/{projectId} | composeContent, envContent, overrideContent and the include files’ content; in every service config (services[], runtimeServices[].serviceConfig): the values of environment and of the build args (names stay), command, entrypoint, healthcheck.test, the commands and environment values of the pre_start, post_start, pre_stop and develop.watch[].exec hooks, the build’s dockerfile_inline, label and annotation values, logging options other than size, rotation and tag settings, and provider options |
arcane://environment/{environmentId}/images | Label values |
| Every resource | The user:password@ part of any URL in any string (gitRepositoryURL, apiUrl, an error message), wherever it sits, scheme-relative //user:password@host included; a password with an unencoded /, ?, # or @ goes whole, at the price of sometimes cutting more than the userinfo. git@host:repo, mailto: addresses and scheme-less DSNs are left as they are |
- A redacted value is replaced with the string
[redacted: use <action>], naming the action that returns it. A command line is replaced whole: it cannot be cut safely. A URL only loses its user information and stays usable. - Label values are kept for the labels Docker Compose writes itself (
com.docker.compose.project,.service,.config-hash,.container-number,.project.working_dirand the rest of Compose’s own list, derived from the project’s structure) and fororg.opencontainers.image.*(public image metadata). Every other label can hold anything, such as Traefik’s basic-auth users or acom.docker.compose.*label set by hand, so its value is redacted. Label and variable names always stay. - When something was redacted the value gains a
_redactedmember:fullValueis the action that returns everything andpathslists the redacted positions as JSON Pointers. List indexes and the names a rule covers (labels, variables) are written*; any other object key appears as it is only when it is made of letters, digits,_,.and-(64 at most), and as*otherwise. If Arcane’s own value ever has a top-level_redactedmember, it is withheld and listed as/_redacted. - Identifiers stay: ids, names, images and tags, states, ports, mounts, networks, the environment in
failedEnvironments. - The rules follow the positions of the fields in Arcane’s response schemas, not key names. A unit test fills every string field the vendored Arcane schemas declare for these actions and pins what happens to each, so a new Arcane release that adds a field has to be reviewed.
Errors
Section titled “Errors”A failed read is a JSON-RPC error (a resource result has no error flag). Its message is the one a tool call would get, hint included, and its data holds the uri and, when Arcane answered, its HTTP status.
| Cause | Code |
|---|---|
| Arcane answers 404 (no such environment, container or project), or the URI matches no resource | -32602, resource not found (as the MCP specification asks since SEP-2164) |
| Arcane answers another error status | the status × −100: -40100 for 401, -40300 for 403, -50000 for 500 (the convention of the HTTP transport’s own refusals) |
| Arcane cannot be reached, or the deadline ends the read | -32603, internal error |
Arcane also answers 404 for a container (and an image, network or volume) when it cannot reach the environment’s Docker daemon. The code is then -32602 too, but the message’s hint says the daemon could not be reached rather than calling the resource missing.
Workflow guides
Section titled “Workflow guides”The guides are static Markdown (text/markdown) written from the actions’ usage notes. They name actions by their canonical ID (project.up); each ends with a note on how the active surface calls an ID, and a reminder that destructive actions need confirmation and that read-only and safe mode withhold or preview the actions that change state.
| URI | Covers |
|---|---|
arcane://guides/deploy-compose-project | Creating a project from compose text, a template or Git, deploying it, verifying it and changing it later |
arcane://guides/update-images-safely | Checking for image updates without pulling, reading the stored results, applying them to one project, one container or everything, and verifying |
arcane://guides/back-up-and-restore-a-volume | Backing up a volume, inspecting the backup, restoring it whole or in part, scheduled backups |
arcane://guides/diagnose-an-unhealthy-container | Reading a container’s state, health-check log, logs, processes and history, then fixing it |
A unit test fails when a guide names an action the catalog does not have.
Three of the guides also come attached to the matching prompt (diagnose_container, update_project_images, backup_volume), which gives the order of the steps for one container, project or volume.
The action catalog
Section titled “The action catalog”arcane://tools lists every action this server offers, with the tool and call shape of the active surface; arcane://tools/{id} returns one action’s description, route, required parameters and full input schema. In read-only mode, or for an excluded action, the entry says why the action is withheld.