tinyroe
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@tinyroefetch the contents of https://tinyfish.ai/blog as markdown"
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.
TinyRoe
TinyFish's two free tools, and nothing else.
The official TinyFish MCP server ships 19 tools plus a long instructions block, and six of them spend money. TinyRoe exposes only search and fetch_content, which TinyFish made free for every agent at any wallet balance, including $0.
It skips the OAuth too — these two are served over a REST API behind an X-API-Key header, so nothing expires and there is no authenticate stub to swap out. The same two tools are advertised always.
The project is TinyRoe; the package and the tool prefix are lowercase tinyroe.
tool | does | limit |
| web, news, or academic search | 30 requests/min |
| read up to 10 URLs, returns clean markdown | 150 URLs/min |
Install
Needs uv. No clone, no Node. Get a key at agent.tinyfish.ai/api-keys — it is shown once.
mkdir -p ~/.config/tinyroe
echo 'TINYFISH_API_KEY=your_key' > ~/.config/tinyroe/.envThen add the server:
claude mcp add tinyroe -s user -- uvx tinyroe # Claude Code, all projects
codex mcp add tinyroe -- uvx tinyroe # CodexOpenCode uses its own schema, in opencode.json or ~/.config/opencode/opencode.json:
{ "mcp": { "tinyroe": { "type": "local", "command": ["uvx", "tinyroe"], "enabled": true } } }Any other client takes the same two fields:
{ "mcpServers": { "tinyroe": { "command": "uvx", "args": ["tinyroe"] } } }Restart the client. You should see two tools and no authentication step.
Related MCP server: open-search-mcp
The key
TINYFISH_API_KEY in the environment wins, then ~/.config/tinyroe/.env, then a .env in the working directory. Prefer the config file: a client launched from a desktop app never sources your shell profile, so an export in .zshrc reaches terminal-launched clients only.
It is read lazily on the first call, so a missing key is a readable error rather than a server that will not start.
Development
uv sync
uv run ruff format . && uv run ruff check . && uv run basedpyright
uv run tinyroeLicence
MIT. Not affiliated with TinyFish; bring your own key.
Available Tools
2 toolsfetch_contentA
Read one or more URLs and return clean markdown. Free. Renders in a real browser, so JavaScript-heavy pages work. Up to 10 URLs, fetched in parallel. Prefer this over curl or raw HTTP for page content.
| Name | Required | Description | Default |
|---|---|---|---|
| ttl | No | Cache tolerance in seconds. 0 forces a live fetch. | |
| urls | Yes | 1-10 http(s) URLs. | |
| links | No | Also return outbound URLs. | |
| format | No | Defaults to markdown. | |
| purpose | No | Why you are fetching; tailors extraction. | |
| exclude_selectors | No | CSS selectors to strip, e.g. [".comments"]. | |
| include_selectors | No | CSS selectors to scope extraction to, e.g. ["main"]. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden and does well: it mentions free usage, real browser rendering, JavaScript support, parallel fetching, and the 10-URL limit. It does not discuss failure behavior, caching semantics, or potential side effects, but for a read-oriented fetch tool the key behavioral traits are disclosed.
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: the core action comes first, followed by only high-value differentiators. Every sentence earns its place, and no unnecessary detail is included.
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 seven parameters and no output schema, the description provides enough orientation to invoke it correctly in most cases. The schema covers parameter details, and the description covers real-world behavior like browser rendering and parallel fetching. Minor missing context includes default caching and output format behavior, but these are partially covered by schema defaults.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds a couple of useful constraints like 'Up to 10 URLs' and parallel fetching, but it does not need to explain each parameter because the schema already provides complete descriptions for all seven parameters.
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 begins with a specific action and resource: 'Read one or more URLs and return clean markdown.' It clearly differentiates this from browsing or searching by emphasizing URL-based fetching and positioning it as preferable to curl/raw HTTP for page content.
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 concrete usage guidance: 'Prefer this over curl or raw HTTP for page content' and notes that it handles JavaScript-heavy pages. It does not explicitly contrast it with the sibling 'search' tool, but the intent is reasonably clear for an agent deciding between fetching and searching.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchA
Web search. Free, fast, and the default way to ground an answer in current sources. Use before fetch_content when the right page is unknown. Returns ranked title/url/snippet lines.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 0-indexed, max 10. | |
| query | Yes | Search query. Prefer include_domains over site: operators. | |
| purpose | No | Why you are searching; used to rank results against intent. | |
| language | No | Language code, e.g. en. Defaults to en. | |
| location | No | Country code, e.g. US. Defaults to US. | |
| after_date | No | YYYY-MM-DD lower bound. | |
| before_date | No | YYYY-MM-DD upper bound. | |
| domain_type | No | Defaults to web. | |
| pub_year_max | No | research_paper only. | |
| pub_year_min | No | research_paper only. | |
| exclude_domains | No | Comma-separated domains to drop. | |
| include_domains | No | Comma-separated domains to restrict to. | |
| recency_minutes | No | Past N minutes. Not combinable with after_date/before_date. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It adds a clear return contract ('Returns ranked title/url/snippet lines'), a cost/speed trait ('Free, fast'), and a preferred placement relative to fetch_content. It does not mention rate limits, result count, or explicit read-only status, but the stated return format and the nature of a search tool cover the most important behavioral expectations.
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 short, information-dense sentences. The core action is front-loaded ('Web search'), followed by usage guidance and return format. No filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex (13 parameters) and has no output schema and no annotations, but the fully described schema carries the parameter details. The description supplies the missing output contract and the relationship to fetch_content. A few behavioral details such as pagination limits and explicit side-effect-free behavior are left to inference, but nothing critical blocks correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds no parameter-level guidance beyond what the schema already provides; it does not elaborate on query construction, domain filters, date bounds, or pagination. All parameter semantics come from the schema descriptions, which are complete enough.
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?
Starts with 'Web search' — a specific verb and resource — and adds 'the default way to ground an answer in current sources.' It also distinguishes itself from the only sibling by saying 'Use before fetch_content when the right page is unknown,' so an agent can tell them apart without opening the schema.
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?
Gives an explicit routing rule: use search before fetch_content when the right page is unknown. This tells the agent both when to use this tool and, by implication, when the sibling is appropriate. The phrase 'default way to ground an answer' further reinforces the usage context.
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.
2 tool updates
v1.0.0- First observed
fetch_content - First observed
search
TDQS
Scored across 2 tools
Search discovers relevant URLs while fetch_content retrieves page content, making their roles complementary rather than overlapping. The description explicitly advises using search before fetch_content when the target page is unknown, further reducing ambiguity.
Both tool names are clear action-oriented verbs, though one is a bare verb (search) and the other follows a verb_noun pattern (fetch_content). This is a minor stylistic inconsistency rather than a functional or comprehension problem.
Two tools is borderline for a web research server, but the pair covers the essential search-then-fetch workflow compactly. The limited surface feels thin rather than bloated, and each tool earns its place.
The two tools form a complete core workflow: discover URLs via search and retrieve full content via fetch_content. Minor gaps exist, such as lacking search filters or page-level extraction options, but agents can accomplish the main research task without dead ends.
Maintenance
Related MCP Connectors
MCP server for Firecrawl — web search, scraping, and biomedical/arXiv paper search.
Free web search for AI agents. No API key required. Hosted MCP in active development.
Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only
Docs: https://docs.keenable.ai/mcp-server Keenable is a free, remote MCP server that gives agents access to the web index. Search the web with ranked results and date/site filters, then fetch any indexed page as clean markdown. Works out of the box with no account or API key.
Related MCP Servers
- AlicenseAqualityCmaintenanceA lightweight MCP server enabling web search and content fetching via TinyFish Free Access API with support for single and burst URL fetch.3MIT
- AlicenseNot gradedqualityDmaintenanceWeb search, page fetching, and research from the terminal or any MCP client — no API key required.1MIT
- FlicenseNot gradedqualityDmaintenanceMCP server that provides web search scraping from DuckDuckGo (with Mojeek fallback) and URL content fetching as markdown/text or raw HTML.1-
- AlicenseAqualityBmaintenanceProvides Google search, URL extraction, and academic paper inline extraction without API keys, enabling search and content retrieval from a single MCP server.5296 npmMIT