Pure-Go browser for AI: fetches web pages, reduces them to meaningful content, and exposes them to AI models over MCP. Provides web browsing, content extraction, form interaction, and JavaScript rendering capabilities.
unblink is a high-quality web browsing MCP server with 18 well-designed tools. Most tools have clear descriptions (100 - 500 chars) and explicit input schemas with typed parameters and descriptions. However, there are notable gaps: output schemas are NOT documented anywhere in the source, the result structures for browse, click, submit_form, interact are inferred from descriptions alone. Parameter descriptions are generally excellent, but some tools lack dependency documentation. The server excels at security (one-shot auth, no credential exposure) and composition (each tool does one thing clearly). Tool naming follows verb_noun conventions well. The main deficit is lack of output schema documentation, which prevents LLMs from knowing what fields to expect in responses.
Cheaply orient on a page: returns its title, description, language, an outline of headings, counts of links/forms/images, and a short excerpt — without pulling the full content. Also hints whether the host publishes llms.txt and its robots.txt rules. Use before read to decide what to fetch; use the site tool for the full robots.txt/llms.txt.
Click an element on the page by CSS selector, wait for any navigation to complete, and return the new page's browse metadata. Optionally wait for specific content to appear after the click. Live sessions carry forward cookies and history; use session=... to persist state across calls.
List console output (console.log, console.error, etc.) captured during rendering. Includes level (log, info, warn, error), message text, and source location. Only available when render=true and JavaScript is enabled.
List interactive controls on the page (buttons, inputs, textareas, selects, links marked role=button, and custom elements with common ARIA roles). Each control includes its label, selector, and perceived type. Useful for planning what to click or fill before using click/submit_form/interact.
Get, set, or delete cookies in a session. get returns all cookies for the session; set adds/updates a cookie; delete removes a cookie by name. Cookies persist across tool calls within the same session.
Output schemas not documented. Tools like browse, click, submit_form, interact, controls, data, extract, requests, console, map return complex result objects, but their structure is never formally specified. LLMs must infer what fields are available from descriptions alone, causing selection errors and missed downstream data.
No pagination schema documented for list-returning tools. 'links' accepts a 'limit' param but output structure (whether it includes 'total', 'next_cursor', or page metadata) is not specified. LLMs cannot plan pagination loops reliably.
Parameter dependency hints missing. 'interact' accepts 'actions' (array of action objects) but does not specify the schema of those action objects inline or via reference. LLMs must reverse-engineer valid action types from the description text ('click|type|focus|blur|scroll|key|fill').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Extract structured data from the page using CSS selectors and optional attribute paths. Pass a list of field selectors (string or {selector, attr}); returns a list of records (each a map of field names to values). Useful for scraping tables, product listings, and other repeated content.
Extract structured data from the page using a schema: pass a schema object {field1: selector, field2: {selector, attr}, ...} and a scope (container to repeat over); for each scope match, the schema is applied relative to it. Like data but more flexible (skipped fields don't error).
Search the page's visible text for a substring (case-insensitive) and return up to N matching lines with context (N=5 by default, configurable). Lets an agent verify content is present without pulling the whole page.
List the page's HTML forms: their ids/names, detected labels, action, method, and input/textarea/select fields with types. Does not execute forms; use submit_form or interact to post.
Interact with page elements using low-level actions: type text, click, focus, blur, scroll, set form field values, and press keys. Returns the page's browse metadata after each action. Live sessions carry forward state; use session=... to build multi-step interactions.
List the page's links (text + absolute href), optionally filtered by a substring or restricted to internal (same-site) links.
Return a visual map of the page: an ASCII tree of all headings, links, forms, images, and other landmarks, indented to show nesting. Useful for understanding page structure at a glance without reading the full content.
Fetch a web page and return its main content as clean Markdown, with visual-only junk (scripts, styles, navigation, ads) removed. Large pages are paginated: pass the returned cursor to read the next page. mode=full returns the whole reduced page instead of just the main article. format=raw_html returns the unreduced page source (optionally scoped by a CSS selector) when reduction strips what you need — scripts, forms, or SSR-embedded JSON; format=text returns visible plain text. Non-HTML content is handled transparently: PDFs and plain text return their text, RSS/Atom/JSON feeds return an item list, JSON is pretty-printed, and images return a manifest (type/dimensions/size) — set include_bytes=true to also get the raw image as base64.
List the page's network requests made during rendering (logged automatically): HTTP method, URL, status, content-type, size, latency, and initiator. Filter by initiator kind (xhr, js, images, etc.) or search by URL substring. Only available when render=true and JavaScript is enabled.
Search the open web for a query. Returns a list of results with title, snippet, and URL. Requires a search provider (--search-provider brave|searxng) and optional API key (UNBLINK_SEARCH_API_KEY). Only available if configured.
Manage a browsing session: create (new session with optional initial auth), get (current page), list (all active sessions), or delete. Sessions carry cookies, history, and state across tool calls. Use session=<id> in any tool to reuse a session.
Fetch and return a site's robots.txt and llms.txt as plain text, parsed (crawl rules, user-agents, disallowed paths) or raw. Includes hints about the site's web framework, analytics, and CDN inferred from HTTP headers.
Fill fields in an HTML form and submit it. Optionally wait for a specific element or text to appear after submission. Returns the new page's browse metadata. Live sessions carry forward cookies and history; use session=... to persist state across calls.
No error recovery guidance. Tools like 'read', 'browse', 'click' can fail (network errors, timeouts, element not found), but the response format for errors is not documented. LLMs do not know whether errors are retryable, what fields are present on failure, or what to do next.
Tool annotations present but incomplete. Tools declare errorReporting=true and toolAnnotations=true, suggesting readOnlyHint and destructiveHint are used. However, source code does not show explicit registration of these hints on individual tool definitions, making it unclear which tools are marked read-only vs write.