Skip to main content
Glama
Web Research Assistant

Web Research Assistant

by elad12390

Web Research Assistant MCP Server

PyPI Python Version License CI

Comprehensive Model Context Protocol (MCP) server that provides web research and discovery capabilities. Includes 16 tools, 4 resources, and 5 prompts for searching, crawling, and analyzing web content, powered by your local Docker SearXNG instance, Exa AI neural search, Scrapling, and Pixabay API:

  1. web_search — federated search across multiple engines via SearXNG

  2. batch_web_search — run up to 20 searches in one call instead of looping web_search

  3. search_examples — find code examples, tutorials, and articles (defaults to recent content)

  4. search_images — find high-quality stock photos, illustrations, and vectors via Pixabay

  5. crawl_url — full page content extraction with advanced crawling

  6. batch_crawl_urls — read up to 20 pages in parallel in one call instead of looping crawl_url

  7. package_info — detailed package metadata from npm, PyPI, crates.io, Go

  8. package_search — discover packages by keywords and functionality

  9. github_repo — repository health metrics and development activity

  10. translate_error — find solutions for error messages and stack traces from Stack Overflow (auto-detects CORS, fetch, and web errors)

  11. api_docs — auto-discover and crawl official API documentation with examples (works for any API - no hardcoded URLs)

  12. extract_data — extract structured data (tables, lists, fields, JSON-LD) from web pages with automatic detection

  13. compare_tech — compare technologies side-by-side with NPM downloads, GitHub stars, and aspect analysis (React vs Vue, PostgreSQL vs MongoDB, etc.)

  14. get_changelog — NEW! Get release notes and changelogs with breaking change detection (upgrade safely from version X to Y)

  15. check_service_status — NEW! Instant health checks for 25+ services (Stripe, AWS, GitHub, OpenAI, etc.) - "Is it down or just me?"

The server's MCP instructions tell agents to batch: several pages or searches go into one batch_crawl_urls or batch_web_search call, never one crawl_url or web_search call per item.

All tools feature comprehensive error handling, response size limits, usage tracking, and clear documentation for optimal AI agent integration.

MCP Resources (Direct Data Lookups)

  • package://{registry}/{name} - Package info from npm, PyPI, crates.io, or Go modules

  • github://{owner}/{repo} - Repository information and health metrics

  • status://{service} - Service health status for 120+ services

  • changelog://{registry}/{package} - Package release notes and changelogs

MCP Prompts (Reusable Workflows)

  • research_package - Comprehensive package evaluation

  • debug_error - Structured error debugging with solutions

  • compare_technologies - Side-by-side technology comparison

  • evaluate_repository - GitHub repository health assessment

  • check_service_health - Multi-service status monitoring

Quick Start

Everything runs in Docker - no Python installation needed:

./docker-start.sh

This starts both SearXNG and the MCP server in containers. See DOCKER_SETUP.md for details.

Option 2: Python + Docker SearXNG

  1. Set up SearXNG (5 minutes):

    # Using Docker (recommended)
    docker run -d -p 2288:8080 searxng/searxng:latest

    Then configure search engines - see SEARXNG_SETUP.md for optimized settings.

  2. Install the MCP server:

    uvx web-research-assistant  # or: pip install web-research-assistant
  3. Configure Claude Desktop - add to claude_desktop_config.json:

    {
      "mcpServers": {
        "web-research-assistant": {
          "command": "uvx",
          "args": ["web-research-assistant"]
        }
      }
    }
  4. Restart Claude Desktop and start researching!

⚠️ For best results: Configure SearXNG with GitHub, Stack Overflow, and other code-focused search engines. See SEARXNG_SETUP.md for the recommended configuration.

Related MCP server: SearXNG MCP Server

Prerequisites

