Skip to main content
Back to Documentation

Developer CLI

v2.24.7Built for AI agents

Give your AI the keys.
CLI · MCP · WebMCP · UCP — same verbs, same receipts, any AI model.

Developer Login
curl -fsSL https://solidnumber.com/install.sh | sh

One paste — installs Node if needed, signs you in, connects your AI. Windows: iwr -useb https://solidnumber.com/install.ps1 | iex · or visit solidnumber.com/install

172
Top-level commands
914
Total verbs
JSON
Envelopes by default
SPARQL 1.1
JSON-LD tenant graph
1,743
CLI tests passing
Receipt-backed, auditable, reversible — for AI agentsCLI · MCP · WebMCP · UCP

Give your AI the keys.

Same verbs work everywhere — the terminal, Claude Desktop, in-browser agents, buyer-agent protocols. Your AI books appointments, processes payments, builds websites, manages inventory, and runs your CRM. Every action is versioned, auditable, and reversible. Switch between Claude, Grok, and GPT without losing context. One verb registry. Every AI can use it.

solid agent dispatch <verb> from the terminal. The hosted MCP connector (api.solidnumber.com/mcp/connector) for Claude and ChatGPT. navigator.modelContext for in-browser agents. /.well-known/ucp for buyer-agents. Same verbs. Same receipts. Any AI.

The reasoning loop these verbs support

observe (aggregate) → explain → preview (dry-run) → commit (transaction / receipt) → revert (undo). Every write returns an audit_id — pass it to solid agent dispatch audit.revert to restore the before-state recorded for that write. Where none was recorded — or the action type has no revert handler — it changes nothing and returns the reason.

Full verb-shape taxonomy
Current releasev2.24.12

v2.24.12 — solid update brings everything current, and never leaves you stuck

solid update tries every way this machine can install the CLI — the one it detects first, then npm, then Homebrew or scoop — and counts the update done only when the solid your terminal runs reports the new version. The Homebrew tap is added for you. If Homebrew has not picked up the release yet, it says so and does not install a second copy. You only see a command to run yourself when every way has failed.Once the CLI is updated, the new version refreshes everything else it set up: the MCP server your AI tools launch, the Claude Code session hook, your shell completion, the agent skills and plugin in every project where you ran solid agent setup, and the render browser. Only what you set up is refreshed — nothing new is installed.A second copy of solid first on your PATH — an npm install under another Node version — is updated where it lives. solid update --check lists every part and what it would do; --json reports each part for an agent.Coming from 2.24.11 or earlier? That version runs its own update code for this one step. If it stops, run npm install -g @solidnumber/cli@latest once — every update after that takes care of itself.

Previously in v2.24.11

v2.24.11 — inventory import reports every row

solid inventory import <file> prints how many rows were created, updated and unchanged, names every row that failed with its row number, SKU and reason, and lists the columns it did not import. It exits 1 if any row failed. --dry-run says nothing was written and previews what each row would do.Server-side, shipped with it: the import now writes your real products and per-location stock — it used to fail for every company. Rows match by SKU in your company, a blank cell never overwrites, a new SKU needs a name, and a location column sets that location’s count. --dry-run is now truly a dry run — the server used to ignore the flag the CLI sends. New verb: inventory.import_csv.solid update installs with --prefer-online, so updating to @latest no longer fails with ETARGET in the first minutes after a release. The MCP self-update uses the same flag.

Previously in v2.24.10

solid docs listed GET /api/v1/cms/public/availability for open appointment slots. That route never existed. It now lists the host-resolved routes: GET /api/v1/cms/pages/public/booking?host=<site> for bookable services, GET /api/v1/cms/pages/public/booking/times?host=<site>&service_id=<id>&date=YYYY-MM-DD for open slots, and POST /api/v1/cms/pages/public/book?host=<site> to book one.Server-side, not part of this release — new verbs reachable today through solid verbs invoke <verb> with no CLI update: the calendar (appointment.confirm, appointment.unconfirm, appointment.update, appointment.book_series, appointment.series_update, appointment.series_end), staff.* (hours, time off, link a user), team.* (invite, roles, deactivate), reminder.set / reminder.list / reminder.cancel, sales.motion_*, and appointment.public_times — the open times a website shows visitors. solid verbs list appointment. shows the rest.

Previously in v2.24.9

Configs written before 2.24.8 launch a bare @solidnumber/mcp, which npx serves from its cache forever — updating the CLI never touched it. solid update now switches every Solid# launch in Claude Desktop, Cursor, Windsurf and Claude Code to @solidnumber/mcp@latest (only that argument changes; a deliberate pin is left alone and reported) and upgrades a global install of the MCP server when it is behind — even when the CLI itself is already current.solid update --json performs the update and reports it, so an agent can run it; --check changes nothing, with or without --json.

Previously in v2.24.8

solid inbox --limit 5 was read as a subcommand named “5”. Fixed — and inbox list --limit now reaches the route instead of running with the default 20.A missing scope now says SCOPE_MISSING and names the scope, not “check your tier”. solid keys rotate --add-scope <scope> exists, and rotate creates the new key before revoking the old one.solid mcp install writes an sk_ key for this company and @solidnumber/mcp@latest — never a login token that expires. solid verbs invoke, solid ucp and solid subscriptions list call what the server actually serves. Homebrew and scoop now pick up a release within minutes of npm.

