Skip to main content
Glama
casualkre

VoltageInputMcp

by casualkre

VoltageInputMcp

An MCP server that lets a frontier model drive a computer at input speed instead of tool-call speed.

The problem

Computer-use tools round-trip to a remote model for every action. Screenshot up, decision down, one click. That is fine for filling in a form and useless for anything that needs a sequence of inputs delivered quickly — playing a game, working a modal dialog, driving a timeline, any UI where the third input depends on the first two having already landed. The bottleneck is not the model's intelligence. It is that intelligence is 800 ms away and inputs need to be 8 ms apart.

Related MCP server: live-mcp

The shape of the answer

Separate deciding from doing, and put the doing on the same machine as the keyboard.

  ┌─────────────────────────────────────────────────────────────────┐
  │  Layer 1  —  the orchestrator (Claude, or any MCP client)       │
  │  Writes a Playbook: states, what to look for, what is allowed,  │
  │  when to move on. Thinks once, up front. Watches and corrects.  │
  └───────────────────────────┬─────────────────────────────────────┘
                              │  MCP
  ┌───────────────────────────▼─────────────────────────────────────┐
  │  Layer 2  —  two small local models, on your GPU                │
  │                                                                 │
  │   vision (Qwen2.5-VL-3B)     "of these specific things,         │
  │                               which are on screen, and where?"  │
  │   actuator (Qwen3-1.7B)      "given that, which inputs?"        │
  │                                                                 │
  │  Neither plans. Both answer one closed question per cycle.      │
  └───────────────────────────┬─────────────────────────────────────┘
                              │
  ┌───────────────────────────▼─────────────────────────────────────┐
  │  Layer 3  —  the fast loop, ~20 Hz, no model at all             │
  │  Probes measure the screen in microseconds. Reflexes react.     │
  │  Latches hold a key down for exactly as long as a condition     │
  │  lasts. Runs concurrently with layer 2, not inside it.          │
  └───────────────────────────┬─────────────────────────────────────┘
                              │
  ┌───────────────────────────▼─────────────────────────────────────┐
  │  safety governor  →  /dev/uinput  →  the actual desktop         │
  └─────────────────────────────────────────────────────────────────┘

The orchestrator is the brain. The small models are the arms. The arms are not smart and are never asked to be.

Where the speed actually comes from

Not from the small models being fast — a 3B VLM still costs ~300 ms. It comes from five things, in descending order of impact:

Bursts. The actuator does not emit an input. It emits a burst: a timed programme of inputs run by a dedicated executor with no model in the loop.

g:0;c:l;w:150;t:"README.md";k:enter;w:80;k:ctrl+s

That is one decision and seven inputs spanning ~400 ms, scheduled to the millisecond. A 40-action burst still costs one decision. Input rate is set by the burst, not the model.

Reflexes. Rules that fire off cheap screen probes — one pixel, one region average, a number OCR'd off the HUD — in microseconds, in their own loop at ~20 Hz, with no model at all.

{"id": "heal", "when": "probe('health') < 0.25", "do": "k:q;w:60", "cooldown_ms": 800}

Latches. A burst is bounded; a latch is not. hold presses on the rising edge of a guard and releases on the falling one, so a key stays down for exactly as long as the condition lasts — across frames, across decisions.

{"id": "glide", "when": "probe('meters') > 50",
 "release_when": "probe('meters') < 25", "hold": "w, shift"}

This is the difference between reacting and controlling. The same behaviour written as a repeated one-shot is a stutter of taps at 20 Hz, which downstream is not a held key at all.

Playbook-authored bursts may also contain {expression} holes, so the size of an action can depend on the size of the error — r:{clamp((probe('mph') - 60) * 4, -220, 220)},0 is a proportional controller in one line, running at reflex rate.

Skipping perception. Most cycles look at a screen that has not changed. A 40 µs frame-diff decides whether to spend 300 ms on the vision model or reuse the last observation. On ordinary desktop work this skips the VLM on most cycles.

Prompt-cache locality. Prompts are ordered static-first so llama.cpp reuses the KV cache and only re-prefills the changed tail.

Why the small models are reliable despite being small

Because they are not asked to be reliable — they are constrained.

Under llama.cpp, both models generate against a GBNF grammar that is regenerated every cycle from the current state. The grammar is not advice. It masks the logits so that only tokens continuing a valid parse are reachable. Concretely, the actuator cannot:

  • emit a malformed burst

  • name a key the policy denies — the key is not in the grammar

  • reference an element that was not observed — the index range is built from this cycle's element count

  • propose a state transition the Playbook did not declare

And the vision model cannot invent a UI element name: its label vocabulary is the watch list you wrote, plus a small generic set. So a sees("address bar") guard compares against a closed vocabulary rather than whatever noun a 3B model felt like producing.

There is no retry loop and no defensive JSON parsing, because malformed output is not improbable — it is unrepresentable.

The Playbook

You do not give the small models a goal. You give them a state machine. Transitions are guard expressions evaluated by the runtime, not by a model.

{
  "name": "open_downloads",
  "goal": "Open the file manager at ~/Downloads. Delete nothing, confirm nothing.",
  "initial": "launch",
  "policy": {
    "dry_run": true,
    "allow_verbs": ["g", "c", "k", "t", "w"],
    "deny_labels": ["delete", "trash", "confirm", "empty trash"]
  },
  "budget": { "max_cycles": 60, "max_seconds": 90 },
  "states": {
    "launch": {
      "brief": "Open the application launcher and start the file manager.",
      "watch": ["application launcher", "search field", "file manager icon"],
      "on_enter": "k:meta;w:400",
      "transitions": [
        { "when": "sees('search field')", "to": "type_name" },
        { "when": "cycles() > 6", "to": "@failure", "note": "launcher never opened" }
      ]
    },
    "navigate": {
      "brief": "Focus the location bar with ctrl+l, type the path, press Enter.",
      "watch": ["location bar", "file list", "error message"],
      "on_enter": "k:ctrl+l;w:200",
      "transitions": [
        { "when": "text('Downloads')", "to": "@success" },
        { "when": "sees('error message')", "to": "@failure" }
      ]
    }
  },
  "success_when": "text('Downloads') and not flag('loading')"
}

voltage_reference returns the full DSL, the JSON schema, and the guard function table, so an orchestrator can author one without reading this repo.

Performance tuning

All numbers below are measured on the reference machine (RTX 3050 6 GB laptop, Qwen2.5-VL-3B + Qwen3-1.7B under llama.cpp), not derived.

Both models are decode-bound. Output tokens are the only lever that matters.

That was a surprise — the design originally assumed vision was prefill-bound, and it isn't. Prefill measured ~28 ms and flat from 448×252 to 896×504. Decode runs at ~22 ms/token. So:

what

cost

one output token

~22 ms

one reported element

~21 tokens ≈ 500 ms

vision, 2 elements

~1.0 s

vision, 4 elements

~2.2 s

actuator, cached prefix

140–400 ms depending on note length

Three consequences, each of which changed a default:

  • max_elements is the dominant vision cost. Default is 3. Raising it to 6 adds ~1.5 s per perceived cycle. Set it to the number your guards actually test for.

  • Shrinking downscale_to does not help and usually hurts. 448×252 measured 2.5× slower than 896×504 — a blurrier image makes the model less certain, so it emits more tokens. Use the largest size that fits. (It is at least honoured now: the downscaler reduced by an integer factor and returned whatever that gave, so on a 1080p display every request between 640 and 960 wide silently produced 960×540.)

  • The actuator's note field cost 55% of its latency. It is purely diagnostic, and at 48 chars it measured 412 ms/cycle against 184 ms at 12 chars and 140 ms at 0. Default is now 12.

