simpler CLI
The simpler CLI is a token-lean, JSON-first command-line client for the entire SimplerDevelopment portal — posts, media, CRM, projects, email, commerce, Company Brain, and more. Its commands are generated from the portal's MCP tool manifest, so it has 451-tool parity with the MCP server by construction: every write goes through the same tool handlers, scope checks, and approval staging an AI agent would hit.
Installation#
npm install -g @simplerdevelopment/cli
simpler --help
Requires Node ≥ 22. The package has zero runtime dependencies.
Authentication#
Three ways to give the CLI an { apiUrl, apiKey } pair, highest precedence first:
-
Flags —
--api-url <url> --api-key <key>on any command. -
Environment variables —
SIMPLER_API_URLandSIMPLER_API_KEY. Best for CI. -
simpler auth login— interactive email + password sign-in:simpler auth login --email you@example.com --api-url https://www.simplerdevelopment.comOn success it mints a 90-day API key and stores
{ apiUrl, apiKey }in~/.simpler/config.json(mode0600). The password is never accepted as a flag — it's read from a hidden prompt, or piped via--password-stdinfor automation.
You can also mint a key in the portal UI under Settings → API Keys and paste it into SIMPLER_API_KEY.
Verify your setup at any time:
simpler doctor # config source, connectivity, auth, manifest health
simpler auth status # which key is active (redacted)
Finding commands#
Commands follow simpler <domain> <action> [--arg value ...]:
simpler --help # top-level menu: built-ins + global flags
simpler manifest # list every domain and its command count
simpler help posts # all commands in a domain
simpler help posts list # one command's arguments + an example
Tool arguments become kebab-case flags: posts_list's websiteId is --website-id.
simpler posts list --limit 10
simpler crm contacts-search --query "acme"
simpler kanban list-board --project-id 150
Output contract#
On a terminal, help renders as a readable menu and results are pretty-printed. When piped, or with --json, stdout carries exactly one JSON document — nothing else shares stdout:
{"success": true, "data": <payload>}
{"success": false, "error": {"message": "…", "code": "…"}}
Use --fields a,b,c to project only the fields you need:
simpler posts list --json --fields id,title,slug | jq '.data'
Exit codes#
| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | Remote/tool error |
| 2 | Usage/validation error (bad flag, missing arg, unknown command) |
| 3 | Auth/config missing or rejected |
| 4 | Destructive confirmation refused |
| 5 | Network unreachable/timeout |
Destructive commands#
Commands that delete or irreversibly change data prompt for confirmation on a terminal and refuse to run non-interactively unless you pass --yes. Add --dry-run to see what would be sent without executing.
simpler posts delete --id 42 # prompts [y/N]
simpler posts delete --id 42 --yes # CI-safe explicit consent
Using it in CI#
- run: npx @simplerdevelopment/cli doctor --json
env:
SIMPLER_API_URL: ${{ vars.SIMPLER_API_URL }}
SIMPLER_API_KEY: ${{ secrets.SIMPLER_API_KEY }}
- run: npx @simplerdevelopment/cli posts list --json --fields id,title,updatedAt > posts.json
Relationship to the MCP server#
The CLI wraps the same POST /api/mcp endpoint AI agents connect to — it introduces zero new API surface. If you're wiring up Claude or another MCP client instead, see Connect an AI Agent.