Skip to content
OVA

Getting started

Connect to Cursor

Drive an OVA desktop from Cursor, Claude Code, Windsurf or VS Code over MCP. Same wallet balance, same spend caps, same background tasks.

How it bills

Every tool call authenticates with Authorization: Bearer. Creating an agent and running a task use the same balance checks as the web app: prepaid wallet, minimum balance, daily spend cap, and the key’s own cap if you set one. Desktop minutes and model tokens debit the wallet while the task runs in the background — closing the IDE does not stop it.

Cursor

Create or edit ~/.cursor/mcp.json (or the project .cursor/mcp.json). Replace sak_YOUR_KEY with the key from Settings.

mcp.json
{
  "mcpServers": {
    "ova": {
      "url": "https://157-180-2-106.sslip.io/api/mcp",
      "headers": {
        "Authorization": "Bearer sak_YOUR_KEY"
      }
    }
  }
}

Restart Cursor or reload MCP servers. Ask the agent to list your desktops or create one — you should see the ova tools.

Claude Code

Add the remote Streamable HTTP server. The key stays in the header, not in a command-line flag that shells log.

terminal
claude mcp add --transport http ova https://157-180-2-106.sslip.io/api/mcp \
  --header "Authorization: Bearer sak_YOUR_KEY"

Windsurf

Open Windsurf MCP settings and add a server, or merge this into ~/.codeium/windsurf/mcp_config.json.

mcp_config.json
{
  "mcpServers": {
    "ova": {
      "serverUrl": "https://157-180-2-106.sslip.io/api/mcp",
      "headers": {
        "Authorization": "Bearer sak_YOUR_KEY"
      }
    }
  }
}

VS Code

Use a workspace .vscode/mcp.json (or user MCP settings). The input prompt keeps the key out of the file on disk.

.vscode/mcp.json
{
  "servers": {
    "ova": {
      "type": "http",
      "url": "https://157-180-2-106.sslip.io/api/mcp",
      "headers": {
        "Authorization": "Bearer ${input:ova-key}"
      }
    }
  },
  "inputs": [
    {
      "id": "ova-key",
      "type": "promptString",
      "description": "OVA API key",
      "password": true
    }
  ]
}

Tools

ToolWhat it does
list_agentsActive and recent desktops for this wallet
create_agentSpin up a desktop. Required: model. Optional: name, first task
run_taskStart work on an agent. Returns task_id immediately
get_taskStatus, progress events, messages, final result
get_screenshotLatest desktop PNG
send_messageFollow-up to a running task, or a new task if idle
stop_taskCancel a queued or running task
get_balanceWallet balance, daily spend, this key’s cap

Endpoint: POST https://157-180-2-106.sslip.io/api/mcp (MCP Streamable HTTP). Rate-limited per key. Keys are never written to application logs.

Example prompts

First desktop

Create an OVA desktop on claude-sonnet-5 named “Research”. Ask it to open Chromium and find the current SOL price. Poll get_task until it finishes, then summarize the answer and show the latest screenshot.

Follow-up

Send a follow-up to that agent: export the price and source URL into a notes.md file on the desktop. Stop the task if it looks stuck.

Check spend

Check my OVA balance and this key’s spend cap before starting another long research task.

Models

Pass a model id to create_agent or run_task. The catalog is the same as the web app — computer-use models with vision. See inference market for routing and prices.

  • claude-opus-5-5 — Pro
  • claude-sonnet-5 — Fast
  • claude-haiku-4.5
  • gpt-6.1-sol, gpt-5.4-mini
  • gemini-4-argon, gemini-3.1-flash-lite
  • kimi-k3

Safety

  • Revoke a key in Settings if it leaks. The hash stays; the secret stops working immediately.
  • Per-key spend caps are optional. Wallet daily caps and low-balance stops still apply.
  • Requests are rate-limited per key. Do not put keys in screenshots, git, or shell history.

More on safety limits and the REST API used by the web app.

Search documentation

Jump to a docs page