Skip to main content

surfsky-mcp

PyPI CI

Chrome in the cloud for Claude, Cursor or any MCP client. Read pages a plain HTTP fetch cannot, then click through them, fill forms and take screenshots. Runs on Surfsky, an antidetect browser with residential proxies and human-like input.

Install

Requires Python 3.12+, uv, and a Surfsky account. Replace ... with your SURFSKY_API_TOKEN and SURFSKY_API_BASE_URL from the dashboard. Browser time and proxy traffic are billed.

macOS Windows Linux
Install uv brew install uv winget install astral-sh.uv curl -LsSf https://astral.sh/uv/install.sh | sh
Claude Desktop config ~/Library/Application Support/Claude/claude_desktop_config.json %APPDATA%\Claude\claude_desktop_config.json no Desktop build; use Claude Code
Claude Desktop logs ~/Library/Logs/Claude/ %APPDATA%\Claude\logs\

uv downloads Python itself, so no separate Python install is needed.

Claude Code:

claude mcp add surfsky -e SURFSKY_API_TOKEN=... -e SURFSKY_API_BASE_URL=... -- uvx surfsky-mcp

Claude Desktop / Cursor:

{
  "mcpServers": {
    "surfsky": {
      "command": "uvx",
      "args": ["surfsky-mcp"],
      "env": { "SURFSKY_API_TOKEN": "...", "SURFSKY_API_BASE_URL": "..." }
    }
  }
}

On macOS the app does not read your shell profile, so "command": "uvx" fails to start. Use the absolute path that which uvx prints. Windows finds uvx on PATH.

After changing the config, quit Claude Desktop with Cmd+Q on macOS or from the tray on Windows, then start it again. Closing the window leaves the old server process running.

Codex (~/.codex/config.toml):

[mcp_servers.surfsky]
command = "uvx"
args = ["surfsky-mcp"]
env = { SURFSKY_API_TOKEN = "...", SURFSKY_API_BASE_URL = "..." }

Configuration

Variable Default Meaning
SURFSKY_API_TOKEN Required. From the dashboard
SURFSKY_API_BASE_URL Required. The API host for your account, also on the dashboard
SURFSKY_HOME ~/.surfsky Where session state files are written

Set them in the MCP client's config, not in your shell.

Logs go to stderr; stdout carries JSON-RPC only.

What you can ask

Ask What happens
"Read this page and summarize the reviews." One surfsky_scrape. Starts no session, so nothing to stop
"Compare this product's price across these three shops." Three scrapes. A shop that needs a click to show the price gets a session
"Fill this form with the details from my notes." surfsky_snapshot for @N references, then surfsky_act. The server tells the model to stop short of a payment or a final confirmation unless you asked for one
"Sign in and check last month's invoice." surfsky_session_start with a profile_uuid you supply; the saved profile carries the login
"Screenshot the top of this article." surfsky_screenshot, or surfsky_scrape with formats: ["screenshot"]
"Which of my browsers are still running?" surfsky_session_list, then surfsky_session_stop for the ones you are done with

Tools

Tool Description
surfsky_scrape Fetch a URL as Markdown, HTML, links or a screenshot.
surfsky_navigate Open a URL, go back or forward, or reload.
surfsky_snapshot List page elements with @N references for actions.
surfsky_act Click, double-click, hover, fill, type, press keys, select or scroll.
surfsky_wait Wait for an element, URL, text or a delay.
surfsky_read Read page content as Markdown, text, HTML or links.
surfsky_screenshot Capture the viewport, full page or an element.
surfsky_evaluate Run JavaScript in an isolated context or the page context.
surfsky_tab List, open, switch or close tabs.
surfsky_session_start Start a session with profile, proxy or fingerprint settings.
surfsky_session_stop Stop a session and its billing. Safe to repeat.
surfsky_session_list List the account's running sessions.
surfsky_status Check credentials, plan limits and proxy quota.

Sessions

Browser tools share a default session unless you pass session_id. It starts on first use and stops after five minutes idle or on server shutdown. Call surfsky_session_stop to stop billing immediately.

Use surfsky_session_start for separate sessions, saved profiles or custom proxy and fingerprint settings. surfsky_scrape stops its browser automatically. Sessions can also be listed and stopped through the Surfsky CLI.

