Skip to content

Agents and MCP

simrun-mcp is an MCP server on stdio, a local process of an agent: it runs on the machine of the working trees, takes the snapshots of the sources the agent names and calls the service with the token of the agent. It reads SIMRUN_URL, SIMRUN_TOKEN and the optional SIMRUN_STORE like the command line.

Setup

Register the server with the environment of the client, for Claude Code e.g.

claude mcp add simrun --env SIMRUN_URL=http://simrun.cluster.internal \
    --env SIMRUN_TOKEN=<token of the agent> --env SIMRUN_STORE=/mnt/cluster \
    -- uv run --project ~/git/simrun simrun-mcp

or with an installed package, -- simrun-mcp. The token of an agent names its owner in the tokens file of the service; the runs of the agents of the owner of the cluster get the priority owner, the runs of other agents agent, see Priorities and preemption.

The tools

tool arguments answer
submit_workflow workflow_path, sources (name to the path of a working tree, the model first), group, single_server the summary of the run at once, in the state submitting
wait_for_run run_id, timeout_s (600) the summary of the run once it ended or after the timeout
run_status run_id the record: state, tasks, plans and the provenance of the sources
run_progress run_id the progress of every task: the counts of its ledger and its first and last progress lines
list_runs group, agent, state, owner the runs; the runs of an owner include the ones of their agents
compare_runs run_ids the provenance and the summaries of the tasks side by side
cancel_run run_id the summary of the cancelled run
run_logs run_id, task_id, tail_lines (300, 0 for all) the logs of the pods of the task
run_outputs run_id, task_id the output files of the task
estimate_workflow workflow_path, sources, single_server the plan and the expected duration of every task

Paths in the answers are relative to the store, and every answer carries store, the local mount of the store, so an agent opens a result with store / path. A refusal of the service is returned as {"error": detail, "status": code} instead of raised, so the agent can read it; a service which cannot be reached answers the status 503, an error on the side of the client 400.

Groups of agents

A main agent gives its subagents a group id; every subagent works on one variant of a model in its own git worktree and submits its runs with that group (submit_workflow(..., group=...)). The main agent lists the group, also while runs are going (list_runs(group=...)), compares the runs (compare_runs) and takes the winner from its provenance.