{
  "experimental": true,
  "product": {
    "name": "citation-tracker",
    "description": "Checks whether current AI search assistants (Perplexity, ChatGPT, Claude, Gemini) cite your target domains for a prompt, and whether ChatGPT's first search names your brand. A GEO/AEO visibility check, not a rank tracker.",
    "version": "0.1.0"
  },
  "endpoints": {
    "mcp": {
      "url": "https://citation-tracker.pixelcove.co/mcp",
      "transport": "streamable-http"
    }
  },
  "tools": [
    {
      "name": "citation_tracker_check",
      "description": "Sends one prompt to 1 to 4 search assistants (Perplexity, OpenAI, Anthropic, Gemini) and reports whether each cites your target domains: cited status, citation count, cited domains, model, and a structured error per engine. Started concurrently; a failed engine returns `cited: null` and does not block the others (PD7). Paid, $0.75/call; read-only and safe to retry.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "prompt": {
            "type": "string",
            "minLength": 1,
            "maxLength": 4000,
            "description": "The prompt to send to the search assistant(s), verbatim. 1 to 4000 characters."
          },
          "engines": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "perplexity",
                "openai",
                "anthropic",
                "gemini"
              ]
            },
            "minItems": 1,
            "maxItems": 4,
            "uniqueItems": true,
            "description": "1 to 4 distinct engines to check, from perplexity, openai, anthropic, gemini."
          },
          "targets": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 253,
              "pattern": "^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z]{2,63}$",
              "description": "A normalized domain, e.g. example.com (no scheme, no path, no whitespace, lowercase)."
            },
            "minItems": 1,
            "maxItems": 10,
            "description": "1 to 10 target domains to check for a citation."
          }
        },
        "required": [
          "prompt",
          "engines",
          "targets"
        ],
        "additionalProperties": false
      },
      "outputExample": {
        "results": [
          {
            "engine": "perplexity",
            "model": "sonar",
            "cited": true,
            "count": 2,
            "domains": [
              "example.com"
            ],
            "latency_ms": 4200,
            "error": null,
            "related_questions": [
              "what else does example.com offer"
            ]
          },
          {
            "engine": "openai",
            "model": "gpt-5.2-2025-12-11",
            "cited": false,
            "count": 0,
            "domains": [],
            "latency_ms": 6100,
            "error": null,
            "related_questions": []
          }
        ],
        "succeeded": 2,
        "failed": 0
      },
      "costClass": "expensive",
      "freeTier": false,
      "price": {
        "usd": "0.75",
        "currency": "USD"
      },
      "rails": [
        "stripe-prepaid",
        "x402"
      ]
    },
    {
      "name": "citation_tracker_check_perplexity",
      "description": "Sends one prompt to Perplexity (sonar) and reports whether it cites your target domains, with citation count and cited domains. Free: one call per caller and 100 calls total per UTC day; both limits fail closed. A real live evaluation before you pay for citation_tracker_check.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "prompt": {
            "type": "string",
            "minLength": 1,
            "maxLength": 4000,
            "description": "The prompt to send to the search assistant(s), verbatim. 1 to 4000 characters."
          },
          "targets": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 253,
              "pattern": "^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z]{2,63}$",
              "description": "A normalized domain, e.g. example.com (no scheme, no path, no whitespace, lowercase)."
            },
            "minItems": 1,
            "maxItems": 10,
            "description": "1 to 10 target domains to check for a citation."
          }
        },
        "required": [
          "prompt",
          "targets"
        ],
        "additionalProperties": false
      },
      "outputExample": {
        "results": [
          {
            "engine": "perplexity",
            "model": "sonar",
            "cited": true,
            "count": 1,
            "domains": [
              "example.com"
            ],
            "latency_ms": 4200,
            "error": null,
            "related_questions": [
              "what else does example.com offer"
            ]
          }
        ],
        "succeeded": 1,
        "failed": 0
      },
      "costClass": "cheap",
      "freeTier": true,
      "price": {
        "usd": "0",
        "currency": "USD"
      },
      "rails": [
        "stripe-prepaid",
        "x402"
      ]
    },
    {
      "name": "citation_tracker_shortlist_gate",
      "description": "Checks whether ChatGPT would search the web for one prompt and whether its first search query names any of your supplied brand or product terms (whole-word match). Use it to gate a prompt before spending on citation_tracker_check. Paid, $0.20/call; read-only and safe to retry.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "prompt": {
            "type": "string",
            "minLength": 1,
            "maxLength": 4000,
            "description": "The prompt to send to the search assistant(s), verbatim. 1 to 4000 characters."
          },
          "brand_terms": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            },
            "minItems": 1,
            "maxItems": 20,
            "description": "1 to 20 brand terms to look for in the first search query."
          },
          "product_terms": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            },
            "minItems": 0,
            "maxItems": 50,
            "default": [],
            "description": "0 to 50 product terms to look for in the first search query."
          }
        },
        "required": [
          "prompt",
          "brand_terms"
        ],
        "additionalProperties": false
      },
      "outputExample": {
        "searched": true,
        "fanout": [
          "Acme pricing vs competitors"
        ],
        "hits": [
          "Acme"
        ]
      },
      "costClass": "cheap",
      "freeTier": false,
      "price": {
        "usd": "0.2",
        "currency": "USD"
      },
      "rails": [
        "stripe-prepaid",
        "x402"
      ]
    }
  ],
  "payments": {
    "methods": [
      "stripe-prepaid",
      "x402"
    ]
  },
  "attribution": "Calls are attributed by an evidence hierarchy, strongest first: x402 payment, MCP call on an API key, declared client identity, human/manual test, unknown. Calls attributed unknown are never counted as agent-originated.",
  "docs": "https://github.com/PixelCove/citation-tracker#readme",
  "contact": "jon@pixelcove.co"
}