Previously in v2.24.7

solid nest <folder> used to send the folder’s path to the server as if it were the site’s HTML. It now reads the folder — relative paths kept, text as text, images and fonts as binary, hidden and node_modules items skipped and listed — imports every page with the links between them kept, and builds each one. --entry names the home page; --single imports only it.solid mcp doctor --fix removes the local duplicate Solid# connections that made “which company is the AI on?” unanswerable, backing each config file up first. The claude.ai connector is never touched — it is named as a step for you, and the report says plainly when a conflict remains. --dry-run shows the plan.solid auth login --token sets the previous account’s refresh token aside before the key is verified and restores it only if the key is bad — a typo never logs you out, and a good key never refreshes back into the old account.

Previously in v2.24.6

Class 5 of the Atlas is curated with three-digit addresses — 530 is taking payment, 531 is refunds — and solid verbs list accepted only one or two digits, so a real address was refused as malformed. It now takes a class, a noun or a curated address.An address the platform has retired used to answer with an empty list, which reads exactly like “nothing lives here”. It now answers with the standard error envelope — 410 address_retired — with the replacement addresses in did_you_mean and a fix you can run. When there is more than one candidate the fix is solid map: the CLI does not pick one for you.

Previously in v2.24.5

solid audit --limit 3 failed with “Unknown command: solid audit 3”. A hand-written guard re-read the raw command line and dropped anything starting with a dash — which drops the flag and keeps its value. Every option on that command takes a value, so the ordinary spaced syntax was broken for all of them and only --limit=3 worked. The guard is gone: the parser already knows what is an option and what is not.crm contacts --limit=2 returned all 31 contacts. It asked for page_size, a name that route does not declare, so the filter was dropped in silence and the route answered with its own default of 100. blog list did the same, and its --status never filtered anything. Both now send the names the routes read. Where a filter genuinely cannot run on the server — a contact’s status is worked out per row, not stored — it is applied to the rows and the output says so, because a filter applied to one page is a different claim from a filter applied to the company.solid today showed four identical “FOLLOW UP: Voice call with Customer” items. Calls whose caller we could not identify are now one item with a count, the way the chat backlog already was — and a follow-up that knows who to ring, or has a number, still keeps its own card, because that is a job someone can do now.When the server refuses a request, its reason now reaches you instead of a bare “Request failed” — with echoed input and anything secret-shaped removed first. --token works on every command, spinners never touch --json output, pages create --site attaches the page where you said, and publish reports the page’s real URL.

Previously in v2.24.4

solid audit sent its filters as user_email and action_type; the server reads user_id and event_type, so every filter quietly returned the whole log. It read rows by field names the server never sends, so the columns printed blank. Both now match: each row shows the event, the user, and where it came from — channel (web, CLI, MCP) and IP — with the company the read was scoped to in the header.solid audit export -o file.csv wrote the JSON envelope into the file. It now writes the CSV, and says when the export hit its cap. --from/--to are not applied by the server yet, and the command now says so instead of pretending.

Previously in v2.24.3

When the platform spells one operation twice, the manifest marks the second spelling with same_as. solid find collapsed those pairs but kept whichever scored higher — so when both halves were dotted (contact.create / crm.contacts.create) it could hand the agent the very alias the manifest said not to use. It now always returns the declared canonical name. The MCP connector (1.3.0) uses the same rule to decide what it lists.solid today renders the platform’s own daily brief — the payload the web Daily Brief and the phone read — instead of a private aggregator that looked for revenue and pipeline in the wrong place and printed “—” forever. A metric the platform marks unavailable is shown as unavailable, never as a number. Did-you-mean suggestions stay inside the namespace you typed.

Previously in v2.24.2

solid setup detected Claude Code, reported success, and wrote the server into Claude Desktop’s config — a file the terminal never opens. So the machine had no Solid connection at all, and an account-level connector approved months earlier, bound to a different business, answered instead. It now writes ~/.claude.json, and a test asserts where the bytes land rather than what the command prints — which is why every existing test passed through it.On a machine that has never had a Solid server, solid auth login and solid switch now create one instead of reporting success and configuring nothing.

Previously in v2.24.0

An AI tool can hold more than one Solid# connection at a time — an account-level connector you approved once in a browser, and a local server the CLI configures — and nothing in the protocol decides which one it uses. Sign in to one business, open the assistant, and it may answer about the other. Not a leak: each credential returns its own company’s data, correctly. That is precisely what makes it hard to catch, because every answer reads right.solid ai now enumerates every Solid# connection the tool can reach — including account-level connectors, which live on the server and appear in no file on your machine — resolves the company behind each one, and refuses to launch if two are active or if one disagrees with your session. Two connections is a refusal, not a preference: a matching company on one proves nothing about which the agent will read.solid mcp doctor reports the whole census — every connection, where it is configured, which company it serves, and whether the CLI can re-point it. It used to check one local file and call a keyless entry “wired”. --json was documented but never implemented; it works now, and exits non-zero on a bad verdict so CI can gate on it.The login screen no longer claims that AI tools inherit your CLI token. They never did — they read a separate credential — and that one reassuring sentence was the reason nobody checked. solid auth login and solid switch now re-point the local credential to the company you just chose.Also in this release: a publish-time guard that refuses to ship source under a version already on npm, so an installed build and a repo build can never again claim the same number while differing.

