voyager-browser
Read-only observation of a single live URL: parses static HTML to report security posture, forms, links, accessibility signals, and leaks, with described fixes. SSRF-gated and safe, never executes JavaScript.
README
@dir-ai/voyager-browser
Voyager's web-page sense. A safe, read-only observation of one live URL: its structure, forms, links, script origins, security posture (HTTPS / HSTS / CSP / mixed-content / cookies) and accessibility signals (lang, image alt coverage, heading order) — each with a described, never applied fix.
It parses static HTML — no JavaScript execution, no headless browser — so
it's honest about what it can and cannot see (it will not render a client-side
SPA's runtime state). Every piece of page text is returned framed as
untrusted. It is SSRF-gated: it refuses non-http(s) URLs and anything
resolving to private, loopback, or cloud-metadata addresses.
One sense in the Voyager family. Read-only, like all the senses — it never submits a form, clicks, or mutates anything.
Install
npm i -g @dir-ai/voyager-browser
Use
voyager-browser observe https://example.com
voyager-browser observe https://example.com --json
https://example.com/
https://example.com — 200; 3 finding(s), worst: medium. 0 form(s), 1 link(s).
title: Example Domain
security: https · a11y lang:yes alt:n/a
med HTTPS without HSTS
↳ add Strict-Transport-Security: max-age=63072000; includeSubDomains
med no Content-Security-Policy
↳ add a Content-Security-Policy to constrain scripts/resources
low no X-Content-Type-Options: nosniff
↳ add X-Content-Type-Options: nosniff
As an MCP server
One tool, observe_page.
{ "command": "voyager-browser", "args": ["mcp"] }
As a library
import { observe } from '@dir-ai/voyager-browser'
const brief = await observe('https://example.com')
console.log(brief.summary)
console.log(brief.security) // { https, hsts, csp, mixedContent, thirdPartyScripts, … }
console.log(brief.forms) // insecure / cross-origin / sensitive flags
console.log(brief.findings) // severity + described fix
What it looks for
- Security posture (quality, not just presence) — plain HTTP; missing/weak HSTS; missing CSP or a CSP graded weak (
unsafe-inline/unsafe-eval/wildcard/noobject-src/nobase-uri); missing clickjacking protection (X-Frame-Options /frame-ancestors); missingnosniff, Referrer-Policy, Permissions-Policy; version-leakingServer/X-Powered-By; mixed content on an HTTPS page (origin-compared, not prefix); per-cookie Secure/HttpOnly; third-party scripts without Subresource Integrity. - Forms — a form on HTTPS posting to plain HTTP (
critical); a sensitive form (password/payment) posting cross-origin or over HTTP; a sensitivePOSTwith no anti-CSRF token; sensitive data onGET. - Links — external
target="_blank"withoutrel="noopener"(reverse-tabnabbing). - Body-content leaks — directory listings (Apache/nginx autoindex), language-specific stack traces (Python/Java/PHP/Node/Oracle/SQLSTATE/MySQL) and verbose framework debug pages (Werkzeug/Flask, Rails, Symfony/Whoops, ASP.NET YSOD) disclosed in the response body — each with the matched signature (framed).
- Exposed JWTs — JWT-shaped tokens found in the HTML, response headers,
Set-Cookie, and same-origin bundles are decoded (header+payload, base64url, no signature verification, no secret cracking) and flagged foralg:none(critical), expired (expin the past), or missingexp. Claim values are framed as untrusted. - Passive discovery of well-known sensitive paths — bounded, same-origin, read-only
GETs to a short fixed list (/.git/config,/.env,/.svn/entries,/.DS_Store,/config.json,/wp-config.php~,/backup/,/uploads/), flagging only a confirmed body signature — never a bare200. Pinned to the vetted IP; honours--authorized. Disable with--no-discovery. - Accessibility — missing
<html lang>, images withoutalt, skipped heading levels, unlabeled form fields. - Render honesty — a
render: static | hybrid | client-heavyfield: if a page's content is JavaScript-rendered, the brief says so and marks itself PARTIAL rather than reporting a shell as clean. - Composition hints — third-party script origins to vet with
@dir-ai/voyager/@dir-ai/voyager-net.
Safety
- Read-only. Fetches the page with a single GET; never submits, clicks, or mutates.
- No code execution. Static HTML parsing only — the page's JavaScript is never run.
- SSRF-gated, with IP pinning. Only
http(s); a single URL (no lists/credentials). The host is resolved, every address is classified canonically (IPv4-mapped IPv6, unspecified, CGNAT, NAT64, link-local, private, loopback, metadata all refused), and the connection is pinned to the vetted IP so DNS rebinding cannot swap in an internal address between the check and the fetch. Every redirect hop is re-vetted and re-pinned. - Untrusted by construction. Every owner-controlled string that reaches the brief — title, headings, meta, links, form actions, field names — is injection-stripped and framed; the agent must treat it as data, not instructions.
- Bounded. One deadline covers headers and body; the body is byte-capped; a truncated read downgrades confidence and is never reported as "clean".
- Honest limits. It reads what the server sends. It does not see client-rendered state — and the
renderfield says exactly how much it saw.
Roadmap
- v0.3 — same-origin JS-bundle static scan (exposed secrets/endpoints/source-maps), third-party/tracker/cookie inventory + tech fingerprinting, WCAG-mapped a11y depth, and a
CognitiveClaimadapter so a page observation drops into a@dir-ai/voyager-agentmission (page → host → dependency chain). - v1.0 — an opt-in, consent-gated
--rendersandboxed headless pass (network-isolated, resource-capped) for true SPA/rendered-DOM coverage, always labeled as render-mode output; a stable finding-kindtaxonomy and a full posture score.
The line stays fixed: voyager-browser expands by reading more of what's already served, never by doing more to the server. Anything active (submitting, fuzzing, probing) belongs to a separate consent-gated organ.
The Voyager family
| Package | Sense |
|---|---|
@dir-ai/voyager |
web — verified-internet retrieval |
@dir-ai/voyager-browser |
web page — observe one live URL |
@dir-ai/voyager-repo |
code — orient in a repository |
@dir-ai/voyager-net |
hosts — authorized host audit |
@dir-ai/voyager-contract |
the cognitive contract the senses speak |
@dir-ai/voyager-agent |
the one agent that composes them |
License
MIT © dir-ai
推荐服务器
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 模型以安全和受控的方式获取实时的网络信息。