{"name":"hydrafetch","description":"Turn any URL into clean Markdown and structured data your model can use. Scrape, crawl, search and extract with one API, one credit a page.","documentation":"https://docs.hydrafetch.com","endpoint":"https://api.hydrafetch.com/mcp","authorization":"OAuth 2.1 with PKCE","scopes":["web:scrape","web:extract"],"count":16,"tools":[{"name":"scrape","scope":"web:scrape","label":"Scrape","description":"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. A long page comes back in parts of maxCharacters (default 50000); when nextOffset is set, call again with that offset to read on. Each call costs 1 credit.","cost":"1 credit","annotations":{"readOnlyHint":true,"openWorldHint":true,"destructiveHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"url":{"type":"string","description":"The URL to scrape."},"formats":{"description":"Which outputs to return. Defaults to markdown.","type":"array","items":{"type":"string","enum":["markdown","html","rawHtml","links","structured"]}},"preferStructure":{"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'.","type":"boolean"},"maxCharacters":{"description":"Most characters of each text output to return in this call (default 50000). A longer page says so in truncated, with its full length, and gives nextOffset.","type":"integer","minimum":500,"maximum":9007199254740991},"offset":{"description":"Character position to start from, to read the rest of a long page. Defaults to 0.","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["url"]}},{"name":"map","scope":"web:scrape","label":"Map","description":"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.","cost":"1 credit","annotations":{"readOnlyHint":true,"openWorldHint":true,"destructiveHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"url":{"type":"string","description":"The seed URL to map."},"limit":{"description":"Max URLs to return.","type":"integer","minimum":1,"maximum":5000}},"required":["url"]}},{"name":"crawl","scope":"web:scrape","label":"Crawl","description":"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.","cost":"1 credit per page scraped","annotations":{"readOnlyHint":false,"openWorldHint":true,"destructiveHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"url":{"type":"string","description":"The site to start from."},"limit":{"description":"Maximum pages to scrape.","type":"integer","minimum":1,"maximum":500},"maxDepth":{"description":"How far from the seed to follow.","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["url"]}},{"name":"crawl_status","scope":"web:scrape","label":"Crawl status","description":"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.","cost":"free","annotations":{"readOnlyHint":true,"openWorldHint":true,"destructiveHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"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."},"offset":{"description":"Position of the first result to return. Defaults to 0.","type":"integer","minimum":0,"maximum":9007199254740991},"limit":{"description":"Results to return in this call (default 10).","type":"integer","minimum":1,"maximum":25},"maxCharsPerPage":{"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.","type":"integer","minimum":500,"maximum":9007199254740991}},"required":["crawlId"]}},{"name":"batch","scope":"web:scrape","label":"Batch","description":"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.","cost":"1 credit per URL scraped","annotations":{"readOnlyHint":false,"openWorldHint":true,"destructiveHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"urls":{"minItems":1,"maxItems":25000,"type":"array","items":{"type":"string"},"description":"The URLs to scrape."},"wait":{"description":"Seconds to wait for the batch before returning (default 45). 0 returns the batch id at once.","type":"integer","minimum":0,"maximum":55},"limit":{"description":"Results to return in this call (default 10).","type":"integer","minimum":1,"maximum":25},"maxCharsPerPage":{"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.","type":"integer","minimum":500,"maximum":9007199254740991}},"required":["urls"]}},{"name":"batch_status","scope":"web:scrape","label":"Batch status","description":"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.","cost":"free","annotations":{"readOnlyHint":true,"openWorldHint":true,"destructiveHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"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."},"offset":{"description":"Position of the first result to return. Defaults to 0.","type":"integer","minimum":0,"maximum":9007199254740991},"limit":{"description":"Results to return in this call (default 10).","type":"integer","minimum":1,"maximum":25},"maxCharsPerPage":{"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.","type":"integer","minimum":500,"maximum":9007199254740991}},"required":["batchId"]}},{"name":"jobs_search","scope":"web:scrape","label":"Search jobs","description":"Search open jobs collected from company career sites and hiring platforms, by whole words in the job title, with optional location, remote and posted-within filters. Newest first. Use it to find who is hiring for a role. Costs 1 credit per 10 jobs returned; a search with no jobs is free.","cost":"1 credit per 10 jobs returned","annotations":{"readOnlyHint":true,"openWorldHint":false,"destructiveHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"query":{"type":"string","maxLength":300,"description":"Words in the job title, like \"data engineer\"."},"location":{"description":"A city, region or country to match, like \"Berlin\".","type":"string","maxLength":200},"remoteOnly":{"description":"Only jobs marked remote.","type":"boolean"},"postedWithinDays":{"description":"Only jobs posted in the last N days.","type":"integer","minimum":1,"maximum":365},"limit":{"description":"Max jobs (default 10).","type":"integer","minimum":1,"maximum":100}},"required":["query"]}},{"name":"company_hiring_changes","scope":"web:scrape","label":"Company hiring changes","description":"What changed in companies' hiring since a date: jobs open now, opened and closed, by department, seniority and location, with the postings themselves. Give company websites like stripe.com. Costs 1 credit per company we have jobs for; companies we do not track are free.","cost":"1 credit per company we have jobs for","annotations":{"readOnlyHint":true,"openWorldHint":false,"destructiveHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"domains":{"minItems":1,"maxItems":25,"type":"array","items":{"type":"string","maxLength":2048},"description":"Company websites, like [\"stripe.com\"]."},"since":{"type":"string","description":"Report changes since this time, like 2026-10-01T00:00:00Z."}},"required":["domains","since"]}},{"name":"search","scope":"web:scrape","label":"Search","description":"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.","cost":"1 credit plus 1 per scraped result","annotations":{"readOnlyHint":true,"openWorldHint":true,"destructiveHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"query":{"type":"string","description":"The search query."},"limit":{"description":"Max results (default 5).","type":"integer","minimum":1,"maximum":15},"scrapeResults":{"description":"Also scrape each result to markdown, 1 extra credit per page (default false).","type":"boolean"},"preferStructure":{"description":"Keep headings, lists and tables in each scraped result.","type":"boolean"}},"required":["query"]}},{"name":"brand","scope":"web:scrape","label":"Brand","description":"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.","cost":"5 credits","annotations":{"readOnlyHint":true,"openWorldHint":true,"destructiveHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"domain":{"type":"string","description":"The company domain, e.g. stripe.com. A full URL works too."}},"required":["domain"]}},{"name":"logo","scope":"web:scrape","label":"Logo","description":"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.","cost":"1 credit","annotations":{"readOnlyHint":true,"openWorldHint":true,"destructiveHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"domain":{"type":"string","description":"The company domain, e.g. stripe.com. A full URL works too."},"theme":{"description":"The background the logo will sit on. Defaults to light.","type":"string","enum":["light","dark","auto"]},"type":{"description":"The square mark, or the full logotype. Defaults to icon.","type":"string","enum":["icon","wordmark"]}},"required":["domain"]}},{"name":"extract","scope":"web:extract","label":"Extract","description":"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.","cost":"5 credits per URL","annotations":{"readOnlyHint":true,"openWorldHint":true,"destructiveHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"urls":{"minItems":1,"type":"array","items":{"type":"string"},"description":"The URLs to extract from."},"prompt":{"description":"Natural-language description of what to pull.","type":"string"},"schema":{"description":"A JSON schema the result must conform to.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"preferStructure":{"description":"Keep headings, lists and tables in the text handed to the model.","type":"boolean"},"showConfidence":{"description":"For each field, return a confidence score and the exact source passage the value was drawn from.","type":"boolean"},"showSources":{"description":"Return the list of URLs that were actually extracted.","type":"boolean"}},"required":["urls"]}},{"name":"styleguide","scope":"web:scrape","label":"Styleguide","description":"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.","cost":"10 credits","annotations":{"readOnlyHint":true,"openWorldHint":true,"destructiveHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"domain":{"description":"The domain to read, e.g. stripe.com, using its homepage. Send this or url.","type":"string"},"url":{"description":"One page to read instead of the homepage, e.g. https://stripe.com/pricing.","type":"string"},"maxAge":{"description":"Accept a stored result no older than this many milliseconds. 0 reads fresh.","type":"integer","minimum":0,"maximum":9007199254740991}}}},{"name":"screenshot","scope":"web:scrape","label":"Screenshot","description":"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.","cost":"5 credits","annotations":{"readOnlyHint":false,"openWorldHint":true,"destructiveHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"url":{"type":"string","description":"The URL to capture."},"fullPage":{"description":"Capture the whole scrollable page rather than the viewport.","type":"boolean"},"viewport":{"description":"Screen size to render at. Defaults to desktop (1920x1080). Ignored when width or height are given.","type":"string","enum":["desktop","laptop","tablet","mobile"]},"viewportWidth":{"description":"Exact viewport width in pixels. Overrides viewport.","type":"integer","minimum":320,"maximum":3840},"viewportHeight":{"description":"Exact viewport height in pixels. Overrides viewport. With fullPage the capture still extends to the full page height.","type":"integer","minimum":240,"maximum":2160},"waitFor":{"description":"Extra milliseconds to let the page settle before capture.","type":"integer","minimum":0,"maximum":30000},"timeout":{"description":"Overall time budget for the capture, in milliseconds.","type":"integer","minimum":1000,"maximum":120000},"maxAge":{"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.","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["url"]}},{"name":"images","scope":"web:scrape","label":"Images","description":"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.","cost":"1 credit","annotations":{"readOnlyHint":true,"openWorldHint":true,"destructiveHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"url":{"type":"string","description":"The page to harvest images from."}},"required":["url"]}},{"name":"feedback","scope":"web:scrape","label":"Rate a result","description":"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.","cost":"free","annotations":{"readOnlyHint":false,"openWorldHint":false,"destructiveHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"requestId":{"description":"usage.requestId from the call being rated.","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)$"},"url":{"description":"The URL that call read, when the requestId is not to hand.","type":"string"},"rating":{"type":"string","enum":["good","bad"],"description":"good or bad."},"reasons":{"description":"What was wrong, for a bad rating.","type":"array","items":{"type":"string","enum":["missing_content","wrong_content","blocked","slow","formatting","other"]}},"note":{"description":"More detail.","type":"string","maxLength":500}},"required":["rating"]}}]}