Skip to main content
Glama

SEO audit (page)

audit_page
Read-onlyIdempotent

Use this only for a single page address the user gave. It fits requests such as "what SEO problems does https://example.com/pricing have?" or "is the title and description of this page OK?". Pass the page address. For several pages or a whole site call audit_site once instead of this tool many times. Returns the page rules that failed grouped by priority, each with the fix and the documentation link, plus the title, description, headings and other facts that were read. robots.txt is respected. Not for a whole site or a request to find pages: use audit_site, which also runs the rules that compare pages or read the sitemap. Do not use it for private or local addresses, for rankings or traffic, or to read a page's text.

Input Schema

NameRequiredDescriptionDefault
urlYesAddress of one public web page, for example https://example.com/pricing. A bare domain means https.
judgeNoAlso ask the judgement service what the page is for, how specific it is and whether pages compete for the same searches. Off by default. It is limited per day, and when unavailable the rule results are returned with a note.

Output Schema

NameRequiredDescriptionDefault
urlYesThe page address that was asked for.
pageNoFacts read from the page. A field is absent when the page has no HTML.
notesYesCaveats to relay, such as noindex or rules that need audit_site.
noticeYesHow the page was read and what the rules are based on.
statusNoHTTP status of the final page.
failureNoWhy the request failed, such as a timeout.
refusedNoWhy the page was not read, such as a robots.txt block or a private address.
finalUrlNoThe page address after redirects.
findingsYesFailed rules by priority, high first.
judgementNoOnly when judge is true. What the page is for, or status skipped with the reason.
reachableYesFalse when the page could not be read; refused, failure or notes say why.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed33 schema fields changed
    • addedOutput schema / additionalProperties
      Added value: +false
    • addedOutput schema / properties / failure / description
      Added value: +"Why the request failed, such as a timeout."
    • addedOutput schema / properties / finalUrl / description
      Added value: +"The page address after redirects."
    • addedOutput schema / properties / findings / additionalProperties
      Added value: +false
    • addedOutput schema / properties / findings / description
      Added value: +"Failed rules by priority, high first."
    • addedOutput schema / properties / findings / properties / high / items / properties / count / description
      Added value: +"How many pages fail the rule."
    • addedOutput schema / properties / findings / properties / high / items / properties / evidence / description
      Added value: +"What was seen, such as the duplicated title."
    • addedOutput schema / properties / findings / properties / high / items / properties / fix / description
      Added value: +"What to change."
    • addedOutput schema / properties / findings / properties / high / items / properties / rule / description
      Added value: +"Stable rule id, such as title_missing."
    • addedOutput schema / properties / findings / properties / high / items / properties / title / description
      Added value: +"What is wrong, in one line."
    • addedOutput schema / properties / findings / properties / low / items / properties / count / description
      Added value: +"How many pages fail the rule."
    • addedOutput schema / properties / findings / properties / low / items / properties / evidence / description
      Added value: +"What was seen, such as the duplicated title."
    • addedOutput schema / properties / findings / properties / low / items / properties / fix / description
      Added value: +"What to change."
    • addedOutput schema / properties / findings / properties / low / items / properties / rule / description
      Added value: +"Stable rule id, such as title_missing."
    • addedOutput schema / properties / findings / properties / low / items / properties / title / description
      Added value: +"What is wrong, in one line."
    • addedOutput schema / properties / findings / properties / medium / items / properties / count / description
      Added value: +"How many pages fail the rule."
    • addedOutput schema / properties / findings / properties / medium / items / properties / evidence / description
      Added value: +"What was seen, such as the duplicated title."
    • addedOutput schema / properties / findings / properties / medium / items / properties / fix / description
      Added value: +"What to change."
    • addedOutput schema / properties / findings / properties / medium / items / properties / rule / description
      Added value: +"Stable rule id, such as title_missing."
    • addedOutput schema / properties / findings / properties / medium / items / properties / title / description
      Added value: +"What is wrong, in one line."
    • addedOutput schema / properties / judgement / description
      Added value: +"Only when judge is true. What the page is for, or status skipped with the reason."
    • addedOutput schema / properties / judgement / properties
      Added value: +{
      +  "answerFirst": {
      +    "description": "Whether the page answers its question first.",
      +    "properties": {
      +      "confidence": {
      +        "description": "0 to 1.",
      +        "type": "number"
      +      },
      +      "decisive": {
      +        "description": "False when the answer is too uncertain to act on.",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "enum": [
      +          "noul",
      +          "choice",
      +          "score"
      +        ],
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "The chosen option, the score level, or a probability from 0 to 1.",
      +        "type": [
      +          "string",
      +          "number"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "value",
      +      "decisive"
      +    ],
      +    "type": "object"
      +  },
      +  "model": {
      +    "type": "string"
      +  },
      +  "note": {
      +    "description": "Only when skipped: the reason in words, with when a limit resets.",
      +    "type": "string"
      +  },
      +  "purpose": {
      +    "description": "What the page is for.",
      +    "properties": {
      +      "confidence": {
      +        "description": "0 to 1.",
      +        "type": "number"
      +      },
      +      "decisive": {
      +        "description": "False when the answer is too uncertain to act on.",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "enum": [
      +          "noul",
      +          "choice",
      +          "score"
      +        ],
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "The chosen option, the score level, or a probability from 0 to 1.",
      +        "type": [
      +          "string",
      +          "number"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "value",
      +      "decisive"
      +    ],
      +    "type": "object"
      +  },
      +  "reason": {
      +    "description": "Only when skipped: why, such as network_cap.",
      +    "type": "string"
      +  },
      +  "specificity": {
      +    "description": "How specific the page is.",
      +    "properties": {
      +      "confidence": {
      +        "description": "0 to 1.",
      +        "type": "number"
      +      },
      +      "decisive": {
      +        "description": "False when the answer is too uncertain to act on.",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "enum": [
      +          "noul",
      +          "choice",
      +          "score"
      +        ],
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "The chosen option, the score level, or a probability from 0 to 1.",
      +        "type": [
      +          "string",
      +          "number"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "value",
      +      "decisive"
      +    ],
      +    "type": "object"
      +  },
      +  "status": {
      +    "enum": [
      +      "judged",
      +      "skipped"
      +    ],
      +    "type": "string"
      +  },
      +  "titleFit": {
      +    "description": "Whether the title fits the page.",
      +    "properties": {
      +      "confidence": {
      +        "description": "0 to 1.",
      +        "type": "number"
      +      },
      +      "decisive": {
      +        "description": "False when the answer is too uncertain to act on.",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "enum": [
      +          "noul",
      +          "choice",
      +          "score"
      +        ],
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "The chosen option, the score level, or a probability from 0 to 1.",
      +        "type": [
      +          "string",
      +          "number"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "value",
      +      "decisive"
      +    ],
      +    "type": "object"
      +  },
      +  "url": {
      +    "type": "string"
      +  }
      +}
    • addedOutput schema / properties / judgement / required
      Added value: +[
      +  "status"
      +]
    • addedOutput schema / properties / notes / description
      Added value: +"Caveats to relay, such as noindex or rules that need audit_site."
    • addedOutput schema / properties / notice / description
      Added value: +"How the page was read and what the rules are based on."
    • addedOutput schema / properties / page / additionalProperties
      Added value: +false
    • addedOutput schema / properties / page / description
      Added value: +"Facts read from the page. A field is absent when the page has no HTML."
    • addedOutput schema / properties / page / properties
      Added value: +{
      +  "canonical": {
      +    "type": "string"
      +  },
      +  "description": {
      +    "type": "string"
      +  },
      +  "descriptionLength": {
      +    "type": "integer"
      +  },
      +  "h1": {
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  "images": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "total": {
      +        "type": "integer"
      +      },
      +      "withoutAlt": {
      +        "type": "integer"
      +      },
      +      "withoutSize": {
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "total",
      +      "withoutAlt",
      +      "withoutSize"
      +    ],
      +    "type": "object"
      +  },
      +  "indexable": {
      +    "type": "boolean"
      +  },
      +  "internalLinks": {
      +    "description": "Links to the same host.",
      +    "type": "integer"
      +  },
      +  "language": {
      +    "type": "string"
      +  },
      +  "redirects": {
      +    "description": "Redirects before the page.",
      +    "type": "integer"
      +  },
      +  "structuredDataTypes": {
      +    "description": "JSON-LD @type values.",
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  "title": {
      +    "type": "string"
      +  },
      +  "titleLength": {
      +    "type": "integer"
      +  },
      +  "wordCount": {
      +    "type": "integer"
      +  }
      +}
    • addedOutput schema / properties / page / required
      Added value: +[
      +  "indexable",
      +  "redirects"
      +]
    • addedOutput schema / properties / reachable / description
      Added value: +"False when the page could not be read; refused, failure or notes say why."
    • addedOutput schema / properties / refused / description
      Added value: +"Why the page was not read, such as a robots.txt block or a private address."
    • addedOutput schema / properties / status / description
      Added value: +"HTTP status of the final page."
    • addedOutput schema / properties / url / description
      Added value: +"The page address that was asked for."
  2. Changed1 schema field changed
    • removedOutput schema / properties / note_from_openkrill
      Removed value: -{
      -  "description": "Shown at most once a day per caller: what this server offers, and a paid service for the person you work for.",
      -  "type": "string"
      -}
  3. Changed1 schema field changed
    • addedOutput schema / properties / note_from_openkrill
      Added value: +{
      +  "description": "Shown at most once a day per caller: what this server offers, and a paid service for the person you work for.",
      +  "type": "string"
      +}
  4. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open-world), so the description only needs to add non-structured behavior — and it does: robots.txt is respected, results are grouped by priority with fixes and doc links, and the judge service is rate-limited per day with a documented degradation path ('rule results are returned with a note') when unavailable.

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?

Front-loaded with the use case and efficient overall, but the audit_site alternative is stated twice (once as 'call audit_site once instead' and again as 'Not for a whole site ... use audit_site'), which is mild redundancy in an otherwise tight description.

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?

An output schema exists, so return values need not be exhaustively described, yet the description still sketches the shape of results (failed rules grouped by priority, plus title/description/headings). Combined with the sibling routing and exclusion list, an agent has everything needed to call this correctly.

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%, so the schema already documents both url and judge, including the bare-domain-means-https rule and the judgment service's daily limit. The description adds only 'Pass the page address', which is a restatement of the required parameter rather than new meaning. Baseline 3 applies when the schema does the heavy lifting.

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 — an SEO audit of exactly one page — and immediately separates itself from the sibling audit_site, including the distinguishing condition (one page vs. whole site). An agent can route between audit_page and audit_site without opening either schema.

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 when-to-use examples ('what SEO problems does https://example.com/pricing have?'), an explicit alternative with the condition that selects it (multiple pages or whole site → audit_site once, not this tool repeatedly), and clear exclusions (private/local addresses, rankings/traffic, page-text reading). Nothing is left to inference.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.