Skip to main content
Glama

websearch-mcp

A self-hosted MCP server that gives AI agents deep internet research capabilities — no API keys required.

Powered by SearxNG (meta search engine), Playwright (web scraping), and Docker (Python sandbox).

Tools

Tool

Description

search_internet

Meta search via SearxNG with speed/balanced/quality modes, domain dedup, and trust scoring

fetch_page

Scrape web pages with Playwright (stealth mode) + Readability extraction

execute_python

Run Python code in an isolated Docker sandbox (no network, resource limits)

get_search_suggestions

Get autocomplete suggestions for partial queries

Related MCP server: Eyes-MCP

Prerequisites

  • Node.js >= 20

  • Docker (for SearxNG and Python sandbox)

  • Playwright Chromium (auto-installed on first run)

Quick Start

1. Start SearxNG

docker compose up -d searxng

Wait for it to be healthy:

curl -sf http://localhost:8080/healthz

2. Install dependencies and build

npm install
npx playwright install chromium
npm run build

3. Run the server

node dist/index.js

The server communicates over stdio (MCP protocol). Connect it to any MCP-compatible client.

MCP Client Configuration

Claude Desktop / Claude Code

Add to your MCP settings:

{
  "mcpServers": {
    "websearch": {
      "type": "stdio",
      "command": "node",
      "args": ["/absolute/path/to/websearch-mcp/dist/index.js"],
      "env": {
        "SEARXNG_URL": "http://localhost:8080"
      }
    }
  }
}

Tool Reference

search_internet

Search the internet using SearxNG meta-search engine.

Parameters:

Parameter

Type

Default

Description

query

string

required

Search query (1-500 chars)

category

enum

general

general, news, science, images

max_results

int

10

Max results (1-50)

mode

enum

balanced

speed (1 page, 5 results), balanced (1 page), quality (3 pages, dedup)

language

string

""

Language code filter (e.g. en, es, fr)

Features:

  • Deduplication by exact URL

  • Max 2 results per domain (ignoring www prefix)

  • Trust scoring via config/website-weight-config.json

fetch_page

Fetch and extract content from a web page.

Parameters:

Parameter

Type

Default

Description

url

string

required

URL to fetch (http/https only)

extract_mode

enum

readable

snippet (meta description or first 200 chars), readable (Readability), full (raw HTML)

timeout

int

10000

Page load timeout in ms (1000-30000)

wait_for

string

-

CSS selector to wait for before extracting

Features:

  • Stealth mode (custom user-agent, webdriver bypass)

  • Auto-managed browser pool with idle timeout

  • Content truncated to 50,000 characters

execute_python

Execute Python code in an isolated Docker container.

Parameters:

Parameter

Type

Default

Description

code

string

required

Python code to execute (max 100,000 chars)

timeout

int

60000

Execution timeout in ms (1000-300000)

memory_limit_mb

int

512

Memory limit in MB (128-4096)

save_artifacts

bool

false

Save output files as artifacts

Security:

  • Network disabled during code execution

  • All Linux capabilities dropped

  • Resource limits enforced (RAM + CPU)

  • Auto-detects and installs missing pip packages in a separate network-enabled stage

get_search_suggestions

Get autocomplete suggestions for a partial query.

Parameters:

Parameter

Type

Default

Description

query

string

required

Partial query (min 2 chars)

max_suggestions

int

5

Max suggestions (1-10)

Falls back to simple query expansion (e.g. "query tutorial", "query examples") when SearxNG autocomplete is unavailable.

Configuration

Environment Variables

Variable

Default

Description

SEARXNG_URL

http://localhost:8080

SearxNG instance URL

SEARXNG_TIMEOUT_MS

10000

Search request timeout

SEARXNG_MAX_RETRIES

3

Max retries for failed requests

SEARXNG_RETRY_DELAY_MS

1000

Base retry delay (exponential backoff)

FETCH_TIMEOUT_MS

10000

Page fetch timeout

FETCH_MAX_CONTENT_LENGTH

50000

Max content length for fetched pages

PYTHON_SANDBOX_MEMORY_MB

