CLI
The developer REPL — slash commands, streaming, and debugging.
The CLI is a Node.js REPL for talking to your motebit — streaming responses, tool approvals, slash commands, and a daemon mode for scheduled goals.
Running the CLI
Install it from npm and run it:
npm install -g motebit
motebitOr run it once without a global install:
npx motebitThe default provider is Anthropic and needs ANTHROPIC_API_KEY. With no API key, run against a local model server (Ollama, LM Studio, llama.cpp, vLLM, or any OpenAI-compatible endpoint):
motebit --provider local-serverOr with options:
motebit \
--provider anthropic \
--model claude-sonnet-5-5 \
--operatorContributors: from a monorepo clone, pnpm --filter motebit start runs the same CLI from the package source instead of the published bundle; pass flags after -- (for example pnpm --filter motebit start -- --provider local-server).
CLI flags
| Flag | Description |
|---|---|
--provider <name> | anthropic, openai, google, groq, deepseek, local-server, or proxy (ollama is a deprecated alias for local-server) |
--model <name> | Model identifier |
--db-path <path> | Custom SQLite database path |
--no-stream | Disable streaming (wait for full response) |
--sync-url <url> | Opt in to relay sync with this relay (or set MOTEBIT_SYNC_URL) |
--sync | Opt in to relay sync with the public relay (https://relay.motebit.com) |
--sync-token <token> | Sync relay master token |
--operator | Start with operator mode enabled |
--allowed-paths <paths> | Comma-separated paths for file tools |
--version | Print version |
--help | Print help |
Slash commands
| Command | Action |
|---|---|
/help | Show available commands |
/model <name> | Switch model |
/memories | List stored memories (type, half-life, edge count, compounding status) |
/graph | Memory graph health — node/edge counts, compounding stats, curiosity targets, intelligence gradient |
/curious | Show decaying memories the agent is curious about (score, decay info, content) |
/state | Show current state vector |
/forget <nodeId> | Delete a memory by ID |
/export | Export all data (memories, events, identity) |
/clear | Clear conversation history |
/tools | List registered tools |
/sync | Trigger manual sync cycle |
/summarize | Summarize current conversation |
/conversations | List recent conversations |
/conversation <id> | Load a past conversation |
/goals | List all scheduled goals |
/goal add "<prompt>" --every <interval> [--once] | Add a scheduled goal |
/goal remove <id> | Remove a goal |
/goal pause <id> | Pause a goal |
/goal resume <id> | Resume a paused goal |
/goal outcomes <id> | Show execution history for a goal |
/approvals | Show pending approval queue |
/reflect | Trigger reflection -- see what the agent learned |
/mcp list | List connected MCP servers |
/mcp trust <name> | Trust an MCP server (skip approval for its tools) |
/mcp untrust <name> | Remove trust from an MCP server |
/mcp add <name> <url> [--motebit] | Add an HTTP MCP server (live, no restart) |
/mcp remove <name> | Remove an MCP server (live, no restart) |
/discover [capability] | Discover agents on the relay (optional capability filter) |
/agents | List known agents with trust levels and reputation scores |
/agents info <id> | Full trust record detail for an agent |
/agents trust <id> <level> | Set trust level (first_contact, verified, trusted, blocked) |
/agents block <id> | Block an agent |
/result [task_id] [owner_id] | Fetch a delegated task's result by id. Free and read-only: one task:query read, never a new hire, never a payment. With no id, lists the paid tasks whose results never arrived; startup shows one line when any are waiting. /result dismiss <task_id> clears an entry after the relay has reaped the task. |
/operator | Show operator mode status |
quit / exit | Exit the CLI (a leading slash also works) |
Tool approval flow
When the agent requests a tool that requires approval, the CLI pauses and prompts:
Tool approval required: shellExec
args: {"command": "ls -la"}
Allow? (y/n):Type y to approve; anything else denies. The agent continues with the result (or denial) and completes the turn.
Identity bootstrap
The CLI uses the same identity system as the desktop app:
- First launch generates an Ed25519 keypair
- Private key is encrypted with PBKDF2 (AES-256-GCM) and stored in
~/.motebit/config.json - Identity and device are registered in the local SQLite database
- Optional: register with a sync relay using
--sync-url(or--sync) and--sync-token
Relay sync is opt-in
With no relay named, the CLI is fully local: it makes no network call to any relay — no device registration, no sync push, no heartbeat, no websocket — and motebit doctor reports info Sync off (opt in with --sync-url). Name a relay one of these ways:
| Opt-in | Scope |
|---|---|
--sync-url <url> | This process |
--sync | This process, against the public relay https://relay.motebit.com |
MOTEBIT_SYNC_URL=<url> | Every process in that environment |
motebit sync enable [url] | Persisted as sync_url in ~/.motebit/config.json (default: the public relay); motebit sync disable removes it |
motebit register with a relay named also persists it. Commands whose whole purpose is the relay (register, delegate, market, discover, rotate, machines, smoke x402, skills install/publish from the registry, verify-release, and the relay slash commands) refuse with a one-line message naming the opt-in when none is set — they never pick the public relay on their own. An existing sync_url in config.json keeps working unchanged.
Streaming output
By default, the CLI streams responses token-by-token. Tool calls appear inline:
> What files are in my home directory?
[calling readFile...]
[readFile done]
Your home directory contains the following files: ...Use --no-stream to wait for the complete response before printing.
Subcommands
The CLI supports several subcommands beyond the default interactive REPL:
| Subcommand | Description |
|---|---|
motebit id | Show your identity card (motebit_id, did:key, public key) |
motebit verify <path> | Verify a signed motebit.md identity file or exported bundle directory |
motebit verify receipt <path> [--lenient] | Verify an ExecutionReceipt: schema, suite, signature and — by default — that result_hash equals SHA-256(result) (a mismatch is INVALID, exit 1). --lenient checks the signature only and warns that the result is not bound; --strict is an accepted no-op |
motebit export | Export full bundle (identity, credentials, presentation, budget, gradient, memories, events) |
motebit credentials | List earned verifiable credentials (gradient, reputation, trust) |
motebit credentials --presentation | Generate a verifiable credential presentation |
motebit ledger <goalId> | Show the signed execution ledger for a goal |
motebit run --identity <path> | Start daemon mode with goal scheduling |
motebit serve [flags] | Start MCP server mode (see MCP Server) |
motebit doctor | Diagnose configuration and connectivity issues |
motebit goal add/list/remove/pause/resume | Manage scheduled goals |
motebit approvals list/show/approve/deny | Manage the tool approval queue |
motebit halt [goal <id>] [--reason "..."] [--remote] | Withdraw the permission to act unattended; --remote signs a command to the running runtime and returns its acknowledgement |
motebit resume [<halt_id>|all] [--remote] | Give that permission back |
motebit halt-status [--remote] | What is stopped, and whether the motebit has acknowledged it |
motebit runs [list|show <run_id>|ack <run_id> --allow-fresh-run] | Goal-run ledger: runs holding their goal (paused on you, or interrupted with side effects) and recent runs; show opens one run — what it produced and whether that result is signed, what its tools reported, and the evidence pointers a stranger could re-check against the original source; ack --allow-fresh-run releases a reviewed interrupted run, accepting that its goal's next run may repeat effects |
motebit rotate [--reason "..."] | Rotate Ed25519 keypair with signed succession record |
motebit machines [--json] | The machines this motebit runs unattended work on — reduced on this machine under a key chain it verified, never by the relay; a count only when nothing suppressed it, citing the chain head |
motebit machines retire <device_id> | Sign a retirement for every standing entry of a machine (undo with machines enroll) |
motebit machines enroll <device_id> [--force] | Rejoin a retired line, or enrol an id explicitly; refuses an id that could never answer unless --force |
Serve flags
motebit serve exposes your motebit as an MCP server — other agents and tools can call it over stdio or HTTP.
| Flag | Default | Description |
|---|---|---|
--serve-transport <mode> | stdio | Transport: stdio or http |
--serve-port <port> | 3100 | HTTP port (only with --serve-transport http) |
--identity <path> | — | Path to motebit.md (loads governance thresholds) |
--tools <path> | — | JS module exporting tool definitions (array of {definition, handler}) |
--direct | off | Direct tool execution — no AI loop, maps prompt to tool input |
--self-test | off | Run self-test task via relay after registration |
--operator | off | Enable operator mode for high-risk tools |
# Stdio transport — for MCP host integration (Claude Desktop, etc.)
motebit serve
# HTTP transport — for remote agents
motebit serve --serve-transport http --serve-port 3100
# With identity governance
motebit serve --serve-transport http --identity ./motebit.md
# With external tools in direct mode (no LLM needed)
motebit serve --identity ./motebit.md --tools ./dist/tools.js \
--serve-transport http --direct --self-testIn HTTP mode, the server registers with the sync relay (if configured) and sends a heartbeat every 5 minutes. Authentication is fail-closed: callers present a motebit signed token (Authorization: Bearer motebit:<signed-token>, e.g. the relay's per-task task:dispatch token) and everything else except /health gets 401. There is no static authToken setting in ~/.motebit/config.json.