DEVELOPERS — INSTALL IT WHERE YOU WORK
The hosted connector wires both verbs — Ocean predicts, OtterScore decides — into the tools you already use, by URL, no package install. The native driver is the same contract with a body: signed, verifiable, discoverable.
Use it where you already work
SeaOtter is a hosted MCP server — connect by URL, no install. Ocean predicts where your agent's work goes next (ocean_register, ocean_predict, ocean_select); its Critic decides whether it counts (otter_grade). Your agent asks Ocean before a risky step, checks what it made, iterates until it clears the bar, and every verdict lands as a durable receipt on a tamper-evident audit trail. Get a free key first (or sign in with Google on the consent screen):
Connect media QC when you need it
Connect the hosted otter_score tool, then invoke it when a user explicitly asks to inspect generated media. The installer does not add an end-of-task or pre-push gate. One command, no package install:
On a Mac, no terminal needed — ↓ download the SeaOtter app (signed & Apple-notarized): double-click and it wires your tools, then lives in the menu bar. Prefer the terminal? Use the command below.
On macOS or Linux (terminal), run the line for your harness:
curl -fsSL https://seaotter.ai/install.sh | sh -s -- claude curl -fsSL https://seaotter.ai/install.sh | sh -s -- codex curl -fsSL https://seaotter.ai/install.sh | sh -s -- openclaw curl -fsSL https://seaotter.ai/install.sh | sh -s -- cursor curl -fsSL https://seaotter.ai/install.sh | sh -s -- hermes curl -fsSL https://seaotter.ai/install.sh | sh -s -- git
Wires the MCP otter_score tool only. Existing automatic validation hooks and standing completion mandates are removed. Stdlib-only, idempotent.
On Windows, use PowerShell instead (swap claude for codex · openclaw · cursor · hermes · git):
& ([scriptblock]::Create((irm https://seaotter.ai/install.ps1))) claude
Already set up? On a Mac, click the menu-bar otter for status + uninstall. Anywhere: python3 ~/.otter/otter_install.py status, or remove it with curl -fsSL https://seaotter.ai/uninstall.sh | sh.
Fastest setup — one click, opens the app
Each button opens the app directly. Open in ChatGPT opens the OtterScore GPT — already wired, ready to check your work. Cursor and VS Code install the hosted MCP server in one confirm (VS Code Insiders). Open in Claude loads the setup prompt in the Claude desktop app and walks you through the one connector step — or use Open in Claude Code below, which runs claude mcp add itself.
No app handler installed? Paste the setup prompt into Claude Code, Cursor, or any agent that can run a command and it wires itself up + checks your work from then on (in a plain Claude or ChatGPT chat it walks you through the one connector step) — or drop the skill into .claude/skills/otterscore-grade/ (with grade.py).
Claude
Open in Claude loads the setup prompt in the desktop app and walks you through adding the connector; Open in Claude Code wires it in automatically. Doing it by hand on claude.ai (Pro/Max/Team/Enterprise)? Settings → Connectors → Add custom connector → paste the URL → sign in with Google. Open connector settings →
{
"mcpServers": {
"seaotter": {
"url": "https://mcp.seaotter.ai/mcp",
"headers": {
"Authorization": "Bearer sk-otter-..."
}
}
}
}Claude Code — Open in Claude Code above runs this for you, or copy it (authenticates on first use: OAuth sign-in auto-mints a free key, or set OTTER_API_KEY):
claude mcp add --transport http seaotter https://mcp.seaotter.ai/mcp
One-click Add inside Claude arrives with our Connector Directory listing.
ChatGPT
ChatGPT connects to remote MCP servers via developer mode — the full otter_* toolset in your own chats, not just a GPT. There is no add-by-URL deeplink in ChatGPT today, so this is a copy-paste flow (honest, ~60 seconds):
https://mcp.seaotter.ai/mcp
No developer mode? Two lighter paths:
The published GPT is already wired to check your work; the setup prompt opens a plain chat prefilled — press send and it walks you through the rest.
One-click Add to ChatGPT arrives with our listing in the reviewed ChatGPT apps directory (submission pending — until then, the steps above are the real path).
Agents & other MCP clients
Already on the official MCP registry as ai.seaotter/otterscore. Self-onboard with no human: mint a key with the generated signup call below (the placeholder bearer is ignored on this keyless door), ask Ocean where each step leads, check what you made, iterate on the flaws, and keep the tamper-evident receipts as proof the work was checked. The tool list is generated from the API contract — otter_projection returns the whole map:
curl -X POST 'https://api.seaotter.ai/api/v1/agent-keys/signup' \
-H 'Authorization: Bearer sk-otter-...' \
-H 'Content-Type: application/json' \
-d '{"email": "..."}'Full machine-readable contract: /llms.txt.
NATIVE DRIVER
OtterScore checks web work over the API with nothing to install. To check and drive REAL desktop apps — click, type, and assert against a native UI under a leased GUI seat — install the SeaOtter Driver Agent: a signed, notarized macOS executor that AgentOS resolves as a native_gui driver. It is observation/test infrastructure, human-overseen, not a product UI. Every action is fail-closed: it injects input only when the target app is verified frontmost, and a verifier — not the injector — writes the terminal verdict.
What you install
The headless executor. Drives the app under test via the Accessibility API + synthetic input and emits a native_app_runtime_receipt per action. Needs the Accessibility grant.
The human oversight surface: a menu-bar item showing who holds the seat, a Stop / Release-seat kill switch, permission status, and the recent verdict. Required — macOS needs a visible signed app to attach grants to.
Download · macOS 14+ · free
No key, no sign-in. The build is Developer-ID signed + Apple-notarized; the safety gates are local — the Accessibility grant you approve, the single-holder GUI-seat lease, and the menu-bar kill switch. (An eval key is only needed later, when the driver sends checked work to the eval API.)
# no auth header needed — public download curl -fsSL 'https://api.seaotter.ai/api/v1/app-drivers/native/download?asset=SeaOtterDriverAgent' -o SeaOtterDriverAgent.zip curl -fsSL 'https://api.seaotter.ai/api/v1/app-drivers/native/download?asset=SeaOtterDriverMenuBar' -o SeaOtterDriverMenuBar.zip unzip -o SeaOtterDriverAgent.zip -d /Applications
shasum -a 256 SeaOtterDriverAgent.zip # compare to distribution[].sha256 in the manifest
Grant permissions (one time)
1 · Accessibility — required
Gates input + AX inspection. The driver is not healthy without it.
2 · Screen Recording — optional
Only enables screenshot evidence. NOT required for health.
Verify it works
$ SeaOtterDriverAgent self-check
{
"accessibilityTrusted": true,
"screenRecordingGranted": false,
"healthy": true
}Re-run until healthy:true. accessibilityTrusted is the gate; screen recording only adds screenshots.
How it checks
Use it with your harness
The driver is harness-agnostic — it's the hands, not the brain. Bring your own harness (Claude Code, Cursor, Codex, or your own). We deliberately don't bundle one: that would bloat the download and break neutral-across-providers. One contract (agentos.driver_broker.v1) serves web and native.
exec `SeaOtterDriverAgent run` — pipe a DriverRequest JSON to stdin, read a DriverResponse from stdout (exit 0 ok / 2 some-failed / 3 bad-input). No SDK, no language lock-in.
agentosd resolves it as a native_gui driver and drives it under a single-holder GUI-seat lease + verifier — the enforce / managed path.
a local MCP — native_macos_app_state (look) + execute_native_macos_actions (act) — wired into your harness via install.sh, mirroring the hosted OtterScore MCP.
For agents
No human needed after the first key. Discover the manifest, download + verify the sha256, grant TCC once, then register + self-check + drive. One contract (agentos.driver_broker.v1) serves web and native.
# 1. discover curl -fsSL https://seaotter.ai/.well-known/seaotter-driver-agent.json # 2. download (per distribution[].download_url) — public, then # verify shasum -a 256 == distribution[].sha256 # 3. grant Accessibility once → SeaOtterDriverAgent self-check # until healthy:true # 4. SeaOtterDriverAgent register # → create the native_gui DriverInstance # 5. drive: stdin DriverRequest JSON → stdout DriverResponse JSON (exit 0 ok / 2 failed / 3 bad-input)
Discover: /.well-known/seaotter-driver-agent.json