{"id":"07ffdf3d-6574-46ee-95d4-4f230fb70789","shortId":"ucNqwv","kind":"skill","title":"servo-fetch","tagline":"Fetch and render web pages using the Servo browser engine — a single binary with JS execution, CSS layout, screenshots, and content extraction. Use when a URL returns empty or incomplete content with plain HTTP fetch, when you need a screenshot without GPU, or when you need to ru","description":"# servo-fetch\n\n## When to use\n\n- A URL returns empty or incomplete content with simple HTTP fetch (SPA, React, Vue)\n- You need a screenshot of a web page in CI/Docker (no GPU available)\n- You need to evaluate JavaScript in a page context (DOM queries, data extraction)\n- You want clean Markdown from a documentation site, blog, or article\n- You need to crawl an entire documentation site or blog for RAG / knowledge ingestion\n- You need the accessibility tree with bounding boxes for a page\n\n## When NOT to use\n\n- The page is simple static HTML (use `curl` or built-in web fetch instead)\n- You need to interact with the page (click, fill forms) — servo-fetch is read-only\n- You need full Chromium compatibility for complex web apps\n\n## Tools (MCP)\n\nStart the MCP server: `servo-fetch mcp` (stdio) or `servo-fetch mcp --port 8080` (Streamable HTTP)\n\n### fetch\n\nExtract readable content from a URL. JavaScript is executed, CSS layout is computed, and navigation noise (navbars, sidebars, footers, cookie banners) is stripped automatically.\n\nParameters:\n\n- `url` (required): URL to fetch (http/https only)\n- `format`: `\"markdown\"` (default), `\"json\"`, `\"html\"`, `\"text\"`, or `\"accessibility_tree\"`\n- `selector`: CSS selector to extract a specific section instead of full-page extraction\n- `max_length`: max characters to return (default 5000)\n- `start_index`: character offset for pagination\n- `timeout`: page load timeout in seconds (default 30)\n- `settle_ms`: extra wait in ms after load event for SPAs (default 0, max 10000)\n\n```text\nfetch(url: \"https://docs.rs/tokio\", format: \"markdown\")\nfetch(url: \"https://example.com\", format: \"json\", selector: \"article\")\nfetch(url: \"https://example.com\", format: \"accessibility_tree\")\n```\n\nPDF URLs are auto-detected via Content-Type and extracted directly.\n\n### batch_fetch\n\nFetch multiple URLs in parallel. Results are returned as separate content entries in completion order. Failed URLs are reported inline without aborting the batch.\n\nParameters:\n\n- `urls` (required): array of URLs to fetch (http/https only, max 20)\n- `format`: `\"markdown\"` (default) or `\"json\"`\n- `selector`: CSS selector to extract a specific section\n- `max_length`: max characters per URL result (default 5000)\n- `timeout`: page load timeout in seconds per URL (default 30)\n- `settle_ms`: extra wait in ms after load event (default 0, max 10000)\n\n```text\nbatch_fetch(urls: [\"https://a.com\", \"https://b.com\"], format: \"markdown\")\nbatch_fetch(urls: [\"https://a.com\", \"https://b.com\"], format: \"json\", selector: \"article\")\n```\n\n### crawl\n\nCrawl 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.\n\nParameters:\n\n- `url` (required): starting URL to crawl (http/https only)\n- `limit`: max pages to crawl (default 20, max 500)\n- `max_depth`: max link depth from seed (default 3, max 10)\n- `format`: `\"markdown\"` (default) or `\"json\"`\n- `include_glob`: URL path patterns to include (e.g. `[\"/docs/**\"]`)\n- `exclude_glob`: URL path patterns to exclude\n- `max_length`: max characters per page result (default 5000)\n- `timeout`: page load timeout in seconds per page (default 30)\n- `settle_ms`: extra wait in ms after load event (default 0, max 10000)\n- `selector`: CSS selector to extract a specific section per page\n\n```text\ncrawl(url: \"https://docs.example.com\", limit: 20, max_depth: 3)\ncrawl(url: \"https://docs.example.com\", include_glob: [\"/guide/**\"], limit: 50)\n```\n\n### screenshot\n\nCapture a PNG screenshot. Uses Servo's software renderer — works without GPU.\n\nParameters:\n\n- `url` (required): URL to capture\n- `full_page`: capture the full scrollable page (default false)\n- `timeout`: page load timeout in seconds (default 30)\n- `settle_ms`: extra wait in ms after load event (default 0, max 10000)\n\n```text\nscreenshot(url: \"https://example.com\")\nscreenshot(url: \"https://example.com\", full_page: true)\n```\n\n### execute_js\n\nEvaluate a JavaScript expression after the page loads. Console messages (log, warn, error) are appended to the result.\n\nParameters:\n\n- `url` (required): URL to load\n- `expression` (required): JavaScript expression to evaluate\n- `timeout`: page load timeout in seconds (default 30)\n- `settle_ms`: extra wait in ms after load event (default 0, max 10000)\n\n```text\nexecute_js(url: \"https://example.com\", expression: \"document.title\")\nexecute_js(url: \"https://example.com\", expression: \"[...document.querySelectorAll('h2')].map(e => e.textContent)\")\n```\n\n## CLI\n\n```bash\nservo-fetch https://example.com                    # Markdown (default)\nservo-fetch https://example.com --json             # Structured JSON\nservo-fetch URL1 URL2 URL3                         # Parallel batch (Markdown with separators)\nservo-fetch URL1 URL2 --json                       # Parallel batch (NDJSON)\nservo-fetch https://example.com --screenshot out.png\nservo-fetch https://example.com --js \"document.title\"\nservo-fetch https://example.com --selector article\nservo-fetch https://example.com --schema schema.json  # Schema-driven JSON\nservo-fetch https://example.com --raw html         # Raw HTML\nservo-fetch https://example.com --raw text         # Plain text\nservo-fetch https://example.com -t 60              # Custom timeout\nservo-fetch https://example.com --settle 500       # Extra wait for SPAs\nservo-fetch crawl https://docs.example.com --limit 20  # Crawl a site (BFS)\nservo-fetch crawl https://docs.example.com --include \"/docs/**\"  # Crawl with path filter\n```\n\n## Gotchas\n\n- Servo's web compatibility is improving but not at Chromium level — best for docs, blogs, and SSR sites\n- Private/reserved IP addresses are blocked (SSRF protection)\n- Default timeout is 30 seconds; increase with `timeout` parameter for slow pages\n- Cookie banners and newsletter popups are stripped via injected user stylesheets\n\nFor pagination patterns, format selection, and MCP configuration, see `references/guide.md`.","tags":["servo","fetch","konippi","agent-skills","cli","mcp","rust","web-scraping"],"capabilities":["skill","source-konippi","skill-servo-fetch","topic-agent-skills","topic-cli","topic-fetch","topic-mcp","topic-rust","topic-servo","topic-web-scraping"],"categories":["servo-fetch"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/konippi/servo-fetch/servo-fetch","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add konippi/servo-fetch","source_repo":"https://github.com/konippi/servo-fetch","install_from":"skills.sh"}},"qualityScore":"0.493","qualityRationale":"deterministic score 0.49 from registry signals: · indexed on github topic:agent-skills · 87 github stars · SKILL.md body (5,944 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:56:39.756Z","embedding":null,"createdAt":"2026-05-04T13:06:42.593Z","updatedAt":"2026-05-18T18:56:39.756Z","lastSeenAt":"2026-05-18T18:56:39.756Z","tsv":"'/docs':497,807 '/guide':561 '/tokio':297 '0':289,406,534,610,673 '10':483 '10000':291,408,536,612,675 '20':363,470,552,796 '3':481,555 '30':276,395,523,599,662,841 '50':563 '500':472,785 '5000':262,385,513 '60':777 '8080':196 'a.com':413,420 'abort':349 'access':126,239,311 'address':833 'app':178 'append':639 'array':355 'articl':108,306,425,745 'auto':317 'auto-detect':316 'automat':223 'avail':84 'b.com':414,421 'banner':220,851 'bash':694 'batch':326,351,410,417,715,726 'best':824 'bfs':440,800 'binari':16 'block':835 'blog':106,118,827 'bound':129 'box':130 'browser':12 'built':148 'built-in':147 'captur':565,582,585 'charact':258,265,380,508 'chromium':173,822 'ci/docker':81 'clean':100 'cli':693 'click':160 'compat':174,816 'complet':341 'complex':176 'comput':212,447 'configur':868 'consol':633 'content':24,34,64,202,321,338 'content-typ':320 'context':93 'cooki':219,850 'crawl':112,426,427,461,468,548,556,793,797,804,808 'css':20,209,242,370,444,538 'curl':145 'custom':778 'data':96 'default':234,261,275,288,366,384,394,405,469,480,486,512,522,533,590,598,609,661,672,700,838 'depth':474,477,554 'detect':318 'direct':325 'doc':826 'docs.example.com':550,558,794,805 'docs.rs':296 'docs.rs/tokio':295 'document':104,115 'document.queryselectorall':688 'document.title':682,739 'dom':94 'driven':754 'e':691 'e.g':496 'e.textcontent':692 'empti':31,61 'engin':13 'entir':114 'entri':339 'error':637 'evalu':88,625,654 'event':285,404,532,608,671 'example.com':302,309,616,619,680,686,698,704,731,737,743,749,759,767,775,783 'exclud':498,504 'execut':19,208,443,623,677,683 'express':628,649,652,681,687 'extra':279,398,526,602,665,786 'extract':25,97,200,245,254,324,373,541 'fail':343 'fals':591 'fetch':3,4,38,54,68,151,165,187,193,199,229,293,300,307,327,328,359,411,418,697,703,710,721,730,736,742,748,758,766,774,782,792,803 'fill':161 'filter':811 'follow':434 'footer':218 'form':162 'format':232,298,303,310,364,415,422,484,864 'full':172,252,583,587,620 'full-pag':251 'glob':490,499,560 'gotcha':812 'gpu':45,83,576 'h2':689 'html':143,236,761,763 'http':37,67,198 'http/https':230,360,462 'improv':818 'includ':489,495,559,806 'incomplet':33,63 'increas':843 'index':264 'ingest':122 'inject':858 'inlin':347 'instead':152,249 'interact':156 'ip':832 'javascript':89,206,441,627,651 'js':18,624,678,684,738 'json':235,304,368,423,488,705,707,724,755 'knowledg':121 'layout':21,210,445 'length':256,378,506 'level':823 'limit':464,551,562,795 'link':438,476 'load':271,284,388,403,516,531,594,607,632,648,657,670 'log':635 'map':690 'markdown':101,233,299,365,416,485,699,716 'max':255,257,290,362,377,379,407,465,471,473,475,482,505,507,535,553,611,674 'mcp':180,183,188,194,867 'messag':634 'ms':278,282,397,401,525,529,601,605,664,668 'multipl':329 'navbar':216 'navig':214,449 'ndjson':727 'need':41,49,73,86,110,124,154,171 'newslett':853 'nois':215,450 'offset':266 'order':342 'out.png':733 'page':8,79,92,133,139,159,253,270,387,466,510,515,521,546,584,589,593,621,631,656,849 'pagin':268,862 'parallel':332,714,725 'paramet':224,352,455,577,643,846 'path':492,501,810 'pattern':493,502,863 'pdf':313 'per':381,392,509,520,545 'plain':36,770 'png':567 'popup':854 'port':195 'private/reserved':831 'protect':837 'queri':95 'rag':120 'raw':760,762,768 'react':70 'read':168 'read-on':167 'readabl':201 'references/guide.md':870 'render':6,573 'report':346 'requir':226,354,457,579,645,650 'respect':453 'result':333,383,511,642 'return':30,60,260,335 'robots.txt':454 'ru':51 'same-sit':435 'schema':750,753 'schema-driven':752 'schema.json':751 'screenshot':22,43,75,564,568,614,617,732 'scrollabl':588 'second':274,391,519,597,660,842 'section':248,376,544 'see':869 'seed':479 'select':865 'selector':241,243,305,369,371,424,537,539,744 'separ':337,718 'server':184 'servo':2,11,53,164,186,192,570,696,702,709,720,729,735,741,747,757,765,773,781,791,802,813 'servo-fetch':1,52,163,185,191,695,701,708,719,728,734,740,746,756,764,772,780,790,801 'settl':277,396,524,600,663,784 'sidebar':217 'simpl':66,141 'singl':15 'site':105,116,437,799,830 'skill' 'skill-servo-fetch' 'slow':848 'softwar':572 'source-konippi' 'spa':69 'spas':287,789 'specif':247,375,543 'ssr':829 'ssrf':836 'start':181,263,430,458 'static':142 'stdio':189 'streamabl':197 'strip':222,452,856 'structur':706 'stylesheet':860 'text':237,292,409,547,613,676,769,771 'timeout':269,272,386,389,514,517,592,595,655,658,779,839,845 'tool':179 'topic-agent-skills' 'topic-cli' 'topic-fetch' 'topic-mcp' 'topic-rust' 'topic-servo' 'topic-web-scraping' 'tree':127,240,312 'true':622 'type':322 'url':29,59,205,225,227,294,301,308,314,330,344,353,357,382,393,412,419,433,456,459,491,500,549,557,578,580,615,618,644,646,679,685 'url1':711,722 'url2':712,723 'url3':713 'use':9,26,57,137,144,569 'user':859 'via':319,439,857 'vue':71 'wait':280,399,527,603,666,787 'want':99 'warn':636 'web':7,78,150,177,815 'websit':429 'without':44,348,575 'work':574","prices":[{"id":"eb670843-de05-49ac-9659-874b97b221b5","listingId":"07ffdf3d-6574-46ee-95d4-4f230fb70789","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"konippi","category":"servo-fetch","install_from":"skills.sh"},"createdAt":"2026-05-04T13:06:42.593Z"}],"sources":[{"listingId":"07ffdf3d-6574-46ee-95d4-4f230fb70789","source":"github","sourceId":"konippi/servo-fetch/servo-fetch","sourceUrl":"https://github.com/konippi/servo-fetch/tree/main/skills/servo-fetch","isPrimary":false,"firstSeenAt":"2026-05-04T13:06:42.593Z","lastSeenAt":"2026-05-18T18:56:39.756Z"}],"details":{"listingId":"07ffdf3d-6574-46ee-95d4-4f230fb70789","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"konippi","slug":"servo-fetch","github":{"repo":"konippi/servo-fetch","stars":87,"topics":["agent-skills","cli","fetch","mcp","rust","servo","web-scraping"],"license":"apache-2.0","html_url":"https://github.com/konippi/servo-fetch","pushed_at":"2026-05-17T09:38:28Z","description":"A self-contained browser engine that fetches, renders, and extracts web content as Markdown, JSON, or screenshots — no Chromium, no API key, no setup.","skill_md_sha":"1d4afa917404857d1d0a9ae680c1be6b2a65cc75","skill_md_path":"skills/servo-fetch/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/konippi/servo-fetch/tree/main/skills/servo-fetch"},"layout":"multi","source":"github","category":"servo-fetch","frontmatter":{"name":"servo-fetch","description":"Fetch and render web pages using the Servo browser engine — a single binary with JS execution, CSS layout, screenshots, and content extraction. Use when a URL returns empty or incomplete content with plain HTTP fetch, when you need a screenshot without GPU, or when you need to run JavaScript in a page context. No browser download required."},"skills_sh_url":"https://skills.sh/konippi/servo-fetch/servo-fetch"},"updatedAt":"2026-05-18T18:56:39.756Z"}}