Skip to main content
Glama

Local web search for your LLM over MCP. No API keys, and results are ranked on your machine. Formerly mcp-local-rag.

Add MCP Server mcpsurfr to LM Studio Ask DeepWiki ko-fi

%%{init: {'theme': 'base'}}%%
flowchart TD
    A[LLM] -->|query| S["Search with ddgs (auto: several engines, no keys)"]
    S -->|"rag_search, deep_research"| R["Re-rank results locally (MobileBERT on numpy)"]
    R --> P[Fetch top pages, keep the main content]
    P -->|page text + URLs| A
    S -->|search| T1["Tier 1: pick pages by their snippets"]
    T1 --> T2["Tier 2: split into passages, keyword match (BM25)"]
    T2 -->|few hits| OUT["Best passages + URLs (about 800 tokens)"]
    T2 -->|too many or none| T3[Tier 3: rank them by meaning]
    T3 --> OUT
    OUT --> A

What's in it:

  • No API keys. Searches go through ddgs. Its auto mode asks several engines at once and skips blocked ones.

  • Ranked locally. A small MobileBERT model on plain numpy re-ranks results, so only the best pages get fetched.

  • Clean text. Pages are fetched with browser impersonation, and only the main content is kept: no menus, cookie banners or footers. Code blocks and tables keep their lines. The same page under two URLs comes back once.

  • Passages instead of pages. search returns just the paragraphs that answer the question, about a tenth of the tokens. When nothing matches well, it can ask you whether you want the full pages instead.

  • Says what it left out. Results list skipped pages with a reason (blocked, PDF, duplicate...), cut pages are marked truncated, and fallbacks and engine failures show up as warnings. Google blocks often, so it falls back to auto on its own.

  • Brings its own guide. It serves a skill and a research prompt, so clients pick up how to use it without setup.

Tool

Use it for

search

Start here: returns only the relevant passages. Pass keywords for better hits

rag_search_ddgs

Full pages as text (the original mode)

rag_search_google

Same, via Google (falls back to auto when blocked)

deep_research

Several search terms across backends, merged and de-duplicated

deep_research_ddgs / deep_research_google

deep_research shortcuts

Backends: auto (default), brave, duckduckgo, google, grokipedia, mojeek, startpage, wikipedia, yahoo. auto and brave are the dependable ones.

Install

With uv:

{
  "mcpServers": {
    "mcpsurfr": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/nkapila6/mcpsurfr", "mcpsurfr"]
    }
  }
}

Or with Docker (amd64 and arm64):

{
  "mcpServers": {
    "mcpsurfr": {
      "command": "docker",
      "args": ["run", "--rm", "-i", "--init", "ghcr.io/nkapila6/mcpsurfr:latest"]
    }
  }
}

Full-page tools share a 40k-character budget per call (about 10k tokens). To change it, add "env": {"MCPSURFR_MAX_CHARS": "80000"} to the server entry.

Not sure where your config lives? See the MCP quickstart. Tested with Claude Desktop, Claude Code, Cursor and Goose.

Coming from mcp-local-rag? Your old config keeps working, since the old URL redirects and the mcp-local-rag command still exists. Switching to the config above gets you the new name and drops the --python=3.10 pin (3.10 reaches end of life this month).

Related MCP server: tavily-firecrawl-mcp

Skill and prompt

The mcpsurfr-search skill tells the model which tool and backend to pick and how to cite. The server serves it as skill://mcpsurfr-search/SKILL.md, so most clients need nothing extra. To add it to Claude Desktop by hand: Settings → Skills → Add from folder, then pick src/mcpsurfr/skills/mcpsurfr-search/.

The research(topic) prompt plans a few search terms, runs deep_research and writes a cited summary.

Example

Asking Claude Desktop about something newer than its training data:


Security audit by MseeP · Issues and PRs welcome · MIT licensed · Buy me a coffee if it helps you

Available Tools

6 tools
deep_researchDeep researchA
Read-only

Research a topic across several search terms and engines. Each term is searched on each backend, results are re-ranked locally by relevance, duplicates are removed, and the best pages are fetched as text.

