Skip to content

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://tools and arcane://tools/{id}, the actions this server offers with their parameters.

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).

URIActionContents
arcane://environmentsenvironment.listEvery environment (Docker host) the caller can see: id (the environmentId of the other URIs; 0 is Arcane’s local host), name, apiUrl, status
arcane://versionserver.app_versionArcane’s version and build, and whether an update is available
arcane://environment/{environmentId}environment.getOne environment’s full record
arcane://environment/{environmentId}/containerscontainer.listEvery container, stopped ones included, with running/stopped/total counts
arcane://environment/{environmentId}/container/{containerId}container.getOne container’s inspect details (state and health, configuration, mounts, networks); containerId is an ID or a name
arcane://environment/{environmentId}/projectsproject.listEvery Compose project that is not archived
arcane://environment/{environmentId}/project/{projectId}project.getOne project’s summary: status, service counts, configuration errors
arcane://environment/{environmentId}/imagesimage.listEvery 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://version sends no credential, as server.app_version never does.
  • Every mode. Reads do not change anything, so read-only and safe mode keep the resources. An action removed with ARCANE_MCP_EXCLUDE_TOOLS takes its resource with it: excluding container.get also 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: private and ttlMs: 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.

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.

ResourceRedacted
arcane://environments, arcane://environment/{environmentId}Each environment’s apiKey and edgeSessionId
arcane://environment/{environmentId}/containersEach 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}/imagesLabel values
Every resourceThe 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_dir and the rest of Compose’s own list, derived from the project’s structure) and for org.opencontainers.image.* (public image metadata). Every other label can hold anything, such as Traefik’s basic-auth users or a com.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 _redacted member: fullValue is the action that returns everything and paths lists 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 _redacted member, 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.

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.

CauseCode
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 statusthe 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.

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.

URICovers
arcane://guides/deploy-compose-projectCreating a project from compose text, a template or Git, deploying it, verifying it and changing it later
arcane://guides/update-images-safelyChecking 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-volumeBacking up a volume, inspecting the backup, restoring it whole or in part, scheduled backups
arcane://guides/diagnose-an-unhealthy-containerReading 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.

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.