Skip to main content
Glama
Website Auditor MCP

Website Auditor MCP

Check AI visibility

get_ai_visibility

Score how visible a website is to AI assistants like ChatGPT, Perplexity, Claude, Gemini and Copilot, with per-engine breakdowns, competitor gaps, cited sources and 7/30-day trend data.

Instructions

Check how visible a website is to AI assistants right now. Use this whenever someone asks "does ChatGPT/Perplexity/Claude/Gemini/Copilot recommend this business," "is my site showing up in AI answers," "what's my AI visibility / GEO score," or wants a quick read on whether an AI assistant would surface a given domain. Returns an overall AI-visibility score (0–100), a per-engine breakdown (ChatGPT, Perplexity, Claude, Gemini, Microsoft Copilot, Google AI Overviews), and the top competitor appearing in place of the site. When the audit recorded citations, sources lists the documents the assistants actually read, ranked by cross-engine agreement, each marked yours, competitor or third_party — treat competitor rows as context, not as placement targets; sources: null means the recorded answers cited nothing attributable, and an absent key means citations were not recorded for this audit. The result also includes trend data: 7- and 30-day score movement computed from the domain's stored snapshot history, for the question this audit asked, ending at the snapshot this audit stored; when it stored no measured snapshot, trend is null and trend_note says why. If name_warning is present, the business name behind the score could not be verified — relay that caveat rather than presenting the score as settled fact, and offer to re-run with an explicit business name. Requires a Website Auditor subscription ($49/month; eligible new customers get a 7-day free trial — payment method required, no charge until the trial ends) — if the user doesn't have one, call get_sample_audit first to show them the exact output format, free and with no API key.

Input Schema

NameRequiredDescriptionDefault
domainYesThe website domain, e.g. "example.com".
business_nameNoOptional. The business's real name, if you know it. Leave it out and the audit detects the name from the site and flags it when unverified — a guessed name is scored as if confirmed, so supply one only when it is actually known.
business_locationNoOptional. The city the business trades in, e.g. "Hilo, HI". Leave it out and the audit detects it; when nothing is detectable the questions widen to the country or drop the place entirely, which is right for a national or global business and wrong for a local one.

Output Schema