Backends: auto, brave, duckduckgo, google, grokipedia, mojeek, startpage, wikipedia, yahoo.

  • "auto" (default): ddgs metasearch over several engines, skipping blocked ones. Most reliable.

  • "brave": fast and usually available.

  • "wikipedia": exact article lookups, best with title-like terms.

  • "google", "startpage", "yahoo", "mojeek": often blocked. Empty engines are reported as warnings, and if every chosen engine is empty the terms are retried with "auto".

NameRequiredDescriptionDefault
backendsNoBackends to use. Defaults to ["auto"]. Unknown names are skipped with a warning.
include_urlsNoWhether to include each page's source URL.
search_termsYes2-5 specific, related search queries covering different angles. Example: ["postgres query planner", "postgres index types", "EXPLAIN ANALYZE tutorial"]
top_k_per_termNoNumber of top-ranked results to keep per search term per backend.
num_results_per_termNoNumber of results to rank per search term per backend.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

With readOnlyHint and openWorldHint already declaring the safety profile, the description adds real value: it discloses the internal pipeline (search, local re-rank, dedupe, fetch page text) and the failure semantics (empty engines reported as warnings, retry with 'auto' if all chosen engines are empty). It stops short of disclosing cost/latency characteristics, which matters for a tool that fetches pages.

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 a pipeline summary, then a scannable backend bullet list — well structured and mostly waste-free. The bullet list is slightly long but each entry carries decision-relevant information about reliability.

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 covered, and annotations cover the read-only/open-world profile; the description fills in pipeline and fallback behavior. The remaining gap is sibling disambiguation, which is the one thing an agent must know before choosing among the five search tools.

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 100%, so the baseline is 3, but the description genuinely enriches the 'backends' parameter by enumerating valid values and characterizing each one's reliability and best use, which the schema's one-line description does not do. The interaction between num_results_per_term and top_k_per_term (rank N, keep K) is implied but not explicitly explained.

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?

The first sentence states a specific verb and resource ('Research a topic across several search terms and engines') and the following sentence spells out the pipeline: multi-term search, local re-ranking, deduplication, page fetching. It does not explicitly state how it differs from siblings like deep_research_google or deep_research_ddgs, though the backend list implies this tool is the superset that can target either.

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?

Backend selection guidance is concrete and actionable: 'auto' is flagged as the most reliable default, 'brave' as fast, 'wikipedia' for title-like lookups, and google/startpage/yahoo/mojeek as often blocked with an auto-retry fallback. What is missing is guidance on when to pick this tool over the sibling search tools (search, rag_search_ddgs, deep_research_google), which an agent must infer.

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

deep_research_ddgsDeep research (ddgs auto)A
Read-only

Deep research using ddgs "auto" metasearch, which queries several engines per term and skips blocked ones. Results are re-ranked locally, de-duplicated and the best pages fetched as text. Same as deep_research with its default backend.

NameRequiredDescriptionDefault
include_urlsNoWhether to include each page's source URL.
search_termsYes2-5 specific, related search queries.
top_k_per_termNoNumber of top-ranked results to keep per search term.
num_results_per_termNoNumber of results to rank per search term.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly and openWorld, but the description adds real pipeline detail beyond them: multi-engine querying, skipping blocked engines, local re-ranking, de-duplication, and fetching of top pages as full text — which signals latency and network cost. It does not mention rate limits, failure modes, or how many pages get fetched.

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?

Three short sentences with the backend mechanism first and the sibling equivalence last; every clause carries information an agent cannot get from the schema. No filler or repetition of annotations.

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 shape need not be explained, and annotations cover the safety profile. The description covers mechanism and scope well; only secondary operational facts such as cost, expected latency, or failure behavior are absent.

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 description coverage is 100%, so all four parameters (search_terms, top_k_per_term, num_results_per_term, include_urls) are already documented in the schema. The description adds no guidance on how many terms, how terms relate to each other, or how top_k interacts with the ranking stage, so the baseline 3 applies.

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 operation (deep research) plus the exact backend mechanism: ddgs "auto" metasearch querying several engines per term while skipping blocked ones. It also explicitly relates itself to a sibling ("Same as deep_research with its default backend"), so an agent can distinguish it from deep_research without opening schemas.

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?

