pigfox.ai

API and MCP server

Run the AI search readiness check from code: a free JSON API anyone can call, and a remote MCP server so AI assistants can run it as a tool.

Both run the same check as the checker: they fetch the site's homepage, robots.txt, llms.txt and a HEAD of llms-full.txt, through the same safeguards. No key or sign-up is needed.

JSON API

GET https://pigfox.ai/api/v1/check?site=example.com

site is a domain; a full URL also works, and only its host is used. With curl:

curl -s 'https://pigfox.ai/api/v1/check?site=example.com'

The answer, here for a site with no robots.txt and no llms.txt (the crawlers list is cut to 2 of its 15 entries):

{
  "site": "example.com",
  "score": 69,
  "band": "needs-work",
  "grade": "Needs work",
  "checked_at": "2026-11-07T12:00:00Z",
  "report_url": "https://pigfox.ai/check?site=example.com",
  "badge_url": "https://pigfox.ai/badge/example.com.svg",
  "crawlers": [
    {
      "token": "OAI-SearchBot",
      "owner": "OpenAI",
      "purpose": "ChatGPT search results",
      "kind": "search",
      "access": "allowed"
    },
    {
      "token": "ChatGPT-User",
      "owner": "OpenAI",
      "purpose": "pages ChatGPT opens when a user asks",
      "kind": "search",
      "access": "allowed"
    }
  ],
  "robots_txt": {
    "url": "https://example.com/robots.txt",
    "status": 404,
    "state": "missing"
  },
  "llms_txt": {
    "present": false,
    "valid": false,
    "llms_full_txt": false
  },
  "homepage": {
    "url": "https://example.com/",
    "status": 200,
    "title": "Example Domain",
    "title_length": 14,
    "description_length": 0,
    "canonical": "",
    "lang": "en",
    "noindex": false,
    "h1": true,
    "json_ld_blocks": 0,
    "json_ld_invalid": 0,
    "organization": false,
    "website": false
  },
  "json_ld_types": [],
  "fixes": [
    {
      "points": 8,
      "text": "Add Schema.org JSON-LD: structured data states plainly who you are and what you offer."
    },
    {
      "points": 5,
      "text": "Add a meta description: a one-sentence summary that search results and AI tools can quote."
    },
    {
      "points": 5,
      "text": "Add a canonical link so crawlers know which address is the real one."
    },
    {
      "points": 5,
      "text": "Add Organization and WebSite structured data: who runs the site, its name and address."
    },
    {
      "points": 5,
      "text": "Add /llms.txt: a short Markdown summary of the site and links to its key pages, for AI tools."
    },
    {
      "points": 3,
      "text": "Make the title 30 to 60 characters (it is 14) so it says what the site is without being cut off."
    }
  ],
  "passes": [
    "AI search and assistant crawlers may read the homepage.",
    "AI training crawlers may read the homepage.",
    "The homepage loads (HTTP 200).",
    "The homepage may be indexed.",
    "The page language is set.",
    "There is an \u003ch1\u003e heading."
  ]
}

Fields

score
0 to 100, scored as described on how the check works.
band
ready (90+), mostly-ready (70 to 89), needs-work (40 to 69) or not-ready; grade says the same in words.
crawlers
Each AI crawler's access to the homepage: allowed, blocked or unknown (robots.txt could not be read), with the deciding rule. kind is how the score counts it: search or training.
llms_txt
Whether /llms.txt exists, starts with a # heading, and whether /llms-full.txt exists.
homepage
Status, final address, title and its length, description length, canonical, language, noindex, h1, and JSON-LD block counts; json_ld_types lists the Schema.org types found.
fixes
What to fix, most points first; passes is what passed.
checked_at
When the site was fetched (UTC). A result is reused for 10 minutes.

Limits and errors

Each client can start 6 new checks a minute; a site checked in the last 10 minutes comes from the cache and doesn't count. Over the limit the API answers 429 with Retry-After; a bad domain gets 400; a busy checker 503. Errors are JSON: {"error": "..."}. Responses carry Access-Control-Allow-Origin: *, so a web page on any site can call the API.

Private, loopback and reserved addresses are refused, as on the checker. Results are not stored beyond the 10-minute cache.

MCP server

A remote Model Context Protocol server lets an AI assistant run the check itself.

Endpoint
https://pigfox.ai/mcp
Transport
Streamable HTTP, JSON-RPC 2.0, one message per POST, no session
Protocol
2026-07-28, 2025-11-25, 2025-06-18, 2025-03-26
Tool
check_ai_search_readiness(site): returns the same data as the API, as structured content and as JSON text
Registry name
ai.pigfox/pigfox-ai, version 1.0.0

To add it to Claude Code:

claude mcp add --transport http pigfox-ai https://pigfox.ai/mcp

Other clients take the URL in their remote or HTTP server settings. A tool call, as a 2026-07-28 client sends it:

curl -s https://pigfox.ai/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2026-07-28' \
  -H 'Mcp-Method: tools/call' \
  -H 'Mcp-Name: check_ai_search_readiness' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"check_ai_search_readiness","arguments":{"site":"example.com"},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientCapabilities":{}}}}'

Clients on earlier revisions start with initialize as usual. The tool is read-only and shares the API's limits; a refused domain or a rate limit comes back as a tool error the model can read.

The score says whether AI tools may read a homepage and can tell what it is. It doesn't predict rankings or citations.