# CLI

URL: https://zerodev.ca/docs/kora/cli

> Manage licenses from your terminal, script it in CI, and let an AI assistant use Kora.



`kora` puts your Kora server in your terminal. Every command works in scripts with `--json` and `--yes`, and `kora mcp` lets AI coding assistants manage licenses and add license checks to your code.

## Install

```bash
curl -fsSL https://raw.githubusercontent.com/zerodev-ca/Kora-CLI/main/install.sh | sh
```

The script picks the build for your system, checks it against `checksums.txt` and installs to `/usr/local/bin`, or `~/.local/bin` when that is not writable, and adds that folder to your shell's `PATH` when it is missing. On Windows, download `kora_windows_amd64.exe` from the latest release, rename it to `kora.exe` and put it on your `PATH`. With Node.js 20 you can also run `npm install -g @zerodev-ca/kora-cli`.

## Sign in

Create a token on the **API Tokens** page with the scopes you need, then run:

```bash
kora login --url https://api.example.com
```

Several servers can be saved. `kora accounts` lists them, `kora switch` picks one and `--account NAME` runs one command as another. Accounts are stored with mode 0600 in `~/Library/Application Support/kora/config.json` on macOS, `~/.config/kora/config.json` on Linux and `%AppData%\kora\config.json` on Windows.

## Commands

| Command                                                                                        | What it does                                                                                                         |
| ---------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| `kora licenses [--status S] [--product P] [-s TEXT] [--reveal]`                                | List licenses, keys masked.                                                                                          |
| `kora licenses show LICENSE`                                                                   | Details, seats and recent checks.                                                                                    |
| `kora licenses issue --product P --email E [--policy P] [--name N] [--key K] [--expires DATE]` | Issue a license, creating the customer when the email is new. A policy fills in its expiry, max machines and addons. |
| `kora licenses suspend \| revoke \| reinstate LICENSE`                                         | Change the status.                                                                                                   |
| `kora licenses download LICENSE [-o FILE]`                                                     | Save the signed offline file.                                                                                        |
| `kora products`, `kora products create NAME`                                                   | List or create products.                                                                                             |
| `kora policies [--product P]`, `kora policies create NAME --product P`                         | List policies with their license counts, or create one with `--type`, `--machines`, `--duration` and `--unit`.       |
| `kora customers [-s TEXT]`, `block`, `unblock`, `merge`                                        | Search, block and merge customers.                                                                                   |
| `kora rules`, `kora rules add`, `kora rules remove`                                            | Manage access rules.                                                                                                 |
| `kora stores`, `kora purchases`                                                                | Connected stores and their purchases.                                                                                |

A license can be named by its full key, the start of its key, the email of a customer with one license, or its id.

## Test like your product does

| Command                                                    | Exit code                                      |
| ---------------------------------------------------------- | ---------------------------------------------- |
| `kora validate --key KEY [--product P] [--fingerprint ID]` | `0` valid, `1` rejected, `2` Kora unreachable  |
| `kora activate --key KEY`                                  | The same, after taking a seat for this machine |
| `kora deactivate --key KEY`                                | `0` when a seat was freed                      |
| `kora verify-offline --file FILE [--public-key FILE]`      | `0` when the signature and dates are good      |
| `kora fingerprint`                                         | Prints this machine's id, sent as `hwid`       |

## Scripts and CI

```bash
export KORA_URL=https://api.example.com KORA_TOKEN=kora_...
KEY=$(kora licenses issue --product "My Plugin" --email ci@example.com --json | jq -r .key)
kora licenses revoke "$KEY" --yes
```

`--json` prints the API's data with keys unmasked. Commands that change something ask first in a terminal and need `--yes` in scripts. `KORA_CONFIG` moves the account file, `KORA_PUBLIC_KEY` feeds `verify-offline` and `NO_COLOR` turns colors off.

## AI assistants

```bash
claude mcp add kora -- kora mcp
```

`kora mcp` speaks the Model Context Protocol over stdio with the signed-in account. Its tools list and issue licenses, change statuses, manage products, policies, customers and access rules, validate keys and return SDK snippets for every SDK. Give it a token with only the scopes it needs.