Ask a deal where it stands, and it answers

New

Read the deal

solid deals reports offer and order milestones together, so “what is left on this?” is one call instead of three stitched by hand.

Quizzes that actually branch

scoring walks the real branching path rather than a flattened list, so a quiz that forks on an answer is scored the way the respondent experienced it.

Numbers that cannot drift

every advertised count is generated, never typed — and the generator refuses what it must not touch, printing each refusal so a clean run can never hide one.

v2.15’s Starter Kit (solid init <name> --company <id> — a tenant-stamped project, CLAUDE.md operating rules, scoped-token env) and v2.14’s telephony command center (solid voice lines/routing/spend/pricing, solid call simulate, solid insights report) remains — see the changelog for the full history.

Predict-and-Act (TabPFN-v2)

Zero-shot tabular foundation model (Nature 2025). No per-tenant training, no cold-start. solid predict gives every tenant predictions on day 1. Devon auto-discovers new targets nightly.

Outbound voice + live translation

solid voice call / text dispatch ADA to make real calls and send SMS. solid voice translate toggles 13-language live translation per phone.

Q-Chain auditor verbs

solid qchain export / verify / audit-key — external auditors validate the tamper-evident agent-action chain offline. Every SHA-256, every Ed25519 signature, no Solid# access required.

Universal verb dispatch

solid agent dispatch <verb> calls any of the 1282 agent-attraction verbs through one command. Declare once in the backend, auto-bridged to all 5 transports.

For humans

Quick Start — install + first day

Driving from an AI? Skip to Agents Start Here

Four commands to go from zero to managing your business in the terminal.

Or skip steps 1–2 entirely/install

One command. Detects your OS, installs Node if missing, installs the CLI, opens the browser to log you in, wires Claude Code + shell completion. ~60 seconds.

macOS / Linux
curl -fsSL https://solidnumber.com/install.sh | sh
Windows
iwr -useb https://solidnumber.com/install.ps1 | iex
Homebrew (macOS / Linux)github.com/Solidnumber/homebrew-tap

Already have brew? Skip the curl pipe and install through the package manager you already trust. Pulls in Node automatically as a dependency, gives you brew upgrade for free — or just solid update, which works out which of the three you installed with, falls through to the others if that fails, and checks that the new version is the one that runs. It then brings the MCP server, Claude Code hook, completion and agent skills current too. It also warns if a second solid is on your PATH at a different version — easy to end up with, and whichever comes first wins.

Terminal
brew install solidnumber/tap/cli

Pair with solid setup --install-token ist_xxx from the dashboard for zero-browser auth — same magic-link flow as the curl path.

Already have scoop on Windows? Add our bucket and install in two commands. Pulls Node automatically as a dependency, gives you scoop update solid for free.

PowerShell
scoop bucket add solidnumber https://github.com/Solidnumber/scoop-bucket
scoop install solidnumber/solid

winget support is in the backlog — needs a self-contained Windows binary first. Scoop covers the Windows package-manager use case today.

Magic-link install (logged-in users)/dashboard/install-command

Already logged in to the dashboard? The install-command page mints you a single-use ist_* token (5-min TTL), embeds it in your install command, and the CLI exchanges it for real auth in one paste. No browser-back, no second login. Token rotates on every refresh.

macOS / Linux
curl -fsSL https://solidnumber.com/install.sh | SOLID_INSTALL_TOKEN=ist_xxx sh
Windows
$env:SOLID_INSTALL_TOKEN = 'ist_xxx'; iwr -useb https://solidnumber.com/install.ps1 | iex

Already have the CLI installed? solid setup --install-token ist_xxx --yes redeems a fresh token from the dashboard without reinstalling.

1
Install the CLI (manual path)
Terminal
npm i -g @solidnumber/cli
2
Login to your account
Terminal
solid auth login
# Email: you@company.com
# Password: ********
# Logged in to Acme Corp (ID: 42)
3
Pull your business data
Terminal
solid pull
# Pulling pages... 12 files
# Pulling KB entries... 48 files
# Pulling services... 8 files
# Saved to ./my-business/
4
Edit and push changes
Terminal
# Edit files in VS Code, Cursor, Vim, or any editor
solid push
# Changes: 2 pages updated, 1 KB entry created
# Push to Acme Corp? (y/n) y
# Pushed successfully
For AI Agents

Agents Start Here

Every default favors a machine reader. Stable anchors, deterministic JSON, self-describing surface, structured error envelopes. If you're an AI agent reading this page, start with the five commands below — they take you from cold to a correct write for about a thousand tokens — then the cards are the fifteen things worth knowing before you issue anything else — starting with the one that can write into the wrong business.

Cold start — in this order
  1. 1. solid map — the whole platform as nouns and Atlas addresses. Read once, cache it, never fetch again.
  2. 2. solid find “<the task>” — plain language to a callable verb name and its coordinate. It searches the BACKEND verb manifest and now says so: CLI-local questions (switching company, reading your scope) are session state, not verbs, and it tells you rather than returning a confident near-miss.
  3. 3. solid verbs describe <verb> — the exact call shape, including what it RETURNS. verbs example hands you one that actually runs; before v2.23.0 it seeded optional fields the server rejects.
  4. 4. solid verbs invoke <verb> --dry-run — validated against the schema, nothing sent, no consent needed. Since v2.23.0 it checks VALUES too — enum membership, bounds, unsubstituted placeholders — and names the field and the reason. It used to pass calls the server then rejected.
  5. 5. solid verbs invoke <verb> --confirm — commit it.

Steps 1–3 are answerable from cache on every task after the first. ⛔ Do not open with a full manifest dump — asking what exists used to cost more than doing the work, and that is the thing v2.21.0 fixed.

Teach yourself this platform first
solid agent setup

Writes the skills into this directory in two layouts: .claude/skills/ and, since v2.23.0, an Agent Plugins 1.1.0 package (plugin.json + skills/ + mcp.json) — the cross-vendor standard published 2026-08-06 by Amazon, Cursor, Microsoft, OpenAI and Vercel. Three skills: how to call verbs and read an output schema as the hint it is, how to confirm which business a write lands on, and how to wire a generated site to the real backend. Tenant-guarded, idempotent, and --list shows what it would write without writing it.

⛔ Never pin the tenant
unset SOLID_COMPANY_ID

The tenant comes from your session, never from a variable. Setting this could not scope a call and behaved as though it did — it SILENCED the implicit-tenant warning and reported the pinned id as your current company, so a session could announce "company 999" while every write landed on 61. Since v2.22.0 a mismatch refuses at boot. Read your scope with solid scope, never assert it.

See it before you publish it
solid pages preview <id>

A signed, expiring, draft-aware link. It also tells you WHICH it is showing — "no draft pending" means the link is what is already live, which changes what you are reviewing. Before v2.22.0 the only way to check a change was to publish it to a live site.

Locate before you list
solid map

Every noun with its Atlas coordinate. A prefix is a query: verbs list 4 is money, 42 is one neighbourhood in it, and truncating widens the search — no filter flag to learn.

Intent to a verb, in one call
solid find "refund a payment"

Ranked matches with coordinate, side effects and the next command to run. This is the front door; browsing the taxonomy is the fallback.

Where it runs, and what breaks with it
solid where svc.api

⛔ Not "which verbs touch that noun" — that is solid map. The Atlas addresses meaning, the Gazetteer addresses place: this answers where something runs, what it serves, and what goes down with it. Omit the id to list every place.

Rehearse before you write
solid verbs invoke <verb> --dry-run

Validated against the verb's own input_schema — missing_required, type_errors, unknown_fields — and it sends nothing. No --confirm needed to preview; --confirm is for the real call only.

Self-describe the CLI
solid schema verbs --json

Every verb, every option, every arg as JSON. ⛔ This is the full dump — reach for it when you are generating code against the surface, not to answer "what can I do?". verbs list returns an index; --full restores schemas.

OpenAPI for the REST surface
GET /openapi.json

1,944 endpoints, fully-typed Pydantic schemas. Same spec that ships to npm.

MCP discovery
GET /.well-known/mcp.json

the full verb surface plus platform tools. Bearer-token, tenant-scoped per company_id. stdio transport.

Tenant JSON-LD graph
solid graph --query "..."

Offline SPARQL BGP, online SPARQL 1.1 (--server), N-Quads/Turtle dump. Schema.org + solid:* IRIs.

Error envelopes (default)
solid <anything> --json

code · status · message · hint · docs_url · request_id · scope · feature · upgrade_to. See JSON Envelope Spec below.

Audit trail
solid agent activity --json

Every agent-driven request carries X-Solid-Agent, X-Solid-Agent-Mode, X-Solid-Human-Initiator headers. Server-logged.

Sandbox safety
solid ai --sandbox

Every mutation intercepted + mocked. Your reasoning still works; no real state changes.

Q-Chain proof of action
GET /.well-known/qchain.json

Tamper-evident agent-action chain. Offline SHA-256 + Ed25519 verification. No Solid# access needed.

Confirm you are current
solid update --check --json

current · latest · up_to_date · installer · other_copies · mcp (every AI-tool config and whether it launches the latest server). Drop --check to apply it. Also names a SECOND solid on PATH at a different version — the notifier cannot see that, because it only ever inspects the copy that is running.

Primary user is an AI agent. Humans are welcome — but every default (JSON-first errors, self-describing schema, idempotency keys, deterministic exit codes, structured headers) optimizes for a machine reader. Identifiers in --help examples are <id> placeholders — copy any command and run it as-is.
For AI Agents

Never run a stale version

Fetch /.well-known/cli-version.json at session start. No auth, no rate limit gate. Compare your installed version against latest; if below min_supported, refuse to run.

Probe (curl)
$ curl -s https://solidnumber.com/.well-known/cli-version.json | jq

{
  "package": "@solidnumber/cli",
  "latest": "2.24.12",
  "latest_published_at": "2026-08-21",
  "min_supported": "2.0.0",
  "deprecated_below": "1.10.0",
  "install": "npm i -g @solidnumber/cli",
  "upgrade": "npm i -g @solidnumber/cli@latest",
  "changelog": "https://solidnumber.com/docs/cli/changelog",
  ...
}

Agent contract

  • At session start: probe the URL. Cache the response ≤ 4 hours.
  • If installed < min_supported: refuse to issue mutations; surface upgrade command to the operator.
  • If installed < latest: read-only is fine; surface staleness in your status report.
  • If installed ≥ latest: proceed.
  • If probe fails: proceed with your installed version; warn the operator the probe is unreachable.
Backend-side equivalents (in flight): meta.cli_update on every JSON response · solid version --json as canonical local probe · typed cli_outdated error envelope when below min_supported. Until those ship, the static probe URL is the canonical source of truth.
Wire spec

JSON Error Envelope

v2.0+ default. Every --json error response on every command. Same shape on the REST API, the CLI, and the MCP server. Stable across the entire 2.x line.

Schema
{
  "error": {
    "code":        string,   // NOT_FOUND, FORBIDDEN, RATE_LIMIT, ...
    "status":      number,   // 404, 403, 429, ...
    "message":     string,   // human prose, optional
    "hint":        string,   // next-step suggestion
    "docs_url":    string,   // deep link to /docs/cli#anchor
    "request_id":  string,   // server-side correlation id
    "scope":       string?,  // when gated: customer | developer | agency
    "feature":     string?,  // when feature-gated
    "upgrade_to":  string?   // when tier-gated: builder | professional | enterprise
  }
}
Example
$ solid kb get 99 --json
{
  "error": {
    "code": "NOT_FOUND",
    "status": 404,
    "message": "KB entry 99 not found",
    "hint": "Run \"solid kb list\" to see valid IDs",
    "docs_url": "https://solidnumber.com/docs/cli#kb",
    "request_id": "req_8f2a3c"
  }
}

# Opt out (1.x prose shape):
$ SOLID_LEGACY_ERRORS=1 solid kb get 99 --json
Error: KB entry 99 not found
  Hint: Run "solid kb list" to see valid IDs
Earlier releases

Release history

v2.0 made structured JSON envelopes the default. v1.21 → v1.26 shipped the JSON-LD tenant graph with SPARQL 1.1 and the offline mutation queue. v1.10 introduced the 4-layer safety model so AI agents can drive the CLI without taking down customer data. The full deep-dive lives on its own page.

View full changelog

Global Flags

v2.16.0

Every command inherits these flags. Set via CLI or environment variable — whichever is more convenient for your shell, script, or CI pipeline.

FlagPurposeEnv Var
--dry-runPreview every mutation, no server writesSOLID_DRY_RUN=1
--jsonJSON output (cascades to every subcommand)SOLID_JSON=1
--format json|csv|tsvList output format for scripting—
--sort-by <field>Sort list output by any field—
--order asc|descSort direction—
--output <file>Write output to file (creates parent dirs)—
--token <token>One-shot auth token (never persisted)SOLID_API_KEY
--timeout <seconds>Per-request HTTP timeout (default 30s)SOLID_TIMEOUT_MS
--debugAppend method/URL/body context to every errorSOLID_DEBUG=1
--no-colorDisable ANSI colors (standard Unix convention)NO_COLOR=1
--rawPipeline-clean output — no spinner, no decoration—
--no-spinnerDisable progress spinner—
-V, --versionPrint CLI version—
Safe by default

--dry-run intercepts every write. Audit the plan before touching production.

Pipeline-friendly

--json, --format csv, and --raw make every command pipe-ready for jq, awk, or xargs.

CI/CD ready

SOLID_API_KEY env var or --token for headless auth. Never persisted to disk.

Example — list orders as CSV, sorted by amount
solid orders list --all --format csv --sort-by amount --order desc --output orders.csv
# Fetched 1,247 orders across 13 pages
# Saved to orders.csv

Command Reference

Graph (JSON-LD)

solid graphSummary — counts per @type (Company / Service / Product / Agent / KnowledgeBaseEntry / Chain / Webhook / ...)
solid graph --list-typesEvery @type present in this tenant's JSON-LD graph
solid graph --type ServiceList every node of a given @type (bare "Service" or prefixed "schema:Service" / "solid:Agent")
solid graph kb/42Subgraph centred on KB entry #42 — node + 1-hop neighbours
solid graph kb/42 --hops 2N-hop BFS from any short-form IRI (kb/<id>, service/<id>, tier/builder, shelf/400, ...)
solid graph kb/42 --outDirected — only outbound edges
solid graph kb/42 --jsonMachine-readable JSON-LD subgraph (preserves @context)
solid graph --offlineWalk .claude/solid-context.jsonld — no network, no auth required
solid graph --remoteForce API fetch, ignore any local .jsonld
solid graph --validateAssert every edge target resolves in @graph + per-@type required fields present; exit 1 on errors
solid graph --dump nquadsExport the graph as N-Quads — pipe into Fuseki, Neo4j, Blazegraph, GraphDB, Neptune. Works offline.
solid graph --dump turtleExport the graph as Turtle (currently online-only; offline turtle is a future patch)
solid graph --diff baseline.jsonldStructural diff between a baseline snapshot and current graph — exits 1 on any change for CI gates
solid graph --query "SELECT ?s WHERE { ?s a schema:Service }"Offline SPARQL BGP — joins, projections, prefixed names, list-valued predicates. No backend required.
solid graph --query "..." --serverFull SPARQL 1.1 — OPTIONAL, FILTER, property paths, UNION, GROUP BY, ORDER BY, LIMIT. Routed to the backend.

Pull / Push Workflow

Work on your business using any editor. Pull downloads JSON and Markdown files, you edit them locally, then push deploys the changes. A manifest tracks file-to-ID mappings so the CLI knows what to create vs. update.

Pages (JSON)

CMS pages with layout, meta, and content blocks

KB (Markdown)

Knowledge base with YAML frontmatter + content

Settings (JSON)

Company info, website config, module flags

Directory structure after pull
my-business/
├── pages/                    # CMS pages
│   ├── home.json
│   ├── about.json
│   └── services.json
├── kb/                       # Knowledge base (Markdown)
│   ├── welcome.md
│   ├── services-overview.md
│   └── faq.md
├── services/                 # Service catalog (read-only)
│   └── consultation.json
├── solid.config.json         # Company info + website settings
└── .solid/
    └── manifest.json         # Sync metadata (DO NOT EDIT)
Safety guarantees

Push only creates and updates — it never deletes data remotely. Company isolation is enforced: the manifest locks to your company_id. Use --dry-run to preview before pushing.

AI Training

Train your AI agents directly from the terminal. Import docs, test conversations, and audit KB coverage.

Bulk import from Markdown files

Terminal
solid train import ./company-docs/
# Scanning directory... 24 .md files found
# Importing FAQ entries... 24/24
# Done. 24 KB entries created.

Chat with your agents to test training

Terminal
solid train chat marcus
# Connected to Marcus (Marketing Director)
# Type your message (Ctrl+C to exit)

> What campaigns are running?

Marcus: You have 3 active campaigns:
  1. Holiday Sale (email, 2,400 recipients)
  2. New Year Promo (SMS, 800 recipients)
  3. Referral Push (social, ongoing)

Coverage dashboard

Terminal
solid train status
# KB Coverage Dashboard
# ─────────────────────
# company_identity  ████████████ 12 entries
# services          ████████░░░░  8 entries
# faq               ██████████░░ 10 entries
# pricing           ████░░░░░░░░  4 entries  ⚠ Low
# policies          ██████░░░░░░  6 entries
#
# Gap: pricing needs more entries for AI accuracy

Agent Management

Your AI agents learn and improve over time. Inspect their soul (identity + config + learned patterns), review performance scores, track what they've learned, and coordinate multi-agent missions where ADA delegates tasks across your team.

Agent Soul

Each agent's identity, configuration, learned patterns, and expertise — built from every interaction

Performance Scoring

5-criteria scoring after every interaction — tracks accuracy, helpfulness, and tool usage over time

Telemetry

Real-time tokens, latency, cost, revenue attribution, and ROI tracking per agent

View an agent's soul

Terminal
solid agent soul sarah
#
#   Sarah — Agent Soul
#
#   ── Identity ────────────────
#   Name          Sarah
#   Type          customer_service
#   Autonomy      Level 4 / 5
#
#   ── Performance ─────────────
#   Accuracy       ████████████░░░  89%
#   Helpfulness    █████████████░░  92%
#   Tool Usage     ██████████░░░░░  78%
#   Resolution     ████████████░░░  85%
#
#   ── Learned Patterns ────────
#   customer empathy, refund handling, scheduling
#
#   ── 30d Stats ───────────────
#   Conversations: 1,420  |  Avg Score: 87/100

Launch a multi-agent mission

Terminal
solid agent mission "Create a Valentine's campaign for VIP customers" --execute
# ADA is planning the mission...
# Mission planned: m_8f2a3c
#
#   ── Mission Steps ───────────
#   ○ Step 1: Marcus — Query CRM for VIP segment, draft strategy
#   ○ Step 2: Maya — Design template, write copy, schedule sends
#
# Executing mission...
# ✓ Mission complete — 2 steps executed

Agent dashboard

Terminal
solid agent dashboard
#
#   Agent Dashboard
#
#   ╭─ Overview ─────────────────────╮
#   │ Total Agents:    48           │
#   │ Active Tasks:    3            │
#   │ 30d Tasks:       1,250        │
#   │ Success Rate:    98.8%        │
#   │ Avg Response:    2.4s         │
#   ╰───────────────────────────────╯
#
#   ── Telemetry ───────────────────
#   Tokens:       1,245,000
#   Est. Cost:    $12.45
#   Revenue:      $8,420.00
#   ROI:          676.5x

Multi-Company & Agency Mode

Agencies and developers with access to multiple companies can switch between them instantly. The CLI adapts: single-company users get a simple login, multi-company users get a picker.

Customer

Business owner managing their own company. Single login.

Developer

Freelancer/employee building for 1–2 clients. Invited to companies.

Agency

Manages many companies. Creates new clients, switches between them.

Agency workflow
# Create a new client company from a template
solid company create "Mike's Plumbing" --template plumber
# Company created (ID: 47) with plumber template (500+ KB entries)

# Send registration to the client — they get a branded referral email
solid company send-registration mike@mikesplumbing.com --name "Mike"
# Email sent with referral link. Mike onboards + pays on his own time.
# You get referral attribution automatically.

# Keep building while Mike sorts out payment
solid switch "Mike's Plumbing"
solid pull && code .
# Open in VS Code, edit pages/kb, then push

solid switch "Sarah's Salon"
# Switched to Sarah's Salon (ID: 22)

solid doctor

Read-only

Run before filing any bug. solid doctor hits 9 live backend endpoints against your authenticated company and reports status, HTTP code, and response time. Zero writes. Safe on production, safe in CI.

$ solid doctor
  Solid# CLI Doctor
  ────────────────────────────────────────
  ● PASS  auth          200   489ms  /api/v1/auth/me
  ● PASS  kb            200   487ms  /api/v1/kb/company
  ● PASS  pages         200   497ms  /api/v1/cms/pages
  ● PASS  sites         200   490ms  /api/v1/sites
  ● PASS  services      200   106ms  /api/v1/services/catalog
  ● PASS  orders        200   107ms  /api/v1/orders/
  ● PASS  crm contacts  200   111ms  /api/v1/crm/contacts
  ● PASS  leads         200   108ms  /api/v1/crm/leads/stats
  ● PASS  billing       200    67ms  /api/v1/billing/overview

  ✓ 9 passed  2462ms total
When to run it
  • \u2022 Before filing a support ticket (paste the output)
  • \u2022 After switching companies
  • \u2022 In CI as a smoke test (exit 1 on any failure)
  • \u2022 When "the CLI feels slow" — see exact per-endpoint latency
Exit codes
  • \u2022 0 \u2014 all probes passed
  • \u2022 1 \u2014 one or more probes failed
  • \u2022 2 \u2014 not authenticated (run solid auth login)

Smart Typo Suggestions

Stable

When you mistype a command, the CLI ranks the nearest matches by prefix, substring, then Levenshtein distance — same UX as gh, cargo, and git.

$ solid psh
  ✗ Unknown command: psh

  Did you mean solid push?
$ solid dcotor
  ✗ Unknown command: dcotor

  Did you mean solid doctor?
$ solid comapny
  ✗ Unknown command: comapny

  Did you mean one of these?
    solid company
    solid domains
$ solid frobnicate
  ✗ Unknown command: frobnicate

  Run solid --help to see all commands.

Shell Completion

Tab-completion scripts reflect the live command tree — every new command you build as a developer shows up automatically. No stale static scripts.

bash

install
solid completion bash > \
  /etc/bash_completion.d/solid

zsh

install
solid completion zsh > \
  "${fpath[1]}/_solid"

fish

install
solid completion fish > \
  ~/.config/fish/completions/solid.fish
Auto-install

Don't know your shell path? Run solid completion install — it detects your shell, finds the right directory, and wires it up.

API Keys for CI/CD

Create scoped API keys for CI/CD pipelines, LLM agents, and automation scripts. Keys use the sk_solid_ prefix, are stored as SHA-256 hashes, and support fine-grained scopes.

Create a scoped key
solid auth token create \
  -n "GitHub Actions" \
  -s kb:read,pages:write \
  -e 90
# Key: sk_solid_abc123...
# (Shown once — save immediately.)
Use in CI (three interchangeable forms)
# 1. Env var (recommended)
export SOLID_API_KEY=sk_solid_abc123
solid push --yes

# 2. One-shot flag (never persisted)
solid push --yes --token sk_solid_abc123

# 3. Pipe (for secret managers)
cat /run/secrets/solid | solid auth login --stdin
.github/workflows/deploy.yml
name: Deploy site to Solid#
on:
  push:
    branches: [main]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: 20 }
      - run: npm i -g @solidnumber/cli
      - name: Smoke-test backend
        run: solid doctor
      - name: Push changes (dry-run on PR, real on main)
        run: solid push --yes
        env:
          SOLID_API_KEY: ${{ secrets.SOLID_API_KEY }}

Available Scopes

kb:readRead knowledge base entries
kb:writeCreate/update/delete KB entries
pages:readRead CMS pages
pages:writeCreate/update/publish pages
vibe:executeExecute vibe modifications
train:readRead training data
train:writeImport/modify training data
company:readList linked companies
company:switchSwitch active company
cms:blog:readRead blog posts
cms:blog:writeCreate/update blog posts
cms:pages:readRead CMS page content
cms:pages:writeCreate/update CMS pages
content:review:readRead content review pipeline
content:review:writeApprove/reject content reviews
rag:retrieveRAG context retrieval
agents:readList agents, view configs, get resumes
agents:writeUpdate custom instructions, personality, settings
agents:dataView reflection history and performance
agents:converseStart/continue agent conversations (full context chain)
flows:readList flows, get details, metrics
flows:writeCreate, update, activate, pause, archive flows
brand:readGet brand, CSS variables, voice context, audit
brand:writeCreate and update brand identity
widgets:readList widgets, get embed codes, metrics
widgets:writeCreate, update, activate, pause widgets

