KnockOutEZ/wigolo
GitHub: KnockOutEZ/wigolo
基于 MCP 协议的本地优先网络智能工具,为 AI 编程 agent 提供免密钥、零成本的搜索、抓取、爬虫与研究能力。
Stars: 303 | Forks: 23
基于 MCP 的本地优先网络智能工具 —— **无需密钥,不依赖云服务,无按量计费。**
兼容 **Claude Code · Cursor · Codex · Gemini CLI · VS Code · Windsurf · Zed · Antigravity**
[](https://www.npmjs.com/package/wigolo)
[](https://nodejs.org)
[](https://modelcontextprotocol.io)
[](#license)
[](#beta--feedback)
[快速开始](#quickstart) · [工具](#tools) · [为什么选 wigolo](#why-its-different) · [基准测试](#benchmark) · [架构](#architecture) · [配置](#configuration) · [反馈](#beta--feedback) · [常见问题](#faq) · [可用平台](#available-on) · [贡献](#contributing)
any MCP client"] A -->|MCP over stdio| B["wigolo
10 tools · dynamic instructions
in-process browser pool + cache + models"] B --> C{"Tool layer"} C --> T1["search · fetch · crawl · extract"] C --> T2["cache · find_similar · research · agent"] T1 --> F["⚙️ Fetch router
HTTP → TLS-impersonation → headless browser
per-domain learning"] T1 --> S["⚙️ Search
18 engines → RRF fusion → cross-encoder rerank
explainable evidence score"] T2 --> DB[("🗄️ SQLite
url cache · FTS5 keyword · sqlite-vec")] T2 --> ML["🧠 On-device ML
BGE-small embeddings (384d)
MiniLM cross-encoder reranker"] F -.->|optional| LLM["☁️ Cloud LLM
synthesis only · opt-in"] S -.->|optional| SX["🔀 Aggregator backend
opt-in legacy / hybrid"] F --> WEB["🌍 Public web"] S --> WEB style B fill:#7c3aed,stroke:#5b21b6,color:#fff style WEB fill:#0ea5e9,stroke:#0369a1,color:#fff style DB fill:#1e293b,stroke:#334155,color:#fff style LLM stroke-dasharray: 5 5 style SX stroke-dasharray: 5 5 ``` - **代码胜过模型。** 确定性的工作 —— 规范化、排名融合、去重、schema 匹配、哈希处理 —— 永远不会触及 LLM。模型仅用于判断(可选加入,且按请求设加上限)。由 LLM 填充的字段会与来源进行核对,如果不存在则置空,因此幻觉不会进入你的输出。 - **基于可观测信号的路由。** 抓取阶梯根据它*看到*的内容升级到真实浏览器 —— SPA 标记、挑战主体、单薄内容 —— 而不是猜测域名。它会按域名进行学习,并在某个网站不再需要它时忘记该规则。 - **透明、诚实的结果。** 每个结果都附带分数明细和查询理解块;降级状态总是被如实呈现,绝不隐瞒。
CLI 命令
| 命令 | 功能描述 | |---------|--------------| | `wigolo` / `wigolo mcp` | 启动 MCP stdio 服务器(默认命令)。 | | `wigolo init` | 设置 wigolo:安装组件,接入检测到的 agent。在 CI 中使用 `--non-interactive --agents=环境变量 —— 搜索与引擎
| 变量 | 默认值 | 作用 | |-----|---------|--------| | `WIGOLO_SEARCH` | `core` | `core`(直接引擎)/ `searxng`(旧版)/ `hybrid`(核心 + 回退)。 | | `BRAVE_API_KEY` | — | 设置后,Brave 将加入引擎池(仅限环境变量,不持久化)。 | | `WIGOLO_GITHUB_TOKEN` | — | 将 GitHub 代码搜索限制从 10 次请求/分钟提升至 30 次;启用组织私有搜索(仅限环境变量)。 | | `SEARXNG_URL` | — | 外部聚合器 URL;设置后,跳过本地引导。 | | `SEARXNG_MODE` | `native` | `native`(Python venv)或 `docker`。 | | `SEARXNG_PORT` | `8888` | 本地聚合器的端口。 | | `SEARXNG_QUERY_TIMEOUT_MS` | `8000` | 对聚合器的每次查询超时时间。 | | `WIGOLO_MULTI_QUERY_CONCURRENCY` | `5` | 最大并行(查询 × 引擎)任务数。 | | `WIGOLO_MULTI_QUERY_MAX` | `10` | 规范化后的最大唯一查询数。 | | `WIGOLO_QUERY_EXPAND_VARIANTS` | `5` | 启发式查询扩展变体数。 | | `SEARCH_NARROW_RENDER_MAX_CANDIDATES` | `3` | 在丰富内容期间,限定于特定域名(`include_domains`)的搜索在浏览器引擎中渲染结果页面的最大候选数 —— 用于从大量依赖 JS 的文档站点恢复真实内容。仅限于少数 URL;广泛搜索永远不会升级。设为 `0` 可禁用。 |环境变量 —— 抓取、网络与 TLS
| 变量 | 默认值 | 作用 | |-----|---------|--------| | `USER_AGENT` | 轮换的 Chrome UA | 覆盖 User-Agent 标头。 | | `FETCH_TIMEOUT_MS` | `10000` | HTTP 请求超时。 | | `FETCH_MAX_RETRIES` | `2` | 针对 429 / 502 / 503 / 网络错误的重试预算。 | | `MAX_REDIRECTS` | `5` | 手动模式下的重定向上限。 | | `PLAYWRIGHT_LOAD_TIMEOUT_MS` | `15000` | 浏览器 `page.load` 等待时间。 | | `PLAYWRIGHT_NAV_TIMEOUT_MS` | `30000` | 浏览器导航超时。 | | `SEARCH_FETCH_TIMEOUT_MS` | `15000` | 搜索中针对每个结果的水合抓取时间。 | | `SEARCH_TOTAL_TIMEOUT_MS` | `30000` | 总体搜索预算。 | | `USE_PROXY` / `PROXY_URL` | `false` / — | 通过代理路由抓取。 | | `WIGOLO_TLS_TIER` | `off` | `off` / `auto`(按域名学习)/ `on`(始终优先尝试 TLS)。 | | `WIGOLO_TLS_BROWSER` | `chrome_142` | TLS 指纹配置文件(`环境变量 —— 浏览器池与认证
| 变量 | 默认值 | 作用 | |-----|---------|--------| | `MAX_BROWSERS` | `3` | 每种浏览器类型的最大并发上下文。 | | `BROWSER_IDLE_TIMEOUT` | `60000` | 空闲上下文驱逐时间(毫秒)。 | | `BROWSER_FALLBACK_THRESHOLD` | `3` | 强制使用浏览器前某域名的 HTTP 失败次数。 | | `WIGOLO_BROWSER_TYPES` | 自动(全部 3 种) | 要使用的浏览器 CSV 列表(chromium, firefox, webkit)。 | | `WIGOLO_CDP_URL` | — | 用于远程 / 已登录浏览器的 Chrome DevTools 端点。 | | `WIGOLO_AUTH_STATE_PATH` | — | Playwright `storageState.json`(cookies / localStorage)。 | | `WIGOLO_CHROME_PROFILE_PATH` | — | 完整的 Chrome `User Data` 目录(每次使用时复制到临时目录)。 |环境变量 —— 缓存与爬虫
| 变量 | 默认值 | 作用 | |-----|---------|--------| | `CACHE_TTL_SEARCH` | `86400` | 搜索结果缓存 TTL(秒)。 | | `CACHE_TTL_CONTENT` | `604800` | 页面内容缓存 TTL(7 天)。 | | `WIGOLO_FAST_STALE_MAX_HOURS` | `24` | 在 `cache` 模式下,接受不超过此时长(小时)的条目。 | | `WIGOLO_FAST_TIMEOUT_MS` | `800` | 缓存模式回退抓取的严格超时时间。 | | `CRAWL_CONCURRENCY` | `2` | 每个公共域名的并发抓取数。 | | `CRAWL_DELAY_MS` | `500` | 每个公共域名请求间的延迟。 | | `CRAWL_PRIVATE_CONCURRENCY` | `10` | 每个私有域名的并发数(localhost / RFC1918)。 | | `CRAWL_PRIVATE_DELAY_MS` | `0` | 每个私有域名的延迟。 | | `RESPECT_ROBOTS_TXT` | `true` | 为 false 时,不获取 robots.txt。 | | `VALIDATE_LINKS` | `true` | 为 false 时,跳过断链探测。 | | `WIGOLO_CRAWL_INDEX` | — | `1` → 抓取的页面将排入嵌入队列。 | | `WIGOLO_WAIT_FOR_INDEX` | — | `1` → 嵌入队列按页面同步运行。 |环境变量 —— 重排序器、嵌入与相关性
| 变量 | 默认值 | 作用 | |-----|---------|--------| | `WIGOLO_RERANKER` | `onnx` | `onnx`(交叉编码器)/ `none`(仅限共识 + 权威性 + 近期度提升)。 | | `WIGOLO_RERANKER_MODEL` | `Xenova/ms-marco-MiniLM-L-6-v2` | 交叉编码器模型 ID。 | | `WIGOLO_RERANKER_IDLE_TIMEOUT_MS` | `300000` | 最后一次使用后将模型保持活跃 5 分钟。 | | `WIGOLO_EMBEDDING_MODEL` | `BAAI/bge-small-en-v1.5` | 嵌入模型(384 维)。 | | `WIGOLO_EMBEDDING_IDLE_TIMEOUT` | `1800000` | 空闲卸载(30 分钟)。 | | `WIGOLO_EMBEDDING_MAX_TEXT_LENGTH` | `8000` | 嵌入前的截断长度。 | | `WIGOLO_RELEVANCE_THRESHOLD` | `0` | agent 抓取后过滤器的最小相关性。 | | `WIGOLO_FIND_SIMILAR_COLD_START_THRESHOLD` | `0.02` | 低于此融合分数时,`find_similar` 会发出 `cold_start`。 |环境变量 —— LLM 集成(全部可选)
| 变量 | 默认值 | 作用 | |-----|---------|--------| | `WIGOLO_LLM_PROVIDER` | — | `anthropic` / `openai` / `gemini` / `groq` / 自定义 URL(Ollama, vLLM, LM Studio)。 | | `WIGOLO_LLM_MODEL` | — | 通用模型覆盖。 | | `WIGOLO_LLM_MODEL_{ANTHROPIC\|OPENAI\|GEMINI\|GROQ}` | — | 特定于提供商的模型覆盖(优先级最高)。 | | `WIGOLO_LLM_MAX_CALLS_PER_REQUEST` | `1` | 每次工具调用 LLM 次数的硬性上限。 | | `WIGOLO_LLM_CACHE_TTL_DAYS` | `7` | LLM 响应缓存 TTL。 | | `WIGOLO_LOCAL_LLM` | `off` | 可选择加入的无密钥本地语言模型层:`off`(默认)/ `auto`(自动检测本地模型服务器)/ 显式的 `http(s)://` 端点。off 保持无密钥路径不变。 | | `WIGOLO_LOCAL_LLM_MODEL` | — | 本地层的首选模型名称;未设置时自动选取已安装的模型。 | | `IGOLO_LOCAL_LLM_BASE_URL` | `http://localhost:11434` | 当 `WIGOLO_LOCAL_LLM=auto` 时探测的端点(回退到 `WIGOLO_LLM_BASE_URL`,然后是默认的本地服务器)。 | | `ANTHROPIC_API_KEY` / `OPENAI_API_KEY` | — | 每次调用时读取;从不持久化。 | | `GEMINI_API_KEY` / `GOOGLE_API_KEY` | — | Gemini 提供商密钥(两者皆可;每次调用时读取,从不持久化)。 | | `GROQ_API_KEY` | — | 同上。 | | `WIGOLO_LLM_API_KEY` | — | 用于 `WIGOLO_LLM_PROVIDER` 指定提供商的通用密钥。特定于提供商的变量优先;在自动检测期间被忽略。 | 密钥也可以存放在 OS 钥匙串或经 AES 加密的文件中(`wigolo init` / `wigolo config`)—— 绝不会存放在 `config.json` 中。 |环境变量 —— 守护进程、预热、路径、日志与杂项
| 变量 | 默认值 | 作用 | |-----|---------|--------| | `WIGOLO_DATA_DIR` | `~/.wigolo` | 缓存、模型、密钥、插件、聚合器 venv 的根目录。 | | `WIGOLO_CONFIG_PATH` | `${DATA_DIR}/config.json` | 持久化配置路径。 | | `WIGOLO_DAEMON_PORT` | `3333` | `wigolo serve` 的监听端口。 | | `WIGOLO_DAEMON_HOST` | `127.0.0.1` | 绑定地址。 | | `WIGOLO_EAGER_WARMUP` | — | `1` → 在启动时预热嵌入 + 重排序器(触发即忘)。 | | `WIGOLO_BOOTSTRAP_MAX_ATTEMPTS` | `3` | 聚合器引导重试限制。 | | `WIGOLO_HEALTH_PROBE_INTERVAL_MS` | `30000` | 后台后端健康探测周期。 | | `WIGOLO_PLUGINS_DIR` | `${DATA_DIR}/plugins` | 插件发现根目录。 | | `LOG_LEVEL` | `info` | `debug` / `info` / `warn` / `error`。 | | `LOG_FORMAT` | `json` | `json` 或对人类友好的 `text`。 | | `WIGOLO_TELEMETRY` | — | `1` → 本地 NDJSON 事件日志(默认关闭,无 PII)。 | | `WIGOLO_TELEMETRY_ENDPOINT` | — | 同时将事件“触发即忘”地 POST 到此 URL。 | | `WIGOLO_TUI_REDUCED_MOTION` | — | `1` → 禁用 TUI 加载动画 / 动画效果。 |常用的单次调用选项(工具参数)
| 选项 | 适用工具 | 说明 | |--------|-------|-------| | `mode` | fetch, search, crawl, extract, find_similar | `cache`(快速,可接受旧数据)/ `default`(智能路由)/ `stealth`(全功能浏览器,无缓存)。 | | `search_depth` | search | `ultra-fast`(仅缓存)/ `fast` / `balanced`(默认)/ `deep`(证据 + 重排高亮)。 | | `query` | search | `string` 或 `string[]` —— 数组将并行扩散。 | | `include_domains` / `exclude_domains` | search, find_similar, research | 硬性白名单 / 黑名单(主机后缀匹配)。 | | `format` | search | `answer` / `stream_answer` —— 触发带引用的 LLM 合成。 | | `citation_format` | search, crawl, research, agent | `numbered` / `json` / `anthropic_tags`。 | | `time_range` / `from_date` / `to_date` | search | 时间范围边界。 | | `render_js` | fetch | `auto` / `always` / `never`。 | | `use_auth` | fetch, crawl | 通过配置的认证路由(CDP > Chrome 配置文件 > 存储状态)。 | | `actions` | fetch | 连续的浏览器操作(`click`、`type`、`wait`、`wait_for`、`scroll`、`screenshot`)。 | | `section` | fetch | 提取某个标题下的 markdown 子树。 | | `strategy` | crawl | `bfs` / `dfs` / `sitemap` / `auto` / `map`。 | | `mode` (extract) | extract | `selector` / `tables` / `metadata` / `schema` / `structured` / `brand`。 | | `named_schema` | extract | `Article` / `Recipe` / `Product` / `CodeSnippet` / `Paper` / `EventListing`。 | | `depth` | research | `quick` / `standard` / `comprehensive`。 | | `max_pages` / `max_time_ms` | agent | 单次调用的页面上限(默认 3)和实际时间预算。 | | `max_tokens_out` | 大多数 | 总体输出 token 预算(默认 4000)。 | | `include_full_markdown` | fetch, crawl, research, agent | `false` → 返回证据摘录而非完整正文。 |免费?有什么附加条件?
设计上没有任何陷阱。那些昂贵的部分 —— 排序、嵌入、浏览器引擎 —— 都在*你的*硬件上运行,因此没有需要收回的单次查询成本,也没有按量计费的理由。依靠捐赠维持;AGPL 许可证在法律上防止了其演变为闭源托管产品的诱饵和掉包行为。质量真的能与付费服务媲美吗?
运行一次查询自己判断 —— 上面的基准测试部分是一次实时的 4 方对比运行,而不是一张图表。日常的 agent 查询能达到同等水平;付费工具在一些深度提取的边缘情况下仍然占据优势,而爬虫是 wigolo 最强的一面。每个结果都会展示其评分,因此你无需盲信任何人。这种抓取方式可以接受吗?
wigolo 像浏览器一样阅读公共网络 —— 默认遵守 robots.txt,带有按域名的速率限制,仅针对单台机器上的单个 agent 使用研究级的访问量。它是有意设计为礼貌访问的光谱一端,而不是一个大规模抓取平台。AGPL —— 我可以在工作中使用它吗?
是的,免费、全公司范围皆可使用。该许可证只有在*当你修改了 wigolo 并将其作为网络服务运行时*才会产生约束 —— 届时你必须公开那些修改内容。将其作为本地开发工具使用不承担任何义务。有关商业授权的问题:请联系我们。为什么需要 1.5 GB 的磁盘空间?
那是 on-device 的大脑:包含一个完整的浏览器引擎,以及云服务在他们那边运行并向你收费的排序和嵌入模型。磁盘很便宜;按量计费的表可不便宜。wigolo 是免费的,并将一直保持如此 —— 靠维护而非付费墙维持。 如果它为你省下了一笔按量计费的搜索账单,一个 ⭐、一个尖锐的问题,或者一杯 **[☕ 咖啡](https://buymeacoffee.com/knockoutez)** 都能帮助它持续发展。 由 @KnockOutEZ 构建并维护 · ktowhid20@gmail.com
标签:AI编程助手, MCP服务器, MITM代理, 暗色界面, 本地搜索引擎, 自动化攻击, 请求拦截