Skip to main content
Glama

local-web — local web search / fetch MCP for Claude Code

A thin local MCP server (FastMCP, HTTP transport) over three components:

Component

Role

Runs

SearXNG

metasearch (Google/Bing/DuckDuckGo/Scholar/…), JSON API

127.0.0.1:8888 (own venv, searxng/)

Crawl4AI

JS-rendered page → LLM markdown (Playwright Chromium)

inside the MCP server process

PyMuPDF 2.x

PDF → markdown

inside the MCP server process

arXiv / alphaxiv / GitHub / HuggingFace APIs

dedicated citation & code lookups

no local component

Everything is managed with uv. The MCP project (this folder) is a uv project (pyproject.toml + uv.lock); SearXNG is a git checkout with a uv-managed venv.

Tools

  • web_search(query, num_results=8, engine="auto", searx_engines="", time_range="") — general web search (SearXNG: Google/Bing/…), automatic DuckDuckGo (ddgs) fallback. Pin engines with searx_engines="google". time_range: day|week|month|year.

  • scholar_search(query, num_results=8) — Google Scholar via SearXNG (engines=google scholar); no offline fallback (SearXNG must be running).

  • github_search(query, kind="repo"|"issue"|"code", num_results=8) — GitHub REST API. Code search needs GITHUB_TOKEN env var; unauthenticated limit is 10 search req/min.

  • huggingface_search(query, kind="model"|"dataset", num_results=8, pipeline="") — HF API. query matches name/ID substrings (e.g. "wan"), not full text; pipeline filters by task tag (e.g. "video-classification").

  • libgen_search(query, num_results=8) — scrapes libgen.li's index.php?req= results table (best-effort; the site changes and may block). Returns title, authors, publisher, year, language, pages, size, extension, md5, plus item_url (edition page) and file_url (file page with download mirrors).

  • arxiv_search(query, max_results=5) — arXiv API entries (id, title, authors, date, abstract, abs URL; PDF = same URL with .pdf). Retries up to 3× with backoff on transient timeouts. arXiv policy: ≤1 req/3s, one connection at a time; the server spaces arxiv.org requests 5s apart and, on a 429 ("Rate exceeded"), pauses the whole domain ~5 min for all agents instead of retrying into the burst counter.

  • alphaxiv_lookup(arxiv_id, lang="en") — AI overview of an arXiv paper (blurb/problem/solution/key-insights/results, the machine-readable report, abstract, bibtex, cited papers). Bare ID (2402.02085) or URL. For a short blurb this is the fastest path. fetch_page/fetch_pdf of arXiv paper URLs already route through alphaxiv first, so you rarely need to call these directly — use them when you want the structured overview rather than raw text.

  • alphaxiv_fulltext(arxiv_id, offset=0, max_chars=20000) — full extracted paper text as markdown, paginated like fetch_page. For equations/tables/ section detail the lookup card doesn't have.

  • fetch_page(url, offset=0, max_chars=20000) — rendered markdown, paginated: call again with offset = offset + max_chars while offset < total_chars. Browser concurrency is capped (semaphore, BROWSER_SLOTS, default 4). arXiv paper URLs (abs/pdf) are routed through alphaxiv first — the result's source field says which answered (alphaxiv | browser | arxiv-direct).

  • fetch_stealth(url, offset=0, max_chars=20000, solve_cloudflare=False) — Scrapling StealthyFetcher (stealth-patched headless Chromium: real browser UA, canvas noise, WebRTC blocking, spoofed locale/timezone). Use when fetch_page gets blocked or returns a challenge page. solve_cloudflare=True solves Cloudflare Turnstile/interstitials (slow, 1–3 min when it has to). Paginated the same way.

  • fetch_pdf(url, offset=0, max_chars=20000) — PDF → markdown (PyMuPDF 2.x), paginated the same way. For arXiv paper PDFs the default route is alphaxiv's extracted text; the direct download happens only when alphaxiv lacks the paper.

Related MCP server: mcp-web

Run / registration (two modes)

Name

Transport

Lifecycle

local-web

stdio — the default

Claude Code spawns uv run python server.py per session (like the chrome-devtools plugin). Nothing to start, nothing to keep alive.

local-web-shared

HTTP :9000

One long-lived server shared by all sessions (shared rate-limit gate + browser pool). Auto-starts at logon (scheduled task local-web-mcp-stack → autostart.vbs) and self-heals at every session start (SessionStart hook → check-and-start.bat).

Both modes also use SearXNG on :8888 for web_search/scholar_search (web_search falls back to DuckDuckGo if SearXNG is down). check-and-start.bat is idempotent: it starts only whatever port is not listening.