HTTP mode

uvx surfsky-mcp --http --host 0.0.0.0 --port 8000 --allowed-hosts mcp.example.com

Serves streamable HTTP at /mcp. Set the same credentials in the environment. There is no built-in authentication; use an authenticated proxy or private network. Set --allowed-hosts to the hostname clients use. Without it, non-localhost binds disable Host-header checks.

Clients sharing a server must use separate session_id values.

Troubleshooting

A page returns 200 but the text is short, or asks you to continue shopping or prove you are human. That is a bot challenge, not a bug. Each scrape gets a fresh browser and a different proxy exit, so a retry often gets through. If a site blocks every fresh browser, start a session with a saved profile_uuid, whose cookies survive between runs.

The result carries note: navigation did not reach 'load'. The document parsed, but a request stayed open past the timeout. The content and the status are there; anything that loads late may be missing. Pass wait_until: "domcontentloaded" and a wait_for selector for the element you need.

error [timeout]. The navigation committed no document at all. Retry with a longer timeout, or wait_until: "commit" to stop at the first response.

error [stale_ref]. The page moved under the @N references. Call surfsky_snapshot and pick the target again.

error [session_gone]. The cloud no longer has that session. Start another; page state is lost.

error [plan_full] or error [quota]. The plan's parallel sessions or its traffic are used up. surfsky_session_list shows what is running and surfsky_session_stop frees one. surfsky_status shows the limits. Do not retry in a loop.

error [auth]. The token or the base URL never reached the server process. Check the env block of the MCP client's config, not your shell.

A session keeps billing. The shared default session stops after five minutes idle and on server shutdown. surfsky_session_stop ends it now, and the Surfsky CLI can stop sessions this server does not know about.

Security and privacy

The server stores nothing. It sends the URLs and actions a tool call names to the Surfsky API, which runs the browser, and returns what the page said to your MCP client. The token is read from the environment and goes nowhere but that API.

Page content, snapshots, screenshots and JavaScript results arrive inside an <untrusted-page-content> block introduced as data rather than instructions. Invisible and bidirectional characters are stripped, and a page cannot close the block early. Filtering does not catch every prompt injection. Check what an action does before it submits a form or spends money.

A profile_uuid carries real logins. Pass one only when the user gave it to you. HTTP mode has no authentication of its own; see HTTP mode.

Development

uv sync --all-groups
uv run ruff check . && uv run ty check && uv run pytest -q
SURFSKY_LIVE_TESTS=1 uv run pytest tests/test_live.py   # billed

License

MIT

Metadata

Release files for surfsky-mcp 0.0.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for surfsky-mcp 0.0.3
File Size Uploaded Provenance Actions
surfsky_mcp-0.0.3.tar.gz 33.5 kB Without provenance Details for surfsky_mcp-0.0.3.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for surfsky-mcp 0.0.3
File Interpreter ABI Platform Actions
surfsky_mcp-0.0.3-py3-none-any.whl Python 3 none any Details for surfsky_mcp-0.0.3-py3-none-any.whl

Total release size: 58.4 kB

Release files / surfsky_mcp-0.0.3.tar.gz

Download URL surfsky_mcp-0.0.3.tar.gz
Size 33.5 kB
Tags Source
SHA-256 checksum
How to use checksums
49c153b281479dde40d1965910502001b6c9ad761fa21ed147aa963c6935aebf
BLAKE2b-256 checksum
How to use checksums
644bde411c4e9b01cb9cc733eed9e41c1ca9a4ab3de69c4c37f6f77b87b8298b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.4 {"installer":{"name":"uv","version":"0.13.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / surfsky_mcp-0.0.3-py3-none-any.whl

Download URL surfsky_mcp-0.0.3-py3-none-any.whl
Size 24.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b81df000b39ff609834e6f86ee55fb38c059eeea612015d909c74c851262a3fe
BLAKE2b-256 checksum
How to use checksums
5b33a2bf373c7ed6cd26a23e83912ff66456b9f0192e28e555466908828b41c3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.4 {"installer":{"name":"uv","version":"0.13.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for surfsky-mcp 0.0.3

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page