Required

  • Python 3.10+

  • A running SearXNG instance on http://localhost:2288

    • 📖 See SEARXNG_SETUP.md for complete Docker setup guide

    • ⚠️ IMPORTANT: For best results, enable these search engines in SearXNG:

      • GitHub, Stack Overflow, GitLab (for code search - critical!)

      • DuckDuckGo, Brave (for web search)

      • MDN, Wikipedia (for documentation)

      • Reddit, HackerNews (for tutorials and discussions)

      • See SEARXNG_SETUP.md for the full optimized configuration

Optional

  • Exa API key for neural search - Get API key (recommended for better search results)

  • Pixabay API key for image search - Get free key

  • Playwright browsers for advanced crawling (installed with scrapling install)

Developer Setup (if running from source)

uv tool install uv  # if you do not already have uv
uv sync --all-extras --all-groups  # creates the virtual environment
uv run scrapling install           # installs Chromium for Scrapling

You can also use pip install -e . if you prefer pip over uv (deps come from pyproject.toml).

Installation

uvx web-research-assistant

This runs the server directly from PyPI without installing it globally.

Option 2: Install with pip

pip install web-research-assistant
web-research-assistant

Option 3: Install with uv

uv tool install web-research-assistant
web-research-assistant

By default the server communicates over stdio, which makes it easy to wire into Claude Desktop or any other MCP host.

MCP Client Configuration

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

Option 1: Using uvx (Recommended - No installation needed!)

{
  "mcpServers": {
    "web-research-assistant": {
      "command": "uvx",
      "args": ["web-research-assistant"]
    }
  }
}

Option 2: Using installed package

{
  "mcpServers": {
    "web-research-assistant": {
      "command": "web-research-assistant"
    }
  }
}

OpenCode

Add to ~/.config/opencode/opencode.json:

Using uvx (Recommended)

{
  "mcp": {
    "web-research-assistant": {
      "type": "local",
      "command": ["uvx", "web-research-assistant"],
      "enabled": true
    }
  }
}

Using installed package

{
  "mcp": {
    "web-research-assistant": {
      "type": "local",
      "command": ["web-research-assistant"],
      "enabled": true
    }
  }
}

Development (Running from source)

For Claude Desktop:

{
  "mcpServers": {
    "web-research-assistant": {
      "command": "uv",
      "args": [
        "--directory",
        "/ABSOLUTE/PATH/TO/web-research-assistant",
        "run",
        "web-research-assistant"
      ]
    }
  }
}

For OpenCode:

{
  "mcp": {
    "web-research-assistant": {
      "type": "local",
      "command": [
        "uv",
        "--directory",
        "/ABSOLUTE/PATH/TO/web-research-assistant",
        "run",
        "web-research-assistant"
      ],
      "enabled": true
    }
  }
}

Restart your MCP client afterwards. The MCP tools will be available immediately.

Tool behavior

Tool

When to use

Arguments

web_search

Use first to gather recent information and URLs from SearXNG. Returns 1–10 ranked snippets with clickable URLs.

query (required), optional reasoning, category (defaults to general), and max_results (defaults to 5).

batch_web_search

Use instead of calling web_search more than once. Runs every query in parallel and returns each query's hits in request order; a failed query does not stop the others.

queries (required list of 1–20), optional reasoning, category, and max_results per query (defaults to 5).

search_examples

Find code examples, tutorials, and technical articles. Optimized for technical content with optional time filtering. Perfect for learning APIs or finding usage patterns.

query (required, e.g., "Python async examples"), optional reasoning, content_type (code/articles/both, defaults to both), time_range (day/week/month/year/all, defaults to all), and max_results (defaults to 5).

search_images

Find high-quality royalty-free stock images from Pixabay. Returns photos, illustrations, or vectors. Requires PIXABAY_API_KEY environment variable.

query (required, e.g., "mountain landscape"), optional reasoning, image_type (all/photo/illustration/vector, defaults to all), orientation (all/horizontal/vertical, defaults to all), and max_results (defaults to 10).

crawl_url

