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.

概览

AI 生成的概览

自托管的网页读取与搜索服务器,按成本从低到高抓取页面,并在交给助手前校验页面是否真实。

可以做什么
  • 读取网页为文本或 Markdown,附带质量回执、正文提取与按 JSON Schema 的结构化抽取
  • 搜索网页,支持站点、排除域名、时间范围、地区与垂直领域筛选,并可启用本地搜索引擎
  • 列出站点 URL 并抓取其中某个区块
  • 批量读取与搜索,并监控站点的新页面
  • 用 trace ID 重试失败的读取,跳过已尝试过的工具
适用场景
当助手需要读取真实网页或执行搜索,而你希望使用自托管、兼容 Firecrawl 的方案,并且需要知道页面是否只是验证墙或空壳而非真实内容时适用。适合对页面质量有要求的研究与抓取流程。
运行要求
以 stdio 在本地运行,通过 uvx 或 pip 从 PyPI 安装(Python 3.12+,Linux、macOS,或经 WSL 的 Windows)。需执行一次安装步骤来获取浏览器等免费工具;Docker 可选。免费工具无需账号或密钥;付费回退需各自的密钥并显式开启。
安装前请注意
付费回退工具需显式开启且会产生费用,可用最高费用上限加以限制。可选功能会使用独立的真实 Chrome 配置、第二条出口连接或已保存的登录配置,人工接管会打开可见浏览器。站点模块与共享站点知识可导出并贡献,分享前请先审阅。

安装

在 SourceWeft 中

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

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

其他 MCP 客户端

参照 仓库 中的启动说明。

README

[Frankensurf]

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.

Gets past walls
41 web tools behind one call: plain HTTP, Jina Reader, browsers, free stealth browsers, then paid APIs only if you allow them.
Every page checked
A challenge page, a login wall or a search page whose results never loaded counts as a failure, with a receipt saying why.
Drop-in for Firecrawl
Same API, one Docker container. Check it on your own URLs first with frankensurf compare.

[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):

bash
docker run -d -p 3002:3002 --shm-size=1g -e FRANKENSURF_API_KEY=pick-a-key ghcr.io/yail259/frankensurf

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):

bash
pip install "frankensurf[mcp]"frankensurf install        # every free tool: browsers, stealth browsers, local search, Crawl4AIfrankensurf read "https://www.walmart.com/search?q=air+fryer" --explain

The read climbs until it gets the real page:

text
https://www.walmart.com/search?q=air+fryer  ✗ http                   CAPTCHA                0.4s  ✗ local                  CAPTCHA                1.5s  ✓ camoufox               got the page           15.6s
air fryer - Walmart.com24,192 characters via camoufox, complete (107 results), free

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):

bash
claude mcp add frankensurf -- frankensurf-mcp

From Python:

python
import frankensurf as fs
page = fs.read("https://example.com/pricing")if page.ok:    print(page.title, page.text[:500])else:    print("couldn't read it:", page.failure)    # {"code": "CAPTCHA", "message": ...}
pages = fs.batch(urls, links=True)               # paced per site, in orderhits = fs.search("playwright python tutorial", recency="month")page = await fs.aread(url)                       # aread, abatch, asearch inside async code

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:

bash
frankensurf read https://example.com --markdownfrankensurf search playwright python tutorial --recency weekfrankensurf watch https://news.ycombinator.com/ --link-pattern 'item\?id=\d+'

In Claude Code as a plugin (the MCP server plus the skill that teaches Claude to use it):

/plugin marketplace add yail259/frankensurf/plugin install frankensurf@frankensurf

From LangChain, the OpenAI Agents SDK or CrewAI (pip install "frankensurf[langchain]", and so on):

python
from frankensurf.agent_tools import langchain_tools   # or openai_agents_tools, crewai_toolstools = langchain_tools()                              # frankensurf_read, frankensurf_search

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/).

ToolSites readMedianCost per 1k
Plain HTTP only41.9%0.9 sfree
Jina Reader only68.2%3.3 sfree
Firecrawl only70.3%4.3 s$5.22
Zyte only70.3%9.5 snot reported
Frankensurf, free tools only81.8%4.8 s$0
Frankensurf, with paid fallbacks88.5%4.9 s$0.96
  • 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/):

ToolSites readMedianCost per 1k
Plain HTTP only48.7%1.2 sfree
Camoufox only68.7%10.9 sfree
Jina Reader only73.3%1.5 sfree
Firecrawl only84.7%4.6 s$4.28
Zyte only86.0%10.7 snot reported
Frankensurf, free tools only88.0%3.6 s$0
Frankensurf, with paid fallbacks96.0%2.9 s$0.98
  • 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
ToolSites readMedianCost per 1k
Patchright only38.7%4.1 sfree
Headless Chromium only40.7%2.7 sfree
Plain HTTP only48.7%1.2 sfree
Camoufox only68.7%10.9 sfree
Scrapling only68.7%8.5 sfree
Jina Reader only73.3%1.5 sfree
Firecrawl only84.7%4.6 s$4.28
Zyte only86.0%10.7 snot reported
Frankensurf, free tools only88.0%3.6 s$0
Frankensurf, with paid fallbacks96.0%2.9 s$0.98

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:

Self-hosted Firecrawl 2.11.604Frankensurf 0.52.0 (free tools)
Pages read right89 of 150126 of 150
Wrong page passed on as the page185
Nothing back4319
Memory while readingabout 4.2 GB, six containers1.4 GB, one container
Median, pages both read4.2 s4.8 s
Slowest tenth, pages both read9.8 s17.8 s
Time to give up on a page (median)1.5 s16.5 s
  • 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 with frankensurf 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:

Blind set 7 (120 queries)Useful results (of 5)Cost per 1k
Frankensurf, paid allowed4.67$9.38
Exa only4.66$9.50
Frankensurf, free (with the local search engine)3.83$0

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, partial or poor, with flags such as paywall, menus or placeholder, so an agent knows when a page didn't really come through.
  • --schema product.json (MCP schema) fills a JSON Schema from the page's JSON-LD, microdata, meta tags and own JSON into extracted, and climbs to a stronger tool while a required field is missing (Structured fields).
  • --main (MCP main_content=True) adds main_text: the article without menus, footers and banners (best with pip install "frankensurf[main]").
  • A read with no page after 3 seconds starts two more free tools beside it and keeps the first complete page (--lightning races from the start).
  • A URL that answers "not found" is looked up with the site's own search; receipt.rescued says 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, --recency and --region on 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 merge asks every source at once and fuses the results.
  • frankensurf search-engine start|stop|status manages 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 install adds 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" --save finds the site's search, reads the results and saves a module; after that, searches on that site come back as structured items.
  • Shared site knowledge: frankensurf share sync starts from which tool reads which site, as the community learned it; share export writes yours to review and contribute (opt in both ways).
  • frankensurf watch-sites URL… --since DATE lists 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.

[One read of Crunchbase: plain HTTP, headless Chrome, Steel and Camoufox were blocked; Firecrawl got through]

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

bash
python3 -m venv .venv.venv/bin/pip install -e '.[test,mcp]'.venv/bin/frankensurf installPYTHONPATH=.:src .venv/bin/pytest -q

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
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

2
  1. v0.50.0最新Oct 17, 2026
  2. v0.43.0Oct 14, 2026

评分

已满足适用检查项的 50%

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

  • 近 30 天内可连通25 分

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

  • 已声明认证方式10 分

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

  • 已列出工具15 分

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

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