Skip to main content
Glama
AutomateLab-tech

automatelab-ai-seo

Official

Validate llms.txt

llms_txt_validate
Read-onlyIdempotent

Validate an existing llms.txt or llms-full.txt against specification rules for structure, section ordering, and link format, plus optional broken-link detection.

Instructions

Validate an existing llms.txt or llms-full.txt against the spec: structure, section ordering, link format, and (optionally) broken-link detection.

Read-only. One HTTP GET when given url; zero network when given content. Optional link-check issues HEAD requests against each link if check_links is true.

Deterministic; no LLM.

When to use: auditing an llms.txt you already have. To generate one from scratch, use llms_txt_generate.

Either url or content must be provided.

Input Schema

NameRequiredDescriptionDefault
urlNoPublic URL of an existing llms.txt or llms-full.txt to validate (e.g. `https://example.com/llms.txt`). Either this OR `content` is required.
contentNoRaw llms.txt content as a string. Use this to validate a file offline without fetching. Either this OR `url` is required.
check_linksNoIf true (default), HEAD each linked URL to detect broken links. Set false to skip link checks for faster, network-light validation of just the structural rules.

Output Schema

NameRequiredDescriptionDefault
validYes
findingsYes
links_totalYes
links_brokenYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed21 schema fields changed
    • 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 / links_broken
      Added value: +{
      +  "type": "number"
      +}
    • addedOutput schema / properties / links_total
      Added value: +{
      +  "type": "number"
      +}
    • removedOutput schema / properties / source
      Removed value: -{
      -  "enum": [
      -    "url",
      -    "content"
      -  ],
      -  "type": "string"
      -}
    • removedOutput schema / properties / url
      Removed value: -{
      -  "type": [
      -    "string",
      -    "null"
      -  ]
      -}
    • removedOutput schema / properties / valid / description
      Removed value: -"Whether the file passes structural and link rules."
    • changedOutput schema / required
      Previous value: -[
      -  "source",
      -  "url",
      -  "valid",
      -  "findings"
      -]New value: +[
      +  "valid",
      +  "links_total",
      +  "links_broken",
      +  "findings"
      +]
  2. Addedv1.0.0

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare readOnly/idempotent/openWorld, but the description adds the actual cost model: one HTTP GET when given url, zero network when given content, HEAD requests per link when check_links is true, and explicitly 'no LLM'. This is exactly the kind of context annotations cannot express.

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?

Three short paragraphs, each front-loaded with its topic (what it validates, network behavior, when to use). No filler; every clause carries information.

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?

Covers validation scope, network/auth implications, determinism, sibling routing, and the parameter constraint. With an output schema present, return values need not be explained. Nothing an agent needs is missing.

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 description coverage is already 100%, so the baseline is 3. The description adds the mutual-exclusivity rule ('Either url or content must be provided') and confirms the network-side effect of check_links beyond what the schema's own description states. Marginal value, but real.

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 (validate) and resource (llms.txt or llms-full.txt), and enumerates exactly what dimensions are checked: structure, section ordering, link format, broken links. It also explicitly distinguishes itself from the sibling llms_txt_generate by naming that tool.

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: auditing an llms.txt you already have' plus a routing rule to the alternative ('To generate one from scratch, use llms_txt_generate'). No inference needed.

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