
FrankenSurf
io.github.yail259由 GitHub 帳號 yail259 發布v0.50.0更新於 Oct 24, 2026
Read any web page and search the web: 28 tools, cheapest first, every page checked.
概覽
自架式的網頁讀取與搜尋伺服器,依成本由低到高抓取頁面,並在交給助理前確認頁面是否為真。
- 可以做什麼
- 將網頁讀取為文字或 Markdown,附品質回執、正文擷取與依 JSON Schema 的結構化擷取
- 搜尋網頁,支援站點、排除網域、時間範圍、地區與垂直領域篩選,並可啟用本機搜尋引擎
- 列出網站 URL 並爬取其中某個區段
- 批次讀取與搜尋,並監看網站的新頁面
- 以 trace ID 重試失敗的讀取,跳過已嘗試過的工具
- 適用情境
- 當助理需要讀取真實網頁或執行搜尋,而你希望採用自架、相容 Firecrawl 的方案,並且需要知道頁面是否只是驗證牆或空殼而非真實內容時適用。適合對頁面品質有要求的研究與擷取流程。
- 執行需求
- 以 stdio 在本機執行,透過 uvx 或 pip 從 PyPI 安裝(Python 3.12+,Linux、macOS,或經 WSL 的 Windows)。需執行一次安裝步驟以取得瀏覽器等免費工具;Docker 為選用。免費工具不需帳號或金鑰;付費備援需各自的 API 金鑰並明確開啟。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 FrankenSurf,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
Frankensurf
Access 96% of the web, cheaply and accurately.
A free, self-hosted alternative to Firecrawl: one container, the same API, and every page checked before your agent reads it.
[PyPI] [Python] [License] [GitHub stars] [MCP server]
Website · Docs · Quick start · Benchmark · Why I built it
Most scrapers count a 200 as a success, so your agent ends up reading challenge pages, empty app shells and menus, and answering anyway. Frankensurf reads each page with the cheapest tool that works, checks it's the real page, and climbs to stealth browsers (or paid APIs, if you allow them) only when a site pushes back. It speaks Firecrawl's API, so anything with a Firecrawl URL setting can point at it.
[Share of 150 sites read correctly: Frankensurf 96%, Zyte 86%, Firecrawl 85%, free tools only 88%]
On 150 sites picked blind: 96% read right with paid fallbacks against 85% for Firecrawl's cloud on its own, and 88% with free tools only. On a harder blind set of 148 less-known sites: 88.5% against 70.3%, and 81.8% free. Against a self-hosted Firecrawl on the same sites, 126 read against 89 (details, losses included).
Quick start
As a Firecrawl-compatible server (one container, free tools inside, no account needed):
Then point your tool's Firecrawl URL at http://localhost:3002 with that key
(which tools, and how).
As a Python package and CLI (Python 3.12+, on Linux, macOS, or Windows through WSL):
The read climbs until it gets the real page:
frankensurf install works like playwright install: name just the tools you want
(frankensurf install search chromium), add --with-deps for the browsers' system libraries on
Linux, --list to see what's installed where, and frankensurf uninstall all to remove it. No
Docker needed. Each release is installed from PyPI on fresh Ubuntu and macOS machines and checked.
Use it
From an agent, as an MCP server (setup for each client):
From Python:
For a long-running service, keep one Runtime open: async with Runtime() as web: await web.read(url).
Map and crawl: fs.map(url) lists a site's URLs; fs.crawl(url, limit=50) reads a section of it as markdown.
Agent mode (pip install "frankensurf[agent]", any LiteLLM model): fs.ask("question") searches, reads and
answers with sources, and says what it couldn't read; fs.extract(urls, schema=...) and fs.summarize(url).
Agent mode.
In Docker, one install for your whole network: docker run -p 3002:3002 -e FRANKENSURF_API_KEY=... ghcr.io/yail259/frankensurf
(Docker).
From any tool that takes a Firecrawl URL (GPT Researcher, Hermes Agent, OpenClaw, Open WebUI, Dify, LibreChat, n8n, LangChain, LlamaIndex and others):
frankensurf serve, then point it at http://127.0.0.1:3002 (setup).
From the command line:
In Claude Code as a plugin (the MCP server plus the skill that teaches Claude to use it):
From LangChain, the OpenAI Agents SDK or CrewAI (pip install "frankensurf[langchain]", and so on):
You get raw page data, not answers: text or markdown, JSON-LD, the page's own JSON, images, and
the receipt. Your agent decides what the page means. If it isn't what it wanted, it asks again with
retry_of=<trace_id> and Frankensurf skips every tool it already tried.
Benchmark
Cost per 1,000 correct pages: Frankensurf's free tools $0 in fees, about $0.01 of a $5/month server (87–88% right); with paid fallbacks $0.22 (96%); Firecrawl on its own $0.71 on its Scale plan, $0.98 on Standard (85%). How that's worked out.
scripts/toolbench.py runs each tool on its own, then Frankensurf, on the same pages with the same
content checks. The newest set: 148 less-known sites in 15 categories, picked before any was read,
every tool on its own, paid ones included (28 October 2026, rows and corrections in
benchmarks/2026-10-28-heldout9/).
- Frankensurf read 28 sites Firecrawl missed; Firecrawl read 1 it missed.
- Every tool's reads put together come to 84.5%; Frankensurf reads more than that, through retries and rescues.
- Its slowest tenth takes 33.0 s against Firecrawl's 10.9 s.
- This set is harder than the last: every tool read 10 to 20 points less. A rerun the same evening gave 87.2% and 79.7%.
The set before (150 sites, 11 October 2026, rows in benchmarks/2026-10-11/):
- Frankensurf read 17 sites Firecrawl missed; Firecrawl read none it missed.
- With no paid tools at all it is level with the best paid tool on its own (88.0% against 86.0% and 84.7%; at 150 sites that gap is within the noise).
- Its slowest reads are slower: the slowest tenth takes 25.7 s against Firecrawl's 10.6 s, when a read climbs several tools.
- Not a one-off: 95.3% vs 85.3% on the set the day before; 89.5% vs 80.3% and 88.5% vs 74.1% on earlier fresh sets.
Every tool on the 11 October set
Medians are over pages read; cost is per 1,000 pages read right. ZenRows and Scrapfly are left out (their plans ran out of credits). From a fresh cloud VM, whose data-centre address sites wall more often: free tools 82.0%, lightning mode 84.0% at a 1.2 s median. See Benchmarks.
Against self-hosted Firecrawl
Firecrawl is open source too, so the fair question for anyone running their own is how the Firecrawl you'd self-host does. Its docs say self-hosted instances don't get Fire-engine, the anti-bot layer of its cloud. Same 150 sites, 23 October 2026, both servers in Docker on one machine, each site read by both with the first reader alternating site by site:
- Frankensurf read 38 sites the self-hosted Firecrawl didn't; Firecrawl read 1 it didn't.
- The slower tail and slower give-ups are the cost of the extra pages: where self-hosted Firecrawl tries once and stops, Frankensurf climbs to stealth browsers and checks each page before handing it back.
- Rows, scripts and setup:
benchmarks/2026-10-23-self-hosted-firecrawl/. Run it on your own pages withfrankensurf compare urls.txt --against http://localhost:3002.
Search
search uses free sources first and checks every result: on topic, the right kind of page, inside
the date window. Exa, Brave, Tavily, Serper and other paid sources join only when you allow paid
tools. Judged blind (results pooled and shuffled, which tool found them hidden), useful results in
the top five:
Free, it beats Firecrawl's search: better on 35 queries, worse on 5. With paid allowed it is level
with Exa. The local search engine (frankensurf install search, SearXNG without Docker) makes the
free tier much stronger. v0.41 improved free search again: on a fresh blind set of 120
queries it beat v0.40 on 41 and lost on 12 (3.42 against 2.71 useful results of 5,
benchmarks/2026-10-14-search-v041/). Details in
benchmarks/2026-10-13-search/.
What else is in the box
Reading: quality grades, main content, racing slow reads, PDFs
- Every read carries
receipt.quality:good,partialorpoor, with flags such aspaywall,menusorplaceholder, so an agent knows when a page didn't really come through. --schema product.json(MCPschema) fills a JSON Schema from the page's JSON-LD, microdata, meta tags and own JSON intoextracted, and climbs to a stronger tool while a required field is missing (Structured fields).--main(MCPmain_content=True) addsmain_text: the article without menus, footers and banners (best withpip install "frankensurf[main]").- A read with no page after 3 seconds starts two more free tools beside it and keeps the first
complete page (
--lightningraces from the start). - A URL that answers "not found" is looked up with the site's own search;
receipt.rescuedsays so. - Still walled? Allow a real Chrome on your machine (
--real-browser, with its own profile, never yours) or a second connection (FRANKENSURF_EGRESS).
Search: verticals, boolean queries, local engine
--site,--exclude-domain,--recencyand--regionon every source, and a--vertical(news, reference, discussions, qa, code, papers, books) backed by official free APIs.- Monitoring-style queries (
"Acme" OR "Acme Corp" (acquisition OR layoffs)) are judged by the name they're about, and a weak answer is retried once with just the name. --mode mergeasks every source at once and fuses the results.frankensurf search-engine start|stop|statusmanages the local SearXNG; search restarts it after a reboot.
Agents: skill, profiles, handoff, site modules
- A bundled skill teaches agents the tools: the MCP server sends it as its instructions, and
frankensurf skill installadds it to~/.claude/skills. - Profiles: log in once and any tool can use the session; the model never sees cookies or keys.
- Human handoff: for a CAPTCHA or 2FA only a person can clear, it opens the page for you, then carries on.
- Site modules: save what your agent learns about a site as data.
frankensurf module discover URL --query "desk lamp" --savefinds the site's search, reads the results and saves a module; after that, searches on that site come back as structureditems. - Shared site knowledge:
frankensurf share syncstarts from which tool reads which site, as the community learned it;share exportwrites yours to review and contribute (opt in both ways). frankensurf watch-sites URL… --since DATElists new pages from the feeds and sitemaps sites publish.
Paid tools and budgets
Everything works with no keys. Paid tools are opt-in and only come in once a site has walled a free
tool, cheapest likely success first. Set their keys (for example FIRECRAWL_API_KEY) and pass
--paid; --max-cost USD caps a read. From Python: allow_paid_fallbacks and max_cost_usd.
See Paid tools and budgets.
How it works
Every way to fetch a page is a rung: plain HTTP and markdown negotiation, browsers, stealth browsers and signed requests, hosted browsers, paid APIs, and finally a person clearing the wall in a visible browser. A read starts at the cheapest rung and climbs only when a page pushes back. Every tool is a plugin, so new ones slot in as another rung.
See How escalation works and the full list of integrations.
Known walls
It's an alpha, and some sites still win:
- Need the paid tools: in a free-only spot check, Etsy, Home Depot, Yelp, Crunchbase and G2 blocked every free tool.
- Beat everything so far: Shopee, Temu and Idealista.
- Social sites without a login: LinkedIn, X, YouTube, Threads, Bluesky and Reddit read fine. Instagram, TikTok, Facebook and Pinterest show only the public shell; the posts need a login.
- Logged-in pages (your feeds, your orders) need a profile.
- A slow tail: most reads take a few seconds, but one in ten climbs several tools and takes 25 s or more.
Found a site it can't read? Report it; every report becomes a test case.
Develop
The product design is in SPEC.rst and contributor rules in AGENTS.md. New tools are plugins,
never branches in Core: see Writing a plugin and the
example in examples/frankensurf-plugin-example. The website and docs live in site/.
Licence
Apache-2.0. See LICENSE.
來源:README.md,提交 d3a088d
工具
0版本歷史
2- v0.50.0最新Oct 17, 2026
- v0.43.0Oct 14, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分