Documentation

CLI reference

The ryvem-mcp binary is both the MCP server and a small command-line tool. Launched by an agent it speaks the protocol over stdio; run by hand it sets up and binds your profiles, diagnoses its own configuration, checks for updates, and exports the memory graph.

Command overview

Every invocation resolves to exactly one command. The argument-free invocation is dual-mode — the server when its output is piped, the help screen in a terminal — so an agent and a human both get the right thing.

CommandWhat it does
ryvem-mcpRun the MCP server over stdio when stdout is piped; print the help screen in an interactive terminal.
ryvem-mcp help · --help · -hPrint the help screen and exit.
ryvem-mcp --version · -vPrint the version, then run a best-effort update check.
ryvem-mcp updateDownload, verify, and install the latest release over the running binary.
ryvem-mcp setupInteractive wizard that creates or updates a named profile. See setup.
ryvem-mcp use [profile]Bind the current repo to a profile, or print what it resolves to. See use.
ryvem-mcp doctorRead-only self-diagnosis — no network, always exits 0. See doctor.
ryvem-mcp config <sub>Read and edit the global profile store non-interactively. See config.
ryvem-mcp graph exportWrite the memory graph to a self-contained HTML file. See graph export.

Anything else is rejected: the binary prints ryvem-mcp: unknown command … to stderr and exits with status 1.

Running the server

With no arguments and stdout connected to a pipe — the way every MCP client launches it — ryvem-mcp starts the JSON-RPC server over stdio. The same command in an interactive terminal prints the help screen instead, so you never get a silent, seemingly-hung process. Registration with a client is covered in Getting started.

On connect it writes a single status line to stderr, reporting the loaded profiles and where the memory graph lives:

ryvem-mcp connected (stdio) — profiles: company, personal (default: company) — memory graph: ~/.ryvem/dev.db

stdout is the transport

The server speaks JSON-RPC over stdout, so every log goes to stderr. Never redirect stdout anywhere but the MCP client — anything you inject there corrupts the protocol stream.

help

Prints the version banner and the full command list grouped into Usage, Config, and Server. The bare invocation in a terminal shows the same screen.

ryvem-mcp help

There is no per-command help flag

help is the single reference screen. A flag on a subcommand — for example config --help — is treated as an unknown command, so reach for ryvem-mcp help or this page instead.

--version

Prints the running version, then makes a best-effort check for a newer release against the official download host (RYVEM_BASE_URL overrides it, e.g. for a mirror). The check is entirely optional: an unreachable host prints a friendly note and never fails the command.

ryvem-mcp --version
SituationWhat it prints
Already currentyou are on the latest version.
Newer release founda newer version (…) is available — run ryvem-mcp update.
Host unreachablecould not reach the update server — you may be offline.

update

Self-updates the binary in place. It downloads this platform's asset and the SHA256SUMS manifest from the official host (or RYVEM_BASE_URL when set), verifies the SHA-256 digest, and atomically replaces the running executable. A checksum mismatch aborts the install — a partial or tampered download is never written over your binary.

ryvem-mcp update        # confirm the replacement interactively
ryvem-mcp update --yes  # skip the confirmation (also -y)

On a terminal it asks Replace the running binary? before writing; --yes (or -y) proceeds unattended, for scripts and CI. The asset it fetches is chosen from your platform and architecture:

PlatformAsset
Windows (x64)ryvem-mcp-windows-x64.exe
Linux (x64)ryvem-mcp-linux-x64
macOS (arm64)ryvem-mcp-darwin-arm64
macOS (x64)ryvem-mcp-darwin-x64

Restart after updating

