
Voyager Browser
io.github.dir-aiPublished by GitHub account dir-aiv0.7.0Updated Oct 24, 2026
Voyager's web-page sense: safe read-only observation of one live URL (structure, security, a11y).
Overview
Read-only inspection of one live URL, reporting page structure, security headers, forms, links, and accessibility signals.
- What you can do
- Exposes a single tool, observe_page, that fetches one http(s) URL with a plain GET and returns a brief covering page structure, forms, links, script origins, security posture (HTTPS, HSTS, CSP, mixed content, cookies), and accessibility signals such as lang, image alt coverage, and heading order. Findings carry a severity and a described, never applied, fix. It parses static HTML only, so it does not execute JavaScript or render client-side state, and it marks results as partial when content appears JavaScript-rendered. Page text is returned framed as untrusted data.
- When to use it
- Useful when an assistant needs a quick, non-invasive read of a single public page: checking security headers, spotting insecure or cross-origin forms, reviewing basic accessibility, or gathering link and script-origin context before other work. It is not a crawler, a scanner, or a browser, so it is a poor fit for multi-page sweeps, authenticated pages, or JavaScript-heavy single-page apps.
- Requirements
- Runs locally over stdio as the npm package @dir-ai/voyager-browser, installed globally and started with the mcp argument. Requires Node.js and outbound network access to the target URL. No accounts, API keys, environment variables, or headers are declared.
Installation
In SourceWeft
- Open Voyager Browser in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
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
Use
As an MCP server
One tool, observe_page.
As a library
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
License
MIT © dir-ai
Source: README.md at commit 3de45a4
Tools
0Version history
1- v0.7.0LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts
