Skip to main content
sumcli is Summation’s first-party command-line client and the shortest path to everything in this tab. It talks to the stable /v1 routes of the API, manages token exchange and refresh for you, and emits agent-friendly JSON, making it the right tool for scripted automation and headless agent workflows.

Install

Requires uv and Python 3.11+ (uv can install Python for you). Installs into an isolated tool environment so sumcli lands on your PATH without touching any project’s virtualenv.
Or bootstrap uv and install in one shot. Pick the command for your shell (don’t paste curl | sh into PowerShell or cmd.exe):
Then verify, and upgrade later with:
sumcli update installs the latest PyPI release, including over an exact-version pin. It refuses to run on a copy it doesn’t manage (NOT_UV_MANAGED). If you installed via brew, pip, or pipx, upgrade with that same installer instead so you don’t end up with two copies. Commands also print a once-a-day stderr notice when a newer release exists (stdout stays clean JSON); disable with SUMCLI_NO_UPDATE_CHECK=1.
The Claude and Codex plugins prefer sumcli whenever a shell is available and check the installed version at session start, so if you use the plugins, you may already have it.

Sign in

sumcli stores credentials in profiles in ~/.summation/summation-config. Create a profile, then authenticate.
auth login prints a device code and a URL. Approve it in the browser. No secrets are entered on the command line. This CLI session is separate from the plugins’ MCP browser approval: being signed in on one does not sign in the other.
Pin a default project per profile so project-scoped commands need no --project:

Resources

Bare invocation prints the live command tree. Resource names and actions come from the installed CLI:

Manage custom verification tests (sumcli 0.1.6+)

Validation is offline and uses the same canonical contract as the API. Mutating dry runs also stay offline: they emit the exact request but neither authenticate nor send it.
Use the cvt-... definition id returned by upload or list as --custom-test-id. Project scope uses the profile’s default project when --project is omitted. A cross-org call adds --target-org organization-live-... and must name --project explicitly; operator identity remains the signed-in user. --op remove --target-ref ... creates a removal overlay, while detach removes an existing attachment by its vta-... id.

Output for agents and scripts

When stdout isn’t a terminal (piped, captured, or run by an agent), sumcli emits JSON envelopes with contextual next_actions, and NDJSON for streaming commands. At an interactive terminal it renders a human-readable view instead. Force either mode explicitly:
The human view is lossy: wide tables drop columns. Never parse it. Pipe the JSON output through jq for anything scripted.

Common workflows

Load a local CSV into a table

Two ways: a one-shot direct ingest, or an explicit two-step that goes through the project file tree first. One-shot (recommended when you don’t need the file in the project tree):
Uploads the file, detects the schema, and materializes a new grid table. Outputs NDJSON ending in importStatus: SUCCESS with the new tbl-... ID. Two-step (when you want the CSV in the project file tree too):
Step 2 also accepts --file-id file-... if you have the ID directly. If the file is already in the project (uploaded by someone else, dropped via the UI, etc.):

Inspect, attach, query, and clean up

A freshly imported table lives in the tenant grid but is not attached to the project catalog. Attach it to make it visible in catalog list and queryable as a project resource:
tables delete removes the underlying grid table but does not auto-cascade the project catalog entry that referenced it. Detach the entry separately with catalog detach file-... --confirm.

Ask Addison and generate reports

Long-running commands (--wait / --follow)

chats create, chats reply, reports generate, reports verify, grid push, and tables import all support --wait / --no-wait (and --follow where applicable). All of those commands default to --wait. reports generate and reports verify also default to --follow; the rest default to --no-follow. --no-wait --follow is rejected (INVALID_FLAGS, exit 1).
tables import takes --wait / --no-wait but has no --follow; it streams NDJSON whenever it waits.

Stating intent (agents)

When an agent runs sumcli on a person’s behalf, it should pass the human’s request, in their own words and not a summary of the command, so downstream events can be joined to a goal:
Requires sumcli ≥ 0.1.4. The value is normalized to one line and capped at 500 bytes after encoding; an oversized value is refused (INTENT_TOO_LONG). Omitting it never fails: machine-mode runs print a one-line stderr warning and continue, so unattended pipelines are unaffected. Discovery, --help, --version, update, and the auth, config, and filesystem groups never warn. SUMCLI_NO_INTENT=1 is an org-level kill switch: the header is never sent, even when an intent is set. Agent hosts can also identify their surface with a short product token (never free text):

Working with profiles

Each profile pairs an API host with credentials and session state. Switch the active profile, or select one per command:
Running parallel agents or jobs? Don’t call config use against a shared ~/.summation/summation-config: the switch is global. Instead pass --profile on each command, or set SUMMATION_PROFILE in each subprocess.
Useful config commands:

Configuration reference

sumcli reads settings with field-specific precedence: CLI flags win, then environment variables, then the config file. Identity always comes from the bearer token. sumcli never trusts caller-supplied identity headers. For the underlying endpoints and error conventions, see the Public API.