TinyFish CLI skill
Use TinyFish for web search, fetching URLs, reading pages, current information, source-backed answers, research, docs, pricing/product pages, extraction, scraping, and browser automation.
by tinyfish-io·MIT license·★ 2,206 Stars on the repo·GitHub ↗
npx degit tinyfish-io/tinyfish-cookbook/skills/use-tinyfish#main ~/.claude/skills/use-tinyfishChecked ·commit main
Files of TinyFish CLI
Show the full text223 lines
TinyFish CLI
You have access to the TinyFish CLI (tinyfish) — a suite of web tools you can call from the terminal.
If not installed: npm install -g @tiny-fish/cli
If not authenticated: tinyfish auth login --source openclaw or set TINYFISH_API_KEY env var.
When This Skill Should Trigger
Use TinyFish whenever a request depends on live web information or page content. Do not wait for the user to say "TinyFish" or "scrape".
Strong triggers include:
- Search or discovery: search, find, look up, research, compare, latest, current, news, docs, pricing, product details, best options.
- URL/page reading: fetch, read, summarize, extract from this page, inspect this URL, get the content, pull links or metadata.
- Source-backed answers: answer using web sources, verify a fact, check whether something changed, gather information from the web.
- Website work: interact with a site, click through pages, fill forms, log in, collect structured data, handle bot-protected pages.
Default to the lightest tool that can answer:
- No URL and the user needs web information:
search, thenfetchthe best result(s) if more detail is needed. - URL provided and only content is needed:
fetch. - Page interaction or dynamic extraction is needed:
agent. - Raw CDP/Playwright-style control is needed:
browser.
Picking the Right Tool
TinyFish has four tools. Start with the lightest one that can do the job and escalate only when needed.
search → fetch → agent → browser
lightest heaviest
| Tool | When to use | Speed | Cost |
|---|---|---|---|
| search | You need to find URLs, current facts, docs, pricing, product details, or a quick source-backed answer | Fastest | Lowest |
| fetch | You have URLs and need clean page content, summaries, article text, docs, product pages, links, or metadata | Fast | Low |
| agent | You need to interact with a page — click, fill forms, navigate, extract structured data from dynamic sites | Slower | Higher |
| browser | Agent isn't enough — you need raw programmatic browser control via CDP | Slowest | Highest |
Common Patterns
Research: search → fetch Search for a topic, then fetch the best results to read their full content.
# 1. Find URLs
tinyfish search query "best React state management libraries 2026"
# 2. Read the top results
tinyfish fetch content get --format markdown "https://result1.com" "https://result2.com"
Deep extraction: search → agent Search to find the right site, then use agent to interact with it and extract structured data.
# 1. Find the site
tinyfish search query "Nike running shoes official store"
# 2. Automate extraction on it
tinyfish agent run --url "https://nike.com/running" \
"Extract all running shoes as JSON: [{\"name\": str, \"price\": str, \"colors\": [str]}]"
Escalation: fetch → agent Try fetch first. If the page is dynamic/JS-heavy and fetch returns empty or incomplete content, escalate to agent.
Full control: agent → browser If agent can't handle a complex multi-step workflow, spin up a raw browser session and automate it yourself via CDP.
Commands
tinyfish search query
Web search. Returns ranked results with titles, URLs, and snippets.
tinyfish search query "<query>" [--location <hint>] [--language <hint>] [--pretty]
- Returns 10 results by default
- Use
--locationand--languagefor geo-targeted results - Default output is JSON;
--prettyfor human-readable
tinyfish search query "best pho in Ho Chi Minh City" --location "Vietnam" --language "en"
tinyfish fetch content get
Fetch clean, extracted content from one or more URLs. Strips ads, nav, boilerplate — returns just the content.
tinyfish fetch content get <urls...> [--format markdown|html|json] [--links] [--image-links] [--pretty]
- Accepts multiple URLs in a single call — they are fetched in parallel server-side
--format markdown(default) — clean readable text--format json— structured document tree--links— include all extracted links from the page--image-links— include extracted image URLs- Response includes:
url,final_url,title,language,author,published_date,text,latency_ms
# Fetch one page as markdown
tinyfish fetch content get --format markdown "https://example.com/article"
# Fetch multiple pages with links
tinyfish fetch content get --links "https://site-a.com" "https://site-b.com" "https://site-c.com"
tinyfish agent run
Run a browser automation using a natural language goal. The agent opens a real browser, navigates, clicks, fills forms, and extracts data.
tinyfish agent run --url <url> "<goal>" [--sync] [--async] [--pretty]
| Flag | Purpose |
|---|---|
--url <url> |
Target URL (bare hostnames get https:// auto-prepended) |
--sync |
Wait for full result without streaming steps |
--async |
Submit and return immediately |
--pretty |
Human-readable output |
Output: Default streams data: {...} SSE lines. The final result is the event where type == "COMPLETE" and status == "COMPLETED" — the extracted data is in the resultJson field. Read the raw output directly; no script-side parsing is needed.
Always specify the JSON structure you want in the goal:
tinyfish agent run --url "https://example.com/products" \
"Extract all products as JSON array: [{\"name\": str, \"price\": str, \"url\": str}]"
tinyfish agent run --url "https://example.com/search" \
"Search for 'wireless headphones', filter under $50, extract top 5 as JSON: [{\"name\": str, \"price\": str, \"rating\": str}]"
Parallel extraction — when hitting multiple independent sites, make separate calls. Do NOT combine into one goal.
Good — parallel calls (run simultaneously):
tinyfish agent run --url "https://pizzahut.com" \
"Extract pizza prices as JSON: [{\"name\": str, \"price\": str}]"
tinyfish agent run --url "https://dominos.com" \
"Extract pizza prices as JSON: [{\"name\": str, \"price\": str}]"
Bad — single combined call:
# Don't do this — less reliable and slower
tinyfish agent run --url "https://pizzahut.com" \
"Extract prices from Pizza Hut and also go to Dominos..."
Managing runs:
tinyfish agent run list [--status PENDING|RUNNING|COMPLETED|FAILED|CANCELLED] [--limit N]
tinyfish agent run get <run_id>
tinyfish agent run cancel <run_id>
Batch operations — submit many runs from a CSV file (url,goal columns):
tinyfish agent batch run --input runs.csv
tinyfish agent batch list
tinyfish agent batch get <batch_id>
tinyfish agent batch cancel <batch_id>
tinyfish browser session create
Spin up a remote browser instance. Returns a CDP WebSocket URL for programmatic control.
tinyfish browser session create [--url <url>] [--proxy-country <code> | --proxy-url <url> [--proxy-username <user>] | --no-proxy] [--pretty]
--urloptionally navigates to a page after creation- Returns
session_id,cdp_url(WebSocket), andbase_url - Use the
cdp_urlwith Playwright, Puppeteer, or any CDP client - By default traffic exits through the TinyFish proxy in the US, with the same IP for the whole session
--proxy-country <code>picks another exit country (ISO 3166-1 alpha-2, e.g.DE,JP)--proxy-url <url>routes through the user's own HTTP(S) proxy;--proxy-username <user>for auth, password viaTINYFISH_PROXY_PASSWORDenv (never a flag)--no-proxyconnects directly, without a proxy
tinyfish browser session create --url "https://example.com"
# Returns: { session_id, cdp_url: "wss://...", base_url: "https://..." }
tinyfish browser session create --url "https://example.de" --proxy-country DE
General Notes
- Match the user's language: Respond in whatever language the user writes in.
- All commands support
--prettyfor human-readable output. Default is JSON. - Use
--debugon the root command or setTINYFISH_DEBUG=1to log HTTP requests to stderr.
| 1 | |
| 2 | name use-tinyfish |
| 3 | description Use TinyFish for web search, fetching URLs, reading pages, current information, source-backed answers, research, docs, pricing/product pages, extraction, scraping, and browser automation. Use whenever the user asks to search, find, look up, research, compare, get information from the web, summarize a URL, fetch page content, or automate a website. |
| 4 | |
| 5 | |
| 6 | # TinyFish CLI |
| 7 | |
| 8 | You have access to the TinyFish CLI (`tinyfish`) — a suite of web tools you can call from the terminal. |
| 9 | |
| 10 | If not installed: `npm install -g @tiny-fish/cli` |
| 11 | If not authenticated: `tinyfish auth login --source openclaw` or set `TINYFISH_API_KEY` env var. |
| 12 | |
| 13 | |
| 14 | |
| 15 | ## When This Skill Should Trigger |
| 16 | |
| 17 | Use TinyFish whenever a request depends on live web information or page content. Do not wait for the user to say "TinyFish" or "scrape". |
| 18 | |
| 19 | Strong triggers include: |
| 20 | |
| 21 | Search or discovery: search, find, look up, research, compare, latest, current, news, docs, pricing, product details, best options. |
| 22 | URL/page reading: fetch, read, summarize, extract from this page, inspect this URL, get the content, pull links or metadata. |
| 23 | Source-backed answers: answer using web sources, verify a fact, check whether something changed, gather information from the web. |
| 24 | Website work: interact with a site, click through pages, fill forms, log in, collect structured data, handle bot-protected pages. |
| 25 | |
| 26 | Default to the lightest tool that can answer: |
| 27 | |
| 28 | No URL and the user needs web information: `search`, then `fetch` the best result(s) if more detail is needed. |
| 29 | URL provided and only content is needed: `fetch`. |
| 30 | Page interaction or dynamic extraction is needed: `agent`. |
| 31 | Raw CDP/Playwright-style control is needed: `browser`. |
| 32 | |
| 33 | |
| 34 | |
| 35 | ## Picking the Right Tool |
| 36 | |
| 37 | TinyFish has four tools. Start with the lightest one that can do the job and escalate only when needed. |
| 38 | |
| 39 | |
| 40 | search → fetch → agent → browser |
| 41 | lightest heaviest |
| 42 | |
| 43 | |
| 44 | | Tool | When to use | Speed | Cost | |
| 45 | |------|-------------|-------|------| |
| 46 | | **search** | You need to find URLs, current facts, docs, pricing, product details, or a quick source-backed answer | Fastest | Lowest | |
| 47 | | **fetch** | You have URLs and need clean page content, summaries, article text, docs, product pages, links, or metadata | Fast | Low | |
| 48 | | **agent** | You need to interact with a page — click, fill forms, navigate, extract structured data from dynamic sites | Slower | Higher | |
| 49 | | **browser** | Agent isn't enough — you need raw programmatic browser control via CDP | Slowest | Highest | |
| 50 | |
| 51 | ### Common Patterns |
| 52 | |
| 53 | **Research: search → fetch** |
| 54 | Search for a topic, then fetch the best results to read their full content. |
| 55 | |
| 56 | |
| 57 | # 1. Find URLs |
| 58 | tinyfish search query "best React state management libraries 2026" |
| 59 | |
| 60 | # 2. Read the top results |
| 61 | tinyfish fetch content get --format markdown "https://result1.com" "https://result2.com" |
| 62 | |
| 63 | |
| 64 | **Deep extraction: search → agent** |
| 65 | Search to find the right site, then use agent to interact with it and extract structured data. |
| 66 | |
| 67 | |
| 68 | # 1. Find the site |
| 69 | tinyfish search query "Nike running shoes official store" |
| 70 | |
| 71 | # 2. Automate extraction on it |
| 72 | tinyfish agent run --url "https://nike.com/running" \ |
| 73 | "Extract all running shoes as JSON: [{\"name\": str, \"price\": str, \"colors\": [str]}]" |
| 74 | |
| 75 | |
| 76 | **Escalation: fetch → agent** |
| 77 | Try fetch first. If the page is dynamic/JS-heavy and fetch returns empty or incomplete content, escalate to agent. |
| 78 | |
| 79 | **Full control: agent → browser** |
| 80 | If agent can't handle a complex multi-step workflow, spin up a raw browser session and automate it yourself via CDP. |
| 81 | |
| 82 | |
| 83 | |
| 84 | ## Commands |
| 85 | |
| 86 | ### `tinyfish search query` |
| 87 | |
| 88 | Web search. Returns ranked results with titles, URLs, and snippets. |
| 89 | |
| 90 | |
| 91 | tinyfish search query "<query>" [--location <hint>] [--language <hint>] [--pretty] |
| 92 | |
| 93 | |
| 94 | Returns 10 results by default |
| 95 | Use `--location` and `--language` for geo-targeted results |
| 96 | Default output is JSON; `--pretty` for human-readable |
| 97 | |
| 98 | |
| 99 | tinyfish search query "best pho in Ho Chi Minh City" --location "Vietnam" --language "en" |
| 100 | |
| 101 | |
| 102 | |
| 103 | |
| 104 | ### `tinyfish fetch content get` |
| 105 | |
| 106 | Fetch clean, extracted content from one or more URLs. Strips ads, nav, boilerplate — returns just the content. |
| 107 | |
| 108 | |
| 109 | tinyfish fetch content get <urls...> [--format markdown|html|json] [--links] [--image-links] [--pretty] |
| 110 | |
| 111 | |
| 112 | Accepts **multiple URLs** in a single call — they are fetched in parallel server-side |
| 113 | `--format markdown` (default) — clean readable text |
| 114 | `--format json` — structured document tree |
| 115 | `--links` — include all extracted links from the page |
| 116 | `--image-links` — include extracted image URLs |
| 117 | Response includes: `url`, `final_url`, `title`, `language`, `author`, `published_date`, `text`, `latency_ms` |
| 118 | |
| 119 | |
| 120 | # Fetch one page as markdown |
| 121 | tinyfish fetch content get --format markdown "https://example.com/article" |
| 122 | |
| 123 | # Fetch multiple pages with links |
| 124 | tinyfish fetch content get --links "https://site-a.com" "https://site-b.com" "https://site-c.com" |
| 125 | |
| 126 | |
| 127 | |
| 128 | |
| 129 | ### `tinyfish agent run` |
| 130 | |
| 131 | Run a browser automation using a natural language goal. The agent opens a real browser, navigates, clicks, fills forms, and extracts data. |
| 132 | |
| 133 | |
| 134 | tinyfish agent run --url <url> "<goal>" [--sync] [--async] [--pretty] |
| 135 | |
| 136 | |
| 137 | | Flag | Purpose | |
| 138 | |------|---------| |
| 139 | | `--url <url>` | Target URL (bare hostnames get `https://` auto-prepended) | |
| 140 | | `--sync` | Wait for full result without streaming steps | |
| 141 | | `--async` | Submit and return immediately | |
| 142 | | `--pretty` | Human-readable output | |
| 143 | |
| 144 | **Output:** Default streams `data: {...}` SSE lines. The final result is the event where `type == "COMPLETE"` and `status == "COMPLETED"` — the extracted data is in the `resultJson` field. Read the raw output directly; no script-side parsing is needed. |
| 145 | |
| 146 | **Always specify the JSON structure you want in the goal:** |
| 147 | |
| 148 | |
| 149 | tinyfish agent run --url "https://example.com/products" \ |
| 150 | "Extract all products as JSON array: [{\"name\": str, \"price\": str, \"url\": str}]" |
| 151 | |
| 152 | tinyfish agent run --url "https://example.com/search" \ |
| 153 | "Search for 'wireless headphones', filter under $50, extract top 5 as JSON: [{\"name\": str, \"price\": str, \"rating\": str}]" |
| 154 | |
| 155 | |
| 156 | **Parallel extraction — when hitting multiple independent sites, make separate calls. Do NOT combine into one goal.** |
| 157 | |
| 158 | Good — parallel calls (run simultaneously): |
| 159 | |
| 160 | tinyfish agent run --url "https://pizzahut.com" \ |
| 161 | "Extract pizza prices as JSON: [{\"name\": str, \"price\": str}]" |
| 162 | |
| 163 | tinyfish agent run --url "https://dominos.com" \ |
| 164 | "Extract pizza prices as JSON: [{\"name\": str, \"price\": str}]" |
| 165 | |
| 166 | |
| 167 | Bad — single combined call: |
| 168 | |
| 169 | # Don't do this — less reliable and slower |
| 170 | tinyfish agent run --url "https://pizzahut.com" \ |
| 171 | "Extract prices from Pizza Hut and also go to Dominos..." |
| 172 | |
| 173 | |
| 174 | **Managing runs:** |
| 175 | |
| 176 | |
| 177 | tinyfish agent run list [--status PENDING|RUNNING|COMPLETED|FAILED|CANCELLED] [--limit N] |
| 178 | tinyfish agent run get <run_id> |
| 179 | tinyfish agent run cancel <run_id> |
| 180 | |
| 181 | |
| 182 | **Batch operations** — submit many runs from a CSV file (`url,goal` columns): |
| 183 | |
| 184 | |
| 185 | tinyfish agent batch run --input runs.csv |
| 186 | tinyfish agent batch list |
| 187 | tinyfish agent batch get <batch_id> |
| 188 | tinyfish agent batch cancel <batch_id> |
| 189 | |
| 190 | |
| 191 | |
| 192 | |
| 193 | ### `tinyfish browser session create` |
| 194 | |
| 195 | Spin up a remote browser instance. Returns a CDP WebSocket URL for programmatic control. |
| 196 | |
| 197 | |
| 198 | tinyfish browser session create [--url <url>] [--proxy-country <code> | --proxy-url <url> [--proxy-username <user>] | --no-proxy] [--pretty] |
| 199 | |
| 200 | |
| 201 | `--url` optionally navigates to a page after creation |
| 202 | Returns `session_id`, `cdp_url` (WebSocket), and `base_url` |
| 203 | Use the `cdp_url` with Playwright, Puppeteer, or any CDP client |
| 204 | By default traffic exits through the TinyFish proxy in the US, with the same IP for the whole session |
| 205 | `--proxy-country <code>` picks another exit country (ISO 3166-1 alpha-2, e.g. `DE`, `JP`) |
| 206 | `--proxy-url <url>` routes through the user's own HTTP(S) proxy; `--proxy-username <user>` for auth, password via `TINYFISH_PROXY_PASSWORD` env (never a flag) |
| 207 | `--no-proxy` connects directly, without a proxy |
| 208 | |
| 209 | |
| 210 | tinyfish browser session create --url "https://example.com" |
| 211 | # Returns: { session_id, cdp_url: "wss://...", base_url: "https://..." } |
| 212 | |
| 213 | tinyfish browser session create --url "https://example.de" --proxy-country DE |
| 214 | |
| 215 | |
| 216 | |
| 217 | |
| 218 | ## General Notes |
| 219 | |
| 220 | **Match the user's language**: Respond in whatever language the user writes in. |
| 221 | All commands support `--pretty` for human-readable output. Default is JSON. |
| 222 | Use `--debug` on the root command or set `TINYFISH_DEBUG=1` to log HTTP requests to stderr. |
| 223 |
Discussion
Alternatives
Browse more free Claude skills or everything in Operations.