otto*

Otto for agents · source build

Your agent thinks.
Otto handles
the steps.

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.

A shorter path from task to result
Your coding agent

Plans the task. Defines the allowed steps.

Otto

Runs local steps. Checks fresh native state.

Your selected app

Native controls. Explicit completion checks.

A compact receipt comes backVerified checks, actions taken, or a reason to stop.

Less back-and-forth.

72.31%

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

Inspect + six individual actions191,645
One Otto workflow53,072
Uncached input tokens
27,037 → 18,38432.00% fewer
Host tool calls
7 → 1
Independently correct fields
6 / 6 in both runs

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 evaluation

Keep the loop close to the work.

Send the useful context.

inspect returns compact app text and fresh control references. The host agent decides what belongs in the task.

Delegate a bounded sequence.

run_steps executes up to 16 exact steps locally. For semantic selection, optional delegate lets Jev choose from explicitly allowed actions.

Return what was checked.

Native value or text checks support a verified receipt. Partial work and uncertainty return to the host. No automatic submit is added.

A small bridge.
Your existing agent.

Build Otto on the computer you want to control, then connect its MCP server to Codex.

  • Node 24+ and native build tools
  • A local Mac or Windows desktop
  • Explicit app scope and OS permissions

Platform prerequisites

Already in a running task?

1

Build from source

TERMINAL
git clone https://github.com/NobleSpartan6/otto.git
cd otto
npm ci
npm run build

The agent bridge runs from this checkout. The installed desktop alpha is a separate workflow.

2

Generate your connection settings

TERMINAL
npm run setup:codex -- --allow-actions --trust-actions

This 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.

Choose different apps or enable Jev

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-actions

Exact 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.

3

Start with the disposable Mac fixture

TERMINAL · macOS
npm run demo:form

Ask 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.

Full setup, permissions, and troubleshooting ↗

Useful today. Explicit about its edges.

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.

Your scope stays in charge.

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.

Inspect it. Try it. Make it better.

The method, implementation, and evaluation are open.

Explore the source