Elements are encoded as [label_index, x1, y1, x2, y2] rather than {"l":"address bar","b":[...],"c":0.9} for the same reason — measured 27–29% fewer tokens and 32–41% lower latency. Indexing into the closed watch vocabulary is also safer: the model cannot spell a label at all, let alone misspell one.

GBNF evaluation runs on the CPU once per sampled token, so the actuator gets more CPU threads than the vision model despite being fully GPU-offloaded — and restricting allow_keys is a latency optimization, not only a safety one.

Two settings that fail silently if wrong:

  • GGML_CUDA_FA_ALL_QUANTS=ON at build time. We serve with q8_0 KV cache and flash attention. Without this flag llama.cpp doesn't compile FA kernels for that KV combination and falls back to a slow path — no error, just mysteriously bad numbers. scripts/build-llama.sh sets it.

  • GGML_CUDA_ENABLE_UNIFIED_MEMORY=0 at runtime. If it's 1, VRAM overflow silently spills over PCIe instead of failing. Everything works and is ~10× slower. serve.sh pins it off.

Measure rather than guess:

.venv/bin/voltage bench

It drives both backends with the exact prompt shapes the loop uses and reports cold vs. prompt-cached latency, ms-per-visual-token at three input sizes, and the cycle time those imply. A prompt-cache speedup below ~1.5× means something dynamic leaked into the prompt prefix.

Comparing models

The obvious experiment — "which model writes better bursts" — measures the wrong thing. The grammar already guarantees every burst is valid, so a bigger model cannot win on syntax. What actually decides whether a configuration is usable:

  1. Grounding accuracy. A model that's 200 ms faster and 40 px off is useless — the click misses. Measured as centre distance in screen pixels, not IoU, because a click lands at the centre.

  2. Decision quality under constraint. Given the same observation, does it pick the right legal action, and does it chain a whole sequence into one burst rather than emitting one timid action per cycle?

  3. Latency, which only matters once 1 and 2 are acceptable.

.venv/bin/voltage fixture desktop      # capture a real screen
.venv/bin/voltage compare              # score whatever is running now

Ground truth comes from real screenshots labelled by the orchestrating model — which is the same reference this system uses at runtime. Synthetic UI is a trap: a drawn rectangle doesn't read as a button to a model trained on real interfaces, so scoring against it measures the wrong skill.

Results accumulate across runs, so the workflow is: serve profile A → compare → serve profile B → compare → read the table. voltage compare --list prints it without re-running.

Fixtures are yours and not committed. Add fixtures/ to .gitignore if your screenshots contain anything private.

The learning loop

The first playbook for an unfamiliar target is almost never right. What matters is that the failures are specific, and that the next attempt starts from what the last one learned.

voltage_reference(section="loop")     the loop itself, and what each failure means
voltage_reference(section="bursts")   the burst cookbook: chaining, timing, game patterns

voltage_capture / voltage_observe     look before writing — check your labels exist
voltage_validate_playbook             dead guards, unreachable states, caught statically
voltage_run(dry_run=true)             real models, real screen, nothing injected
voltage_diagnose(run_id)              ← what to change, not raw data
voltage_learn(target=..., note=...)   record it; persists across sessions
voltage_lessons(target=...)           recall it before the next playbook

voltage_diagnose is the piece that makes this a loop. It computes what the journal implies but does not state, and names the edit for each. On a stuck Minecraft run:

[BLOCKER] label_never_seen     never reported: ['crosshair', 'health bar']
[BLOCKER] input_not_landing    14 bursts executed, but the screen never changed
[BLOCKER] state_never_left     'mine' ran 14 cycles and never transitioned
[PROBLEM] timid_bursts         bursts averaged 1.0 actions
[HINT]    vision_every_cycle   vision ran on 100% of cycles

The distinction it exists for: a burst that never ran and a burst that ran and did nothing look identical in a summary and have unrelated causes. The first is policy or grammar. The second is window focus, pointer mode, or an app that ignores synthetic input. Diagnose separates them by checking whether the frame actually changed after execution.

Apply the highest-severity finding, re-run, diagnose again. One change at a time — several at once makes the next diagnosis uninterpretable.

Lessons persist across sessions, keyed by target, so the second playbook for a game starts from the probe coordinates and working label names the first one discovered:

voltage_learn(target="minecraft", kind="label",
              note="vision reports 'hotbar' reliably but never 'crosshair'")
voltage_learn(target="minecraft", kind="timing",
              note="block placement needs w:100 after right click or it does not register")

Safety

The thing generating inputs is a 1.7B model. The governor is the layer that is not advisory: every burst passes through it, including reflex bursts and ones you wrote yourself.

  • dry_run is the default. A new Playbook parses, checks and journals every burst while touching nothing.

  • Whole-burst refusal. Half-executing an intended sequence is worse than not executing it.

  • deny_labels refuses a click on anything called Delete / Confirm / Purchase / Allow, wherever it appears — this is what catches the dialog that pops up somewhere unexpected.

  • Region fencing, key allowlists, denied chords (ctrl+alt+delete, alt+f4), denied text patterns (rm -rf, sudo), burst-size and inputs-per-second caps.

  • Four independent stops: voltage stop (writes a file — works over SSH), a deadman timer that fires on its own thread if the loop wedges, physical input contention (touch the real mouse and it stops), and Playbook budgets.

  • Held keys are always released — on abort, on crash, on timeout. A run interrupted between d:shift and u:shift must not leave Shift stuck down.

Install

From nothing to working, two commands.

Linux / macOS

git clone https://github.com/casualkre/voltage-input-mcp && cd voltage-input-mcp && ./install.sh

Windows (PowerShell)

git clone https://github.com/casualkre/voltage-input-mcp; cd voltage-input-mcp; powershell -ExecutionPolicy Bypass -File .\install.ps1

Then, on either:

voltage setup

install.sh handles Python, system packages, the venv and your PATH, and prints the exact sudo lines for anything needing root rather than asking for it. voltage setup then detects what you already have, downloads only what is missing, starts the model servers, and registers with your AI client — running each step, not describing it. Ten to twenty-five minutes, nearly all of it download time. Safe to re-run; it picks up where it left off.

Then just run:

voltage

Setup detects what you already have and continues from there. It does not assume a starting point: it probes your OS, GPU, whether llama.cpp or Ollama is installed, which models are already pulled, whether input and capture work, and whether the MCP server is registered — then plans only the steps that are actually left, and says which need a decision from you and which it can just do. If you already have Ollama, it uses it. If you have neither backend, it explains the trade-off in two lines and lets you pick.

With no arguments that opens an interactive console: live status, guided setup that fixes whatever is not ready in dependency order, a model switcher, a config editor, one-key registration with Claude Code, and diagnostics. Every subcommand below still works non-interactively, so scripts and CI are unaffected.

 ██╗   ██╗ ██████╗ ██╗  ████████╗ █████╗  ██████╗ ███████╗
 ██║   ██║██╔═══██╗██║  ╚══██╔══╝██╔══██╗██╔════╝ ██╔════╝
 ██║   ██║██║   ██║██║     ██║   ███████║██║  ███╗█████╗
 ╚██╗ ██╔╝██║   ██║██║     ██║   ██╔══██║██║   ██║██╔══╝
  ╚████╔╝ ╚██████╔╝███████╗██║   ██║  ██║╚██████╔╝███████╗
   ╚═══╝   ╚═════╝ ╚══════╝╚═╝   ╚═╝  ╚═╝ ╚═════╝ ╚══════╝

 ── status ──────────────────────────────────────────────
   ok   input device      /dev/uinput
   ok   vision model      http://127.0.0.1:8080
   ok   actuator model    http://127.0.0.1:8081
   ok   mcp registered    claude mcp list
   ok   voltage on PATH   ~/.local/bin/voltage