The sentence "Same as deep_research with its default backend" gives clear selection context: this is the default/alias variant rather than a distinct capability. It stops short of naming when to prefer deep_research_google or rag_search_ddgs instead, so there are no explicit exclusions.

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

deep_research_googleDeep research (Google)A
Read-only

Deep research using only Google: each term is searched, re-ranked locally, de-duplicated and the best pages fetched as text. Google often blocks scrapers. If it returns nothing, the terms are retried with ddgs "auto" metasearch and a warning is sent.

NameRequiredDescriptionDefault
include_urlsNoWhether to include each page's source URL.
search_termsYes2-5 specific, related search queries.
top_k_per_termNoNumber of top-ranked results to keep per search term.
num_results_per_termNoNumber of results to rank per search term.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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

Beyond the readOnlyHint/openWorldHint annotations, the description discloses real behavioral facts: Google blocks scrapers, the pipeline re-ranks and de-duplicates locally, pages are converted to text, and a ddgs fallback fires with a warning when nothing is returned. That failure-mode and fallback disclosure is genuinely useful for an agent interpreting empty or warned results.

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?

Three tight sentences, front-loaded with what the tool does and followed by the failure mode and fallback. No filler, though the trailing fallback clause could be trimmed or merged for clarity.

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 explanation is unnecessary, and annotations cover the safety profile; the description supplies the pipeline, the scraping risk, and the fallback. What remains missing is guidance on choosing this over deep_research_ddgs or rag_search_google.

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 description coverage is 100%, so the baseline is 3. The description loosely explains the rank-then-keep pipeline that underlies num_results_per_term versus top_k_per_term, but it never ties that pipeline to the parameter names, so it adds little beyond the schema.

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 concrete pipeline: each term is searched, re-ranked locally, de-duplicated, and the best pages fetched as text. The 'using only Google' scoping gives a rough handle against the ddgs siblings, but the added note that it falls back to ddgs 'auto' metasearch blurs how it differs from deep_research_ddgs.

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?

Usage is only implied: the agent can infer this is the Google-flavored deep research option versus deep_research_ddgs, but no alternative is named and no when-not condition is stated. The fallback sentence describes internal behavior rather than telling the caller when to pick this tool.

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

rag_search_ddgsWeb searchA
Read-only

Search the web and return the most relevant pages as text. Default choice for lookups. Uses ddgs "auto" metasearch, which queries several engines (DuckDuckGo, Brave, Wikipedia, ...) and skips any that are blocked. Results are re-ranked locally by semantic similarity to the query before the top pages are fetched.

NameRequiredDescriptionDefault
queryYesThe search query. Use natural language questions or keywords. Example: "latest developments in quantum computing"
top_kNoNumber of top-ranked pages to fetch and return. Default: 5
num_resultsNoNumber of initial search results to rank. More results provide better coverage but increase processing time. Default: 10
include_urlsNoWhether to include each page's source URL for citation. Default: True

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, yet the description adds genuine behavioral detail: multi-engine metasearch, automatic skipping of blocked engines, local semantic re-ranking, and a subsequent page-fetch step. This tells the agent the call may be slow and that results are re-ordered, though latency and failure modes are not quantified.

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?

Four short sentences with the core action front-loaded first and the mechanism after; nothing is redundant with the schema. The standalone "Default choice for lookups" sentence is terse but slightly orphaned from the mechanism paragraph.

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?

