Cade - The CLI Agent from Arcade.dev
Project description
Cade
The CLI agent from Arcade.dev. Coding, research, and everyday automation — driven from a terminal, a single shell pipe, or a long-lived daemon that replies over Telegram.
brew install ArcadeAI/tap/cade # or: uv tool install cade-cli | pip install cade-cli
cade login
cade
Highlights
- Three deployment modes from the same binary. Interactive chat (
cade), one-shot or pipe (cade -m "…"), or a headless daemon that replies over messaging (cade serve). - Tools from anywhere. Built-in local tools (filesystem / shell / git / search / tasks / channels / memory), Arcade Cloud tools (Slack, GitHub, Gmail, calendars, …), and any MCP server you register — all unified under one tool surface.
- Bidirectional MCP. Tools can call
context.ui.elicit(…)for structured input,context.log.*for live operator logs, andcontext.progress.report(…)for editable progress UI — routed end-to-end through whichever adapter is active (Telegram inline keyboard, terminal prompt). - Personas + per-persona memory. Multiple agent profiles with their own system prompt and an indexed memory store backed by agent-library.
- Extensibility surface. Hooks (lifecycle events), tasks (file-backed durable work), cron (scheduled prompts), channels (cross-session pub/sub) — all available to the agent as
Local_*tools and to you ascade <subcommand>. - Bring your own LLM. OpenAI, Anthropic, or any OpenAI-compatible endpoint (Ollama, vLLM, Together, Groq, Fireworks, …).
--local-onlyskips Arcade Cloud entirely.
Install
| Source | Command |
|---|---|
| Homebrew | brew install ArcadeAI/tap/cade |
| uv | uv tool install cade-cli |
| pip | pip install cade-cli |
| From source | git clone https://github.com/arcadeai-labs/cade.git && cd cade && uv sync |
Homebrew installs from a private release feed. Export HOMEBREW_GITHUB_API_TOKEN (a token with read access to arcadeai-labs/cade) before running brew install.
Prerequisites: Python 3.11+, an Arcade account (arcade.dev) for cloud tools, and an LLM provider key (OPENAI_API_KEY or ANTHROPIC_API_KEY). Skip the Arcade account with --local-only or CADE_LOCAL_ONLY=1.
cade login # Arcade Cloud OAuth (skip with --local-only)
cade --version
Full install and first-run docs: docs/install.md and
docs/quickstart.md.
Quick start
cade # interactive chat
cade -m "What changed in HEAD?" # single message, then exit
cade -m "What went wrong?" < error.log # prompt + file/stdin
cade -r # resume the most recent thread
cade resume "auth-rewrite" # resume a thread by name
cade --persona reviewer # use a saved persona's system prompt
cade --voice # speak / hear (requires cade-cli[voice])
Top-level options
| Flag | Description |
|---|---|
-r, --resume |
Resume most recent thread |
-m, --message |
Single-message mode; piped stdin is appended to the prompt |
-P, --persona |
Use a saved persona |
-V, --voice |
Voice mode; install cade-cli[voice] first |
-v, --verbose |
Debug logging |
--version |
Print version |
In-chat slash commands
| Command | Description |
|---|---|
/help |
List commands |
/clear |
Clear screen |
/copy |
Copy last response |
/logs |
Recent log entries |
/thread, /history |
Current thread info |
/pin, /unpin |
Pin reference material into the session |
/tasks, /cron, /hooks, /channels, /notify |
Coordination surfaces (mirrored as cade tasks / cade cron / cade hooks / cade channels) |
/usage |
Context-window status and token usage |
/cd, /pwd, /! |
Shell shortcuts |
Ctrl+C |
Exit |
Tools
Tools come from three sources and are addressed uniformly by their registered name:
Local_*— built-in: filesystem (ReadFile,WriteFile,Edit,ListFiles), shell (Bash),Search,Git,Task*,AskUserQuestion,RetrieveToolResult,ToolSchema,PinContext,PushNotification,WebFetch, andWebSearch.Memory_*— agent-library backed, per-persona indexed knowledge store.- Arcade Cloud + user MCP servers — anything you register.
cade tools list # all tools, all sources
cade tools list --source local # filter by source
cade tools search "send slack" # keyword search
cade tools info Local_ReadFile # full schema + description
The full local tool surface (including the bidirectional MCP capabilities and cade serve integration) is documented in docs/mcp.md.
Custom MCP servers
cade mcp add my-server http://localhost:8080
cade mcp add my-server http://… --auth bearer -t <token>
cade mcp authorize my-server # OAuth flow (browser)
cade mcp list / status / test / enable / disable / rm
User MCP servers register at ~/.cade/config/contexts/<context>.toml [[mcp]]. Servers with large catalogs are auto-deferred (parameter schemas stripped to keep tool-list bytes down) and fetched on demand via Local_ToolSchema.
Personas + memory
cade persona list / create / get / edit / delete / default # manage system prompts
cade --persona reviewer # use one for a session
cade mem list # sources indexed for the active persona
cade mem add ~/notes # index a directory
cade mem search "auth design" # semantic search
Memory is persona-scoped — each persona has its own ~/.cade/data/contexts/<context>/memory/<persona>/.librarian/ index, so a reviewer persona's notes never leak into default.
Headless daemon: cade serve
Run Cade as a long-lived daemon that replies through adapters. Telegram is supported for personal bot workflows, and Desktop exposes a local WebSocket for native clients. Each conversation gets its own persistent thread — persona, memory, and tools carry across messages.
cade serve init # wizard: bot token, allowed senders
cade serve # foreground
cade serve --install launchd # macOS LaunchAgent (or --install systemd)
cade serve status / stop # health, uptime; SIGTERM running daemon
Config lives at ~/.cade/config/contexts/<context>.toml [serve]. Edit and kill -HUP $(cat ~/.cade/run/serve.pid) to reload without restart.
Security defaults are fail-closed: allowed_senders = [] blocks everyone; tools are default-deny against [serve.tools].allow (globs / regex / pipe lists supported); deny always wins.
The MCP transport is fully bidirectional, so tools running inside the daemon can elicit structured input, stream live progress, and emit logs through whichever adapter is active. See docs/adapters/ for adapter details, docs/mcp.md for protocol details, and docs/configuration.md for the full daemon config reference.
Extensibility: hooks, tasks, cron, channels
Four primitives the agent uses directly (as Local_* tools) and you can drive from the CLI:
| Surface | What it is | CLI |
|---|---|---|
| Hooks | Lifecycle event handlers (pre/post tool, user prompt submit) | cade hooks list / add / remove / test |
| Tasks | File-backed durable work units that survive turn boundaries | cade tasks list / get / create / update / delete |
| Cron | Scheduled prompts the agent runs on a timer | cade cron list / add / remove / enable / disable / run-now |
| Channels | JSONL-backed inter-session pub/sub | cade channels list / send / recv / clear |
See docs/channels.md for the channels protocol; hooks and tasks/cron details live in their respective cade <subcommand> --help outputs.
Bring your own LLM
Cade works with any OpenAI-compatible endpoint. Three ways to wire one in (CLI flag → env → config, first match wins):
# CLI flag for Ollama. Use a model from `ollama list`.
cade chat -L --endpoint http://localhost:11434 --model qwen3:4b
# Environment for one-shot mode
cade context create local-qwen --model qwen3:4b
cade context use local-qwen
export OLLAMA_BASE_URL="http://localhost:11434"
CADE_LOCAL_ONLY=1 cade -m "hello from a local model"
# Config — ~/.cade/config/cade.toml
[model_settings]
host = "http://localhost:8000/v1"
api_key = "ollama"
Skip Arcade Cloud authentication entirely with --local-only or CADE_LOCAL_ONLY=1 when running against local LLMs.
Configuration
All state lives under ~/.cade/. Override the location with CADE_HOME=/path/to/alt.
| File | Purpose |
|---|---|
config/cade.toml |
Model / provider / UI settings |
data/contexts/<context>/history.db |
Thread + message storage |
logs/cade.log |
Rotating log file |
config/contexts/<context>.toml [[mcp]] |
User MCP server registry |
config/contexts/<context>.toml [serve] |
cade serve daemon config |
personas/, memory/, tasks/, channels/ |
Persona-scoped state |
Full layout, env vars, and TOML schema in docs/configuration.md.
Common env vars
| Variable | Purpose |
|---|---|
OPENAI_API_KEY / ANTHROPIC_API_KEY |
LLM provider keys |
OPENAI_BASE_URL |
Custom OpenAI-compatible endpoint |
ARCADE_API_KEY, ARCADE_BASE_URL |
Arcade Cloud (alternative to OAuth) |
CADE_LOCAL_ONLY=1 |
Skip remote tools entirely |
CADE_HOME |
Override config directory |
CADE_PROJECT_ROOT |
Sandbox Local_* filesystem tools to this root |
Contributing
git clone https://github.com/arcadeai-labs/cade.git
cd cade
uv sync --extra dev
uv run pytest
uv run ruff check src/ tests/
Style: Python 3.11+ with modern type hints (dict, list, | None); ruff for lint + format; pytest with asyncio_mode = "auto". Public functions and classes get docstrings.
Build/release docs live in docs/development.md. PRs
welcome — open an issue first for anything substantial.
Resources
- arcade.dev — product
- docs.arcade.dev — API and tool catalog
docs/— quickstart, examples, install, config, MCP, channels, voice, development, and adapters- Issues · Releases
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cade_cli-0.13.2.tar.gz.
File metadata
- Download URL: cade_cli-0.13.2.tar.gz
- Upload date:
- Size: 299.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7c659317d2771a137361d30a80e94314c4d78c63b3b56e25e30f57bd6a41d81e
|
|
| MD5 |
75cb9853b8c05c2c1d88f2a53bbf42b5
|
|
| BLAKE2b-256 |
75e06b52809022cf2564748a221eec1c8464667cf94aa9cb53c9da80ffb7eef8
|
Provenance
The following attestation bundles were made for cade_cli-0.13.2.tar.gz:
Publisher:
release.yml on arcadeai-labs/cade
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cade_cli-0.13.2.tar.gz -
Subject digest:
7c659317d2771a137361d30a80e94314c4d78c63b3b56e25e30f57bd6a41d81e - Sigstore transparency entry: 1738623764
- Sigstore integration time:
-
Permalink:
arcadeai-labs/cade@59559757c3033cafac59fbdee480fc0904be6502 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/arcadeai-labs
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@59559757c3033cafac59fbdee480fc0904be6502 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file cade_cli-0.13.2-py3-none-any.whl.
File metadata
- Download URL: cade_cli-0.13.2-py3-none-any.whl
- Upload date:
- Size: 377.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1bbae7e4a70af73df003bfcd856291387185492b02e3d4e0f6e7495852446fa9
|
|
| MD5 |
819bf2267d468293c19b147b86b0f282
|
|
| BLAKE2b-256 |
ffa47829c4c5faead90a8ffcb7ace54527059833091dbba8334915fcbc9f4f24
|
Provenance
The following attestation bundles were made for cade_cli-0.13.2-py3-none-any.whl:
Publisher:
release.yml on arcadeai-labs/cade
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cade_cli-0.13.2-py3-none-any.whl -
Subject digest:
1bbae7e4a70af73df003bfcd856291387185492b02e3d4e0f6e7495852446fa9 - Sigstore transparency entry: 1738623770
- Sigstore integration time:
-
Permalink:
arcadeai-labs/cade@59559757c3033cafac59fbdee480fc0904be6502 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/arcadeai-labs
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@59559757c3033cafac59fbdee480fc0904be6502 -
Trigger Event:
workflow_dispatch
-
Statement type: