Skip to main content

mechbench-runner

The machine-side process of the mechbench family: it claims queued jobs from mechbench-api, executes them against mechbench-compute, and posts results back. It also exposes those same primitives as Model Context Protocol tools, so an LLM agent can call them directly.

Status: in use. login pairs a machine with an account; the runner then claims and executes jobs, reports progress and preparing steps, holds a live WSS channel for control and telemetry, and installs as a launchd or systemd service so it survives reboots. doctor tells you whether a machine will work before it tries. Three MCP tools (run_protocol, get_result, list_jobs) expose the same primitives to an agent.

What this repo is for

Two adjacent surfaces for different callers:

  1. MCP server. An LLM agent (Claude, others) connects via MCP stdio and calls mechbench primitives as structured tools. Tool bodies run in-process against mechbench-compute.
  2. Job-runner. Polls mechbench-api's /jobs/next for UI-queued protocols, runs them, posts results back. Same compute path as the MCP run_protocol tool; different trigger.

Both modes share one binary (mechbench-runner) with subcommands; they share the loaded model, API client, and protocol executor. Splitting into separate processes is a later operational decision — see "Open design questions" below.

Architectural decisions (task 000185)

  • Python. mechbench-compute is Python; delegating to Python via RPC or subprocess-shell from a TS runner adds a layer that pays no dividends in v0. The MCP Python SDK is mature.
  • One binary, two subcommands. mechbench-runner mcp launches the MCP server over stdio; mechbench-runner run starts the job-runner loop. They share ExperimentRunner (owns the loaded Gemma model) and ApiClient.
  • Agent authenticates to mechbench-api with a dedicated API key, not a user's personal session. Export MECHBENCH_API_KEY (mint one at /settings/api-keys, or via POST /auth/api-keys). Matches the pattern from the e2e trace.
  • MCP run_protocol runs in-process, not queued through mechbench-api. The MCP caller wants the answer; we are the compute target. Job-queue round-tripping exists for the UI-triggered path (job-runner subcommand).
  • stdio transport only. SSE / HTTP-SSE transports earn their seat once remote MCP deploy matters (deferred).

Install

uv tool install mechbench-runner     # or: pipx install mechbench-runner
mechbench-runner login

login prints a link, takes the registration token from it, stores a durable key at ~/.mechbench/config.toml (mode 0600), and offers to start the runner automatically. Say yes and there is nothing further to do: it starts at login, comes back after a crash, and is controlled from the website.

mechbench-runner doctor answers "will this actually work here" — Python, backend, credentials, API, model cache, disk — before you find out the slow way.

Running a model needs Apple Silicon (the MLX backend from mechbench-compute). The rest installs anywhere.

Running it yourself

mechbench-runner run              # foreground, ^C to stop
mechbench-runner install-agent    # or have the OS keep it running
mechbench-runner agent-status

The service is supervised by launchd or systemd rather than by anything we wrote — see mechbench_runner/exits.py for the contract that makes that work.

On macOS you will be told that software from "Ned Deily" can run in the background. That is this runner. macOS attributes a background item to whoever code-signed the executable, and the executable is the Python interpreter, which Ned Deily signs as CPython's macOS release manager. Turning it off in Login Items & Extensions stops the runner; mechbench-runner doctor reports it if that happens.

From a checkout

git clone https://github.com/mechbench/mechbench-runner.git
cd mechbench-runner
python3.11 -m venv .venv
source .venv/bin/activate
pip install -e '.[dev]'

Usage

MCP server

Launch as a stdio MCP server — connect from Claude Desktop via claude_desktop_config.json:

{
  "mcpServers": {
    "mechbench": {
      "command": "/abs/path/to/mechbench-runner/.venv/bin/mechbench-runner",
      "args": ["mcp"],
      "env": {
        "MECHBENCH_API_URL": "http://localhost:3000",
        "MECHBENCH_API_KEY": "mbk_..."
      }
    }
  }
}

Three tools appear in Claude:

tool description
run_protocol Run a layer-ablation protocol in-process on a prompt; return per-layer damage.
get_result Fetch a cached payload from mechbench-api by MechbenchPath.
list_jobs List the caller's queued / running / completed jobs.

