Use this skill when creating or editing an agent.yaml (or .yml/.hcl) configuration file for Docker Agent (cagent), including defining agents, models/providers, built-in or MCP toolsets, multi-agent teams with sub_agents. Even if the user just says they want to "build an AI agent with Docker", "make a coding agent config", "add a tool to my agent", or "set up a team of agents", this skill applies. Covers agent properties (model, instruction, toolsets, sub_agents, fallback), the models/providers sections, built-in toolsets (filesystem, shell, think, todo, memory, fetch), MCP toolset references, and named commands.
npx skills add https://github.com/docker/skills --skill docker-agent-config
Docker Agent (the CLI is docker agent, the open-source project is cagent)
runs AI agents declared in a YAML file instead of application code. This
skill owns the agent.yaml artifact: the agents section (each entry's
model, instruction, and its own toolsets/sub_agents), the top-level
models/providers sections referenced from agents, and a top-level
commands group agents can opt into with use_commands. It does not cover
invoking the CLI or serving/sharing the config — see Related
skills.
Activate this skill when:
agent.yaml/agent.yml/agent.hcl file.Do not use this skill when:
docker agent run flags, --safety, --sandbox, aliases, worktrees) — use docker-agent-run.serve mcp/api/a2a/acp/chat), distributing it (share push/pull), or evaluating it (docker agent eval) — use docker-agent-deploy.docker-build-strategies or docker-compose-patterns.agents:. The agentnamed root, or the first agent defined, is the entry point that receives
user messages.
agents:
root:
model: anthropic/claude-sonnet-4-5
description: A coding assistant
instruction: |
You are an expert developer. Help users write clean,
efficient code. Explain your reasoning step by step.
toolsets:
- type: filesystem
- type: shell
- type: think
model, description, instruction (orinstruction_file). description is not decoration — other agents read it
to decide whether to delegate to this one, so keep it accurate.
instruction_file (a relative path, no ..) instead of an inlineinstruction for long prompts; this keeps diffs focused on behavior, not
YAML escaping. instruction and instruction_file are mutually exclusive.
instruction_file is not supported for agents loaded from an OCI reference
or URL — inline instruction there.
provider/model shorthand, or a namedentry under top-level models: referencing a provider. Use the named
form whenever you need temperature, max_tokens, thinking_budget, or
reuse across agents.
models:
claude:
provider: anthropic
model: claude-sonnet-4-5
max_tokens: 64000
agents:
root:
model: claude
openai, anthropic, google, amazon-bedrock,dmr (Docker Model Runner, local, no API key), ollama (local). Dozens of
additional built-in aliases exist (mistral, groq, xai, together,
azure, github-copilot, openrouter, ...) — each needs its own
<PROVIDER>_API_KEY-style env var; run docker agent models --all to see
what's resolvable, and docker agent setup to register credentials
interactively instead of hand-editing env vars.
agent.yaml. Provider credentials come fromenvironment variables (token_key for custom providers) or from
~/.config/cagent/.env written by docker agent setup.
dmr/<model> for agents that must run offline or must not send datato a third party; it costs nothing and needs no credential. Use a paid
cloud provider only when the task needs it.
fallback so a provider outage or ratelimit does not stop the run:
agents:
root:
model: anthropic/claude-sonnet-4-5
fallback:
models: [openai/gpt-5, google/gemini-3.5-flash]
retries: 2 # per model, for 5xx errors
cooldown: 1m # stick with fallback after a 429
gateway), define a providers: entry with base_url and token_key
rather than putting the URL inline on every model:
providers:
my_gateway:
base_url: https://api.example.com/v1
token_key: MY_API_KEY
models:
my_model:
provider: my_gateway
model: gpt-4o
filesystem, shell,think, todo, tasks, memory, fetch, background-jobs, script,
lsp, api. Add one per list entry:
toolsets:
- type: filesystem
- type: shell
type: todo(or shell) — a common symptom of an agent missing the tool it needs to
act, not a model problem.
bespoke integration — it runs containerized and is reusable across agents:
toolsets:
- type: mcp
ref: docker:duckduckgo
Local stdio and remote HTTP/SSE MCP servers are also supported; see
references/toolsets-and-providers.md.
defer: true on a toolset (MCP or otherwise) to load its toolson-demand instead of at startup, when the agent has many toolsets and
startup latency matters.
readonly: true on an agent to restrict every toolset it uses toread-only tools — use this for reviewer/analysis agents that must not
mutate anything.
sub_agents: [name, ...]; listing sub-agentsautomatically enables the transfer_task tool on the parent.
# Fragment: coder and reviewer are defined separately in the full asset.
agents:
root:
sub_agents: [coder, reviewer]
Use assets/team-agent.yaml for the complete runnable team, including
the reviewer's readonly: true restriction. Keep that restriction when
adapting the template; a filesystem toolset alone also exposes writes.
sub_agents also accepts external OCI references (myorg/agent:tag).Pin external references to a digest (name@sha256:...) in production
configs to skip the per-run registry lookup that a tag incurs.
transfer_task (via sub_agents) for delegation with a clean,isolated result; use a commands: entry with an agent: field only when
you want the user to *become* that agent for the rest of the session.
redact_secrets: true on any agent that runs shell/fetch tools againstuntrusted input. It scrubs recognized secret patterns from tool arguments,
outgoing messages, and tool output. This is defense in depth, not a
guarantee: arbitrary passwords, tokens, or customer data may go undetected.
max_iterations on any agent that loops autonomously (default isunlimited) to bound cost and prevent runaway loops; max_consecutive_tool_calls
(default 5) already guards against identical-call loops.
instruction,instruction_file, and command prompts, whether literal or interpolated.
${env.VAR} expands values into prompt text sent to the model; storing a
value in an env file does not prevent this disclosure. Use interpolation
only for non-sensitive context.
docker agent setup or the provider'ssupported environment variables. For custom providers, token_key: MY_API_KEY
names the environment variable, not its value; do not interpolate it.
Configure tool/MCP credentials through that integration's authentication
mechanism, not through prompts or model-supplied tool arguments. Prompts
should describe the authenticated capability without containing its secret.
Do not ask the agent to read or print credential files or environment values
to check authentication.
docker agent run, safety modes, sandbox, aliases), use docker-agent-run.docker-agent-deploy.references/toolsets-and-providers.md — full built-in toolset list, MCP connection modes, and the provider/env-var table.references/sources.md — provenance of every rule in this skill.assets/team-agent.yaml — a runnable multi-agent team template (coordinator + coder + reviewer).checks/verification.md to confirm itsresolved config, exposed tools, and provider connectivity, then smoke-test it.
Take docker/docker-agent-config from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.