With an output schema present, return values need not be described, and the annotations cover the safety profile, so the description's remaining job is mechanism and default-status — both covered. The only real gap is sibling differentiation across the five related search/research tools.

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 description coverage is 100%, so all four parameters are already documented, which sets the baseline at 3. The description does implicitly explain the pipeline (broad initial results get re-ranked, then top pages are fetched), which clarifies why num_results and top_k are distinct, but it adds no explicit parameter-level detail.

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 and resource ("Search the web and return the most relevant pages as text") and explains the underlying mechanism (ddgs "auto" metasearch over DuckDuckGo, Brave, Wikipedia). It calls itself the "Default choice for lookups," which weakly separates it from siblings, but it never contrasts the row with rag_search_google, search, or the deep_research variants.

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?

"Default choice for lookups" is an implied rule for when to reach for this tool, and the mechanism note hints at fallback behavior when an engine is blocked. However, no sibling is named as an alternative and there is no statement of when NOT to use it (e.g., versus rag_search_google or deep_research), leaving the choice to inference.

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

rag_search_googleGoogle searchA
Read-only

Search Google and return the most relevant pages as text, re-ranked locally by semantic similarity. Google often blocks scrapers. When it returns nothing, this retries with ddgs "auto" metasearch and sends a warning saying so.

NameRequiredDescriptionDefault
queryYesThe query to search for.
top_kNoNumber of top-ranked pages to fetch and return.
num_resultsNoNumber of initial search results to rank.
include_urlsNoWhether to include each page's source URL.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

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

Annotations only declare readOnlyHint and openWorldHint, so the description adds real value: it discloses the local semantic re-ranking pass, that Google frequently blocks scrapers, that empty results trigger a ddgs 'auto' metasearch retry, and that a warning is emitted when that happens. This is exactly the kind of reliability context an agent needs. Return shape is left to the output schema, which is acceptable.

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?

Three tight sentences with no filler, leading immediately with what the tool does before the reliability caveat. The hard line breaks in the raw text are cosmetic and do not impede reading.

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?

For a 4-parameter read-only search tool with a full output schema and annotation coverage, the description supplies the important missing context: local re-ranking, blocking risk, and the silent provider switch. Only the lack of sibling routing guidance keeps it from being fully complete.

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 100%, so both top_k and num_results are already documented in the schema; the description reinforces the two-stage model (rank N initial results, fetch and return the top K pages as text) but adds no syntax, format, or edge-case detail beyond that. Baseline 3 applies when the schema carries the parameter burden.

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 and resource ('Search Google and return the most relevant pages as text') and adds the distinguishing trait of local semantic re-ranking. It does not, however, contrast itself against the obvious siblings (rag_search_ddgs, deep_research_google), so an agent must infer the boundary.

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

Usage Guidelines2/5

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

