> ## Documentation Index
> Fetch the complete documentation index at: https://docs.etho.net/llms.txt
> Use this file to discover all available pages before exploring further.

# Olympus CLI

> Install the terminal client, sign in, and run your workspace headlessly or from a host coding agent

`olympus` is a terminal client for the Olympus Agent. It signs in through your
browser, then runs scripted turns from a shell, from CI, or from inside a
host coding agent such as Claude Code, Codex, or Cursor. The agent itself
still runs on Olympus's servers. The CLI streams its replies and lets you
approve or deny what it wants to do.

This page covers installing the CLI, signing in, running it headlessly, and
setting it up inside a host coding agent. The full interactive terminal
session arrives in a later update; this page will grow to cover it then.

## Install

```bash theme={null}
curl -fsSL https://app.etho.net/install | bash
```

This detects your OS and CPU architecture, downloads the matching binary,
verifies its checksum, and installs it to `~/.olympus/bin`. No Node.js
install is required. macOS (Intel and Apple Silicon, including under
Rosetta) and Linux (x64 and arm64) are supported.

If `~/.olympus/bin` isn't already on your `PATH`, the installer prints the
line to add:

```bash theme={null}
export PATH="$HOME/.olympus/bin:$PATH"
```

Add that to your shell profile to keep it across sessions.

**Environment variables the installer reads:**

| Variable | Effect |
| - | - |
| `OLYMPUS_INSTALL_DIR` | Install somewhere other than `~/.olympus/bin` |
| `OLYMPUS_VERSION` | Install a specific version instead of the latest |
| `OLYMPUS_API_URL` | Install from a non-default Olympus deployment |

## Sign in

```bash theme={null}
olympus login
```

This prints a short code and opens `https://app.etho.net/cli/authorize` in
your browser (or prints the URL if it can't: `olympus login` detects an SSH
session automatically and skips trying). Enter the code, pick a workspace,
and the CLI finishes signing in once you approve it. Signing in needs an
Olympus account with an active paid subscription on the workspace you
choose.

Use `--no-browser` to always print the URL instead of opening it. For CI or
other non-interactive hosts, mint a personal API key from **Settings > API
keys** in the app instead and pipe it in:

```bash theme={null}
echo "$OLYMPUS_API_KEY" | olympus login --token
```

A personal key doesn't expire in v1 and should be rotated by whoever manages
your CI secrets. A browser-minted token is sliding-window: it expires 30 days
after its last use, and 90 days after it was issued either way.

Other account commands:

```bash theme={null}
olympus whoami              # who's signed in, which workspace, and token expiry
olympus workspace           # list every signed-in workspace
olympus workspace <name>    # switch the active workspace
olympus logout              # sign out of the active workspace (revokes the token)
olympus logout --all        # sign out everywhere
```

`OLYMPUS_TOKEN` in the environment overrides everything stored on disk. That's
useful for CI, and for running as a different workspace than the one you're
signed into locally.

## Run it headlessly

```bash theme={null}
olympus run "draft a launch email for the fall sale"
olympus -p "draft a launch email for the fall sale"   # same thing, shorter
```

`run` and its `-p` alias run one turn and print the result, without ever
prompting for input. Use `/<workflow-name>` to run a saved workflow and
`$<skill-name>` anywhere in the text to attach a skill:

```bash theme={null}
olympus run /launch-campaign for the fall sale
olympus run "write ad copy $brand-voice-check for the fall sale"
```

Useful flags:

```text theme={null}
--workspace <id>   Use this signed-in workspace instead of the active one
--project <id>     Scope a new session to this project
--skill <name>     Attach a skill (repeatable)
--mode <mode>      default, auto, or plan (never full: see below)
--effort <tier>    instant, light, balanced, deep, or max
--size <size>      auto, small, medium, or large
--session <id>     Continue this session instead of starting a new one
--json             Print JSON Lines: every stream event, then a final result line
```

`--json` is what a host coding agent should use. See
[Approvals and exit codes](#approvals-and-exit-codes) below for the contract.

An unattended run can use `default`, `auto`, or `plan` mode, never `full`:
`full` lets the agent act without approval, and a script shouldn't be able to
grant itself that.

## Approvals and exit codes

The Olympus Agent asks for approval before anything that sends, publishes,
or deletes something. A headless run never makes that call for you. It
stops and reports the approval instead:

```bash theme={null}
$ olympus run "send the nurture sequence to everyone who abandoned checkout"
Stopped for approval: a1b2c3d4-...
$ olympus approve a1b2c3d4-...
$ olympus deny a1b2c3d4-...
```

`run` and `-p` exit with:

| Code | Meaning |
| - | - |
| `0` | Turn completed |
| `1` | Unexpected error or bad input |
| `2` | Stopped for approval; stdout carries only the approval id |
| `3` | Not signed in, token expired, workspace frozen, or subscription required |
| `4` | The agent needs an answer this run can't give unattended |

`approve` and `deny` exit with:

| Code | Meaning |
| - | - |
| `0` | Resolved |
| `1` | Request failed, or it was already decided or has expired |
| `2` | Resolving it opened another approval; its id is printed |
| `3` | Not signed in, token expired, workspace frozen, or subscription required |
| `4` | Resolving it needs an answer this command can't give |

A pending send approval expires 24 hours after it's created; an expired or
already-decided approval is reported, not re-run. `olympus approve` reads an
edited message body from a file with `--edit-file <path>`, for the rare case
where a send approval's edited text belongs in the approval itself rather
than the original message.

## Set up a host coding agent

```bash theme={null}
olympus setup claude-code    # writes ~/.claude.json
olympus setup codex          # writes ~/.codex/config.toml
olympus setup cursor         # writes ~/.cursor/mcp.json
```

This writes the hosted Olympus MCP server into that tool's config, using
your signed-in token, so the host can read and write your CRM directly. It
preserves every other MCP server already configured there. For the full
agent, not just the MCP tools, the host can shell out to `olympus run --json`.

By default the config file holds the literal token (and is written `0600`,
readable only by you). Pass `--env` to reference `OLYMPUS_TOKEN` instead:

```bash theme={null}
olympus setup claude-code --env
export OLYMPUS_TOKEN=oly_...   # printed after setup; export it before starting Claude Code
```

To see the MCP configuration without writing it anywhere:

```bash theme={null}
olympus mcp          # human-readable
olympus mcp --json   # machine-readable, for scripting a host's own config
```

## Getting help

Every command documents its own flags and exit codes:

```bash theme={null}
olympus --help
olympus run --help
olympus approve --help
```

If something looks wrong (a stuck sign-in, a workspace that won't switch, an
approval that won't resolve), start with `olympus whoami`: it shows exactly
who's signed in, to which workspace, and when that token expires.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.