Hyperbrowser
Server Details
Hyperbrowser MCP — wraps the Hyperbrowser AI-agent browsing API
The last two health checks of this connector failed. If this server requires authentication, missing or expired test credentials may be the cause. A test profile lets Glama authenticate for health checks and discover tools; it is separate from your personal connections.
If you are the author, claim ownership, then add or update a test profile under Admin → Test Profile.
- Status
- Unhealthy
- Uptime
- 0.2% over 35 days
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- pipeworx-io/mcp-hyperbrowser
- GitHub Stars
- 0
- Server Listing
- hyperbrowser
TDQS
Scored across 44 tools
Most tools have a describable niche, but there are several overlapping clusters: ask_pipeworx / ask_pipeworx_beta / ask_pipeworx_grounded / deep_research / validate_claim all answer questions, and entity_profile / company_facts / compare_entities / resolve_entity / company_register_search / recent_changes all cover company data. The polymarket_* suite (arbitrage, edges, edge_tracker, fill_risk, kalshi_spread, bet_research, resolution_audit/diff, kalshi_weather_edge) is dense and boundary selection leans on very long prose rather than clean separation. Descriptions do differentiate, but an agent must read carefully to avoid misselection.
Names are uniformly snake_case, with readable, predictable tokens and consistent vendor prefixes (hyperbrowser_crawl/scrape/extract). Patterns vary somewhat (verb_noun like resolve_entity vs noun_phrase like entity_profile, company_facts, deep_research) and a version suffix appears in ask_pipeworx_beta, but the convention is still easy to follow.
44 tools is far beyond the apparent scope implied by the server name 'Hyperbrowser', whose core surface is only crawl/scrape/extract plus a few web utilities. The remaining bulk is a broad data/analytics platform (SEC, FRED, FDA, prediction markets, memory, subscriptions) bundled into one server, which is heavy and hard to navigate.
Coverage is broad and mostly self-consistent: memory has remember/recall/forget, subscriptions have subscribe/unsubscribe/list_subscriptions/recent_alerts, prediction-market analysis is deep, and company/entity data spans resolution, profiles, comparisons and filings. Minor gaps exist (e.g. no browser screenshot/PDF or subscription-edit operation), but core workflows have no dead ends.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
12 tool updates
- Added
archive_compare - Added
archive_evidence - Changed
ask_pipeworx1 field changed- added
Input schema / properties / packsAdded value: +{ + "description": "OPTIONAL. Restrict routing to these pack slugs (e.g. [\"sec-form-d\",\"sec-13f\"]) — the router then picks only from tools in those packs. Omit for the default full-catalog routing. Slugs come from list_packs / search_packs / https://pipeworx.io/directory; unlisted or unknown slugs are ignored and named in _meta.pack_scope.ignored, and if none of them resolves the question is routed across the whole catalog with _meta.pack_scope.full_catalog:true (never an empty answer).", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
ask_pipeworx_beta1 field changed- added
Input schema / properties / packsAdded value: +{ + "description": "OPTIONAL. Restrict routing to these pack slugs (e.g. [\"sec-form-d\",\"sec-13f\"]) — the router then picks only from tools in those packs. Omit for the default full-catalog routing. Slugs come from list_packs / search_packs / https://pipeworx.io/directory; unlisted or unknown slugs are ignored and named in _meta.pack_scope.ignored, and if none of them resolves the question is routed across the whole catalog with _meta.pack_scope.full_catalog:true (never an empty answer).", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
ask_pipeworx_grounded1 field changed- added
Input schema / properties / prefer_toolAdded value: +{ + "description": "Run this exact tool instead of letting the router choose — use a name from a previous answer's alternatives[]. Arguments are still filled from your question. Unknown names are refused, never guessed.", + "type": "string" +}
- Added
classify_row - Changed
company_facts3 fields changed- changed
Input schema / examplesPrevious value: -[ - { - "attribute": "revenue", - "company": "AAPL", - "period": { - "fiscal_year": 2023, - "type": "annual" - } - } -]New value: +[ + { + "attribute": "revenue", + "company": "AAPL", + "period": { + "fiscal_year": 2023, + "type": "annual" + } + }, + { + "attribute": "shares_outstanding", + "company": "TSLA", + "period": { + "fiscal_quarter": 2, + "fiscal_year": 2026, + "type": "quarterly" + } + }, + { + "attribute": "capex", + "company": "TSLA", + "period": { + "fiscal_quarter": 2, + "fiscal_year": 2026, + "type": "quarterly" + } + }, + { + "attribute": "net_income", + "company": "TSLA", + "period": { + "fiscal_quarter": 4, + "fiscal_year": 2025, + "type": "quarterly" + } + } +] - changed
Input schema / properties / attribute / descriptionPrevious value: -"Which figure. \"revenue\" = total consolidated revenue; \"net_income\" = net income (loss); \"cash\" = cash and cash equivalents at the period end."New value: +"Which figure. \"revenue\" = total consolidated revenue; \"net_income\" = net income (loss); \"cash\" = cash and cash equivalents at the period end; \"gross_profit\"; \"operating_income\"; \"eps_diluted\" (diluted EPS, unit USD/shares, never derived or summed); \"capex\" (cash paid for PP&E); \"operating_cash_flow\" (net cash from operating activities); \"long_term_debt\" (the noncurrent balance-sheet line where the filer tags it, else total long-term debt — `fact.measure` says which); \"shares_outstanding\" (dei cover-page common shares, unit \"shares\", as of the COVER DATE rather than the period end)." - changed
Input schema / properties / attribute / enumPrevious value: -[ - "revenue", - "net_income", - "cash" -]New value: +[ + "revenue", + "net_income", + "cash", + "gross_profit", + "operating_income", + "eps_diluted", + "capex", + "operating_cash_flow", + "long_term_debt", + "shares_outstanding" +]
- Added
company_register_search - Changed
entity_profile2 fields changed- added
Input schema / properties / countryAdded value: +{ + "description": "OPTIONAL ISO 3166-1 alpha-2 of the business register you mean (\"NO\", \"FI\", \"GB\", \"JP\", \"FR\", \"EE\", \"BR\"). Only affects a NAME lookup, and is often what separates the company you mean from a US namesake. When a name resolves to a register entity with no CIK, the SEC/CIK-keyed sections are reported under `sources_skipped` with reason `not_queried` — they were never asked, which is not the same as having failed.", + "type": "string" +} - changed
Input schema / properties / value / descriptionPrevious value: -"Ticker (e.g., \"AAPL\"), zero-padded CIK (e.g., \"0000320193\"), or company name (e.g., \"Moderna\") — names resolve via SEC EDGAR company-name match."New value: +"Ticker (e.g., \"AAPL\"), zero-padded CIK (e.g., \"0000320193\"), or company name (e.g., \"Moderna\"). A NAME now resolves through the national business registers as well as SEC EDGAR, so a non-US company returns its register identity and record rather than `resolved: false`."
- Added
research_row - Changed
resolve_entity2 fields changed- added
Input schema / properties / countryAdded value: +{ + "description": "OPTIONAL ISO 3166-1 alpha-2 of the country whose business register you mean (\"NO\", \"FI\", \"JP\", \"GB\", \"FR\", \"EE\", \"BR\"). Narrows the national-register fan-out and is often the difference between the right company and a US namesake — \"Apple\" with country \"NO\" is a Norwegian company, not Apple Inc. Omitting it searches every register we can name, which is the right default when you do not know. company only; ignored for drug.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "brand": { + "type": "string" + }, + "candidates": { + "description": "Rivals, best first. Populated on \"ambiguous\" and on \"matched\" alike.", + "items": { + "properties": { + "country": { + "description": "ISO-2 of the REGISTER, not of the company's operations.", + "type": "string" + }, + "data_as_of": { + "description": "That register's own snapshot date, per row, so a stale country is visible.", + "type": [ + "string", + "null" + ] + }, + "detail_tool": { + "description": "The live pack tool that returns the full record, e.g. \"brreg-no:get_entity\".", + "type": [ + "string", + "null" + ] + }, + "legal_form": { + "type": [ + "string", + "null" + ] + }, + "legal_name": { + "type": "string" + }, + "lei": { + "description": "From the GLEIF crosswalk when present. Never guessed from a name.", + "type": [ + "string", + "null" + ] + }, + "match_type": { + "enum": [ + "id", + "exact", + "exact_form", + "prefix", + "tokens" + ], + "type": "string" + }, + "matched_kind": { + "enum": [ + "legal", + "trading", + "former", + "english", + "kana" + ], + "type": "string" + }, + "matched_name": { + "description": "The name row that matched, exactly as the publisher spells it.", + "type": "string" + }, + "register": { + "description": "Publisher + dataset, e.g. \"Brønnøysund Register Centre, Enhetsregisteret\". Never a URL or filename.", + "type": "string" + }, + "register_id": { + "description": "The native id in the register's own canonical formatting.", + "type": "string" + }, + "register_key": { + "description": "Stable machine slug for the register.", + "type": "string" + }, + "registration_status": { + "description": "GLEIF rows only: the LEI RECORD's lifecycle (ISSUED/LAPSED/RETIRED/...). A DIFFERENT fact from `status` — a lapsed LEI is unmaintained reference data about a company that may well still trade.", + "type": [ + "string", + "null" + ] + }, + "score": { + "description": "0-1, assigned centrally. An adapter never grades itself.", + "type": "number" + }, + "status": { + "description": "The COMPANY's status.", + "enum": [ + "active", + "inactive", + "dissolved", + "unknown" + ], + "type": "string" + }, + "status_raw": { + "description": "The register's own status word, verbatim and unglossed.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "country", + "register", + "register_key", + "register_id", + "legal_name", + "score", + "status" + ], + "type": "object" + }, + "type": "array" + }, + "cik_withheld": { + "description": "A CIK that came back from a FUZZY SEC name match and is NOT asserted, because the spine matched a stronger non-US candidate. The number is here so a caller who wanted the US filer can still use it; what changed is that we no longer claim it IS the answer. See `unresolved.cik` for the reason.", + "type": "string" + }, + "fanout_incomplete": { + "description": "Present IFF at least one register in `searched[]` carried an `error` — set even when `match_status` stayed \"ambiguous\". `withheld_match` is the candidate this call declined to ASSERT because a register was missing, carried rather than discarded so a caller who accepts the caveat can still use it.", + "properties": { + "unavailable": { + "items": { + "properties": { + "country": { + "type": "string" + }, + "error": { + "type": "string" + }, + "register": { + "type": "string" + }, + "register_key": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "withheld_match": { + "type": [ + "object", + "null" + ] + } + }, + "type": "object" + }, + "figi_withheld": { + "description": "A FIGI that matched this name in OpenFIGI (`figi_match: \"name_search\"`) and is NOT asserted, because `match_status` is \"incomplete\": a name search cannot tell a company apart from a security carrying its name, and the registers that would have settled it are the ones we could not ask. A `ticker_map` FIGI is never withheld this way — it is corroborated by the resolved ticker it came from. Carried so a caller who accepts the caveat can use it; see `unresolved.figi`, and retry, since a transiently rate-limited register completes on the next call.", + "type": "string" + }, + "ids": { + "description": "Every identifier established: cik, ticker, company_name, lei, figi, isin, cusip, register_id, register_country. A key absent here appears in `unresolved` with a reason — never silently dropped.", + "type": "object" + }, + "ingredient": { + "type": "string" + }, + "match_explanation": { + "description": "Plain words. Always present when the spine ran, and required on \"ambiguous\" and \"no_match\".", + "type": "string" + }, + "match_scoring": { + "description": "The margin rule's own inputs, so a caller can see WHY it fell where it did.", + "properties": { + "margin": { + "type": [ + "number", + "null" + ] + }, + "runner_up": { + "type": [ + "number", + "null" + ] + }, + "thresholds": { + "properties": { + "floor": { + "type": "number" + }, + "margin": { + "type": "number" + }, + "match": { + "type": "number" + } + }, + "type": "object" + }, + "top": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "match_status": { + "description": "The headline to branch on. \"ambiguous\" is an ANSWER, not a failure: two companies matched the name equally well and both are in `candidates`. \"no_match\" means every register in `searched` was asked and none carried it. \"incomplete\" means one of them could NOT be asked (it carries an `error` in `searched[]`), so the candidate set is short by an unknown amount and no id is asserted — distinct from \"ambiguous\" because a RETRY is what resolves it, not a narrower query; `fanout_incomplete` names the unreachable registers and carries, under `withheld_match`, the candidate that would have been returned on a complete fan-out.", + "enum": [ + "matched", + "ambiguous", + "no_match", + "incomplete" + ], + "type": "string" + }, + "notes": { + "type": "string" + }, + "query": { + "type": "string" + }, + "registers": { + "description": "The matched entity as every register that carries it — the match (flagged `matched: true`) plus anything that collapsed into it. A Companies House number AND the LEI that crosswalks to it are the SAME answer, not rivals.", + "items": { + "properties": { + "country": { + "description": "ISO-2 of the REGISTER, not of the company's operations.", + "type": "string" + }, + "data_as_of": { + "description": "That register's own snapshot date, per row, so a stale country is visible.", + "type": [ + "string", + "null" + ] + }, + "detail_tool": { + "description": "The live pack tool that returns the full record, e.g. \"brreg-no:get_entity\".", + "type": [ + "string", + "null" + ] + }, + "legal_form": { + "type": [ + "string", + "null" + ] + }, + "legal_name": { + "type": "string" + }, + "lei": { + "description": "From the GLEIF crosswalk when present. Never guessed from a name.", + "type": [ + "string", + "null" + ] + }, + "match_type": { + "enum": [ + "id", + "exact", + "exact_form", + "prefix", + "tokens" + ], + "type": "string" + }, + "matched_kind": { + "enum": [ + "legal", + "trading", + "former", + "english", + "kana" + ], + "type": "string" + }, + "matched_name": { + "description": "The name row that matched, exactly as the publisher spells it.", + "type": "string" + }, + "register": { + "description": "Publisher + dataset, e.g. \"Brønnøysund Register Centre, Enhetsregisteret\". Never a URL or filename.", + "type": "string" + }, + "register_id": { + "description": "The native id in the register's own canonical formatting.", + "type": "string" + }, + "register_key": { + "description": "Stable machine slug for the register.", + "type": "string" + }, + "registration_status": { + "description": "GLEIF rows only: the LEI RECORD's lifecycle (ISSUED/LAPSED/RETIRED/...). A DIFFERENT fact from `status` — a lapsed LEI is unmaintained reference data about a company that may well still trade.", + "type": [ + "string", + "null" + ] + }, + "score": { + "description": "0-1, assigned centrally. An adapter never grades itself.", + "type": "number" + }, + "status": { + "description": "The COMPANY's status.", + "enum": [ + "active", + "inactive", + "dissolved", + "unknown" + ], + "type": "string" + }, + "status_raw": { + "description": "The register's own status word, verbatim and unglossed.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "country", + "register", + "register_key", + "register_id", + "legal_name", + "score", + "status" + ], + "type": "object" + }, + "type": "array" + }, + "related": { + "description": "Entities that collapsed INTO the match, each carrying `collapsed_by`.", + "items": { + "properties": { + "country": { + "description": "ISO-2 of the REGISTER, not of the company's operations.", + "type": "string" + }, + "data_as_of": { + "description": "That register's own snapshot date, per row, so a stale country is visible.", + "type": [ + "string", + "null" + ] + }, + "detail_tool": { + "description": "The live pack tool that returns the full record, e.g. \"brreg-no:get_entity\".", + "type": [ + "string", + "null" + ] + }, + "legal_form": { + "type": [ + "string", + "null" + ] + }, + "legal_name": { + "type": "string" + }, + "lei": { + "description": "From the GLEIF crosswalk when present. Never guessed from a name.", + "type": [ + "string", + "null" + ] + }, + "match_type": { + "enum": [ + "id", + "exact", + "exact_form", + "prefix", + "tokens" + ], + "type": "string" + }, + "matched_kind": { + "enum": [ + "legal", + "trading", + "former", + "english", + "kana" + ], + "type": "string" + }, + "matched_name": { + "description": "The name row that matched, exactly as the publisher spells it.", + "type": "string" + }, + "register": { + "description": "Publisher + dataset, e.g. \"Brønnøysund Register Centre, Enhetsregisteret\". Never a URL or filename.", + "type": "string" + }, + "register_id": { + "description": "The native id in the register's own canonical formatting.", + "type": "string" + }, + "register_key": { + "description": "Stable machine slug for the register.", + "type": "string" + }, + "registration_status": { + "description": "GLEIF rows only: the LEI RECORD's lifecycle (ISSUED/LAPSED/RETIRED/...). A DIFFERENT fact from `status` — a lapsed LEI is unmaintained reference data about a company that may well still trade.", + "type": [ + "string", + "null" + ] + }, + "score": { + "description": "0-1, assigned centrally. An adapter never grades itself.", + "type": "number" + }, + "status": { + "description": "The COMPANY's status.", + "enum": [ + "active", + "inactive", + "dissolved", + "unknown" + ], + "type": "string" + }, + "status_raw": { + "description": "The register's own status word, verbatim and unglossed.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "country", + "register", + "register_key", + "register_id", + "legal_name", + "score", + "status" + ], + "type": "object" + }, + "type": "array" + }, + "resolved": { + "description": "At least one identifier was established. Read `match_status` and `unresolved` for WHICH — a company can be resolved in a national register with no CIK at all.", + "type": "boolean" + }, + "resources": { + "type": "object" + }, + "searched": { + "description": "EVERY register asked, with its own as-of date and row count. A register that could not be reached carries `error` — 0 rows with an error is \"we could not ask\", 0 rows without one is \"nothing is there\", and they are different answers.", + "items": { + "properties": { + "country": { + "type": "string" + }, + "data_as_of": { + "type": [ + "string", + "null" + ] + }, + "error": { + "type": "string" + }, + "register": { + "type": "string" + }, + "register_key": { + "type": "string" + }, + "rows": { + "type": "number" + } + }, + "required": [ + "register", + "register_key", + "country", + "rows" + ], + "type": "object" + }, + "type": "array" + }, + "sec_alternatives": { + "description": "EDGAR's own discarded near-misses on a name match, surfaced instead of dropped.", + "items": { + "properties": { + "cik": { + "type": "string" + }, + "company_name": { + "type": "string" + }, + "ticker": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "sources": { + "description": "Per-identifier provenance. Every key in `ids` has a matching key here.", + "type": "object" + }, + "type": { + "type": "string" + }, + "unresolved": { + "description": "Per-identifier reason an id could NOT be established — the honest twin of `ids`.", + "type": "object" + } + }, + "required": [ + "type", + "query", + "resolved", + "ids", + "sources", + "unresolved" + ], + "type": "object" +}
- Changed
subscribe2 fields changed- changed
Input schema / properties / params / descriptionPrevious value: -"Type-specific filter. sec_8k: {ticker:\"AAPL\", items?:[\"5.02\",\"1.01\"]}. polymarket_edge: {topic:\"fed\", min_spread_bps?:500}. fred_series: {series_id:\"UNRATE\"}. patent_grant: {applicant:\"Apple Inc.\"}. clinical_trial: {sponsor?:\"Pfizer\", condition?:\"lung cancer\", phase?:\"PHASE3\"} (sponsor or condition required)."New value: +"Type-specific filter. sec_8k: {ticker:\"AAPL\", items?:[\"5.02\",\"1.01\"]}. polymarket_edge: {topic:\"fed\", min_spread_bps?:500}. fred_series: {series_id:\"UNRATE\"}. patent_grant: {applicant:\"Apple Inc.\"}. clinical_trial: {sponsor?:\"Pfizer\", condition?:\"lung cancer\", phase?:\"PHASE3\"} (sponsor or condition required). form_d: {state?:\"CA\", industry?:\"Biotechnology\", min_amount?:500000, exemption?:\"06B\"} (all optional — omit all to watch every new Form D nationwide). news_keyword: {query:\"\\\"semiconductor sanctions\\\"\", lang?:\"eng\", domains?:[\"reuters.com\"]} (query required). job_post: EITHER {ats:\"greenhouse\", board_token:\"acme\"} (exact board) OR {domain:\"acme.com\"} (auto-detected), plus optional title_query/location_query substrings. tool_diff: {tool:\"form5500\", args?:{...}, fields:[\"headcount\"], schedule:\"daily\"} — re-runs that tool on schedule and fires when the named fields change; tool must be read-only and not need a Pipeworx-held platform key; schedule \"hourly\" needs the paid tier. new_entity: {state:\"CO\", name_query?:\"dental\", entity_type?:\"limited liability\"} — state is required and must be one of FL, NY, CO, OR, CT, TX, PA. tech_change: {domains:[\"acme.com\",\"example.org\"], technologies?:[\"Shopify\",\"Segment\"]} — domains required (1-200), technologies optional (exact names, case-insensitive) to narrow which detected technologies alert. Unknown keys in form_d/news_keyword/job_post/tool_diff/new_entity/tech_change params are rejected at subscribe time." - changed
Input schema / properties / type / enumPrevious value: -[ - "sec_8k", - "polymarket_edge", - "fred_series", - "patent_grant", - "clinical_trial" -]New value: +[ + "sec_8k", + "polymarket_edge", + "fred_series", + "patent_grant", + "clinical_trial", + "form_d", + "news_keyword", + "job_post", + "tool_diff", + "new_entity", + "tech_change" +]
1 tool update
- Changed
release_calendar_markets2 fields changed- added
Output schema / properties / empty_reasonAdded value: +{ + "description": "Present ONLY on a zero-release window: \"no_releases_in_window\". The window was queried and nothing is scheduled — this is an answer, not a failure.", + "type": "string" +} - added
Output schema / properties / hintAdded value: +{ + "description": "Present ONLY on a zero-release window: what to change (usually a wider `hours`).", + "type": "string" +}
39 tool updates
- First observed
ai_visibility_check - First observed
ask_pipeworx - First observed
ask_pipeworx_beta - First observed
ask_pipeworx_grounded - First observed
bet_research - First observed
company_facts - First observed
compare_entities - First observed
deep_research - First observed
discover_tools - First observed
entity_profile - First observed
forget - First observed
generate_llms_txt - First observed
hyperbrowser_crawl - First observed
hyperbrowser_extract - First observed
hyperbrowser_scrape - First observed
kalshi_weather_edge - First observed
list_subscriptions - First observed
pipeworx_feedback - First observed
pipeworx_trending - First observed
polymarket_arbitrage - First observed
polymarket_edge_tracker - First observed
polymarket_edges - First observed
polymarket_fill_risk - First observed
polymarket_kalshi_spread - First observed
recall - First observed
recent_alerts - First observed
recent_changes - First observed
release_calendar_markets - First observed
remember - First observed
resolution_audit - First observed
resolution_diff - First observed
resolve_entity - First observed
scan_competitor_ai_presence - First observed
scan_dependency - First observed
search_within - First observed
subscribe - First observed
suggest_questions - First observed
unsubscribe - First observed
validate_claim
Related MCP Connectors
Stealth web browser for agents: search, fetch, click, download and type in persistent MCP sessions.
Scrape, crawl and search the web for AI agents via MCP.
Control a real browser from AI agents: navigate, click, type, screenshot, read the page.
Web scraping, extraction and search for AI agents. Hosted MCP with workspace API keys.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceMCP server that wraps agent-browser to let LLMs control a real browser, providing tools for navigation, interaction, reading page content, accessibility snapshots, screenshots, and session management.1-
- AlicenseNot gradedqualityAmaintenanceConnects MCP-compatible AI agents to an anti-detection browser server, exposing dozens of tools for navigation, page interaction, search, content extraction, downloads, multi-tab handling, and persistent sessions. It lets agents automate and scrape the web at scale using accessibility snapshots, CSS-selector fallbacks, saved profiles, and batch workflows over stdio or authenticated HTTP transport.201 npmMIT
- FlicenseNot gradedqualityCmaintenanceHeadless browser automation for LLM agents via REST API or MCP tools. Enables navigating pages, reading structured content, clicking elements, filling forms, and executing JavaScript.-
- FlicenseNot gradedqualityAmaintenanceUltra-lightweight headless browser for AI agents. Provides MCP tools for navigating URLs, extracting structured content, and building autonomous agent workflows.2-
Glama MCP Gateway
Add one secure layer between your agents and this server.