Manual launch (visible windows): start-all.bat / ./start-all.sh, or individually start-searxng.* / start-server.* (the server launchers set MCP_TRANSPORT=http).

Re-register from scratch (both at user scope):

claude mcp add -s user local-web -- <path to uv> run --directory <this folder> python server.py
claude mcp add -s user local-web-shared --transport http http://127.0.0.1:9000/mcp
claude mcp list        # both should show Connected

Note: with both registered, a session sees the 11 tools twice (once per server prefix). Use local-web (stdio) for everyday work; the shared one is for running several sessions/agents concurrently against one browser pool.

Tests

uv run pytest                          # unit tests: pure helpers + domain gate
                                       # (fake clock, no network, ~1s)
uv run python smoke_test.py            # live end-to-end, all 11 tools
SKIP_ARXIV=1 uv run python smoke_test.py   # skip arXiv while it's rate-limiting

Unit tests run in CI (.github/workflows/ci.yml); the smoke test hits the live HTTP server (start it with check-and-start.bat or start-all.bat), so it's local-only.

(Re)setup from scratch

# MCP project (this folder)
uv add fastmcp crawl4ai httpx pymupdf beautifulsoup4 ddgs "scrapling[fetchers]" markdownify
uv run python -m playwright install chromium    # Crawl4AI + Scrapling browsers
uv run scrapling install                        # marks Scrapling's browser deps installed

# SearXNG (searxng/ — clone of github.com/searxng/searxng at depth 1)
uv venv searxng/.venv --python 3.11
uv pip install --python searxng/.venv -r searxng/requirements.txt

SearXNG user settings live in searxng/searx/settings/user-settings.yml: search.formats includes json (default is html-only → JSON returns 403) and server.limiter: false. The dev runner generates no storage dependency; if you see botdetection/limiter errors, keep limiter: false (there is no valkey/redis).

Note on cloning SearXNG on Windows: the repo contains a file whose name includes a colon (utils/templates/etc/httpd/sites-available/searxng.conf:socket), which Windows cannot check out. Clone with --no-checkout and restore only what is needed: git checkout HEAD -- searx requirements.txt.

