网页内容清理工具

WebShift是一个Rust库和MCP服务器,用于将嘈杂的网页转换为适合LLM使用的干净、大小合适的文本。

  • by x-hannibal
  • Rust
  • 本地部署
  • 8 星标
  • 更新于
在 GitHub 查看 annibale-x/webshift

使用说明

WebShift


什么是WebShift

WebShift是一个Rust库和MCP服务器,可以将嘈杂的网页转换为 用于LLM消费的干净、大小合适的文本。

原始HTML大多是垃圾:脚本、广告、导航菜单、cookie横幅、, 跟踪像素。将其直接输入LLM会淹没上下文窗口 有数万个无用的代币,没有推理的余地。 WebShift去除所有噪音,对文本进行消毒,并严格执行 调整预算,使模型只接收重要的内容。

你得到了什么

根据您启用的功能,WebShift可以有四种:

用例 机箱 功能标志 它的作用
HTML去噪器 webshift default-features = false clean() --纯Rust HTML到文本管道。去除噪声元素,对Unicode/BiDi进行消毒,压缩空白。零网络,零配置。进入任何为LLM处理web内容的Rust项目。
HTML文本重写器 webshift features = ["text-map"] extract_text_nodes() + replace_text_nodes() --从HTML中提取单个文本节点,操纵它们(翻译、重写、简化),并重建结构完整的HTML。标签、属性和链接永远不会被触碰。
Web内容客户端 webshift default 或 features = ["llm"] fetch() + query() --带大小上限的流式HTTP提取器,8个搜索后端,BM25重新排序,可选LLM查询扩展和摘要。从搜索查询到结构化结果的完整流程。
MCP服务器 webshift-mcp 所有功能 本机二进制(mcp-webshift)这暴露了 webshift_query, webshift_fetch,以及 webshift_onboarding 通过MCP标准。单一静态二进制文件,零运行时依赖关系。

何时使用WebShift

  • 你正在构建一个需要网络搜索的人工智能代理,你想要干净, 预算控制的文本,而不是原始HTML。
  • 您正在Rust管道中处理网页,需要一个可靠的 HTML到文本清洁器,在不丢失真实内容的情况下去除噪音。
  • 您需要LLM来翻译、重写或简化HTML中的文本 在不损坏标记的情况下,文本映射为您提供了一个安全的往返。
  • 您需要一个作为单个二进制文件工作的MCP web搜索服务器-- 没有Python,没有pip,没有venv,没有Docker(除非你想要)。
  • 您需要对输出大小进行严格保证:每页上限、总预算 上限、流媒体下载限制。

何时不使用WebShift

  • 你需要一个无头浏览器来渲染JavaScript繁重的SPA。 WebShift解析静态HTML——它不执行JS。
  • 您需要渲染或截图一个页面,以保留其视觉布局。 WebShift处理HTML结构,但不渲染CSS或计算布局。 (注: text-map 确实为文本重写用例保留了DOM结构。)
  • 你正在构建一个需要跨页面导航的网络爬虫, 填写表单或处理身份验证流程。

运作原理

Question
  |
  +- (optional) LLM query expansion -> multiple search variants
  |
  +- Search via backend (SearXNG, Brave, Tavily, Exa, SerpAPI, Google, Bing, HTTP)
  |
  +- Deduplicate + filter binary URLs
  |
  +- Streaming fetch with per-page size cap
  |
  +- HTML cleaning -> plain text (noise elements, scripts, nav removed)
  |
  +- Unicode/BiDi sterilization
  |
  +- BM25 deterministic reranking
  |   +- (optional) LLM-assisted tier-2 reranking
  |
  +- Budget-aware truncation across all sources
  |
  +- (optional) LLM Markdown summary with inline citations
  |
  +- Structured JSON output

有关每个管道阶段、BM25参数、自适应预算分配和实际压缩度量的详细说明,请参阅 在引擎盖下面。有关完整的配置参考(TOML、env变量、CLI参数),请参阅 配置。有关即用型示例,请参阅 用例.


安装

二进制(MCP服务器)

cargo install webshift-mcp

二进制文件被称为 mcp-webshift.

来源

cargo install --path crates/webshift-mcp

作为一个图书馆

# Full pipeline (search + fetch + clean + rerank)
webshift = "0.2"

# Cleaner + fetcher only (no search backends)
webshift = { version = "0.2", default-features = false }

