
Turn any URL into clean Markdown and structured data. Scrape, crawl, search and extract.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Scrape a list of URLs you already have, such as pages found with map. Waits for the batch to finish and returns the first page of results in the same call, so a short list needs one call; read further pages, or a batch still running, with batch_status. Each URL scraped costs 1 credit.
The URLs to scrape.
Seconds to wait for the batch before returning (default 45). 0 returns the batch id at once.
Results to return in this call (default 10).
Cut each page's markdown to this many characters; a cut page says so in data.truncated with its full length. Use it when results are too large for your context.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Scrape a list of URLs you already have, such as pages found with map. Waits for the batch to finish and returns the first page of results in the same call, so a short list needs one call; read further pages, or a batch still running, with batch_status. Each URL scraped costs 1 credit.
| Argument | Type | Description |
|---|---|---|
| urls* | array | The URLs to scrape. |
| wait | integer | Seconds to wait for the batch before returning (default 45). 0 returns the batch id at once. |
| limit | integer | Results to return in this call (default 10). |
| maxCharsPerPage | integer | Cut each page's markdown to this many characters; a cut page says so in data.truncated with its full length. Use it when results are too large for your context. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"urls"
],
"properties": {
"urls": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 25000,
"minItems": 1,
"description": "The URLs to scrape."
},
"wait": {
"type": "integer",
"maximum": 55,
"minimum": 0,
"description": "Seconds to wait for the batch before returning (default 45). 0 returns the batch id at once."
},
"limit": {
"type": "integer",
"maximum": 25,
"minimum": 1,
"description": "Results to return in this call (default 10)."
},
"maxCharsPerPage": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 500,
"description": "Cut each page's markdown to this many characters; a cut page says so in data.truncated with its full length. Use it when results are too large for your context."
}
}
}Read a batch started with batch: its progress, and one page of results in the order the URLs were sent. When nextOffset is not null, pass it as offset to read the next page of results.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Results to return in this call (default 10). |
| offset | integer | Position of the first result to return. Defaults to 0. |
| batchId* | string | The id returned by batch. |
| maxCharsPerPage | integer | Cut each page's markdown to this many characters; a cut page says so in data.truncated with its full length. Use it when results are too large for your context. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"batchId"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 25,
"minimum": 1,
"description": "Results to return in this call (default 10)."
},
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Position of the first result to return. Defaults to 0."
},
"batchId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
"description": "The id returned by batch."
},
"maxCharsPerPage": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 500,
"description": "Cut each page's markdown to this many characters; a cut page says so in data.truncated with its full length. Use it when results are too large for your context."
}
}
}A company's brand from its domain: logos for light and dark backgrounds, its colours, name, description and social profiles. Use it to answer what a company is or how it presents itself.
| Argument | Type | Description |
|---|---|---|
| domain* | string | The company domain, e.g. stripe.com. A full URL works too. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"domain"
],
"properties": {
"domain": {
"type": "string",
"description": "The company domain, e.g. stripe.com. A full URL works too."
}
}
}Discover and scrape the pages of a website as one background job, following its links from a starting URL. Returns a crawl id straight away; read progress and results with crawl_status. Each page scraped costs 1 credit, so set limit to what you need.
| Argument | Type | Description |
|---|---|---|
| url* | string | The site to start from. |
| limit | integer | Maximum pages to scrape. |
| maxDepth | integer | How far from the seed to follow. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The site to start from."
},
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "Maximum pages to scrape."
},
"maxDepth": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "How far from the seed to follow."
}
}
}Read a crawl started with crawl: its progress, and one page of the scraped results. When nextOffset is not null, pass it as offset to read the next page of results.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Results to return in this call (default 10). |
| offset | integer | Position of the first result to return. Defaults to 0. |
| crawlId* | string | The id returned by crawl. |
| maxCharsPerPage | integer | Cut each page's markdown to this many characters; a cut page says so in data.truncated with its full length. Use it when results are too large for your context. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"crawlId"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 25,
"minimum": 1,
"description": "Results to return in this call (default 10)."
},
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Position of the first result to return. Defaults to 0."
},
"crawlId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
"description": "The id returned by crawl."
},
"maxCharsPerPage": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 500,
"description": "Cut each page's markdown to this many characters; a cut page says so in data.truncated with its full length. Use it when results are too large for your context."
}
}
}Pull specific fields out of one or more pages as JSON, shaped by a JSON schema or described in a prompt. Use it when you need values such as prices, names or dates rather than the whole page text.
| Argument | Type | Description |
|---|---|---|
| urls* | array | The URLs to extract from. |
| prompt | string | Natural-language description of what to pull. |
| schema | object | A JSON schema the result must conform to. |
| showSources | boolean | Return the list of URLs that were actually extracted. |
| showConfidence | boolean | For each field, return a confidence score and the exact source passage the value was drawn from. |
| preferStructure | boolean | Keep headings, lists and tables in the text handed to the model. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"urls"
],
"properties": {
"urls": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "The URLs to extract from."
},
"prompt": {
"type": "string",
"description": "Natural-language description of what to pull."
},
"schema": {
"type": "object",
"description": "A JSON schema the result must conform to.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"showSources": {
"type": "boolean",
"description": "Return the list of URLs that were actually extracted."
},
"showConfidence": {
"type": "boolean",
"description": "For each field, return a confidence score and the exact source passage the value was drawn from."
},
"preferStructure": {
"type": "boolean",
"description": "Keep headings, lists and tables in the text handed to the model."
}
}
}Tell Hydrafetch whether an earlier result was accurate. Use it after a scrape, search or other call returns missing, wrong or blocked content, so it gets looked at; a good rating is welcome too. Pass the requestId from that call's usage block, or the URL it read.
| Argument | Type | Description |
|---|---|---|
| url | string | The URL that call read, when the requestId is not to hand. |
| note | string | More detail. |
| rating* | string | good or bad. |
| reasons | array | What was wrong, for a bad rating. |
| requestId | string | usage.requestId from the call being rated. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"rating"
],
"properties": {
"url": {
"type": "string",
"description": "The URL that call read, when the requestId is not to hand."
},
"note": {
"type": "string",
"maxLength": 500,
"description": "More detail."
},
"rating": {
"enum": [
"good",
"bad"
],
"type": "string",
"description": "good or bad."
},
"reasons": {
"type": "array",
"items": {
"enum": [
"missing_content",
"wrong_content",
"blocked",
"slow",
"formatting",
"other"
],
"type": "string"
},
"description": "What was wrong, for a bad rating."
},
"requestId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "usage.requestId from the call being rated."
}
}
}Harvest a page's images with their metadata, without rendering it. Cheaper than a screenshot and returns the source images rather than a picture of the page.
| Argument | Type | Description |
|---|---|---|
| url* | string | The page to harvest images from. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The page to harvest images from."
}
}
}A company's logo as a directly embeddable image URL, chosen for the background you name. Use this rather than brand when the mark is all you need: it costs a fifth as much and returns one asset instead of the whole record.
| Argument | Type | Description |
|---|---|---|
| type | string | The square mark, or the full logotype. Defaults to icon. |
| theme | string | The background the logo will sit on. Defaults to light. |
| domain* | string | The company domain, e.g. stripe.com. A full URL works too. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"domain"
],
"properties": {
"type": {
"enum": [
"icon",
"wordmark"
],
"type": "string",
"description": "The square mark, or the full logotype. Defaults to icon."
},
"theme": {
"enum": [
"light",
"dark",
"auto"
],
"type": "string",
"description": "The background the logo will sit on. Defaults to light."
},
"domain": {
"type": "string",
"description": "The company domain, e.g. stripe.com. A full URL works too."
}
}
}List the URLs on a website, found through its sitemap and links, without fetching their content. Use it to see which pages exist before choosing which to scrape.
| Argument | Type | Description |
|---|---|---|
| url* | string | The seed URL to map. |
| limit | integer | Max URLs to return. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The seed URL to map."
},
"limit": {
"type": "integer",
"maximum": 5000,
"minimum": 1,
"description": "Max URLs to return."
}
}
}Fetch one web page and return its main content as clean markdown, with optional HTML, links or structured data. Use it to read a page whose URL you already have. For many pages of one site use crawl; for a list of URLs use batch.
| Argument | Type | Description |
|---|---|---|
| url* | string | The URL to scrape. |
| formats | array | Which outputs to return. Defaults to markdown. |
| preferStructure | boolean | Keep headings, lists and tables as markdown. Default false optimises for raw content and can return unstructured text on marketing and listing pages. Turn on when the document structure matters, or retry with it if `structure` came back 'plain'. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The URL to scrape."
},
"formats": {
"type": "array",
"items": {
"enum": [
"markdown",
"html",
"rawHtml",
"links",
"structured"
],
"type": "string"
},
"description": "Which outputs to return. Defaults to markdown."
},
"preferStructure": {
"type": "boolean",
"description": "Keep headings, lists and tables as markdown. Default false optimises for raw content and can return unstructured text on marketing and listing pages. Turn on when the document structure matters, or retry with it if `structure` came back 'plain'."
}
}
}Render a page in a real browser and capture a PNG, returning its public URL. Use when the question is what the page looks like rather than what it says.
| Argument | Type | Description |
|---|---|---|
| url* | string | The URL to capture. |
| maxAge | integer | Reuse a stored screenshot younger than this many milliseconds. Defaults to 7 days, so a repeat returns the stored PNG without re-rendering and without applying waitFor. Pass 0 to force a fresh capture. |
| timeout | integer | Overall time budget for the capture, in milliseconds. |
| waitFor | integer | Extra milliseconds to let the page settle before capture. |
| fullPage | boolean | Capture the whole scrollable page rather than the viewport. |
| viewport | string | Screen size to render at. Defaults to desktop (1920x1080). Ignored when width or height are given. |
| viewportWidth | integer | Exact viewport width in pixels. Overrides viewport. |
| viewportHeight | integer | Exact viewport height in pixels. Overrides viewport. With fullPage the capture still extends to the full page height. |
Search the web and return ranked results: title, url and snippet. Set scrapeResults to also fetch each result as markdown, at 1 extra credit per page.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Max results (default 5). |
| query* | string | The search query. |
| scrapeResults | boolean | Also scrape each result to markdown, 1 extra credit per page (default false). |
| preferStructure | boolean | Keep headings, lists and tables in each scraped result. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 15,
"minimum": 1,
"description": "Max results (default 5)."
},
"query": {
"type": "string",
"description": "The search query."
},
"scrapeResults": {
"type": "boolean",
"description": "Also scrape each result to markdown, 1 extra credit per page (default false)."
},
"preferStructure": {
"type": "boolean",
"description": "Keep headings, lists and tables in each scraped result."
}
}
}A site's design tokens read from computed styles in a real browser: colours by role with contrast ratios, the dark theme colours when the site has one, the type scale, corner radius and button styling, how panels, the header bar and panel titles are drawn, plus ready-made CSS, Tailwind and shadcn/ui stylesheets. Values defined through CSS variables come back resolved to the hex actually painted. To recreate how a site looks rather than only its tokens, take a screenshot of the page too.
| Argument | Type | Description |
|---|---|---|
| url | string | One page to read instead of the homepage, e.g. https://stripe.com/pricing. |
| domain | string | The domain to read, e.g. stripe.com, using its homepage. Send this or url. |
| maxAge | integer | Accept a stored result no older than this many milliseconds. 0 reads fresh. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"url": {
"type": "string",
"description": "One page to read instead of the homepage, e.g. https://stripe.com/pricing."
},
"domain": {
"type": "string",
"description": "The domain to read, e.g. stripe.com, using its homepage. Send this or url."
},
"maxAge": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Accept a stored result no older than this many milliseconds. 0 reads fresh."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The URL to capture."
},
"maxAge": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Reuse a stored screenshot younger than this many milliseconds. Defaults to 7 days, so a repeat returns the stored PNG without re-rendering and without applying waitFor. Pass 0 to force a fresh capture."
},
"timeout": {
"type": "integer",
"maximum": 120000,
"minimum": 1000,
"description": "Overall time budget for the capture, in milliseconds."
},
"waitFor": {
"type": "integer",
"maximum": 30000,
"minimum": 0,
"description": "Extra milliseconds to let the page settle before capture."
},
"fullPage": {
"type": "boolean",
"description": "Capture the whole scrollable page rather than the viewport."
},
"viewport": {
"enum": [
"desktop",
"laptop",
"tablet",
"mobile"
],
"type": "string",
"description": "Screen size to render at. Defaults to desktop (1920x1080). Ignored when width or height are given."
},
"viewportWidth": {
"type": "integer",
"maximum": 3840,
"minimum": 320,
"description": "Exact viewport width in pixels. Overrides viewport."
},
"viewportHeight": {
"type": "integer",
"maximum": 2160,
"minimum": 240,
"description": "Exact viewport height in pixels. Overrides viewport. With fullPage the capture still extends to the full page height."
}
}
}