Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Aginx Browser

REMOTE · BROWSER.AGINX.NET · SCANNED SEP 20

Stealth web browser for agents: search, fetch, click, download and type in persistent MCP sessions.

+3 this week 75 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security57
Transport & Reachability100
Schema Quality & AI Usability67
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 8647 tokens (~233/item across 37 items; 37 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "account_delete" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
  • An AI judge read all 37 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Install

How do I install the Aginx Browser MCP server?

Aginx Browser is a hosted endpoint at https://browser.aginx.net/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · browser.aginx.net

# add to Claude Code
claude mcp add --transport http net-aginx-aginxbrowser 'https://browser.aginx.net/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "net-aginx-aginxbrowser": {
      "url": "https://browser.aginx.net/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "net-aginx-aginxbrowser": {
      "type": "http",
      "url": "https://browser.aginx.net/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.net-aginx-aginxbrowser]
url = "https://browser.aginx.net/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "net-aginx-aginxbrowser": {
      "type": "remote",
      "url": "https://browser.aginx.net/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add net-aginx-aginxbrowser --url 'https://browser.aginx.net/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  net-aginx-aginxbrowser:
    url: "https://browser.aginx.net/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "net-aginx-aginxbrowser": {
      "Transport": "http",
      "Url": "https://browser.aginx.net/mcp"
    }
  }
}
# add to Vellum
assistant mcp add net-aginx-aginxbrowser -t streamable-http -u 'https://browser.aginx.net/mcp'
// mcp.json
{
  "mcpServers": {
    "net-aginx-aginxbrowser": {
      "type": "http",
      "url": "https://browser.aginx.net/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 20 Sept 26 0
    • Stability: 0.97 → pass security
    • Tool “session_challenges” rewrote its description, which is the text the model reads security
    • Server version: 0.5.0 → 0.5.1 functional
  • 19 Sept 26 +1
    • Tool “session_click” rewrote its description, which is the text the model reads security
    • Tool “session_drag” rewrote its description, which is the text the model reads security
    • Tool “session_input” rewrote its description, which is the text the model reads security
    • Server version: 0.4.5 → 0.5.0 functional
    • “session_drag” added an optional parameter “humanize” cosmetic
    • “session_drag” reworded the description of “delay_ms” cosmetic
    • “session_drag” reworded the description of “steps” cosmetic
  • 18 Sept 26 0
    • MCP protocol: Implements a current MCP spec version (2026-07-28). functional
    • MCP protocol version: 2025-11-25 → 2026-07-28 functional
    • Server version: 0.4.4 → 0.4.5 functional
  • 17 Sept 26 0
    • Server version: 0.4.3 → 0.4.4 functional
  • 16 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

  • 15 Sept 26 0
    • Server version: 0.4.2 → 0.4.3 functional
  • 14 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 77 to 80. That category is still filling its 30-day observation window: 23 days of observed history at the previous scan, 24 at this one. The score rises as the window fills, whether or not the server changes.

  • 13 Sept 26 0
    • Tool “render_markdown” rewrote its description, which is the text the model reads security
    • Tool “render_video” rewrote its description, which is the text the model reads security
    • Tool “session_export” rewrote its description, which is the text the model reads security
    • Schema quality: 6575 → 8387 functional
    • Server version: 0.4.1 → 0.4.2 functional
    • New tool “account_verify” functional
    • New tool “account_delete” functional
    • New tool “account_list” functional
    • New tool “flow_run” functional
    • New tool “session_challenges” functional
    • New tool “session_set_files” functional
    • “import_curl” added an optional parameter “account” cosmetic
    • “render_markdown” added an optional parameter “motion” cosmetic
    • “render_video” added an optional parameter “burn_subtitles” cosmetic
    • “session_create” added an optional parameter “account” cosmetic
    • “session_eval” added an optional parameter “timeout_ms” cosmetic
    • “session_export” reworded the description of “format” cosmetic
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 20 Sept 2026 · Probed https://browser.aginx.net/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=browser.aginx.net CN=YR2,O=Let's Encrypt,C=US 8 Aug 2026 6 Nov 2026 RSA 2048 SHA256-RSA 52258fd1f5e690b5a49ee94290eb35418bb
SANs: browser.aginx.net
CN=YR2,O=Let's Encrypt,C=US (CA) CN=Root YR,O=ISRG,C=US 3 Sept 2025 2 Sept 2028 RSA 2048 SHA256-RSA 4ebd24947e24d394802d84a52fd5b319
CN=Root YR,O=ISRG,C=US (CA) CN=ISRG Root X1,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 RSA 4096 SHA256-RSA f24b6d17f9d9ad7cb1c9fea78782699f

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of browser.aginx.net. Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
net. present 37331 13 Verified
aginx.net. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://browser.aginx.net/mcp Verified 200
http (plaintext) http://browser.aginx.net/mcp HTTPS enforced 301 https://browser.aginx.net/mcp
MCP tools · 37 exposed · ~8,647 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
account_delete ~82

Delete a named login identity: stored record AND live jar. Cookie values are credentials — delete means gone. Sessions currently running as the account keep their in-process jar handle, but nothing writes back. Returns {deleted: name}, or an error naming the account if it does not exist.

NameTypeReqDescription
namestringyesThe account to delete: stored record AND live jar.

No output schema declared.

No examples provided.

account_list ~91

List named login identities (the multi-account layer) with metadata only: name, cookie domains, cookie count, updated_at, the last account_verify verdict, and the identity's persona User-Agent (each account is one stable device: its own UA and hardware fingerprint, drawn once and reused). Cookie values are credentials and never leave the server. Use to see which identities exist before session_create {account} picks one.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

account_verify ~199

Check whether a named account is still logged in. Teach-once: the first call passes url + predicate (a JS expression truthy on a logged-in page, e.g. !!document.querySelector('.user-nick')); the spec is remembered and later calls can be bare. Runs in a scratch session AS the account (private jar), so the probe doubles as a cookie refresh. Returns {name, logged_in, url, checked_at}.

NameTypeReqDescription
namestringyesThe account to check.
predicatestring|nullTeach-once: a JS expression that is truthy when logged in, e.g. `!!document.querySelector('.user-nick')`. Remembered after the first call — later calls can pass neither and rerun the spec.
urlstring|nullTeach-once: the page that shows login state (its login wall if the account is logged out). Remembered after the first call.

No output schema declared.

No examples provided.

cache ~276

Query the LOCAL CACHE of every page this server has fetched and every search it has run. Check here BEFORE re-fetching or re-searching — a hit is instant and free while a fresh fetch costs 5-60s. Use query for full-text search (works for Chinese substrings and English words), get to pull a page's full cached content, stats for counts, clear to delete rows.

NameTypeReqDescription
allbooleanWith clear: delete everything cached for this caller
clearbooleanDelete matching rows instead of returning them (requires url, since_hours, or all)
getstring|nullReturn the FULL cached content of this exact URL instead of listing hits
kindstring|nullWhich rows to search: "auto" (default, pages + searches), "pages", or "searches"
limitintegerMaximum rows returned (default: 10, max 100)
querystring|nullFull-text search over cached page contents, titles, URLs and past search queries. Omit to list the latest rows.
since_hoursinteger|nullOnly rows stored within the last N hours
statsbooleanReturn row counts and database size instead of rows
urlstring|nullOnly rows whose URL contains this substring

No output schema declared.

No examples provided.

click ~162

Click an element on a one-off page: loads `url` in a fresh browser context (stateless — no cookies unless passed, no shared state with other calls), waits `wait_secs` after load before clicking, then fires a DOM click on the first CSS-selector match. The click may trigger navigation (link, form submit) — the response `url` and `text_after` are read after that navigation lands. Returns `clicked:false` when the selector matches nothing. For multi-step interaction on a shared page use session_click instead.

NameTypeReqDescription
selectorstringyesCSS selector of element to click
urlstringyesThe URL to load
wait_secsinteger|nullSeconds to wait for the page to settle after load, before clicking

No output schema declared.

No examples provided.

download ~190

Download a file over HTTP(S) with streaming to disk (no memory buffering), SHA-256 integrity hash, and optional resume of interrupted transfers. Filename resolution: explicit param → Content-Disposition → URL tail. Use for binaries, archives, datasets, documents - anything where the agent wants the FILE saved, not its text content read.

NameTypeReqDescription
cookiesarrayCookies to send with the request: `"name=value"` strings or CDP-style objects `{"name","value","domain",...}` for gated downloads
filenamestring|nullExplicit output filename. When omitted: Content-Disposition → URL tail → "download"
resumebooleanResume an interrupted download when a local partial file exists
urlstringyesURL of the file to download (http/https)
use_proxybooleanRoute through proxy (default: false; auto-enabled for known blocked domains)

No output schema declared.

No examples provided.

eval ~145

Execute JavaScript on a one-off page: loads `url` in a fresh browser context, optionally waits `wait_secs` for the page to settle, evaluates `script` (async/Promise supported) and returns `{url, result}`. Script-driven navigation (location.href, form submit) is drained and reflected in the returned `url`. Stateless — no cookies or page state shared with other calls; when the script needs prior page state or a login, use session_eval.

NameTypeReqDescription
scriptstringyesJavaScript code to execute (supports async/Promise)
urlstringyesThe URL to load
wait_secsinteger|nullSeconds to wait before executing

No output schema declared.

No examples provided.

fetch ~445

Fetch a webpage and return clean markdown/html/text. Use whenever the agent needs to READ any web page - blogs, docs, articles, JS-rendered SPAs, Cloudflare-protected sites. Static pages are served over plain HTTP (~100ms tier:"http"); pages that need JS get the full browser (tier:"browser"). render_tier selects auto (default) / http (pure HTTP, refuses the upgrade) / obscura (always browser).

NameTypeReqDescription
auto_bypass_challengebooleanAuto-detect and bypass Cloudflare Turnstile challenges (default: true)
capture_xhrarray|nullCapture script-initiated API responses: a list of URL substrings (e.g. ["/api/"]) whose matching fetch/XHR bodies come back in an `xhr` array; an empty list captures every XHR/Fetch. Forces browser r…
formatstringOutput format: "markdown", "html", or "text" (default: markdown)
js_extractJS expression to extract from the page after rendering
max_charsintegerMaximum characters to return (default: 50000)
render_tierRendering strategy: "auto" (default), "http", or "obscura"
sanitizebooleanStrip prompt-injection payloads from the text output (default true): zero-width/steganographic characters, instruction-shaped lines ("ignore previous instructions", chat markup tokens, CJK variants),…
selectorstring|nullCSS selector to extract specific content
tls_fingerprintstring|nullTLS fingerprint override (stealth mode only): "chrome145", "firefox133", etc.
urlstringyesThe URL to fetch
use_proxybooleanRoute through proxy (for blocked foreign sites)
wait_secsinteger|nullSeconds to wait for JS rendering

No output schema declared.

No examples provided.

flow_run ~333

Run a flow — a recorded, editable JSON browser-session script — deterministically, with zero model tokens. Steps are {op, args, expect?, save?}: ops cover navigate/click/click_xy/input/scroll/eval/wait/screenshot/state/cookies; {{var}} placeholders in args are filled from vars; expect asserts (url_contains | selector | text_contains | eval_truthy) abort with evidence on failure; save collects a step's output into the receipt. Source the flow inline via "flow", or by "name" from the server's workflow/<name>/flow.json (unknown name → error lists installed workflows). Pass session_id to reuse a live session (e.g. from import_curl) so login state and flows compose. The receipt carries status ok/failed, saved outputs, the session_id (kept alive), and on failure the failing step, reason and a diagnostic screenshot — fix the flow or take the session over from there.

NameTypeReqDescription
flowInline flow document: {create?, vars?, steps:[{op, args, expect?, save?}]}
namestring|nullOr run a server-side workflow/<name>/flow.json asset. An unknown name errors back with the list of installed workflows — that error is the discovery call.
session_idstring|nullReuse a live session (e.g. from import_curl) instead of creating a fresh one — that's how login state and flows compose.
varsValues for {{placeholders}} in step args; wins over the flow's own vars defaults.

No output schema declared.

No examples provided.

import_curl ~237

Import login state from a real browser in one paste. The human logs into a site in their own Chrome (solving the CAPTCHA/SMS once), opens DevTools → Network, right-clicks any authenticated request → "Copy as cURL", and passes the command here. Returns a live session_id already carrying that site's cookies and sitting on the copied request's URL — the agent continues from where the human left off, no password or second login needed. Works with bash, PowerShell and cmd copy flavors.

NameTypeReqDescription
accountstring|nullAttach the session to a named account: the imported login lands in the account's private jar and is written back under its name after every action — one import per identity, no clobbering.
curlstringyesA "Copy as cURL" command pasted from Chrome DevTools (Network panel → right-click any authenticated request). bash, PowerShell and cmd flavors all parse; the cookie set is injected and the session na…
use_proxybooleanRoute the session's traffic through the engine proxy.

No output schema declared.

No examples provided.

render_markdown ~1,213

Render a markdown document into a deterministic, self-contained HTML artifact - the document layer, so the agent never writes HTML by hand. Prose rides a plain offline shell (no fonts, no scripts); archify fenced code blocks carry typed zero-coordinate diagram JSON (sequence, workflow, architecture, dataflow, lifecycle families) and render to inline SVG via the layout engine. Same input, same bytes: the receipt carries the sha256 so determinism is verifiable. theme picks light (default) or dark; preset picks the palette family — classic (default), signal-flow, blueprint, editorial — orthogonal to theme; colors bake at generation time (presentation attributes, not CSS variables), and the receipt records both preset and theme. quality picks the composition audit profile — standard (default) or showcase, the delivery gate: the receipt's diagrams[].composition grades route crossings, ambiguous corridors, label clearance (2px standard / 4px showcase), route rhythm, and node text projected to the 930px reader width; the audit never changes the artifact bytes. Mermaid sources are the agent's job to translate, not the engine's: flowchart/graph → workflow (lanes + columns), sequenceDiagram → sequence, stateDiagram-v2 → lifecycle (bands), erDiagram/class → architecture (grid + boundaries) — read the topology and emit the matching zero-coordinate archify JSON; the engine accepts only archify JSON. A broken diagram degrades to a visible code block and lands in receipt.diagnostics; an authored route preset that cannot be honored is self-repaired to a verified semantic substitute and disclosed in receipt diagrams[].repairs - the document still renders. A fence may also carry views: [{id,label,nodes,note?}] (node ids of the active family), emitted as guided-view tabs above the diagram plus an inlined viewer script - clicking a tab lights the member nodes and the routes between them (subgraph), clicking a node lights it with its direct neighbors (ego graph), everything else dims;…

NameTypeReqDescription
markdownstringyesFull markdown document. Prose rides a plain offline shell; archify fenced code blocks carry typed zero-coordinate diagram JSON and render to inline SVG.
motionboolean|nullBake the entrance choreography into the artifact (default false): pure-declarative CSS animation — headings split into per-glyph/per- word spans that rise in with expo easing, prose blocks stagger up…
presetstring|nullVisual preset: "classic" (default), "signal-flow", "blueprint", or "editorial" — a palette family orthogonal to theme (each preset exists in both light and dark). The receipt records preset and theme…
qualitystring|nullQuality profile for the composition audit: "standard" (default) or "showcase" — the delivery gate. The audit grades route crossings, corridors, label clearance, rhythm, and projected text size in the…
session_idstring|nullOptional session ID: also load the rendered HTML into that live session (local and free) so session_screenshot / session_state can verify the artifact
themestring|nullColor theme: "light" (default) or "dark" — the shell background/ foreground and every SVG palette slot swap together; the receipt records which theme produced the bytes

No output schema declared.

No examples provided.

render_pdf ~445

Cut a rendered page into pages and package as PDF, PNGs, PPTX or DOCX. Print mode (no selector) paginates the document into fixed-height pages (default 794x1123, A4 @96dpi), breaking at top-level block boundaries — no half-cut text where a break can land on a block edge. Slides mode (selector set) makes one page per match, sized to that element — generate an HTML deck with one .slide per page and each becomes a deck page. format "pdf" (default) returns base64 image-based PDF; "png" returns one base64 PNG per page in pages_base64; "pptx" returns a base64 PPTX (one slide per page, deck-sized to the largest page); "docx" returns a base64 DOCX (one page-sized section per page, each section keeps its own height). Returns page count and packaging.

NameTypeReqDescription
formatstringOutput format: "pdf" (default), "png" (one base64 PNG per page), "pptx" (one slide per page, image-based), "pptx-native" (editable: element-level DrawingML — real text runs, gradient shapes, image pa…
heightintegerPage height in CSS pixels — print pagination only. Default 1123.
jpeg_qualityintegerJPEG quality for PDF page embedding (1-100). Default 90.
max_pagesintegerSafety cap on emitted pages. Default 50.
selectorstring|nullCSS selector; present → slides mode (one page per match, sized to the element). Absent → print mode (fixed-height pages at block boundaries).
tls_fingerprintstring|nullTLS fingerprint override (stealth mode only)
urlstringyesPage URL to cut into pages.
use_proxybooleanRoute through proxy (for blocked foreign sites)
widthintegerPage width in CSS pixels. Default 794 (A4 @96dpi).

No output schema declared.

No examples provided.

render_video ~575

Render a page's animation timelines to an MP4 video. The page's scripts must expose `window.__timelines` — objects with `duration()` and `pause(t)` (a paused gsap.timeline registered there works as-is). Each frame seeks every timeline to t=i/fps and paints the viewport, so the output is deterministic — no wall clock in the pixel values. Audio: `narration[]` places TTS/voice clips at start times (mixed into one AAC track), `audio` adds looped background music, and `subtitles_srt` muxes an SRT as a soft mov_text track and (by default, `burn_subtitles: false` to opt out) burns the same cues into the frame pixels — QuickTime, WeChat and most social embeds ignore the soft track. Requires ffmpeg on the server. Returns base64 MP4 (H.264, yuv420p) plus frame count and durations.

NameTypeReqDescription
audioBackground music: looped to cover the video, volume-scaled, faded out at the tail.
burn_subtitlesboolean|nullBurn the cues into the frame pixels too (hardsub) — on by default when `subtitles_srt` is present; QuickTime, WeChat and most social embeds ignore the soft mov_text track. `false` keeps the soft trac…
fpsnumberFrames per second. Default 24.
heightintegerViewport height in CSS pixels. Default 720.
hold_tail_secsnumberFreeze the final timeline state for this many extra seconds. Default 0.5.
max_duration_secsnumberSafety cap on timeline + hold tail, seconds. Default 120.
narrationarrayVoiceover clips, each starting at its own time (any TTS output; mixed into one AAC track).
subtitles_languagestring|nullISO language tag for the subtitle track, e.g. "eng" / "zh".
subtitles_srtstring|nullInline SRT subtitles muxed as a soft (toggleable) mov_text track.
tls_fingerprintstring|nullTLS fingerprint override (stealth mode only)
urlstringyesPage URL whose scripts register timelines in `window.__timelines` (GSAP-style objects with `duration()` + `pause(t)`).
use_proxybooleanRoute through proxy (for blocked foreign sites)
wait_timelines_msintegerHow long to wait for `window.__timelines` to appear, ms. Default 10000.
widthintegerViewport width in CSS pixels (floored to even — yuv420p). Default 1280.

No output schema declared.

No examples provided.

search ~296

Search the web across Baidu/Bing/Sogou/WeChat/Google (aggregated + deduped) and optionally fetch the top results' full content. Use when the agent needs to FIND information online - replaces a search API. Supports image search returning direct image URLs. Optional engines: ["baidu"]-style filter by engine name (invalid names error with the valid list; /doctor lists them with live health). Optional time_range day/week/month/year for news freshness (engines without dated results ignore it). Response carries engine_errors explaining any engine that contributed nothing (CAPTCHA suspension, transient failure).

NameTypeReqDescription
categoriesstringSearch categories (default: general)
enginesarrayRestrict to these engine names (e.g. ["baidu"], ["sogou_wechat"]). Empty = all engines serving `categories`. Invalid names return an error listing the valid ones.
fetch_topintegerFetch content for top N results
max_chars_perintegerMax characters per result content
max_resultsintegerMaximum number of results (default: 10)
qstringyesSearch query
time_rangestring|nullFreshness window: "day" | "week" | "month" | "year". Honored by engines with dated results (e.g. bing_news filters by pubDate); others ignore it.

No output schema declared.

No examples provided.

session_challenges ~218

One-call risk-control report: did this session hit an anti-bot wall? Taobao/tmall's x5 risk control answers 200 like a normal response — either a redirect onto a punish page (_____tmd_____/punish, punish.taobao.com) or an MTop API body carrying FAIL_SYS_USER_VALIDATE / RGV587 / x5secdata. Returns {total, events:[{url,method,status,kind,via}]} where via says whether the wall was navigated into ("url") or swallowed by an API response ("body"). When there are hits, the response also carries the account name (which identity got walled) and a `handoff` instruction: the engine detects and surfaces but does not auto-bypass — a human opens the live view (/live?session=<id> on the engine's HTTP port), solves the challenge in this session, and the retry rides the cookie that solving sets. Detection only; no automated solving or bypass.

NameTypeReqDescription
session_idstringyesSession ID

No output schema declared.

No examples provided.

session_click ~211

Click an interactive element by its index (from session_state output) inside a live browser session: scrolls it into view and fires a DOM click on the session's current page. Before clicking it re-verifies the element in the same frame — if the page changed since session_state (element detached, disabled, hidden, or covered by an overlay), it returns `clicked:false` with a `reason` ("detached"/"disabled"/"not_visible"/"covered_by") and, when covered, a `covered_by` description of the element that would eat the click — never a silent no-op. A submit click may navigate the session — the returned `url`/`text_after` reflect the page after the action, and session state (cookies, localStorage, globals) persists for follow-up calls. Indexes come from the most recent session_state; re-list after navigation.

NameTypeReqDescription
indexintegeryesElement index (from /state output)
session_idstringyesSession ID

No output schema declared.

No examples provided.

session_click_xy ~150

Click at viewport coordinates (CSS pixels) via real mouse events — pointerdown/mousedown, pointerup/mouseup, then click on whatever element is hit there. For canvas/map surfaces with no DOM element to index. click_count 2 adds dblclick.

NameTypeReqDescription
buttonstring|nullMouse button: "left" (default), "right", "middle"
click_countinteger|nullClick count: 1 single (default), 2 adds dblclick, 3+ sets detail
session_idstringyesSession ID
xnumberyesViewport X coordinate in CSS pixels
ynumberyesViewport Y coordinate in CSS pixels

No output schema declared.

No examples provided.

session_clone ~104

Derive a new browser session from a live one, carrying the full login state: cookies, localStorage/sessionStorage, viewport pin, dialog policy, proxy and keepalive flags. The source session stays untouched. Use to snapshot a logged-in state before risky actions, or to run the same login in parallel tabs. Returns {session_id (new), cloned_from, url, viewport}.

NameTypeReqDescription
session_idstringyesSession ID to derive from (stays alive and untouched)

No output schema declared.

No examples provided.

session_close ~52

Close a browser session and free its resources. For a persistent session this also drops the on-disk login snapshot - idle expiry keeps it, an explicit close does not.

NameTypeReqDescription
session_idstringyesSession ID

No output schema declared.

No examples provided.

session_console ~216

Read the session's recent page console output (log/info/warn/error) as {url, total, matched, messages:[{ts_ms, level, text, url}]}, newest last. Ring buffer of 500 entries; captures output from page scripts, clicks, evals and navigation alike. Optional filters: level (exact, e.g. "error"), since_ts (epoch ms), url_contains (page URL substring), limit (most recent N matches). The fastest way to see WHY a page misbehaves: click the button, call this, read the error.

NameTypeReqDescription
levelstring|nullOnly entries at this level: "log" | "info" | "warn" | "error"
limitinteger|nullKeep only the most recent N matching entries
session_idstringyesSession ID
since_tsinteger|nullOnly entries logged at or after this Unix epoch millisecond timestamp
url_containsstring|nullOnly entries whose page URL contains this substring

No output schema declared.

No examples provided.

session_cookies ~65

Export the session's current cookies as ["name=value", ...] for the page's URL. Use to persist a logged-in session and replay it later via session_create with cookies. Round-trips with session_create's cookies field.

NameTypeReqDescription
session_idstringyesSession ID

No output schema declared.

No examples provided.

session_create ~580

Create a persistent interactive browser session for multi-step interaction - clicking, typing, scrolling, reading state across page transitions. Use when the agent must INTERACT with a page (login flows, forms, pagination, click-through) rather than read it once. Returns session_id; persists 8 min idle. With persistent:true the login state survives idle eviction and server restarts - the same session_id revives logged-in.

NameTypeReqDescription
accountstring|nullRun as a named login identity (the multi-account layer): a private cookie jar seeded from the account record, write-back to the account store after every action. Concurrent logins (`taobao-scraper` v…
cookiesarrayCookies to inject before navigation: `"name=value"` strings or CDP-style objects `{"name","value","domain",...}`. Lets the session start already logged-in. Round-trips with session_cookies.
heightinteger|nullInitial viewport height in CSS pixels.
keepalivebooleanExempt the session from the idle reaper: it lives until session_close or server exit, so a workflow interrupted by long non-browser steps keeps its login state.
mobilebooleanMobile device emulation (coarse pointer, no hover) for the initial viewport.
persistentbooleanPersist the login state (cookies + localStorage/sessionStorage + viewport + dialog policy) to the server's local store after every action. If the session idles out — or the whole server restarts — th…
storageWeb Storage to inject after the initial navigation lands: {"local_storage": {"k":"v"}, "session_storage": {"k":"v"}}. For login states that live in localStorage rather than the cookie jar. Round-trip…
ttl_secsinteger|nullIdle time-to-live in seconds before the session is evicted (default: 480, clamped 60..3600). Raise it for long workflows.
urlstring|nullInitial URL to navigate to (optional)
use_proxybooleanRoute through proxy (default: false)
widthinteger|nullInitial viewport width in CSS pixels. Pinned for the session's life (survives navigation) so element rects and media queries anchor to the same layout across every page of the visit.

No output schema declared.

No examples provided.

session_dialog ~174

Inspect or flip the session's dialog policy for window.alert/confirm/prompt. Dialogs never block the page: each is auto-answered (default dismiss) and logged into session_console at level "dialog". action "list" reports {policy, prompt_text, dialogs}; "accept" makes subsequent confirm() true and prompt() return prompt_text (or the call's default argument); "dismiss" restores the default.

NameTypeReqDescription
actionstringyes"list" reports the policy and dialog history; "accept"/"dismiss" set the answer applied to subsequent window.confirm/prompt calls (alert is always logged, never blocking).
prompt_textstring|nullWith action "accept": text window.prompt returns once accepted (omitted keeps the current text).
session_idstringyesSession ID

No output schema declared.

No examples provided.

session_drag ~257

Drag the mouse from one viewport position to another: press at `from`, `steps` mousemove events, release at `to`. The trajectory is humanized by default (eased velocity, wobble, jittered timing, overshoot) — the shapes anti-bot checks score for; pass humanize:false for exact linear interpolation. Moves AMarker-style drag targets, canvas selections and captcha sliders that only track while the pointer travels.

NameTypeReqDescription
delay_msinteger|nullMean delay between moves in ms (default 18 humanized / 30 linear) — per-step timing is jittered around this when humanizing
fromyesWhere to press the mouse button down
humanizeboolean|nullHumanize the trajectory: minimum-jerk easing, perpendicular wobble, timing jitter, grip/settle pauses, occasional hesitation and overshoot-and-correct. Set false when a test/tool needs exact linear i…
session_idstringyesSession ID
stepsinteger|nullInterpolated mousemove events between from and to. Default: 24 with humanize on, 10 without
toyesWhere to release it

No output schema declared.

No examples provided.

session_eval ~179

Execute arbitrary JavaScript in a live browser session and return the result. Runs in the session's current page, so DOM mutations, globals and storage persist across calls — unlike the stateless eval tool, which loads its own throwaway page each call. Script-driven navigation moves the session's URL. JS exceptions are reported with name, line/column and stack.

NameTypeReqDescription
scriptstringyesJavaScript code to execute
session_idstringyesSession ID
timeout_msinteger|nullAwait budget for the script's promise in ms (default 5000, clamped 100..120000). Pass a larger budget for slow page-side work such as uploads through the page's own fetch; on expiry the tool errors w…

No output schema declared.

No examples provided.

session_export ~201

Export a browser session's recorded action log. Format "bash" (default) returns a runnable curl script that replays every recorded action (navigate/click/input/scroll/eval) against a fresh session on this server — hand it to a shell or cron, zero model tokens. Format "jsonl" returns the raw action log, one JSON object per line. Format "json" returns a flow.json document — the same recording as editable ops ({op, args}) with cookies/storage stripped — that flow_run replays server-side.

NameTypeReqDescription
formatstring|nullOutput format: "bash" (default) renders a runnable curl script that replays every recorded action against a fresh session; "jsonl" returns the raw action log, one JSON object per line; "json" returns…
session_idstringyesSession ID

No output schema declared.

No examples provided.

session_input ~179

Type text into an input/textarea element by its index (from session_state output), dispatching input/change events (full keyboard cycle per character with events:"full"). A disabled, readonly, or detached field answers `filled:false` with a `reason` instead of a silent write. Hidden inputs are legitimate targets and are filled normally.

NameTypeReqDescription
eventsstring|nullEvent fidelity: "full" types one character at a time with a keydown/keypress/input/keyup cycle per character, for pages whose listeners key on keyboard events (e.g. keypress-Enter login forms). Defau…
indexintegeryesElement index (from /state output)
session_idstringyesSession ID
textstringyesText to type into the input field

No output schema declared.

No examples provided.

session_list ~47

List live browser sessions with idle age and the time left before auto-eviction. Use to discover a session to reuse instead of creating a new one; sessions expire after 8 min idle.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

session_navigate ~39

Navigate a browser session to a new URL.

NameTypeReqDescription
session_idstringyesSession ID
urlstringyesURL to navigate to

No output schema declared.

No examples provided.

session_network ~411

Read the session's network request log. filter="media" extracts playback/stream URLs (m3u8/HLS, mp4, dash, flv...) actually requested by the page's player at runtime - the reliable way to get a real video link, since links embedded in page HTML are often decoys. Media elements and player iframes the engine never fetches (video/audio/source/iframe src) are merged in as candidates: via="network" entries are confirmed requests, via="dom" entries are candidates carrying their tag (iframes = kind "iframe", navigate into them to sniff). Default returns every request as compact rows (method/url/status/type/size). Navigate to the video page first, let it load, then call this.

NameTypeReqDescription
body_max_charsinteger|nullPer-body character cap for the `xhr` array (default 4000).
filterstring|null"media" extracts playback/stream links (m3u8/HLS, mp4, dash, ...) from the requests the page actually issued - the reliable way to get a real video link, since URLs embedded in page HTML are often de…
include_bodiesboolean|nullAdd an `xhr` array of background API responses (the page's own fetch/XHR traffic with retained bodies) alongside the request rows — the page's API face is often the cleanest structured read of its da…
session_idstringyesSession ID
url_containsstring|nullNarrow the `xhr` array to URLs containing this substring.

No output schema declared.

No examples provided.

session_screenshot ~184

Screenshot the session's CURRENT DOM state (mutations from clicks/evals included) as a base64 PNG via the built-in renderer. Width/height default to the session's viewport, so session_viewport + session_screenshot shows the responsive layout. Returns {url, width, height, image_base64, format}.

NameTypeReqDescription
full_pagebooleanCapture the full scrollable page instead of the viewport (default: false)
heightinteger|nullRender height in CSS pixels; defaults to the session's current viewport
selectorstring|nullCSS selector: capture only that element's box
selector_allbooleanWith selector, capture every match (default: first match only)
session_idstringyesSession ID
widthinteger|nullRender width in CSS pixels; defaults to the session's current viewport

No output schema declared.

No examples provided.

session_scroll ~71

Scroll the page up or down by a number of viewport-heights.

NameTypeReqDescription
amountintegerScroll amount in viewport-heights (default: 3)
directionstringScroll direction: "up" or "down" (default: down)
session_idstringyesSession ID

No output schema declared.

No examples provided.

session_set_files ~132

Select files on a file input programmatically (Playwright setInputFiles semantics): builds File objects from base64 content, assigns them to input.files, then dispatches input+change so framework onChange handlers fire. Selector-addressed because file inputs are often hidden and absent from the session_state index.

NameTypeReqDescription
filesarrayyesFiles to select
selectorstringyesCSS selector for the file input, e.g. "input[type=file]". File inputs are often hidden, so this is selector-addressed rather than using the /state index.
session_idstringyesSession ID

No output schema declared.

No examples provided.

session_state ~46

Get the current page state as an indexed list of interactive elements. Returns compact text with [N] indexes for use with click/input tools.

NameTypeReqDescription
session_idstringyesSession ID

No output schema declared.

No examples provided.

session_storage ~90

Snapshot the session's localStorage/sessionStorage for the current origin: {url, local_storage, session_storage}. Feed it back via session_create's `storage` field to restore a logged-in state in a new session — the half of login state that cookies can't carry (many sites keep the session token in localStorage). Call before the session idles out.

NameTypeReqDescription
session_idstringyesSession ID

No output schema declared.

No examples provided.

session_viewport ~160

Set the session's viewport (device emulation): scripts see innerWidth/innerHeight move, media queries like (max-width: 600px) re-evaluate, element rects re-anchor, and mobile=true flips pointer/hover matchMedia answers to coarse/none. Omitted width/height keeps the current value.

NameTypeReqDescription
heightinteger|nullViewport height in CSS pixels; omit to keep the current height
mobilebooleanMobile emulation: matchMedia answers pointer:coarse / hover:none and navigator.maxTouchPoints reports 5 (default: false)
session_idstringyesSession ID
widthinteger|nullViewport width in CSS pixels; omit to keep the current width

No output schema declared.

No examples provided.

session_wait ~192

Wait until a CSS selector matches or a JS predicate turns truthy, with a timeout. The page's event loop keeps running while waiting (fetches, timers, promise chains progress), so this replaces blind sleeps for async content: navigate, session_wait for '.price-card', then click/read. Returns {matched, elapsed_ms, detail:{tag,text} or the predicate value}; errors with `timeout ...` naming the selector/predicate on expiry. Exactly one of selector/predicate.

NameTypeReqDescription
predicatestring|nullJS expression polled until truthy (e.g. "document.querySelectorAll('.card').length >= 3")
selectorstring|nullCSS selector to wait for (e.g. ".price-card")
session_idstringyesSession ID
timeout_msintegerGive up after this many milliseconds (default: 10000, max: 120000)

No output schema declared.

No examples provided.

Common questions

What is the Aginx Browser MCP server?

Aginx Browser is an MCP server listed in the public MCP registry as net.aginx/aginxbrowser. Stealth web browser for agents: search, fetch, click, download and type in persistent MCP sessions. This page covers its hosted endpoint (https://browser.aginx.net/mcp).

Is the Aginx Browser MCP server safe to use?

Aginx Browser scores 75 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Aginx Browser MCP server expose?

Aginx Browser exposes 37 tools: account_delete, account_list, account_verify, cache, click, and 32 more. Their descriptions and schemas cost roughly 8,647 tokens of context every time the server is loaded.

Does the Aginx Browser MCP server require authentication?

No. We connected to Aginx Browser without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the Aginx Browser MCP server still maintained?

Aginx Browser is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.