Experimental profiles

Listed separately in voltage → models, each behind a warning you must accept. They exist because the measurements make the trade-offs predictable: decode dominates at ~22 ms/token and scales with active parameters, so shrinking the models really does raise the loop rate. What it costs is grounding.

profile

models

VRAM

trade

hyper

SmolVLM-500M + Qwen3-0.6B

~2.2 GB

3–4× the loop rate, grounding barely works

fast

Qwen2.5-VL-3B + Qwen3-0.6B

~3.8 GB

faster decisions, grounding unchanged

beefy

Qwen2.5-VL-32B + Qwen3-14B

~34 GB

best grounding, 1–2.5 s/cycle

beefy_moe

Qwen2.5-VL-32B + Qwen3-30B-A3B

~43 GB

30B capacity at ~3B decode speed

cpu_only

3B + 0.6B on CPU

none

works without a GPU, seconds per cycle

Two worth singling out:

hyper is the dangerous one. SmolVLM-500M is not a grounding model. It will return boxes and they will often be wrong — and a wrong box is a click in the wrong place, not a graceful degradation. Only use it where watch is empty (probes and reflexes doing the real work) or where every click is fenced by click_allow_regions and require_target_element.

beefy_moe is the interesting one. Qwen3-30B-A3B is a mixture of experts with ~3B active parameters, so it decodes at roughly 3B speed while reasoning with 30B capacity — and decode is precisely what bottlenecks this loop. A much better actuator than a dense 14B at similar latency. The catch is memory: only the active experts are fast, not the weights, so all 30B still has to be resident.

recommend() never returns an experimental profile, and a test enforces that.

Custom model profiles

The built-in profiles cover the machines this was developed against, not yours. Add your own from voltage → profiles, or by editing profiles.toml next to your config:

[my_rig]
description = "RTX 4090"

[my_rig.vision]
hf_repo = "ggml-org/Qwen2.5-VL-7B-Instruct-GGUF"
hf_file = "Qwen2.5-VL-7B-Instruct-Q4_K_M.gguf"
mmproj_file = "mmproj-Qwen2.5-VL-7B-Instruct-Q8_0.gguf"
params_b = 7.0
weights_mb = 4700
n_ctx = 4096
port = 8080

[my_rig.actuator]
hf_repo = "unsloth/Qwen3-4B-Instruct-2507-GGUF"
hf_file = "Qwen3-4B-Instruct-2507-Q4_K_M.gguf"
params_b = 4.0
weights_mb = 2500
port = 8081

Custom profiles merge over the built-ins by name, so naming one lean retunes the built-in without forking the package. Use ollama_tag instead of hf_repo/hf_file for the Ollama backend.

One slot is picky and one is not. Vision must be able to emit grounded bounding boxes on request — Qwen2.5-VL, Qwen3-VL, InternVL, MiniCPM-V and UI-TARS all can; a general captioner will describe your screen beautifully and put the boxes in the wrong place. The actuator is forgiving: under a GBNF grammar it is choosing among a handful of legal continuations, so almost any competent 1B+ instruct model works.

Shell commands vs MCP tools

Two different surfaces, and mixing them up is the usual first stumble:

invoked

looks like

shell command

typed in a terminal, with a space

voltage doctor

MCP tool

asked of Claude, with an underscore

voltage_doctor

voltage_doctor is a tool name in Claude's namespace, not a program on disk. Typing it in a terminal will always say "unknown command". Ask Claude to run it instead.

That checks /dev/uinput access, installs system dependencies, creates the venv, and prints what is missing. Then:

./scripts/fetch-models.sh lean && ./scripts/serve.sh lean
.venv/bin/voltage doctor

If the task has any timing in it, also check what the fast layer actually achieves here. doctor predicts a rate from one capture timing; this runs the real loop against your real screen for five seconds and reports what happened. It injects nothing.

.venv/bin/voltage reflex
  requested       20 Hz
  measured        19.8 Hz over 99 ticks
  tick cost       1.80 ms p50, 3.60 ms p95
  latch events    1  (engaged and released as the guard flipped)
  starved         0

  OK  the fast layer holds 19.8 Hz here. Reflex and hold rules will react within ~51 ms.

Connecting it to a client

voltage connect

Shows what is set up, the live URLs, whether the models are up, and whether the server is registered — then gives copy-paste steps per client with your real paths and environment already filled in:

voltage connect --client claude-desktop
voltage connect --client cursor
voltage connect --json            # just the mcpServers entry

Covered: Claude Code, Claude Desktop, claude.ai custom connector, Cursor, Windsurf, Zed, and a generic mcpServers block for anything else. The same thing is screen 4 in the voltage console, which can also write the Claude Desktop config for you (backing up the existing file first, and refusing to touch it if it is not valid JSON).

Every generated config carries the session environment explicitly, because that is the thing that goes wrong: a server registered from a shell without DBUS_SESSION_BUS_ADDRESS connects successfully and is silently blind — input works, screen capture does not. voltage connect detects that case and says so.

Adding it as a custom connector

Clients that add MCP servers by URL need HTTP rather than stdio:

voltage serve --http

Then add http://127.0.0.1:8765/mcp as a custom connector.

Binding is restricted to loopback, and --allow-remote is required to change that. That is not boilerplate: this server exists to move the mouse, press keys and read the screen, and MCP has no authentication of its own. A non-loopback bind publishes unauthenticated remote control of your desktop. If you genuinely need it, put an authenticating reverse proxy in front and understand that whoever reaches the port owns the machine.

Launching from an MCP client

MCP clients start servers with a sanitized environmentPATH, HOME and little else. That is a sensible default and it breaks screen capture, because reaching the compositor needs DBUS_SESSION_BUS_ADDRESS and WAYLAND_DISPLAY. Input injection still works without them (uinput is a device file, not a session service), so the failure looks confusingly partial: bursts execute, screenshots do not.

Pass them through explicitly:

claude mcp add voltage-input \
  -e WAYLAND_DISPLAY="$WAYLAND_DISPLAY" \
  -e DISPLAY="$DISPLAY" \
  -e DBUS_SESSION_BUS_ADDRESS="$DBUS_SESSION_BUS_ADDRESS" \
  -e XDG_RUNTIME_DIR="$XDG_RUNTIME_DIR" \
  -- /absolute/path/to/voltage-input-mcp/.venv/bin/voltage-input-mcp

voltage_doctor reports exactly which of these are missing, so if capture is failing that is the first place to look.

Platforms

input

capture

text

Linux

/dev/uinput (kernel evdev — works under X11, Wayland, the console, and in games reading raw input)

portal→PipeWire, KWin DBus, grim, X11

scancodes, clipboard fallback for non-ASCII

Windows

SendInput

GDI BitBlt

KEYEVENTF_UNICODE — layout-independent

Everything above the input sink — burst scheduling, timing, held-key tracking, the safety governor, the whole runtime — is shared. Each platform implements five methods (key, button, move_abs, move_rel, scroll); see inputs/sink.py.

