@roveapi/mcp
v1.18.0
Published
MCP server for Rove supervised browser sessions — your agent drives, a human watches and takes over. Use from Claude, Cursor, VS Code
Maintainers
Readme
@roveapi/mcp
Rove's MCP server exposes hosted browser automation and explicit supervised human handoff to Claude Desktop, Cursor, VS Code, and other MCP clients.
Install
npx -y @roveapi/mcpSet ROVE_API_KEY, or use the authenticate tool for zero-key onboarding.
Tools
The hosted server (https://api.roveapi.com/mcp) and the stdio package (@roveapi/mcp) list the same tools, with the same titles, input schemas and MCP annotations. Start with start_supervised_session, then call create_viewer_grant for the person who may watch and take over. Annotations are hints a client may show; Rove's own checks decide. A destructive tool is never marked idempotent. Apps connected through OAuth need the scope shown.
| Tool | Title | Read-only | Destructive | Idempotent | Open world | OAuth scope |
|---|---|---|---|---|---|---|
| start_supervised_session | Start supervised browser session | no | no | no | no | rove:supervised |
| create_viewer_grant | Create viewer link | no | no | no | no | rove:supervised |
| request_human | Request human help | no | no | no | no | rove:supervised |
| navigate | Open URL | no | no | no | yes | rove:browse |
| get_a11y_tree | Read page | yes | no | yes | yes | rove:browse |
| screenshot | Take screenshot | yes | no | yes | yes | rove:browse |
| click | Click element | no | yes | no | yes | rove:browse |
| fill | Fill form field | no | yes | no | yes | rove:browse |
| fill_credential | Fill saved credential | no | yes | no | yes | rove:browse |
| fill_otp | Fill saved OTP | no | yes | no | yes | rove:browse |
| interact | Click or fill by selector | no | yes | no | yes | rove:browse |
| get_text | Read element text | yes | no | yes | yes | rove:browse |
| scroll | Scroll page | no | no | no | yes | rove:browse |
| evaluate | Run JavaScript | no | yes | no | yes | rove:browse |
| extract_schema | Extract fields from a URL | yes | no | yes | yes | rove:browse |
| list_downloads | List downloads | yes | no | yes | no | rove:browse |
| get_download | Fetch download | yes | no | yes | no | rove:browse |
| list_pages | List open pages | yes | no | yes | no | rove:browse |
| switch_page | Switch page | no | no | yes | no | rove:browse |
| close_page | Close page | no | yes | no | no | rove:browse |
| wait_for_popup | Wait for popup | no | no | yes | no | rove:browse |
| poppy_connect | Connect to a Poppy site | no | yes | no | yes | rove:supervised |
| poppy_sign_in | Sign in to a Poppy site | no | no | no | yes | rove:supervised |
| poppy_status | Show Poppy connections | yes | no | yes | no | rove:supervised |
| poppy_disconnect | Disconnect a Poppy site | no | yes | no | yes | rove:supervised |
| restore_pages | Restore or dismiss pages | no | yes | no | yes | rove:browse |
| list_history | List browsing history | yes | no | yes | no | rove:browse |
| clear_history | Clear browsing history | no | yes | no | no | rove:browse |
| delete_profile | Delete browser profile | no | yes | no | no | rove:browse |
| list_passkeys | List passkeys | yes | no | yes | no | rove:browse |
| delete_passkey | Delete passkey | no | yes | no | no | rove:browse |
| list_sessions | Show active session | yes | no | yes | no | rove:browse |
| close_session | Close session | no | yes | no | no | rove:browse |
| authenticate | Sign in by email | no | no | no | yes | not available |
| account_info | Show account | yes | no | yes | no | rove:browse |
| buy_credits | Buy credits | no | yes | no | yes | rove:browse |
| get_credit_catalogue | Show credit prices | yes | no | yes | no | rove:browse |
| get_credit_balance | Show credit balance | yes | no | yes | no | rove:browse |
| get_purchase | Show purchase | yes | no | yes | no | rove:browse |
| list_purchases | List purchases | yes | no | yes | no | rove:browse |
| cancel_purchase | Cancel purchase | no | yes | no | yes | rove:browse |
| simulate_purchase | Simulate purchase (test keys) | no | no | no | no | rove:browse |
Supervised session
Supervised sessions require an rvp_live_ API key because test-mode keys run deterministic mock actions and do not allocate a streamable browser. Use the authenticate tool if you do not already have a live key.
- Call
start_supervised_sessionto opt in. Ordinarynavigatesessions remain non-supervised. - Navigate to an owned target, then call
create_viewer_grant; it binds the grant to the returned hosted viewer's origin. - Give the returned one-time
admission_codeandviewer_urlto the human operator. - The operator watches, takes exclusive control, repairs the state, and returns control explicitly.
- After handback, the agent must call
get_a11y_treeorscreenshotfor a fresh observation before another mutation. - Stop in the viewer or call
close_sessionand verify the cleanup result.
Admission codes are one-time and origin-bound. Viewer credentials are short-lived. Stale generations, replayed codes, foreign origins, and agent mutation while human control is held fail closed.
Supervised egress
Supervised session creation accepts optional egress: direct | warp (Python: egress="direct"). The mode is fixed for the session. Warp routes through a WARP-backed gateway; direct uses the default route. Omitted egress uses the account default (warp); where warp is unconfigured it resolves direct, while explicit warp refuses with actionable 409 egress-unavailable. Keep warp unless the site blocks WARP or is geo-sensitive, then use direct. Keep one mode per profile: a profile signed in on one mode may log out on the other. The create response and session GET expose actual egress_mode; SDK session objects expose egressMode (Node) or egress_mode (Python), and getSession / get_session reads current status. An unreachable warp route does not fall back: retry later, or end the session and explicitly start direct.
Action permissions
Hosted and stdio MCP return permission refusals with isError: true, JSON text, and matching structuredContent: { status, reason, problem }. status is permission_denied (including purchase_denied) or permission_parked (including the API's permission_required). Parks also include poll_after_seconds, using the API's hint or 10 seconds by default. The original problem is retained. While approval is pending, poll observations after that delay; do not resend input.
