Skip to main content
Glama
AutomateLab-tech

automatelab-ai-seo

Official

Audit canonical link integrity

audit_canonical
Read-onlyIdempotent

Audit a page's canonical link integrity: verify presence, self-reference, cross-domain mismatches, trailing-slash hygiene, and og:url consistency to fix duplicate-content issues.

Instructions

Audit a page's canonical link integrity: presence, self-reference, cross-domain mismatches, trailing-slash hygiene, and og:url consistency.

Read-only. One HTTP GET to fetch the HEAD section.

Deterministic, rule-based; no LLM.

When to use: a focused canonical-only audit (e.g. debugging a duplicate-content issue). For a full HEAD audit including OpenGraph, hreflang, noindex, title, use check_technical. For everything-on-a-page, use audit_page.

Input Schema

NameRequiredDescriptionDefault
urlYesPublic URL whose canonical link tag and og:url consistency you want to audit. Must be a fully-qualified http(s) URL. The tool fetches the URL (following redirects) and inspects only the <head> section; the body is not parsed.
respect_robotsNoIf true (default), respect robots.txt before fetching. Set false only for auditing your own site where you've intentionally blocked crawlers.

Output Schema

NameRequiredDescriptionDefault
urlYes
findingsYes
final_urlYes
canonical_valueYes
is_cross_domainYes
is_self_referentialYes
canonical_og_url_matchYes
trailing_slash_consistentYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed27 schema fields changed
    • removedOutput schema / properties / canonical
      Removed value: -{
      -  "type": [
      -    "string",
      -    "null"
      -  ]
      -}
    • addedOutput schema / properties / canonical_og_url_match
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / canonical_value
      Added value: +{
      +  "type": [
      +    "null",
      +    "string"
      +  ]
      +}
    • removedOutput schema / properties / cross_domain
      Removed value: -{
      -  "description": "Whether the canonical points to a different domain.",
      -  "type": "boolean"
      -}
    • removedOutput schema / properties / fetched_at
      Removed value: -{
      -  "type": "string"
      -}
    • addedOutput schema / properties / final_url
      Added value: +{
      +  "type": "string"
      +}
    • removedOutput schema / properties / findings / items / properties / category / description
      Removed value: -"Finding category - which AI-SEO dimension it relates to."
    • addedOutput schema / properties / findings / items / properties / estimated_impact / anyOf
      Added value: +[
      +  {
      +    "not": {}
      +  },
      +  {
      +    "const": "high",
      +    "type": "string"
      +  },
      +  {
      +    "const": "medium",
      +    "type": "string"
      +  },
      +  {
      +    "const": "low",
      +    "type": "string"
      +  }
      +]
    • removedOutput schema / properties / findings / items / properties / estimated_impact / description
      Removed value: -"Estimated impact on AI citation probability when resolved."
    • removedOutput schema / properties / findings / items / properties / estimated_impact / enum
      Removed value: -[
      -  "high",
      -  "medium",
      -  "low"
      -]
    • removedOutput schema / properties / findings / items / properties / estimated_impact / type
      Removed value: -"string"
    • addedOutput schema / properties / findings / items / properties / failure_signal / anyOf
      Added value: +[
      +  {
      +    "not": {}
      +  },
      +  {
      +    "type": "string"
      +  }
      +]
    • removedOutput schema / properties / findings / items / properties / failure_signal / description
      Removed value: -"Falsifiability: the observable signal that would prove the fix did NOT work."
    • removedOutput schema / properties / findings / items / properties / failure_signal / type
      Removed value: -"string"
    • removedOutput schema / properties / findings / items / properties / fix / description
      Removed value: -"Concrete, copy-pasteable fix."
    • addedOutput schema / properties / findings / items / properties / leading_indicator / anyOf
      Added value: +[
      +  {
      +    "not": {}
      +  },
      +  {
      +    "type": "string"
      +  }
      +]
    • removedOutput schema / properties / findings / items / properties / leading_indicator / description
      Removed value: -"Falsifiability: the leading indicator to monitor to confirm the fix is landing."
    • removedOutput schema / properties / findings / items / properties / leading_indicator / type
      Removed value: -"string"
    • removedOutput schema / properties / findings / items / properties / message / description
      Removed value: -"Human-readable description of the issue."
    • removedOutput schema / properties / findings / items / properties / severity / description
      Removed value: -"Triage priority: critical blocks AI citation, warning hurts probability, info is nice-to-have."
    • removedOutput schema / properties / findings / items / properties / where / description
      Removed value: -"Location of the issue (CSS selector, JSON-LD path, robots.txt line, or 'page-level')."
    • addedOutput schema / properties / is_cross_domain
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / is_self_referential
      Added value: +{
      +  "type": "boolean"
      +}
    • removedOutput schema / properties / og_url
      Removed value: -{
      -  "type": [
      -    "string",
      -    "null"
      -  ]
      -}
    • removedOutput schema / properties / self_referencing
      Removed value: -{
      -  "description": "Whether the canonical points to the audited URL.",
      -  "type": "boolean"
      -}
    • addedOutput schema / properties / trailing_slash_consistent
      Added value: +{
      +  "type": "boolean"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "url",
      -  "fetched_at",
      -  "canonical",
      -  "og_url",
      -  "self_referencing",
      -  "cross_domain",
      -  "findings"
      -]New value: +[
      +  "url",
      +  "final_url",
      +  "canonical_value",
      +  "is_self_referential",
      +  "is_cross_domain",
      +  "trailing_slash_consistent",
      +  "canonical_og_url_match",
      +  "findings"
      +]
  2. Changed1 schema field changedv1.0.0
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "canonical": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "cross_domain": {
      +      "description": "Whether the canonical points to a different domain.",
      +      "type": "boolean"
      +    },
      +    "fetched_at": {
      +      "type": "string"
      +    },
      +    "findings": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "category": {
      +            "description": "Finding category - which AI-SEO dimension it relates to.",
      +            "enum": [
      +              "schema",
      +              "robots",
      +              "technical",
      +              "freshness",
      +              "structure",
      +              "authority",
      +              "presence",
      +              "sitemap",
      +              "llms_txt",
      +              "citation",
      +              "evidence",
      +              "trust",
      +              "entity",
      +              "content"
      +            ],
      +            "type": "string"
      +          },
      +          "estimated_impact": {
      +            "description": "Estimated impact on AI citation probability when resolved.",
      +            "enum": [
      +              "high",
      +              "medium",
      +              "low"
      +            ],
      +            "type": "string"
      +          },
      +          "failure_signal": {
      +            "description": "Falsifiability: the observable signal that would prove the fix did NOT work.",
      +            "type": "string"
      +          },
      +          "fix": {
      +            "description": "Concrete, copy-pasteable fix.",
      +            "type": "string"
      +          },
      +          "leading_indicator": {
      +            "description": "Falsifiability: the leading indicator to monitor to confirm the fix is landing.",
      +            "type": "string"
      +          },
      +          "message": {
      +            "description": "Human-readable description of the issue.",
      +            "type": "string"
      +          },
      +          "severity": {
      +            "description": "Triage priority: critical blocks AI citation, warning hurts probability, info is nice-to-have.",
      +            "enum": [
      +              "critical",
      +              "warning",
      +              "info"
      +            ],
      +            "type": "string"
      +          },
      +          "where": {
      +            "description": "Location of the issue (CSS selector, JSON-LD path, robots.txt line, or 'page-level').",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "severity",
      +          "category",
      +          "where",
      +          "message",
      +          "fix"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "og_url": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "self_referencing": {
      +      "description": "Whether the canonical points to the audited URL.",
      +      "type": "boolean"
      +    },
      +    "url": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "url",
      +    "fetched_at",
      +    "canonical",
      +    "og_url",
      +    "self_referencing",
      +    "cross_domain",
      +    "findings"
      +  ],
      +  "type": "object"
      +}
  3. Changed2 schema fields changedv0.1.2
    • addedInput schema / properties / respect_robots / description
      Added value: +"If true (default), respect robots.txt before fetching. Set false only for auditing your own site where you've intentionally blocked crawlers."
    • addedInput schema / properties / url / description
      Added value: +"Public URL whose canonical link tag and og:url consistency you want to audit. Must be a fully-qualified http(s) URL. The tool fetches the URL (following redirects) and inspects only the <head> section; the body is not parsed."
  4. First observedv0.1.0

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered structurally. The description still adds real behavioral context beyond that: a single HTTP GET, HEAD-only parsing, and deterministic rule-based evaluation with no LLM. It stops short of describing failure modes (unreachable URL, redirect chains) or any rate-limit behavior.

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

Conciseness5/5

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

Four short paragraphs, zero padding: scope first, then execution model, then routing guidance. Every sentence carries information an agent would otherwise have to infer.

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-value explanation is correctly omitted. For a 2-param read-only audit tool, the description covers scope, cost (one GET), execution model (deterministic, HEAD-only), and sibling routing — nothing material is 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%, so both parameters (url, respect_robots) are already fully documented in the schema, including redirect-following, HEAD-only inspection, and the robots.txt override case. The description adds no parameter-level detail beyond that, so the baseline 3 applies.

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?

Specific verb+resource ('Audit a page's canonical link integrity') followed by an enumerated scope (presence, self-reference, cross-domain mismatches, trailing-slash hygiene, og:url consistency). It explicitly distinguishes itself from the nearest siblings (check_technical, audit_page), so an agent can route without opening a 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?

Explicit 'When to use' clause with a concrete scenario (debugging duplicate-content), plus named alternatives for adjacent needs: check_technical for a full HEAD audit and audit_page for everything-on-a-page. Both the when and the when-not are stated.

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