No when-to-use or when-not-to-use guidance relative to alternatives. The only routing information is an internal fallback to ddgs on empty results, which describes runtime behavior rather than when the agent should choose this tool over rag_search_ddgs or deep_research_google.

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. 6 tool updatesv1.1.1
    • Changeddeep_research5 fields changed
      • changedInput schema / properties / backends / description
        Previous value: -"List of search backends to use. Defaults to [\"duckduckgo\", \"google\"].\n                 Can include: bing, brave, duckduckgo, google, grokipedia, \n                 mojeek, yandex, yahoo, wikipedia. If None, uses default."New value: +"Backends to use. Defaults to [\"auto\"]. Unknown names are skipped with a warning."
      • changedInput schema / properties / include_urls / description
        Previous value: -"Whether to include URLs in the results."New value: +"Whether to include each page's source URL."
      • changedInput schema / properties / num_results_per_term / description
        Previous value: -"Number of results to fetch per search term per backend."New value: +"Number of results to rank per search term per backend."
      • changedInput schema / properties / search_terms / description
        Previous value: -"List of search terms to research. Provide multiple \n                      related search queries for comprehensive coverage.\n                      Example: [\"machine learning fundamentals\", \"neural networks\", \"deep learning best practices\"]"New value: +"2-5 specific, related search queries covering different angles.\n                      Example: [\"postgres query planner\", \"postgres index types\", \"EXPLAIN ANALYZE tutorial\"]"
      • changedInput schema / properties / top_k_per_term / description
        Previous value: -"Number of top scored results to keep per search term per backend."New value: +"Number of top-ranked results to keep per search term per backend."
    • Changeddeep_research_ddgs4 fields changed
      • changedInput schema / properties / include_urls / description
        Previous value: -"Whether to include URLs in the results."New value: +"Whether to include each page's source URL."
      • changedInput schema / properties / num_results_per_term / description
        Previous value: -"Number of results to fetch per search term."New value: +"Number of results to rank per search term."
      • changedInput schema / properties / search_terms / description
        Previous value: -"List of search terms to research. The LLM should provide \n                      multiple related search queries for comprehensive coverage."New value: +"2-5 specific, related search queries."
      • changedInput schema / properties / top_k_per_term / description
        Previous value: -"Number of top scored results to keep per search term."New value: +"Number of top-ranked results to keep per search term."
    • Changeddeep_research_google4 fields changed
      • changedInput schema / properties / include_urls / description
        Previous value: -"Whether to include URLs in the results."New value: +"Whether to include each page's source URL."
      • changedInput schema / properties / num_results_per_term / description
        Previous value: -"Number of results to fetch per search term."New value: +"Number of results to rank per search term."
      • changedInput schema / properties / search_terms / description
        Previous value: -"List of search terms to research. The LLM should provide \n                      multiple related search queries for comprehensive coverage."New value: +"2-5 specific, related search queries."
      • changedInput schema / properties / top_k_per_term / description
        Previous value: -"Number of top scored results to keep per search term."New value: +"Number of top-ranked results to keep per search term."
    • Changedrag_search_ddgs3 fields changed
      • changedInput schema / properties / include_urls / description
        Previous value: -"Whether to include source URLs in the results.\n                If True, each result includes its URL for citation.\n                Default: True"New value: +"Whether to include each page's source URL for citation.\n                Default: True"
      • changedInput schema / properties / num_results / description
        Previous value: -"Number of initial search results to fetch from DuckDuckGo.\n              More results provide better coverage but increase processing time.\n              Default: 10"New value: +"Number of initial search results to rank.\n              More results provide better coverage but increase processing time.\n              Default: 10"
      • changedInput schema / properties / top_k / description
        Previous value: -"Number of top-scored results to include in the final output.\n        These are the most semantically relevant results after scoring.\n        Default: 5"New value: +"Number of top-ranked pages to fetch and return.\n        Default: 5"
    • Changedrag_search_google3 fields changed
      • changedInput schema / properties / include_urls / description
        Previous value: -"Whether to include URLs in the results."New value: +"Whether to include each page's source URL."
      • changedInput schema / properties / num_results / description
        Previous value: -"Number of results to return."New value: +"Number of initial search results to rank."
      • changedInput schema / properties / top_k / description
        Previous value: -"Use top \"k\" results for content."New value: +"Number of top-ranked pages to fetch and return."
    • Addedsearch
  2. 5 tool updatesv1.0.4
    • Changeddeep_research5 fields changed
      • addedInput schema / properties / backends / description
        Added value: +"List of search backends to use. Defaults to [\"duckduckgo\", \"google\"].\n                 Can include: bing, brave, duckduckgo, google, grokipedia, \n                 mojeek, yandex, yahoo, wikipedia. If None, uses default."
      • addedInput schema / properties / include_urls / description
        Added value: +"Whether to include URLs in the results."
      • addedInput schema / properties / num_results_per_term / description
        Added value: +"Number of results to fetch per search term per backend."
      • addedInput schema / properties / search_terms / description
        Added value: +"List of search terms to research. Provide multiple \n                      related search queries for comprehensive coverage.\n                      Example: [\"machine learning fundamentals\", \"neural networks\", \"deep learning best practices\"]"
      • addedInput schema / properties / top_k_per_term / description
        Added value: +"Number of top scored results to keep per search term per backend."
    • Changeddeep_research_ddgs4 fields changed
      • addedInput schema / properties / include_urls / description
        Added value: +"Whether to include URLs in the results."
      • addedInput schema / properties / num_results_per_term / description
        Added value: +"Number of results to fetch per search term."
      • addedInput schema / properties / search_terms / description
        Added value: +"List of search terms to research. The LLM should provide \n                      multiple related search queries for comprehensive coverage."
      • addedInput schema / properties / top_k_per_term / description
        Added value: +"Number of top scored results to keep per search term."
    • Changeddeep_research_google4 fields changed
      • addedInput schema / properties / include_urls / description
        Added value: +"Whether to include URLs in the results."
      • addedInput schema / properties / num_results_per_term / description
        Added value: +"Number of results to fetch per search term."
      • addedInput schema / properties / search_terms / description
        Added value: +"List of search terms to research. The LLM should provide \n                      multiple related search queries for comprehensive coverage."
      • addedInput schema / properties / top_k_per_term / description
        Added value: +"Number of top scored results to keep per search term."
    • Changedrag_search_ddgs4 fields changed
      • addedInput schema / properties / include_urls / description
        Added value: +"Whether to include source URLs in the results.\n                If True, each result includes its URL for citation.\n                Default: True"
      • addedInput schema / properties / num_results / description
        Added value: +"Number of initial search results to fetch from DuckDuckGo.\n              More results provide better coverage but increase processing time.\n              Default: 10"
      • addedInput schema / properties / query / description
        Added value: +"The search query. Use natural language questions or keywords.\n        Example: \"latest developments in quantum computing\""
      • addedInput schema / properties / top_k / description
        Added value: +"Number of top-scored results to include in the final output.\n        These are the most semantically relevant results after scoring.\n        Default: 5"
    • Changedrag_search_google4 fields changed
      • addedInput schema / properties / include_urls / description
        Added value: +"Whether to include URLs in the results."
      • addedInput schema / properties / num_results / description
        Added value: +"Number of results to return."
      • addedInput schema / properties / query / description
        Added value: +"The query to search for."
      • addedInput schema / properties / top_k / description
        Added value: +"Use top \"k\" results for content."
  3. 6 tool updatesv1.0.1
    • Addeddeep_research
    • Addeddeep_research_ddgs
    • Addeddeep_research_google
    • Removedrag_search
    • Addedrag_search_ddgs
    • Addedrag_search_google
  4. 1 tool updatev1.0.0
    • Changedrag_search1 field changed
      • addedInput schema / properties / include_urls
        Added value: +{
        +  "default": true,
        +  "type": "boolean"
        +}
  5. 1 tool update
    • First observedrag_search

