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.
{
"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.
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.
{
"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.
{
"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
| Tool | What it does |
|---|---|
| list_agents | Active and recent desktops for this wallet |
| create_agent | Spin up a desktop. Required: model. Optional: name, first task |
| run_task | Start work on an agent. Returns task_id immediately |
| get_task | Status, progress events, messages, final result |
| get_screenshot | Latest desktop PNG |
| send_message | Follow-up to a running task, or a new task if idle |
| stop_task | Cancel a queued or running task |
| get_balance | Wallet 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— Proclaude-sonnet-5— Fastclaude-haiku-4.5gpt-6.1-sol,gpt-5.4-minigemini-4-argon,gemini-3.1-flash-litekimi-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.