Two asymmetries worth knowing:

  • Typing is more correct on Windows. KEYEVENTF_UNICODE delivers a UTF-16 code unit with no keyboard layout involved. Linux uinput sends scancodes, so punctuation on a non-US layout comes out wrong — silently — which is why the clipboard fallback exists there and isn't needed on Windows.

  • Capture is more capable on Linux. GDI BitBlt cannot see some hardware-overlay video and full-screen exclusive games; those capture black. Run such games in borderless windowed mode.

On Windows, SendInput cannot drive windows owned by an elevated process (UIPI) — this fails silently, so voltage doctor reports your elevation state. DPI awareness is declared at import; without it every coordinate is wrong on a scaled display.

Requirements

  • Linux (any display server) or Windows 10/11

  • Python 3.11+

  • A GPU with ~5 GB free for the lean profile; voltage profiles shows what fits yours

  • llama.cpp for the fast path, or Ollama for a slower zero-build path

Verified end-to-end on KDE Plasma 6 / Wayland / CUDA / Python 3.14. The Windows paths are implemented and type-checked but have not been run on a Windows machine — treat them as untested and report what breaks.

The orchestrator is told which build it is driving

The same Playbook is sound on one configuration and wrong on another, and a remote model cannot see which. So the server's MCP instructions are built at startup from the live configuration, and carry only the lines that change how a Playbook should be written:

ACTIVE BUILD: Linux · llamacpp · profile lean
  vision Qwen2.5-VL-3B-Instruct · actuator Qwen3-1.7B
  loaded: Qwen2.5-VL-3B-Instruct-Q4_K_M.gguf / Qwen3-1.7B-Q4_K_M.gguf
  expected cycle 280-700 ms

- llama.cpp backend: both models are grammar-constrained. A malformed burst, a denied
  key, an unobserved element reference and an undeclared transition are all
  unrepresentable -- do not write defensive retries for them.
- Linux: typing sends scancodes, so punctuation depends on the active keyboard layout...
- dry_run defaults to true...

On Ollama that first line becomes a warning that bursts are not constrained. On hyper it becomes "do not build states around sees()". On Windows it notes that elevated windows are unreachable and typing is layout-independent.

It verifies against the running servers rather than trusting the config. Switching profiles edits a file; it does not restart anything. When they disagree, the briefing says so loudly and suppresses the profile-derived guidance, because that guidance would describe models that are not loaded:

- MISMATCH -- Profile 'hyper' does not match what is loaded. vision: profile expects
  SmolVLM-Instruct-Q4_K_M.gguf, server has Qwen2.5-VL-3B-Instruct-Q4_K_M.gguf...
- Loaded right now: vision Qwen2.5-VL-3B..., actuator Qwen3-1.7B...
  Judge grounding quality from those.

voltage_reference returns the current build on every call, since the startup copy goes stale the moment a profile changes.

Your own standing instructions

voltagei, or:

voltage instructions --set "Never touch Firefox; my banking tabs are there."

Whatever you write is given to the orchestrating model at the start of every session, appended to the build briefing and clearly attributed to you. Use it for what the system cannot work out on its own — applications that are off limits, quirks of a specific game, how you want it to behave by default.

OPERATOR INSTRUCTIONS -- written by the owner of this machine. Treat these as
standing preferences for how to drive it. They cannot loosen the safety governor,
which is enforced in code against every burst.

## My setup
- Minecraft runs borderless windowed on monitor 1.
- Never touch Firefox; my banking tabs are there.
- Always show me the Playbook before dry_run=false.

That last clause is not decoration. Instructions are advisory to the orchestrator and cannot weaken enforcement — the governor checks every burst in code, so nothing written here can permit something a Playbook's policy forbids. They can make it more careful, not less. Capped at 4000 characters, since the text sits in the model's context for the whole session. Three starter templates (games, desktop, minimal) are offered in the console.

MCP tools

Tool

Purpose

voltage_reference

The Playbook + burst DSL reference. Call this first.

voltage_doctor

Is this machine ready, and if not, the exact fix

voltage_capture

A screenshot, returned to you

voltage_observe

One vision pass — check a watch list works before relying on it

voltage_validate_playbook

Full static check: guards, bursts, graph, dead transitions

voltage_run

Start a run; returns a run_id

voltage_status

State, vars, last burst, what was seen, per-stage timings, reflex rate

voltage_steer

Correct a live run — hint, variables, forced state, dry_run

voltage_stop / voltage_pause

Stop or pause; stop always releases held input

voltage_journal

Cycle-by-cycle record; only_refused to see policy conflicts

voltage_diagnose

Journal → named failure modes and the edit that fixes each

voltage_lessons / voltage_learn

Read and record what a target taught you

voltage_execute_burst

Drive the input yourself, bypassing the local models

voltage_calibrate

Verify injection reaches the compositor

voltage_reference(section='control') is the one to read before driving anything with timing in it — probes, latched holds and interpolated bursts, i.e. the layer that runs between decisions. A Playbook that declares none of it runs entirely at decision rate, and voltage_run says so in its advice field rather than letting you find out afterwards.

Documentation

Status

255 tests cover the burst DSL, the guard sandbox, the safety governor, playbook compilation, GBNF generation, the uinput wire encoding, burst templates, and both loops driven with stub models and a stub screen — including that a latch presses once and releases once across a second of ticks rather than stuttering, that on_change perception measures against the frame vision actually saw, and that a stop never leaves input held.

The MCP server has been driven end-to-end over stdio by a real client, and input injection has been verified against a live game: uinput events reach a Roblox client through its anti-cheat, and the executor's drag interpolation is what made drags register at all.

What is not covered by the test suite is a live model, which needs llama.cpp built and weights fetched — scripts/ sets that up.

Order of operations from here:

./scripts/setup.sh          # reports what needs sudo, doesn't run it
./scripts/build-llama.sh    # ~15 min with CUDA
./scripts/fetch-models.sh lean
./scripts/serve.sh lean
.venv/bin/voltage doctor    # should now say READY

Then in an MCP client: voltage_calibrate (watch the cursor actually move), voltage_observe (check the vision model finds your labels), then a dry_run Playbook and read voltage_journal before ever setting dry_run=false.

Authorship

Written end to end by Claude Opus 5 (Anthropic) in a single session — architecture, implementation, tests, and documentation. A human specified the idea, set the constraints (KDE Wayland, 6 GB VRAM, "faster than computer-use"), and reviewed the result, but did not write the code.

The platform findings baked into this repo came from probing the machine during the build rather than from assumption — that KWin refuses ScreenShot2 to non-allowlisted executables, that grim can't work under KWin, that MCP clients sanitize away the session bus. Each is documented at the point in the code where it forced a decision.

LICENSE names no individual as copyright holder, and the reasoning is written out there.

License

MIT. See LICENSE.

Available Tools

16 tools
voltage_calibrateA
Destructive

Verify that input injection actually reaches the compositor.

Creates the virtual devices, moves the pointer to three known points, and captures after each to confirm the cursor moved. Reports whether absolute positioning works or whether the relative fallback is needed -- which cannot be known without trying, since it depends on how libinput classified the virtual device.

