FATSEARCH

io.github.fatsearch由 GitHub 账号 fatsearch 发布v0.2.5更新于 Nov 7, 2026

Web pages, PDFs and documents as small, clean, cached Markdown for AI agents

概览

AI 生成的概览

抓取网页、PDF 和文档,并以小巧、干净、可缓存的 Markdown 大纲返回,供助手按章节阅读。

可以做什么
  • 抓取网址并生成缓存在短 id 下的 Markdown 大纲,随后可读取某一章节、在页内筛选,或列出并跟随编号链接
  • 执行网页搜索和 GitHub 仓库搜索,结果以 id 形式返回
  • 读取本地 PDF 文件,每页对应一个章节
  • 通过已配置的服务商按由便宜到贵的顺序渲染或解锁难抓页面(JS 页面、验证码、拦截墙)
  • 查看每次抓取的服务商、耗时、费用与 token 统计,并预览一次抓取会执行什么、花费多少
适用场景
适合助手需要阅读真实网页或 PDF 又不想占满上下文时,尤其是内置抓取打不开的页面;也适合希望获得可重复、低 token 且每页费用可见的网页阅读流程的场景。
运行要求
需在本机安装本地程序(Homebrew、npm、cargo 或安装脚本),以 stdio 本地进程方式运行。普通 HTTP 抓取无需账号。可选服务商密钥(Oxylabs、Bright Data、Decodo、GitHub)通过本地表单保存到 auth.json;网页搜索需要 Oxylabs 或 Bright Data 密钥。Bright Data 还需区域名(BRIGHTDATA_UNLOCKER_ZONE)。
安装前请注意
服务商密钥保存在磁盘上的 auth.json 而非系统钥匙串,设置流程要求把密钥粘贴到本地浏览器表单,切勿粘贴到对话中。服务商调用按页计费(约每页 0.001–0.0065 美元),请先查看试运行与统计输出。匿名遥测默认开启,可关闭。需要登录的页面无法访问,DOCX/XLSX 与扫描版 PDF 不受支持。

安装

在 SourceWeft 中

  1. 打开 控制台中的 FATSEARCH,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

[FATSEARCH: the ripgrep of web searching for AI agents.]

Reads the pages your agent's built-in fetch can't (JS pages, PDFs) through your own provider key,
kept on disk as clean Markdown, navigated by outline and ids.


[crates.io] [npm] [release] [license]


