MetaSearchMCP
MetaSearchMCP is a metasearch backend that aggregates results from multiple providers via HTTP and MCP tools for AI agents and LLM workflows.
Perform web, Google, academic, GitHub, code, finance, news, social, image, video, and biomedical searches through unified MCP tools.
Aggregate and deduplicate results across many providers (DuckDuckGo, Bing, Brave, Wikipedia, arXiv, PubMed, GitHub, npm, etc.).
Filter providers by explicit names or semantic tags (
web,academic,code,google, etc.) withany/allmatching.Search Google via direct scraping or hosted APIs (SerpBase, Serper) with provider override.
Cap result counts per provider and final merged output for agent-friendly payloads.
List available providers and check provider health/configuration status.
Use the HTTP API (
/search,/search/google,/search/suggest,/providers,/health,/cache/stats) for programmatic access.Use MCP over stdio with clients like Claude Desktop, Cline, and Continue.
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 "Deploy 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: serp-it
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 |
You.com |
| Official Search API |
Mwmbl |
| Public JSON API |
Marginalia |
| Public JSON API, no key required |
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 |
Seznam |
| HTML scraping (Czech web), no key required |
Naver |
| HTML scraping (Korean web), no key required |
Ahmia |
| HTML scraping (Tor .onion services), no key required |
Knowledge And Reference
Provider | Name | Method |
Wikipedia |
| MediaWiki API |
Wikidata |
| Wikidata API |
Wikiquote |
| MediaWiki API |
Wikisource |
| MediaWiki API, no key required |
Wikibooks |
| MediaWiki API, no key required |
Wiktionary |
| MediaWiki API, no key required |
Wikivoyage |
| MediaWiki API, no key required |
Wikiversity |
| MediaWiki API, no key required |
Wikispecies |
| MediaWiki API, no key required |
Internet Archive |
| Advanced Search API |
Open Library |
| Open Library search API |
Datamuse |
| Word-association/thesaurus REST API, no key required |
Jisho |
| Japanese-English dictionary API (JMDict/JMNedict lookups with readings and JLPT level), no key required |
Tatoeba |
| Tatoeba public JSON API (collaborative example sentences with translations in hundreds of languages: sentence text, language, contributor, licence, alternative-script transcription, audio and translations into other languages), no key required |
Urban Dictionary |
| Urban Dictionary public JSON API (crowd-sourced slang and idiom definitions: definition, example usage, author, up/down votes and submission date) with autocomplete term suggestions, no key required |
Nobel Prize |
| Official Nobel Prize API v2 (awards by year/category), no key required |
OEIS |
| OEIS JSON search API (integer sequences by terms, A-number or keywords: sequence name, terms, offset, keyword flags, author), no key required |
Places And Geocoding
Provider | Name | Method |
Open-Meteo Geocoding |
| Geocoding REST API, no key required |
OpenStreetMap (Nominatim) |
| Nominatim public API, no key required |
Nager.Date |
| Public-holiday calendar REST API (public holidays by country), no key required |
Nature And Biodiversity
Provider | Name | Method |
iNaturalist |
| Observations REST API, no key required |
GBIF |
| GBIF species backbone REST API, no key required |
Developer Sources
Provider | Name | Method |
GitHub |
| GitHub REST API |
GitLab |
| GitLab REST API |
Codeberg |
| Codeberg REST API |
Stack Overflow |
| Stack Exchange API |
Sourcegraph |
| Streaming search API, no key required |
Hacker News |
| Algolia HN API |
Hugging Face |
| Hub REST API, no key required |
| Reddit API | |
npm |
| npm registry API |
PyPI |
| JSON API |
RubyGems |
| RubyGems search API |
crates.io |
| crates.io API |
lib.rs |
| HTML scraping |
Docker Hub |
| Docker Hub search API |
Artifact Hub |
| Artifact Hub packages search API (Helm charts, operators, policies, container images), no key required |
Flathub |
| Flathub API v2 search (Linux desktop apps), no key required |
Snapcraft |
| Snap Store v2 snaps/find API (Linux snaps), no key required |
MacPorts |
| MacPorts ports REST API (macOS/Darwin packages: version, license, platforms, categories, maintainers, build variants and dependencies), no key required |
JetBrains Marketplace |
| JetBrains searchPlugins API (IDE plugins), no key required |
Open VSX |
| Open VSX search API (VS Code-compatible extensions), no key required |
Mozilla Add-ons (AMO) |
| AMO API v5 (Firefox browser extensions), no key required |
WordPress.org Plugins |
| WordPress.org Plugins API (WP plugins), no key required |
WordPress.org Themes |
| WordPress.org Themes API (WP themes), no key required |
GNOME Extensions |
| extensions.gnome.org extension-query API (GNOME Shell extensions), no key required |
VS Code Marketplace |
| Public gallery extensionquery API (VS Code extensions), no key required |
pkg.go.dev |
| HTML scraping |
MetaCPAN |
| MetaCPAN REST API |
Maven Central |
| Solr search API, no key required |
NuGet |
| NuGet.org v3 search query API, no key required |
Packagist |
| Packagist search.json API (PHP/Composer), no key required |
Hex |
| Hex.pm packages API (Elixir/Erlang), no key required |
pub.dev |
| pub.dev JSON API (Dart/Flutter), no key required |
Hackage |
| Hackage packages API (Haskell/Cabal), no key required |
R (CRAN / r-universe) |
| r-universe search API (R packages on CRAN, Bioconductor and r-universe universes: title, description, maintainer, stars, reverse dependencies, topics, last update), no key required |
Anaconda |
| Anaconda.org search API (conda packages), no key required |
AUR |
| Arch Linux AUR RPC API (community packages), no key required |
Chocolatey |
| Chocolatey community OData search feed (Windows packages), no key required |
Terraform Registry |
| Terraform Registry search API (reusable modules + providers for AWS, Azure, GCP, Kubernetes, ...), no key required |
IETF Datatracker |
| IETF Datatracker documents API (RFCs and Internet-Drafts by title/abstract, with standards level, stream and page count), no key required |
Software Heritage |
| Software Heritage origin search API (universal archive of public source code: repository URLs by keyword across GitHub, GitLab, Bitbucket, ... with visit types, snapshot availability, visit count, last-visited date and a link to the archived record), no key required |
Academic Sources
Provider | Name | Method |
arXiv |
| Atom API |
PubMed |
| NCBI E-utilities |
Semantic Scholar |
| Graph API |
CrossRef |
| REST API |
OpenAlex |
| OpenAlex REST API, no key required |
INSPIRE-HEP |
| INSPIRE-HEP literature API (high-energy physics papers, preprints, citations), no key required |
OpenAIRE |
| OpenAIRE Graph search API (300M+ open research records from repositories & aggregators), no key required |
HAL Open Science |
| HAL search API (French national open-access repository: articles, preprints, theses, book chapters), no key required |
DOAJ |
| DOAJ public REST API, no key required |
DOAB |
| DOAB public REST API (peer-reviewed open-access books and monographs), no key required |
Europe PMC |
| Europe PMC REST API (PubMed + preprints), no key required |
ClinicalTrials.gov |
| ClinicalTrials.gov v2 API (clinical studies), no key required |
DataCite |
| DataCite DOI search API, no key required |
Figshare |
| Figshare public articles API (research data, datasets), no key required |
Zenodo |
| Zenodo REST API, no key required |
Dryad |
| Dryad REST API v2 (curated open-access research datasets with authors, abstract, keywords, field of science and licence, plus DOI and download link), no key required |
Harvard Dataverse |
| Harvard Dataverse search API (research datasets: description, authors, DOI, publication date, publisher dataverse, subjects, file count and version), no key required |
OSF Preprints |
| OSF API v2 (PsyArXiv, SocArXiv, etc.), no key required |
ORCID |
| ORCID public API (researcher profiles), no key required |
ROR |
| Research Organization Registry API (universities, institutes, labs), no key required |
UniProt |
| UniProt REST API (protein knowledgebase), no key required |
MyGene.info |
| BioThings MyGene.info gene annotation API (gene symbols, names, organism, chromosome, aliases), no key required |
RCSB PDB |
| RCSB Protein Data Bank search + GraphQL data API (3D structures: title, method, resolution, citation), no key required |
EBI Ontology Lookup Service |
| EMBL-EBI OLS4 full-text search over 250+ biomedical and biological ontologies (Gene Ontology, MeSH, ChEBI, HGNC, HPO, MONDO, NCIT): term labels, stable identifiers such as |
ChEMBL |
| ChEMBL REST API (drugs, molecular formula/SMILES/ATC), no key required |
PubChem |
| PubChem PUG REST API (compound names/synonyms, molecular formula, molecular weight, canonical SMILES, IUPAC name, InChIKey), no key required |
RxNorm |
| NLM RxNorm REST API (clinical drug terminology), no key required |
Google Books |
| Google Books API, no key required |
Project Gutenberg |
| Gutendex API (public-domain ebooks), no key required |
DBLP |
| DBLP bibliography API (computer-science publications), no key required |
OpenReview |
| OpenReview API v2 note search (submissions to ICLR, NeurIPS, ICML, COLM and workshops: title, authors, abstract, keywords, venue and review status, primary area, TLDR, discussion and PDF links), no key required |
zbMATH Open |
| zbMATH Open REST API (mathematical literature: Zbl number, authors, venue, MSC classification, reviews), no key required |
openFDA |
| openFDA drug approvals API, no key required |
NIH RePORTER |
| NIH RePORTER v2 API (U.S. federally funded research projects: title, abstract, principal investigators, funding institute, fiscal-year award amount, organization, project period), no key required |
Grants.gov |
| Grants.gov search API (U.S. federal funding opportunities: description, agency, posted/forecasted status, open and close dates, CFDA numbers, award ceiling/floor, funding instruments, eligible applicants), no key required |
J-STAGE |
| J-STAGE Web API article search (Japanese scholarly journals: English and Japanese titles, authors, journal, ISSN, volume/number/pages, publication year and DOI), no key required |
Legal Sources
Provider | Name | Method |
CourtListener |
| Free Law Project REST API, no key required |
Federal Register |
| federalregister.gov documents API (agency rules, proposed rules, notices, presidential documents), no key required |
Nonprofit Sources
Provider | Name | Method |
ProPublica Nonprofit Explorer |
| ProPublica Nonprofit Explorer v2 search API (IRS register of U.S. tax-exempt organizations: EIN, legal and secondary names, city/state, NTEE category, IRS subsection, Form 990 filing history), no key required |
Patent Sources
Provider | Name | Method |
Google Patents |
| Public XHR query API, no key required |
Open Data Portals
Provider | Name | Method |
European Open Data Portal |
| data.europa.eu search API (public-sector datasets harvested from EU member states and institutions: description, publisher, catalogue, country, subjects, formats, licence), no key required |
Development Sources
Provider | Name | Method |
World Bank Documents & Reports |
| World Bank document search API (development publications, working papers, project and country documents: title, type, publication date, language, report number, project, country, abstract, PDF and text links), no key required |
News Sources
Provider | Name | Method |
Google News |
| Public RSS feed, no key required |
GDELT |
| Public DOC 2.0 API, no key required |
Bing News |
| Public RSS feed, no key required |
Wikinews |
| MediaWiki API, no key required |
Spaceflight News |
| Spaceflight News API, no key required |
Lobsters |
| Lobste.rs JSON API, no key required |
Social Sources
Provider | Name | Method |
Mastodon |
| Mastodon public API, no key required |
Bluesky |
| Bluesky AppView public API, no key required |
Lemmy |
| Lemmy public API, no key required |
Media Sources
Provider | Name | Method |
Wikimedia Commons |
| MediaWiki API, no key required |
Openverse |
| Openverse REST API, no key required |
Iconify |
| Iconify search API (200,000+ open-source vector icons from 150+ icon sets: keywords, set name, author, licence, SVG URL), no key required |
Flickr |
| Public feed API, no key required |
Unsplash |
| Unsplash REST API (requires |
Wallhaven |
| Wallhaven public JSON API (high-resolution desktop wallpapers: resolution and aspect ratio, file size/type, category, purity, colours, views/favourites, full-size image and thumbnail URLs), no key required |
NASA |
| NASA Image and Video Library API, no key required |
Met Museum |
| Met Museum public collection API, no key required |
Art Institute of Chicago |
| AIC public collection API, no key required |
Cleveland Museum of Art |
| CMA open-access API, no key required |
Victoria and Albert Museum |
| V&A public collection API (decorative arts, design, fashion and sculpture: object type, title, maker with association, production date and place, current location and on-display status, IIIF image URLs), no key required |
PeerTube |
| Public REST API, no key required |
Dailymotion |
| Public REST API, no key required |
TVMaze |
| TVMaze public API, no key required |
Library of Congress |
| loc.gov public JSON API, no key required |
Radio Browser |
| Radio Browser public API, no key required |
MusicBrainz |
| MusicBrainz public API (recordings/artists), no key required |
Discogs |
| Discogs database search API, no key required |
Deezer |
| Deezer public search API (streaming-catalog tracks with previews), no key required |
Kitsu |
| Kitsu anime & manga catalog API (JSON:API), no key required |
AniList |
| AniList GraphQL API (anime, manga & light novels with synopsis, format, status, genres, community scores, popularity, studio and cover image), no key required |
MangaDex |
| MangaDex public REST API (manga titles & alternate titles with synopsis, status, year, content rating, demographic, chapter/volume counts, genres, authors/artists and cover image), no key required |
Steam |
| Steam Store search API, no key required |
Scryfall |
| Scryfall Magic: The Gathering card search API (names, rules text, sets, prices), no key required |
TheMealDB |
| TheMealDB public API, no key required |
TheCocktailDB |
| TheCocktailDB public API, no key required |
Open Food Facts |
| Open Food Facts public search API, no key required |
TheSportsDB |
| TheSportsDB public API (teams & players), no key required |
RemoteOK |
| RemoteOK public jobs API (remote developer jobs), no key required |
Remotive |
| Remotive public jobs API (keyword-searchable remote jobs), no key required |
iTunes |
| iTunes Search API (podcasts), no key required |
Space Sources
Provider | Name | Method |
Launch Library 2 |
| The Space Devs launch database API (historical & upcoming launches), no key required |
NASA Exoplanet Archive |
| Exoplanet Archive TAP API (confirmed exoplanets by planet or host-star name: discovery year/method, orbital period, radius, mass, distance, equilibrium temperature), no key required |
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 |
CoinGecko |
| No | Cryptocurrency search API, no key needed |
NVD |
| No | NIST NVD CVE vulnerability search API, no key needed |
CISA KEV |
| No | CISA Known Exploited Vulnerabilities catalog (CVEs exploited in the wild), no key needed |
Frankfurter |
| No | ECB daily FX reference rates, no key needed |
SEC EDGAR |
| No | SEC full-text + company filings API (unstable flag), no key needed |
GLEIF |
| No | Global Legal Entity Identifier registry (company legal names, jurisdiction, status), no key needed |
Deals And Shopping
Provider | Name | Method |
CheapShark |
| CheapShark public deals API (current PC game price drops across digital stores: sale price, normal price, discount, store, ratings), no key required |
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=
YDC_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=10To enable You.com, set YDC_API_KEY and either let it participate in the default web-provider pool or explicitly target it with providers: ["youcom"].
curl -X POST http://localhost:8000/search \
-H "Content-Type: application/json" \
-d '{
"query": "playwright locator best practices",
"providers": ["youcom"],
"params": {"num_results": 5}
}'Running
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 /search/suggest
Query autocomplete suggestions for a partial search term. Uses the public DuckDuckGo autocomplete endpoint — no API key required.
curl "http://localhost:8000/search/suggest?q=python&limit=5"Returns query, suggestions, count, and source (duckduckgo). limit defaults to 8 and is capped at 20.
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.
GET /cache/stats
Inspect the shared in-memory search result cache (used by the orchestrator to avoid re-hitting external providers for identical requests within the TTL window).
curl "http://localhost:8000/cache/stats"Returns enabled, entries (live cached results), max_entries (capacity), ttl_seconds, and insertions (total keys written since process start — a monotonic counter unaffected by expiry or eviction).
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_codesearch_newssearch_socialsearch_imagessearch_videossearch_biolist_providersprovider_health
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/response data models (Pydantic schemas)config.py: application settings loaded from environment variablescatalog.py: provider discovery, filtering, and selection by name or tagsorchestrator.py: concurrent search execution across providers and result assemblymerge.py: URL canonicalization and cross-engine result deduplicationranking.py: optional consensus/relevance result re-ranking (opt-in viaRANK_RESULTS)server.py: FastAPI application and Uvicorn server entrypointbroker.py: MCP server exposing search tools over stdioapi/routes.py: HTTP endpoint handlers (search, suggest, health, providers catalog)cli.py: interactive first-run setup wizard (metasearchmcp-setup)
Entry-point wrappers (main.py for HTTP, mcp_server.py for MCP) and legacy
compatibility shims (aggregator.py, dedup.py, schema.py) are kept for
backwards compatibility.
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
Available Tools
14 toolscompare_enginesB
Compare providers side by side for the same query.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query | |
| providers | No | Providers to compare. Empty = all enabled. | |
| num_results | No | Number of results per provider. | |
| max_total_results | No | Cap the final merged result set returned to the agent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden, but it is minimal. It doesn't disclose that this likely performs multiple searches, how it handles provider failures, or that it returns a merged result set. The 'max_total_results' parameter hints at merging but not explicitly in the description.
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 a single concise sentence that front-loads the core purpose. No fluff, but lacks detail that could be added without verbosity.
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 the tool is likely complex (comparison, multiple providers, merging results) and has no output schema or annotations, the description is thin. It doesn't explain the return shape, how to select providers, or what happens with zero providers. The complexity warrants more detail.
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%, so the schema already documents all parameters clearly. The description adds no additional semantic value beyond what the schema provides, such as examples or the meaning of comparing providers. Baseline 3 is appropriate.
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 states a clear verb ('compare') and resource ('providers'), and specifies the action ('side by side for the same query'). It distinguishes from sibling search tools by focusing on comparison rather than a single search, though it doesn't explicitly name alternatives.
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 usage when comparing providers for a query, but does not explicitly state when to use this tool versus just using a single search tool like search_web or when not to use it. The parameter descriptions add some context ('Empty = all enabled') but not explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_providersA
List all available search providers with their names, descriptions, and tags. Use this to discover what search backends are available before issuing queries.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Optional tag to filter providers (e.g. 'web', 'academic', 'code', 'finance', 'news', 'social'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It clearly indicates a read-only listing action and specifies the output content, and the phrase 'before issuing queries' signals that this tool does not perform searches. It does not discuss auth, rate limits, or empty-result behavior, but those are minor for this simple list operation.
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 the core action front-loaded and no filler. Every clause contributes either the action, the returned fields, or the recommended usage context.
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?
For a tool with one optional parameter and no output schema, the description is complete: it names the resource, the returned fields, and the intended use phase. The only potential additions, such as pagination or error behavior, are low-value for this simple discovery call.
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?
The input schema already documents the optional 'tag' parameter with examples at 100% coverage, so the baseline is 3. The description mentions tags as a returned field but adds no new semantic detail about the parameter beyond the 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 uses the specific verb 'List' with the resource 'all available search providers' and enumerates the returned fields (names, descriptions, tags). It is immediately distinguishable from the sibling search_* tools, which execute queries, and from compare_engines/provider_health. The final clause reinforces the discovery purpose.
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?
It explicitly says to use it 'before issuing queries' to discover available search backends, giving a clear temporal/conditional context. It does not name alternatives or state when not to use it, but the guidance is sufficient for a simple discovery tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
provider_healthA
Report availability/health of search providers. For each provider, returns whether it is enabled and configured to run (e.g. missing API keys make a provider unavailable). Optionally filter by tag.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Optional tag to filter providers (e.g. 'web', 'academic', 'code', 'finance', 'news', 'social'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It clearly explains that the tool reports enabled/configured status and gives a concrete example (missing API keys make a provider unavailable). It does not describe the output structure, but it narrows the meaning of 'health' to configuration readiness.
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 convey the tool's purpose, behavior, an example, and the optional filter without unnecessary detail. The core behavior is front-loaded.
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?
For a tool with one optional parameter and no annotations, the description covers what it does, what it returns conceptually, and an example failure condition. It doesn't spell out the exact return payload, but the level of detail is sufficient for an agent to invoke it correctly.
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 description coverage is 100%, so the schema fully documents the optional tag parameter. The description only restates 'Optionally filter by tag' and adds no new details beyond the schema examples.
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 uses a specific verb ('Report') and resource ('availability/health of search providers'), and clarifies that it returns whether each provider is enabled and configured. This clearly distinguishes it from sibling tools like list_providers, which likely only enumerate providers.
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 when to use this tool—when you need provider availability/health status—and notes the optional tag filter. However, it does not explicitly contrast this with list_providers or compare_engines, nor does it state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_academicC
Search academic and reference sources for research workflows.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query | |
| num_results | No | Number of results per provider. | |
| max_total_results | No | Cap the final merged result set returned to the agent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It fails to mention that the tool aggregates results from multiple providers, as indicated by the num_results description ('per provider') and the max_total_results cap. This is important for an agent to understand the merging behavior, yet the description omits it.
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 a single short sentence, which is concise but lacks critical detail about aggregation and usage. It could include a brief phrase about multiple providers and the result-cap behavior without becoming verbose. As is, it is under-specified, not efficiently structured.
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 the tool's complexity (multi-provider aggregation) and absence of annotations/output schema, the description should explain the merging behavior, the role of num_results and max_total_results, and guidance on when to use it. It fails to do so, leaving agents to infer critical behavior. Incomplete for a search tool with these parameters.
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%, so all three parameters are documented in the schema. The description adds the term 'reference sources' which implies academic scope but doesn't add meaning beyond that. Since the schema fully covers definitions, baseline 3 is appropriate.
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?
Description states it searches academic and reference sources for research workflows, which is clear for academic context but doesn't differentiate from other search tools like search_web, search_google, or search_github. It lacks the specificity of listing the kinds of sources or the aggregation behavior that would distinguish it from the siblings.
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 research workflows but gives no explicit guidance on when to choose it over search_web or search_google, nor when to avoid it. No exclusions or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_bioA
Search biomedical and life-science databases: proteins (UniProt), clinical trials (ClinicalTrials.gov), and literature (PubMed, Europe PMC).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query | |
| num_results | No | Number of results per provider. | |
| max_total_results | No | Cap the final merged result set returned to the agent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure, but it only states what databases are searched. It does not mention that the query is sent to multiple providers, how results are merged, duplicate handling, rate limits, or failure behavior. The parameter descriptions hint at merging ('merged result set'), but the tool description itself adds almost no behavioral context.
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 a single, front-loaded sentence with no filler. It names the action, the domain, and the specific databases in an efficient enumeration, making it easy to scan and understand.
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 the tool's scope well and the schema documents all parameters, but there is no output schema and no mention of the result format or merged-result behavior in the description itself. For a multi-provider search tool, an agent would benefit from knowing that results are aggregated and how to interpret the response, so the definition is adequate but not complete.
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 description coverage is 100%, so the baseline is 3. The description does not add parameter-specific semantics beyond indicating the domain; it does not clarify query syntax, how num_results applies per provider, or what max_total_results means. This is acceptable because the schema already documents each parameter clearly.
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 opens with a specific verb ('Search') and a clearly bounded resource ('biomedical and life-science databases'), then enumerates the exact sources: UniProt, ClinicalTrials.gov, PubMed, and Europe PMC. This distinguishes it from sibling tools like search_academic and search_web, which are broader or cover different domains.
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 domain scope is explicit, so an agent can infer that biomedical, protein, clinical-trial, or life-science literature queries should route here rather than to generic search_web or search_academic. However, it does not explicitly name alternatives or state when not to use this tool, so it stops short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_codeA
Search code repositories, packages, and developer resources across GitHub, GitLab, npm, PyPI, crates.io, pkg.go.dev, MetaCPAN, lib.rs, Maven Central, RubyGems, Docker Hub, Stack Overflow, and Hacker News.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query | |
| num_results | No | Number of results per provider. | |
| max_total_results | No | Cap the final merged result set returned to the agent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only lists sources and gives no information about result merging, per-provider behavior, rate limits, latency, failure modes, or the structure of returned results. It is not misleading but provides almost no behavioral guidance.
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 a single front-loaded sentence with no filler. Every element, including the provider list, contributes to defining the tool's scope and differentiating it from siblings.
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?
This is a complex multi-provider search tool with no annotations and no output schema. The description only states the search scope and does not explain what results look like, how the merged result set behaves, or how the cap and per-provider limits affect the agent. It is incomplete for safe and effective invocation.
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 description coverage is 100%, and the parameter descriptions already explain query, num_results, and max_total_results. The tool description adds nothing beyond the schema, so the baseline of 3 is appropriate.
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 states a specific verb ('Search') with a clear resource scope: code repositories, packages, and developer resources. It further differentiates itself from siblings like search_github or search_web by listing a broad set of code/package-focused providers.
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 provides clear context by naming the exact domains it covers (code, packages, developer resources) and the providers it aggregates. It does not explicitly state exclusions or name alternatives, but the scope is specific enough for an agent to infer when this tool fits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_financeA
Search stock tickers, company names, and financial instruments across finance providers (Yahoo Finance, Alpha Vantage, Finnhub, SEC EDGAR filings).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Ticker symbol or company name, e.g. 'AAPL' or 'Tesla' | |
| num_results | No | Number of results per provider. | |
| max_total_results | No | Cap the final merged result set returned to the agent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It does reveal that the tool searches 'across' multiple named providers, which is useful, but it does not explain result merging, duplicate handling, latency, rate limits, or how provider failures are handled.
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 a single focused sentence with no filler. It front-loads the search target and then lists the relevant providers, making it efficient and easy to scan.
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 and schema together define the search scope and result-count limits well. However, there is no output schema or annotation to clarify the structure of merged multi-provider results, empty-result behavior, or error handling, leaving some gaps for an agent.
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%, so query, num_results, and max_total_results are already well documented. The description adds only minor context by mentioning financial instruments in addition to tickers and company names, but it does not materially enhance the parameter semantics.
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 uses a specific verb, 'Search', and clearly names the resource: 'stock tickers, company names, and financial instruments'. It also names finance providers, which distinguishes this tool from generic sibling search tools like search_web, search_news, and search_google.
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 finance-specific scope implies when to use this tool, but the description gives no explicit guidance about when not to use it or which alternative search tool to choose for non-financial queries. The usage context is present but only by implication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_githubC
Search GitHub repositories with structured metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query | |
| num_results | No | Number of results per provider. | |
| max_total_results | No | Cap the final merged result set returned to the agent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It only says the search returns 'structured metadata,' without explaining result shape, pagination, rate limits, authentication needs, or whether any side effects occur. This is a typical read operation, but the description doesn't confirm its safety or 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 a single compact sentence that front-loads the core action and resource. It is appropriately brief, though 'structured metadata' is vague and could be replaced with more useful detail without harming conciseness.
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?
With no output schema and no annotations, the description should explain the return format and calling context, but it doesn't. It also fails to address the multi-provider architecture hinted at by sibling tools and parameters like 'per provider,' leaving important operational details unexplained.
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 description coverage is 100%, with each parameter individually described, so the schema already documents semantics. The description's 'structured metadata' phrase adds no parameter-specific meaning beyond what num_results/max_total_results already convey, so the baseline 3 applies.
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 'Search GitHub repositories' clearly names the action and resource, and the GitHub/repositories scope distinguishes it from sibling tools like search_code and search_web. It falls short of 5 because it doesn't explicitly contrast it with those siblings or clarify what 'structured metadata' means.
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 gives no explicit guidance on when to use this tool versus alternatives. It implies GitHub-scoped repository search by naming GitHub, but it doesn't state conditions, exclusions, or preferred alternatives, so agents are left to infer applicability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_googleC
Search Google through configured hosted providers.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query | |
| provider | No | ||
| num_results | No | Number of results per provider. | |
| safe_search | No | Enable safe search filtering. | |
| max_total_results | No | Cap the final merged result set returned to the agent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral disclosure burden. It only says the tool searches through hosted providers; it does not disclose provider fallback behavior, merging semantics, rate limits, or failure modes despite having a provider enum and max_total_results parameter.
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 a single front-loaded sentence with no filler or repetition. However, 'configured hosted providers' is somewhat jargon-heavy and could be clearer without adding length.
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?
With no output schema and no annotations, the description should explain what the agent receives, how providers affect results, and when this tool is appropriate. It does none of that, and the large sibling list makes the missing routing guidance more consequential.
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 description coverage is 80%, and parameters like num_results, safe_search, and max_total_results already have meaningful schema descriptions. The description adds only the 'configured hosted providers' context, which is not parameter-specific; this is a baseline-3 situation where the schema does most of the work.
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 names a specific verb ('Search'), resource ('Google'), and mechanism ('configured hosted providers'), making the basic function clear. It does not explicitly distinguish this from sibling tools like search_web or search_google, so it loses the top score.
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 given on when to use search_google versus siblings such as search_web, search_news, or list_providers. The phrase 'configured hosted providers' hints at prerequisites but does not explain setup or selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_imagesB
Search images across image providers (Openverse, Wikimedia Commons, Flickr, Unsplash, NASA Image Library).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query | |
| num_results | No | Number of results per provider. | |
| max_total_results | No | Cap the final merged result set returned to the agent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It does not mention that results are merged from multiple providers, whether per-provider limits apply, what the return shape looks like, or any rate-limit/auth considerations. The provider list adds some context but leaves major behavior unspecified.
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 a single, front-loaded sentence with no filler. Every word contributes to identifying the tool's purpose and scope.
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 tool has no output schema, yet the description does not explain what the agent will receive back (e.g., URLs, metadata, licensing). It also omits the aggregation behavior implied by the parameters. For a search tool with multiple providers and no annotations, more behavioral and output context is needed.
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%, so the parameters are already documented well. The description adds provider context but does not clarify how query, num_results, or max_total_results interact beyond what the schema states, which matches the baseline.
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 the verb 'Search' and the resource 'images', then enumerates the specific providers involved. This immediately distinguishes it from sibling tools like search_videos and search_web.
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 gives no guidance on when to prefer this tool over search_videos, search_google, or other siblings. It only implies image-specific use through the name and provider list, but does not state exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_newsA
Search recent news headlines and articles across news providers (Google News, Hacker News, Lobsters, Lemmy, Reddit).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query | |
| num_results | No | Number of results per provider. | |
| max_total_results | No | Cap the final merged result set returned to the agent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description is the only source of behavioral information. It accurately conveys a read-only search operation and the source scope, but it does not describe the result format, ordering, pagination, or potential rate limits. For a non-mutating search tool this is a moderate transparency gap.
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 a single sentence with no redundant words; the action, object, and provider list are front-loaded. It is appropriately sized for the tool's simplicity.
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 the simple schema and the fact that the description names the providers and result type, an agent has enough context to invoke the tool correctly. It could be improved by noting the merged/capped nature of results and the absence of an output schema, but these are not fatal gaps.
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?
The schema already documents all three parameters with descriptions, including num_results as 'per provider' and max_total_results as a cap on the merged result set. The description adds no additional parameter semantics beyond the schema, so it meets the baseline but does not exceed it.
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 uses a specific verb ('Search') and a clear resource ('recent news headlines and articles'), and it enumerates the exact providers (Google News, Hacker News, Lobsters, Lemmy, Reddit). This makes the tool's purpose unmistakable and distinct from general web or social search.
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 gives an implicit usage context: use when the agent needs recent news from the listed providers. However, it does not explicitly contrast with sibling tools like search_web or search_google, nor state when not to use it, so routing guidance is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_socialB
Search social media posts and community discussions across Bluesky, Mastodon, Lemmy, and Lobsters.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query | |
| num_results | No | Number of results per provider. | |
| max_total_results | No | Cap the final merged result set returned to the agent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden of behavioral disclosure. The description only says it searches 'across' multiple providers, but does not disclose that results are aggregated/merged from multiple sources, how provider failures are handled, whether results are deduplicated, or any rate limits or authentication requirements. The behavior around num_results per provider vs. max_total_results is also not clarified.
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 a single, front-loaded sentence with no filler. It efficiently communicates the tool's core function and scope, and every word contributes to purpose clarity.
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 the tool's multi-provider aggregation complexitycasting, the absence of annotations, and lack of an output schema, the description is insufficiently complete. It omits critical operational context such as result merging behavior, why there are two limit parameters, error handling across providers, and what the returned data structure looks like. An agent would likely need additional probing to invoke it correctly in complex scenarios.
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 description coverage is 100%, so the baseline is 3. The description does not add meaningful parameter-level information beyond the schema; it mentions the platforms but not query syntax, result formatting, or how the two result-limit parameters interact. Thus it neither improves nor harms parameter understanding.
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 states a specific verb ('Search') and resource ('social media posts and community discussions'), and explicitly names the platforms covered (Bluesky, Mastodon, Lemmy, Lobsters). This clearly distinguishes it from siblings like search_web, search_news, and search_images, which target different content types.
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 when to use the tool (when searching social media or community discussions) but provides no explicit guidance on when not to use it or which sibling alternatives to prefer. It does not mention overlapping tools like search_news or search_web, leaving the selection decision to the agent's inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_videosB
Search videos and streaming media across PeerTube instances.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query | |
| num_results | No | Number of results per provider. | |
| max_total_results | No | Cap the final merged result set returned to the agent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It states cross-instance searching but does not disclose whether the operation is read-only, how results are merged or capped, whether any provider-side limits apply, or what failure modes exist. The schema hints at per-provider and merged-result behavior, but the description itself does not surface these traits.
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 a single clear, front-loaded sentence with no filler or redundancy. It is efficient, though slightly under-specified given the tool's federated-search complexity and lack of annotations.
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?
There is no output schema and no annotations, yet the description does not explain the return shape, aggregation behavior, or relationship to sibling provider tools such as list_providers or provider_health. For a multi-instance federated search, an agent needs more context about scope, providers, and result merging to invoke it confidently.
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 description coverage is 100%, so the baseline is 3. The schema already documents query, num_results per provider, and max_total_results cap. The description adds no additional parameter semantics on top of what the schema provides.
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 uses a specific verb and resource: 'Search videos and streaming media across PeerTube instances.' The explicit PeerTube scope clearly differentiates this from generic siblings like search_web and search_google, making the intended domain unambiguous.
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?
There is no guidance about when to choose this tool over its many siblings, nor any mention of exclusions or alternatives. The agent is left to infer that this is for video/media queries, with no stated boundary between this and other search tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_webB
Aggregate structured web search results from all enabled providers.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Optional provider tags used to narrow the provider set. | |
| query | Yes | Search query | |
| country | No | us | |
| language | No | en | |
| providers | No | Explicit provider list; empty = all enabled. | |
| tag_match | No | Match providers with any requested tag or require all tags. | any |
| num_results | No | Number of results per provider. | |
| safe_search | No | Enable safe search filtering. | |
| max_total_results | No | Cap the final merged result set returned to the agent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility. It only states that results are aggregated, but does not disclose how results are merged/deduplicated, whether providers are queried concurrently, rate limits, caching, or any side effects. For a read-only search tool, this is a significant gap given the lack of annotation coverage.
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 a single, efficient sentence with zero waste. It front-loads the core function and provider scope, making it immediately scannable. There is no redundant 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?
Given 9 parameters, a large sibling set, and no output schema, a one-sentence description is insufficient. It omits return format, merging behavior, provider selection semantics, and any nuances about safe_search or num_results. The agent is left to infer many operational details from parameter names alone.
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 description coverage is 78%, so the baseline is 3. The description adds no extra meaning about parameters like tags, providers, tag_match, or max_total_results; it merely restates the aggregate concept. The schema already explains most parameters adequately, but the description does not enhance understanding of how they interact (e.g., tags vs. providers precedence).
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 states a specific verb ('Aggregate') and resource ('structured web search results') and clarifies it draws from 'all enabled providers', which distinguishes it from sibling search_* tools that target specific sources (e.g., search_google, search_images). The purpose is immediately clear.
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 given on when to use this tool versus the many search_* siblings. It does not mention alternatives, nor does it explain that this is a meta-search aggregator meant for broad queries while specialized tools exist for specific content types. The agent must infer usage from the name and schema.
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.
14 tool updates
v0.1.0- First observed
compare_engines - First observed
list_providers - First observed
provider_health - First observed
search_academic - First observed
search_bio - First observed
search_code - First observed
search_finance - First observed
search_github - First observed
search_google - First observed
search_images - First observed
search_news - First observed
search_social - First observed
search_videos - First observed
search_web
TDQS
Scored across 14 tools
Most search_* tools are clearly separated by domain, but search_google overlaps with search_web, search_github is a subset of search_code, and sources like Hacker News appear across search_code, search_news, and search_social. These overlapping boundaries could cause an agent to pick the wrong tool when a topic spans categories.
The naming is predominantly a consistent search_<domain> pattern in snake_case, with list_providers and compare_engines following a verb_noun pattern. provider_health breaks the pattern as a noun_noun name, but overall conventions are predictable.
Fourteen tools is well-scoped for a meta-search server: eleven domain-specific search tools plus provider discovery, health checking, and comparison. Each tool covers a distinct area without excessive fragmentation.
The surface covers the full lifecycle of a meta-search workflow: discovering providers, checking their health, running domain-specific searches, doing broad web searches, and comparing engines side by side. No major dead ends or obvious missing operations for this domain.
Maintenance
Related MCP Connectors
Search GitHub, npm, PyPI, StackOverflow, ArXiv from one MCP — built for coding agents.
Multi-engine search for AI agents. Trust scoring, local corpus, MCP-native. Self-hostable, BYOK.
Your agent needs the open web — searched by more than one engine, and read as clean markdown rather than raw HTML. **What you can ask for** • "Search this question with two providers and tell me where they disagree." • "Scrape these 40 URLs into markdown, in one batch." • "Crawl this documentation site and give me every page." • "Do deep research on this topic and cite the sources." • "Find the academic papers behind this claim." **How to use it** Point any MCP client at https://mcp.aisa.one/search/mcp and sign in with OAuth — there is no key to create or paste. 30 tools across several independent providers: Tavily and Exa search, answers, contents and agent runs; Firecrawl scrape, batch scrape, crawl, map and search; Perplexity Sonar, Sonar Pro, reasoning and deep research; Oxylabs AI search and LLM jobs; OpenAI and Anthropic web search; and scholarly search. **Why this rather than the source** Several independent indexes behind one account, because one engine's blind spot is not visible from inside it. **It is also a door to the rest** The same login reaches 26 sources and 580+ operations. Find the page here, then ask the same agent who links to it or how much traffic it gets — without adding a second server. **What it costs** Finding and inspecting an operation is free. Running one is billed per call at API prices, with no seat and no monthly minimum, and every call takes max_price_usd so an agent cannot overspend by accident. **Where else it reaches** https://mcp.aisa.one/seo-serp/mcp for the Google results page itself, https://mcp.aisa.one/seo-serp-other-engines/mcp for Bing, Baidu and Naver.
Scrape, crawl and search the web for AI agents via MCP.
Related MCP Servers
- AlicenseAqualityNot gradedmaintenanceA metasearch backend MCP server that aggregates results from multiple search engines and knowledge sources into structured JSON for AI agents. It provides unified search capabilities across web, academic, developer, and knowledge providers through MCP tools.515MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server that aggregates web search results from multiple engines and optionally renders pages to Markdown, providing a unified search interface.7 npm3ISC
- AlicenseNot gradedqualityBmaintenanceA zero-config web search and fetch MCP server for LLM agents, featuring multi-backend metasearch, persistent rolling cache, and structured error envelopes for retry-friendly interactions.MIT
- AlicenseAqualityAmaintenanceFree, open-source web search gateway and MCP server for LLMs, AI agents, and RAG. It provides no-key web, code, academic, and community search with deduplication, ranking fusion, and citation-ready results.32MIT