add-anydoc
Add local office-document-to-Markdown conversion to NanoClaw agent containers with the pinned Firecrawl AnyDoc CLI. Use when agents need to read attached Word,…
Give chosen NanoClaw agents a real phone number as a container tool — the `dial` CLI baked into the agent image plus OneCLI credential injection for api.getdial.ai, scoped per agent, so the agents you pick can send SMS, place AI voice calls, and receive verification codes from
$ npx -y skills add nanocoai/nanoclaw --skill add-dial-tool --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/add-dial-toolContext preview
The summary Claude sees to decide when to auto-load this skill.
Give chosen NanoClaw agents a real phone number as a container tool — the `dial` CLI baked into the agent image plus OneCLI credential injection for api.getdial.ai, scoped per agent, so the agents you pick can send SMS, place AI voice calls, and receive verification codes from
name: add-dial-tool description: Give chosen NanoClaw agents a real phone number as a container tool — the `dial` CLI baked into the agent image plus OneCLI credential injection for api.getdial.ai, scoped per agent, so the agents you pick can send SMS, place AI voice calls, and receive verification codes from inside the sandbox. Independent of the Dial channel; idempotent; re-run to change which agents may use it. Use when the user wants agents to text, call, or run `dial …` from a chat, without wiring Dial as a messaging channel.
Installs Dial as a **container tool**: the `dial` CLI on the agent's `PATH`, the `dial-cli` skill so the agent knows how to drive it, and an OneCLI credential so in-container calls are injected keyless. Independent of the Dial **channel** (`/add-dial`) — install this alone. Idempotent: re-run it to change which agents may use Dial.
**This tool spends money and reaches real people.** An agent with Dial access can text and call any number and buy more numbers, billed to the Dial account. The CLI and the skill file land in every agent's container, but the **key** is injected per agent by OneCLI, so the operator chooses which agents get it. Every other agent gets an OneCLI block rule and sees `403 blocked_by_policy` if it tries.
Run this from the NanoClaw repo on the host (not from a chat with an agent — the container can't install itself). The mechanical steps carry `nc:` directive fences: an agent reads the prose and applies them, and a parser can apply them deterministically from the same document. Every directive is idempotent, so the whole skill is safe to re-run; anything a parser can't apply falls back to the prose beside it.
OneCLI is required for credential injection — without it there is no way to hand the key to a container without putting it in an env var. This must succeed before anything else runs:
command -v onecli >/dev/null
If it fails, tell the user to run `/init-onecli` first, then retry. Stop here.
Calls this setup makes to Dial identify the install. The `dial` CLI prepends `DIAL_USER_AGENT` to its own token, so the account's requests stay attributable to this NanoClaw install in Dial's server-side logs. Resolve the token once (`nanoclaw/<version>`; an unreadable `package.json` degrades to `nanoclaw/unknown` rather than blocking the install):
node -p "'nanoclaw/'+(require('./package.json').version||'unknown')" 2>/dev/null || echo nanoclaw/unknownPrefix every `dial` command below with `DIAL_USER_AGENT={{dial_ua}}`.
List the agent groups (the NanoClaw service must be running — `ncl` talks to it over its socket):
ncl groups list --json | jq -r 'if (.data|length)==0 then "no agent groups yet" else [.data[] | "\(.id) (\(.name))"] | join(", ") end'Ask the operator which of them may use Dial. Say plainly what they are granting, and ask even when there is a single agent:
Agents on this install: {{agent_groups}}. Giving an agent Dial lets it text and call any number and buy numbers, billed to your Dial account. Agents you leave out are blocked at the gateway (reversible by running /add-dial-tool again). Agents created after this run have Dial until the next run.Which agents may use Dial? Enter agent ids separated by commas with no spaces (the `ag-…` column), `all` for every agent, or `none` to install the tool with every agent blocked for now.
`all` and `none` cannot be mixed with ids, and an empty answer is never "everyone". A typo must not silently open or close anything, so every id named must be a real agent group:
for w in $(printf '%s' '{{dial_agents}}' | tr ',' ' '); do case "$w" in all|none) ;; *) ncl groups list --json | jq -e --arg id "$w" '.data[] | select(.id==$id)' >/dev/null || { echo "unknown agent group '$w' — see: ncl groups list" >&2; exit 1; }; esac; doneThe host needs the `dial` CLI to sign in: `dial auth login` / `dial auth verify-otp` write the host auth file that the credential step below reads. Pinned to the same version the agent image gets, so host and sandbox agree:
command -v dial >/dev/null || npm install -g @getdial/cli@0.37.0
Dial's CLI owns the account credential (an auth file it writes on sign-in).
Is this host already signed in?
DIAL_USER_AGENT={{dial_ua}} dial doctor --jsonIf it **is**, read which account — that account's key is what the chosen agents will use:
DIAL_USER_AGENT={{dial_ua}} dial doctor --jsonThis host is signed in to Dial as {{connected_email}}; the agents you chose will use that account. To give them a different account, run `dial auth login <email> --force` and `dial auth verify-otp --code <code>` on the host first, then run /add-dial-tool again.If it is **not**, verify an email with a one-time code. Collect the email:
What's your email? Dial sends a one-time code to verify it. By continuing you create a Dial account and agree to Dial's Terms of Service (https://getdial.ai/terms) and Privacy Policy (https://getdial.ai/privacy).
Send the code (`--force` re-sends even if a prior code is pending):
DIAL_USER_AGENT={{dial_ua}} dial auth login {{owner_email}} --forceCollect the code:
A lightweight alternative to OpenClaw that runs in containers for security. Connects to WhatsApp, Telegram, Slack, Discord, Gmail and other messaging apps,, has memory, scheduled jobs, and runs directly on Anthropic's Agents SDK
Repo: nanocoai/nanoclaw
Add local office-document-to-Markdown conversion to NanoClaw agent containers with the pinned Firecrawl AnyDoc CLI. Use when agents need to read attached Word,…
Convert an attached Word document, presentation, spreadsheet, OpenDocument file, RTF, EPUB, CSV, or text-based PDF into local Markdown. Use when a message…
Add Atomic Chat MCP server so the container agent can call local models served by the Atomic Chat desktop app via its OpenAI-compatible API.
Add clidash — a zero-dependency, read-only web dashboard that derives its tabs and tables at runtime from any CLI that lists resources as JSON. Ships pre-wired…
Use Codex (OpenAI's codex app-server) as a full agent provider — planning, tool orchestration, MCP tools, server-side history, session resume — alongside or…
Add a monitoring dashboard to NanoClaw. Installs @nanoco/nanoclaw-dashboard and a pusher that sends periodic JSON snapshots.