Security

  • The MCP server binds to 127.0.0.1 only and has no auth layer — do not expose it (no tailscale/0.0.0.0 binding).

  • Fetched web content is untrusted data (prompt-injection vector). Keep side-effecting tools (shell, file writes) out of any agent that browses.

  • Search/fetch hit the public internet normally; be considerate (the semaphore and Crawl4AI's cache mitigate re-hammering).

Troubleshooting

  • web_search errors mention searxng: … → SearXNG not running (start it). engine in the result shows which backend answered (searxng or ddg).

  • SearXNG JSON 403 → json missing from search.formats in user-settings.yml.

  • fetch_page browser errors → uv run python -m playwright install chromium.

  • Crawl4AI setup check: uv run python -c "import crawl4ai_doctor" or uv run crawl4ai-doctor if the CLI is exposed by the installed version.

  • Ports in use: SearXNG 8888, MCP 9000 (SEARXNG_URL env var overrides the SearXNG address in server.py).

  • arxiv_search returns a 429 error: the arXiv burst counter is active (can last ~15 min). Don't retry in a loop — that refreshes the window. Fetch the specific papers via alphaxiv_lookup/alphaxiv_fulltext meanwhile. SKIP_ARXIV=1 uv run python smoke_test.py skips the arXiv case during a throttle window.

Available Tools

11 tools
alphaxiv_fulltextAlphaxiv FulltextA

Full extracted text of an arXiv paper as markdown from alphaxiv.org. Not subject to arXiv rate limits; use instead of fetch_page/fetch_pdf for arXiv papers when you need section-level detail. Paginated like fetch_page. Accepts a bare ID or an arxiv/alphaxiv URL.

NameRequiredDescriptionDefault
offsetNo
arxiv_idYes
max_charsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, so the description carries the burden and does disclose real behavioral traits: it is not subject to arXiv rate limits and it is paginated like fetch_page. It omits auth/permission requirements and failure modes (e.g. a paper not indexed by alphaxiv), which keeps it off a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the identity of the tool followed by the reason to prefer it. Nothing is repeated from the title and every clause adds routing or behavioral information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return format need not be restated, and the description covers routing, source, and pagination. The remaining gap is the undocumented max_chars parameter, which an agent must guess at to control response size.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the schema itself has no per-field descriptions for offset or max_chars. The description clarifies arxiv_id (bare ID or arxiv/alphaxiv URL) and hints that paging works via offset, but max_chars is never mentioned, leaving a third of the surface undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (extract), resource (full text of an arXiv paper) and format (markdown from alphaxiv.org). The scoping clause about rate limits and section-level detail lets an agent distinguish it from fetch_page/fetch_pdf without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternatives to use instead (fetch_page/fetch_pdf) and the condition that selects this tool: arXiv papers needing section-level detail. It also states the negative condition implicitly by limiting scope to arXiv papers.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

alphaxiv_lookupAlphaxiv LookupA

Look up an arXiv paper on alphaxiv.org: AI-generated structured overview (blurb, problem, solution, key insights, results), the machine-readable report, abstract, bibtex, and cited papers. Accepts a bare ID (2402.02085, version suffix ok) or an arxiv/alphaxiv URL. Use alphaxiv_fulltext when you need equations, tables, or section-level detail.

NameRequiredDescriptionDefault
langNoen
arxiv_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, so the description carries the full burden. It discloses the shape of the payload (overview fields, machine-readable report, abstract, bibtex, citations), which is real behavioral context, and the read-only nature is implied by 'look up'. However it says nothing about failure modes (paper not indexed on alphaxiv), rate limits, or whether the overview is cached/stale — gaps that matter for an agent deciding whether to trust the result.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and return content, then the input format flexibility, then the sibling routing rule. Every sentence earns its place; no filler or restatement of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the return-value enumeration is bonus context rather than a necessity, and the accepted input formats are fully covered. The only substantive gap for a 2-parameter lookup is the unexplained lang parameter and any note on behavior when a paper lacks an alphaxiv entry.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It does well for arxiv_id: bare ID, version suffix, and arxiv/alphaxiv URL forms are all spelled out. But the second parameter, lang, is entirely undocumented in both schema and description, leaving half the surface unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (look up) and resource (an arXiv paper on alphaxiv.org), then enumerates exactly what is returned: structured overview, report, abstract, bibtex, cited papers. The distinction from alphaxiv_fulltext is made explicit, so the agent can discriminate without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear routing rule: use alphaxiv_fulltext when equations, tables, or section-level detail are needed. That's a genuine exclusion for the most confusable sibling. Other siblings (arxiv_search, fetch_pdf, fetch_page) aren't addressed, so the guidance is good but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_pageFetch PageA

Fetch a web page (JS-rendered via headless Chromium) as markdown. Paginated: returns the slice [offset, offset+max_chars) plus total_chars; call again with a larger offset to continue. For arXiv paper URLs the default route is alphaxiv.org's extracted text (not subject to arXiv rate limits); the browser is used only when alphaxiv doesn't have the paper. source says which one answered ("alphaxiv" | "browser" | "arxiv-direct"). On failure returns {"success": false, "error": ...}.

NameRequiredDescriptionDefault
urlYes
offsetNo
max_charsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does well: it discloses the rendering backend, pagination model, the arXiv routing and its rate-limit implications, the `source` provenance field, and the exact failure shape. It omits auth/rate-limit behavior for non-arXiv sites and timeout characteristics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action in the first sentence and then layers pagination, routing, provenance, and error contract. Dense but nearly every clause adds callable information; minor overlap between the pagination and source-provenance sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be fully described, and the description covers the pagination and error cases that matter. A note on non-arXiv fetch limits or timeouts would complete it, but nothing essential to a correct call is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it explains the offset/max_chars slice semantics and continuation pattern clearly, plus the url-dependent arXiv routing. It does not state the default values (0, 20000) or units, but the slice notation conveys enough to call correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: fetch a web page as markdown, rendered via headless Chromium. This implicitly distinguishes it from fetch_stealth/fetch_pdf (JS rendering, markdown output), though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear operational guidance for continuing pagination ('call again with a larger offset') and for arXiv URLs (alphaxiv default, browser fallback). However, it offers no guidance on when to choose this tool over fetch_stealth, fetch_pdf, or web_search.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_pdfFetch PdfA

Download a PDF and convert it to markdown (PyMuPDF 2.x). Paginated like fetch_page. For arXiv paper PDFs the default route is alphaxiv.org's extracted text (not subject to arXiv rate limits); the direct download is used only when alphaxiv doesn't have the paper. source says which one answered ("alphaxiv" | "direct" | "arxiv-direct"). On failure returns {"success": false, "error": ...}.

NameRequiredDescriptionDefault
urlYes
offsetNo
max_charsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so well: it names the conversion engine (PyMuPDF 2.x), explains pagination, discloses the routing logic and rate-limit rationale, identifies the `source` value, and states the failure response shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and conversion detail, then adds routing and failure behavior without unnecessary repetition. Every sentence contributes useful operational context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description need not fully document return values, and it already covers routing and failure behavior. The main completeness gap is that parameter behavior is left almost entirely to an undocumented schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain the `url`, `offset`, or `max_chars` parameters. The phrase "Paginated like fetch_page" gives only a weak hint about offset/max_chars and does not compensate for the missing parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: "Download a PDF and convert it to markdown." It also differentiates the tool from fetch_page by noting pagination behavior and explains the arXiv-specific routing, so an agent can distinguish its role without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear conditional guidance for arXiv paper PDFs: alphaxiv is the default extracted-text route, and direct download is used only when alphaxiv lacks the paper. However, it does not explicitly say when to choose fetch_pdf over siblings such as fetch_page, fetch_stealth, or alphaxiv_fulltext beyond the PDF conversion context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_stealthFetch StealthA

Fetch a page with Scrapling's StealthyFetcher (stealth-patched headless Chromium: real browser UA, canvas noise, WebRTC blocking, spoofed locale/timezone) as markdown. Use when fetch_page gets blocked or returns a challenge/error page. solve_cloudflare=True also solves Cloudflare Turnstile/interstitial challenges (slow: 1-3 min when it has to). Paginated like fetch_page. On failure returns {"success": false, "error": ...}.

NameRequiredDescriptionDefault
urlYes
offsetNo
max_charsNo
solve_cloudflareNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, and the description carries the full burden well: it discloses the stealth emulation surface, the latency cost of Cloudflare solving, pagination parity with fetch_page, and the exact failure payload shape. Those are precisely the traits an agent needs before committing to a slow fallback.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the sibling comparison in the second sentence, and every clause carries information. The long technical parenthetical is dense but earns its space by defining what 'stealth' actually means.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values needn't be spelled out, and the failure envelope is still noted. What remains thin is the pagination parameter behavior (offset/max_chars), which an agent must infer from 'paginated like fetch_page'.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate for all four parameters. It explains solve_cloudflare meaningfully (Turnstile/interstitial solving plus its cost) and implies offset via 'Paginated like fetch_page', but max_chars and offset semantics/defaults are left entirely to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (fetch a page via Scrapling's StealthyFetcher) and immediately distinguishes it from the sibling fetch_page by naming the condition that selects it. The parenthetical on stealth features makes the capability concrete rather than tautological.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing rule: 'Use when fetch_page gets blocked or returns a challenge/error page', with a named alternative and a stated tradeoff (1-3 min with solve_cloudflare). No inference required from the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 11 tool updatesv0.1.0
    • First observedalphaxiv_fulltext
    • First observedalphaxiv_lookup
    • First observedarxiv_search
    • First observedfetch_page
    • First observedfetch_pdf
    • First observedfetch_stealth
    • First observedgithub_search
    • First observedhuggingface_search
    • First observedlibgen_search
    • First observedscholar_search
    • First observedweb_search

