/add-dial-tool
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, attached only to the agents you pick, so they can send SMS, place AI voice calls, and receive verification codes
Claude Code
$ npx -y skills add nanocoai/nanoclaw --skill add-dial-tool --agent claude-code
Codex
$ npx skills add nanocoai/nanoclaw --skill add-dial-tool -a codex -y
Cursor
$ npx skills add nanocoai/nanoclaw --skill add-dial-tool -a cursor -y
Gemini CLI
$ npx skills add nanocoai/nanoclaw --skill add-dial-tool -a gemini-cli -y
GitHub Copilot
$ npx skills add nanocoai/nanoclaw --skill add-dial-tool -a github-copilot -y
OpenCode
$ npx skills add nanocoai/nanoclaw --skill add-dial-tool -a opencode -y
Windsurf
$ npx skills add nanocoai/nanoclaw --skill add-dial-tool -a windsurf -y
SKILL.md
add-dial-tool.SKILL.mdname: 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, attached only to the agents you pick, so they 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.
Add Dial Tool
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 attached only to the agents you choose, so their 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. The key is attached to those agents only; every other agent, and every agent group created later, gets no Dial key, and the gateway answers its Dial requests with the error code `access_restricted`.
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.
Pre-flight
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.
This skill attaches the Dial key to chosen agents through the OneCLI agent grants API, which gateway 1.44 added; NanoClaw pins 1.45. On an older gateway every agent in `all` mode would receive a new key, and the grants commands do not exist. A 1.44+ gateway converts `all`-mode agents to grants once, on its first start; an agent still in `all` mode means that conversion has not finished, and it too would receive the key. So run the shared grants check before anything is written: it reads the version of the gateway the `onecli` CLI talks to, checks that no agent is in `all` mode, and checks that the `onecli` CLI has the grants commands. The Dial sign-up and credential steps below use the captured version, so they cannot run when this check fails:
sh .claude/skills/add-onecli/scripts/check-grants-gateway.sh /add-dial-tool
If it fails, show the user the message as it is and stop. Do not work around it by attaching the Dial key by hand to every agent: which agents hold the key is the only thing that keeps the ones you did not choose away from Dial.
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}}`.
Choose which agents may use Dial
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 do not get the Dial key (reversible by running /add-dial-tool again). Agents created after this run do not get Dial until you run /add-dial-tool again.Which agents may use Dial? Enter agent ids separated by commas with no spaces (the `ag-…` column), `all` for every agent that exists now, or `none` to install the tool with no agent holding the key 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, and `all` is expanded to the groups that exist now, so a group created while the skill runs is not included. The checked answer is captured, and every step that installs, signs in, or writes a credential below depends on the capture: a bad answer stops them all, nothing is written:
A=$(printf '%s' '{{dial_agents}}' | tr -d ' '); G=$(ncl groups list --json --limit 100000) || { echo "could not list agent groups — is the NanoClaw host running?" >&2; exit 1; }; for w in $(printf '%s' "$A" | tr ',' ' '); do case "$w" in all|none) ;; *) printf '%s' "$G" | jq -e --arg id "$w" '.data[] | select(.id==$id)' >/dev/null || { echo "unknown agent group '$w' — see: ncl groups list"Read more
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, attached only to the agents you pick, so they 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.
Add Dial Tool
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 attached only to the agents you choose, so their 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. The key is attached to those agents only; every other agent, and every agent group created later, gets no Dial key, and the gateway answers its Dial requests with the error code `access_restricted`.
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.
Pre-flight
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.
This skill attaches the Dial key to chosen agents through the OneCLI agent grants API, which gateway 1.44 added; NanoClaw pins 1.45. On an older gateway every agent in `all` mode would receive a new key, and the grants commands do not exist. A 1.44+ gateway converts `all`-mode agents to grants once, on its first start; an agent still in `all` mode means that conversion has not finished, and it too would receive the key. So run the shared grants check before anything is written: it reads the version of the gateway the `onecli` CLI talks to, checks that no agent is in `all` mode, and checks that the `onecli` CLI has the grants commands. The Dial sign-up and credential steps below use the captured version, so they cannot run when this check fails:
sh .claude/skills/add-onecli/scripts/check-grants-gateway.sh /add-dial-tool
If it fails, show the user the message as it is and stop. Do not work around it by attaching the Dial key by hand to every agent: which agents hold the key is the only thing that keeps the ones you did not choose away from Dial.
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}}`.
Choose which agents may use Dial
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 do not get the Dial key (reversible by running /add-dial-tool again). Agents created after this run do not get Dial until you run /add-dial-tool again.Which agents may use Dial? Enter agent ids separated by commas with no spaces (the `ag-…` column), `all` for every agent that exists now, or `none` to install the tool with no agent holding the key 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, and `all` is expanded to the groups that exist now, so a group created while the skill runs is not included. The checked answer is captured, and every step that installs, signs in, or writes a credential below depends on the capture: a bad answer stops them all, nothing is written:
A=$(printf '%s' '{{dial_agents}}' | tr -d ' '); G=$(ncl groups list --json --limit 100000) || { echo "could not list agent groups — is the NanoClaw host running?" >&2; exit 1; }; for w in $(printf '%s' "$A" | tr ',' ' '); do case "$w" in all|none) ;; *) printf '%s' "$G" | jq -e --arg id "$w" '.data[] | select(.id==$id)' >/dev/null || { echo "unknown agent group '$w' — see: ncl groups list"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
Other skills on nanoclaw.
More skills from other plugins.
browser-use
Direct browser control via CDP for web interaction: automation, scraping, testing, screenshots, and site/app work. Also covers…
agent-browser
Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling…
opencli-adapter-author
Build or improve an OpenCLI JS adapter using observed site behavior, existing adapters and browser API evidence. For ad-hoc…
Questions about add-dial-tool.
- Which coding agents can use add-dial-tool?
- add-dial-tool installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.

