Documentation

Guides and references

SEO

AI Search Discoverability

llms.txt, product facts, AI crawler rules, and claim hygiene for ChatGPT, Claude, and Perplexity.

Why this exists

Classic SEO (sitemap, schema, Search Console) helps Google. AI search discoverability helps ChatGPT, Claude, Perplexity, and coding agents summarize NextBento accurately.

You cannot force citations. You can:

  • Publish machine-readable facts (/llms.txt, /llms-full.txt)
  • Serve chrome-free Markdown when an agent sends Accept: text/markdown
  • Allow AI search crawlers in robots.txt
  • Keep claims honest so models do not invent features

Live files on this site

URLPurpose
/llms.txtCompact llmstxt.org index
/llms-full.txtExpanded stack, inclusions, claim hygiene, and contact
/robots.txtExplicit Allow for ChatGPT, Claude, Perplexity, and related agents
Same URL + Accept: text/markdownChrome-free Markdown (also /{path}.md and /index.md)
/.well-known/api-catalogRFC 9727 API catalog (linkset)
/openapi.jsonOpenAPI 3.1 for checkout, health, and IndexNow
/.well-known/mcp/server-card.jsonMCP Server Card (public facts/docs; no login)
/mcpGET explains the endpoint; POST is Streamable HTTP JSON-RPC (no login)
/.well-known/agent-skills/index.jsonAgent Skills Discovery index (v0.2.0)
/.well-known/ai-catalog.jsonARD capability catalog (also /.well-known/ard.json)

WebMCP tools (navigate, search_docs, get_product_facts, start_checkout) register in the browser on page load via /webmcp.js. They do not log agents in.

Source files:

FilePurpose
lib/seo/product-facts.tsSingle source of truth for name, stack, inclusions, safe/do-not-claim lists
lib/seo/llms-txt.tsBuilds both text files from product facts
app/llms.txt/route.tsServes the compact index as text/plain
app/llms-full.txt/route.tsServes the expanded facts file
app/robots.txt/route.tsAI crawler Allow rules (User-agent, Allow, Disallow, Sitemap)
lib/seo/accept.tsRFC 9110 Accept parsing (HTML vs Markdown)
lib/seo/page-markdown.tsPer-URL Markdown bodies from docs MDX, pSEO JSON, and product facts
proxy.tsRewrites Markdown-preferring requests to app/md/[[...path]]/route.ts
lib/seo/api-catalog.tsRFC 9727 linkset for public HTTP APIs
lib/seo/discovery-links.tsHomepage RFC 8288 Link header values
app/.well-known/api-catalog/route.tsServes application/linkset+json
lib/seo/openapi.tsOpenAPI 3.1 document
app/api/health/route.tsLiveness probe
lib/mcp/server-card.tsSEP-1649 MCP Server Card
lib/mcp/server.tsStreamable HTTP JSON-RPC at POST /mcp
lib/mcp/browser-page.tsHuman GET/HEAD landing for /mcp
lib/seo/agent-skills.tsAgent Skills index and SKILL.md serving
public/webmcp.jsWebMCP tool registration on page load
lib/seo/ard-catalog.tsARD / ai-catalog.json capability manifest

A <link rel="alternate" type="text/plain" href="/llms.txt"> tag in the site <head> helps agents that never fetch robots.txt. Pages also advertise type="text/markdown" on the same URL. The homepage HTTP Link header points at the API catalog (rel="api-catalog"), OpenAPI (rel="service-desc"), human API docs (rel="service-doc"), llms.txt (rel="describedby"), and the ARD catalog (rel="ai-catalog", rel="ard").

Markdown for agents

Markdown content negotiation lets agents pull structured text instead of nav, scripts, and layout HTML.

This origin implements it without requiring Cloudflare Pro:

curl https://www.nextbento.dev/ -H "Accept: text/markdown"
curl https://www.nextbento.dev/docs/quick-start.md

Responses use Content-Type: text/markdown; charset=utf-8, Vary: Accept, and x-markdown-tokens (estimated). Browsers that send Accept: text/html still get HTML.

Docs pages return the MDX source. Marketing and pSEO pages are generated from the same data as the HTML views (product facts, FAQs, JSON page files).

Customize product facts

Edit lib/seo/product-facts.ts:

export const productFacts = {
  name: 'YourProduct',
  oneLiner: 'One sentence a model can quote.',
  shortDescription: 'Two sentences max.',
  stack: ['Next.js 16', 'Supabase', 'Stripe'] as const,
  included: [/* only what you ship */] as const,
  safeToClaim: [/* verified capabilities */] as const,
  doNotClaim: [/* common overclaims to block */] as const,
  contact: {
    email: 'hello@yourdomain.com',
    twitter: 'https://twitter.com/yourhandle',
    github: 'https://github.com/your-org/your-repo',
  },
} as const

Rules:

  • Update safeToClaim and doNotClaim whenever you ship or remove features.
  • Do not list premium features you gate only in the UI — gate on the server.
  • Prefer soft time language (“evenings”, “a weekend”) over unverified stats.

llms.txt format

This site follows llmstxt.org:

  1. H1 — product name
  2. Blockquote — canonical one-liner
  3. Short summary paragraph
  4. H2 sections with Markdown links to key pages (home, pricing, docs, pSEO, legal)
  5. Optional link to /llms-full.txt
  6. “Do not claim” list for model hygiene

Robots.txt and AI crawlers

/robots.txt allows AI search/retrieval bots (and documents training-bot intent with explicit Allow). Google’s parser honors User-agent, Allow, Disallow, and Sitemap. Anything else shows up in Search Console: Content-Signal as “Rule ignored by Googlebot” on every group, and Agentmap as “Syntax not understood.” Google’s John Mueller has said the Content-Signal directive has no effect on crawlers. This file keeps the Content Signals policy in comments only.

The machine-readable preference is the Markdown content-signal header (ai-train=yes, search=yes, ai-input=yes): crawlers may index for search, use the content for RAG / generative answers, and train on it. Preferences are not a technical block. The ARD catalog stays at /.well-known/ai-catalog.json, with rel="ai-catalog" and rel="ard" in the page head and Link header.

Listed user-agents:

  • OAI-SearchBot, ChatGPT-User, GPTBot (OpenAI)
  • Claude-SearchBot, Claude-User, ClaudeBot (Anthropic)
  • PerplexityBot, Perplexity-User
  • Google-Extended, Applebot-Extended

/api/ stays disallowed. To opt out of training later, add Disallow: / for GPTBot and ClaudeBot only, and set the Markdown header to ai-train=no. That is separate from AI search visibility.

The marketing footer links /llms.txt so humans and crawlers can find the file.

Workflow after content changes

  1. Ship content (pSEO page, docs update, pricing copy).
  2. Run pnpm submit:indexnow (or pass specific paths, including /llms.txt).
  3. Request indexing in Google Search Console for high-priority URLs (optional, manual).
  4. Spot-check ChatGPT / Claude / Perplexity answers — citations can lag days or weeks.

What not to expect

  • llms.txt is not a Google ranking signal.
  • IndexNow does not replace Search Console.
  • AI models may still hallucinate — doNotClaim reduces but does not eliminate it.