TDQS

A3.9/5.0

Scored across 6 tools

Disambiguation3/5

There is substantial overlap: rag_search_ddgs and deep_research_ddgs differ mainly by single-term vs multi-term querying, and rag_search_google mirrors deep_research_google. The bare `search` tool also competes with rag_search_ddgs, though its passage-level output and 'use this first' guidance help differentiate it.

Naming Consistency4/5

Most tools use a consistent snake_case, prefixed pattern (rag_search_* and deep_research_*). The bare `search` name and the parallel backend suffixes (`_ddgs`, `_google`) create minor inconsistency, but the overall naming remains readable and predictable.

Tool Count5/5

Six tools is well-scoped for a web-search/RAG server. Each tool maps to a search mode (smart passage search, page search, deep multi-term research) with backend variants.

Completeness4/5

The surface covers single-query page search, passage search, and multi-term deep research across multiple engines. A direct fetch/extract-URL tool or explicit index-management operation is absent, but core research workflows are covered.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    A Model Context Protocol server that enables LLM clients like VSCode, Copilot, and Claude Desktop to search the web using Google Programmable Search Engine API.
    1
    27 npm
    12
    Apache 2.0
  • A
    license
    A
    quality
    C
    maintenance
    A Model Context Protocol server for web scraping and searching, with automatic fallback from Tavily to Firecrawl for fetching web content.
    2
    1
    MIT
  • A
    license
    Not graded
    quality
    F
    maintenance
    MCP server enabling local-first web search, fetch, extract, and caching with citeable excerpts, no API key required. Supports research workflows for agents and apps.
    42 npm
    1
    MIT