Run this once per machine before trusting a real (non-dry-run) Playbook.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare destructiveHint=true and openWorldHint=true. The description adds valuable detail: it creates virtual devices, moves the pointer, and captures output—concrete side effects beyond the annotation. It also explains why these behaviors are unpredictable ('depends on how libinput classified the virtual device'), which aligns with openWorldHint. This goes beyond what annotations alone convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured. It opens with the core purpose, immediately explains what the tool does, then provides the rationale and usage timing. Every sentence earns its place—no fluff or repetition. It is front-loaded with the most critical information and stays focused.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's purpose, mechanism, side effects, and when to run it. It also acknowledges an output summary (absolute vs relative fallback). However, it omits any explanation of the dry_run parameter, which is a key input that affects behavior. Given the presence of an output schema, return format doesn't need detailing, but the parameter gap leaves the description incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, dry_run, is entirely undocumented in the description. The schema gives its name, type, default, and requirement status but provides no semantic meaning. The description mentions 'non-dry-run' indirectly but never explains what dry_run does, when to set it to true, or what the difference is. With 0% schema description coverage, this is a significant gap—the description fails to compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's specific purpose: to verify that input injection reaches the compositor. It describes the concrete steps (creating virtual devices, moving pointer to three points, capturing) and the distinctive outcome (determining whether absolute positioning or relative fallback is needed). This distinguishes it from the many sibling tools, even without naming them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear usage context: 'Run this once per machine before trusting a real (non-dry-run) Playbook.' It explains that this is a one-time calibration step and that the result cannot be known without trying, which implies this is the tool to use for that purpose. It doesn't explicitly mention alternatives or when not to use it, but the guidance is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voltage_captureA
Read-only

Take a screenshot and return it to you directly.

Use this to see the screen yourself -- before writing a Playbook, to pick coordinates for probes and click regions, or to work out why a run went wrong. This does not involve the local vision model.

region is [x, y, width, height] in desktop pixels; omit for the whole desktop.

ParametersJSON Schema
NameRequiredDescriptionDefault
regionNo
max_widthNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the description's job is to add behavioral context. It does so by specifying 'return it to you directly' and explicitly noting it does not use the local vision model—information not in annotations. No contradictions exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is tightly written: a clear one-sentence purpose, a brief usage block, and a one-line parameter definition. No fluff or redundancy. The key purpose is front-loaded, and every sentence contributes value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple screenshot tool, the description covers usage, region format, and direct return. However, the `max_width` parameter remains unexplained; an agent might not know how to set it or its effect on output. Given that the tool has no output schema, a bit more detail on max_width would make it fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explains the `region` parameter fully: it is [x, y, width, height] in desktop pixels and can be omitted for the whole desktop. However, `max_width` is not described at all; the schema only shows it is an integer with default 1280. Since schema description coverage is 0%, the description should compensate for both parameters, but it only covers one.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence 'Take a screenshot and return it to you directly' uses a specific verb and resource, and clearly states the result. It also distinguishes itself from the vision-model-based sibling by saying 'This does not involve the local vision model,' which makes its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides concrete use cases: 'before writing a Playbook, to pick coordinates for probes and click regions, or to work out why a run went wrong.' This tells the agent exactly when to invoke it. It does not explicitly mention alternatives or when not to use it, but the context is clear enough to guide selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voltage_diagnoseA
Read-only

Explain why a run behaved as it did, and what to change.

Call this instead of reading the journal by hand. It computes what the journal implies but does not state -- watch labels the vision model never once reported, guards that never evaluated true, whether bursts actually moved the screen, whether the actuator is chaining or emitting one action at a time -- and returns each with the specific edit that fixes it, ordered blocker-first.

The distinction it exists for: a burst that never ran and a burst that ran and did nothing look identical in a summary and have unrelated causes. The first is policy or grammar; the second is window focus, pointer mode, or an application that ignores synthetic input.

Apply the highest-severity finding, re-run, diagnose again. Changing several things at once makes the next diagnosis uninterpretable.

ParametersJSON Schema
NameRequiredDescriptionDefault
run_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the description doesn't need to restate safety. It adds valuable behavioral detail: it computes implicit journal information, returns specific edits ordered blocker-first, and distinguishes between a burst that never ran vs. ran but did nothing. This goes well beyond the annotation, providing non-obvious nuances.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a crisp summary, then explains the key distinction and ends with an actionable workflow. Every sentence earns its place; there is no fluff or redundancy. Structure is clear and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists (the description doesn't need to detail return structure) and annotations cover safety, the description covers the essential context: the diagnostic purpose, the key distinction between two root causes, and the iterative workflow. The only minor gap is the run_id parameter semantics, which slightly detracts from completeness for an otherwise simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden for the single parameter run_id. It never mentions run_id, its format, how to obtain it, or whether it's required (though the schema marks it optional). The name 'run_id' is self-explanatory by convention, but the description provides no explicit guidance, and with only one parameter to cover, this is a noticeable gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Explain why a run behaved as it did, and what to change.' It then contrasts itself with reading the journal, making its purpose distinct from voltage_journal. No ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly instructs to call this instead of reading the journal by hand, giving clear when-to-use context. It also provides a workflow (apply highest-severity finding, re-run, diagnose again). However, it doesn't name alternative siblings like voltage_doctor or voltage_observe, or describe conditions where those might be more appropriate, so it stops short of complete guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voltage_doctorA
Read-only

Check that everything needed for a run is present and working.

Reports the session type, input-device permissions, which capture backends work, detected screen geometry, GPU memory versus the selected model profile, and whether both model backends respond. When something is missing it returns the exact command to fix it. Call this before the first run on a machine.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true and openWorldHint=false, establishing a safe, closed-world read operation. The description adds valuable context beyond safety: it lists the specific components checked (session type, input-device permissions, capture backends, screen geometry, GPU memory vs model profile, both model backends) and states that it returns fix commands. This informs the agent about the scope of the check and the nature of the response, which is more than annotations provide. No contradiction found.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, tightly packed with information. The first sentence gives the core purpose, the second enumerates the checks and the fix-command behavior, and the third provides usage timing. Every sentence earns its place, and the most important information (purpose and when to use) is front-loaded. There is no fluff or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-argument diagnostic tool, the description is comprehensive. It clearly states what is checked, the response characteristic (returns fix commands), and when to call it. An output schema exists (though not shown), so the description doesn't need to detail return formats. Given the complexity of the checks and the existence of a schema, nothing essential is missing for the agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema shows none. The description implicitly confirms this by stating 'Call this before the first run on a machine' with no mention of inputs. Since there are no parameters to explain, the description effectively communicates that it requires no configuration. This is a perfect fit for the no-parameter case, and the baseline of 4 is exceeded because the description makes the absence of parameters obvious.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Check that everything needed for a run is present and working.' It specifies a concrete action (check) and a distinct resource (run prerequisites). It differentiates from siblings like voltage_status and voltage_diagnose by enumerating the exact checklist items (session type, permissions, capture backends, geometry, GPU memory, model backends). This makes it unambiguous which tool to select for pre-flight validation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit timing guidance: 'Call this before the first run on a machine.' While it doesn't mention alternatives or when not to use it, the instruction is clear and actionable. It implies this is a single-use setup check, not a repeated monitoring tool. The guidance is sufficient for the agent to decide when to invoke it, though lacking explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voltage_execute_burstA
Destructive

Execute one input burst yourself, bypassing the local models entirely.

For moments that need your judgement rather than the actuator's: opening the right application, clicking a specific confirmed target, typing something exact. Also the fastest way to sanity-check that input injection works at all.

Syntax: m:640,360;c:l;w:120;t:"hello";k:enter. Call voltage_reference for the full list. The safety policy still applies. Defaults to dry_run, so pass dry_run=false to actually inject.