Telemetry & Privacy

The CLI sends anonymous usage events so we know which commands people actually use. No business data, no KB content, no customer info. Opt out any time.

What we collect

  • Command name (pull, push, etc.)
  • CLI version + Node version + platform
  • Anonymous machine ID (hash, not reversible)
  • Success / failure + error class (no stack traces)

What we NEVER collect

  • \u2717 KB entries, pages, or any business data
  • \u2717 Customer info, contacts, orders
  • \u2717 Auth tokens, API keys, passwords
  • \u2717 File paths, directory contents, env vars
Opt out
# One-off (this shell)
export SOLID_DISABLE_TELEMETRY=1

# Permanent (add to ~/.zshrc or ~/.bashrc)
echo 'export SOLID_DISABLE_TELEMETRY=1' >> ~/.zshrc

Configuration

Credentials and preferences live in ~/.solid/. You can override any setting via environment variable — env vars take precedence over the config file.

~/.solid/
~/.solid/
├── config.json           # active company, base URL, token
├── identity.json         # anonymous machine ID for telemetry
└── cli_history.json      # recent commands (for solid feedback context)
Environment overrides
SOLID_API_URL — backend base URL
SOLID_API_KEY — auth token
SOLID_TIMEOUT_MS — HTTP timeout
SOLID_DISABLE_TELEMETRY — opt out
Resolution order
  1. 1. CLI flag (--token)
  2. 2. Environment variable (SOLID_API_KEY)
  3. 3. Config file (~/.solid/config.json)
  4. 4. Interactive prompt (if TTY)

52 Industry Templates

Clone a pre-built template to bootstrap a new company with 500+ KB entries, services, FAQs, and industry-specific AI training.

Terminal
solid company create "Mike's Plumbing" --template plumber
# Creating company... done
# Applying plumber template:
#   ✓ 500+ KB entries (services, FAQ, pricing, policies)
#   ✓ Service catalog (leak repair, water heater, drain...)
#   ✓ AI agent training (plumbing terminology, pricing rules)
# Company ready at ID: 47
Home Services
plumberhvacelectricianpainterlandscaperrooferpest-controlcleaning
Health & Wellness
salonbarbershopspadentistchiropractorveterinarianpharmacyfitness
Professional Services
accountinglaw-firmconsultingreal-estateinsurancefinancial-advisor
Food & Hospitality
restaurantbakerycateringfood-truckcoffee-shopbar
Retail & E-Commerce
retail-storeboutiquejewelryauto-partspet-storeflorist
Automotive
auto-repairauto-dealercar-washtowingtire-shop
Construction & Trades
general-contractorcarpentryconcretedemolitionfencingwelding
Technology
it-servicesweb-agencysaasapp-developer

MCP Editor Integration

The Solid# MCP Server gives AI editors (Claude Code, Cursor, VS Code Copilot) direct access to the full agent verb surface. Your AI assistant can query customers, update inventory, send emails, and manage your business — all from your editor.

Claude / ChatGPT (add connector)

Custom connector URL — OAuth, per-company binding
https://api.solidnumber.com/mcp/connector

Claude Code / Cursor (CLI)

Hosted MCP connector — the surface of record
claude mcp add --transport http solidnumber https://api.solidnumber.com/mcp/connector
What can your AI editor do?

With MCP connected, ask your AI: “Show customers who spent over $1000 this month”, “Create a calendar event for tomorrow at 10am”, “Search the knowledge base for return policies”, or “Check Google Workspace connection status”. The AI uses MCP tools to execute real actions on your business.

Integrations

Full lifecycle management for third-party integrations: browse the catalog, create, validate, test, deploy, and rollback — all from the CLI.

Integration lifecycle
solid integrations catalog           # Browse available integrations
solid integrations generate          # Scaffold a new integration
solid integrations test <id>         # Run integration tests
solid integrations deploy <id>       # Deploy to production
solid integrations health            # Check all integration health
solid integrations logs <id>         # View integration logs

Open-Core Model

Free & Open

  • CLI binary & all commands
  • Pull / Push file workflow
  • SDK libraries (JS, Python, Ruby, PHP, Java, Go, .NET)
  • Public REST API
  • MCP Server (stdio & HTTP)
  • Industry templates (52)

Platform (Subscription)

  • SmartRouter (multi-model AI routing)
  • CognitiveLimiter (AI cost control)
  • AI agents (24/7 autonomous)
  • the full agent verb surface via MCP
  • Vibe modifications (natural language)
  • Multi-tenant orchestration
  • Agent soul, performance scoring, and persistent memory
  • Multi-agent missions (ADA coordinates)

Start Building

v2.24.0 on npm · brew + scoop + magic-link install

Install the CLI, pull your business data, and start shipping from the terminal.

Built by Adam Campbellnpm: @solidnumber/cliLicense: BSL-1.1 \u2192 Apache 2.0 on 2030-04-14GitHub \u2192npm \u2192
@solidnumber/cli — The first CLI built for AI agents | Solid# | SolidNumber