Developer CLI
v2.24.7Built for AI agentsGive your AI the keys.
CLI · MCP · WebMCP · UCP — same verbs, same receipts, any AI model.
curl -fsSL https://solidnumber.com/install.sh | shOne 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
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.
solid verbs invokeFor AI agents in shells (Claude Code, Codex, Cursor terminal) + humans.
mcp/connectorHosted OAuth connector for Claude / ChatGPT / any MCP client — curated connector tools (185 declared, scoped per tenant), per-company binding.
navigator.modelContextFor in-browser agents. First SaaS to ship across every tenant subdomain.
/.well-known/ucpFor AI buyer-agents (Gemini AI Mode, ChatGPT shopping). RFC 9421 signed.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
NewRead 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.
Quick Start — install + first day
Four commands to go from zero to managing your business in the terminal.
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.
curl -fsSL https://solidnumber.com/install.sh | shiwr -useb https://solidnumber.com/install.ps1 | iexAlready 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.
brew install solidnumber/tap/cliPair 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.
scoop bucket add solidnumber https://github.com/Solidnumber/scoop-bucket
scoop install solidnumber/solidwinget support is in the backlog — needs a self-contained Windows binary first. Scoop covers the Windows package-manager use case today.
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.
curl -fsSL https://solidnumber.com/install.sh | SOLID_INSTALL_TOKEN=ist_xxx sh$env:SOLID_INSTALL_TOKEN = 'ist_xxx'; iwr -useb https://solidnumber.com/install.ps1 | iexAlready have the CLI installed? solid setup --install-token ist_xxx --yes redeems a fresh token from the dashboard without reinstalling.
npm i -g @solidnumber/clisolid auth login
# Email: you@company.com
# Password: ********
# Logged in to Acme Corp (ID: 42)solid pull
# Pulling pages... 12 files
# Pulling KB entries... 48 files
# Pulling services... 8 files
# Saved to ./my-business/# 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 successfullyAgents 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.
- 1.
solid map— the whole platform as nouns and Atlas addresses. Read once, cache it, never fetch again. - 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.
solid verbs describe <verb>— the exact call shape, including what it RETURNS.verbs examplehands you one that actually runs; before v2.23.0 it seeded optional fields the server rejects. - 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.
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.
solid agent setupWrites 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.
unset SOLID_COMPANY_IDThe 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.
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.
solid mapEvery 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.
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.
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.
solid verbs invoke <verb> --dry-runValidated 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.
solid schema verbs --jsonEvery 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.
GET /openapi.json1,944 endpoints, fully-typed Pydantic schemas. Same spec that ships to npm.
GET /.well-known/mcp.jsonthe full verb surface plus platform tools. Bearer-token, tenant-scoped per company_id. stdio transport.
solid graph --query "..."Offline SPARQL BGP, online SPARQL 1.1 (--server), N-Quads/Turtle dump. Schema.org + solid:* IRIs.
solid <anything> --jsoncode · status · message · hint · docs_url · request_id · scope · feature · upgrade_to. See JSON Envelope Spec below.
solid agent activity --jsonEvery agent-driven request carries X-Solid-Agent, X-Solid-Agent-Mode, X-Solid-Human-Initiator headers. Server-logged.
solid ai --sandboxEvery mutation intercepted + mocked. Your reasoning still works; no real state changes.
GET /.well-known/qchain.jsonTamper-evident agent-action chain. Offline SHA-256 + Ed25519 verification. No Solid# access needed.
solid update --check --jsoncurrent · 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.
--help examples are <id> placeholders — copy any command and run it as-is.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.
$ 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; surfaceupgradecommand 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.
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.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.
{
"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
}
}$ 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 IDsRelease 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.
Global Flags
v2.16.0Every command inherits these flags. Set via CLI or environment variable — whichever is more convenient for your shell, script, or CI pipeline.
| Flag | Purpose | Env Var |
|---|---|---|
--dry-run | Preview every mutation, no server writes | SOLID_DRY_RUN=1 |
--json | JSON output (cascades to every subcommand) | SOLID_JSON=1 |
--format json|csv|tsv | List output format for scripting | — |
--sort-by <field> | Sort list output by any field | — |
--order asc|desc | Sort 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 |
--debug | Append method/URL/body context to every error | SOLID_DEBUG=1 |
--no-color | Disable ANSI colors (standard Unix convention) | NO_COLOR=1 |
--raw | Pipeline-clean output — no spinner, no decoration | — |
--no-spinner | Disable progress spinner | — |
-V, --version | Print CLI version | — |
--dry-run intercepts every write. Audit the plan before touching production.
--json, --format csv, and --raw make every command pipe-ready for jq, awk, or xargs.
SOLID_API_KEY env var or --token for headless auth. Never persisted to disk.
solid orders list --all --format csv --sort-by amount --order desc --output orders.csv
# Fetched 1,247 orders across 13 pages
# Saved to orders.csvCommand 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 graphsolid 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 neighbourssolid 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 edgessolid graph kb/42 --jsonMachine-readable JSON-LD subgraph (preserves @context)solid graph --offlineWalk .claude/solid-context.jsonld — no network, no auth requiredsolid graph --remoteForce API fetch, ignore any local .jsonldsolid graph --validateAssert every edge target resolves in @graph + per-@type required fields present; exit 1 on errorssolid 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 gatessolid 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.
CMS pages with layout, meta, and content blocks
Knowledge base with YAML frontmatter + content
Company info, website config, module flags
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)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
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
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
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 accuracyAgent 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.
Each agent's identity, configuration, learned patterns, and expertise — built from every interaction
5-criteria scoring after every interaction — tracks accuracy, helpfulness, and tool usage over time
Real-time tokens, latency, cost, revenue attribution, and ROI tracking per agent
View an agent's soul
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/100Launch a multi-agent mission
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 executedAgent dashboard
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.5xMulti-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.
Business owner managing their own company. Single login.
Freelancer/employee building for 1–2 clients. Invited to companies.
Manages many companies. Creates new clients, switches between them.
# 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-onlyRun 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# 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- \u2022 Before filing a support ticket (paste the output)
- \u2022 After switching companies
- \u2022 In CI as a smoke test (
exit 1on any failure) - \u2022 When "the CLI feels slow" — see exact per-endpoint latency
- \u2022
0\u2014 all probes passed - \u2022
1\u2014 one or more probes failed - \u2022
2\u2014 not authenticated (runsolid auth login)
Smart Typo Suggestions
StableWhen you mistype a command, the CLI ranks the nearest matches by prefix, substring, then Levenshtein distance — same UX as gh, cargo, and git.
✗ Unknown command: psh
Did you mean solid push? ✗ Unknown command: dcotor
Did you mean solid doctor? ✗ Unknown command: comapny
Did you mean one of these?
solid company
solid domains ✗ 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
solid completion bash > \
/etc/bash_completion.d/solidzsh
solid completion zsh > \
"${fpath[1]}/_solid"fish
solid completion fish > \
~/.config/fish/completions/solid.fishDon'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.
solid auth token create \
-n "GitHub Actions" \
-s kb:read,pages:write \
-e 90
# Key: sk_solid_abc123...
# (Shown once — save immediately.)# 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 --stdinname: 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 entrieskb:writeCreate/update/delete KB entriespages:readRead CMS pagespages:writeCreate/update/publish pagesvibe:executeExecute vibe modificationstrain:readRead training datatrain:writeImport/modify training datacompany:readList linked companiescompany:switchSwitch active companycms:blog:readRead blog postscms:blog:writeCreate/update blog postscms:pages:readRead CMS page contentcms:pages:writeCreate/update CMS pagescontent:review:readRead content review pipelinecontent:review:writeApprove/reject content reviewsrag:retrieveRAG context retrievalagents:readList agents, view configs, get resumesagents:writeUpdate custom instructions, personality, settingsagents:dataView reflection history and performanceagents:converseStart/continue agent conversations (full context chain)flows:readList flows, get details, metricsflows:writeCreate, update, activate, pause, archive flowsbrand:readGet brand, CSS variables, voice context, auditbrand:writeCreate and update brand identitywidgets:readList widgets, get embed codes, metricswidgets:writeCreate, update, activate, pause widgetsTelemetry & 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
# One-off (this shell)
export SOLID_DISABLE_TELEMETRY=1
# Permanent (add to ~/.zshrc or ~/.bashrc)
echo 'export SOLID_DISABLE_TELEMETRY=1' >> ~/.zshrcConfiguration
Credentials and preferences live in ~/.solid/. You can override any setting via environment variable — env vars take precedence over the config file.
~/.solid/
├── config.json # active company, base URL, token
├── identity.json # anonymous machine ID for telemetry
└── cli_history.json # recent commands (for solid feedback context)SOLID_API_URL — backend base URLSOLID_API_KEY — auth tokenSOLID_TIMEOUT_MS — HTTP timeoutSOLID_DISABLE_TELEMETRY — opt out- 1. CLI flag (
--token) - 2. Environment variable (
SOLID_API_KEY) - 3. Config file (
~/.solid/config.json) - 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.
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: 47MCP 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)
https://api.solidnumber.com/mcp/connectorClaude Code / Cursor (CLI)
claude mcp add --transport http solidnumber https://api.solidnumber.com/mcp/connectorWith 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.
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 logsOpen-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 installInstall the CLI, pull your business data, and start shipping from the terminal.