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.5To preview the dashboard:
npx -y --allow-git=all github:localfoundry/search-rotation#v0.4.5 --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?
With no annotations, the description carries the full burden of behavioral disclosure. It adds non-obvious information about rotating across multiple extraction providers and failover behavior, which helps an agent anticipate reliability and latency characteristics. It does not mention error handling or rate limits, but those are less critical for a simple fetch operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that states the primary purpose first and then adds the key behavioral detail about provider rotation and failover. There is no filler or redundant repetition of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one required parameter and no nested structures, the description is largely complete: it explains the input (URL), the output (markdown content), and the notable internal behavior (provider failover). It could mention what happens on fetch failures, but this is a minor gap given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully documents the only parameter, 'url', with a description ('URL to fetch'). The tool description adds no additional parameter-level meaning, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Fetch a web page') and a resource (a URL), and clarifies the return format ('content as markdown'). This clearly separates it from sibling tools like web_search, which searches rather than fetches a specific page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: when you have a specific URL and want its content as markdown. However, it does not explicitly state when not to use it or mention alternatives such as web_search for discovery or engine_status for checking provider health.
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 provided, the description carries the full transparency burden. It discloses significant behavioral traits: automatic round-robin across providers, transparent failover, and the guarantee that time filters are never silently dropped. It also specifies the result shape, which is especially valuable because no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, using only two sentences. It conveys core behavior, provider list, failover semantics, returned fields, and the time-filter guarantee without filler or repetition.
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 six parameters and no output schema, the description covers the essential result format and important behavioral constraints. It does not discuss error handling beyond failover, rate limits, or provider-specific edge cases, so it is thorough but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes all six parameters with 100% coverage, so the baseline is 3. The description adds extra semantic value by explaining that time filters restrict rotation and failover to compatible providers, a nuance not present in the schema. This justifies a score above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: web search performed through multiple named APIs. It clearly differentiates this tool from siblings like fetch_url and engine_status by emphasizing search results, round-robin rotation, and failover.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when the tool is appropriate: general web searching with automatic provider rotation and date filtering. It does not explicitly state when to prefer fetch_url or engine_status, so it falls short of a perfect 5, but the use case is evident.
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.
2 tool updates
v0.4.5- Changed
fetch_url1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
web_search4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / endDate / $refRemoved value: -"#/properties/startDate" - added
Input schema / properties / endDate / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$" - added
Input schema / properties / endDate / typeAdded value: +"string"
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 (search results vs. page content). engine_status and open_dashboard both relate to configuration/quota, but one is a read-only config query and the other opens a browser UI, so some care is needed but descriptions mitigate ambiguity.
Names are all lowercase snake_case, but styles are mixed: fetch_url and open_dashboard follow verb_noun, while web_search and engine_status are noun-style phrases. The pattern is readable but not fully consistent.
Four tools is well-scoped for a search-rotation server: search, fetch, engine status, and dashboard access each cover a distinct need without bloat.
The core lifecycle of searching, fetching, inspecting engine status, and opening configuration UI is covered. A minor gap is the lack of programmatic engine configuration, but the dashboard tool reasonably covers that user-driven workflow.
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