# Text-map only (extract/replace text nodes in HTML)
webshift = { version = "0.2", default-features = false, features = ["text-map"] }

# Everything including LLM features
webshift = { version = "0.2", features = ["llm"] }

快速启动

1.设置搜索后端

最简单的选择是 SearXNG -免费、自托管、无API密钥:

docker run -d -p 8080:8080 searxng/searxng

没有Docker?使用云后端——请参阅 搜索后端.

2.配置您的MCP客户端

{
  "mcpServers": {
    "webshift": {
      "command": "mcp-webshift",
      "args": ["--default-backend", "searxng"]
    }
  }
}

就是这样。代理人现在有 webshift_query, webshift_fetch,以及 webshift_onboarding.

有关特定于客户端的设置,请参阅 文档/集成/.


MCP工具

工具 说明
webshift_query 完整的搜索管道:搜索+获取+清理+重新排序+(可选)总结
webshift_fetch 单页提取和清理
webshift_onboarding 返回代理的JSON指南(预算、后端、提示)

webshift_query 参数

参数 类型 默认值 说明
queries string或list 必填 搜索查询或查询列表
num_results_per_query integer 5 每个查询的结果
lang string none 语言过滤器(例如。 "en")
backend string 配置默认值 覆盖搜索后端

配置

解决顺序(最高优先级优先):

  1. CLI参数 — --default-backend, --brave-api-key等等。
  2. 环境变量 — WEBSHIFT_* 前缀
  3. 配置文件 — webshift.toml (当前目录,然后 ~/webshift.toml)
  4. 内置默认值

配置文件

[server]
max_query_budget    = 32000   # total char budget across all sources
max_result_length   = 8000    # per-page char cap
max_total_results   = 20      # hard cap on results per call
max_download_mb     = 1       # streaming cap per page (MB)
search_timeout      = 8       # seconds
results_per_query   = 5
oversampling_factor = 2
adaptive_budget     = "auto"  # "auto" | "on" | "off" — budget allocation mode

[backends]
default = "searxng"

[backends.searxng]
url = "http://localhost:8080"

[backends.brave]
api_key = "BSA-..."

[backends.tavily]
api_key = "tvly-..."

[backends.exa]
api_key = "..."

[backends.serpapi]
api_key = "..."
engine  = "google"    # google | bing | duckduckgo | yandex

[backends.google]
api_key = "..."
cx      = "..."       # Custom Search Engine ID

[backends.bing]
api_key = "..."
market  = "en-US"

[backends.http]
url           = "https://my-search.example.com/api/search"
query_param   = "q"
count_param   = "limit"
results_path  = "data.items"     # dot-path to results array in JSON response
title_field   = "title"
url_field     = "link"
snippet_field = "description"

[backends.http.headers]
"Authorization" = "Bearer my-token"

[llm]
enabled               = false
base_url              = "http://localhost:11434/v1"   # OpenAI-compatible
api_key               = ""
model                 = "gemma3:27b"
timeout               = 60
expansion_enabled     = true
summarization_enabled = true
llm_rerank_enabled    = false

对于具有所有三种配置方法(TOML、env变量、CLI参数)的每个设置 以及简单的语言描述,请参阅完整 配置参考. 现成的配置示例在 用例 和 examples/.

关键环境变量

WEBSHIFT_DEFAULT_BACKEND=searxng
WEBSHIFT_SEARXNG_URL=http://localhost:8080
WEBSHIFT_BRAVE_API_KEY=BSA-xxx
WEBSHIFT_GOOGLE_API_KEY=xxx
WEBSHIFT_GOOGLE_CX=xxx
WEBSHIFT_BING_API_KEY=xxx
WEBSHIFT_LLM_ENABLED=true
WEBSHIFT_LLM_BASE_URL=http://localhost:11434/v1
WEBSHIFT_LLM_MODEL=gemma3:27b

搜索后端

后端 授权 注释
SearXNG none 自托管,免费。违约: http://localhost:8080
勇敢 API密钥 自由层。 brave.com/search/api
塔维利 API键 面向AI。 tavily.com
艾克萨 API键 神经搜索。 例如ai
SerpAPI API密钥 多引擎代理(Google、Bing、DDG…)。 蛇网
谷歌 API密钥+CX 自定义搜索。免费:每天100次。 可编程搜索引擎.google.com
必应 API键 Web搜索API。免费:每月1000次。 微软 Azure
超文本传输协议 可配置 通用REST后端——无需代码,仅限TOML配置