Call immediately after search when you need the actual article body for quoting, summarizing, or extracting data. Continue long pages with the returned start_char value.

url (required), optional reasoning, max_chars (defaults to 12000), start_char (defaults to 0), and country.

batch_crawl_urls

Use instead of calling crawl_url more than once. Fetches every page in parallel and returns each one in request order; a failed, blocked, or slow page does not stop the others.

urls (required list of 1–20), optional reasoning, max_chars per page (defaults to 12000), start_chars (URL to offset map for continuing cut pages), and country.

package_info

Look up specific npm, PyPI, crates.io, or Go package metadata including version, downloads, license, and dependencies. Use when you know the package name.

name (required package name), optional reasoning, and registry (npm/pypi/crates/go, defaults to npm).

package_search

Search for packages by keywords or functionality (e.g., "web framework", "json parser"). Use when you need to find packages that solve a specific problem.

query (required search terms), optional reasoning, registry (npm/pypi/crates/go, defaults to npm), and max_results (defaults to 5).

github_repo

Get GitHub repository health metrics including stars, forks, issues, recent commits, and project details. Use when evaluating open source projects.

repo (required, owner/repo or full URL), optional reasoning and include_commits (defaults to true).

translate_error

Find Stack Overflow solutions for error messages and stack traces. Auto-detects language/framework, extracts key terms, filters irrelevant results, and prioritizes Stack Overflow solutions.

error_message (required stack trace or error text), optional reasoning, language, framework, and max_results (defaults to 5).

api_docs

Auto-discover and crawl official API documentation, then extract overviews, parameters, examples, and related links.

api_name and topic (required), optional reasoning and max_results (defaults to 2 pages).

extract_data

Extract tables, lists, fields, JSON-LD, or auto-detected structured data from HTML pages.

url (required), optional reasoning, extract_type, selectors, and max_items (defaults to 100).

compare_tech

Compare 2-5 technologies side-by-side using package, repository, and web evidence.

technologies (required list of 2-5 names), optional reasoning, category, aspects, and max_results_per_tech.

get_changelog

Get release notes, identify breaking changes, and provide upgrade guidance. Automatically tries npm and PyPI when the registry is unknown.

package (required name), optional reasoning, registry (defaults to auto), and max_releases (defaults to 5).

check_service_status

Check whether a supported external service has an active incident.

service (required name), optional reasoning.

Tool responses are capped at 30,000 characters by default. crawl_url returns an exact start_char continuation value when a page is longer than the requested chunk.

The batch tools share one 50,000-character budget across their items: short pages come back whole and long ones are cut evenly. A cut batch_crawl_urls result ends with the exact arguments that continue every cut page in one more call. Items still running after 45 seconds are reported as timed out, so the batch returns before typical 60-second client timeouts.

Resources

MCP Resources provide direct data access via URI templates - perfect for quick lookups without tool calls.

Resource URI

Description

Example

package://{registry}/{name}

Package metadata (version, downloads, license, dependencies)

package://npm/express

github://{owner}/{repo}

Repository info (stars, forks, issues, activity)

github://facebook/react

status://{service}

Service health status

status://stripe

changelog://{registry}/{package}

Release notes and changelogs

changelog://npm/typescript

Prompts

MCP Prompts are reusable message templates that guide AI assistants through common workflows.

Prompt

Arguments

Use Case

research_package

package_name, registry

Evaluate a package before adding it as a dependency

debug_error

error_message, language (optional), framework (optional)

Debug an error with context and solutions

compare_technologies

tech1, tech2, tech3 (optional), tech4 (optional), tech5 (optional)

Compare frameworks, databases, or languages

evaluate_repository

owner, repo

Assess a GitHub project's health and activity

check_service_health

services (comma-separated)

Monitor multiple services at once

Configuration

Environment variables let you adapt the server without touching code:

Variable

Default

Description

SEARXNG_BASE_URL

http://localhost:2288/search

