Skip to main content
Salty exposes four interfaces over the same workspace data: REST API, MCP server, CLI, and signed webhooks. They share auth, rate limits, usage caps, idempotency, and audit logging — but they’re built for different callers. This page tells you which one to use when.

TL;DR — which surface for which caller

Detailed comparison

Decision tree

Is the caller a human, an AI agent, or another machine?
  • Human (you) at the terminal → CLI. salty login once, then salty people list, salty keys create, salty logs tail. Stays out of the way.
  • AI agent connected via Claude Desktop, Cursor, or ChatGPT → MCP. Drop the config snippet, restart, done. The agent gets server-level instructions automatically.
  • Your own application code (a backend service, a script, a worker) → REST. Use the TypeScript SDK for ergonomics, or curl/Postman for one-offs.
  • External system reacting to state changes → Webhooks. Register an endpoint with POST /webhook-endpoints (REST) or salty webhooks add (CLI), verify signatures, react.
You’ll often use multiple surfaces in the same product. Common pattern: a backend service writing via REST, an AI agent reading + writing via MCP, your alerting hooked up via webhooks, and you on the CLI for ops.

Common workflows by surface

Why is the MCP surface smaller? More tools = larger context window pollution = worse agent performance. Deletion, task creation, webhook registration, custom-object definition, and usage queries are all admin-ish operations a human should drive. The 15 MCP tools are the agent’s day-to-day write surface; everything else goes through REST or CLI where a human can review.

Latency profile

All four surfaces hit the same Postgres in the same region — so end-to-end latency depends on which middleware chain runs: Per-plan rate-limit ceilings are validated under load with k6.

Mixing surfaces

A typical solopreneur stack might look like:
Every interaction is logged. Every state change fires events. Every surface respects the same plan caps and rate limits.