Amber — Give Your Agent Real Phone Capabilities
Overview
Amber gives any OpenClaw deployment real phone capabilities for agents. It ships with a production-ready Twilio + OpenAI Realtime bridge (runtime/) for confirmed phone workflows: inbound answering, call screening, prepared outbound workflows, and confirmed scheduling over a real telephone number.
✨ New in v5.4.0: Amber now ships as an MCP plugin with 9 tools — prepare confirmed calls by name, check call history, query CRM contacts, manage calendar, and control call screening. It works with Claude Desktop/Cowork and other MCP-capable clients or agent harnesses once configured. Includes Apple Contacts integration and a code-enforced call confirmation safeguard to prevent wrong-number dials.
✨ Also: Interactive setup wizard (npm run setup) validates credentials in real-time and generates a working .env file — no manual configuration needed. Once setup is complete, Amber is prompt-based: ask your OpenClaw agent to prepare confirmed calls, answer/screen callers, schedule confirmed appointments, or handle phone workflows in natural language.
See it in action
▶️ Watch the interactive demo on asciinema.org (copyable text, adjustable speed)
The interactive wizard validates credentials, detects ngrok, and generates a complete .env file in minutes.
What's included
- Runtime bridge (
runtime/) — a complete Node.js server that connects Twilio phone calls to OpenAI Realtime with OpenClaw brain-in-the-loop
- Amber Skills (
amber-skills/) — modular mid-call capabilities (CRM, calendar, log & forward message) with a spec for building your own
- Built-in CRM — local SQLite contact database; Amber greets callers by name and references personal context naturally on every call, with operator review/correction responsibility
- Call log dashboard (
dashboard/) — browse call history, transcripts, and captured messages; includes manual Sync button to pull new calls on demand
- Setup & validation scripts — preflight checks, env templates, quickstart runner
- Architecture docs & troubleshooting — call flow diagrams, common failure runbooks
- Safety guardrails — outbound calls require code-enforced confirmation; payment escalation, consent boundaries, and explicit confirmation for calendar writes are documented
🔌 Amber Skills — Extensible by Design
Amber ships with a growing library of Amber Skills — modular capabilities that plug directly into live voice conversations. Each skill exposes a structured function that Amber can call mid-call, letting you compose powerful voice workflows without touching the bridge code.
👤 CRM — Contact Memory (v5.3.0)
Amber remembers every caller across calls and uses that memory to personalize every conversation.
- Runtime-managed — lookup and logging happen automatically; Amber never has to "remember" to call CRM
- Personalized greeting — known callers can be greeted by name; optional notes are used only when relevant to the call objective
- Two-pass enrichment — auto-log captures the call immediately; an optional post-call extraction pass proposes caller details and notes for the local CRM
- Operator review expected — review, correct, or delete CRM records periodically so bad transcript extraction or misleading caller input does not persist indefinitely
- Symmetric — works identically for inbound and outbound calls
- Local SQLite CRM — contact memory is stored at
~/.config/amber/crm.sqlite; CRM records are not cloud-hosted. Live call audio/transcripts still pass through Twilio/OpenAI as part of the phone bridge.
- Native dependency — requires
better-sqlite3 (native build). macOS: sudo xcodebuild -license accept before npm install. Linux: build-essential + python3.
📅 Calendar
Query the operator's calendar for availability or schedule a new event — all during a live call.
- Availability lookups — free/busy slots for today, tomorrow, this week, or any specific date
- Event creation — create calendar events from a phone conversation only after the required details are collected and the caller explicitly confirms the slot
- Privacy by default — callers are only told whether the operator is free or busy; event titles, names, and locations are never disclosed
- Powered by
ical-query — local-only, zero network latency
📬 Log & Forward Message
Let callers leave a message that is automatically saved and forwarded to the operator.
- Captures the caller's message, name, and optional callback number
- Always saves to the call log first (audit trail), then delivers via the operator's configured messaging channel
- Confirmation-gated — Amber confirms with the caller before sending
- Delivery destination is operator-configured — callers cannot redirect messages
Build Your Own Skills
Amber's skill system is designed to grow. Each skill is a self-contained directory with a SKILL.md (metadata + function schema) and a handler.js. You can:
- Customize the included skills to fit your own setup
- Build new skills for your use case — CRM lookups, inventory checks, custom notifications, anything callable mid-call
- Share skills with the OpenClaw community via ClawHub
See amber-skills/ for examples and the full specification to get started.
Note: Each skill's handler.js is reviewed against its declared permissions. When building or installing third-party skills, review the handler source as you would any Node.js module.
Call log dashboard
cd dashboard && node scripts/serve.js # → http://localhost:8787
- ⬇ Sync button (green) — immediately pulls new calls from
runtime/logs/ and refreshes the dashboard. Use this right after a call ends rather than waiting for the background watcher.
- ↻ Refresh button (blue) — reloads existing data from disk without re-processing logs.
- Background watcher (
node scripts/watch.js) auto-syncs every 30 seconds when running.
Why Amber
- Ship a voice assistant in minutes —
npm install, configure .env, npm start
- Full inbound screening: greeting, message-taking, appointment booking with calendar integration
- Outbound calls with structured call plans (reservations, inquiries, follow-ups), with confirmation gates and a runtime disable switch
- OpenClaw gateway lookup (least-privilege) — voice agent consults your OpenClaw gateway only for call-critical needs (availability checks, confirmed scheduling, required factual lookups), not for unrelated tasks
- VAD tuning + verbal fillers to keep conversations natural (no dead air during lookups)
- Fully configurable: assistant name, operator info, org name, calendar, screening style — all via env vars
- Operator safety guardrails for approvals/escalation/payment handling
Personalization requirements
Before deploying, users must personalize:
- assistant name/voice and greeting text,
- own Twilio number and account credentials,
- own OpenAI project + webhook secret,
- own OpenClaw gateway/session endpoint,
- own call safety policy (approval, escalation, payment handling).
Do not reuse example values from another operator.
5-minute quickstart
Option A: Interactive Setup Wizard (recommended) ✨
The easiest way to get started:
cd runtime
npm run setup
- Follow the interactive prompts — the wizard will:
- Validate your Twilio and OpenAI credentials in real-time
- Auto-detect and configure ngrok if available
- Generate a working
.env file
- Optionally install dependencies and build the project
- Configure your Twilio webhook (wizard shows you the exact URL)
- Start the server:
npm start
- Call your Twilio number — your voice assistant answers!
Benefits:
- Real-time credential validation (catch errors before you start)
- No manual
.env editing
- Automatic ngrok detection and setup
- Step-by-step guidance with helpful links
Option B: Manual setup
cd runtime && npm ci
- Copy
../references/env.example to runtime/.env and fill in your values.
npm run build && npm start
- Point your Twilio voice webhook to
https://<your-domain>/twilio/inbound
- Call your Twilio number — your voice assistant answers!
Option C: Validation-only (existing setup)
- Copy
references/env.example to your own .env and replace placeholders.
- Export required variables (
TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, TWILIO_CALLER_ID, OPENAI_API_KEY, OPENAI_PROJECT_ID, OPENAI_WEBHOOK_SECRET, PUBLIC_BASE_URL).
- Run quick setup:
scripts/setup_quickstart.sh
- If preflight passes, run one inbound and one outbound smoke test.
- Only then move to production usage.
Credential scope (recommended hardening)
Use least-privilege credentials for every provider:
- Twilio: use a dedicated subaccount for Amber and rotate auth tokens regularly.
- OpenAI: use a dedicated project API key for this runtime only; avoid reusing keys from unrelated apps.
- OpenClaw Gateway token: only set
OPENCLAW_GATEWAY_TOKEN if you need brain-in-the-loop lookups; keep token scope minimal.
- Dependency integrity: runtime dependencies are pinned by
runtime/package-lock.json; review dependency changes before publishing updates.
- Secrets in logs: never print full credentials in scripts, setup output, or call transcripts.
- Setup wizard validation scope: credential checks call only official Twilio/OpenAI API endpoints over HTTPS for auth verification; no arbitrary exfiltration endpoints are used.
These controls reduce blast radius if a host or config file is exposed.
Safe defaults
- Outbound calling is enabled by default for the full phone-agent experience. Set
AMBER_ENABLE_OUTBOUND_CALLS=false to disable the outbound call endpoint.
- Require explicit approval before outbound calls. Note on confirmation enforcement: For MCP-initiated outbound calls (
make_call), confirmation is enforced at the MCP server layer in code (the tool returns a preview and requires confirmed=true on a second call before dialing) — this is not LLM-only instruction. The LLM instruction layer provides an additional reminder, but the code gate is the primary enforcement mechanism.
- If payment/deposit is requested, stop and escalate to the human operator.
- Keep greeting short and clear.
- Use timeout + graceful fallback when
ask_openclaw is slow/unavailable.
Workflow
Confirm scope for V1
- Include only stable behavior: call flow, bridge behavior, fallback behavior, and setup steps.
- Exclude machine-specific secrets and private paths.
Document architecture + limits
- Read
references/architecture.md.
- Keep claims realistic (latency varies; memory lookups are best-effort).
Run release checklist
- Read
references/release-checklist.md.
- Validate config placeholders, safety guardrails, and failure handling.
Smoke-check runtime assumptions
- Run
scripts/validate_voice_env.sh on the target host.
- Fix missing env/config before publishing.
Publish
- Publish to ClawHub (example):
clawhub publish <skill-folder> --slug amber-voice-assistant --name "Amber Voice Assistant" --version 1.0.0 --tags latest --changelog "Initial public release"
- Optional: run your local skill validator/packager before publishing.
Ship updates
- Publish new semver versions (
1.0.1, 1.1.0, 2.0.0) with changelogs.
- Keep
latest on the recommended version.
Troubleshooting (common)
- "Missing env vars" → re-check
.env values and re-run scripts/validate_voice_env.sh.
- "Call connects but assistant is silent" → verify TTS model setting and provider auth.
- "ask_openclaw timeout" → verify gateway URL/token and increase timeout conservatively.
- "Webhook unreachable" → verify tunnel/domain and Twilio webhook target.
Guardrails for public release
- Never publish secrets, tokens, phone numbers, webhook URLs with credentials, or personal data.
- Include explicit safety rules for outbound calls, payments, and escalation.
- Mark V1 as beta if conversational quality/latency tuning is ongoing.
Install safety notes
- Amber does not execute arbitrary install-time scripts from this repository.
- Runtime install uses standard Node dependency installation in
runtime/, with dependencies pinned in runtime/package-lock.json.
- CRM uses
better-sqlite3 (native module), which compiles locally on your machine.
- Review
runtime/package.json dependencies before deployment in regulated environments.
Resources
- Runtime bridge:
runtime/ (full source + README)
- Architecture and behavior notes:
references/architecture.md
- Release gate:
references/release-checklist.md
- Env template:
references/env.example
- Quick setup runner:
scripts/setup_quickstart.sh
- Env/config validator:
scripts/validate_voice_env.sh
1---2name: amber-voice-assistant3description: Give your OpenClaw agent real phone capabilities. Setup uses a short wizard; after setup, run calls and phone tasks with one natural-language prompt.4---56# Amber — Give Your Agent Real Phone Capabilities78## Overview910Amber gives any OpenClaw deployment **real phone capabilities for agents**. It ships with a **production-ready Twilio + OpenAI Realtime bridge** (`runtime/`) for confirmed phone workflows: inbound answering, call screening, prepared outbound workflows, and confirmed scheduling over a real telephone number.1112**✨ New in v5.4.0:** Amber now ships as an **MCP plugin** with 9 tools — prepare confirmed calls by name, check call history, query CRM contacts, manage calendar, and control call screening. It works with Claude Desktop/Cowork and other MCP-capable clients or agent harnesses once configured. Includes Apple Contacts integration and a code-enforced call confirmation safeguard to prevent wrong-number dials.1314**✨ Also:** Interactive setup wizard (`npm run setup`) validates credentials in real-time and generates a working `.env` file — no manual configuration needed. Once setup is complete, Amber is prompt-based: ask your OpenClaw agent to prepare confirmed calls, answer/screen callers, schedule confirmed appointments, or handle phone workflows in natural language.1516## See it in action17181920**[▶️ Watch the interactive demo on asciinema.org](https://asciinema.org/a/l1nOHktunybwAheQ)** (copyable text, adjustable speed)2122*The interactive wizard validates credentials, detects ngrok, and generates a complete `.env` file in minutes.*2324### What's included2526- **Runtime bridge** (`runtime/`) — a complete Node.js server that connects Twilio phone calls to OpenAI Realtime with OpenClaw brain-in-the-loop27- **Amber Skills** (`amber-skills/`) — modular mid-call capabilities (CRM, calendar, log & forward message) with a spec for building your own28- **Built-in CRM** — local SQLite contact database; Amber greets callers by name and references personal context naturally on every call, with operator review/correction responsibility29- **Call log dashboard** (`dashboard/`) — browse call history, transcripts, and captured messages; includes **manual Sync button** to pull new calls on demand30- **Setup & validation scripts** — preflight checks, env templates, quickstart runner31- **Architecture docs & troubleshooting** — call flow diagrams, common failure runbooks32- **Safety guardrails** — outbound calls require code-enforced confirmation; payment escalation, consent boundaries, and explicit confirmation for calendar writes are documented3334## 🔌 Amber Skills — Extensible by Design3536Amber ships with a growing library of **Amber Skills** — modular capabilities that plug directly into live voice conversations. Each skill exposes a structured function that Amber can call mid-call, letting you compose powerful voice workflows without touching the bridge code.3738### 👤 CRM — Contact Memory *(v5.3.0)*3940Amber remembers every caller across calls and uses that memory to personalize every conversation.4142- **Runtime-managed** — lookup and logging happen automatically; Amber never has to "remember" to call CRM43- **Personalized greeting** — known callers can be greeted by name; optional notes are used only when relevant to the call objective44- **Two-pass enrichment** — auto-log captures the call immediately; an optional post-call extraction pass proposes caller details and notes for the local CRM45- **Operator review expected** — review, correct, or delete CRM records periodically so bad transcript extraction or misleading caller input does not persist indefinitely46- **Symmetric** — works identically for inbound and outbound calls47- **Local SQLite CRM** — contact memory is stored at `~/.config/amber/crm.sqlite`; CRM records are not cloud-hosted. Live call audio/transcripts still pass through Twilio/OpenAI as part of the phone bridge.48- **Native dependency** — requires `better-sqlite3` (native build). macOS: `sudo xcodebuild -license accept` before `npm install`. Linux: `build-essential` + `python3`.4950### 📅 Calendar5152Query the operator's calendar for availability or schedule a new event — all during a live call.5354- **Availability lookups** — free/busy slots for today, tomorrow, this week, or any specific date55- **Event creation** — create calendar events from a phone conversation only after the required details are collected and the caller explicitly confirms the slot56- **Privacy by default** — callers are only told whether the operator is free or busy; event titles, names, and locations are never disclosed57- Powered by `ical-query` — local-only, zero network latency5859### 📬 Log & Forward Message6061Let callers leave a message that is automatically saved and forwarded to the operator.6263- Captures the caller's message, name, and optional callback number64- **Always saves to the call log first** (audit trail), then delivers via the operator's configured messaging channel65- Confirmation-gated — Amber confirms with the caller before sending66- Delivery destination is operator-configured — callers cannot redirect messages6768### Build Your Own Skills6970Amber's skill system is designed to grow. Each skill is a self-contained directory with a `SKILL.md` (metadata + function schema) and a `handler.js`. You can:7172- **Customize the included skills** to fit your own setup73- **Build new skills** for your use case — CRM lookups, inventory checks, custom notifications, anything callable mid-call74- **Share skills** with the OpenClaw community via [ClawHub](https://clawhub.com)7576See [`amber-skills/`](amber-skills/) for examples and the full specification to get started.7778> **Note:** Each skill's `handler.js` is reviewed against its declared permissions. When building or installing third-party skills, review the handler source as you would any Node.js module.7980### Call log dashboard8182```bash83cd dashboard && node scripts/serve.js # → http://localhost:878784```8586- **⬇ Sync button** (green) — immediately pulls new calls from `runtime/logs/` and refreshes the dashboard. Use this right after a call ends rather than waiting for the background watcher.87- **↻ Refresh button** (blue) — reloads existing data from disk without re-processing logs.88- Background watcher (`node scripts/watch.js`) auto-syncs every 30 seconds when running.8990## Why Amber9192- **Ship a voice assistant in minutes** — `npm install`, configure `.env`, `npm start`93- Full inbound screening: greeting, message-taking, appointment booking with calendar integration94- Outbound calls with structured call plans (reservations, inquiries, follow-ups), with confirmation gates and a runtime disable switch95- **OpenClaw gateway lookup (least-privilege)** — voice agent consults your OpenClaw gateway only for call-critical needs (availability checks, confirmed scheduling, required factual lookups), not for unrelated tasks96- VAD tuning + verbal fillers to keep conversations natural (no dead air during lookups)97- Fully configurable: assistant name, operator info, org name, calendar, screening style — all via env vars98- Operator safety guardrails for approvals/escalation/payment handling99100## Personalization requirements101102Before deploying, users must personalize:103- assistant name/voice and greeting text,104- own Twilio number and account credentials,105- own OpenAI project + webhook secret,106- own OpenClaw gateway/session endpoint,107- own call safety policy (approval, escalation, payment handling).108109Do not reuse example values from another operator.110111## 5-minute quickstart112113### Option A: Interactive Setup Wizard (recommended) ✨114115The easiest way to get started:1161171. `cd runtime`1182. `npm run setup`1193. Follow the interactive prompts — the wizard will:120 - Validate your Twilio and OpenAI credentials in real-time121 - Auto-detect and configure ngrok if available122 - Generate a working `.env` file123 - Optionally install dependencies and build the project1244. Configure your Twilio webhook (wizard shows you the exact URL)1255. Start the server: `npm start`1266. Call your Twilio number — your voice assistant answers!127128**Benefits:**129- Real-time credential validation (catch errors before you start)130- No manual `.env` editing131- Automatic ngrok detection and setup132- Step-by-step guidance with helpful links133134### Option B: Manual setup1351361. `cd runtime && npm ci`1372. Copy `../references/env.example` to `runtime/.env` and fill in your values.1383. `npm run build && npm start`1394. Point your Twilio voice webhook to `https://<your-domain>/twilio/inbound`1405. Call your Twilio number — your voice assistant answers!141142### Option C: Validation-only (existing setup)1431441. Copy `references/env.example` to your own `.env` and replace placeholders.1452. Export required variables (`TWILIO_ACCOUNT_SID`, `TWILIO_AUTH_TOKEN`, `TWILIO_CALLER_ID`, `OPENAI_API_KEY`, `OPENAI_PROJECT_ID`, `OPENAI_WEBHOOK_SECRET`, `PUBLIC_BASE_URL`).1463. Run quick setup:147 `scripts/setup_quickstart.sh`1484. If preflight passes, run one inbound and one outbound smoke test.1495. Only then move to production usage.150151## Credential scope (recommended hardening)152153Use least-privilege credentials for every provider:154155- **Twilio:** use a dedicated subaccount for Amber and rotate auth tokens regularly.156- **OpenAI:** use a dedicated project API key for this runtime only; avoid reusing keys from unrelated apps.157- **OpenClaw Gateway token:** only set `OPENCLAW_GATEWAY_TOKEN` if you need brain-in-the-loop lookups; keep token scope minimal.158- **Dependency integrity:** runtime dependencies are pinned by `runtime/package-lock.json`; review dependency changes before publishing updates.159- **Secrets in logs:** never print full credentials in scripts, setup output, or call transcripts.160- **Setup wizard validation scope:** credential checks call only official Twilio/OpenAI API endpoints over HTTPS for auth verification; no arbitrary exfiltration endpoints are used.161162These controls reduce blast radius if a host or config file is exposed.163164## Safe defaults165166- Outbound calling is enabled by default for the full phone-agent experience. Set `AMBER_ENABLE_OUTBOUND_CALLS=false` to disable the outbound call endpoint.167- Require explicit approval before outbound calls. **Note on confirmation enforcement:** For MCP-initiated outbound calls (`make_call`), confirmation is enforced at the MCP server layer in code (the tool returns a preview and requires `confirmed=true` on a second call before dialing) — this is not LLM-only instruction. The LLM instruction layer provides an additional reminder, but the code gate is the primary enforcement mechanism.168- If payment/deposit is requested, stop and escalate to the human operator.169- Keep greeting short and clear.170- Use timeout + graceful fallback when `ask_openclaw` is slow/unavailable.171172## Workflow1731741. **Confirm scope for V1**175 - Include only stable behavior: call flow, bridge behavior, fallback behavior, and setup steps.176 - Exclude machine-specific secrets and private paths.1771782. **Document architecture + limits**179 - Read `references/architecture.md`.180 - Keep claims realistic (latency varies; memory lookups are best-effort).1811823. **Run release checklist**183 - Read `references/release-checklist.md`.184 - Validate config placeholders, safety guardrails, and failure handling.1851864. **Smoke-check runtime assumptions**187 - Run `scripts/validate_voice_env.sh` on the target host.188 - Fix missing env/config before publishing.1891905. **Publish**191 - Publish to ClawHub (example): 192 `clawhub publish <skill-folder> --slug amber-voice-assistant --name "Amber Voice Assistant" --version 1.0.0 --tags latest --changelog "Initial public release"`193 - Optional: run your local skill validator/packager before publishing.1941956. **Ship updates**196 - Publish new semver versions (`1.0.1`, `1.1.0`, `2.0.0`) with changelogs.197 - Keep `latest` on the recommended version.198199## Troubleshooting (common)200201- **"Missing env vars"** → re-check `.env` values and re-run `scripts/validate_voice_env.sh`.202- **"Call connects but assistant is silent"** → verify TTS model setting and provider auth.203- **"ask_openclaw timeout"** → verify gateway URL/token and increase timeout conservatively.204- **"Webhook unreachable"** → verify tunnel/domain and Twilio webhook target.205206## Guardrails for public release207208- Never publish secrets, tokens, phone numbers, webhook URLs with credentials, or personal data.209- Include explicit safety rules for outbound calls, payments, and escalation.210- Mark V1 as beta if conversational quality/latency tuning is ongoing.211212## Install safety notes213214- Amber does **not** execute arbitrary install-time scripts from this repository.215- Runtime install uses standard Node dependency installation in `runtime/`, with dependencies pinned in `runtime/package-lock.json`.216- CRM uses `better-sqlite3` (native module), which compiles locally on your machine.217- Review `runtime/package.json` dependencies before deployment in regulated environments.218219## Resources220221- **Runtime bridge:** `runtime/` (full source + README)222- Architecture and behavior notes: `references/architecture.md`223- Release gate: `references/release-checklist.md`224- Env template: `references/env.example`225- Quick setup runner: `scripts/setup_quickstart.sh`226- Env/config validator: `scripts/validate_voice_env.sh`