Skip to main content
Glama
Website Auditor MCP

Website Auditor MCP

Run a full audit

run_audit

Run a full website audit to score AI visibility, security headers, broken links, performance, crawlability, and SEO markup; get a categorized report with a link to full results.

Instructions

Run a full one-time audit of a website — AI visibility, plus security headers, broken links, performance, and a crawlability-and-markup score (scores.seo: robots.txt, AI crawler access, sitemap, structured data, meta description and Open Graph tags). Use this when someone asks to "audit," "scan," "check," or "review" a website's health, or wants a complete report rather than just the AI-visibility number. Returns a scored summary across categories and a link to the full report. The ranked cited-sources evidence behind the AI-visibility number is returned by get_ai_visibility, not by this tool. If name_warning is present, the business name the AI-visibility score was measured against could not be verified — relay that caveat rather than presenting the score as settled fact. 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
scoresYes
summaryNoFree audits only: next_steps in one sentence.
dashboardNo
next_stepsNoFree audits only: what this result found that another tool can act on, as plain facts with the tool's name.
report_urlYes
top_issuesYes
name_warningNoSet ONLY when the business name could not be verified, which puts the AI-visibility score in question.
stance_countsNo
recommendation_gapNoHow far behind the top beatable rival the site is, in the answers that recommend it. Present only when measured; its sentence reads the result back in one line.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changedv1.0.29
    • 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"
      +}
    • 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 / 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 reads the result back in one line.",
      +  "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,
      +  "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"
      +}
    • addedOutput schema / properties / summary
      Added value: +{
      +  "description": "Free audits only: next_steps in one sentence.",
      +  "type": "string"
      +}
  2. Changed1 schema field changedv1.0.23
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "name_warning": {
      +      "description": "Set ONLY when the business name could not be verified, which puts the AI-visibility score in question.",
      +      "type": "string"
      +    },
      +    "report_url": {
      +      "type": "string"
      +    },
      +    "scores": {
      +      "additionalProperties": true,
      +      "properties": {
      +        "ai_visibility": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "performance": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "security": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "seo": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        }
      +      },
      +      "required": [
      +        "ai_visibility",
      +        "seo",
      +        "security",
      +        "performance"
      +      ],
      +      "type": "object"
      +    },
      +    "top_issues": {
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "details": {
      +            "type": "string"
      +          },
      +          "module": {
      +            "type": "string"
      +          },
      +          "name": {
      +            "type": "string"
      +          },
      +          "recommendation": {
      +            "type": "string"
      +          },
      +          "severity": {
      +            "type": "string"
      +          },
      +          "url": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "severity"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "scores",
      +    "top_issues",
      +    "report_url"
      +  ],
      +  "type": "object"
      +}
  3. 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"
      +}
  4. First observedv1.0.6

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false, openWorldHint=true, destructiveHint=false; the description goes well beyond by disclosing the paid subscription requirement, trial terms and payment-method precondition, and the `name_warning` caveat that must be relayed rather than suppressed. It also tells the agent what it gets back (scored summary plus report link), which matters for a non-read-only, consumption-metered call.

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

Conciseness4/5

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

Purpose and trigger words are front-loaded, and each sentence carries distinct information (scope, triggers, exclusions, return shape, caveat, cost). It is a single dense paragraph with nested parentheticals, which costs some scannability, but there is no filler.

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 3-parameter, paid, non-read-only tool with an output schema, everything an agent needs before calling is present: cost and entitlement gate, fallback tool, return summary, and the caveat to propagate. Return-value detail is appropriately brief since the output schema exists.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description adds real meaning by explaining why omitting `business_name` is safer (a guessed name is scored as confirmed) and linking that omission to the `name_warning` output. It does not discuss `domain` formats or `business_location` edge cases beyond what the schema already says.

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 ("Run a full one-time audit of a website") and enumerates the categories covered, including what `scores.seo` actually measures. It explicitly carves itself away from two siblings: the cited `sources` come from get_ai_visibility, and get_sample_audit is the preview path.

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

Usage Guidelines5/5

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

Gives concrete trigger vocabulary ("audit," "scan," "check," "review") and the disambiguating condition — a complete report versus just the AI-visibility number. It also names the fallback path (get_sample_audit) for users without a subscription.

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