ParametersJSON Schema
NameRequiredDescriptionDefault
burstYes
labelNomanual
dry_runNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint: true, readOnlyHint: false, and openWorldHint: true. The description adds critical behavioral context: it defaults to dry_run ('pass dry_run=false to actually inject') and notes the safety policy. It also explains that this is a manual override path. These details go beyond the annotations and inform the agent about side effects and prerequisites.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and efficient: it leads with the core action, then gives usage scenarios, then provides a syntax example and necessary caveats. Every sentence earns its place, and the dry_run warning is front-loaded within the critical context. No fluff or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (custom syntax, safety policy, dry_run default) and that an output schema exists, the description covers the essential aspects: purpose, when to use, how to construct the burst (via example and reference), and the dry_run behavior. The only gap is a full in-place explanation of the syntax and label, but the reference to voltage_reference and the presence of an output schema mitigate this. Overall, it is nearly complete for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It provides a concrete syntax example (`m:640,360;c:l;w:120;t:"hello";k:enter`) and explains the dry_run parameter clearly. However, burst syntax is not fully documented (only a pointer to voltage_reference) and the label parameter is not explained beyond its default. This is partial compensation—helpful but not exhaustive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Execute one input burst yourself') and the resource (burst), and immediately differentiates from siblings by emphasizing 'bypassing the local models entirely' and 'moments that need your judgement rather than the actuator's'. It also names the exact use case (opening applications, clicking confirmed targets, typing exact text) and points to voltage_reference for full syntax, making the purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool ('For moments that need your judgement rather than the actuator's', 'the fastest way to sanity-check that input injection works at all'), implies alternatives by referencing voltage_reference for syntax, and reminds that 'the safety policy still applies'. This gives an agent clear decision-making guidance without ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voltage_journalA
Read-only

Read a run's cycle-by-cycle record: what was seen, decided, refused, executed.

only_refused=true filters to cycles the governor blocked, which is the fastest way to see where a Playbook's policy and the actuator's intentions disagree.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
run_idNo
only_refusedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint=true, and the description aligns with that by saying 'Read'. It adds value by explaining the behavioral semantics of the journal contents and the meaning of 'only_refused', which goes beyond the raw annotation. No contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two focused sentences with the core purpose front-loaded and the filter tip as a concise, well-formatted follow-up. No filler or repetition, and the code-styled parameter reference is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return format is covered. However, the description fails to explain the run_id parameter, which is central to selecting a run, and gives no mention of limit. The tool is simple with all optional params, but the missing parameter descriptions leave a gap in usability.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains only_refused in detail, but completely omits run_id and limit. run_id is critical for identifying which run to read, and limit is a common but still undocumented control. The description is inadequate for a zero-coverage schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Read') and resource ('a run's cycle-by-cycle record'), and lists the exact contents: what was seen, decided, refused, executed. This clearly distinguishes it from siblings like voltage_observe or voltage_diagnose by framing it as a chronological journal rather than a live observation or diagnostic.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit context for using the 'only_refused' filter and explains the fastest way to see policy/actuator disagreement. While it doesn't mention sibling tools for comparison, the usage hint is concrete and actionable, and the description clearly implies this tool is for inspecting historical decisions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voltage_learnA
Destructive

Record something worth carrying to the next run against this target.

Write these as concrete, reusable facts, not narration:

good "the health bar is at x=120..300, y=1010; region_mean on red channel works" good "vision reports 'hotbar' reliably but never 'crosshair' -- do not watch it" good "block placement needs w:100 after the right click or it does not register" bad "the run failed" bad "tried again and it worked better"

kind groups them: label (what the vision model does and does not recognise), timing (waits that a specific application needs), policy (what the governor blocked and whether that was right), burst (a sequence that works), observation (anything else).

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoobservation
noteYes
targetYes
playbookNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate a mutating, potentially destructive action (readOnlyHint=false, destructiveHint=true); the description does not contradict these and adds that notes are stored against a target. It does not describe side effects or permissions, but given annotation coverage it provides acceptable additional context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently structured: it opens with the core purpose, gives clear good/bad examples, and ends with a concise classification of kind values. Every sentence adds value, and the format is well-balanced for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool that records notes, the description covers the purpose, content quality, and kind taxonomy, which is sufficient for basic use. Gaps remain around `playbook` and exact behavior (e.g., confirmation, persistence), but the presence of an output schema and annotations mitigates these. Overall it is fairly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description compensates by explaining the meaning of `kind` (label, timing, policy, burst, observation) and prescribing the format for `note` via good/bad examples. It leaves `target` and `playbook` undefined, but `target` is self-evident and `playbook` remains ambiguous, so coverage is partial but effective.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool records reusable facts against a target, with concrete good/bad examples that make the purpose unmistakable. It does not explicitly differentiate from sibling tools like voltage_lessons, but the 'carrying to the next run' phrasing is specific enough to convey its unique role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides strong guidance on what to record (concrete facts, not narration) and explains the kind grouping, but it never mentions alternative tools or conditions under which to avoid this tool. Usage context is implied rather than explicit, and no exclusions or comparisons are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voltage_lessonsA
Read-only

Recall what previous runs learned about driving something.

Call this before writing a Playbook for a target you have driven before. Lessons persist across sessions and are keyed by target ("minecraft", "roblox", "dolphin"), so a new Playbook can start from what the last one discovered -- which labels the vision model actually recognises, where the HUD probes are, what timing the game needs -- rather than rediscovering it.

Omit target to see everything recorded so far.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
targetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true and the description aligns with that (no mutation implied). The description adds valuable behavioral context: lessons persist across sessions, are keyed by target, and include specific types of information (labels, HUD probes, timing). This goes beyond the annotation by describing persistence and content, which is useful for setting expectations about what the tool returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded with the purpose. It uses bold for emphasis ('before writing a Playbook') and keeps each sentence purposeful. There is no filler or redundant explanation. The structure guides the reader from what the tool does, to when to use it, to how to filter results.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema (as indicated by the context), so return values are documented elsewhere. The description provides sufficient context for an agent to decide when to call it: it explains the purpose, when it is appropriate (before writing a Playbook for a previously driven target), and how to control scope with the target parameter. No critical information is missing, given the read-only annotation and output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, so the description must compensate. It clearly explains the `target` parameter (keyed by target, omit to see everything) and gives examples of valid values. However, it does not mention the `limit` parameter at all, leaving its semantics to inference from the default value of 30. This is a partial compensation but not complete for both parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Recall what previous runs learned about driving something.' It then gives concrete examples of lesson content (labels, HUD probes, timing), which makes the tool's purpose unambiguous and distinct from any other sibling. The behavior is clearly scoped to recalling learned lessons, not a general-purpose query.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly instructs when to use the tool: 'Call this **before writing a Playbook** for a target you have driven before.' It also explains the benefit (start from previous discoveries rather than rediscovering) and provides parameter guidance: 'Omit `target` to see everything recorded so far.' This gives an agent clear, actionable context for choosing this tool over alternatives like voltage_learn.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voltage_observeA
Read-only

Run one vision pass and return grounded elements in screen coordinates.

watch is the closed vocabulary the vision model may use -- it can only report labels from this list, so name the things your Playbook's guards will test for.

Use this to check that the vision model can actually find what a state depends on before committing to it in a Playbook. If an element does not come back here, a sees(...) guard on it will never fire.

