mcpsurfr MCP Server
@nkapila6
Basic information
About mcpsurfr MCP Server
"primitive" RAG-like web search model context protocol (MCP) server that runs locally. ✨ no APIs ✨
mcpsurfr MCP Server config
Add this server to your MCP-compatible client using the configuration below.
{
"mcpServers": {
"mcpsurfr": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/nkapila6/mcpsurfr",
"mcpsurfr"
]
}
}
}mcpsurfr MCP Server tools
5Search the web for a given query using DuckDuckGo. Returns context to the LLM with RAG-like similarity scoring to prioritize the most relevant results. This tool fetches web search results, scores them by semantic similarity to the query using text embeddings, and returns the top-ranked content as markdown text. Args: query (str): The search query. Use natural language questions or keywords. Example: "latest developments in quantum computing" num_results (int): Number of initial search results to fetch from DuckDuckGo. More results provide better coverage but increase processing time. Default: 10 top_k (int): Number of top-scored results to include in the final output. These are the most semantically relevant results after scoring. Default: 5 include_urls (bool): Whether to include source URLs in the results. If True, each result includes its URL for citation. Default: True Returns: Dict: A dictionary with a single key "content" containing the search results. The content is formatted as markdown text with the most relevant information from the top_k web pages. If include_urls is True, each section includes its source URL. Example: {"content": "# Result 1\n\nContent here...\n\nSource: https://example.com"}
Search on Google for a given query using ddgs. Give back context to the LLM with a RAG-like similarity sort. Args: query (str): The query to search for. num_results (int): Number of results to return. top_k (int): Use top "k" results for content. include_urls (bool): Whether to include URLs in the results. If True, the results will be a list of dictionaries with the following keys: - type: "text" - text: The content of the result - url: The URL of the result Returns: Dict of strings containing best search based on input query. Formatted in markdown.
Perform deep research across multiple search terms using specified search backends. This tool aggregates results from multiple searches across chosen engines, scores them by relevance, and returns the most relevant content with duplicates removed. Perfect for comprehensive research on a topic. Available backends: bing, brave, duckduckgo, google, grokipedia, mojeek, yandex, yahoo, wikipedia USAGE GUIDANCE FOR LLM: 1. Ask the user which backend(s) they prefer, OR 2. Choose appropriate backend(s) based on context: - ["duckduckgo"] - Privacy-focused, general search - ["google"] - Comprehensive results, best for technical queries - ["duckduckgo", "google"] - Maximum coverage (default) - ["wikipedia"] - Factual/encyclopedia content - ["bing", "google"] - Balanced commercial engines - Multiple backends for broader research coverage 3. For specific use cases, consider: - deep_research_google() - shortcut for Google-only - deep_research_ddgs() - shortcut for DuckDuckGo-only Args: search_terms (List[str]): List of search terms to research. Provide multiple related search queries for comprehensive coverage. Example: ["machine learning fundamentals", "neural networks", "deep learning best practices"] backends (List[str] | None): List of search backends to use. Defaults to ["duckduckgo", "google"]. Can include: bing, brave, duckduckgo, google, grokipedia, mojeek, yandex, yahoo, wikipedia. If None, uses default. num_results_per_term (int): Number of results to fetch per search term per backend. top_k_per_term (int): Number of top scored results to keep per search term per backend. include_urls (bool): Whether to include URLs in the results. Returns: Dict containing aggregated research results from all search terms and specified backends, with duplicates removed.
Perform deep research across multiple search terms using ONLY Google. Aggregates results from multiple Google searches, scores them by relevance, and returns the most relevant content with duplicates removed. Args: search_terms (List[str]): List of search terms to research. The LLM should provide multiple related search queries for comprehensive coverage. num_results_per_term (int): Number of results to fetch per search term. top_k_per_term (int): Number of top scored results to keep per search term. include_urls (bool): Whether to include URLs in the results. Returns: Dict containing aggregated research results from all search terms (Google only), with duplicates removed.
Perform deep research across multiple search terms using ONLY DuckDuckGo. Aggregates results from multiple DuckDuckGo searches, scores them by relevance, and returns the most relevant content with duplicates removed. Args: search_terms (List[str]): List of search terms to research. The LLM should provide multiple related search queries for comprehensive coverage. num_results_per_term (int): Number of results to fetch per search term. top_k_per_term (int): Number of top scored results to keep per search term. include_urls (bool): Whether to include URLs in the results. Returns: Dict containing aggregated research results from all search terms (DuckDuckGo only), with duplicates removed.
Overview
What is mcp-local-rag?
Local web search for your LLM over MCP. No API keys, and results are ranked on your machine. Formerly mcp-local-rag.
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. PDFs are read too (text layer, first 50 pages). 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, JavaScript-only, 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.
How to use mcpsurfr?
Install uv or Docker, then add the server configuration to your MCP client settings. For uvx, use the command uvx --python=3.10 --from git+https://github.com/nkapila6/mcp-local-rag mcp-local-rag. For Docker, run docker run --rm -i --init -e DOCKER_CONTAINER=true ghcr.io/nkapila6/mcp-local-rag:v1.0.2. The server exposes tools like deep_research, deep_research_google, deep_research_ddgs, rag_search_ddgs, and rag_search_google.
More Memory & Knowledge MCP servers

ctxfile
ctxfileLocal-first MCP server that snapshots your project's working state into one context object. Open-core, privacy-first.

priostack
ideaswaveOpen-source Python SDK & MCP interface for Priostack Agent Context Network (ACN). Zero-setup, autonomous memory orchestration for AI agents.

agentleFS
agentleFSOne permissioned folder your team and your AI agents both log into.

Takibi Base
Deian IsacAsk your Takibi Base collections anything; get answers with cited passages and a support score.

M1K3
Round-TowerLocal AI agent for your Mac with a built-in MCP server: 18 tools for your notes and PDFs, a temporal memory graph, an on-device LLM and a neural voice. No account, no telemetry. No data centers required.
Comments