[Same question, same answer: FATSEARCH puts 1,384 tokens in the agent's context, Firecrawl puts the whole page, 112,517.]

same question · same answer · 81× less context
That's the point.


Every page your agent reads costs you this

Wikipedia · Rust · model input at $2 / M tokens (Claude Sonnet 5.5, 2026-10-19)Tokens in contextFetchModel bill
Firecrawl112,5171 credit$0.23
Bright Data Unlocker103,6251 request$0.21
Oxylabs Web API102,6091 request$0.21
Tavily Extract97,5040.2 credit$0.20
Jina Reader94,415free$0.19
FATSEARCH918$0$0.002

Your agent gets a short outline. It reads one section when it needs depth, not the whole page.
Menus, cookie banners, navigation, footer links, tracking scripts: gone.
Prices, dates, numbers: kept (loss guard counts every one).

[!TIP] The "free" fetch costs ~100× more at the model. And it stays in context, every turn after.


Your key never touches the chat

fats setup <provider> opens a one-time key form on 127.0.0.1, behind a random token, for 30 minutes.
You paste the key there in your browser, so it stays out of the chat, the model's context and the agent's logs.
The form refuses a POST from another origin; the key is checked live, saved with mode 0600, sent only to its provider.

console
$ fats setup decodo= setup decodo · waiting for the key at http://127.0.0.1:59802/k/e0c8baba7a5b058947f4fdab97dabb05/decodo · 30 min · $0tell the user (never ask for the key in chat):1. open https://dashboard.decodo.com/web-data/playground  (no account yet: https://dashboard.decodo.com/register)2. Copy the API key shown on the Web Data playground. Do NOT paste it in this chat.3. open http://127.0.0.1:59802/k/e0c8baba7a5b058947f4fdab97dabb05/decodo , paste the key, press Savethen: fats setup   (when the user says done; end your turn, do not poll · checks it, $0)link dead (30 min passed)? run fats setup decodo again and give the user the new line 3

fats setup shows a form still waiting (! form_waiting decodo · 23 min left · <its URL>) or one whose time ran out (! form_expired decodo · the link the user got is dead → fats setup decodo · new link, same 3 steps). Over SSH (SSH_CONNECTION or SSH_TTY set) one more line says how to paste the key in a terminal there.


On hard pages

fats tries plain HTTP first (free). If the page is a JS shell, a captcha, or a wall, it climbs to your providers: cheapest first, hedged, with cost tracking on every call.

console
$ fats https://www.nytimes.com/ dry:truenytimes.com/ fetch plain → oxy (after a captcha) → bd ∥ oxyjs after 5s → new u1 · up to $0.0040
$ fats statsu1 rust-lang.org · Rust Programming Language · plain 230ms $0.0000 · 1.2ktoku2 en.wikipedia.org · Rust (programming language… · plain 558ms $0.0000 · 40.9ktok

fats stats is the marketing: real numbers, not claims.

38 hard pages social · news · shops · travel · classifieds · search · one run each

answer in the returned text, within1 s10 s20 s60 s
FATSEARCH 0.2.0 2026-10-2112191935 /38
Firecrawl 2026-10-160222424
Tavily 2026-10-169171819

FATSEARCH reads more of the hard pages; Firecrawl and Tavily are faster on the pages they do read (same pages, medians: 23.7 s vs 4.9 s, 23.7 s vs 1.0 s). Readers ran on different days. Method and every row → · the table above: one page, six readers →

Tested in agents FATSEARCH 0.1.3 · Claude Code 2.1.280, one run each, 2026-10-19

  • 51 tasks, FATSEARCH MCP vs Firecrawl MCP: 50/51 vs 51/51 right · $15.06 vs $53.48 per 1k tasks · median 5.3 s vs 6.7 s · slowest tenth 43.8 s vs 21.5 s. Details →
  • Claude Code's WebFetch got 403 on npm, Medium and G2; FATSEARCH read all three. Details →
  • One Wikipedia page, open-source readers: FATSEARCH 1,384 tokens to the answer; mcp-server-fetch, Crawl4AI, mcp-searxng and self-hosted Firecrawl 75k–117k for the whole page. Details →
  • Full tables, losses included: docs/benchmarks.md

Get started

1 · INSTALL2 · KEYS (optional)3 · PLUG IN
brew install fatsearch/tap/fatsearchfats setupclaude mcp add --scope user fats -- fats mcp

or  curl -fsSL https://fatsearch.com/install.sh | sh  ·  Windows: npm i -g fatsearch  ·  cargo install --locked fatsearch  ·  every host →

[!NOTE] The package is fatsearch; the command is fats (like ripgrep → rg). Homebrew, npm and the install script also add fatsearch as a second name for it; cargo install adds only fats. No account needed. Without a provider key, fats reads what a plain request gets; web search needs an Oxylabs or Bright Data key. With any one key (Oxylabs, Bright Data or Decodo) it renders and unblocks pages through that provider.


Setup

You, at a terminal: run fats setup. It is a menu (↑↓ Enter): the free fetch and each provider with its state, then Settings (agent connection, cache, stats, telemetry). Pick a provider, paste its key (shown as • and a count), and fats checks it live before it saves it. fats setup oxy jumps straight to one (also bd, decodo, gh).

Your agent, or no terminal: the agent runs fats setup oxy (or bd, decodo, gh). It prints the provider's dashboard link and a one-time form on 127.0.0.1, open for 30 minutes. The agent gives you the URL; you paste the key into the form in your browser, never into the chat (what it prints). Then the agent runs fats setup to check it ($0).

Keys go to auth.json in the key dir (mode 0600) and are sent only to their provider. auth.json is the one key source: fats never sends a key from the environment, so the key you saved is the key every call uses (fats shows each one's last 4 characters: keys oxy …6XBR · bd none · decodo none · gh none · auth.json). On a machine without a browser (CI, SSH), pipe the key in: printf %s "$KEY" | fats setup oxy checks it and saves it. Keys already exported: run fats setup import-env once: it checks them, copies them in where no key is saved, and never replaces a saved one. Replacing a key keeps the old file as auth.json.bak (0600).

ProviderKeyPage, no JSPage, renderedWeb search
free (plain HTTP, your IP)none$0——
Oxylabs Web APIfats setup oxy (import: OXYLABS_WEB_API_KEY)$0.0010$0.0015$0.0010
Bright Data Web Unlockerfats setup bd (import: BRIGHTDATA_API_KEY; zone BRIGHTDATA_UNLOCKER_ZONE)—$0.0015$0.0015
Decodo Web Data APIfats setup decodo (import: DECODO_AUTH_TOKEN)$0.0010$0.0015—
GitHub (fats gh)fats setup gh copies the gh CLI's token (import: GH_TOKEN)$0——

List prices per page, the ones dry:true and fats stats use. Oxylabs and Bright Data spend can be checked with fats account; Decodo has no usage read for this key, so its $ is the list price, never reconciled.

Turn one off without losing its key: fats setup oxy off, back with fats setup oxy on.

The free fetch is your own connection: one request per page from your IP, at most one start per site per second; a page waits its turn rather than buying a provider call. Providers use their own IPs and have no pace. fats setup free off sends every page to a provider instead, so every page costs.


MCP

One tool. One string. Same commands.

sh
fats setup mcp claude                                             # or codex, cursor: fats adds itselfclaude mcp add --scope user fats -- fats mcp                      # Claude Codecodex mcp add fats -- fats mcp                                    # Codex{"mcpServers": {"fats": {"command": "fats", "args": ["mcp"]}}}   # Cursor, Desktop, …

The tool is fats(cmd) and its card is ~60 tokens. An agent that knows fats u1#3 knows the whole tool.
MCP Registry: mcp-name: io.github.fatsearch/fats


Commands

CommandDoes
fats <url>fetch → clean → outline, cached as u1
fats u1#3read section 3
fats u1 pricefilter inside the page
fats u1 links · fats l4numbered links · follow one
fats rust async runtimeweb search → results as ids
fats gh rust markdownGitHub repos by stars
fats ./report.pdflocal file, one section per page
fats statsevery fetch: provider, ms, cost, tokens
… dry:truewhat would run, what it would cost

mods  limit:20  country:de  js:true  wait:30  fresh:true  ·  one screen of all of it: fats help  ·  how to use it well: fats guide


For agents

The agent skill is versioned in this repo (skills/fatsearch/SKILL.md): how to read pages without flooding context, and how to install, connect and verify fats when it is missing.

sh
npx skills add fatsearch/fatsearch        # Agent Skills standard: Claude Code, Codex, Cursor, Copilot, Gemini CLI, …gh skill install fatsearch/fatsearch      # the same through GitHub CLI ≥ 2.90

An agent without either CLI reads it pinned to a release: https://raw.githubusercontent.com/fatsearch/fatsearch/v0.2.5/skills/fatsearch/SKILL.md. That way the agent sees versioned text it can review, and nothing it runs comes from a website.

Docs as plain Markdown for agents: fatsearch.com/llms.txt.


Telemetry

FATSEARCH shares anonymous usage stats so we can fix what breaks. It never shares what you read or search.

  • Never sent: URLs, searches, page text, files, API keys, your IP address, any id.
  • Sent: fatsearch version, OS, which package (npm, Homebrew, cargo…), commands used, errors, which providers worked, crashes in our code.

See exactly what's sent with fats telemetry show. Turn it off in fats setup → Settings → Telemetry, with fats setup telemetry off, FATS_TELEMETRY=0 or DO_NOT_TRACK=1. Details: docs/telemetry.md


17–21 MB binary    4 ms start    5 ms cached read    $0 plain pages    $0.001–0.0065 hard pages (three keys)

17 MB (macOS arm64) to 21 MB (Linux x86_64) · 4 ms native; the npm shim adds Node's ~40 ms
no daemon · no browser · anonymous usage stats (off: fats setup telemetry off · FATS_TELEMETRY=0 · DO_NOT_TRACK=1) · every run →


What it doesn't do (yet)
  • match:near / match:topic: needs a local model
  • OCR for scanned PDFs → ! no_text
  • DOCX / XLSX → ! not_in_v1 zip
  • OS keychain: keys live in auth.json (mode 0600)
  • Remote MCP: stdio only
  • Logins: a page behind a login stays behind it

Each prints a ! row explaining what's missing and what to do. Never silence.


fatsearch.com

reference · benchmarks · changelog · security · contributing

MIT or Apache-2.0, at your option.

来源:README.md,提交 69f298a

工具

0
SourceWeft 曾在隔离沙箱中以无凭据方式启动该软件包一次,以列出其工具,但未能完成:该软件包类型无法在沙箱中运行。

版本历史

6
  1. v0.2.5最新Nov 7, 2026
  2. v0.2.4Oct 22, 2026
  3. v0.2.3Oct 21, 2026
  4. v0.2.2Oct 21, 2026
  5. v0.2.0Oct 20, 2026
  6. v0.1.2Oct 17, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分