Job-runner

Polls mechbench-api for UI-queued jobs. Same compute path as run_protocol; different trigger.

export MECHBENCH_API_URL=http://localhost:3000
export MECHBENCH_API_KEY=mbk_...
mechbench-runner run

Ctrl-C exits cleanly. API-unreachable is retried with exponential backoff capped at 30 s.

In-process smoke test

mechbench-runner smoke            # quick: list_jobs + get_result
mechbench-runner smoke --full     # adds run_protocol (42 forwards, ~1-2 min)

Configuration

All via env vars:

var default purpose
MECHBENCH_API_URL https://api.mechbench.ai mechbench-api base URL. Set it to http://localhost:3000 to develop against a local API. Ignored when credentials are stored, which carry their own.
MECHBENCH_API_KEY (from login) Overrides the stored credential entirely, URL included. For CI and containers, which have nowhere to put a config file.
MECHBENCH_POLL_INTERVAL_SECONDS 2.0 Job-runner poll cadence.
MECHBENCH_WARM_MODEL_ID (none) Optional model to load at startup so the first job skips cold start. There is deliberately no default: a protocol names the model it runs against, and a job that names none is an error.
MECHBENCH_WATCHDOG_SECONDS 900 How long without progress counts as wedged. 0 disables it.

Relationship to other mechbench repos

  • mechbench-compute — imported directly. Model, Ablate, hook-aware forward.
  • mechbench-schema — produces LayerAblationPayload etc. as typed results.
  • mechbench-api — the runner's only platform dependency. All workspace state (jobs, cache reads) goes through it.
  • mechbench-ui — no coupling. UI queues jobs; the job-runner consumes them.
  • mechbench-experiments — research scripts that use mechbench-compute directly, without the job machinery.

Open design questions (deferred)

  • One binary or two processes? Current answer: one binary, two subcommands. Revisit if MCP-caller frequency vs. job-runner throughput diverges enough to want independent scaling.
  • Structured-summary interface. The family's philosophy doc describes a read-side surface where agents consume JSON summaries of findings / experiments. Currently implicit in list_jobs + get_result. A richer summary layer (GET /summary, POST /query) is still on the table but unbuilt.
  • MCP-surface observability. Rate limits, per-tool metrics, audit trail for the tool-calling side. Deferred until a second LLM-agent consumer exists.

License

MIT.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mechbench_runner-0.1.7.tar.gz (62.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mechbench_runner-0.1.7-py3-none-any.whl (53.9 kB view details)

Uploaded Python 3

File details

Details for the file mechbench_runner-0.1.7.tar.gz.

File metadata

  • Download URL: mechbench_runner-0.1.7.tar.gz
  • Upload date:
  • Size: 62.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.11.1

File hashes

Hashes for mechbench_runner-0.1.7.tar.gz
Algorithm Hash digest
SHA256 9f7401b9dd1cb895c316e547337d1984694307e0e5a2df77f7cbe5b03cbbe712
MD5 0c1691b936f04d73573ef5a31e93c6a3
BLAKE2b-256 abeb75e5b69e7b1979d99e43971baae84d7e3ec0b9b4fd541246a16835518558

See more details on using hashes here.

File details

Details for the file mechbench_runner-0.1.7-py3-none-any.whl.

File metadata

File hashes

Hashes for mechbench_runner-0.1.7-py3-none-any.whl
Algorithm Hash digest
SHA256 ac138e8d2411079109c9d95cf5afc979ee39f113f507f34c029827fb9c148fdf
MD5 6bb0b38d5d8a6610b92ab5e19e32ab92
BLAKE2b-256 21332a4a5a36f145d9a3775240726d7eab1c6bfdc95cc3c6922eda6571692a1f

See more details on using hashes here.

Release history Release notifications | RSS feed

0.4.0

2 files

0.3.1

2 files

0.3.0

2 files

0.2.3

2 files

0.2.2

2 files

0.2.1

2 files

0.2.0

2 files

This release

0.1.7 This release

2 files

0.1.6

2 files

0.1.5

2 files

0.1.4

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page