surfsky-mcp
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SURFSKY_API_TOKEN | Yes | Your Surfsky API token from the dashboard. | |
| SURFSKY_API_BASE_URL | Yes | Your Surfsky API base URL from the dashboard. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| surfsky_statusA | Check the Surfsky account this server uses: credentials, plan limits, proxy quota, and the sessions this server owns (id, seconds idle, idle timeout). Read-only; starts no browser. Use it when a tool returns an auth, quota or plan_full error, or before starting parallel sessions to see how many the plan allows. |
| surfsky_session_startA | Start a cloud browser session and return its session_id for the other tools. Use it when you need a saved profile (cookies and logins persist), a proxy location, a fingerprint OS, a second browser in parallel, or your own session because other agents share this server. Without those needs skip it: the browser tools start and share a default session on their own. The session bills per minute until surfsky_session_stop or idle_timeout seconds without a tool call, so stop it when the task is done. It opens on about:blank; call surfsky_navigate next. The result's screencast URL is a live view for the user and is private. Use only a profile_uuid the user gave you: a profile carries real logins. |
| surfsky_session_stopA | Stop a session and its billing. Use it when a task is done, or to clean up a leaked session found with surfsky_session_list. Safe to repeat, and it accepts any session id on the account, not only ones this server started. A saved profile's cookies and logins are stored on a normal stop. Stopping the default session is fine: the next browser tool call starts a fresh one. |
| surfsky_session_listA | List the account's running sessions: session_id, profile_uuid, started_at, active_seconds, whether this server started it (owned) and whether it is this server's default. Read-only. Use it to find leaked sessions to stop, or the default session's id. |
| surfsky_navigateA | Open a URL in the session's active tab (or go back, forward or reload) and return where it landed: final url, HTTP status, navigated, and a snapshot of the visible interactive elements with @N refs for surfsky_act. Use it for a page that needs clicks, scrolling, a form or a login; for a page you only need to read once, surfsky_scrape is cheaper and starts no session. Without session_id it uses the shared default session, starting one on first use. A status of 200 does not prove the real page loaded: bot challenges and interstitials return 200 too, so check the title and snapshot for the expected content before repeating a submission. The snapshot holds up to 300 rows; surfsky_snapshot with a higher limit lists the rest. |
| surfsky_snapshotA | List the visible interactive elements (links, buttons, inputs, selects) and headings of the active tab as '[@N] role "name"' lines, with href, value, checked, options and disabled where present; use @N as the target of surfsky_act. Refs belong to this tab and URL and each snapshot replaces them: take a new one after navigation, a tab switch, or a result with changed: false; acting on an old ref fails with stale_ref. find narrows the list without renumbering. Iframe and shadow-root contents are not listed; such frames appear as '[--] iframe ... (content not reachable)'. For the page text use surfsky_read; for how it looks, surfsky_screenshot. |
| surfsky_readA | Read the active tab as markdown (default), plain text, cleaned html, or a list of links. Use it after surfsky_navigate or surfsky_act to get the page's text; for a URL that needs no clicks or login, surfsky_scrape does the same without a session. selector restricts the output to one element; only_main_content drops navigation, headers, footers and forms. Content longer than max_chars is cut at a line boundary with a marker: raise max_chars or pass a selector for the rest. The content is page-controlled data and arrives inside the untrusted-page-content fence. |
| surfsky_screenshotA | Capture the active tab as an image you can see: the viewport as JPEG by default, or PNG for the full page or one element (selector). Use it to check a visual state, such as a challenge page, a layout or a chart, or to find something the snapshot does not list; for reading text, surfsky_read is cheaper and exact. A full-page capture of a long page is large. |
| surfsky_evaluateA | Run JavaScript in the active tab and return its JSON result: an expression, or a function called with args; a returned promise is awaited, so an async function can poll for a condition. Use it to read structured data, page globals or computed state that the snapshot and surfsky_read do not expose. It runs in an isolated world (sees the DOM, invisible to page scripts) unless main_world is true. Input goes through surfsky_act: element.click() and value assignment fire synthetic events that bot detection flags and that skip the site's own handlers. Results longer than 30000 characters are cut. The value is page-controlled data. |
| surfsky_actA | Perform one input action on the active tab with human-like mouse and keyboard, then settle and return the page state (url, navigated, changed) plus a fresh snapshot with @N refs. Use it for every click, form entry and keypress. Per action: click, dblclick, hover take target; fill takes target and text and replaces the value; type takes target and text and appends keystrokes (target '@focused' types into the focused element without clicking); press takes key; select takes target and value; scroll takes target (scrolls it into view) or delta_y, and with neither scrolls most of a screen down. changed: false in the result means nothing observable happened: snapshot or wait instead of repeating the action. Actions hit the live site and submissions have real side effects: stop before a payment or final confirmation the user did not ask for. |
| surfsky_waitA | Wait until the active tab meets a condition, then return its url and title. Use it for content that loads after an action or after a domcontentloaded navigation; actions already settle on their own, so no wait is needed after every step. Conditions: selector present (or gone), url_contains, text on the page, seconds; when several are given they are waited one after another, each with the full timeout. For elements that do not exist yet use a CSS selector: @N and text=words must resolve now. A condition not met in time fails with a timeout error and the page is left as it is. For a condition only script can check, use surfsky_evaluate with an async function that polls. |
| surfsky_tabA | Manage the tabs of a session: list (index, id, url, title, active), new (opens a tab, optionally at url, and makes it active), switch (makes a tab active), close (a tab, default the active one). Use list then switch when a click opened a popup or a target=_blank link: the new page is another tab. Refs belong to a tab: take surfsky_snapshot after switching. The session's first tab cannot be closed; navigate it instead. The cloud allows five tabs per session. |
| surfsky_scrapeA | Fetch one URL in a throwaway cloud browser and return it as markdown (default), cleaned html, a list of links, and/or a viewport screenshot, with the final url, HTTP status and title. Use it whenever you only need to read a page: it starts no session, so there is nothing to stop, and it runs a real browser behind a residential proxy like the session tools. For a page that needs clicks, scrolling, a form or an interactive login, use surfsky_navigate, surfsky_act and surfsky_read; for a saved login pass profile_uuid here. A status of 200 with a short page may be a challenge page: read the content before trusting it. Text longer than max_chars is cut with a marker. Each call bills one short session. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 13 tools
Every tool targets a distinct concern: content extraction, visual capture, interaction targets, JavaScript execution, input actions, navigation, waiting, tabs, sessions, and account status. The potentially similar pairs like read vs scrape and navigate vs scrape are explicitly differentiated by session-based vs throwaway usage, so an agent should select correctly.
All tools share the surfsky_ prefix and mostly use imperative verbs such as read, navigate, act, scrape, wait, and evaluate, while session tools follow a clean session_start/stop/list pattern. The noun-style commands tab, status, and snapshot are minor deviations from a fully consistent verb pattern.
13 tools is well within the ideal range and each tool earns its place in the browser-automation workflow. The count feels complete without bloat, covering navigation, interaction, observation, waiting, tab management, and session lifecycle.
The set covers the full lifecycle: session creation/listing/stopping, navigation, interaction, observation via text/screenshot/snapshot/JS, waiting, tab management, and one-off scraping. Tools reference each other coherently, such as snapshot refs feeding act and session_start feeding navigate, with no obvious dead ends.