ParametersJSON Schema
NameRequiredDescriptionDefault
watchYes
regionNo
read_textNo
max_elementsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey read-only and closed-world hints. The description adds valuable behavioral context: it clarifies that 'watch' is a closed vocabulary, that the tool runs a single pass, and that missing elements imply guards never fire. This goes beyond the annotations and provides actionable insight into the tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with two short paragraphs that are front-loaded with the core purpose. Every sentence adds distinct value—stating the action, vocabulary constraint, and practical implication. There is no fluff or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description captures the tool's primary purpose and a key behavioral consequence, and an output schema exists so return values are already documented. However, it does not explain non-required parameters (region, read_text, max_elements), which are likely needed for correct invocation. This gap reduces completeness, though the core use case is well covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains 'watch' as the closed vocabulary, which is essential, but it omits any explanation for 'region', 'read_text', and 'max_elements'. With only one parameter addressed, the description fails to adequately clarify the remaining parameters, leaving the agent with insufficient guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: 'Run one vision pass and return grounded elements in screen coordinates.' It also explains a distinct use case—checking if the vision model can find elements before committing to a Playbook. While it doesn't explicitly contrast with sibling tools, the purpose is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit context for when to use the tool: 'Use this to check that the vision model can actually find what a state depends on before committing to it in a Playbook.' This is a clear directive without naming alternatives, but it effectively guides the agent on ideal usage scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voltage_pauseB
Destructive

Pause or resume a run. Held input is not released, so a paused run can continue.

ParametersJSON Schema
NameRequiredDescriptionDefault
resumeNo
run_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true, so the mutation nature is disclosed. The description adds the specific behavior that held input is retained, which goes beyond the annotations and gives the agent useful context about the pause/resume semantics. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero filler. The core action is front-loaded ('Pause or resume a run') and the clarifying detail about held input follows immediately. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the existence of an output schema and simple optional parameters, the description is far from complete. It lacks usage guidance, parameter semantics, and any mention of prerequisites or side effects beyond the held-input note. The agent would need to guess how to set 'resume' or when to pass 'run_id'.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% — neither 'resume' nor 'run_id' is explained in the schema. The description does not mention any parameters at all, so the agent has no idea that 'resume' likely indicates whether to resume or pause, or how 'run_id' selects the run. With two parameters and zero coverage, the description must compensate but fails completely.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear action (pause or resume), a specific resource (a run), and adds a key nuance (held input is not released). It distinguishes implicitly from voltage_stop but does not name sibling alternatives, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives like voltage_stop or voltage_run. The note about held input hints at a use case but does not state conditions or exclusions, leaving the agent to infer when pause is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voltage_referenceA
Read-only

Return everything needed to author and iterate on a run.

Call this before your first Playbook. Sections:

loop the learning loop -- how to go from a failed run to a working one, and what each failure mode actually means. Read this second. bursts the burst cookbook: how to chain inputs well, timing rules, ready-made patterns for desktop and for games, and the antipatterns that waste cycles. Read this if bursts are coming out one action at a time. burst the raw burst syntax playbook the state-machine JSON schema guards expression functions for transitions and reflexes example a complete working Playbook

ParametersJSON Schema
NameRequiredDescriptionDefault
sectionNoall

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the description need not restate safety. It adds value by explaining the content structure and the purpose of each section, which helps the agent understand what the tool actually returns. However, it does not disclose any potential caveats (e.g., response size, format specifics), though those may be covered by the output schema. The added context justifies a score slightly above baseline.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently organized: a one-line purpose, then a bulleted list of sections with clear labels and explanations. It front-loads the main instruction and uses formatting to allow fast scanning. No sentence is redundant; each adds useful detail about content or usage.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a reference tool, the description covers all essential information: what it returns, when to call it, what each section contains, and even contextual reading order. The read-only behavior is covered by annotations, and the output format is presumably defined by the output schema (present signal). Nothing necessary for an agent to select and invoke this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain the 'section' parameter. It does so comprehensively by listing each enum value and its meaning, and even offers reading-order guidance (e.g., 'Read this second', 'Read this if...'). This fully compensates for the schema gap, making the parameter self-documenting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Return') and a resource ('everything needed to author and iterate on a run'), then enumerates the sections returned. It clearly distinguishes itself from sibling tools (e.g., voltage_execute_burst, voltage_validate_playbook) by being a reference/documentation tool, not an execution or validation tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Call this before your first Playbook,' giving a clear when-to-use directive. It also provides conditional reading order (e.g., 'Read this if bursts are coming out one action at a time') and labels like 'the learning loop,' which help an agent decide which section to request. This is strong, situation-specific guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voltage_runA
Destructive

Start a Playbook. Returns immediately with a run_id; poll voltage_status.

dry_run overrides the Playbook's policy. Leave it unset for the Playbook's own setting, which defaults to true. A dry run does everything except inject input, so it is the correct way to check that your states, guards and transitions behave before letting it touch the machine.

target_period_s is the loop period. 0.5 is a good default; lower it for games, raise it for slow UI.

Stop a run with voltage_stop, adjust it live with voltage_steer. The run also stops on its own budget, on any physical keyboard or mouse input from the user, and on the panic file.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNo
playbookYes
keep_framesNo
target_period_sNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark destructiveHint and openWorldHint, and the description complements these by explaining concrete behaviors: immediate return with run_id, polling requirement, dry_run overriding policy, and the specific conditions that terminate a run. It adds value beyond annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently structured: the core action and return contract are front-loaded, followed by parameter guidance and termination behavior. Every sentence adds functional value, and no redundant or filler content is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the essential lifecycle: starting, monitoring, adjusting, and stopping. It explains dry-run semantics and stopping triggers. However, it does not describe the structure of the `playbook` object or the meaning of `keep_frames`, which may be important for correct invocation. The presence of an output schema and related tools (voltage_validate_playbook) partially mitigates this.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must explain parameters. It does explain dry_run (including override semantics and default behavior) and target_period_s (with recommended values), but it does not explain `playbook` (the required parameter) or `keep_frames`. Since playbook is central and the schema offers no description, this leaves a gap for an agent constructing a valid call.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Start a Playbook,' a specific verb-resource pairing that clearly states the tool's core function. It immediately distinguishes itself from siblings by mentioning polling with voltage_status, stopping with voltage_stop, and live adjustment with voltage_steer, so the agent can tell it apart without opening other schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit context for when to use dry_run ('the correct way to check that your states, guards and transitions behave before letting it touch the machine'), recommends values for target_period_s, and explains how to stop or adjust a run using sibling tools. It also details automatic stopping conditions (budget, keyboard/mouse input, panic file), giving clear operational guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voltage_statusA
Read-only

Poll a run: current state, variables, last burst, what the vision model sees.

Includes recent cycles, governor refusals, and per-stage timings so you can tell whether a slow loop is capture, vision, decision, or execution.

ParametersJSON Schema
NameRequiredDescriptionDefault
run_idNo
journal_tailNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the read-only nature is covered. The description adds useful context beyond annotations: the specific data included (recent cycles, governor refusals, per-stage timings) and its diagnostic intent. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no waste. The action is front-loaded ('Poll a run'), followed by a list of what it returns and the diagnostic purpose. Every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a monitoring tool with an output schema present, the description conveys enough about the returned data to be useful. However, the lack of parameter documentation is a notable gap that makes it slightly incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain either parameter (run_id, journal_tail) at all. While run_id is somewhat inferable from its name, journal_tail is completely unexplained. The description fails to compensate for the schema's lack of documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Poll') and resource ('a run'), then enumerates the returned data (state, variables, last burst, vision model view, cycles, refusals, timings). This clearly differentiates it from sibling tools like voltage_capture or voltage_execute_burst, which imply different actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies usage during a run to monitor state and diagnose slow loops ('so you can tell whether a slow loop is capture, vision, decision, or execution'). However, it doesn't explicitly state when not to use it or point to alternatives such as voltage_doctor or voltage_diagnose, leaving some ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voltage_steerA
Destructive

