search-rotation
Search-rotation is an MCP server that provides web search and page fetching with automatic rotation and failover across multiple providers, plus a local dashboard for configuration.
web_search: runs web searches across Tavily, Firecrawl, Parallel, Exa, Google PSE, and DuckDuckGo, returning numbered results with title, URL, snippet, and publication date when available. Supports optional result count, preferred engine, and date filters (timeRange or startDate/endDate).
fetch_url: fetches a web page and returns its content as Markdown, rotating across extraction providers (Jina Reader, Firecrawl, Parallel, Tavily, Exa) with failover.
engine_status: reads engine configuration, authentication requirements, local usage, and quota sources (not a live health check).
open_dashboard: opens the local dashboard in a browser, where you can manage API keys, reorder/toggle engines, view quotas, and inspect request history.
Automatic quota-aware rotation, rate-limit cooldowns, timeouts, and transparent failover help keep searches reliable across provider availability.
Provides web search through DuckDuckGo HTML as one of the supported search providers, with keyless access and integration into the multi-provider rotation and automatic failover system.
Provides web search through Google Programmable Search Engine (PSE) as one of the supported search providers, integrated into the multi-provider rotation with quota-aware ordering and automatic failover.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@search-rotationSearch the web for the latest MCP server updates and summarize the top results."
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.
One MCP server for web search and page extraction across multiple providers.
Built by Robin Bially · Part of LocalFoundry.
Rotate across available quotas, automatically fail over when a provider is unavailable, and return consistent results to your AI assistant. A local dashboard lets you manage API keys, reorder engines, check quotas, and inspect request history.
Actual dashboard UI, shown in English with illustrative demo data.
Quick start
Homebrew
brew install localfoundry/tap/search-rotation
search-rotation --http --openHomebrew installs the required Node.js runtime. For MCP over stdio, configure your
client to run search-rotation with no arguments. See the
LocalFoundry tap for upgrades and details.
GitHub / npx
Requires Node.js 20.3+ and Git. Install directly from GitHub — no npm account needed.
npx -y --allow-git=all github:localfoundry/search-rotation#v0.4.2To preview the dashboard:
npx -y --allow-git=all github:localfoundry/search-rotation#v0.4.2 --http --openAdd your provider keys in the dashboard, then connect your assistant using the MCP client setup guide for Codex, Claude, Cursor, or OpenCode.
Related MCP server: serp-it
What you get
Search and fetch: independent rotation for web search and Markdown page extraction.
Automatic failover: quota-aware ordering, rate-limit cooldowns, and request timeouts.
Local dashboard: API keys, drag-and-drop engine order, quota status, and request history.
Local or remote: MCP over stdio or authenticated Streamable HTTP.
Providers: Tavily · Firecrawl · Parallel · Exa · Google PSE · Jina Reader · DuckDuckGo HTML. Keyless access and quota accounting vary by provider.
MCP tools
web_search · fetch_url · engine_status · open_dashboard
The dashboard's MCP Tools tab explains each tool, its parameters, and copyable example calls.
Actual dashboard UI, shown in English.
Search time filters
web_search accepts the following arguments:
Parameter | Meaning |
| Required search text. |
| Optional result count, 1–20; otherwise the dashboard setting applies. |
| Preferred provider, subject to time-filter support and availability; failover stays enabled. |
|
|
| Optional lower date bound in |
| Optional upper date bound in |
Use either timeRange or explicit dates. One-sided bounds and equal start/end dates are allowed; invalid calendar dates, reversed bounds, and mixing relative and explicit filters are rejected before any provider request.
{"name":"web_search","arguments":{"query":"AI inference research","timeRange":"week","numResults":5}}{"name":"web_search","arguments":{"query":"AI inference research","startDate":"2026-08-01","endDate":"2026-08-31"}}Relative windows are resolved once per request into UTC dates, including across failover. These are date filters, not exact rolling 24-hour windows; month and year mean 30 and 365 days, not calendar arithmetic. Exa receives the start of the first UTC day and the end of the last UTC day.
Provider support and rotation
Provider / access | Relative window | Two date bounds | One date bound |
Tavily, with or without key | Yes | Yes | Yes |
Firecrawl, with or without key | Yes | Yes | Skipped |
Exa, direct API with key | Yes | Yes | Yes |
Exa, hosted MCP without key | Skipped | Skipped | Skipped |
Parallel, either access mode | Skipped | Skipped | Skipped |
Google PSE / DuckDuckGo HTML | Skipped | Skipped | Skipped |
This table describes implemented support in search-rotation, not every upstream feature. Tavily receives start_date / end_date, Firecrawl receives a custom tbs range, and Exa receives startPublishedDate / endPublishedDate. Firecrawl is conservatively excluded for one-sided dates; the other skipped paths have no implemented date mapping.
The router excludes incompatible providers before quota checks and rotation, including when an incompatible engine is preferred. Each eligible provider pool has its own rotation cursor, so mixing filtered and unfiltered searches does not starve providers. Existing quota priorities, cooldowns, strict-free rules, and failover apply within that pool. If no compatible provider is available, the search fails explicitly; it never retries without the filter. Searches without time arguments retain access to all otherwise eligible providers.
Results show a publication date when supplied by the adapter, and request history includes the requested period. Provider date metadata can be estimated or missing: Tavily filters publication or update dates, Exa filters estimated publication dates, and Firecrawl uses its search index's date interpretation. Exact boundary inclusion follows the provider; this is not an independent verification of each page's publication date. See the Tavily, Firecrawl, and Exa references.
After updating, reconnect your MCP client to load the new tool schema.
Learn more
Client setup · Operations & configuration (DE) · Releases · CI · MIT license
Available Tools
4 toolsengine_statusEngine StatusARead-only
Read engine configuration, per-capability authentication requirements, local usage and quota sources. This is not a live health check. Historical errors do not prove a current failure; disabled engines are not necessarily missing credentials.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as read-only and non-destructive. The description adds meaningful behavioral caveats: historical errors do not prove current failure, and disabled engines do not necessarily mean missing credentials. This helps an agent interpret results correctly.
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?
Three sentences with no filler. The primary purpose is front-loaded, followed by two high-value caveats that prevent misinterpretation. Every sentence earns its place.
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 zero-parameter read-only tool with no siblings in the same domain, the description fully covers what the tool accesses and how to interpret the data. No output schema exists, but the description gives enough behavioral context for correct use.
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 tool has zero parameters, so there is nothing for the description to explain. The baseline for zero-parameter tools is 4, and the description does not introduce any conflicting or confusing parameter-related claims.
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 ('Read') and names the exact resources: engine configuration, authentication requirements, usage and quota sources. It also clearly distinguishes this from a health check, which sets it apart from any sibling that might be mistaken for it.
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 clear context about what the tool is for and explicitly warns that it is not a live health check. It does not name alternative tools, but the siblings are unrelated enough that the guidance is still useful and sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_urlFetch URLA
Fetch a web page and return its content as markdown. Rotates across extraction providers (Jina Reader, Firecrawl, Parallel, Tavily, Exa) with failover.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to fetch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It usefully discloses that content is converted to markdown and that the tool rotates across extraction providers with failover. It does not mention error behavior, latency, or external dependencies, but the core behavior is transparent enough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The primary action and output format are front-loaded, and the provider-rotation detail is placed second where it supplements rather than obscures the main purpose.
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 a single parameter and no output schema, the description covers the input, the transformation to markdown, and a key operational behavior (failover). Missing error-response and edge-case details, but the tool is simple enough that these are not critical for selection and 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 coverage is 100% and the only parameter, url, is already described with type, format, and description. The description adds no new parameter-level detail beyond confirming that the input is a web page.
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?
States a specific verb (fetch) and resource (a web page) and specifies the output format (markdown). This clearly distinguishes it from the sibling web_search tool: fetching a given URL's content rather than searching the 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 intended use case is implied clearly: use it when a specific URL's content is needed. However, it does not explicitly mention when not to use it or name alternatives like web_search, leaving some routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_dashboardOpen DashboardA
Open the local dashboard (API keys, engine order and toggles, quota view) in a web browser. Use when the user wants to configure engines or check quota.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It discloses the main side effect—opening a web browser—and clarifies what the dashboard contains. It does not mention prerequisites like whether a local server must already be running, but for a benign, no-parameter action this is acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler: the first states the action and resource, the second states when to use it. The most important information is front-loaded, and every sentence earns its place.
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 simple no-parameter tool with no output schema, the description is complete. It explains what the tool does, what the dashboard contains, and when to invoke it. Nothing essential is missing for an agent to select and call 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?
The tool has zero parameters, and the schema coverage is 100%, so there are no parameter semantics to explain. The baseline for zero-parameter tools is 4, and the description adds useful context about what the dashboard shows.
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 a specific verb and resource: 'Open the local dashboard ... in a web browser.' It also enumerates the dashboard contents, making the tool's function unambiguous. This distinguishes it from sibling tools like engine_status, which is about status rather than opening a UI.
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 explicit use condition: 'Use when the user wants to configure engines or check quota.' It does not discuss when not to use it or name alternative tools, but the intended context is clear and sufficient for this no-parameter action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_searchWeb SearchA
Web search with automatic round-robin across multiple free search APIs (Tavily, Firecrawl, Parallel, Exa, Google PSE, DuckDuckGo) including transparent failover. Returns numbered results with title, URL, snippet and publication date when available. Time filters restrict rotation and failover to compatible providers; never silently dropped.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query | |
| engine | No | Preferred engine id; failover to the other engines stays active | |
| endDate | No | End date YYYY-MM-DD (through this date, subject to provider boundary semantics). Cannot combine with timeRange. | |
| startDate | No | Start date YYYY-MM-DD. May be used alone or with endDate; cannot combine with timeRange. | |
| timeRange | No | Relative UTC date window: day=1, week=7, month=30, year=365 days through today. Cannot combine with startDate/endDate; day precision, not rolling hours. | |
| numResults | No | Optional result count (1–20). Omit to use the dashboard setting: a custom count or the provider default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations available, the description carries the burden and does substantial work: it discloses round-robin provider rotation, transparent failover, the numbered result format, and the guarantee that time filters are never silently dropped but instead restrict rotation to compatible providers. It omits failure/rate-limit details, but the disclosed behavior is unusually specific and useful.
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?
Three dense sentences with no filler: the first names providers and the core failover behavior, the second specifies the return shape, and the third captures a key parameter guarantee. Every sentence earns its place and the most important information 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 six-parameter tool with no annotations and no output schema, this description covers the essential invocation contract: what to search, which providers are used, how results are returned, and how time filters behave. It does not spell out all-providers-fail behavior, but the combination of description and thorough schema descriptions is enough for an agent to select and call the tool 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 coverage is 100%, so the baseline is 3, but the description adds meaningful meaning beyond the schema: it explains that time filters restrict provider rotation/failover and are never silently ignored, and it gives the engine parameter context about failover. The schema already documents query and numResults, so the extra value is concentrated where it matters.
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 action and resource ('Web search') and goes well beyond the name by enumerating the six search providers, the round-robin behavior, and the exact result fields (title, URL, snippet, publication date). This clearly distinguishes it from siblings like engine_status, fetch_url, and open_dashboard.
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 that web_search is the general-purpose search tool, but it never explicitly says when to prefer it over alternatives such as fetch_url or engine_status, nor gives when-not conditions. It provides useful context about time-filter behavior, but no direct routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
1 tool update
v0.4.2- Changed
web_search3 fields changed- added
Input schema / properties / endDateAdded value: +{ + "$ref": "#/properties/startDate", + "description": "End date YYYY-MM-DD (through this date, subject to provider boundary semantics). Cannot combine with timeRange." +} - added
Input schema / properties / startDateAdded value: +{ + "description": "Start date YYYY-MM-DD. May be used alone or with endDate; cannot combine with timeRange.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - added
Input schema / properties / timeRangeAdded value: +{ + "description": "Relative UTC date window: day=1, week=7, month=30, year=365 days through today. Cannot combine with startDate/endDate; day precision, not rolling hours.", + "enum": [ + "day", + "week", + "month", + "year" + ], + "type": "string" +}
4 tool updates
v0.3.3- First observed
engine_status - First observed
fetch_url - First observed
open_dashboard - First observed
web_search
TDQS
web_search and fetch_url are clearly distinct operations, and engine_status vs open_dashboard are separated by returning structured data versus opening a GUI. The slight overlap around quota viewing is mitigated by explicit descriptions of each tool's purpose.
Three tools follow a verb_noun pattern (web_search, fetch_url, open_dashboard), while engine_status breaks the pattern as a noun phrase. The naming is still readable and consistent in style, with only a minor deviation.
Four tools is well-scoped for a search-rotation server: search, fetch, status inspection, and dashboard access. Each tool has a distinct role and none feel redundant or unnecessary.
The set covers the core workflows of searching, fetching pages, and understanding engine configuration/quota status. Configuration changes are delegated to an open_dashboard GUI rather than a programmatic tool, which is a minor gap but acceptable for this server's apparent purpose.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for Google search results via SERP API
One MCP for the Web. Easily search, crawl, navigate, and extract websites without getting blocked.…
MCP server for web extraction and rendering via AceDataCloud WebExtrator
One MCP server for 180+ live web-data APIs returning clean JSON from sites that block scrapers.
Related MCP Servers
- AlicenseBqualityNot gradedmaintenanceProvides advanced Google Custom Search functionality, web content extraction, and specialized research tools such as search analytics, multi-site search, and fact checking. Works as an MCP server compatible with any MCP client.10MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server that aggregates web search results from multiple engines and optionally renders pages to Markdown, providing a unified search interface.123ISC
- AlicenseAqualityBmaintenanceA production-ready MCP server for free web search, news search, and webpage content extraction using DuckDuckGo and Bing.419MIT
- AlicenseNot gradedqualityBmaintenanceA lightweight MCP server providing web search via DuckDuckGo and page content extraction in multiple formats.2MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/RobinBially/search-rotation'
If you have feedback or need assistance with the MCP directory API, please join our Discord server