Skip to content

Adam Hale Tools: Web Research and Open Data

by tools.adamhaleworks.workers.dev · remote · no sign-in to list tools · v1.1.0 · published by dev.workers.adamhaleworks.tools

Free web lookups; PDF to Markdown, audio transcripts, screenshots, WHOIS/DNS paid per call via x402.

Changes · 5

12 tools: 5 change things and 7 only read.

Scanned Oct 21, 2026

1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http web-research https://tools.adamhaleworks.workers.dev/mcp

Findings

Matches of fixed checks, with the text they matched.

1 warn
  • The server marks "document_to_markdown" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The description's first verb is "convert": a word for a change.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

12 tools

Changes things 5Claude Code: ask
  • document_to_markdownConvert one document at a public URL to Markdown from its text layer: PDF, Word DOCX, Excel XLSX/XLSM/XLSB/XLS, OpenDocument ODS/ODT, CSV, HTML, XML or Apple Numbers, up to 10 MB, …1 finding

    Why it is in this group

    • The description's first verb is "convert": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "document_to_markdown" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The description's first verb is "convert": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Convert one document at a public URL to Markdown from its text layer: PDF, Word DOCX, Excel XLSX/XLSM/XLSB/XLS, OpenDocument ODS/ODT, CSV, HTML, XML or Apple Numbers, up to 10 MB, Markdown up to 250,000 characters. Not OCR: scanned PDFs, images, PPTX and encrypted files are refused and not charged. Paid only: $0.004 USDC per file. Paid calls made without a payment return isError with the x402 v2 PaymentRequired object (amount in USDC atomic units, network, payTo, HTTP endpoint); retry with the signed PaymentPayload in params._meta["x402/payment"]. Invalid input and calls where every item fails are never charged. Fetches follow robots.txt, use the User-Agent AdamHaleTools/1.0 and refuse private or internal addresses.

    Annotations the server declares

    • title: PDF and document to Markdown
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • domain_intelWho a domain is registered with and since when (RDAP: registrar, created, expires, age, status, nameservers, DNSSEC), its DNS records (A, AAAA, MX, NS, TXT, CAA) and email setup (p…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Who a domain is registered with and since when (RDAP: registrar, created, expires, age, status, nameservers, DNSSEC), its DNS records (A, AAAA, MX, NS, TXT, CAA) and email setup (provider, SPF and DMARC policy). No registrant personal data. Paid only: up to 3 domains per call for $0.003 USDC. Paid calls made without a payment return isError with the x402 v2 PaymentRequired object (amount in USDC atomic units, network, payTo, HTTP endpoint); retry with the signed PaymentPayload in params._meta["x402/payment"]. Invalid input and calls where every item fails are never charged. Fetches follow robots.txt, use the User-Agent AdamHaleTools/1.0 and refuse private or internal addresses.

    Annotations the server declares

    • title: Domain WHOIS (RDAP), DNS and email security
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • robots_txt_checkCrawl preflight: whether each user agent may fetch each URL under the site's robots.txt (RFC 9309, longest match, '*' fallback), with crawl-delay, the sitemaps robots.txt lists and…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Crawl preflight: whether each user agent may fetch each URL under the site's robots.txt (RFC 9309, longest match, '*' fallback), with crawl-delay, the sitemaps robots.txt lists and whether the site publishes /llms.txt. Default agents: GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot, Claude-User, PerplexityBot, Google-Extended, Googlebot, Bingbot, CCBot, Applebot-Extended, Bytespider and *. Paid only: up to 5 URLs per call for $0.001 USDC. Paid calls made without a payment return isError with the x402 v2 PaymentRequired object (amount in USDC atomic units, network, payTo, HTTP endpoint); retry with the signed PaymentPayload in params._meta["x402/payment"]. Invalid input and calls where every item fails are never charged. Fetches follow robots.txt, use the User-Agent AdamHaleTools/1.0 and refuse private or internal addresses.

    Annotations the server declares

    • title: robots.txt crawl permission check
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • seo_meta_tags_checkOn-page SEO audit of web pages: title and meta description lengths, canonical, robots/noindex and X-Robots-Tag, H1/H2, hreflang, Open Graph, Twitter card and JSON-LD rich-result ch…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    On-page SEO audit of web pages: title and meta description lengths, canonical, robots/noindex and X-Robots-Tag, H1/H2, hreflang, Open Graph, Twitter card and JSON-LD rich-result checks, with machine-readable issue codes. Free for 1 URL when the free web tool is enabled; up to 3 URLs per call cost $0.004 USDC. Paid calls made without a payment return isError with the x402 v2 PaymentRequired object (amount in USDC atomic units, network, payTo, HTTP endpoint); retry with the signed PaymentPayload in params._meta["x402/payment"]. Invalid input and calls where every item fails are never charged. Fetches follow robots.txt, use the User-Agent AdamHaleTools/1.0 and refuse private or internal addresses.

    Annotations the server declares

    • title: SEO meta tag and schema.org check
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • transcribe_short_audioTranscribe one short audio file (direct public URL to MP3, WAV, M4A, OGG, FLAC or WebM; one file up to 2 MB and 20 minutes) with Whisper large-v3-turbo, or translate it to English:…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Transcribe one short audio file (direct public URL to MP3, WAV, M4A, OGG, FLAC or WebM; one file up to 2 MB and 20 minutes) with Whisper large-v3-turbo, or translate it to English: text, timed segments, WebVTT and detected language. No YouTube or social media pages. Paid only: $0.01 USDC per file. Paid calls made without a payment return isError with the x402 v2 PaymentRequired object (amount in USDC atomic units, network, payTo, HTTP endpoint); retry with the signed PaymentPayload in params._meta["x402/payment"]. Invalid input and calls where every item fails are never charged. Fetches follow robots.txt, use the User-Agent AdamHaleTools/1.0 and refuse private or internal addresses.

    Annotations the server declares

    • title: Short audio transcription (Whisper)
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
Only reads 7Claude Code: allow
  • page_to_markdownRead web pages: returns each page's main content as clean Markdown without navigation, scripts or ads (headings, lists, absolute links, tables, code blocks), plus title, descriptio…No findings

    Why it is in this group

    • The description's first verb is "read": a word for reading.
    Description, as the server wrote it
    Read web pages: returns each page's main content as clean Markdown without navigation, scripts or ads (headings, lists, absolute links, tables, code blocks), plus title, description, language, canonical URL and word count; up to 100,000 characters per page. Does not get past bot walls. Paid only: up to 3 URLs per call for $0.002 USDC. Paid calls made without a payment return isError with the x402 v2 PaymentRequired object (amount in USDC atomic units, network, payTo, HTTP endpoint); retry with the signed PaymentPayload in params._meta["x402/payment"]. Invalid input and calls where every item fails are never charged. Fetches follow robots.txt, use the User-Agent AdamHaleTools/1.0 and refuse private or internal addresses.

    Annotations the server declares

    • title: Web page to clean Markdown
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • rss_to_jsonRead news feeds or blogs as clean JSON: accepts feed URLs or plain site URLs (finds the feed via <link rel=alternate>), normalises RSS 0.9x/2.0, RDF, Atom and JSON Feed to one item…No findings

    Why it is in this group

    • The description's first verb is "read": a word for reading.
    Description, as the server wrote it
    Read news feeds or blogs as clean JSON: accepts feed URLs or plain site URLs (finds the feed via <link rel=alternate>), normalises RSS 0.9x/2.0, RDF, Atom and JSON Feed to one item schema (title, url, publishedAt, author, categories, summary), up to 100 items per feed. Free for 1 feed; up to 5 feeds per call cost $0.003 USDC. Paid calls made without a payment return isError with the x402 v2 PaymentRequired object (amount in USDC atomic units, network, payTo, HTTP endpoint); retry with the signed PaymentPayload in params._meta["x402/payment"]. Invalid input and calls where every item fails are never charged. Fetches follow robots.txt, use the User-Agent AdamHaleTools/1.0 and refuse private or internal addresses.

    Annotations the server declares

    • title: RSS, Atom and JSON Feed to JSON
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • sitemap_urlsList the pages of a website from its sitemaps: finds them via robots.txt or common paths, follows sitemap indexes, reads gzip, text and feed sitemaps, returns URLs with lastmod.No findings

    Why it is in this group

    • The description's first verb is "list": a word for reading.
    Description, as the server wrote it
    List the pages of a website from its sitemaps: finds them via robots.txt or common paths, follows sitemap indexes, reads gzip, text and feed sitemaps, returns URLs with lastmod. Free: up to 2,000 URLs from 12 sitemap files. With bulk=true: up to 5,000 URLs from 20 files for $0.004 USDC. Paid calls made without a payment return isError with the x402 v2 PaymentRequired object (amount in USDC atomic units, network, payTo, HTTP endpoint); retry with the signed PaymentPayload in params._meta["x402/payment"]. Invalid input and calls where every item fails are never charged. Fetches follow robots.txt, use the User-Agent AdamHaleTools/1.0 and refuse private or internal addresses.

    Annotations the server declares

    • title: Sitemap URL extractor
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • tech_stack_lookupDetect what a website is built with: CMS, frameworks, analytics, CDN, hosting, email and DNS providers (MX, SPF, DMARC) and a security-header grade, from one fetch of its homepage.No findings

    Why it is in this group

    • The name "tech_stack_lookup" says "lookup": a word for reading.
    Description, as the server wrote it
    Detect what a website is built with: CMS, frameworks, analytics, CDN, hosting, email and DNS providers (MX, SPF, DMARC) and a security-header grade, from one fetch of its homepage. Free for 1 domain per call (10 free calls a minute per IP); 2-3 domains in one call cost $0.005 USDC. Paid calls made without a payment return isError with the x402 v2 PaymentRequired object (amount in USDC atomic units, network, payTo, HTTP endpoint); retry with the signed PaymentPayload in params._meta["x402/payment"]. Invalid input and calls where every item fails are never charged. Fetches follow robots.txt, use the User-Agent AdamHaleTools/1.0 and refuse private or internal addresses.

    Annotations the server declares

    • title: Website tech stack lookup
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • url_status_checkCheck whether links are alive: HTTP status, every redirect hop, final URL and a classification (ok, redirect, broken, restricted, blocked_by_site, disallowed_by_robots_txt, timeout…No findings

    Why it is in this group

    • The name "url_status_check" says "status": a word for reading.
    Description, as the server wrote it
    Check whether links are alive: HTTP status, every redirect hop, final URL and a classification (ok, redirect, broken, restricted, blocked_by_site, disallowed_by_robots_txt, timeout). HEAD first, GET to confirm errors. Free for 1 URL when the free web tool is enabled; up to 10 URLs per call cost $0.003 USDC. Paid calls made without a payment return isError with the x402 v2 PaymentRequired object (amount in USDC atomic units, network, payTo, HTTP endpoint); retry with the signed PaymentPayload in params._meta["x402/payment"]. Invalid input and calls where every item fails are never charged. Fetches follow robots.txt, use the User-Agent AdamHaleTools/1.0 and refuse private or internal addresses.

    Annotations the server declares

    • title: URL status and redirect checker
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • website_screenshotScreenshot one public web page in a headless browser: desktop (1440x900) or mobile (390x844) viewport, PNG or JPEG, returned as an image.No findings

    Why it is in this group

    • The name "website_screenshot" says "screenshot": a word for reading.
    Description, as the server wrote it
    Screenshot one public web page in a headless browser: desktop (1440x900) or mobile (390x844) viewport, PNG or JPEG, returned as an image. Viewport only, no logins or scripts; follows robots.txt and does not get past bot walls; at most one screenshot every 10 seconds across all callers. Paid only: $0.01 USDC per page. Paid calls made without a payment return isError with the x402 v2 PaymentRequired object (amount in USDC atomic units, network, payTo, HTTP endpoint); retry with the signed PaymentPayload in params._meta["x402/payment"]. Invalid input and calls where every item fails are never charged. Fetches follow robots.txt, use the User-Agent AdamHaleTools/1.0 and refuse private or internal addresses.

    Annotations the server declares

    • title: Website screenshot
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.1.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http web-research https://tools.adamhaleworks.workers.dev/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__web-research__tech_stack_lookup",
      "mcp__web-research__url_status_check",
      "mcp__web-research__sitemap_urls",
      "mcp__web-research__rss_to_json",
      "mcp__web-research__ted_tender_search",
      "mcp__web-research__page_to_markdown",
      "mcp__web-research__website_screenshot"
    ],
    "ask": [
      "mcp__web-research__seo_meta_tags_check",
      "mcp__web-research__domain_intel",
      "mcp__web-research__robots_txt_check",
      "mcp__web-research__document_to_markdown",
      "mcp__web-research__transcribe_short_audio"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as web-research. Review it before you use it.