Skip to main content
Glama

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, and google

  • Final 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

ALLOW_UNSTABLE_PROVIDERS=true

Primary path; HTML scraping, best effort, may be blocked from datacenter IPs

serpbase.dev

SERPBASE_API_KEY

Pay-per-use; typically cheaper for low-volume usage

serper.dev

SERPER_API_KEY

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

Google

Provider

Name

Method

Direct Google

google

HTML scraping with browser-like request handling

SerpBase

google_serpbase

Hosted Google SERP API

Serper

google_serper

Hosted Google SERP API

Provider

Name

Method

DuckDuckGo

duckduckgo

HTML scraping

Bing

bing

RSS feed

Yahoo

yahoo

HTML scraping, best effort

Brave

brave

Official Search API

You.com

youcom

Official Search API

Mwmbl

mwmbl

Public JSON API

Marginalia

marginalia

Public JSON API, no key required

Ecosia

ecosia

HTML scraping

Mojeek

mojeek

HTML scraping

Startpage

startpage

HTML scraping, best effort

Qwant

qwant

Internal JSON API, best effort

Yandex

yandex

HTML scraping, best effort

Baidu

baidu

JSON endpoint, best effort

Seznam

seznam

HTML scraping (Czech web), no key required

Naver

naver

HTML scraping (Korean web), no key required

Ahmia

ahmia

HTML scraping (Tor .onion services), no key required

Knowledge And Reference

Provider

Name

Method

Wikipedia

wikipedia

MediaWiki API

Wikidata

wikidata

Wikidata API

Wikiquote

wikiquote

MediaWiki API

Wikisource

wikisource

MediaWiki API, no key required

Wikibooks

wikibooks

MediaWiki API, no key required

Wiktionary

wiktionary

MediaWiki API, no key required

Wikivoyage

wikivoyage

MediaWiki API, no key required

Wikiversity

wikiversity

MediaWiki API, no key required

Wikispecies

wikispecies

MediaWiki API, no key required

Internet Archive

internet_archive

Advanced Search API

Open Library

openlibrary

Open Library search API

Datamuse

datamuse

Word-association/thesaurus REST API, no key required

Jisho

jisho

Japanese-English dictionary API (JMDict/JMNedict lookups with readings and JLPT level), no key required

Tatoeba

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

urbandictionary

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

nobel

Official Nobel Prize API v2 (awards by year/category), no key required

OEIS

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

openmeteo

Geocoding REST API, no key required

OpenStreetMap (Nominatim)

nominatim

Nominatim public API, no key required

Nager.Date

nager

Public-holiday calendar REST API (public holidays by country), no key required

Nature And Biodiversity

Provider

Name

Method

iNaturalist

inaturalist

Observations REST API, no key required

GBIF

gbif

GBIF species backbone REST API, no key required

Developer Sources

Provider

Name

Method

GitHub

github

GitHub REST API

GitLab

gitlab

GitLab REST API

Codeberg

codeberg

Codeberg REST API

Stack Overflow

stackoverflow

Stack Exchange API

Sourcegraph

sourcegraph

Streaming search API, no key required

Hacker News

hackernews

Algolia HN API

Hugging Face

huggingface

Hub REST API, no key required

Reddit

reddit

Reddit API

npm

npm

npm registry API

PyPI

pypi

JSON API

RubyGems

rubygems

RubyGems search API

crates.io

crates

crates.io API

lib.rs

lib_rs

HTML scraping

Docker Hub

dockerhub

Docker Hub search API

Artifact Hub

artifacthub

Artifact Hub packages search API (Helm charts, operators, policies, container images), no key required

Flathub

flathub

Flathub API v2 search (Linux desktop apps), no key required

Snapcraft

snapcraft

Snap Store v2 snaps/find API (Linux snaps), no key required

MacPorts

macports

MacPorts ports REST API (macOS/Darwin packages: version, license, platforms, categories, maintainers, build variants and dependencies), no key required

JetBrains Marketplace

jetbrains

JetBrains searchPlugins API (IDE plugins), no key required

Open VSX

open_vsx

Open VSX search API (VS Code-compatible extensions), no key required

Mozilla Add-ons (AMO)

amo

AMO API v5 (Firefox browser extensions), no key required

WordPress.org Plugins

wordpress_plugins

WordPress.org Plugins API (WP plugins), no key required

WordPress.org Themes

wordpress_themes

WordPress.org Themes API (WP themes), no key required

GNOME Extensions

gnome_extensions

extensions.gnome.org extension-query API (GNOME Shell extensions), no key required

VS Code Marketplace

vscode_marketplace

Public gallery extensionquery API (VS Code extensions), no key required

pkg.go.dev

pkg_go_dev

HTML scraping

MetaCPAN

metacpan

MetaCPAN REST API

Maven Central

maven

Solr search API, no key required

NuGet

nuget

NuGet.org v3 search query API, no key required

Packagist

packagist

Packagist search.json API (PHP/Composer), no key required

Hex

hex

Hex.pm packages API (Elixir/Erlang), no key required

pub.dev

pubdev

pub.dev JSON API (Dart/Flutter), no key required

Hackage

hackage

Hackage packages API (Haskell/Cabal), no key required

R (CRAN / r-universe)

runiverse

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

Anaconda.org search API (conda packages), no key required

AUR

aur

Arch Linux AUR RPC API (community packages), no key required

Chocolatey

chocolatey

Chocolatey community OData search feed (Windows packages), no key required

Terraform Registry

terraform

Terraform Registry search API (reusable modules + providers for AWS, Azure, GCP, Kubernetes, ...), no key required

IETF Datatracker

ietf

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

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

arxiv

Atom API

PubMed

pubmed

NCBI E-utilities

Semantic Scholar

semanticscholar

Graph API

CrossRef

crossref

REST API

OpenAlex

openalex

OpenAlex REST API, no key required

INSPIRE-HEP

inspirehep

INSPIRE-HEP literature API (high-energy physics papers, preprints, citations), no key required

OpenAIRE

openaire

OpenAIRE Graph search API (300M+ open research records from repositories & aggregators), no key required

HAL Open Science

hal

HAL search API (French national open-access repository: articles, preprints, theses, book chapters), no key required

DOAJ

doaj

DOAJ public REST API, no key required

DOAB

doab

DOAB public REST API (peer-reviewed open-access books and monographs), no key required

Europe PMC

europepmc

Europe PMC REST API (PubMed + preprints), no key required

ClinicalTrials.gov

clinicaltrials

ClinicalTrials.gov v2 API (clinical studies), no key required

DataCite

datacite

DataCite DOI search API, no key required

Figshare

figshare

Figshare public articles API (research data, datasets), no key required

Zenodo

zenodo

Zenodo REST API, no key required

Dryad

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

Harvard Dataverse search API (research datasets: description, authors, DOI, publication date, publisher dataverse, subjects, file count and version), no key required

OSF Preprints

osf_preprints

OSF API v2 (PsyArXiv, SocArXiv, etc.), no key required

ORCID

orcid

ORCID public API (researcher profiles), no key required

ROR

ror

Research Organization Registry API (universities, institutes, labs), no key required

UniProt

uniprot

UniProt REST API (protein knowledgebase), no key required

MyGene.info

mygene

BioThings MyGene.info gene annotation API (gene symbols, names, organism, chromosome, aliases), no key required

RCSB PDB

rcsb_pdb

RCSB Protein Data Bank search + GraphQL data API (3D structures: title, method, resolution, citation), no key required

EBI Ontology Lookup Service

ols

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 GO:0006915, definitions, synonyms and the ontology each term belongs to, no key required

ChEMBL

chembl

ChEMBL REST API (drugs, molecular formula/SMILES/ATC), no key required

PubChem

pubchem

PubChem PUG REST API (compound names/synonyms, molecular formula, molecular weight, canonical SMILES, IUPAC name, InChIKey), no key required

RxNorm

rxnorm

NLM RxNorm REST API (clinical drug terminology), no key required

Google Books

google_books

Google Books API, no key required

Project Gutenberg

gutendex

Gutendex API (public-domain ebooks), no key required

DBLP

dblp

DBLP bibliography API (computer-science publications), no key required

OpenReview

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

zbMATH Open REST API (mathematical literature: Zbl number, authors, venue, MSC classification, reviews), no key required

openFDA

openfda

openFDA drug approvals API, no key required

NIH RePORTER

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

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

jstage

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

Provider

Name

Method

CourtListener

courtlistener

Free Law Project REST API, no key required

Federal Register

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_nonprofits

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

google_patents

Public XHR query API, no key required

Open Data Portals

Provider

Name

Method

European Open Data Portal

eu_open_data

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

worldbank_documents

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

google_news

Public RSS feed, no key required

GDELT

gdelt

Public DOC 2.0 API, no key required

Bing News

bing_news

Public RSS feed, no key required

Wikinews

wikinews

MediaWiki API, no key required

Spaceflight News

spaceflight_news

Spaceflight News API, no key required

Lobsters

lobsters

Lobste.rs JSON API, no key required

Social Sources

Provider

Name

Method

Mastodon

mastodon

Mastodon public API, no key required

Bluesky

bluesky

Bluesky AppView public API, no key required

Lemmy

lemmy

Lemmy public API, no key required

Media Sources

Provider

Name

Method

Wikimedia Commons

wikimedia_commons

MediaWiki API, no key required

Openverse

openverse

Openverse REST API, no key required

Iconify

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

flickr

Public feed API, no key required

Unsplash

unsplash

Unsplash REST API (requires UNSPLASH_ACCESS_KEY)

Wallhaven

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

NASA Image and Video Library API, no key required

Met Museum

metmuseum

Met Museum public collection API, no key required

Art Institute of Chicago

artic

AIC public collection API, no key required

Cleveland Museum of Art

clevelandart

CMA open-access API, no key required

Victoria and Albert Museum

vam

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

peertube

Public REST API, no key required

Dailymotion

dailymotion

Public REST API, no key required

TVMaze

tvmaze

TVMaze public API, no key required

Library of Congress

loc_gov

loc.gov public JSON API, no key required

Radio Browser

radio_browser

Radio Browser public API, no key required

MusicBrainz

musicbrainz

MusicBrainz public API (recordings/artists), no key required

Discogs

discogs

Discogs database search API, no key required

Deezer

deezer

Deezer public search API (streaming-catalog tracks with previews), no key required

Kitsu

kitsu

Kitsu anime & manga catalog API (JSON:API), no key required

AniList

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

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

Steam Store search API, no key required

Scryfall

scryfall

Scryfall Magic: The Gathering card search API (names, rules text, sets, prices), no key required

TheMealDB

themealdb

TheMealDB public API, no key required

TheCocktailDB

cocktaildb

TheCocktailDB public API, no key required

Open Food Facts

openfoodfacts

Open Food Facts public search API, no key required

TheSportsDB

thesportsdb

TheSportsDB public API (teams & players), no key required

RemoteOK

remoteok

RemoteOK public jobs API (remote developer jobs), no key required

Remotive

remotive

Remotive public jobs API (keyword-searchable remote jobs), no key required

iTunes

itunes

iTunes Search API (podcasts), no key required

Space Sources

Provider

Name

Method

Launch Library 2

spacelaunch

The Space Devs launch database API (historical & upcoming launches), no key required

NASA Exoplanet Archive

exoplanet

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

yahoo_finance

No

Unofficial endpoint, no key needed

Alpha Vantage

alpha_vantage

ALPHA_VANTAGE_API_KEY

25 req/day — get key

Finnhub

finnhub

FINNHUB_API_KEY

60 req/min — get key

CoinGecko

coingecko

No

Cryptocurrency search API, no key needed

NVD

nvd

No

NIST NVD CVE vulnerability search API, no key needed

CISA KEV

cisa_kev

No

CISA Known Exploited Vulnerabilities catalog (CVEs exploited in the wild), no key needed

Frankfurter

frankfurter

No

ECB daily FX reference rates, no key needed

SEC EDGAR

sec_edgar

No

SEC full-text + company filings API (unstable flag), no key needed

GLEIF

gleif

No

Global Legal Entity Identifier registry (company legal names, jurisdiction, status), no key needed

Deals And Shopping

Provider

Name

Method

CheapShark

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.py

Install, run tests, and start the HTTP API:

python scripts/install.py --dev --test --run

Deploy with Docker Compose:

python scripts/install.py --mode docker

The 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 .env

Key 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=10

To 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
metasearchmcp

The API starts on http://localhost:8000.

MCP Server

python -m metasearchmcp.broker
# or
metasearchmcp-mcp

The MCP server communicates over stdio.

Docker

docker build -t metasearchmcp .
docker run --rm -p 8000:8000 --env-file .env metasearchmcp

Or with Compose:

docker compose up --build

HTTP 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:

  • engine

  • query

  • results

  • related_searches

  • suggestions

  • answer_box

  • timing_ms

  • providers

  • errors

Every result item includes:

  • title

  • url

  • snippet

  • source

  • rank

  • provider

  • published_date

  • extra

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_web

  • search_google

  • search_academic

  • search_github

  • compare_engines

  • search_finance

  • search_code

  • search_news

  • search_social

  • search_images

  • search_videos

  • search_bio

  • list_providers

  • provider_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 --reload

Architecture

The public package is organized around these modules:

  • contracts.py: request/response data models (Pydantic schemas)

  • config.py: application settings loaded from environment variables

  • catalog.py: provider discovery, filtering, and selection by name or tags

  • orchestrator.py: concurrent search execution across providers and result assembly

  • merge.py: URL canonicalization and cross-engine result deduplication

  • ranking.py: optional consensus/relevance result re-ranking (opt-in via RANK_RESULTS)

  • server.py: FastAPI application and Uvicorn server entrypoint

  • broker.py: MCP server exposing search tools over stdio

  • api/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 tools
compare_enginesB

Compare providers side by side for the same query.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch query
providersNoProviders to compare. Empty = all enabled.
num_resultsNoNumber of results per provider.
max_total_resultsNoCap the final merged result set returned to the agent.

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoOptional tag to filter providers (e.g. 'web', 'academic', 'code', 'finance', 'news', 'social').

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoOptional tag to filter providers (e.g. 'web', 'academic', 'code', 'finance', 'news', 'social').

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch query
num_resultsNoNumber of results per provider.
max_total_resultsNoCap the final merged result set returned to the agent.

TDQS

C2.5/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch query
num_resultsNoNumber of results per provider.
max_total_resultsNoCap the final merged result set returned to the agent.

TDQS

A3.7/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch query
num_resultsNoNumber of results per provider.
max_total_resultsNoCap the final merged result set returned to the agent.

TDQS

A3.6/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesTicker symbol or company name, e.g. 'AAPL' or 'Tesla'
num_resultsNoNumber of results per provider.
max_total_resultsNoCap the final merged result set returned to the agent.

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch query
num_resultsNoNumber of results per provider.
max_total_resultsNoCap the final merged result set returned to the agent.

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch query
providerNo
num_resultsNoNumber of results per provider.
safe_searchNoEnable safe search filtering.
max_total_resultsNoCap the final merged result set returned to the agent.

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch query
num_resultsNoNumber of results per provider.
max_total_resultsNoCap the final merged result set returned to the agent.

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch query
num_resultsNoNumber of results per provider.
max_total_resultsNoCap the final merged result set returned to the agent.

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch query
num_resultsNoNumber of results per provider.
max_total_resultsNoCap the final merged result set returned to the agent.

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch query
num_resultsNoNumber of results per provider.
max_total_resultsNoCap the final merged result set returned to the agent.

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoOptional provider tags used to narrow the provider set.
queryYesSearch query
countryNous
languageNoen
providersNoExplicit provider list; empty = all enabled.
tag_matchNoMatch providers with any requested tag or require all tags.any
num_resultsNoNumber of results per provider.
safe_searchNoEnable safe search filtering.
max_total_resultsNoCap the final merged result set returned to the agent.

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

  1. 14 tool updatesv0.1.0
    • First observedcompare_engines
    • First observedlist_providers
    • First observedprovider_health
    • First observedsearch_academic
    • First observedsearch_bio
    • First observedsearch_code
    • First observedsearch_finance
    • First observedsearch_github
    • First observedsearch_google
    • First observedsearch_images
    • First observedsearch_news
    • First observedsearch_social
    • First observedsearch_videos
    • First observedsearch_web

TDQS

B3.4/5.0

Scored across 14 tools

Disambiguation3/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityActive
ResponsivenessWithin a week

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

  • A
    license
    A
    quality
    Not graded
    maintenance
    A 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.
    5
    15
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that aggregates web search results from multiple engines and optionally renders pages to Markdown, providing a unified search interface.
    7 npm
    3
    ISC
  • A
    license
    Not graded
    quality
    B
    maintenance
    A 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
  • A
    license
    A
    quality
    A
    maintenance
    Free, 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.
    3
    2
    MIT