# S Fetch

> Fetch a URL directly with scrapling's bot-detection bypass. Use when the user asks to fetch, curl, or scrape a URL from a bot-protected site. Use when this capability is needed.

- Skill: `tomevault-io/s-fetch` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add tomevault-io/s-fetch`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tomevault-io/s-fetch/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: tomevault-io (https://skillmd.com/u/tomevault-io)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tomevault-io/s-fetch

---


# s-fetch

Fetches a URL directly via scrapling, bypassing bot detection.

## Setup

If the bash command below fails because `scrapling-fetch-mcp` isn't
installed (e.g. `No such file or directory` for the `bin/python3`
path), follow `references/install.md` once before proceeding.

## Arguments

$ARGUMENTS — parse as `<url> [mode] [format]`

- **url** (required)
- **mode** (optional, default `basic`): `basic` | `stealth` | `max-stealth`
- **format** (optional, default `markdown`): `markdown` | `html`

## Instructions

Run the following Bash command, substituting URL, MODE, and FORMAT with the parsed values:

```bash
"$(uv tool dir)/scrapling-fetch-mcp/bin/python3" - <<'PYEOF'
import asyncio
from contextlib import redirect_stdout
from os import devnull

async def fetch(url, mode):
    with open(devnull, "w") as null, redirect_stdout(null):
        from scrapling.fetchers import AsyncFetcher, StealthyFetcher
        if mode == "basic":
            return await AsyncFetcher.get(url, stealthy_headers=True)
        elif mode == "stealth":
            return await StealthyFetcher.async_fetch(url, headless=True, network_idle=True)
        elif mode == "max-stealth":
            return await StealthyFetcher.async_fetch(
                url, headless=True, block_webrtc=True,
                network_idle=True, disable_resources=False, block_images=False
            )
        else:
            raise ValueError(f"Unknown mode: {mode}")

url = "URL"
mode = "MODE"
fmt = "FORMAT"

page = asyncio.run(fetch(url, mode))
html = page.html_content

if fmt == "markdown":
    from bs4 import BeautifulSoup
    from markdownify import markdownify as md
    soup = BeautifulSoup(html, "lxml")
    for tag in soup(["script", "style"]):
        tag.extract()
    body = soup.find("body")
    print(md(str(body if body else soup)))
else:
    print(html)
PYEOF
```

If mode was not given and `basic` returns blocked or empty content, retry with `stealth`, then `max-stealth`.

## Mode guide

| Mode | Speed | Use when |
|------|-------|----------|
| `basic` | 1–2s | Most sites; curl-cffi with stealth headers |
| `stealth` | 3–8s | Sites that block basic; headless Chromium via patchright |
| `max-stealth` | 10s+ | Heavily protected sites; full browser fingerprint |

---
> Source: [cyberchitta/scrapling-fetch-mcp](https://github.com/cyberchitta/scrapling-fetch-mcp) — distributed by [TomeVault](https://tomevault.io).
<!-- tomevault:4.0:skill_md:2026-06-17 -->

