# Sluicer > Turn a web page into structured data. No model, no API key, no bill. Every link below is a page's markdown source, served beside the page; the site shows the same page as HTML. ## Start - [Home](https://gi0tto.github.io/sluicer/index.md): Most scrapers break without a sound. The site changes its markup, and the scraper keeps running and returns nulls, or the wrong column, for weeks before anyone notices. - [Getting started](https://gi0tto.github.io/sluicer/getting-started.md): Ten minutes from nothing to reading your own pages: install Sluicer, read a page, understand what came back, and do the same from Python and from an agent. ## Guides - [Extractors](https://gi0tto.github.io/sluicer/extractors.md): The most common way a scraper fails is not a crash. The site changes its markup, and the scraper keeps running and returns nulls, or the wrong column, for weeks before anyone notices. An extractor is built the other way round: it is learnt once from a few pages, kept in a small file, replayed for nothing, and every replay checks the page against what was learnt. A page that drifted is a failed run, never a quiet one. When it fails, `heal` says what moved and where. - [In your agent](https://gi0tto.github.io/sluicer/agents.md): Sluicer's MCP server is one command, and every client that speaks MCP can start it. - [HTTP API](https://gi0tto.github.io/sluicer/http-api.md): `sluicer serve` answers the MCP server's tools over HTTP, one address per tool, so any language that can send a POST can use Sluicer. They are the twelve tools an agent gets, each in the MCP reference, with the same arguments, the same answers and the same output schemas, because it is built from them: an HTTP call goes through the MCP SDK's own `call_tool`, argument validation and output-schema check included. A tool the MCP server gains is served here with nothing else to change. At `/mcp` it is the MCP server itself, over MCP's streamable HTTP transport, for a client that does not start servers over stdio: MCP over HTTP, with n8n and Dify. - [In JavaScript](https://gi0tto.github.io/sluicer/javascript.md): `sluicer` on npm is the Python package itself, run in Pyodide, Python compiled to WebAssembly. Nothing is rewritten in JavaScript: the package carries the wheel built from the same commit as the Python release of the same version, installs it into Pyodide when it starts, and hands every call to it. The answers are the Python package's, field for field: its tests hold them to the native package's on 22 pages, a page for each reader and each option. - [Crawling](https://gi0tto.github.io/sluicer/crawling.md): `extract` reads the page you name. A site is many pages, and there are three ways to read one: from the list its sitemaps give (`map`), by following its links (`crawl`), or from a list you already have (`batch`). Every page goes through the same fetch ladder as one page does, so `robots.txt`, the address guard and the 16 MiB bound apply to each of them, and every site is asked one request at a time with its delay between. Politeness is not an option here; it is what the feature is. - [Configuration](https://gi0tto.github.io/sluicer/configuration.md): The options you give every command -- a proxy, the headers a site wants, a cache, a crawl's delay, JSON output -- can be given once, in a file. The file is read by the `sluicer` command only: the Python API, the MCP server and the HTTP API take their arguments as they are called and read no file. - [Web archives](https://gi0tto.github.io/sluicer/warc.md): Two ways in: a WARC file you hold, and a page as the Wayback Machine captured it. - [Audit](https://gi0tto.github.io/sluicer/audit.md): `sluicer audit` holds what a page declares to what its documentation asks of it. For every record JSON-LD, microdata and RDFa declare, it says which of Google's rich-result features the record's type is documented for, which required and recommended properties it lacks, and which of its values are in a form the documentation or schema.org refuses. Then what the page as a whole lacks, where two vocabularies contradict each other, which AI agents the site's robots.txt admits, and whether its llms.txt keeps to llmstxt.org's format. In a workflow, the GitHub Action runs it on the pages you name and fails the check when one breaks a rule. - [In GitHub Actions](https://gi0tto.github.io/sluicer/github-action.md): `action.yml` at the repository's root is a GitHub Action that runs `sluicer audit` on the pages you name, so a pull request that breaks a page's structured data fails its checks, with each rule it breaks linked to the documentation that states it. - [Moving from extruct](https://gi0tto.github.io/sluicer/extruct.md): extruct reads the vocabularies a page declares and returns each as the page wrote it. It has had no release since 8 November 2024. `sluicer.compat.extruct` answers extruct's calls with extruct's shapes, so the move is one line. ## Reference - [Command line](https://gi0tto.github.io/sluicer/reference/cli.md): Every command's own `--help`, as `sluicer` prints it. Generated from the code by `scripts/reference.py`. Commands and options complete in bash, zsh and fish: see Shell completion; their defaults can come from a file: see Configuration. - [MCP tools](https://gi0tto.github.io/sluicer/reference/mcp.md): The 12 tools the server lists to an agent, each with its description and parameters exactly as the agent receives them. Generated from the running server by `scripts/reference.py`; how to add the server to a client is in In your agent. - [Python](https://gi0tto.github.io/sluicer/reference/python.md): The functions and types a program calls, with their signatures and their own docstrings. Generated from the code by `scripts/reference.py`. ## Measured - [Scoreboard](https://gi0tto.github.io/sluicer/scoreboard.md): How often Sluicer's `summary` gets a page's title, author and publication date right, measured beside the tools people use for the same job, on a public annotated corpus, with the losses in the same table as the wins. Regenerated on 2026-09-25 from commit `10211f3` by `uv run bench/run.py`; the method and every pin are in `bench/`. - [As served](https://gi0tto.github.io/sluicer/scoreboard-served.md): The scoreboard measures Sluicer on WCXB's copies of its pages, and WCXB removed every `