A self-contained browser engine that fetches, renders, and extracts web content as Markdown, JSON, or screenshots — no Chromium, no API key, no setup.
SaferSkills independently audited servo-fetch (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
curl or built-in web fetch instead)Start the MCP server: servo-fetch mcp (stdio) or servo-fetch mcp --port 8080 (Streamable HTTP)
Large multi-block responses can omit URL-labeled blocks and include an omitted-count summary; paginate fetch output with maxLength and startIndex. Extracted Markdown and JSON use the final document URL after redirects, while batch and crawl block labels preserve the requested URL.
Extract readable content from a URL. JavaScript is executed, CSS layout is computed, and navigation noise (navbars, sidebars, footers, cookie banners) is stripped automatically.
Parameters:
url (required): URL to fetch (http/https only)format: "markdown" (default), "json", "html", "text", or "accessibility_tree"selector: CSS selector to extract a specific section instead of full-page extractionmaxLength: max characters to return (default 5000)startIndex: character offset for paginationvisibility: "moderate" (default), "strict", or "off"timeout (s, default 30), settleMs (ms, default 0), userAgent, cookiesFile, headersfetch(url: "https://docs.rs/tokio", format: "markdown")
fetch(url: "https://example.com", format: "json", selector: "article")
fetch(url: "https://example.com", format: "accessibility_tree")PDF URLs are auto-detected via Content-Type and extracted directly.
Fetch multiple URLs in parallel. Results are returned as separate content entries in completion order. Failed URLs are reported inline without aborting the batch.
Parameters:
urls (required): array of URLs to fetch (http/https only, max 20)format: "markdown" (default), "json", "html", "text", or "accessibility_tree"selector: CSS selector to extract a specific sectionmaxLength: max characters per URL result (default 5000)visibility: "moderate" (default), "strict", or "off"timeout (s, default 30), settleMs (ms, default 0), userAgent, cookiesFile, headersbatch_fetch(urls: ["https://a.com", "https://b.com"], format: "markdown")
batch_fetch(urls: ["https://a.com", "https://b.com"], format: "json", selector: "article")Crawl a website starting from a URL, following same-site links via BFS. JavaScript is executed, CSS layout is computed, and navigation noise is stripped. Respects robots.txt.
Parameters:
url (required): starting URL to crawl (http/https only)limit: max pages to crawl (default 50, max 500)maxDepth: max link depth from seed (default 3, max 10)format: "markdown" (default) or "json"include: URL path patterns to include (e.g. ["/docs/**"])exclude: URL path patterns to excludemaxLength: max characters per page result (default 5000)selector: CSS selector to extract a specific section per pagetimeout (s, default 30), settleMs (ms, default 0), userAgent, cookiesFile, headerscrawl(url: "https://docs.example.com", limit: 20, maxDepth: 3)
crawl(url: "https://docs.example.com", include: ["/guide/**"], limit: 50)Capture a PNG screenshot. Uses Servo's software renderer — works without GPU.
Parameters:
url (required): URL to capturefullPage: capture the full scrollable page (default false)timeout (s, default 30), settleMs (ms, default 0), userAgent, cookiesFile, headersscreenshot(url: "https://example.com")
screenshot(url: "https://example.com", fullPage: true)Evaluate a JavaScript expression after the page loads. Console messages (log, warn, error) are appended to the result.
Parameters:
url (required): URL to loadexpression (required): JavaScript expression to evaluatetimeout (s, default 30), settleMs (ms, default 0), userAgent, cookiesFile, headersexecute_js(url: "https://example.com", expression: "document.title")
execute_js(url: "https://example.com", expression: "[...document.querySelectorAll('h2')].map(e => e.textContent)")servo-fetch https://example.com # Markdown (default)
servo-fetch https://example.com --format json # Structured JSON
servo-fetch URL1 URL2 URL3 # Parallel batch (Markdown with separators)
servo-fetch URL1 URL2 --format json # Parallel batch (NDJSON)
servo-fetch https://example.com --format png -o out.png # Save PNG screenshot
servo-fetch https://example.com --js "document.title" # Run JavaScript and print result
servo-fetch https://example.com --selector article # Extract a section by CSS selector
servo-fetch https://example.com --schema schema.json # Schema-driven JSON
servo-fetch https://example.com --cookies cookies.txt # Send session cookies
servo-fetch https://example.com --cookie-jar cookies.txt # Save session cookies (includes HttpOnly)
servo-fetch https://example.com -H "Authorization: Bearer TOKEN" # Custom request header (repeatable)
servo-fetch https://example.com --format html # Raw HTML
servo-fetch https://example.com --format text # Plain text
servo-fetch https://example.com -t 60 # Custom timeout
servo-fetch https://example.com --settle 500 # Extra wait for SPAs
servo-fetch crawl https://docs.example.com --limit 20 # Crawl a site (BFS)
servo-fetch crawl https://docs.example.com --include "/docs/**" # Crawl with path filter
servo-fetch URL --output page.md # Save a single URL to a file
servo-fetch crawl URL --output-dir ./pages/ # One file per pagetimeout parameter for slow pagesFor pagination patterns, format selection, and MCP configuration, see references/guide.md.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.