NameRequiredDescriptionDefault
scoreYesOverall AI-visibility score, 0–100.
trendYesPro only; null when unavailable — trend_note says why.
sourcesNo
summaryYes
by_engineYesPer-engine AI-visibility score, 0–100. NULL means the engine was not scored — see engine_status for which of the two reasons. A null is NOT a zero: zero means the engine answered and never named the business.
dashboardNo
next_stepsNoFree audits only: what this result found that another tool can act on, as plain facts with the tool's name.
trend_noteNoPresent exactly when trend is null: the reason.
name_sourceNo"detected" | "user_supplied" | "domain_fallback".
name_warningNoSet ONLY when the business name behind the score could not be verified. The score is computed from queries built around that name, so relay this caveat rather than presenting the score as settled.
coverage_noteNoPresent exactly when an engine was asked and did not answer. Relay it: the score covers fewer engines than the run asked (four on a free audit, six on a paid one).
engine_statusYesWhy each engine's score is what it is. 'scored' — the engine answered and the number is a measurement. 'unanswered' — it was asked and returned nothing, so there is no score; do not report it as 0. 'not_asked' — it was not part of this run at all — Google AI Overviews and Microsoft Copilot are asked on paid plans only.
name_verifiedNo
stance_countsNoHow many answers recommended, mentioned or cautioned against the site. Present when recorded.
top_competitorYesThe competitor appearing in place of the site, if any.
questions_askedNoThe questions put to the assistants for this score, when the report recorded them.
appears_by_engineYesWhether the site appeared at all on each engine. Distinct from the scores: an engine can have appearances yet a low score, or the reverse. NULL when the engine was not scored — false would assert it did not name the business, which is a claim an unmeasured engine cannot support.
recommendation_gapNoHow far behind the top beatable rival the site is, in the answers that recommend it. Present only when measured; its sentence is also in summary.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed16 schema fields changedv1.0.29
    • addedOutput schema / properties / appears_by_engine / properties / copilot
      Added value: +{
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / appears_by_engine / properties / google_ai_overviews
      Added value: +{
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / appears_by_engine / required
      Previous value: -[
      -  "chatgpt",
      -  "perplexity",
      -  "claude",
      -  "gemini"
      -]New value: +[
      +  "chatgpt",
      +  "perplexity",
      +  "claude",
      +  "gemini",
      +  "google_ai_overviews",
      +  "copilot"
      +]
    • addedOutput schema / properties / by_engine / properties / copilot
      Added value: +{
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / by_engine / properties / google_ai_overviews
      Added value: +{
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / by_engine / required
      Previous value: -[
      -  "chatgpt",
      -  "perplexity",
      -  "claude",
      -  "gemini"
      -]New value: +[
      +  "chatgpt",
      +  "perplexity",
      +  "claude",
      +  "gemini",
      +  "google_ai_overviews",
      +  "copilot"
      +]
    • changedOutput schema / properties / coverage_note / description
      Previous value: -"Present exactly when an engine was asked and did not answer. Relay it: the score covers fewer engines than the four this tool can query."New value: +"Present exactly when an engine was asked and did not answer. Relay it: the score covers fewer engines than the run asked (four on a free audit, six on a paid one)."
    • addedOutput schema / properties / dashboard
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "note": {
      +      "description": "One line naming what the page shows; the same text is in summary where a reply has one.",
      +      "type": "string"
      +    },
      +    "url": {
      +      "description": "The member's own dashboard page.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "url",
      +    "note"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / properties / engine_status / description
      Previous value: -"Why each engine's score is what it is. 'scored' — the engine answered and the number is a measurement. 'unanswered' — it was asked and returned nothing, so there is no score; do not report it as 0. 'not_asked' — it was not part of this run at all."New value: +"Why each engine's score is what it is. 'scored' — the engine answered and the number is a measurement. 'unanswered' — it was asked and returned nothing, so there is no score; do not report it as 0. 'not_asked' — it was not part of this run at all — Google AI Overviews and Microsoft Copilot are asked on paid plans only."
    • addedOutput schema / properties / engine_status / properties / copilot
      Added value: +{
      +  "enum": [
      +    "scored",
      +    "unanswered",
      +    "not_asked"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / engine_status / properties / google_ai_overviews
      Added value: +{
      +  "enum": [
      +    "scored",
      +    "unanswered",
      +    "not_asked"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / properties / engine_status / required
      Previous value: -[
      -  "chatgpt",
      -  "perplexity",
      -  "claude",
      -  "gemini"
      -]New value: +[
      +  "chatgpt",
      +  "perplexity",
      +  "claude",
      +  "gemini",
      +  "google_ai_overviews",
      +  "copilot"
      +]
    • addedOutput schema / properties / next_steps
      Added value: +{
      +  "description": "Free audits only: what this result found that another tool can act on, as plain facts with the tool's name.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "tool": {
      +        "description": "The tool that does it.",
      +        "type": "string"
      +      },
      +      "what": {
      +        "description": "A plain fact about this result.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "tool",
      +      "what"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / questions_asked
      Added value: +{
      +  "description": "The questions put to the assistants for this score, when the report recorded them.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / recommendation_gap
      Added value: +{
      +  "additionalProperties": true,
      +  "description": "How far behind the top beatable rival the site is, in the answers that recommend it. Present only when measured; its sentence is also in summary.",
      +  "properties": {
      +    "answers": {
      +      "description": "The answers this is a share of: one per question, per assistant.",
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "gap_points": {
      +      "description": "Points behind the top rival in the answers that RECOMMEND the site (negative when ahead). Null, never 0, when there is no rival or too few answers.",
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "per_engine": {
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "answers": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "engine": {
      +            "type": "string"
      +          },
      +          "gap_points": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "rival_recommended": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "state": {
      +            "anyOf": [
      +              {
      +                "anyOf": [
      +                  {
      +                    "enum": [
      +                      "behind",
      +                      "level",
      +                      "ahead",
      +                      "no_rival",
      +                      "no_local_rival",
      +                      "not_enough_answers"
      +                    ],
      +                    "type": "string"
      +                  },
      +                  {
      +                    "const": "not_measured",
      +                    "type": "string"
      +                  }
      +                ]
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "you_recommended": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "engine",
      +          "state",
      +          "gap_points",
      +          "you_recommended",
      +          "rival_recommended",
      +          "answers"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "rival": {
      +      "description": "The top BEATABLE rival: marketplaces, delivery and booking apps, directories and national chains are left out. Null when none is recommended.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "rival_recommended": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "sentence": {
      +      "description": "One plain sentence to read back to the owner; also folded into summary.",
      +      "type": "string"
      +    },
      +    "state": {
      +      "description": "Which kind of gap this is, or why there is none.",
      +      "enum": [
      +        "behind",
      +        "level",
      +        "ahead",
      +        "no_rival",
      +        "no_local_rival",
      +        "not_enough_answers"
      +      ],
      +      "type": "string"
      +    },
      +    "tied_with": {
      +      "description": "Other rivals tied for the top: one gap, all named.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "you_recommended": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "state",
      +    "gap_points",
      +    "rival",
      +    "rival_recommended",
      +    "tied_with",
      +    "you_recommended",
      +    "answers",
      +    "per_engine",
      +    "sentence"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / stance_counts
      Added value: +{
      +  "additionalProperties": true,
      +  "description": "How many answers recommended, mentioned or cautioned against the site. Present when recorded.",
      +  "properties": {
      +    "answers": {
      +      "type": "number"
      +    },
      +    "cautioned": {
      +      "type": "number"
      +    },
      +    "mentioned": {
      +      "type": "number"
      +    },
      +    "not_named": {
      +      "type": "number"
      +    },
      +    "recommended": {
      +      "type": "number"
      +    },
      +    "unclear": {
      +      "description": "The rules could not say how the answer treated the site. Not negative.",
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "recommended",
      +    "mentioned",
      +    "cautioned",
      +    "unclear",
      +    "not_named",
      +    "answers"
      +  ],
      +  "type": "object"
      +}
  2. Changed1 schema field changedv1.0.25
    • changedOutput schema / properties / trend / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "properties": {
      -      "change_30d": {
      -        "anyOf": [
      -          {
      -            "$ref": "#/properties/trend/anyOf/0/properties/change_7d/anyOf/0"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "change_7d": {
      -        "anyOf": [
      -          {
      -            "additionalProperties": true,
      -            "properties": {
      -              "engine_changes": {
      -                "items": {
      -                  "additionalProperties": true,
      -                  "properties": {
      -                    "delta": {
      -                      "type": "number"
      -                    },
      -                    "engine": {
      -                      "type": "string"
      -                    },
      -                    "from": {
      -                      "type": "number"
      -                    },
      -                    "to": {
      -                      "type": "number"
      -                    }
      -                  },
      -                  "required": [
      -                    "engine",
      -                    "from",
      -                    "to",
      -                    "delta"
      -                  ],
      -                  "type": "object"
      -                },
      -                "type": "array"
      -              },
      -              "from_captured_at": {
      -                "description": "When the snapshot this window compares against was captured.",
      -                "type": "string"
      -              },
      -              "from_score": {
      -                "type": "number"
      -              },
      -              "score_delta": {
      -                "type": "number"
      -              },
      -              "skipped_snapshots": {
      -                "description": "Snapshots in the window that were not compared: they asked a different question (another business name, market or queries), or do not record what they asked.",
      -                "type": "number"
      -              },
      -              "snapshots": {
      -                "description": "Snapshots that fell inside this window.",
      -                "type": "number"
      -              },
      -              "to_score": {
      -                "type": "number"
      -              },
      -              "window_days": {
      -                "type": "number"
      -              }
      -            },
      -            "required": [
      -              "window_days",
      -              "from_score",
      -              "to_score",
      -              "score_delta",
      -              "engine_changes",
      -              "snapshots"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Null when the window holds no earlier snapshot that asked the same question as the latest."
      -      },
      -      "includes_simulated": {
      -        "description": "Always false: simulated snapshots are left out of the trend. Kept for clients that read it.",
      -        "type": "boolean"
      -      },
      -      "latest_captured_at": {
      -        "type": "string"
      -      },
      -      "question_note": {
      -        "description": "Present when what the snapshots asked shaped the trend: no earlier snapshot asked the latest one's question, snapshots from the last 30 days were not compared, or the latest snapshot does not record what it asked. Relay it — a difference between scores that answered different questions is not a change in visibility.",
      -        "type": "string"
      -      },
      -      "snapshots_analyzed": {
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "change_7d",
      -      "change_30d",
      -      "snapshots_analyzed",
      -      "latest_captured_at",
      -      "includes_simulated"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "properties": {
      +      "change_30d": {
      +        "anyOf": [
      +          {
      +            "$ref": "#/properties/trend/anyOf/0/properties/change_7d/anyOf/0"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "change_7d": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": true,
      +            "properties": {
      +              "engine_changes": {
      +                "items": {
      +                  "additionalProperties": true,
      +                  "properties": {
      +                    "delta": {
      +                      "type": "number"
      +                    },
      +                    "engine": {
      +                      "type": "string"
      +                    },
      +                    "from": {
      +                      "type": "number"
      +                    },
      +                    "to": {
      +                      "type": "number"
      +                    }
      +                  },
      +                  "required": [
      +                    "engine",
      +                    "from",
      +                    "to",
      +                    "delta"
      +                  ],
      +                  "type": "object"
      +                },
      +                "type": "array"
      +              },
      +              "from_captured_at": {
      +                "description": "When the snapshot this window compares against was captured.",
      +                "type": "string"
      +              },
      +              "from_score": {
      +                "type": "number"
      +              },
      +              "overall_note": {
      +                "description": "Present exactly when score_delta is null: which engines answered each endpoint. Relay it — a null delta for this reason reads like one for want of history otherwise.",
      +                "type": "string"
      +              },
      +              "score_delta": {
      +                "description": "The overall move across the window, or null when its two endpoints were answered by different engines — an overall over a different set of engines is a different quantity. `overall_note` says which engines answered each; engine_changes still compares every engine that answered both.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "skipped_snapshots": {
      +                "description": "Snapshots in the window that were not compared: they asked a different question (another business name, market or queries), or do not record what they asked.",
      +                "type": "number"
      +              },
      +              "snapshots": {
      +                "description": "Snapshots that fell inside this window.",
      +                "type": "number"
      +              },
      +              "to_score": {
      +                "type": "number"
      +              },
      +              "window_days": {
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "window_days",
      +              "from_score",
      +              "to_score",
      +              "score_delta",
      +              "engine_changes",
      +              "snapshots"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Null when the window holds no earlier snapshot that asked the same question as the latest."
      +      },
      +      "includes_simulated": {
      +        "description": "Always false: simulated snapshots are left out of the trend. Kept for clients that read it.",
      +        "type": "boolean"
      +      },
      +      "latest_captured_at": {
      +        "type": "string"
      +      },
      +      "question_note": {
      +        "description": "Present when what the snapshots asked shaped the trend: no earlier snapshot asked the latest one's question, snapshots from the last 30 days were not compared, or the latest snapshot does not record what it asked. Relay it — a difference between scores that answered different questions is not a change in visibility.",
      +        "type": "string"
      +      },
      +      "snapshots_analyzed": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "change_7d",
      +      "change_30d",
      +      "snapshots_analyzed",
      +      "latest_captured_at",
      +      "includes_simulated"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  3. Changed1 schema field changedv1.0.24
    • changedOutput schema / properties / trend / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "properties": {
      -      "change_30d": {
      -        "anyOf": [
      -          {
      -            "$ref": "#/properties/trend/anyOf/0/properties/change_7d/anyOf/0"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "change_7d": {
      -        "anyOf": [
      -          {
      -            "additionalProperties": true,
      -            "properties": {
      -              "engine_changes": {
      -                "items": {
      -                  "additionalProperties": true,
      -                  "properties": {
      -                    "delta": {
      -                      "type": "number"
      -                    },
      -                    "engine": {
      -                      "type": "string"
      -                    },
      -                    "from": {
      -                      "type": "number"
      -                    },
      -                    "to": {
      -                      "type": "number"
      -                    }
      -                  },
      -                  "required": [
      -                    "engine",
      -                    "from",
      -                    "to",
      -                    "delta"
      -                  ],
      -                  "type": "object"
      -                },
      -                "type": "array"
      -              },
      -              "from_score": {
      -                "type": "number"
      -              },
      -              "score_delta": {
      -                "type": "number"
      -              },
      -              "snapshots": {
      -                "description": "Snapshots that fell inside this window.",
      -                "type": "number"
      -              },
      -              "to_score": {
      -                "type": "number"
      -              },
      -              "window_days": {
      -                "type": "number"
      -              }
      -            },
      -            "required": [
      -              "window_days",
      -              "from_score",
      -              "to_score",
      -              "score_delta",
      -              "engine_changes",
      -              "snapshots"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Null when fewer than two snapshots fall in the window."
      -      },
      -      "includes_simulated": {
      -        "description": "True if any analyzed snapshot was estimated rather than measured.",
      -        "type": "boolean"
      -      },
      -      "latest_captured_at": {
      -        "type": "string"
      -      },
      -      "snapshots_analyzed": {
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "change_7d",
      -      "change_30d",
      -      "snapshots_analyzed",
      -      "latest_captured_at",
      -      "includes_simulated"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "properties": {
      +      "change_30d": {
      +        "anyOf": [
      +          {
      +            "$ref": "#/properties/trend/anyOf/0/properties/change_7d/anyOf/0"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "change_7d": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": true,
      +            "properties": {
      +              "engine_changes": {
      +                "items": {
      +                  "additionalProperties": true,
      +                  "properties": {
      +                    "delta": {
      +                      "type": "number"
      +                    },
      +                    "engine": {
      +                      "type": "string"
      +                    },
      +                    "from": {
      +                      "type": "number"
      +                    },
      +                    "to": {
      +                      "type": "number"
      +                    }
      +                  },
      +                  "required": [
      +                    "engine",
      +                    "from",
      +                    "to",
      +                    "delta"
      +                  ],
      +                  "type": "object"
      +                },
      +                "type": "array"
      +              },
      +              "from_captured_at": {
      +                "description": "When the snapshot this window compares against was captured.",
      +                "type": "string"
      +              },
      +              "from_score": {
      +                "type": "number"
      +              },
      +              "score_delta": {
      +                "type": "number"
      +              },
      +              "skipped_snapshots": {
      +                "description": "Snapshots in the window that were not compared: they asked a different question (another business name, market or queries), or do not record what they asked.",
      +                "type": "number"
      +              },
      +              "snapshots": {
      +                "description": "Snapshots that fell inside this window.",
      +                "type": "number"
      +              },
      +              "to_score": {
      +                "type": "number"
      +              },
      +              "window_days": {
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "window_days",
      +              "from_score",
      +              "to_score",
      +              "score_delta",
      +              "engine_changes",
      +              "snapshots"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Null when the window holds no earlier snapshot that asked the same question as the latest."
      +      },
      +      "includes_simulated": {
      +        "description": "Always false: simulated snapshots are left out of the trend. Kept for clients that read it.",
      +        "type": "boolean"
      +      },
      +      "latest_captured_at": {
      +        "type": "string"
      +      },
      +      "question_note": {
      +        "description": "Present when what the snapshots asked shaped the trend: no earlier snapshot asked the latest one's question, snapshots from the last 30 days were not compared, or the latest snapshot does not record what it asked. Relay it — a difference between scores that answered different questions is not a change in visibility.",
      +        "type": "string"
      +      },
      +      "snapshots_analyzed": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "change_7d",
      +      "change_30d",
      +      "snapshots_analyzed",
      +      "latest_captured_at",
      +      "includes_simulated"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  4. Changed1 schema field changedv1.0.23
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "appears_by_engine": {
      +      "additionalProperties": true,
      +      "description": "Whether the site appeared at all on each engine. Distinct from the scores: an engine can have appearances yet a low score, or the reverse. NULL when the engine was not scored — false would assert it did not name the business, which is a claim an unmeasured engine cannot support.",
      +      "properties": {
      +        "chatgpt": {
      +          "type": [
      +            "boolean",
      +            "null"
      +          ]
      +        },
      +        "claude": {
      +          "type": [
      +            "boolean",
      +            "null"
      +          ]
      +        },
      +        "gemini": {
      +          "type": [
      +            "boolean",
      +            "null"
      +          ]
      +        },
      +        "perplexity": {
      +          "type": [
      +            "boolean",
      +            "null"
      +          ]
      +        }
      +      },
      +      "required": [
      +        "chatgpt",
      +        "perplexity",
      +        "claude",
      +        "gemini"
      +      ],
      +      "type": "object"
      +    },
      +    "by_engine": {
      +      "additionalProperties": true,
      +      "description": "Per-engine AI-visibility score, 0–100. NULL means the engine was not scored — see engine_status for which of the two reasons. A null is NOT a zero: zero means the engine answered and never named the business.",
      +      "properties": {
      +        "chatgpt": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "claude": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "gemini": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "perplexity": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        }
      +      },
      +      "required": [
      +        "chatgpt",
      +        "perplexity",
      +        "claude",
      +        "gemini"
      +      ],
      +      "type": "object"
      +    },
      +    "coverage_note": {
      +      "description": "Present exactly when an engine was asked and did not answer. Relay it: the score covers fewer engines than the four this tool can query.",
      +      "type": "string"
      +    },
      +    "engine_status": {
      +      "additionalProperties": true,
      +      "description": "Why each engine's score is what it is. 'scored' — the engine answered and the number is a measurement. 'unanswered' — it was asked and returned nothing, so there is no score; do not report it as 0. 'not_asked' — it was not part of this run at all.",
      +      "properties": {
      +        "chatgpt": {
      +          "enum": [
      +            "scored",
      +            "unanswered",
      +            "not_asked"
      +          ],
      +          "type": "string"
      +        },
      +        "claude": {
      +          "enum": [
      +            "scored",
      +            "unanswered",
      +            "not_asked"
      +          ],
      +          "type": "string"
      +        },
      +        "gemini": {
      +          "enum": [
      +            "scored",
      +            "unanswered",
      +            "not_asked"
      +          ],
      +          "type": "string"
      +        },
      +        "perplexity": {
      +          "enum": [
      +            "scored",
      +            "unanswered",
      +            "not_asked"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "chatgpt",
      +        "perplexity",
      +        "claude",
      +        "gemini"
      +      ],
      +      "type": "object"
      +    },
      +    "name_source": {
      +      "description": "\"detected\" | \"user_supplied\" | \"domain_fallback\".",
      +      "type": "string"
      +    },
      +    "name_verified": {
      +      "type": "boolean"
      +    },
      +    "name_warning": {
      +      "description": "Set ONLY when the business name behind the score could not be verified. The score is computed from queries built around that name, so relay this caveat rather than presenting the score as settled.",
      +      "type": "string"
      +    },
      +    "score": {
      +      "description": "Overall AI-visibility score, 0–100.",
      +      "type": "number"
      +    },
      +    "sources": {
      +      "anyOf": [
      +        {
      +          "items": {
      +            "additionalProperties": true,
      +            "properties": {
      +              "answers": {
      +                "description": "Answers citing this domain — not citation entries.",
      +                "type": "number"
      +              },
      +              "domain": {
      +                "type": "string"
      +              },
      +              "ownership": {
      +                "description": "\"yours\" | \"competitor\" | \"third_party\". Competitor rows are context, not targets.",
      +                "type": "string"
      +              },
      +              "platforms": {
      +                "items": {
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              },
      +              "title": {
      +                "type": "string"
      +              },
      +              "url": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              }
      +            },
      +            "required": [
      +              "domain",
      +              "answers",
      +              "platforms",
      +              "ownership",
      +              "url",
      +              "title"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "summary": {
      +      "type": "string"
      +    },
      +    "top_competitor": {
      +      "description": "The competitor appearing in place of the site, if any.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "trend": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": true,
      +          "properties": {
      +            "change_30d": {
      +              "anyOf": [
      +                {
      +                  "$ref": "#/properties/trend/anyOf/0/properties/change_7d/anyOf/0"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "change_7d": {
      +              "anyOf": [
      +                {
      +                  "additionalProperties": true,
      +                  "properties": {
      +                    "engine_changes": {
      +                      "items": {
      +                        "additionalProperties": true,
      +                        "properties": {
      +                          "delta": {
      +                            "type": "number"
      +                          },
      +                          "engine": {
      +                            "type": "string"
      +                          },
      +                          "from": {
      +                            "type": "number"
      +                          },
      +                          "to": {
      +                            "type": "number"
      +                          }
      +                        },
      +                        "required": [
      +                          "engine",
      +                          "from",
      +                          "to",
      +                          "delta"
      +                        ],
      +                        "type": "object"
      +                      },
      +                      "type": "array"
      +                    },
      +                    "from_score": {
      +                      "type": "number"
      +                    },
      +                    "score_delta": {
      +                      "type": "number"
      +                    },
      +                    "snapshots": {
      +                      "description": "Snapshots that fell inside this window.",
      +                      "type": "number"
      +                    },
      +                    "to_score": {
      +                      "type": "number"
      +                    },
      +                    "window_days": {
      +                      "type": "number"
      +                    }
      +                  },
      +                  "required": [
      +                    "window_days",
      +                    "from_score",
      +                    "to_score",
      +                    "score_delta",
      +                    "engine_changes",
      +                    "snapshots"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "description": "Null when fewer than two snapshots fall in the window."
      +            },
      +            "includes_simulated": {
      +              "description": "True if any analyzed snapshot was estimated rather than measured.",
      +              "type": "boolean"
      +            },
      +            "latest_captured_at": {
      +              "type": "string"
      +            },
      +            "snapshots_analyzed": {
      +              "type": "number"
      +            }
      +          },
      +          "required": [
      +            "change_7d",
      +            "change_30d",
      +            "snapshots_analyzed",
      +            "latest_captured_at",
      +            "includes_simulated"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Pro only; null when unavailable — trend_note says why."
      +    },
      +    "trend_note": {
      +      "description": "Present exactly when trend is null: the reason.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "score",
      +    "by_engine",
      +    "engine_status",
      +    "appears_by_engine",
      +    "top_competitor",
      +    "summary",
      +    "trend"
      +  ],
      +  "type": "object"
      +}
  5. Changed2 schema fields changedv1.0.15
    • addedInput schema / properties / business_location
      Added value: +{
      +  "description": "Optional. The city the business trades in, e.g. \"Hilo, HI\". Leave it out and the audit detects it; when nothing is detectable the questions widen to the country or drop the place entirely, which is right for a national or global business and wrong for a local one.",
      +  "type": "string"
      +}
    • addedInput schema / properties / business_name
      Added value: +{
      +  "description": "Optional. The business's real name, if you know it. Leave it out and the audit detects the name from the site and flags it when unverified — a guessed name is scored as if confirmed, so supply one only when it is actually known.",
      +  "type": "string"
      +}
  6. First observedv1.0.6

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are sparse (readOnlyHint=false, openWorldHint=true, destructiveHint=false) and the description supplies substantial context beyond them: the paid subscription requirement, the $49/month price and trial terms without a charge, and the free get_sample_audit fallback. It also explains null semantics for `sources` (null vs. absent key) and the `name_warning` caveat that should be relayed rather than treated as settled. Minor gap: it does not say that launching this consumes an audit/snapshot, which is the likely reason readOnlyHint is false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded well, opening with the action and use triggers, but the single dense paragraph runs long and spends most of its words describing return values (per-engine breakdown, sources ranking, trend computation) despite an output schema existing. That detail is useful but duplicative, and one paragraph makes the routing and caveat rules harder to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a paid, open-world audit tool with a required domain, the definition covers prerequisites, cost, fallback path, output shape, null/degraded cases, and the name_warning interpretation guidance. Nothing an agent needs in order to call it and relay its result correctly appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including the warning that a guessed business_name is scored as if confirmed and that a missing business_location widens questions to country level. The description adds no parameter-level meaning beyond that beyond linking business_name to the `name_warning` output, so it sits at the baseline when the schema carries the burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("check how visible a website is to AI assistants") and names the exact engines and score type, so it is unmistakable against siblings like get_report or run_audit. The follow-on clause also gives concrete user phrasings ("does ChatGPT recommend this business", "is my site showing up in AI answers") that map intent to this tool directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit triggers for when to use it and an explicit fallback: call get_sample_audit first if the user lacks the Website Auditor subscription. It does not clarify when to prefer this over run_audit or get_report for an existing audit, so the sibling routing is not fully closed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.