HrefGate

Paste the HTML of a page (its <link rel="alternate" hreflang> tags), an XML sitemap with xhtml:link alternates, or a JSON set of pages, and HrefGate checks: language, script and region codes (en-UK, en_US, jp and other common mistakes, with fixes), absolute hrefs, duplicate and conflicting codes, x-default, self-reference, rel="canonical" conflicts, and reciprocal return links. HrefGate never fetches URLs, and nothing you paste is stored or logged.


JSON API

curl -s -X POST 'https://hrefgate.mike-tusa.workers.dev/api/lint?page_url=https://example.com/en/' \
  -H 'content-type: text/html' --data-binary @page.html

Also accepts a sitemap or {"pages":[{"url","canonical","alternates":[{"hreflang","href"}]}]} to check return links across pages. Free, no key: about 30 checks per minute per IP. OpenAPI 3.1 spec

For AI agents (MCP)

HrefGate is also a remote Model Context Protocol (MCP) server. Most MCP clients accept this config; some use a different format (for example, VS Code uses a servers key). Clients with a settings screen just need the URL https://hrefgate.mike-tusa.workers.dev/mcp.

{ "mcpServers": { "hrefgate": { "type": "http", "url": "https://hrefgate.mike-tusa.workers.dev/mcp" } } }

Machine-readable docs: llms.txt · OpenAPI 3.1 spec

Privacy

Submitted content is checked in memory and discarded. It is never written to storage or logs, and HrefGate never fetches URLs (including page_url). For rate limits and an anonymous daily visitor count we use a one-way hash of your network address and the date; the address itself is not stored and the hash expires after 9 days.