Skip to main content
The precise rules a template is validated against. For a walkthrough of building one, see Building a template. Templates are Agent Plugins 1.0.0 directories. NanoClaw is deliberately stricter than the spec in a few places where trust policy is client-owned; those are marked below.

Resolution

NANOCLAW_TEMPLATES_DIR is a local path only, resolved once at load — never a URL, and never changed at runtime.

Failure boundaries

Per-component failures degrade; structural and trust violations reject the whole template. Every skip or ignore produces a named line in the create response’s templateReport. Components are never silently stripped.

plugin.json

Required. It is both the manifest and the discovery marker. name is the plugin’s machine name, independent of the folder path, and is the folder it is stamped under.

The NanoClaw extension key

Display-name precedence: --nameagentName → the template folder name. Any other key under ai.nanoco.nanoclaw is reported as unrecognized and ignored.

mcp.json

Optional. Exactly two top-level fields are allowed — anything else skips the whole MCP component. Every entry must declare type. An sse entry is rejected as unsupported — that server is skipped with a notice, not the whole template.
Allowed fields: type, command, args, env, cwd.A ${PLUGIN_DATA} subdirectory named as cwd is created at stamp time. ./ and ${PLUGIN_ROOT} directories must already exist in the shipped plugin.

Secret lint

Applied to every env and headers value at stamp time. The literal "placeholder" always passes. Key matching is case-insensitive and matches anywhere in the name, so MY_SLACK_TOKEN_V2 matches on TOKEN.
The registry’s check-templates.mjs fails on the credential-shaped-key case rather than warning, so a template that stamps cleanly locally can still be rejected by CI. It also does not strip auth-scheme prefixes, so a Bearer sk-… value trips the engine but not the registry script — though only when the key itself isn’t credential-shaped; an Authorization header still fails CI on the key rule. See Submitting a template.
As defense in depth, stored MCP config is re-validated whenever the container config is materialized; invalid entries are dropped and logged.

skills/<name>/

Each immediate child directory of skills/ containing a regular SKILL.md is one skill. Stray regular files in skills/ are ignored. A skill is skipped, with a reason, when:
  • there is no SKILL.md, or it is not a regular file
  • SKILL.md has no YAML frontmatter, or the frontmatter is unclosed, invalid YAML, or not a mapping
  • name or description is missing or empty
Symlinks are not in this list: the whole-tree walk runs before skills are read and rejects the entire template on the first symlink it finds, so a symlinked SKILL.md never degrades to a skipped skill. The whole folder is copied into the group’s skills overlay, keyed to that group and never shared. Executable bits are preserved.

ai.nanoco.nanoclaw/

Extra context files are copied with the context/ prefix stripped, so a reference written as additional_context/pricing.md in instructions.md resolves unchanged in the agent’s workspace. Nothing is injected automatically.

Task files

Each immediate .md file under tasks/ is one task. The filename is the task name; the body is the prompt. The body must be non-empty. Task names must not collide on their truncated id slug; a colliding template is refused at first stamp, before anything is created. Tasks are created with status paused, fire in the group timezone, and follow normal frequency limits — four fires per 24 hours when ungated, more when a script gate is present. Templates cannot create one-time tasks or override the frequency limit.

Limits and containment

The tree is walked with lstat before any content is read, so a hostile template is rejected without its targets being touched. These are abuse bounds, not sizing guidance; real templates are a few dozen files.
Plugin content is data on the host and code only in the container. The host process validates and copies plugin files but never executes, imports, or shells out to anything inside them. stdio servers, skill scripts, and task script gates all run in the agent container.

Where a stamped template lands

The runtime contract

stdio servers that shipped inside a plugin get the Agent Plugins runtime contract: Servers added by ncl or through an approval carry no plugin marker and pass through untouched.

Building a template

The narrative version, with examples, registry standards, and the checks script.

Using a template

Stamping an agent and reading the create response.

Container config

The per-group config MCP servers are written into.

ncl CLI

groups create --template and the restamp flags.
Last modified on August 13, 2026