Skip to content

docs: page descriptions, titles, structured data and crawler files for search and answer engines - #651

Merged
imran-siddique merged 1 commit into
mainfrom
docs/seo-aeo
Sep 14, 2026
Merged

imran-siddique merged 1 commit into
mainfrom
docs/seo-aeo

Conversation

@imran-siddique

Copy link
Copy Markdown
Member

A crawl of every page in cmcp.agentrust-io.com's sitemap on 2026-09-14 found what search and answer engines were reading:

  • 44 of 48 pages carried the same meta description, site_description, because Material falls back to it when a page has none. The quickstart's own description ran to 252 characters.
  • Titles repeated the site name: cMCP: policy-checked MCP tool calls with signed evidence - cMCP on the home page, and two pages were both titled Response inspection - cMCP.
  • JSON-LD had no Organization @id and repeated an inline Organization as author on every page, 96 objects in all, with nothing describing the page it sat on.
  • /robots.txt served only Cloudflare's content-signals comment block, with no directives and no Sitemap line. The repository-root robots.txt never deployed, because docs_dir is docs.
  • llms.txt had Getting started, Specification and Tutorials, with no guides beyond four tutorials and no limitations page.

Changes

  • hooks/seo.py, registered under hooks: in mkdocs.yml, sets each page's description from its first paragraph of prose, capped at 155 characters. Front matter still wins. The same hook runs on every AgenTrust docs site.
  • Four spec pages get a hand-written description: in front matter, because their first paragraph is a label list or a context sentence rather than a summary: failure-modes, phase2-server, tool-identity and transport. The quickstart's is cut to 138 characters.
  • overrides/main.html overrides htmltitle: the home page uses its front-matter title alone, and other pages drop the - cMCP suffix when the title already names cMCP. og:title and twitter:title now equal <title>, and og:site_name is AgenTrust.
  • The same template emits one JSON-LD graph per page: the Organization under https://agentrust-io.com/#organization, the id the hub and the other docs sites use; a WebSite; a WebPage on the home page or a TechArticle on inner pages, with the page's own title, description and canonical URL; a BreadcrumbList on inner pages; and on the home page the SoftwareApplication node with codeRepository and the MIT license.
  • robots.txt moves to docs/robots.txt, names the same ten crawlers as agentrust-io.com, disallows /cdn-cgi/, and points at https://cmcp.agentrust-io.com/sitemap.xml.
  • The tutorial nav label becomes "Response inspection tutorial", so the two pages no longer share a title.
  • The llms.txt sections follow the tabs: Get started, Specification (eleven pages), Guides (tutorials, deployment, hardware validation), Project (limitations, sponsors), and the description ends by linking agentrust-io.com.
  • docs.yml and docs-check.yml also run when hooks/** changes.

Checked

  • mkdocs build --strict with requirements/docs.txt exits 0.
  • All 48 pages: no two share a description, none is over 160 characters or contains an em or en dash, and no title repeats the site name. Home title: cMCP: policy-checked MCP tool calls with signed evidence.
  • Every page has exactly one Organization node with the hub @id, no inline Organization objects, and one page node whose url equals the canonical, whose description equals the meta description, and whose headline equals the title. All 47 inner pages carry a BreadcrumbList.
  • robots.txt is at the site root with the Sitemap line, and llms.txt has the four sections.
  • python scripts/check_docs_quickstart.py against the checkout: PASS.
  • hooks/seo.py imports cleanly under python -W error.

Generated with Claude Code

https://claude.ai/code/session_013aK3gVWzNdcM3hZ2o2awK2

…r search and answer engines

A crawl of cmcp.agentrust-io.com on 2026-09-14 found 44 of 48 pages sharing
the site description, a 252-character quickstart description, home and inner
titles repeating the site name, two pages titled "Response inspection - cMCP",
96 inline Organization objects with no @id, a robots.txt with no directives or
Sitemap line (the repository root copy never deployed), and an llms.txt with
no guides or project section.

hooks/seo.py gives each page a description from its first paragraph, and four
spec pages whose first paragraph is not a summary get one in front matter.
overrides/main.html fixes the title, sets og:title to match, and emits one
JSON-LD graph per page with the hub Organization by @id, the page itself, and
a BreadcrumbList. robots.txt moves to docs/, the tutorial nav label is renamed,
and the llms.txt sections follow the five tabs.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013aK3gVWzNdcM3hZ2o2awK2
@imran-siddique
imran-siddique merged commit ed4a2cc into main Sep 14, 2026
16 checks passed
@imran-siddique
imran-siddique deleted the docs/seo-aeo branch September 14, 2026 23:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant