MCP server.
Web search and page fetch as two tools for any agent that speaks MCP, on your metasearch.sh key and balance.
The server lives at https://metasearch.sh/mcp. It speaks streamable HTTP, stateless, on protocol 2026-07-28 and the 2025 revisions before it, and every request carries your API key as a bearer token. Tool calls go through the same validation, rate limits and ledger as POST /api/v1/search, so a search costs the same here as anywhere else.
Get a key
Sign in, then create a key in the dashboard. New accounts start with $1.00 of credit. Put the key in your shell profile so every client below can read it:
$ export METASEARCH_API_KEY=ms_live_…Claude Code
$ claude mcp add --transport http metasearch https://metasearch.sh/mcp \
--header "Authorization: Bearer $METASEARCH_API_KEY"Add --scope user to use it in every project, or --scope project to share it through .mcp.json. Check it with claude mcp list.
Cursor
{
"mcpServers": {
"metasearch": {
"url": "https://metasearch.sh/mcp",
"headers": { "Authorization": "Bearer ${env:METASEARCH_API_KEY}" }
}
}
}VS Code
Install in VS Code and paste your key when asked, or add it to the workspace by hand:
{
"inputs": [
{
"type": "promptString",
"id": "metasearch-api-key",
"description": "metasearch.sh API key",
"password": true
}
],
"servers": {
"metasearch": {
"type": "http",
"url": "https://metasearch.sh/mcp",
"headers": {
"Authorization": "Bearer ${input:metasearch-api-key}"
}
}
}
}Codex
$ codex mcp add metasearch --url https://metasearch.sh/mcp --bearer-token-env-var METASEARCH_API_KEY[mcp_servers.metasearch] url = "https://metasearch.sh/mcp" bearer_token_env_var = "METASEARCH_API_KEY"
Other clients
Any client that supports remote MCP servers over HTTP works: give it the URL https://metasearch.sh/mcp and the header Authorization: Bearer ms_live_…. A request with a missing, unknown or revoked key gets HTTP 401, so the client can ask for a new key. If the key cannot be checked during an outage, the answer is HTTP 503 with a Retry-After header.
Tools
| Tool | Arguments | Returns |
|---|---|---|
| search | query; optional mode, providers, count (1-20), freshness, include_domains, exclude_domains, country, language | Ranked results: title, URL and snippet, plus any provider answers |
| fetch | url | The page as markdown, up to 40,000 characters |
Leave mode out and the server picks one from the query, then says which and why in routing.auto; see Routing. It never picks deep, and picks social only when the query names X or Twitter, because those cost several times more: ask for them by name. One entry in providers pins that provider; several are queried together and their results merged.
Each tool returns a short text list for the model and the full API response as structured content. The text ends with one line of billing:
Mode news (auto, jev): Asked about recent events (p 0.97); used news with freshness week. 1. Solid-state batteries clear a manufacturing hurdle https://… Toyota and Idemitsu say their sulfide electrolyte line… 2. … Charged $0.0015 · balance $0.9985 · served by serper
Pages from fetch start with a line marking them as untrusted web content. Treat that text as data: a page can contain instructions aimed at your agent.
What it costs
Tools are priced exactly like the API: the provider's price for the call times 1.5, taken from your prepaid balance. A search starts at $0.00075 and a page fetch at $0.000375; empty and failed attempts cost nothing. Every provider and mode is on the pricing page.
insufficient_credits (with a top-up link) or rate_limited. When the API would send Retry-After, the text ends with how many seconds to wait, and the structured content carries the same number as retry_after_s. The codes are listed under Errors.