Endpoint queried by web_search.

SEARXNG_DEFAULT_CATEGORY

general

Category used when none is provided.

SEARXNG_DEFAULT_RESULTS

5

Default number of search hits.

SEARXNG_MAX_RESULTS

10

Hard cap on hits per request.

SEARXNG_CRAWL_MAX_CHARS

12000

Default character budget for each crawl_url page.

MCP_MAX_RESPONSE_CHARS

30000

Overall response limit applied to every tool reply.

MCP_MAX_BATCH_RESPONSE_CHARS

50000

Output budget shared by all items of one batch_crawl_urls or batch_web_search call.

BATCH_TIMEOUT_SECONDS

45

Items of a batch call still running after this many seconds are reported as timed out.

SEARXNG_MCP_USER_AGENT

web-research-assistant/0.1

User-Agent header for outward HTTP calls.

PIXABAY_API_KEY

(empty)

API key for Pixabay image search. Get free key at pixabay.com/api/docs.

EXA_API_KEY

(empty)

API key for Exa AI neural search. Get key at dashboard.exa.ai.

SEARCH_PROVIDER

auto

Search provider: exa (Exa only), searxng (SearXNG only), or auto (try Exa first, fallback to SearXNG).

MCP_USAGE_LOG

~/.config/web-research-assistant/usage.json

Location for usage analytics data.

Development

The codebase is intentionally modular and organized:

web-research-assistant/
├── src/searxng_mcp/     # Source code
│   ├── config.py        # Configuration and environment
│   ├── search.py        # SearXNG integration
│   ├── exa.py           # Exa AI neural search client
│   ├── crawler.py       # Scrapling wrapper
│   ├── images.py        # Pixabay client
│   ├── registry.py      # Package registries (npm, PyPI, crates, Go)
│   ├── github.py        # GitHub API client
│   ├── errors.py        # Error parser (language/framework detection)
│   ├── api_docs.py      # API docs discovery (NO hardcoded URLs)
│   ├── tracking.py      # Usage analytics
│   ├── batch.py         # Batch tool helpers (parallel runs, shared output budget)
│   ├── instructions.py  # MCP instructions sent to every agent
│   └── server.py        # MCP server + 16 tools
├── docs/                # Documentation (27 files)
└── [config files]

Each module is well under 400 lines, making the codebase easy to understand and extend.

Usage Analytics

All tools automatically track usage metrics including:

  • Tool invocation counts and success rates

  • Response times and performance trends

  • Common use case patterns (via the reasoning parameter)

  • Error frequencies and types

Analytics data is stored in ~/.config/web-research-assistant/usage.json. The optional reasoning parameter improves use-case grouping, but omitting analytics context never blocks a tool call.

Documentation

Comprehensive documentation is available in the docs/ directory:

See the docs README for a complete index.

Available Tools

14 tools
api_docsA
Search and fetch official API documentation with examples and explanations.

Documentation-first approach: fetches human-written docs with context, examples,
and best practices. Much more useful than OpenAPI specs alone.

Discovery strategy:
1. Try common URL patterns (docs.{api}.com, {api}.com/docs, etc.)
2. If patterns fail, search for "{api} API official documentation"
3. Crawl discovered docs and extract relevant content

No hardcoded URLs - works for ANY API by discovering docs dynamically.

Examples:
- api_docs("stripe", "create customer", reasoning="Setting up payments")
- api_docs("github", "create repository", reasoning="Automating repo creation")
- api_docs("spartan", "button component", reasoning="Learning UI library")

Inputs: api_name (required), reasoning (required), topic (required), max_results. Returns: result

check_service_statusC

Check if an API service or platform is experiencing issues.

Inputs: service (required), reasoning (required). Returns: result

compare_techA
Compare multiple technologies, frameworks, or libraries side-by-side.

Automatically gathers information about each technology and presents
a structured comparison to help make informed decisions.