512

Default Python sandbox memory limit

PYTHON_SANDBOX_CPU

1

Default Python sandbox CPU limit

PYTHON_SANDBOX_TIMEOUT_MS

60000

Default Python sandbox timeout

Trust Weights

config/website-weight-config.json defines domain trust scores from -1.0 to 1.0. Domains with negative scores are filtered out. Others are reordered by score (highest trust first).

{
  "wikipedia.org": 1.0,
  "arxiv.org": 0.95,
  "github.com": 0.9,
  "stackoverflow.com": 0.85,
  "medium.com": 0.5,
  "reddit.com": 0.3,
  "twitter.com": 0.2
}

Development

# Build
npm run build

# Run in dev mode (auto-reload)
npm run dev

# Run tests
npm test

# Lint
npm run lint

# Type check
npm run typecheck

Project Structure

websearch-mcp/
├── src/
│   ├── index.ts                 # MCP server entry point
│   ├── lib/
│   │   ├── browser-pool.ts      # Playwright browser pool with stealth mode
│   │   ├── config.ts            # Configuration loader
│   │   ├── docker-sandbox.ts    # Docker-based Python sandbox
│   │   ├── searxng-client.ts    # SearxNG API client with retry
│   │   └── trust-filter.ts      # Domain trust scoring and filtering
│   └── tools/
│       ├── fetch.ts             # fetch_page tool
│       ├── python.ts            # execute_python tool
│       ├── search.ts            # search_internet tool
│       └── suggestions.ts       # get_search_suggestions tool
├── tests/
├── config/
│   └── website-weight-config.json
├── infra/
│   └── searxng/settings.yml     # SearxNG configuration
├── docker-compose.yml           # SearxNG container
├── package.json
├── tsconfig.json
└── README.md

License

MIT

Available Tools

4 tools
execute_pythonExecute PythonA

Execute Python code in an isolated Docker sandbox with network disabled, capability dropping, and resource limits (512MB RAM, 1 CPU, 60s timeout). Auto-detects and installs missing packages.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesPython code to execute
timeoutNoExecution timeout in milliseconds
memory_limit_mbNoMemory limit in MB
save_artifactsNoWhether to save output files as artifacts

TDQS

A3.7/5.0
Behavior3/5

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

No annotations provided. Description covers sandbox details (network disabled, resource limits) and auto-install behavior, but does not disclose return format, error handling, or output structure.

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?

Two sentences with no redundancy. First sentence encapsulates core purpose and constraints, second adds key behavior (auto-install).

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

Completeness3/5

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

Covers security and auto-install but omits return value description and error behavior. With no output schema, agents lack full understanding of tool's response.

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% with detailed parameter descriptions. Description adds 'auto-detects missing packages' for the code parameter, which is a nice extra but not essential.

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 clearly states it executes Python code in a sandbox with security constraints. It is distinct from sibling tools (fetch_page, search) which are for web data retrieval.

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?

The description implies use for safe Python execution but lacks explicit when-to-use or alternatives guidance. No mention of prerequisites or exclusions.

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 and extract content from a web page using Playwright with stealth mode. Supports snippet, readable, and full extraction modes. Content is truncated to 50,000 characters.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe URL to fetch
extract_modeNoContent extraction modereadable
timeoutNoPage load timeout in milliseconds
wait_forNoOptional CSS selector to wait for before extracting

TDQS

A3.5/5.0
Behavior3/5

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

The description mentions stealth mode and a 50,000 character truncation, adding some behavioral context. However, it does not disclose error handling, rate limits, authentication needs, or what happens on failure, leaving gaps for an AI agent.

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 two sentences, front-loading the core action and listing key features. Every sentence adds value with no redundant or vague phrasing.

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

Completeness3/5

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

