tinyroe
# 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](https://www.tinyfish.ai/blog/search-and-fetch-are-now-free-for-every-agent-everywhere) 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 |
| --- | --- | --- |
| `search` | web, news, or academic search | 30 requests/min |
| `fetch_content` | read up to 10 URLs, returns clean markdown | 150 URLs/min |
## Install
Needs [uv](https://docs.astral.sh/uv/). No clone, no Node. Get a key at [agent.tinyfish.ai/api-keys](https://agent.tinyfish.ai/api-keys) — it is shown once.
```sh
mkdir -p ~/.config/tinyroe
echo 'TINYFISH_API_KEY=your_key' > ~/.config/tinyroe/.env
```
Then add the server:
```sh
claude mcp add tinyroe -s user -- uvx tinyroe # Claude Code, all projects
codex mcp add tinyroe -- uvx tinyroe # Codex
```
OpenCode uses its own schema, in `opencode.json` or `~/.config/opencode/opencode.json`:
```json
{ "mcp": { "tinyroe": { "type": "local", "command": ["uvx", "tinyroe"], "enabled": true } } }
```
Any other client takes the same two fields:
```json
{ "mcpServers": { "tinyroe": { "command": "uvx", "args": ["tinyroe"] } } }
```
Restart the client. You should see two tools and no authentication step.
## 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
```sh
uv sync
uv run ruff format . && uv run ruff check . && uv run basedpyright
uv run tinyroe
```
## Licence
MIT. Not affiliated with TinyFish; bring your own key.
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.