touch-browser
touch-browser is an evidence-grounded MCP server for public docs and research web workflows. It helps AI agents search and open web pages, extract page-local evidence with citations and confidence bands, classify browsing risk, and synthesize multi-page sessions into citation-ready reports.
README
touch-browser

Ask a claim. Get page-grounded evidence, verdicts, and citations.
touch-browser is an evidence verification layer for AI agents. It does more than fetch a page or convert HTML to Markdown. It opens a page, compiles a structured snapshot, and tells you whether the current page supports a claim, contradicts it, or still needs more browsing.
Use it when you need:
- source-linked evidence instead of raw HTML dumps
- support snippets and verdict explanations that an agent can inspect before answering
- a safe unresolved path for borderline claims instead of bluffing
- policy-gated browsing instead of blind automation
- replayable, auditable multi-page research sessions
Evidence-first, not fact-final:
touch-browserhelps an AI collect page-local evidence and trace where it came from- a higher-level model or human still decides what is true across pages or across the wider world
What extract Returns
Abbreviated claimOutcome shape from the current extractor:
{
"statement": "The Starter plan costs $29 per month.",
"verdict": "evidence-supported",
"confidenceBand": "high",
"reviewRecommended": false,
"supportSnippets": [
{
"blockId": "b4",
"stableRef": "rmain:table:plan-monthly-price-snapshots-starter-29-10-000-t",
"snippet": "Starter | $29 | 10,000"
}
],
"verdictExplanation": "Matched direct support in 3 page block(s). Review the attached snippets before reusing the claim."
}
The extractor returns four verdicts:
evidence-supported: the current page surfaced usable supportcontradicted: the current page surfaced conflicting evidenceinsufficient-evidence: the current page did not provide enough direct supportneeds-more-browsing: the current page is not specific enough yet, so the next step is another page
confidenceBand, reviewRecommended, supportSnippets, verdictExplanation, and matchSignals are there so an agent can decide what to do next without blindly trusting the first match.
MCP Package
Primary local-host MCP path:
- npm package:
@nangman-infra/touch-browser-mcp - scope: public docs and research web
- MCP contract: headless-only, automatic search-engine selection, supervised recovery handoff for challenge/auth/MFA
Recommended host config:
{
"mcpServers": {
"touch-browser": {
"command": "npx",
"args": ["-y", "@nangman-infra/touch-browser-mcp"]
}
}
}
On first launch, the package downloads the matching standalone runtime bundle from GitHub Releases, verifies the published .sha256, installs it under ~/.touch-browser/npm-mcp/versions/, and then starts touch-browser mcp.
Use this package when you want a local MCP host such as Claude Desktop, Cursor, or Codex to attach without a separate manual runtime install.
Standalone Bundle
Tagged v* pushes now build standalone macOS and Linux bundles in the Standalone Release workflow. Each bundle includes:
bin/touch-browser- the optimized Rust binary under
runtime/touch-browser-bin - a bundled Node runtime and Playwright adapter
- the default semantic runner scripts and model cache
When a tagged release is published, download the matching tarball from GitHub Releases, unpack it, and run:
./touch-browser-<version>-<platform>-<arch>/install.sh
touch-browser telemetry-summary
touch-browser update --check
To build the same portable bundle locally:
pnpm install --frozen-lockfile
pnpm run build:standalone-bundle -- v0.1.0-rc1
# Then install the bundled command into PATH
./dist/standalone/touch-browser-v0.1.0-rc1-<platform>-<arch>/install.sh
touch-browser telemetry-summary
touch-browser update --check
The standalone path is still the official CLI, operations, offline, and fallback install path:
- unpack a standalone bundle
- run
install.sh - use the installed
touch-browsercommand for every CLI and serve operation
The installer now performs a managed install:
- managed versions live under
~/.touch-browser/install/versions/<bundle-name> - the active version is
~/.touch-browser/install/current - the PATH command points at
~/.touch-browser/install/current/bin/touch-browser touch-browser updateswapscurrentto a newly verified release bundletouch-browser uninstall --purge-all --yesremoves the managed install and all stored data
First Run
This is the command-only proof path that matches the installed user experience:
touch-browser open https://www.iana.org/help/example-domains --browser --session-file /tmp/tb-first-run.json
touch-browser session-read --session-file /tmp/tb-first-run.json --main-only
touch-browser session-extract --session-file /tmp/tb-first-run.json \
--claim "As described in RFC 2606 and RFC 6761, a number of domains such as example.com and example.org are maintained for documentation purposes."
touch-browser session-synthesize --session-file /tmp/tb-first-run.json --format markdown
touch-browser session-close --session-file /tmp/tb-first-run.json
Installed search now keeps an engine-level persistent trust profile by default:
- Google:
~/.touch-browser/browser-search/profiles/google-default - Brave:
~/.touch-browser/browser-search/profiles/brave-default - profile state metadata:
~/.touch-browser/browser-search/<engine>.profile-state.json
Contributor Build From Source
Prerequisites: rustup, Node.js 18+, pnpm.
bash scripts/bootstrap-local.sh
cargo build --release -p touch-browser-cli
pnpm run build:standalone-bundle -- local-dev
./dist/standalone/touch-browser-local-dev-<platform>-<arch>/install.sh
Source checkout is a contributor workflow. Release and operations docs still assume the installed touch-browser command from the standalone bundle.
bootstrap-local.sh installs the default semantic models under:
~/.touch-browser/models/evidence/embedding~/.touch-browser/models/evidence/nli
Use TOUCH_BROWSER_EVIDENCE_EMBEDDING_MODEL_PATH or TOUCH_BROWSER_EVIDENCE_NLI_MODEL_PATH only when you need to override those default locations.
Why Not Markdown Alone?
touch-browser is not trying to replace every crawler or browser tool. Its job starts after page acquisition.
| Need | Markdown-only fetch | touch-browser |
|---|---|---|
| Read the page | yes | yes |
| Keep source-linked block refs | partial | yes |
| Judge whether the page supports a claim | no | yes |
| Return contradiction and unresolved states | no | yes |
| Give support snippets and verdict explanations | no | yes |
| Tell the agent to escalate instead of answering | no | yes |
Product Surface
Primary surface:
extract: verify claims against the current page and return structured claim outcomes
Supporting read surfaces:
read-view: readable Markdown for a human reviewer or verifier modelcompact-view: low-token semantic state for agent loopssearch: structured discovery before opening candidate pages
Safety and audit surfaces:
policy: classify pages and actions as allow, review, or blocksession-synthesize: turn a multi-page session into JSON or Markdown with citationsserve: expose the runtime over stdio JSON-RPC for MCP or agent integration
What touch-browser Is
- an evidence-first extractor
- a selective prediction surface
- a verifier-friendly routing layer
What touch-browser Is Not
- a universal truth oracle
- a generic crawler replacement
- a guarantee that every unsupported claim is false
MCP Example
Recommended MCP setup for local hosts:
{
"mcpServers": {
"touch-browser": {
"command": "npx",
"args": ["-y", "@nangman-infra/touch-browser-mcp"]
}
}
}
The MCP package is intentionally narrower than the full CLI:
- scope is public docs and research web
- recommended loop is
tb_search -> tb_search_open_top -> tb_read_view -> tb_extract engineis not exposed over MCPheadedis not exposed over MCP- if the page indicates challenge, auth, MFA, or other supervised recovery, stop and hand off to a human instead of retrying with different browser settings
Alternative MCP bridge setup for an installed standalone command:
{
"mcpServers": {
"touch-browser": {
"command": "touch-browser",
"args": ["mcp"]
}
}
}
The bridge starts touch-browser serve underneath and exposes tools like tb_search, tb_search_open_top, tb_open, tb_read_view, tb_extract, tb_tab_open, and tb_session_synthesize.
Repository checkout integration asset:
{
"mcpServers": {
"touch-browser": {
"command": "node",
"args": ["integrations/mcp/bridge/index.mjs"]
}
}
}
The standalone bundle ships touch-browser mcp and touch-browser serve. The checked-in Node launcher remains a repository integration asset for repo checkouts or container images.
By default the bridge prefers an explicit TOUCH_BROWSER_SERVE_COMMAND, then an explicit binary path, then an installed or packaged touch-browser binary, then repo-local target/{release,debug} binaries. If none are available, it fails fast with an install/build instruction instead of dropping back to cargo run.
Use TOUCH_BROWSER_SERVE_COMMAND if you want to force a specific built binary or wrapper command.
Architecture
Query / URL / fixture / browser tab
-> browser-first search result parsing
-> Acquisition
-> Observation compiler
-> read-view / compact-view
-> extract (evidence + citations + optional verifier)
-> policy
-> session synthesis / replay
-> CLI / JSON-RPC serve / MCP
Docs And Proof
- quick start and operations: doc/INSTALL_AND_OPERATIONS.md
- command surface: doc/CLI_SURFACE_SPEC.md
- evidence operating model: doc/EVIDENCE_OPERATING_MODEL.md
- npm MCP package: packages/mcp/README.md
- examples: examples/README.md
- integrations: integrations/README.md
- benchmarks and positioning: doc/README.md
- pilot and operations package: doc/PILOT_PACKAGE_SPEC.md, doc/OPERATIONS_SECURITY_PACKAGE_SPEC.md
License
This repository now uses MPL-2.0.
- commercial and non-commercial use are allowed
- if you distribute modified MPL-covered files, those covered files stay under
MPL-2.0 - separate files in a larger work can use different terms
- full legal text: LICENSE
- plain-language policy: LICENSE-POLICY.md
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。