Send the useful context.
inspect returns compact app text and fresh control references. The host agent decides what belongs in the task.
Otto for agents · source build
Give your coding agent scoped native desktop tools. Keep intermediate steps local and bring back checked results.
Open source. Local MCP. macOS & Windows.
Exact workflows need no extra model key.
Plans the task. Defines the allowed steps.
Runs local steps. Checks fresh native state.
Native controls. Explicit completion checks.
Measured, not estimated
fewer reported input tokens
in one measured task.
Including cached input. Two fresh Codex runs filled the same six-field Mac fixture.
Reported Codex input tokens · lower is fewer
One authored task, one trial per strategy, on macOS. Input includes cache; order and caching effects were not controlled. These are reported usage counters, not billed savings or a general performance claim. Neither workflow called Jev or another model inside Otto.
See the full evaluationThe method
inspect returns compact app text and fresh control references. The host agent decides what belongs in the task.
run_steps executes up to 16 exact steps locally. For semantic selection, optional delegate lets Jev choose from explicitly allowed actions.
Native value or text checks support a verified receipt. Partial work and uncertainty return to the host. No automatic submit is added.
Try it locally
Build Otto on the computer you want to control, then connect its MCP server to Codex.
git clone https://github.com/NobleSpartan6/otto.git
cd otto
npm ci
npm run buildThe agent bridge runs from this checkout. The installed desktop alpha is a separate workflow.
npm run setup:codex -- --allow-actions --trust-actionsThis prints configuration; it does not install it. Review and merge the generated table into your trusted project’s .codex/config.toml. Keep one mcp_servers.otto entry. Reload the MCP connection and verify its tools before use.
The default scope is Otto Form Fixture and TextEdit. --trust-actions preapproves act and run_steps tool calls inside that scope; the host still follows your task authorization. Omit it to keep normal host approval. On Windows, choose the exact name or ID of your intended running app.
Discover running apps, then generate settings for up to four exact names or IDs. An app name can resolve to a new process after restart; use a PID when you need one specific launch.
node dist-desktop/desktop/agent-server.js --list-apps
npm run setup:codex -- --help
npm run setup:codex -- --app-name "Your app" --allow-actionsExact actions and run_steps need no model key. Live Jev selection through delegate requires TYPESAFE_API_KEY in the MCP host environment. --forward-typesafe-key prints the variable name for forwarding; it never reads or prints the key. It does not reuse a key saved in the desktop app.
npm run demo:formAsk Codex to use Otto to fill the fixture with the literal values printed by the launcher, verify the fields, and stop without submitting. Grant native Accessibility to the actual launch context if needed. On Windows, use an app you intend to test; this fixture and the published usage comparison are macOS-only.
The bridge supports exposed native press, fill, and vertical-scroll controls, plus Enter, Escape, and Tab. Arbitrary visual grounding, drag, app launch, and a browser DOM driver are not available yet. Jev selects supplied actions; it does not generate typing text.
Only launcher-selected apps are exposed. Run one desktop executor at a time. Selected app text goes to your host agent and may reach its model provider. “Verified” covers the supplied native checks; it does not prove that a file was saved or a remote change persisted.
The method, implementation, and evaluation are open.