MetaSearchMCP
Provides access to arXiv academic papers search via Atom API.
Provides web search from Baidu via HTML scraping.
Provides web search via Brave Search API.
Provides Docker Hub image search via Docker Hub search API.
Provides web search from DuckDuckGo via HTML scraping.
Provides web search from Ecosia via HTML scraping.
Provides code and repository search via GitHub REST API.
Provides code and repository search via GitLab REST API.
Provides Google search results via direct scraping or hosted SERP APIs (SerpBase, Serper).
Provides access to Internet Archive's digital content via Advanced Search API.
Provides web search from Mojeek via HTML scraping.
Provides package search via npm registry API.
Provides access to PubMed biomedical literature search via NCBI E-utilities.
Provides Python package search via PyPI HTML scraping.
Provides web search from Qwant via internal JSON API.
Provides search across Reddit via Reddit API.
Provides Ruby gem search via RubyGems search API.
Provides academic paper search via Semantic Scholar Graph API.
Provides search across Stack Exchange network via Stack Exchange API.
Provides Q&A search on Stack Overflow via Stack Exchange API.
Provides web search from Startpage via HTML scraping.
Provides search across Wikidata knowledge base via Wikidata API.
Provides encyclopedia search via MediaWiki API.
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., "@MetaSearchMCPsearch web for latest LLM news"
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.
MetaSearchMCP
Open-source metasearch backend for MCP, AI agents, and LLM workflows.
MetaSearchMCP aggregates results from multiple search providers, normalizes them into a stable JSON schema, and exposes both an HTTP API and an MCP server for agent tooling.
Positioning
MCP-first metasearch backend
Structured search API for AI pipelines
Multi-provider search orchestration with deduplication and fallback
Python FastAPI alternative to browser-first metasearch projects
Related MCP server: Deep Search MCP Server
Why It Exists
Most search aggregators are designed around browser UX: HTML pages, pagination, and interactive result cards. Agents and LLM workflows need a different contract: predictable JSON, stable field names, partial-failure tolerance, and provider-level execution metadata.
MetaSearchMCP is built for that machine-consumable workflow. The design is centered on search orchestration, normalized contracts, and MCP integration.
Core Features
Concurrent multi-provider aggregation
Unified result schema for web, academic, developer, and knowledge sources
Provider-level timeout isolation and partial-failure handling
Result deduplication across engines
Provider selection by explicit names or semantic tags such as
web,academic,code, andgoogleFinal result caps for agent-friendly payload sizing
HTTP API with OpenAPI docs
MCP server over stdio for Claude Desktop, Cline, Continue, and similar clients
Configurable provider allowlist via environment variables
Google Support
Google support now includes a direct scraper provider implemented inside this project.
The direct Google implementation uses browser-like requests, consent cookie handling, locale-aware query parameters, and resilient HTML result parsing. It is implemented locally in this repository.
Currently supported Google providers:
Provider | Env var | Notes |
Direct Google |
| Primary path; HTML scraping, best effort, may be blocked from datacenter IPs |
| Pay-per-use; typically cheaper for low-volume usage | |
| Includes a free tier, then pay-per-use |
Provider priority for /search/google is now google first, then google_serpbase, then google_serper.
Supported Providers
Provider | Name | Method |
Direct Google |
| HTML scraping with browser-like request handling |
SerpBase |
| Hosted Google SERP API |
Serper |
| Hosted Google SERP API |
Web Search
Provider | Name | Method |
DuckDuckGo |
| HTML scraping |
Bing |
| RSS feed |
Yahoo |
| HTML scraping, best effort |
Brave |
| Official Search API |
Mwmbl |
| Public JSON API |
Ecosia |
| HTML scraping |
Mojeek |
| HTML scraping |
Startpage |
| HTML scraping, best effort |
Qwant |
| Internal JSON API, best effort |
Yandex |
| HTML scraping, best effort |
Baidu |
| JSON endpoint, best effort |
Knowledge And Reference
Provider | Name | Method |
Wikipedia |
| MediaWiki API |
Wikidata |
| Wikidata API |
Internet Archive |
| Advanced Search API |
Open Library |
| Open Library search API |
Developer Sources
Provider | Name | Method |
GitHub |
| GitHub REST API |
GitLab |
| GitLab REST API |
Stack Overflow |
| Stack Exchange API |
Hacker News |
| Algolia HN API |
| Reddit API | |
npm |
| npm registry API |
PyPI |
| HTML scraping |
RubyGems |
| RubyGems search API |
crates.io |
| crates.io API |
lib.rs |
| HTML scraping |
Docker Hub |
| Docker Hub search API |
pkg.go.dev |
| HTML scraping |
MetaCPAN |
| MetaCPAN REST API |
Academic Sources
Provider | Name | Method |
arXiv |
| Atom API |
PubMed |
| NCBI E-utilities |
Semantic Scholar |
| Graph API |
CrossRef |
| REST API |
Finance Sources
Provider | Name | Key Required | Free Tier |
Yahoo Finance |
| No | Unofficial endpoint, no key needed |
Alpha Vantage |
|
| 25 req/day — get key |
Finnhub |
|
| 60 req/min — get key |
Installation
One-command local install:
python scripts/install.pyInstall, run tests, and start the HTTP API:
python scripts/install.py --dev --test --runDeploy with Docker Compose:
python scripts/install.py --mode dockerThe installer creates .env from .env.example when .env does not already exist. Existing .env files are kept unless --force-env is passed.
Manual install:
git clone https://github.com/gefsikatsinelou/MetaSearchMCP
cd MetaSearchMCP
pip install -e ".[dev]"Or with uv:
uv pip install -e ".[dev]"Configuration
Copy .env.example to .env and configure any providers you want to enable.
cp .env.example .envKey settings:
HOST=0.0.0.0
PORT=8000
DEFAULT_TIMEOUT=10
AGGREGATOR_TIMEOUT=15
SERPBASE_API_KEY=
SERPER_API_KEY=
BRAVE_API_KEY=
GITHUB_TOKEN=
STACKEXCHANGE_API_KEY=
REDDIT_CLIENT_ID=
REDDIT_CLIENT_SECRET=
NCBI_API_KEY=
SEMANTIC_SCHOLAR_API_KEY=
ALPHA_VANTAGE_API_KEY=
FINNHUB_API_KEY=
ENABLED_PROVIDERS=
ALLOW_UNSTABLE_PROVIDERS=false
MAX_RESULTS_PER_PROVIDER=10Running
HTTP API
python -m metasearchmcp.server
# or
metasearchmcpThe API starts on http://localhost:8000.
MCP Server
python -m metasearchmcp.broker
# or
metasearchmcp-mcpThe MCP server communicates over stdio.
Docker
docker build -t metasearchmcp .
docker run --rm -p 8000:8000 --env-file .env metasearchmcpOr with Compose:
docker compose up --buildHTTP API
POST /search
Aggregate across all enabled providers or a selected provider subset.
curl -X POST http://localhost:8000/search \
-H "Content-Type: application/json" \
-d '{
"query": "rust async runtime",
"providers": ["duckduckgo", "wikipedia"],
"params": {"num_results": 5, "max_total_results": 8, "language": "en"}
}'You can also narrow providers by tags:
curl -X POST http://localhost:8000/search \
-H "Content-Type: application/json" \
-d '{
"query": "transformer attention",
"tags": ["academic", "knowledge"],
"params": {"num_results": 5, "max_total_results": 6}
}'When multiple tags are provided, the default behavior is tag_match="any".
Set tag_match to "all" when you want providers that satisfy every requested tag:
curl -X POST http://localhost:8000/search \
-H "Content-Type: application/json" \
-d '{
"query": "npm cli argument parser",
"tags": ["code", "packages"],
"tag_match": "all",
"params": {"num_results": 5, "max_total_results": 6}
}'num_results controls how many results each provider can contribute. max_total_results caps the final merged response after deduplication.
POST /search/google
Search Google through the configured Google provider chain. If ALLOW_UNSTABLE_PROVIDERS=true, MetaSearchMCP will prefer the direct google provider automatically.
curl -X POST http://localhost:8000/search/google \
-H "Content-Type: application/json" \
-d '{"query": "site:github.com rust tokio"}'To force the direct Google route explicitly:
curl -X POST http://localhost:8000/search/google \
-H "Content-Type: application/json" \
-d '{"query": "site:github.com rust tokio", "provider": "google"}'GET /providers
Return the currently available provider catalog.
The response includes provider descriptions and a tag-to-provider index for quick discovery.
You can filter the catalog by tag:
curl "http://localhost:8000/providers?tag=academic&tag=web"Use tag_match=all to require every tag instead of the default any-match behavior:
curl "http://localhost:8000/providers?tag=code&tag=packages&tag_match=all"GET /health
Simple health check endpoint. Returns service status, version, provider count, and the current provider name list.
Response Schema
Every aggregated response includes:
enginequeryresultsrelated_searchessuggestionsanswer_boxtiming_msproviderserrors
Every result item includes:
titleurlsnippetsourcerankproviderpublished_dateextra
Example response:
{
"engine": "metasearchmcp",
"query": "rust async runtime",
"results": [
{
"title": "Tokio - An asynchronous Rust runtime",
"url": "https://tokio.rs",
"snippet": "Tokio is an event-driven, non-blocking I/O platform...",
"source": "tokio.rs",
"rank": 1,
"provider": "duckduckgo",
"published_date": null,
"extra": {}
}
],
"related_searches": [],
"suggestions": [],
"answer_box": null,
"timing_ms": 843.2,
"providers": [
{
"name": "duckduckgo",
"success": true,
"result_count": 10,
"latency_ms": 840.1,
"error": null
}
],
"errors": []
}MCP Tools
MetaSearchMCP exposes these MCP tools:
search_websearch_googlesearch_academicsearch_githubcompare_enginessearch_financesearch_code
search_web also accepts optional tags so agents can limit search to categories such as web, academic, code, or google. When multiple tags are present, tag_match="all" requires a provider to satisfy the full set.
All search tools accept max_total_results to keep the final payload compact.
Example Claude Desktop config:
{
"mcpServers": {
"MetaSearchMCP": {
"command": "metasearchmcp-mcp",
"env": {
"ALLOW_UNSTABLE_PROVIDERS": "true",
"SERPBASE_API_KEY": "your_key",
"SERPER_API_KEY": "your_key"
}
}
}
}Development
pip install -e ".[dev]"
pytest
uvicorn metasearchmcp.server:app --reloadArchitecture
The public package is organized around these modules:
contracts.py: request and response modelscatalog.py: provider discovery and selectionorchestrator.py: concurrent search execution and response assemblymerge.py: URL normalization and deduplicationserver.py: FastAPI entrypointbroker.py: MCP entrypoint
Legacy module names are kept as compatibility shims for earlier imports.
Roadmap
Caching and provider-aware query reuse
Better scoring and ranking signals across providers
Streaming aggregation responses
Provider health telemetry
More first-party API integrations where they improve reliability
License
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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/gefsikatsinelou/MetaSearchMCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server