The replacement swaps the file on disk, not the process already in memory. On Windows the old executable is moved aside first, since a running .exe cannot be overwritten. Either way, restart ryvem-mcp (and your agent's MCP session) to run the new version.

setup

The interactive wizard that writes a named profile into the global store at ~/.ryvem/config.json — the same file the installer configures on first run, and the friendly front end to the config commands below. Run it any time to add another account or update an existing one; each run writes atomically, so a crash never leaves the store half-written.

ryvem-mcp setup

It asks, in order:

StepWhat it asks
Profile nameDefaults to default. Type an existing name and it offers to update that profile or pick another.
Board1 Jira, 2 Trello, or 3 Local. Jira asks the base URL, your Atlassian email, then the API token (entered hidden, never echoed). Trello asks the key and token. Local asks an optional display name.
Confluence Jira onlyConfluence (wiki) with the same token? — yes reuses the Jira site (<jiraUrl>/wiki), email, and token for the knowledge base.
Repository hostingA menu you repeat until Done: GitHub (fine-grained PAT), Bitbucket (a separate Atlassian token), or GitLab (a PAT, plus an optional self-hosted host).
Default profileSet as default? — the very first profile you create becomes the default automatically.

Each token prompt shows where to create it, the name to give it (ryvem-mcp), and the exact scopes — the same values tabulated in Providers and Getting started. When it finishes, the wizard prints where it wrote, which profile is now the default, and the next step: bind a repo with ryvem-mcp use <name>.

setup needs a real terminal

The wizard reads answers from an interactive TTY. If stdin is not a terminal — piped input, or a non-interactive CI shell — it prints a short note that setup needs a terminal and exits 1. Use the scriptable config commands for unattended configuration.

use

Binds the repository you are in to a profile by name, or — with no argument — reports how the repo resolves. It only ever writes the profile name; the file it touches, ryvem.json at the repo root, stays secret-free and committable.

ryvem-mcp use company   # bind this repo to the "company" profile
ryvem-mcp use           # print this repo's resolution, write nothing
InvocationWhat it does
use <profile>Validates that the name exists among the loaded profiles (the config.json profiles plus the .env-synthesized default). If it does, it merges {"profile":"<name>"} into ryvem.json at the cwd's repo root, preserving repoId and every other field, then confirms what it wrote and that the file is safe to commit.
use (no argument)Prints this repo's resolution and nothing else: the ryvem.json profile (or none), the profile that actually resolves — including the fallback to default — and the available profile names. No secrets.

An unknown name is rejected before anything is written

If the profile does not exist, use lists the available names, points you at ryvem-mcp setup, and exits 1 without touching ryvem.json. How a bound name resolves — and what happens when a committed name is missing on your machine — is covered in Configuration.

doctor

A read-only self-diagnosis. It makes no network calls, changes nothing, and always exits 0 — safe to run any time, and the first thing to reach for when a board will not connect or a repo resolves the wrong account. It reports the environment it sees and flags common problems in plain words.

ryvem-mcp doctor

A healthy machine prints something like this — every secret masked to its last four characters, every URL reduced to its host:

ryvem-mcp doctor

version       0.4.2
executable    /home/you/.local/bin/ryvem-mcp
data dir      ~/.ryvem

.env          ~/.local/bin/.env  (found)
  RYVEM_PROVIDER   jira
  JIRA_URL         yourco.atlassian.net
  JIRA_EMAIL       you@company.com
  JIRA_TOKEN       set (…a1b4)
  GITHUB_TOKEN     set (…9f2c)

config.json   ~/.ryvem/config.json  (found)
  profiles         company, personal
  default          company

this repo     /home/you/code/app/ryvem.json
  profile          company
  repoId           repo:6f1e2a9c-…
  resolves to      company   (board: jira)

No problems found.

Section by section, it prints the version and process.execPath; the data directory; the .env path it checked and whether it exists, followed by the board-relevant variables that are present by name with masked values (URLs as their host, emails shown, tokens as set (…abcd)); the config.json path, whether it exists, the profile names, and the default; and the cwd repo's ryvem.json — its profile and repoId, or that it is absent — with the profile and board provider that resolve.

In place of No problems found, it names anything it can see is wrong:

ConditionWhat doctor says
RYVEM_PROVIDER set but credentials incompleteNames the provider and lists the exact variables still missing for it.
ryvem.json names a profile that does not existReports the mismatch and that it will fall back to the default profile.
No board configured anywhereExplains that Ryvem will boot the zero-config local board so the server still starts.

config

The config family is the scriptable, non-interactive front end to the global profile store at ~/.ryvem/config.json — the same store setup writes through a wizard. A profile bundles one board with the version-control and knowledge accounts that belong to the same context. This section is the command reference; the file format and every field's meaning live in Configuration.

SubcommandWhat it does
config listList every profile with its board and configured accounts; marks the default.
config show <profile>Show one profile's fields, with secrets redacted.
config add <profile> --provider <p>Create a profile for board jira, trello, or local.
config set <profile> <key> <value>Set one dotted field (see the key table below).
config unset <profile> <key>Remove one field from a profile.
config remove <profile>Delete a whole profile.
config default <profile>Point the store's default at an existing profile.
config clearWipe all profiles.

Flags

FlagApplies toEffect
--provider <p>addBoard provider for the new profile — jira, trello, or local. Defaults to local.
--yes · -yset, unset, remove, clearSkip the confirmation prompt for a destructive or overwriting change.

Keys for config set

set and unset accept only these dotted keys; a typo is rejected rather than silently stored.

SectionKeys
Boardboard.provider, board.url, board.email, board.token, board.key, board.userName
GitHubgithub.token
Bitbucketbitbucket.email, bitbucket.token
GitLabgitlab.token, gitlab.host
Confluenceconfluence.url, confluence.email, confluence.token

Example

Create a Jira profile, fill in its board and a GitHub token, and make it the default:

ryvem-mcp config add company --provider jira
ryvem-mcp config set company board.url https://yourco.atlassian.net
ryvem-mcp config set company board.email you@company.com
ryvem-mcp config set company board.token <api-token>
ryvem-mcp config set company github.token <github-token>
ryvem-mcp config default company
ryvem-mcp config show company

Secrets are handled for you

Setting any *.token field prints where to create that token and the exact scopes it needs. config show only ever prints a redacted value — the last four characters — and no command writes a token to stdout in full. The first profile you add automatically becomes the default.

graph export

Renders the current memory graph to a single self-contained, interactive HTML file — no server, no external assets — and prints the absolute path of what it wrote to stdout. It opens the store read-only and skips the boot-time migration, so it stays fast and side-effect-free. The graph itself is described in Memory graph.

ryvem-mcp graph export
ryvem-mcp graph export --out ./graph.html --open
ryvem-mcp graph export --scope global
FlagEffect
--out <path>Where to write the file. Defaults to ryvem-mcp-graph.html in the current directory; a relative path is resolved to an absolute one.
--openAfter writing, launch the file in your OS default browser (best-effort; a headless box just keeps the file).
--scope <scope>Restrict the export to one memory scope, such as global or a single repo's repo:<uuid>. Omit it to export everything.

Only these three flags are recognized

Any other flag after graph export makes the whole invocation an unknown command. Stick to --out, --open, and --scope.