Skip to main content
Glama
VelvetSP

io.github.VelvetSP/web-retrieval-mcp

by VelvetSP

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
PUBMED_EMAILYesYour email address (required by NCBI)
PUBMED_API_KEYNoOptional API key for higher rate limits

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
web_searchA

Search the web via Exa or Tavily. Returns one block per result, each with its OWN title, URL, highlights, and text — never a merged summary — plus a Sources trailer. In clients with built-in web search, use this as an independent complementary retrieval lane; when built-in search is disabled or unavailable, use it as the primary search path.

Args: query: the search query. num_results: how many results (default 8). mode: search mode — "auto" (default), "fast" (~450ms), "instant" (~250ms), or the deep-research family "deep-lite" (≈4s), "deep" ($12/1k), or "deep-reasoning" (12–40s, $15/1k). Deep modes request a synthesized answer via Exa's outputSchema and return a "## Synthesized answer" block — with a "Grounding:" citation line when Exa returns one — plus per-result blocks; this costs ~2s of synthesis latency on top of the mode's own search time, which is why it is scoped to the deep family only (their timeout budget already covers it). Legacy "neural"/"keyword" map to "auto" (deprecated). text_chars: per-result body length (default 1200; clamped 200–8000). Now governs BOTH the Exa request size (request-what-you-render) and the rendered cap — raise it to surface more body text per result. recency_days: only results published within the last N days (maps to startPublishedDate). Pass this for time-sensitive/"latest" queries — the tool does NOT auto-tighten dates on its own. recency_hours: like recency_days but HOUR granularity — reaches BOTH tiers (Exa via a full ISO timestamp; the Firecrawl fallback via tbs qdr:h/cdr:1,cd_min:…). Full precedence ladder, same on both tiers: explicit VALID start_published_date > recency_hours > recency_days. An invalid/absent value at each tier falls through to the next. start_published_date / end_published_date: ISO date bounds ("2026-01-15" or a full ISO timestamp). Wins over recency_hours/recency_days per the ladder above on both tiers. The fallback represents an explicit start with Firecrawl's custom-date-range syntax. Unparseable values are ignored (stderr note), never an error. category: Exa category hint ("news", "publication", "company", "people", "financial report", "personal site", or a free string). NOTE: "company" and "people" forbid date filters + excludeDomains (dropped automatically), and "people" restricts includeDomains to Exa's supported profile domains (it 400s otherwise — surfaced as SEARCH_FAILED / fallback). Enum migration: "research paper" was RENAMED to "publication" and is auto-aliased forward; "tweet" is GONE (Exa 400s) and is dropped, leaving the search unscoped; "pdf"/"github" are deprecated-but-live and pass through. Each of those emits a [category=… ] line in the response header, since dropping or renaming a category changes which results you get back. include_domains / exclude_domains: restrict/exclude result hosts (capped at 20 entries each). summary: when True, request a generated per-result summary instead of raw text/highlights (fewer tokens; text + highlights omitted from the request). sort_by_date: sort results by publish date instead of relevance. Honoured ONLY on the Firecrawl fallback tier (Firecrawl's sbd:1); Exa has no equivalent — when the Exa tier serves and this was requested, the response header discloses that it was not applied rather than silently ignoring it. provider: "exa" or "tavily". When omitted, WEB_SEARCH_PROVIDER is used, defaulting to Exa. Invalid values fail explicitly. Tavily requires the tavily extra and TAVILY_API_KEY.

web_fetchA

Fetch a single URL's readable content. Full-body tier chain: Exa contents → local Camoufox → optional Tavily Extract → Firecrawl. Firecrawl is the paid last resort: automatic full-body retrieval reaches it only after the local browser fails or returns a body shorter than the useful-content floor. Camoufox is the one tier that runs a real browser locally. Caller-supplied private URLs are refused before tier selection in every render mode. Eligible successful auto/never calls also use a host-wide 24-hour completed-result cache in a private local Valkey sidecar. Local replay is disclosed separately from the original provider's cache state; pass max_age_hours=0 to force provider work. Signed/credential URLs, userinfo, positive freshness, max_age_hours=0, and render="always" bypass completed replay. Every request is SSRF-validated before cache access, and a hit is validated again immediately before its body is returned. Returns content with a [served by: …] provenance header. In clients with built-in page retrieval, use this as an independent complementary retrieval lane; when built-in retrieval is disabled or unavailable, use it as the primary fetch path.

Args: url: the URL to fetch. render: "auto" (default) → Exa, then local Camoufox, optional Tavily, then Firecrawl. "never" skips Camoufox. "always" forces Camoufox first and skips Exa; Tavily and Firecrawl remain backstops. For mode="concise" or a question, auto intentionally uses Exa then Firecrawl without launching Camoufox: the browser returns a full body and cannot satisfy the promised summary/direct-answer shape. max_chars: max characters to request/return. None (default) → 20000-char budget, Exa-first. An explicit value ≤10000 stays Exa-first. For an explicit value >10000 in full-body auto, Exa cannot meet the requested size, so the order is Camoufox → optional Tavily → Firecrawl → Exa as a final transparently truncated salvage tier. Browser-free full-body mode starts with optional Tavily, then Firecrawl and Exa. Semantic requests remain Exa-first because they use Exa's summary API rather than its capped body output. Clamped to 1000–100000. When output is (or may be) clipped, a [TRUNCATED at N chars — …] marker is appended on its own line. max_age_hours: freshness window for the Exa AND Firecrawl tiers. None = each tier's default cache (Exa default; Firecrawl ~2 days); 0 = force fresh on both. -1 = "always use cache" (Exa-documented) — Firecrawl has NO equivalent, so on that tier -1 is treated as omit (its own default cache window applies instead; disclosed in the [cache: …] line). Values below -1 are ignored (stderr note, default cache used). Values above 720 (Exa's documented ceiling) are CLAMPED to 720, and the clamp is disclosed — a clamped value changes which content can come back. The camoufox render tier is always live. When Firecrawl serves with cache permitted, a [cache: …] disclosure line is added. mode: "full" (default, whole readable body) or "concise" (a generated summary — far fewer tokens). Honored by the Exa and Firecrawl tiers; the camoufox render tier ignores it (returns full body, no [mode:] line). Concise/question outputs carry a [mode: …] provenance line. question: optional grounded-extraction query. When set, the tier returns a direct ANSWER to the question (Exa summary-with-query / Firecrawl question format) instead of the page body; short answers are accepted — the floor is 1 char, so only an EMPTY answer cascades to the next tier ("Paris"/"No" are legitimate answers). The 60-char extract floor applies to mode="concise", and the 200-char floor to a full body. Overrides mode. tavily: enable or disable Tavily Extract for this call. When omitted, WEB_FETCH_TAVILY_TIER is parsed strictly (default false). Tavily is a full-body tier only and is skipped for concise/question requests and whenever max_age_hours is explicit because it cannot honor those contracts. Requires the tavily extra and TAVILY_API_KEY.

SSRF note: Camoufox follows redirects and re-resolves DNS, so every Camoufox attempt (automatic or render="always") is guarded:

  • _make_route_guard aborts any request whose host resolves non-public, classifying by RESOLVED IP (not the URL string), failing closed on a resolution error;

  • _make_request_observer + _flush_pending exist because page.route does NOT fire on a main-frame 3xx — they see the redirect hops the route guard alone would miss;

  • _camoufox_render raises on a blocked hop at FOUR checkpoints: after a goto exception (catches a navigation the guard itself aborted, raising the guard's reason instead of an opaque playwright error), after a successful goto, after the networkidle wait, and after inner_text (a hop recorded during the extraction await, before any body returns).

  • test_ssrf_redirect_live.py covers this live. The observer detects a forbidden document request after Chromium has emitted it, so the application prevents private content from being returned but cannot prove that no outbound packet was sent. Chromium may also re-resolve after the guard's check. Full closure would need a validating forward proxy or equivalent network policy.

research_papersA

Search 3M+ arXiv AI/ML papers via the Firecrawl Research Index (state-of-the-art paper recall — far better than general web search for finding the right literature). Returns ranked papers: title, arXiv id, relevance score, abstract. Then call research_paper(paper_id, query=…) to verify a claim against full text before citing.

SCOPE: arXiv-scoped, i.e. effectively AI/ML. For scholarly literature outside that scope (medicine, law, economics, humanities), use web_search(category="publication") — Exa's publications index (~350M works) covers what this one cannot.

Args: query: natural-language research query (topic, method, benchmark, author). k: number of papers (1–25, default 8).

research_paperA

Inspect ONE paper from the Research Index by id (a paperId, or an arXiv id like "arxiv:2606.01509"). Without query → metadata (title, authors, categories, dates, abstract). With query → ALSO the top full-text passages answering it — use this to VERIFY a paper actually contains a method/dataset/result before relying on it.

Args: paper_id: paperId or primaryId ("arxiv:NNNN.NNNNN") from research_papers. query: optional question; when set, returns claim-verification passages.

research_similarA

Expand from a seed paper to related work via the Research Index. intent is a REQUIRED natural-language description of the connection you want (e.g. "newer methods that improve on this routing", "the work this paper builds on"). Returns ranked related papers (same shape as research_papers).

SCOPE: arXiv-scoped like research_papers — for non-AI/ML literature use web_search(category="publication").

Args: paper_id: paperId or "arxiv:…" of the seed paper. intent: natural-language description of the kind of related work wanted. k: number of related papers (1–25, default 8; API allows up to 500). mode: "similar" (default), "citers" (papers citing this one), or "references" (papers this one cites). Unknown → "similar". min_score: renderer-side relevance floor (default 0.0 = off). k=8 already trims the low-score tail; raise this to filter more aggressively. rerank: optional bool; omitted from the request when None (API default is undocumented). Set True/False to force. (anchor — repeatable seed expansion — is not exposed; future work.)

research_githubA

Search developer primary sources via the Firecrawl Developer Index: GitHub issues, merged pull requests and repository READMEs, PLUS curated documentation sites. Returns the matched passages in Markdown, so tables and code blocks survive. Use to find the CODE behind a paper, the issue where a bug was reported and fixed, an API contract, or the discussion behind an error message.

Args: query: natural-language query (method, kernel, repo topic, error message). k: number of results (1–25, default 8). passages: matched passages per result (1–5, default 2). types: restrict to any of exactly "doc", "issue", "pull_request", "readme". NOTE the request spelling is pull_request (snake_case). The response's repos[].types object uses camelCase (pullRequest) — echoing a key from there back into this argument is refused, not silently ignored. repos: "owner/repo" slugs. Scopes only the repository half of the index, so when types is also given it must contain at least one of issue/pull_request/readme.

Falls back to the de-documented legacy /v2/search/research/github ONLY when the Developer Index genuinely fails (transport, HTTP, malformed envelope, or every requested type unavailable) — never on a legitimate empty result, and never when types/repos were supplied, since the legacy endpoint accepts only query+k and would silently answer a different question than the one asked.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A4.8/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct retrieval surface: general web search, single-page fetch, arXiv paper search, single-paper inspection, related-paper expansion, and developer-index search. Potential overlaps are explicitly separated by corpus and use case, so an agent can reliably pick the right tool.

Naming Consistency4/5

All names are lowercase snake_case and grouped by domain (web_* and research_*), which makes them predictable. The minor inconsistency is that web_search/web_fetch are verb-object names, while the research_* tools are object-oriented and do not encode an action as clearly.

Tool Count5/5

Six tools is well-scoped for a retrieval server: two general web operations plus a four-tool research cluster. Each tool has a distinct responsibility, and there are no redundant or filler tools.

Completeness5/5

The surface covers general web search, full-page fetching, scholarly paper search, single-paper verification, related-paper exploration, and developer-source search. These cover the main retrieval workflows one would expect, with no obvious dead ends or missing core operations.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive