toryo docs
Documentation navigation

MCP

toryo speaks Model Context Protocol, so an agent session can search your knowledge plane, look at what is running, and start work, without a /-command or the board.

toryo mcp install                 # wire it into the MCP clients you have
toryo mcp list                    # what is wired where
toryo mcp uninstall               # remove it

toryo setup offers to do the install as a prompted step. It is an offer rather than a service: these are config files toryo does not own, so an unattended run never edits them silently.

The server runs as a child process over stdio. Nothing listens on a port and nothing is exposed to the network.

What you get#

Roughly twenty-five tools in three groups.

Knowledge, reading and writing the same stores your agent runs use:

ToolDoes
brain_searchone ranked search across memory, library, and the code index
memory_recall memory_remember memory_raterecall, record, and rate memories
library_search library_getsearch and fetch authored documents
code_searchask what a codebase contains
code_maporient in a codebase: its load-bearing files
dispute_query dispute_recordlook up and record recorded disagreements
idea_addfile an idea

Control plane, for looking at and steering work:

ToolDoes
project_list project_resolveyour registered projects
sequence_list sequence_runwhat can run, and start one
sequence_status sequence_runsone run, or recent runs
sequence_ackanswer a gate a run is waiting on
dispatch_enqueue dispatch_status dispatch_listqueue a job, check one, list them
schedule_create schedule_listrecurring work
ideas_listthe idea backlog

The escape hatch, which is how the other ~180 CLI commands stay reachable without paying for ~180 tool schemas in every session:

ToolDoes
toryo_helpdiscover what a CLI can do
toryo_runrun a CLI command

What toryo_run reaches is derived from the contract manifest, so a command added to any app widens it automatically.

What it will not run#

toryo_run withholds two classes of command, by role rather than by name:

  • Process lifecycle, migrate, start, daemon, serve, watch, up, down, restart, and the rest. foreman and toryo setup own these.
  • Destructive or interactive, forget, reset, remove, delete, dismiss, deactivate, the cleanup-* family, psql. These stay behind a terminal, where you can see what you are about to run.

A refusal names the shell command to run instead, so it redirects rather than dead-ends.

cancel is deliberately reachable. It is recoverable, and it is the stop button you want when you are looking at a run from Claude Desktop and it is going somewhere wrong.

Claude Code, Claude Desktop, Codex, GitHub Copilot and Cursor#

toryo mcp install wires every one of them it finds. Narrow it with --client claude-code|claude-desktop|codex|copilot|cursor.

ClientWhere it landsWorth knowing
Claude Code~/.claude.jsonWired through its own CLI when that is on your PATH, by merging into the file when it is not.
Claude Desktopclaude_desktop_config.jsonCreated when absent, and needs a restart to pick the server up.
Codex~/.codex/config.tomlWritten by codex mcp add, which corrects a stale entry in place and leaves your comments and unrelated tables alone. Found by the codex binary on your PATH.
GitHub Copilot~/.copilot/mcp-config.jsonCreated when absent. No restart needed: copilot reads it per session. Found by the copilot binary on your PATH.
Cursor~/.cursor/mcp.jsonCreated when absent. Writing the file is the whole job: Cursor picks the server up on its own, and all twenty-five toryo tools show up, alongside whatever other servers you have.

Every JSON config goes through one backup-then-merge path: your other MCP servers survive, and every mutating write is preceded by a timestamped backup. Codex is the exception, because its config is TOML and its own CLI owns the write.

~/.claude.json is never created from nothing. That file holds much more than MCP servers, so if it is absent, Claude Code has not run on this machine yet, and creating it would be toryo inventing state for another tool.

Project scoping is per call, in every client#

There is no session project, and no client-specific behaviour to learn. Every project-scoped tool takes a project argument, a slug or a UUID, and resolves it on the call. Name a project and the tool answers about that project and its descendants; omit it and you get global scope, which every read states in its own scope field rather than leaving you to infer it from a short answer.

That was not always true. The server used to resolve its own working directory to a project at startup, which meant the same question answered differently in Claude Code and in Claude Desktop, where there is no meaningful working directory to resolve. Naming the project is now the only behaviour.

The refs a tool accepts come from:

toryo project list

Skills or tools?#

Both surfaces exist and they overlap.

Skills (/toryo-code, /toryo-status, …) are a harness-side surface: toryo skills install writes them into both user-level skills roots (~/.claude/skills, ~/.agents/skills). They read files, run shell, and hold a multi-turn flow, so they are the richer path for anything needing judgement or file access on the way in.

Tools work in every wired client (Claude Code, Claude Desktop, Codex, GitHub Copilot and Cursor), and are the only surface Claude Desktop has: it is an app, not a harness with a skills root. They are one typed call with a structured result.

Where a gesture exists as both, prefer the skill in Claude Code.

Worker attachment#

Interactive client installation and worker attachment are separate. Each worker launch negotiates the MCP capability of the selected harness, then attaches the toryo Brain server and any requested browser server for that run. Claude Code, Codex, Copilot, and Cursor all support this attachment, but each receives it through its own native configuration shape. A run that opts out does not inherit an interactive client's user-level servers by accident.

Cursor receives attached servers through a run-local --plugin-dir. Its .cursor-plugin/plugin.json manifest points to mcp.json in that plugin directory. Both files live with the run, so attachment does not modify user or project Cursor configuration.

Codex needs one extra generated setting: each attached server is written with tool approval enabled. Codex's broader non-interactive approval policy does not approve MCP calls by itself; without the server setting Codex can list the tools but cancels every call. toryo writes this into the per-run config rather than changing your user config.

The rule underneath all of it#

The MCP is a second facade over the CLI, not a parallel API. Nothing exists in a tool that a CLI command cannot already do, which is why the escape hatch can be generated from the contract rather than hand-maintained. If you are building something on toryo, build on the CLI: see Building on toryo.

When something is missing#

The tools are not there. Run toryo mcp list to see what is wired. Restart Claude Desktop after any change; it does not reload config.

Everything comes back global. The call named no project. Every read says so in its own scope field. See above.

Searches return nothing. Check services with toryo foreman check. The server starts even when Postgres is down. It just has nothing to read.

A command is refused. It is in one of the withheld classes. The refusal names the shell command to run instead.