The description covers extraction modes and truncation but omits return format (e.g., plain text, HTML), error scenarios, and guidance on the wait_for parameter. For a tool with an output schema missing, more detail on output and behavior would be beneficial.

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% (all parameters described), so the baseline is 3. The description adds truncation limit and extraction mode types, but this context is partially redundant with the schema's enum for extract_mode. No additional per-parameter semantics are provided.

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 clearly states it fetches and extracts content from a web page using Playwright with stealth mode, listing specific extraction modes. This distinguishes it from sibling tools like search_internet, which perform web searches, and execute_python, which runs code.

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 guidance is provided on when to use this tool versus alternatives. The description lacks explicit context on when to use fetch_page over search_internet or other tools, and does not mention prerequisites or limitations.

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

get_search_suggestionsGet Search SuggestionsA

Get autocomplete suggestions for a partial search query from SearxNG. Returns up to max_suggestions suggestion strings. Falls back to simple query expansion when SearxNG autocomplete is unavailable.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesPartial search query
max_suggestionsNoMaximum number of suggestions

TDQS

A4.2/5.0
Behavior3/5

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

No annotations exist, so the description carries the burden. It discloses fallback behavior (simple query expansion) and return type, but does not explicitly state that it is read-only or discuss side effects.

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?

Two concise sentences, front-loaded with purpose, no wasted words.

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?

Although no output schema, the description adequately explains the return format (suggestion strings) and key behaviors. Could be slightly more explicit about the array structure, but overall sufficient for a simple tool.

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% but the description adds value by clarifying the 'query' is partial and that 'max_suggestions' controls the number of returned strings.

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 clearly states it gets autocomplete suggestions from SearxNG for partial queries, and implicitly distinguishes from sibling tools like search_internet which handles full queries.

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 description indicates when to use (for autocomplete suggestions) and mentions fallback behavior, but does not explicitly contrast with alternatives like search_internet for full queries.

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

search_internetSearch InternetA

Search the internet using SearxNG meta-search engine. Returns search results with title, URL, snippet, source engine, and score. Supports speed, balanced, and quality modes. Deduplicates by URL and limits same-domain results to 2. Filters low-trust domains when website-weight-config.json is present.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesThe search query string
categoryNoSearch categorygeneral
max_resultsNoMaximum number of results to return
modeNoSearch modebalanced
languageNoLanguage code filter (e.g., en, es, fr)

TDQS

A3.8/5.0
Behavior4/5

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

Despite no annotations, the description discloses deduplication, same-domain limiting, conditional filtering of low-trust domains, and three search modes (speed, balanced, quality), providing reasonable insight into behavior.

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 three concise sentences, front-loaded with the main purpose, then expanding on return format, modes, and filtering. No unnecessary words.

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?

Given no output schema or annotations, the description covers return fields, deduplication, domain limits, and modes. Lacks error handling and mode effects detail, but is largely complete for a search tool.

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% with descriptions for all parameters. The tool description adds no new parameter-level meaning but mentions deduplication and domain limits as behavioral context beyond 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?

The description clearly defines the tool as searching the internet via SearxNG, listing returned fields (title, URL, snippet, source engine, score) and distinguishing it from siblings like fetch_page or get_search_suggestions.

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 explicit guidance on when to use or not use this tool versus siblings (execute_python, fetch_page, get_search_suggestions). The description lacks context for appropriate usage scenarios.

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. Dates show when Glama detected each change.

  1. 4 tool updatesv1.0.0
    • First observedexecute_python
    • First observedfetch_page
    • First observedget_search_suggestions
    • First observedsearch_internet

TDQS

A4/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: searching, fetching pages, getting suggestions, and running code. No overlap.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case (execute_python, fetch_page, get_search_suggestions, search_internet).

Tool Count5/5

Four tools is a well-scoped set for a web search server, covering core functionality without being too few or too many.

Completeness4/5

The set covers searching, suggestions, page fetching, and code execution. Minor gap: no direct image search or URL validation, but execute_python adds flexibility.

Maintenance

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    A research MCP server that enables AI agents to query the internet using multiple sources like SearXNG, GitHub, Reddit, and YouTube, and returns synthesized answers with citations.
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    A self-hosted MCP server providing private web search, web page fetching, and current date/time tools, powered by a bundled SearXNG instance for API-key-free local search.
    2
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/gawirable/websearch-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server