Categories:
- "framework": Web frameworks (React, Vue, Angular, etc.)
- "library": JavaScript/Python/etc. libraries
- "database": Databases (PostgreSQL, MongoDB, etc.)
- "language": Programming languages (Python, Go, Rust, etc.)
- "tool": Build tools, CLIs, etc. (Webpack, Vite, etc.)
- "auto": Auto-detect category

Examples:
- compare_tech(["React", "Vue", "Svelte"], reasoning="Choose framework for new project")
- compare_tech(["PostgreSQL", "MongoDB"], category="database", reasoning="Database for user data")
- compare_tech(["FastAPI", "Flask"], aspects=["performance", "learning_curve"], reasoning="Python web framework")

Inputs: technologies (required), reasoning (required), category, aspects, +1 more. Returns: result

crawl_urlC

Fetch a URL and return the page text as markdown for quoting or analysis.

Inputs: url (required), reasoning (required), max_chars, country. Returns: result

extract_dataA
Extract structured data from web pages.

Extracts tables, lists, or specific fields from HTML pages and returns
structured data. Much more efficient than parsing full page text.

Extract Types:
- "table": Extract HTML tables as list of dicts
- "list": Extract lists (ul/ol/dl) as structured list
- "fields": Extract specific elements using CSS selectors
- "json-ld": Extract JSON-LD structured data
- "auto": Automatically detect and extract structured content

Examples:
- extract_data("https://pypi.org/project/fastapi/", reasoning="Get package info")
- extract_data("https://github.com/user/repo/releases", reasoning="Get releases", extract_type="list")
- extract_data(
    "https://example.com/product",
    reasoning="Extract product details",
    extract_type="fields",
    selectors={"price": ".price", "title": "h1.product-name"}
  )

Inputs: url (required), reasoning (required), extract_type, selectors, +1 more. Returns: result

get_changelogC

Get changelog and release notes for a package.

Inputs: package (required), reasoning (required), registry, max_releases. Returns: result

github_repoA
Fetch GitHub repository information and health metrics.

Returns stars, forks, issues, recent activity, language, license, and description.
Use this to evaluate open source projects before using them.

Examples:
- github_repo("microsoft/vscode", reasoning="Evaluate editor project")
- github_repo("https://github.com/facebook/react", reasoning="Research UI framework")

Inputs: repo (required), reasoning (required), include_commits. Returns: result

package_infoA
Look up package information from npm, PyPI, crates.io, or Go modules.

Returns version, downloads, license, dependencies, security status, and repository links.
Use this to quickly evaluate libraries before adding them to your project.

Examples:
- package_info("express", reasoning="Need web framework", registry="npm")
- package_info("requests", reasoning="HTTP client for API", registry="pypi")
- package_info("serde", reasoning="JSON serialization", registry="crates")

Inputs: name (required), reasoning (required), registry. Returns: result

search_examplesA
Search for code examples, tutorials, and technical articles.

Optimized for finding practical examples and learning resources. Can optionally filter by
time range for the most recent content. Perfect for learning new APIs, finding usage patterns,
or discovering how others solve specific technical problems.

Content Types:
- 'code': GitHub repos, code snippets, gists, Stack Overflow code examples
- 'articles': Blog posts, tutorials, documentation, technical articles
- 'both': Mix of code and written content (default)

Time Ranges:
- 'all': Search all available content (default, recommended for best results)
- 'year', 'month', 'week', 'day': Filter to recent content only

Examples:
- search_examples("FastAPI dependency injection examples", content_type="code")
- search_examples("React hooks tutorial", content_type="articles", time_range="year")
- search_examples("Rust lifetime examples", content_type="both")

Inputs: query (required), reasoning (required), content_type, time_range, +1 more. Returns: result

search_imagesA
Search for high-quality stock images using Pixabay.

Returns royalty-free images that are safe to use. Perfect for finding photos,
illustrations, and vector graphics for projects, presentations, or design work.

