websearch-mcp
Meta search via a self-hosted SearXNG instance with speed/balanced/quality modes, domain dedup, and trust scoring.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@websearch-mcpsearch the web for quantum computing breakthroughs in 2025"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
| Meta search via SearxNG with speed/balanced/quality modes, domain dedup, and trust scoring |
| Scrape web pages with Playwright (stealth mode) + Readability extraction |
| Run Python code in an isolated Docker sandbox (no network, resource limits) |
| 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 searxngWait for it to be healthy:
curl -sf http://localhost:8080/healthz2. Install dependencies and build
npm install
npx playwright install chromium
npm run build3. Run the server
node dist/index.jsThe 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 |
| string | required | Search query (1-500 chars) |
| enum |
|
|
| int |
| Max results (1-50) |
| enum |
|
|
| string |
| Language code filter (e.g. |
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 |
| string | required | URL to fetch (http/https only) |
| enum |
|
|
| int |
| Page load timeout in ms (1000-30000) |
| 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 |
| string | required | Python code to execute (max 100,000 chars) |
| int |
| Execution timeout in ms (1000-300000) |
| int |
| Memory limit in MB (128-4096) |
| bool |
| 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 |
| string | required | Partial query (min 2 chars) |
| int |
| 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 instance URL |
|
| Search request timeout |
|
| Max retries for failed requests |
|
| Base retry delay (exponential backoff) |
|
| Page fetch timeout |
|
| Max content length for fetched pages |
|
| Default Python sandbox memory limit |
|
| Default Python sandbox CPU limit |
|
| 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 typecheckProject 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.mdLicense
MIT
Available Tools
4 toolsexecute_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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Python code to execute | |
| timeout | No | Execution timeout in milliseconds | |
| memory_limit_mb | No | Memory limit in MB | |
| save_artifacts | No | Whether to save output files as artifacts |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL to fetch | |
| extract_mode | No | Content extraction mode | readable |
| timeout | No | Page load timeout in milliseconds | |
| wait_for | No | Optional CSS selector to wait for before extracting |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Partial search query | |
| max_suggestions | No | Maximum number of suggestions |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The search query string | |
| category | No | Search category | general |
| max_results | No | Maximum number of results to return | |
| mode | No | Search mode | balanced |
| language | No | Language code filter (e.g., en, es, fr) |
TDQS
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.
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.
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.
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.
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.
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.
4 tool updates
v1.0.0- First observed
execute_python - First observed
fetch_page - First observed
get_search_suggestions - First observed
search_internet
TDQS
Each tool has a clearly distinct purpose: searching, fetching pages, getting suggestions, and running code. No overlap.
All tool names follow a consistent verb_noun pattern in snake_case (execute_python, fetch_page, get_search_suggestions, search_internet).
Four tools is a well-scoped set for a web search server, covering core functionality without being too few or too many.
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
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
An MCP server that gives your AI access to the source code and docs of all public github repos
Docs: https://docs.keenable.ai/mcp-server Keenable is a free, remote MCP server that gives agents access to the web index. Search the web with ranked results and date/site filters, then fetch any indexed page as clean markdown. Works out of the box with no account or API key.
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Driflyte MCP server which lets AI assistants query topic-specific knowledge from web and GitHub.
Related MCP Servers
- AlicenseAqualityBmaintenanceAn MCP server that gives local LLMs access to Google search, live feeds, YouTube transcriptions, OCR, and more — all without API keys, using headless Chromium and open-source models.38125MIT
- AlicenseNot gradedqualityBmaintenanceA 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
- AlicenseAqualityDmaintenanceAn AI-ready MCP server that performs intelligent web searches using SearxNG and Playwright, with one-step Docker setup.6MIT
- FlicenseNot gradedqualityBmaintenanceA 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
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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