TDQS

A3.7/5.0

Scored across 11 tools

Disambiguation4/5

The search tools are cleanly separated by domain (web, scholar, arXiv, GitHub, HF, libgen), and fetch_page/fetch_stealth/fetch_pdf have described fallback roles. There is still minor overlap between fetch_page, alphaxiv_fulltext, and fetch_pdf for retrieving arXiv/PDF content, but the descriptions mostly resolve when to use each.

Naming Consistency4/5

All names are snake_case and readable, with fetch_* for retrieval and *_search for domain searches. The mix of verb-first (fetch_page), domain-first (arxiv_search), and prefixed tools (alphaxiv_lookup) is a minor inconsistency rather than a confusing one.

Tool Count5/5

Eleven tools are well within a reasonable scope for a web research server. Each search domain and fetch variant covers a distinct source or retrieval mode, so the set does not feel bloated.

Completeness4/5

The surface covers general web search, academic/arXiv search, code/model/book search, plus page, PDF, stealth, and arXiv full-text fetching. Minor gaps remain around crawling/site mapping or generic file extraction, but core research workflows are covered.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to search and fetch high-quality information from multiple sources, including general web APIs, Wikipedia, arXiv, Hacker News, Stack Exchange, and Crossref, with optional pro-mode deep research and clean markdown page extraction.
    10
    MIT
  • F
    license
    A
    quality
    C
    maintenance
    Enables a locally-run LLM to search the web, fetch pages as markdown, make arbitrary HTTP requests, and optionally render pages with headless Chromium.
    3
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to perform web research over MCP: search with a real browser, fetch JS-rendered pages, download PDFs and convert them to Markdown, then search and page through large documents using bounded previews so the context window isn't flooded.
    BSD Zero Clause
  • A
    license
    A
    quality
    B
    maintenance
    Enables agents to search the live web and fetch URLs as clean Markdown, returning ranked search results and paginated page content through two lightweight tools.
    2
    8 npm
    MIT