Correct a live run without restarting it.

hint is injected into the actuator's prompt as a supervisor note and persists until changed -- use it when the actuator is doing something legal but wrong. force_state jumps the machine on the next cycle. variables updates run variables. dry_run can be flipped either way mid-run.

ParametersJSON Schema
NameRequiredDescriptionDefault
hintNo
run_idNo
dry_runNo
variablesNo
force_stateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true, so the description adds some context: hint persists, force_state jumps the machine, variables updates, dry_run can flip. However, it does not disclose potential side effects, irreversibility, or prerequisites despite the destructive nature. It does not contradict the annotations, but the coverage is not thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: a one-sentence overview followed by per-parameter explanations. It is front-loaded with the main purpose, uses backticks for param names to aid scanning, and has no filler or redundant statements.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 5 parameters, zero schema descriptions, a destructive annotation, and an output schema, the description covers the core actions but misses run_id semantics, any warning about destructive consequences, and what the output schema contains. It is usable but not fully complete for safe and correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden for parameter meaning. It explains hint, force_state, variables, and dry_run, but omits run_id entirely, leaving its role merely implied by the phrase 'a live run.' This is a partial but incomplete compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb-resource pair: 'Correct a live run without restarting it,' which clearly distinguishes this tool from siblings like voltage_stop, voltage_pause, or voltage_run. It also enumerates the effects of each parameter, leaving no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a concrete usage scenario for `hint` ('when the actuator is doing something legal but wrong') and explains the function of each parameter (e.g., force_state jumps the machine, dry_run flips). It implies this tool is for mid-run corrections vs. restarting, but does not explicitly name alternatives or exclusion conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voltage_stopA
Destructive

Stop a run and release every held key and button.

Safe to call at any time, including while a burst is mid-flight -- the burst is interrupted and anything held is released.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNostopped by orchestrator
run_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, and the description adds concrete behavior: releases every held key/button and interrupts bursts. This goes beyond the annotation's generic destroy flag without contradicting it, giving the agent a more precise model of consequences.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences convey the purpose, safety, and edge-case behavior with zero filler. Information is front-loaded and every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple stop tool, the description covers the main behavior and safety profile. However, the lack of any parameter explanation means an agent might guess wrong about 'run_id' or 'reason' (e.g., whether run_id is required to target a specific run). Optional parameters with defaults mitigate, but the gap prevents full completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description does not explain either 'reason' or 'run_id.' The agent has no guidance on what these parameters control or when to provide them, though they are optional. With no parameter documentation anywhere, this is a notable gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Stop') and resource ('a run') while adding unique scope: 'release every held key and button.' This clearly distinguishes it from siblings like voltage_pause and voltage_run, and the mention of interrupting mid-flight bursts further clarifies its specific role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: 'Safe to call at any time' and explicitly covers the edge case of a mid-flight burst. However, it does not explicitly contrast with alternatives like voltage_pause or voltage_steer, leaving some ambiguity about when to choose this over a pause or a graceful stop.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voltage_validate_playbookA
Read-only

Fully check a Playbook without running it.

Validates the schema, compiles every guard expression, parses every burst, checks that transition targets and probe references exist, and reports unreachable states and dead transitions. Errors come back as a complete list, not one at a time.

Always call this before voltage_run. Warnings are worth reading: "tests for X but X is not in watch" means a transition that can never fire.

ParametersJSON Schema
NameRequiredDescriptionDefault
playbookYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only mark readOnlyHint:true. The description adds substantial behavioral detail: it returns a complete list of errors rather than one at a time, reports unreachable states and dead transitions, and explains how to interpret warnings. This fully complements the annotation and does not contradict it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is tightly written, starting with the primary purpose, then detailing checks, then error behavior, then usage guidance and a warning interpretation. Every sentence serves a purpose—no filler. It front-loads the action and clearly organizes information in short block format.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter validation tool with an output schema declared (though not shown explicitly), the description covers what it does, how it behaves, when to call it, and how to interpret results. With annotations covering read-only safety and the output schema expected to define return values, nothing essential is missing for an agent to decide and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema only defines a generic 'playbook' object with no description (0% coverage). The description compensates by making clear that the parameter is the Playbook being validated, and it describes what validation entails (schema, guards, bursts, references). This gives the agent enough context to pass the correct object, even without knowing its internal structure.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific, unambiguous statement: 'Fully check a Playbook without running it.' It enumerates the exact validations performed (schema, guards, bursts, transition targets, probe references) and reports unreachable states/dead transitions, distinguishing this validation tool from siblings like voltage_run and voltage_execute_burst. The verb 'validate' matches the tool name and clears its role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly guides usage with 'Always call this before voltage_run,' which states when to use this tool relative to its primary sibling. It also adds a practical hint about interpreting warnings (e.g., 'tests for X but X is not in watch'). It does not list explicit exclusions, but the directive is clear and directly actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 16 tool updatesv0.1.0
    • First observedvoltage_calibrate
    • First observedvoltage_capture
    • First observedvoltage_diagnose
    • First observedvoltage_doctor
    • First observedvoltage_execute_burst
    • First observedvoltage_journal
    • First observedvoltage_learn
    • First observedvoltage_lessons
    • First observedvoltage_observe
    • First observedvoltage_pause
    • First observedvoltage_reference
    • First observedvoltage_run
    • First observedvoltage_status
    • First observedvoltage_steer
    • First observedvoltage_stop
    • First observedvoltage_validate_playbook

TDQS

A4.1/5.0

Scored across 16 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: pre-flight checks, documentation, perception, input execution, validation, running, monitoring, control, and learning. Even similar tools like voltage_journal (raw data) and voltage_diagnose (analyzed explanation) are cleanly separated by their roles.

Naming Consistency5/5

All tools follow a consistent voltage_ prefix with a verb or verb_noun pattern (capture, execute_burst, validate_playbook, etc.). No mixed conventions or ambiguous verbs; naming is predictable and intuitive.

Tool Count5/5

16 tools is well-scoped for a comprehensive automation server covering setup, execution, monitoring, debugging, and learning. Each tool earns its place; the count supports the full workflow without bloat.

Completeness5/5

The tool surface covers the entire lifecycle: environment checks (doctor, calibrate), documentation (reference), perception (capture, observe), manual action (execute_burst), validation and execution (validate_playbook, run), live control (steer, stop, pause), monitoring (status, journal, diagnose), and cross-session learning (lessons, learn). No obvious gaps for the stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    A local autonomous AI agent that watches your screen, understands the visual layout, and executes native OS commands (clicking, typing) without cloud APIs.
    2
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to declaratively control web pages using real mouse and keyboard events via Chrome DevTools Protocol, without executing page JavaScript.
    9 npm
    1
    -
  • A
    license
    A
    quality
    B
    maintenance
    Enables low-cost agent models to control Windows applications through a compact, state-safe proxy over Open Computer Use, reducing model-visible context by up to 99.8% with support for record/replay and reusable UI component memory.
    5
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Lets AI agents see and control desktop applications through the accessibility layer, enabling clicking, typing, scrolling, dragging, and window/app management across macOS, Windows, and Linux entirely on the local machine.
    3
    MIT