LLM功能(可选)

所有选择加入-默认情况下禁用,除非启用,否则任何数据都不会离开您的计算机。

功能 它的作用
查询扩展 单个查询->N个互补搜索变量
摘要 内联Markdown报告 [1] [2] 引文
LLM重新评级 在确定性BM25之上进行二级重新分级

跨语言规范化(奖金): 当BM25重新排序页面时 外语(如中文、日语、阿拉伯语),法学硕士总结者仍然 以提示语言生成最终报告。试剂接收干净的, 无论源页面中的语言组合如何,都能获得可读的输出。

适用于任何与OpenAI兼容的API(OpenAI、Ollama、vLLM、LM Studio等):

[llm]
enabled  = true
base_url = "http://localhost:11434/v1"
model    = "gemma3:27b"

防洪保护

始终活跃——核心价值主张:

保护 说明
max_download_mb 流上限——从不缓冲完整响应
max_result_length 每个已清理页面的字符数有硬上限
max_query_budget 所有来源的角色总预算
max_total_results 对每次通话的结果进行严格限制
二进制过滤器 .pdf, .zip, .exe等过滤 之前 任何网络请求
Unicode灭菌 删除BiDi控制字符,零宽度字符

图书馆使用情况

use webshift::{Config, clean, fetch, query};

// Clean raw HTML — cap output at 8000 chars
let result = clean("<html><body><p>Hello world</p></body></html>", 8000);
println!("{}", result.text);

// Pass 0 to disable the per-page cap entirely (no truncation)
let full = clean("<html><body><p>Hello world</p></body></html>", 0);
assert!(!full.truncated);

// Fetch and clean a single page
let config = Config::default();
let page = fetch("https://example.com", &config).await?;

// Full search pipeline
let results = query(&["rust async programming"], &config).await?;
for source in &results.sources {
    println!("[{}] {} — {} chars", source.id, source.title, source.content.len());
}

// Backend partial failures (CAPTCHA, rate-limits, engine outages) are surfaced
// in `warnings` rather than as Err. Empty sources + non-empty warnings means
// "all backends blocked" — distinct from a legitimate "no matches found".
if results.sources.is_empty() && !results.warnings.is_empty() {
    eprintln!("all backends failed: {:?}", results.warnings);
}

文本映射:在不破坏标记的情况下重写HTML内容

提取文本节点,操纵它们(翻译、重写、简化),并重建 具有完整结构、属性和链接的HTML。

use webshift::{extract_text_nodes, replace_text_nodes, TextReplacement};

let html = r#"<p>Hello <a href="https://example.com">world</a></p>"#;
let map = extract_text_nodes(html);
// map.nodes = [(0, "Hello"), (1, "world")]

let replacements = vec![
    TextReplacement { id: 0, text: "Ciao".into() },
    TextReplacement { id: 1, text: "mondo".into() },
];
let result = replace_text_nodes(html, &replacements).unwrap();
// → <p>Ciao <a href="https://example.com">mondo</a></p>
// href untouched, tags intact, only text changed.

需要 features = ["text-map"]。参见 用例#11 查看完整的翻译示例。

功能开关

功能 默认 启用
backends on 所有搜索后端+查询管道
llm 关闭 LLM客户、扩展器、汇总器、LLM重新银行
text-map 关 extract_text_nodes() + replace_text_nodes() --内容重写的DOM往返

集成

平台 指南
克劳德桌面,克劳德代码,光标,风帆,VS代码 IDE集成
泽德 --具有自动下载和配置服务器模式的本机扩展 Zed扩展
Gemini CLI、Claude CLI、自定义代理 代理集成

Beta状态

WebShift已启用 测试版核心功能稳定,服务器每天使用, 但是API表面在1.0之前仍然可能改变。

非常欢迎反馈。 如果某件事没有按预期工作,表现得很奇怪, 或者你有一个未涵盖的用例:

在GitHub上打开一个问题

错误报告、配置问题和功能请求都有助于制定路线图。

贡献

欢迎投稿!请看 贡献.md 有关以下内容的详细指南:

  • 开发设置和工作流程
  • 代码风格和惯例
  • 测试要求
  • 文件标准
  • 拉取请求流程

许可证

MIT许可证——见 许可证 了解详情。

链接


需要帮助? 检查 文档 或打开 问题 在GitHub上。