Image Types:
- 'photo': Real photographs
- 'illustration': Digital illustrations and artwork
- 'vector': Vector graphics (SVG format available)
- 'all': All types (default)

Examples:
- search_images("mountain landscape", image_type="photo")
- search_images("business icons", image_type="vector")
- search_images("technology background", orientation="horizontal")

Inputs: query (required), reasoning (required), image_type, orientation, +1 more. Returns: result

stealth_scrapeA

Scrape a URL using a stealth browser that bypasses anti-bot protections.

Uses scrapling's StealthyFetcher with Patchright (hardened Playwright) to evade
Cloudflare, DataDome, and similar anti-bot systems. Much slower than crawl_url
but works on protected sites.

Requires browser binaries: run 'scrapling install' once before first use.

When to use:
- crawl_url returns a Cloudflare challenge page or empty content
- The target site blocks automated requests
- JavaScript rendering is required for the content to appear
- You need to wait for a specific element to load

Examples:
- stealth_scrape("https://protected-site.com/pricing")
- stealth_scrape("https://spa-app.com/data", wait_selector=".results-table")

Inputs: url (required), reasoning (required), max_chars, wait_selector, +3 more. Returns: result

translate_errorA
Find solutions for error messages and stack traces from Stack Overflow and GitHub.

Takes an error message or stack trace and finds relevant solutions with code examples.
Automatically detects language and framework, extracts key error information, and
searches for the best solutions ranked by votes and relevance.

Perfect for:
- Debugging production errors
- Understanding cryptic error messages
- Finding working code fixes
- Learning from similar issues

Examples:
- translate_error("TypeError: Cannot read property 'map' of undefined", reasoning="Debugging React app crash")
- translate_error("CORS policy: No 'Access-Control-Allow-Origin' header", reasoning="Fixing API integration", framework="FastAPI")
- translate_error("error[E0382]: borrow of moved value", reasoning="Learning Rust ownership", language="rust")

Inputs: error_message (required), reasoning (required), language, framework, +1 more. Returns: result

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 14 tools

    Disambiguation5/5

    Each tool targets a distinct research task (e.g., web_search vs. api_docs vs. compare_tech), with clear descriptions that prevent overlap. Even similar tools like crawl_url and stealth_scrape are differentiated by use cases.

    Naming Consistency4/5

    Names mostly follow a verb_noun or noun_noun pattern with underscores, but there are minor inconsistencies (e.g., 'github_repo' vs. 'check_service_status'). Overall readable and predictable.

    Tool Count5/5

    14 tools are well-scoped for a web research assistant, covering searching, fetching, extracting, and analyzing without being overwhelming or too few.

    Completeness4/5

    Covers core research workflows (search, fetch, extract, compare, check status, find packages/images/errors). Minor gaps like direct social media scraping are acceptable for the stated purpose.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Provides 14 enhanced intelligent search tools for both international platforms (GitHub, StackOverflow, NPM, etc.) and Chinese platforms (CSDN, Juejin, WeChat docs, etc.). Each tool includes smart URL generation, search tips, and related suggestions for comprehensive technical research.
      14
      23 npm
      14
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      Provides privacy-focused web search capabilities through SearXNG metasearch engine, enabling web, image, video, and news searches without tracking. Includes comprehensive research tools that aggregate and analyze results from multiple search engines.
      3
      4
      MIT
    • A
      license
      A
      quality
      F
      maintenance
      Tools for AI assistant's deep research: * Google search + webpage reading (incl. JS-rendered pages) * Document & decks analysis * YouTube transcript extraction * Patents + academic paper search * Company and competitors research * Prompts for comprehensive-research, fact-check, summarize-url, news-briefing, patent-portfolio-analysis, competitive-analysis, literature-review, technical-deep-dive
      8
      157 npm
      36
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      Provides free web search, content fetching, image search, and deep research via SearXNG, no API keys required.
      -