{
  "site": "ChangeGamer",
  "url": "https://changegamer.ai",
  "description": "Editorial guides: one pillar article per topic cluster plus in-depth sub-articles. Always free. Separate from the licensable reference corpus at /api/resources.json.",
  "count": 40,
  "words": 67623,
  "newest_update": "2026-08-22",
  "clusters": [
    {
      "id": "agent-ready-web",
      "title": "The agent-ready web",
      "description": "How to make a website readable, citable, controllable and payable for AI agents and AI crawlers — the operator side of the machine-first web.",
      "target_query": "how to make a website AI agent ready",
      "status": "complete",
      "started": "2026-07-26",
      "target_subs": 13,
      "published_subs": 13,
      "pillar": {
        "slug": "agent-ready-website",
        "title": "The Agent-Ready Website: A Complete Guide to AI Visibility, Access Control and Monetization",
        "description": "The full operator playbook for making a website work for AI agents and AI crawlers: be fetchable, be readable, be controllable, be payable — with a 30-day implementation plan.",
        "kind": "pillar",
        "order": 0,
        "cluster": "agent-ready-web",
        "target_query": "how to make a website AI agent ready",
        "secondary_queries": [
          "optimize website for AI agents",
          "AI visibility for websites",
          "agent-first website architecture",
          "AI crawler strategy for publishers"
        ],
        "tags": [
          "ai-visibility",
          "agents",
          "crawlers",
          "llms.txt",
          "monetization",
          "seo"
        ],
        "published": "2026-07-26",
        "updated": "2026-07-26",
        "words": 4160,
        "takeaways": [
          "An agent-ready site does four things: it is **fetchable** at the edge, **readable** without a browser, **controllable** through published policy, and **payable** without a human in the loop. Most sites fail the first two for reasons that have nothing to do with content quality.",
          "The single highest-leverage change is not llms.txt. It is verifying that your WAF, bot-management rules and browser-integrity checks are not silently returning 403 to the crawlers you want.",
          "Blocking and monetizing are the same decision made twice: `robots.txt` and Content Signals express a preference, RSL expresses a licence, and HTTP 402 is the only layer that actually enforces a price.",
          "Measure agent traffic server-side by user agent and outcome. Analytics that depend on JavaScript record almost none of it.",
          "Agent traffic is no longer a rounding error: Cloudflare reported automated systems drove 57.5% of HTTP requests against 42.5% human in mid-2026 — the first such crossover it has recorded."
        ],
        "faq_count": 5,
        "resources": [
          "https://changegamer.ai/resources/llms-txt-explained",
          "https://changegamer.ai/resources/ai-crawler-policy",
          "https://changegamer.ai/resources/content-signals-explained",
          "https://changegamer.ai/resources/agentic-payment-protocols",
          "https://changegamer.ai/resources/paying-for-access-402",
          "https://changegamer.ai/resources/data-formats",
          "https://changegamer.ai/resources/json-api",
          "https://changegamer.ai/resources/agents-md-explained",
          "https://changegamer.ai/resources/mcp-server-discovery",
          "https://changegamer.ai/resources/building-mcp-servers",
          "https://changegamer.ai/resources/web-data-for-agents",
          "https://changegamer.ai/resources/handling-rate-limits-and-retries",
          "https://changegamer.ai/resources/agentic-browsers",
          "https://changegamer.ai/resources/nlweb-explained",
          "https://changegamer.ai/resources/c2pa-content-credentials",
          "https://changegamer.ai/resources/agent-control-specification"
        ],
        "html": "https://changegamer.ai/articles/agent-ready-website",
        "markdown": "https://changegamer.ai/articles/agent-ready-website.md",
        "json": "https://changegamer.ai/api/articles/agent-ready-website.json"
      },
      "subs": [
        {
          "slug": "llms-txt-vs-robots-txt-vs-sitemap",
          "title": "llms.txt vs robots.txt vs sitemap.xml: Which File Does What",
          "description": "The three root-level files every agent-ready site publishes, what each one is actually for, and why publishing one does not substitute for the others.",
          "kind": "sub",
          "order": 1,
          "cluster": "agent-ready-web",
          "target_query": "llms.txt vs robots.txt vs sitemap.xml",
          "secondary_queries": [
            "difference between llms.txt and robots.txt",
            "do I need llms.txt if I have a sitemap",
            "root level files for AI crawlers"
          ],
          "tags": [
            "llms.txt",
            "robots.txt",
            "sitemap",
            "crawlers",
            "ai-visibility"
          ],
          "published": "2026-07-26",
          "updated": "2026-07-26",
          "words": 1226,
          "takeaways": [
            "`robots.txt` is **permission**, `sitemap.xml` is **inventory**, `llms.txt` is **curation**. Different questions, different consumers, no overlap in function.",
            "Only `robots.txt` changes crawler behaviour on compliant clients. A sitemap is a hint; llms.txt is a convenience that no vendor has committed to reading.",
            "You need all three for different reasons, and none of them fixes an edge rule that returns 403.",
            "The one file that can actively cost you traffic if written carelessly is `robots.txt` — a single misplaced `Disallow` removes you from products you wanted to be in."
          ],
          "faq_count": 3,
          "resources": [
            "https://changegamer.ai/resources/llms-txt-explained",
            "https://changegamer.ai/resources/ai-crawler-policy",
            "https://changegamer.ai/resources/content-signals-explained",
            "https://changegamer.ai/resources/agents-md-explained"
          ],
          "html": "https://changegamer.ai/articles/llms-txt-vs-robots-txt-vs-sitemap",
          "markdown": "https://changegamer.ai/articles/llms-txt-vs-robots-txt-vs-sitemap.md",
          "json": "https://changegamer.ai/api/articles/llms-txt-vs-robots-txt-vs-sitemap.json"
        },
        {
          "slug": "how-to-write-an-llms-txt-file",
          "title": "How to Write an llms.txt File (Format, Template, and Maintenance)",
          "description": "A step-by-step guide to writing a useful llms.txt: the exact format, a copy-paste template, what to put under ## Optional, how to validate it, and how to keep it from rotting.",
          "kind": "sub",
          "order": 2,
          "cluster": "agent-ready-web",
          "target_query": "how to write an llms.txt file",
          "secondary_queries": [
            "llms.txt template",
            "llms.txt format example",
            "llms.txt generator vs hand written"
          ],
          "tags": [
            "llms.txt",
            "ai-visibility",
            "agents",
            "documentation"
          ],
          "published": "2026-07-26",
          "updated": "2026-07-26",
          "words": 1301,
          "takeaways": [
            "The format is four elements in order: an H1 name, an optional blockquote summary, optional prose, then H2 sections of annotated links. Nothing else is defined.",
            "Curate ruthlessly. A model choosing what to fetch benefits from forty good links, not four thousand — a dumped sitemap is the most common way to make the file worthless.",
            "Point every link at a Markdown variant where you have one. The file exists to reduce token cost; linking to JavaScript-heavy HTML defeats the purpose.",
            "Generate it from the same source that generates your pages. A hand-maintained llms.txt drifts within weeks and then lies about your site.",
            "Put changelogs, archives and secondary material under `## Optional` — agents under context pressure are permitted to skip that whole section."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/llms-txt-explained",
            "https://changegamer.ai/resources/data-formats",
            "https://changegamer.ai/resources/getting-started"
          ],
          "html": "https://changegamer.ai/articles/how-to-write-an-llms-txt-file",
          "markdown": "https://changegamer.ai/articles/how-to-write-an-llms-txt-file.md",
          "json": "https://changegamer.ai/api/articles/how-to-write-an-llms-txt-file.json"
        },
        {
          "slug": "serving-markdown-variants-to-ai-agents",
          "title": "Serving Markdown Variants to AI Agents: The Cheapest Win in AI Visibility",
          "description": "How to publish a .md twin of every page — URL patterns, content negotiation, discovery headers, generation pitfalls — and why it cuts what an agent pays to read you.",
          "kind": "sub",
          "order": 3,
          "cluster": "agent-ready-web",
          "target_query": "serve markdown version of web pages for AI agents",
          "secondary_queries": [
            "markdown variant url pattern",
            "content negotiation text/markdown",
            "reduce token cost of web pages for LLMs"
          ],
          "tags": [
            "markdown",
            "formats",
            "agents",
            "ai-visibility",
            "tokens"
          ],
          "published": "2026-07-26",
          "updated": "2026-07-26",
          "words": 1091,
          "takeaways": [
            "A Markdown twin of an HTML page removes navigation, scripts, styling and ads from what a model sees — typically a large reduction in tokens with no loss of meaning.",
            "Use a predictable URL suffix (`/page` → `/page.md`). It is discoverable, cacheable, linkable and works with every CDN. Content negotiation is a nice addition, not a substitute.",
            "Generate Markdown from your source content, not from rendered HTML. HTML-to-Markdown conversion drags navigation and boilerplate back in — the exact thing you were removing.",
            "Advertise it: `<link rel=\"alternate\" type=\"text/markdown\">` in the HTML head, the `.md` URL in your llms.txt, and a `Link` header if you can.",
            "Keep the two in lockstep by rendering both from one source. Two hand-maintained copies means shipping two versions of the truth."
          ],
          "faq_count": 3,
          "resources": [
            "https://changegamer.ai/resources/data-formats",
            "https://changegamer.ai/resources/llms-txt-explained",
            "https://changegamer.ai/resources/json-api",
            "https://changegamer.ai/resources/getting-started"
          ],
          "html": "https://changegamer.ai/articles/serving-markdown-variants-to-ai-agents",
          "markdown": "https://changegamer.ai/articles/serving-markdown-variants-to-ai-agents.md",
          "json": "https://changegamer.ai/api/articles/serving-markdown-variants-to-ai-agents.json"
        },
        {
          "slug": "how-ai-search-engines-choose-sources",
          "title": "How AI Search Engines Choose Sources (And What You Can Actually Influence)",
          "description": "What is known, what is claimed and what is speculation about how ChatGPT, Perplexity and AI Overviews pick the pages they cite — and the short list of things a site owner can actually control.",
          "kind": "sub",
          "order": 4,
          "cluster": "agent-ready-web",
          "target_query": "how do AI search engines choose which sources to cite",
          "secondary_queries": [
            "get cited by ChatGPT and Perplexity",
            "generative engine optimization evidence",
            "AI Overviews citation factors"
          ],
          "tags": [
            "ai-visibility",
            "citations",
            "answer-engines",
            "seo",
            "rag"
          ],
          "published": "2026-07-26",
          "updated": "2026-07-26",
          "words": 1348,
          "takeaways": [
            "Answer engines are retrieval systems with a generation step. Citation is decided by retrieval (can a passage be found and matched) and by verifiability (can the model defend quoting it) — not by anything resembling PageRank.",
            "The strongest controllable factor is passage-level self-containment: a section that answers one question completely, without depending on the paragraph above it, is the unit that gets retrieved and quoted.",
            "Be explicit about facts: dates, numbers, named sources, versions. A model choosing between two passages will prefer the one it can attribute.",
            "Most \"GEO\" tactics circulating today are untested. Treat anything without a published mechanism as a hypothesis, and spend the budget on retrievability instead.",
            "You cannot be cited if you cannot be fetched. Access verification comes before any of this."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/rag-retrieval-for-agents",
            "https://changegamer.ai/resources/chunking-strategies-for-rag",
            "https://changegamer.ai/resources/ai-crawler-policy",
            "https://changegamer.ai/resources/data-formats"
          ],
          "html": "https://changegamer.ai/articles/how-ai-search-engines-choose-sources",
          "markdown": "https://changegamer.ai/articles/how-ai-search-engines-choose-sources.md",
          "json": "https://changegamer.ai/api/articles/how-ai-search-engines-choose-sources.json"
        },
        {
          "slug": "should-you-block-ai-crawlers",
          "title": "Should You Block AI Crawlers? A Decision Framework by Business Model",
          "description": "Blocking AI crawlers is four separate decisions, not one. A framework that maps each crawler class to what it costs and earns you, by business model, with the exact robots.txt for each answer.",
          "kind": "sub",
          "order": 5,
          "cluster": "agent-ready-web",
          "target_query": "should I block AI crawlers",
          "secondary_queries": [
            "block GPTBot pros and cons",
            "does blocking AI crawlers hurt SEO",
            "allow or block ClaudeBot PerplexityBot"
          ],
          "tags": [
            "crawlers",
            "robots.txt",
            "policy",
            "monetization",
            "ai-visibility"
          ],
          "published": "2026-07-26",
          "updated": "2026-07-26",
          "words": 1175,
          "takeaways": [
            "There is no single \"AI crawler\" decision. There are four: training collection, search indexing, live user-triggered fetches, and open web archives. They pay you back completely differently.",
            "Training opt-out tokens (`Google-Extended`, `Applebot-Extended`) cost you nothing in search visibility — they are policy tokens, not crawlers.",
            "Blocking search-indexing bots (`OAI-SearchBot`, `Claude-SearchBot`, `PerplexityBot`) removes you from those products' answers. That is a distribution decision, and usually the expensive one to get wrong.",
            "Blocking is enforcement-free: `robots.txt` is advisory, and some fetchers ignore it by design. If you need enforcement, that is a WAF rule or a 402, not a `Disallow`.",
            "The middle path most publishers actually want: allow answer-engine indexing, decline training, declare usage preferences, and price bulk access."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/ai-crawler-policy",
            "https://changegamer.ai/resources/content-signals-explained",
            "https://changegamer.ai/resources/agentic-payment-protocols",
            "https://changegamer.ai/resources/access-and-pricing"
          ],
          "html": "https://changegamer.ai/articles/should-you-block-ai-crawlers",
          "markdown": "https://changegamer.ai/articles/should-you-block-ai-crawlers.md",
          "json": "https://changegamer.ai/api/articles/should-you-block-ai-crawlers.json"
        },
        {
          "slug": "what-to-charge-ai-crawlers",
          "title": "What to Charge AI Crawlers: Pricing Models for Machine Buyers",
          "description": "Per-crawl, per-resource, corpus licence or subscription key — the four ways to price AI access, the arithmetic behind each, and why pricing before you have demand data is the standard mistake.",
          "kind": "sub",
          "order": 6,
          "cluster": "agent-ready-web",
          "target_query": "what to charge AI crawlers for content access",
          "secondary_queries": [
            "pay per crawl pricing",
            "how to price content licensing for AI",
            "per request pricing for AI agents"
          ],
          "tags": [
            "monetization",
            "pricing",
            "pay-per-crawl",
            "402",
            "crawlers"
          ],
          "published": "2026-07-26",
          "updated": "2026-07-26",
          "words": 1381,
          "takeaways": [
            "Four pricing shapes exist: per-crawl, per-resource unlock, corpus licence, and subscription key. They suit different demand patterns, and your logs tell you which pattern you have.",
            "Per-crawl pricing only works where crawl volume is high and content is homogeneous. For most sites, revenue per crawl is a fraction of a cent and the operational overhead exceeds it.",
            "The number that matters is not \"what is my content worth\" but \"what does this buyer save by buying instead of scraping\". Price against their alternative, which is usually cheap.",
            "Do not set prices before you can see demand. Concentrated 402s on a few URLs argue for per-resource; broad shallow crawling argues for a corpus licence.",
            "Whatever you charge, publish it machine-readably. A price an agent has to email you about is not a price."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/agentic-payment-protocols",
            "https://changegamer.ai/resources/paying-for-access-402",
            "https://changegamer.ai/resources/access-and-pricing",
            "https://changegamer.ai/resources/ai-crawler-policy"
          ],
          "html": "https://changegamer.ai/articles/what-to-charge-ai-crawlers",
          "markdown": "https://changegamer.ai/articles/what-to-charge-ai-crawlers.md",
          "json": "https://changegamer.ai/api/articles/what-to-charge-ai-crawlers.json"
        },
        {
          "slug": "http-402-paywall-implementation",
          "title": "Implementing an HTTP 402 Paywall an Agent Can Actually Pay",
          "description": "A working implementation guide for machine-payable content: the 402 response body, Link headers, key issuance and validation, caching rules, and the mistakes that make a 402 gate unpayable.",
          "kind": "sub",
          "order": 7,
          "cluster": "agent-ready-web",
          "target_query": "how to implement an HTTP 402 paywall",
          "secondary_queries": [
            "http 402 payment required example response",
            "machine readable paywall for AI agents",
            "api key issuance after stripe checkout worker"
          ],
          "tags": [
            "402",
            "paywall",
            "monetization",
            "agents",
            "implementation"
          ],
          "published": "2026-07-26",
          "updated": "2026-07-26",
          "words": 1262,
          "takeaways": [
            "A payable 402 has five things in the body: what was blocked, the price, where to pay, exactly how to retry, and links to terms and licence.",
            "Never gate the terms. If your 402 points at a pricing or licence page, that page must stay free, or the loop cannot close.",
            "Put the commercial metadata in `Link` headers too, so a `HEAD` request is enough to learn the price.",
            "Paid responses must be `Cache-Control: no-store`. A CDN that caches a paid body publicly leaks the product.",
            "Key validation belongs at the edge, in front of the asset — not inside the page. Return the same 402 shape for \"no key\" and \"key of insufficient tier\", differing only in the instruction."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/paying-for-access-402",
            "https://changegamer.ai/resources/agentic-payment-protocols",
            "https://changegamer.ai/resources/access-and-pricing",
            "https://changegamer.ai/resources/json-api"
          ],
          "html": "https://changegamer.ai/articles/http-402-paywall-implementation",
          "markdown": "https://changegamer.ai/articles/http-402-paywall-implementation.md",
          "json": "https://changegamer.ai/api/articles/http-402-paywall-implementation.json"
        },
        {
          "slug": "structured-data-for-ai-agents",
          "title": "Structured Data for AI Agents: Which Schema.org Types Earn Their Keep",
          "description": "Most schema.org markup is invisible to machine readers. The types that are worth the effort for AI agents, how to emit them without drift, and what to build instead of more markup.",
          "kind": "sub",
          "order": 8,
          "cluster": "agent-ready-web",
          "target_query": "schema.org structured data for AI agents",
          "secondary_queries": [
            "json-ld for llm consumption",
            "which schema types matter for AI",
            "structured data vs json api for agents"
          ],
          "tags": [
            "structured-data",
            "schema.org",
            "json-ld",
            "ai-visibility",
            "seo"
          ],
          "published": "2026-07-26",
          "updated": "2026-07-26",
          "words": 1148,
          "takeaways": [
            "Structured data helps machine readers most where it states facts the prose leaves implicit: dates, prices, authorship, identity, licence.",
            "A short, correct graph beats a long, aspirational one. Four accurate types are worth more than twenty types with placeholder values.",
            "Emit JSON-LD from the same source that renders the page. Hand-written markup drifts from the visible content, and contradiction is worse than absence.",
            "Never mark up something that is not visible on the page. It is a policy violation for search rich results and it makes the whole graph untrustworthy to any consumer.",
            "If the thing you are marking up is really data — a catalogue, prices, availability — publish a JSON endpoint. Structured data is a description of a page; an API is the data itself."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/data-formats",
            "https://changegamer.ai/resources/json-api",
            "https://changegamer.ai/resources/llms-txt-explained",
            "https://changegamer.ai/resources/c2pa-content-credentials"
          ],
          "html": "https://changegamer.ai/articles/structured-data-for-ai-agents",
          "markdown": "https://changegamer.ai/articles/structured-data-for-ai-agents.md",
          "json": "https://changegamer.ai/api/articles/structured-data-for-ai-agents.json"
        },
        {
          "slug": "json-api-design-for-agents",
          "title": "JSON API Design for AI Agents: Endpoints They Prefer Over Scraping",
          "description": "How to publish read-only JSON endpoints that agents choose over scraping your HTML: discovery index, stable shapes, freshness signals, bulk exports, and errors a machine can act on.",
          "kind": "sub",
          "order": 9,
          "cluster": "agent-ready-web",
          "target_query": "json api design for AI agents",
          "secondary_queries": [
            "api for llm consumption best practices",
            "machine readable endpoints instead of scraping",
            "openapi for agent tool use"
          ],
          "tags": [
            "json",
            "api",
            "agents",
            "openapi",
            "formats"
          ],
          "published": "2026-07-26",
          "updated": "2026-07-26",
          "words": 1288,
          "takeaways": [
            "Publish one discovery endpoint that lists every other endpoint with its content type and auth requirement. Without it, an agent guesses URLs.",
            "Give every collection a cheap freshness signal — a stats or version endpoint — so pollers stop re-fetching everything to learn nothing changed.",
            "Bulk beats pagination for corpora. One NDJSON export saves an agent hundreds of round trips and saves you the traffic.",
            "Errors must be machine-actionable: a stable error code, what to do next, and where the terms are. `{\"error\":\"not_found\"}` with no next step wastes a retry budget.",
            "Ship an OpenAPI description. Toolchains generate agent tools from it, which turns your API into something an agent can call without bespoke integration code."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/json-api",
            "https://changegamer.ai/resources/data-formats",
            "https://changegamer.ai/resources/reliable-tool-calling",
            "https://changegamer.ai/resources/handling-rate-limits-and-retries",
            "https://changegamer.ai/resources/streaming-for-agents"
          ],
          "html": "https://changegamer.ai/articles/json-api-design-for-agents",
          "markdown": "https://changegamer.ai/articles/json-api-design-for-agents.md",
          "json": "https://changegamer.ai/api/articles/json-api-design-for-agents.json"
        },
        {
          "slug": "measuring-ai-agent-traffic",
          "title": "Measuring AI Agent Traffic: Server-Side Telemetry That Answers Real Questions",
          "description": "Why client-side analytics miss AI agents entirely, the minimum row schema to log, the five queries worth running, and how to tell a real crawler from a spoofed user agent.",
          "kind": "sub",
          "order": 10,
          "cluster": "agent-ready-web",
          "target_query": "how to measure AI agent and crawler traffic",
          "secondary_queries": [
            "track GPTBot ClaudeBot in server logs",
            "AI crawler analytics setup",
            "verify AI crawler is real not spoofed"
          ],
          "tags": [
            "analytics",
            "observability",
            "crawlers",
            "measurement",
            "ai-visibility"
          ],
          "published": "2026-07-26",
          "updated": "2026-07-26",
          "words": 1221,
          "takeaways": [
            "Agents mostly do not execute JavaScript, so JS-based analytics record almost none of this traffic. Everything useful is server-side.",
            "Six fields are enough: timestamp, path, user agent, status, outcome class, and a bot-verified flag. Resist logging more, especially anything credential-shaped.",
            "The decisive metric is the fetch-to-referral ratio per crawler: high fetches with no referrals means you are supplying answers, not receiving visitors.",
            "User agents are trivially spoofed. Verify against published vendor IP ranges before you treat a row as a real vendor crawler.",
            "Set a decision threshold in advance — \"N distinct paywall hits in 30 days\" — so that pricing and blocking decisions are made on evidence rather than on the first interesting week."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/ai-crawler-policy",
            "https://changegamer.ai/resources/agent-observability",
            "https://changegamer.ai/resources/web-bot-auth",
            "https://changegamer.ai/resources/access-and-pricing"
          ],
          "html": "https://changegamer.ai/articles/measuring-ai-agent-traffic",
          "markdown": "https://changegamer.ai/articles/measuring-ai-agent-traffic.md",
          "json": "https://changegamer.ai/api/articles/measuring-ai-agent-traffic.json"
        },
        {
          "slug": "licensing-content-for-ai-training",
          "title": "Licensing Content for AI Training: RSL, Terms, and Provenance",
          "description": "How to publish machine-readable licence terms for AI use — what RSL is, what it does and does not do, how it differs from robots.txt and Content Signals, and where provenance standards fit.",
          "kind": "sub",
          "order": 11,
          "cluster": "agent-ready-web",
          "target_query": "how to license website content for AI training",
          "secondary_queries": [
            "RSL really simple licensing explained",
            "machine readable license for AI crawlers",
            "terms of service AI training clause"
          ],
          "tags": [
            "licensing",
            "rsl",
            "provenance",
            "policy",
            "monetization"
          ],
          "published": "2026-07-26",
          "updated": "2026-07-26",
          "words": 1042,
          "takeaways": [
            "Four layers, four different jobs: `robots.txt` controls access, Content Signals declare usage preference, a licence states terms, and a payment gate enforces a price. None substitutes for another.",
            "RSL (Really Simple Licensing) is a machine-readable licence document, typically an XML file discovered via a `License:` directive in robots.txt. It declares terms and compensation; it does not collect money.",
            "A licence is only useful if it is discoverable, free to read, unambiguous about the unit being licensed, and versioned.",
            "Provenance standards (C2PA Content Credentials) prove where an asset came from. That is a different guarantee from a licence and increasingly asked for alongside one.",
            "Publish the licence even if you never sell anything: it converts \"we assume this is allowed\" into a documented position."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/ai-crawler-policy",
            "https://changegamer.ai/resources/content-signals-explained",
            "https://changegamer.ai/resources/agentic-payment-protocols",
            "https://changegamer.ai/resources/c2pa-content-credentials",
            "https://changegamer.ai/resources/ai-supply-chain-provenance",
            "https://changegamer.ai/resources/access-and-pricing"
          ],
          "html": "https://changegamer.ai/articles/licensing-content-for-ai-training",
          "markdown": "https://changegamer.ai/articles/licensing-content-for-ai-training.md",
          "json": "https://changegamer.ai/api/articles/licensing-content-for-ai-training.json"
        },
        {
          "slug": "mcp-server-as-distribution-channel",
          "title": "Running an MCP Server as a Distribution Channel for Your Content",
          "description": "Why a content site should expose an MCP server, which tools to ship, how discovery and authentication work, how to gate paid tools, and the honest limits of the channel.",
          "kind": "sub",
          "order": 12,
          "cluster": "agent-ready-web",
          "target_query": "MCP server for a content website",
          "secondary_queries": [
            "expose website content as MCP tools",
            "mcp server distribution channel publishers",
            "which mcp tools should a content site offer"
          ],
          "tags": [
            "mcp",
            "distribution",
            "agents",
            "tools",
            "monetization"
          ],
          "published": "2026-07-26",
          "updated": "2026-07-26",
          "words": 1154,
          "takeaways": [
            "An MCP server turns your content from something agents scrape into something agents call. The client keeps the connection; you keep the interface.",
            "Ship five tools before anything clever: list, get, search, bulk-get, and an access/pricing tool. That covers almost every question an agent asks.",
            "Reuse your JSON layer. If you already publish an index, per-item and bulk endpoints, the MCP server is a thin adapter over them — not a second content system.",
            "Gate paid tools with the same entitlement check and the same payment-required payload your HTTP 402 gate returns, from one shared code path.",
            "Discovery is the weak link: a server nobody lists is a server nobody connects to. Registry presence and a `.well-known` descriptor do more for adoption than extra tools."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/building-mcp-servers",
            "https://changegamer.ai/resources/mcp-server-discovery",
            "https://changegamer.ai/resources/mcp-primitives",
            "https://changegamer.ai/resources/mcp-server-authentication",
            "https://changegamer.ai/resources/mcp-vs-function-calling",
            "https://changegamer.ai/resources/json-api"
          ],
          "html": "https://changegamer.ai/articles/mcp-server-as-distribution-channel",
          "markdown": "https://changegamer.ai/articles/mcp-server-as-distribution-channel.md",
          "json": "https://changegamer.ai/api/articles/mcp-server-as-distribution-channel.json"
        },
        {
          "slug": "why-ai-agents-cant-read-your-site",
          "title": "Why AI Agents Can't Read Your Site: Twelve Failure Modes and How to Find Them",
          "description": "A diagnostic catalogue of the twelve reasons AI agents and crawlers fail on real sites — from silent WAF blocks to JS-only rendering — each with the command that detects it and the fix.",
          "kind": "sub",
          "order": 13,
          "cluster": "agent-ready-web",
          "target_query": "why can AI agents not read my website",
          "secondary_queries": [
            "GPTBot getting 403 from my site",
            "ChatGPT cannot access my page",
            "AI crawler blocked by cloudflare fix"
          ],
          "tags": [
            "debugging",
            "crawlers",
            "waf",
            "rendering",
            "ai-visibility"
          ],
          "published": "2026-07-26",
          "updated": "2026-07-26",
          "words": 1407,
          "takeaways": [
            "The most common cause is not content: it is an edge rule returning 403 to crawlers your robots.txt explicitly allows.",
            "Diagnose from outside with a spoofed user agent. A page that looks fine in your browser proves nothing about what a crawler receives.",
            "JavaScript-only content is invisible to crawlers that do not render and expensive for those that do — check the raw HTML response, not the DOM.",
            "Soft 404s and 200-with-error-page responses are worse than honest errors, because an agent will quote the error page as your content.",
            "Fix in this order: access, then rendering, then structure, then formats. Each layer is worthless while the one above it is broken."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/ai-crawler-policy",
            "https://changegamer.ai/resources/web-data-for-agents",
            "https://changegamer.ai/resources/agentic-browsers",
            "https://changegamer.ai/resources/handling-rate-limits-and-retries",
            "https://changegamer.ai/resources/document-extraction-for-agents",
            "https://changegamer.ai/resources/data-formats"
          ],
          "html": "https://changegamer.ai/articles/why-ai-agents-cant-read-your-site",
          "markdown": "https://changegamer.ai/articles/why-ai-agents-cant-read-your-site.md",
          "json": "https://changegamer.ai/api/articles/why-ai-agents-cant-read-your-site.json"
        }
      ]
    },
    {
      "id": "selling-to-agents",
      "title": "Selling to AI agents",
      "description": "How to sell content, APIs and tools to buyers that are software — discovery, machine-readable offers, spend ceilings, payment rails, and what breaks.",
      "target_query": "how to sell to AI agents",
      "status": "complete",
      "started": "2026-07-28",
      "target_subs": 12,
      "published_subs": 12,
      "pillar": {
        "slug": "selling-to-ai-agents",
        "title": "How to Sell to AI Agents: The Complete Guide to Machine Buyers",
        "description": "The operator playbook for selling content, APIs and tools to buyers that are software: how agents discover, evaluate, authorize and pay — and the four rails you can charge them on today.",
        "kind": "pillar",
        "order": 0,
        "cluster": "selling-to-agents",
        "target_query": "how to sell to AI agents",
        "secondary_queries": [
          "monetize AI agent traffic",
          "agent commerce for API providers",
          "machine buyers checkout",
          "charge AI agents for API access"
        ],
        "tags": [
          "monetization",
          "agent-commerce",
          "payments",
          "x402",
          "402",
          "pricing",
          "agents"
        ],
        "published": "2026-07-28",
        "updated": "2026-07-28",
        "words": 4074,
        "takeaways": [
          "A machine buyer cannot be persuaded, only **qualified**. Everything that works on a human landing page — social proof, urgency, design — is invisible. What decides the sale is whether your price, terms and preview are machine-readable at the moment the agent hits the wall.",
          "The funnel has five stages and each one is a separate engineering problem: discover, evaluate, authorize, pay, reuse. Most sellers build stage 4 and lose the sale at stage 1 or 2.",
          "Four rails are live today: a self-hosted HTTP 402 gate with API keys (fiat, no crypto), native x402 (agent pays end-to-end in stablecoins, no account), marketplace publishing, and crawl licensing. They are not alternatives so much as different buyers.",
          "Your buyer has a hard spending cap set by someone else — provider budgets, wallet ceilings, signed price mandates, tokenized card limits. Price under the cap or you are not in the consideration set.",
          "x402 has a distribution property no other rail has: Coinbase's discovery catalog lists an endpoint automatically the first time a payment settles for it. Your first sale is also your listing event."
        ],
        "faq_count": 5,
        "resources": [
          "https://changegamer.ai/resources/selling-to-agents",
          "https://changegamer.ai/resources/agent-wallets-x402",
          "https://changegamer.ai/resources/agent-spend-controls",
          "https://changegamer.ai/resources/agentic-payment-protocols",
          "https://changegamer.ai/resources/paying-for-access-402",
          "https://changegamer.ai/resources/access-and-pricing",
          "https://changegamer.ai/resources/json-api",
          "https://changegamer.ai/resources/data-formats",
          "https://changegamer.ai/resources/mcp-server-discovery",
          "https://changegamer.ai/resources/building-mcp-servers",
          "https://changegamer.ai/resources/agent-identity-authentication",
          "https://changegamer.ai/resources/web-bot-auth",
          "https://changegamer.ai/resources/llms-txt-explained"
        ],
        "html": "https://changegamer.ai/articles/selling-to-ai-agents",
        "markdown": "https://changegamer.ai/articles/selling-to-ai-agents.md",
        "json": "https://changegamer.ai/api/articles/selling-to-ai-agents.json"
      },
      "subs": [
        {
          "slug": "agent-checkout-vs-human-checkout",
          "title": "Agent Checkout vs. Human Checkout: Why Your Payment Flow Fails Machine Buyers",
          "description": "Why checkout built for a person watching a screen is unusable by an AI agent, and what a checkout flow that actually completes for a machine buyer looks like — 402 + API key versus native x402.",
          "kind": "sub",
          "order": 1,
          "cluster": "selling-to-agents",
          "target_query": "why human checkout flows fail for AI agents",
          "secondary_queries": [
            "can an AI agent complete checkout",
            "machine readable checkout flow",
            "agent friendly payment flow",
            "402 vs x402 checkout"
          ],
          "tags": [
            "checkout",
            "monetization",
            "402",
            "x402",
            "agents",
            "payments",
            "api-keys"
          ],
          "published": "2026-07-29",
          "updated": "2026-07-29",
          "words": 1646,
          "takeaways": [
            "A checkout built for a person fails an agent at a specific, listable set of steps: email verification loops, a confirmation-inbox requirement, CAPTCHAs, cookie-dependent sessions, JS-rendered forms with no API equivalent, and multi-page redirects that assume a human is watching a screen.",
            "Two rails exist today that a machine can complete: a self-hosted HTTP 402 gate with API keys (fiat, no crypto, one human step at first purchase) and native x402 (the agent signs and pays end-to-end, no human step at all — dormant on most sites, including this one, until an operator turns on-chain settlement on).",
            "The dividing line is not \"is a human involved\" — it is \"is a human involved on every purchase, or only the first one\". A key rail asks for one human checkout ever; a human-only checkout asks for one on every single transaction.",
            "Fixing a checkout for agents is mostly not a payments problem, it is an idempotency and header problem: mint keys idempotently against retried webhooks, accept both `Authorization: Bearer` and `X-API-Key`, give the buyer a retrieval path for a lost key, and never gate the flow behind a cookie session.",
            "Test your checkout the way an agent will use it: with `curl`, no browser, no cookie jar. If the loop cannot be completed in that shape, no agent can complete it either."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/paying-for-access-402",
            "https://changegamer.ai/resources/agent-wallets-x402"
          ],
          "html": "https://changegamer.ai/articles/agent-checkout-vs-human-checkout",
          "markdown": "https://changegamer.ai/articles/agent-checkout-vs-human-checkout.md",
          "json": "https://changegamer.ai/api/articles/agent-checkout-vs-human-checkout.json"
        },
        {
          "slug": "machine-readable-pricing-pages",
          "title": "Machine-Readable Pricing Pages: How to Let an Agent Evaluate Your Offer Before It Pays",
          "description": "Why a prose pricing page cannot be evaluated by an AI agent, what fields a machine-readable offer catalog needs, and how to keep it in lockstep with your human pricing page and your 402 body.",
          "kind": "sub",
          "order": 2,
          "cluster": "selling-to-agents",
          "target_query": "machine readable pricing for AI agents",
          "secondary_queries": [
            "machine readable pricing page",
            "JSON pricing catalog for AI agents",
            "agent readable offer catalog",
            "pricing.json for agents"
          ],
          "tags": [
            "pricing",
            "monetization",
            "json-api",
            "402",
            "agents",
            "data-formats"
          ],
          "published": "2026-07-30",
          "updated": "2026-07-30",
          "words": 1570,
          "takeaways": [
            "An agent cannot evaluate a price it can only find in prose. A pricing page written as sentences forces the agent to either skip the parse or hit your paywall to find out what it costs — a machine-readable offer catalog at a stable JSON path answers that before any request is blocked.",
            "A usable offer entry needs, at minimum: an identifier, price, currency, interval, what it unlocks, the exact checkout URL, the deliverables the buyer actually receives, and the license grant — training, redistribution and indexing are separate permissions, not one bucket labeled \"access\".",
            "The same facts belong in three places that must never disagree: the JSON catalog, the human pricing page, and the 402 response body. Three independently-maintained copies of the same numbers is a drift bug waiting to ship; the fix is one source of truth and, ideally, a build-time assertion that fails the build on mismatch.",
            "ChangeGamer runs exactly this today: `/api/pricing.json` and the MCP `get_pricing` tool are both generated from one `OFFERS` array, and the build calls `assertPricingLockstep()` at module scope so a changed price or checkout URL that is not mirrored into the pricing resource and the 402 resource fails `astro build`, not a customer's retry loop.",
            "A machine-readable catalog is not the checkout — it is what an agent reads to decide whether checkout is worth attempting. It must be free and reachable before the paywall, or the agent has nothing to evaluate against and defaults to not buying."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/access-and-pricing",
            "https://changegamer.ai/resources/json-api",
            "https://changegamer.ai/resources/data-formats",
            "https://changegamer.ai/resources/paying-for-access-402"
          ],
          "html": "https://changegamer.ai/articles/machine-readable-pricing-pages",
          "markdown": "https://changegamer.ai/articles/machine-readable-pricing-pages.md",
          "json": "https://changegamer.ai/api/articles/machine-readable-pricing-pages.json"
        },
        {
          "slug": "acp-vs-ap2-vs-x402",
          "title": "ACP vs. AP2 vs. x402: Which Agent Payment Rail Should You Implement?",
          "description": "A decision framework for choosing between ACP, AP2, and x402 (plus the self-hosted 402 gate) — sorted by who your buyer actually is, what you are selling, and what is live versus waitlisted today.",
          "kind": "sub",
          "order": 3,
          "cluster": "selling-to-agents",
          "target_query": "ACP vs AP2 vs x402 for agent payments",
          "secondary_queries": [
            "which agent payment protocol should I use",
            "ACP vs AP2",
            "x402 vs ACP",
            "how to choose an agent payment rail"
          ],
          "tags": [
            "payments",
            "x402",
            "acp",
            "ap2",
            "agents",
            "monetization",
            "402"
          ],
          "published": "2026-07-30",
          "updated": "2026-07-30",
          "words": 1603,
          "takeaways": [
            "ACP and AP2 solve a different problem than x402 and the self-hosted 402 gate — the first pair authorizes an agent to spend a human's money at checkout over fiat rails; the second pair gates content or API access and settles a payment (crypto or fiat) directly against the request. Picking between them starts with naming which problem you actually have, not comparing feature tables.",
            "The single question that sorts almost every case: is the buyer a wallet-holding agent spending its own funds, or a consumer-facing agent spending a human's money with the human's consent? The first buyer fits x402 or a self-hosted 402-plus-key gate; the second fits ACP and/or AP2.",
            "These rails are not mutually exclusive. A seller with more than one product line can run a 402 gate or x402 for machine-to-machine content/API access on one line, and separately accept ACP- or AP2-authorized checkout for a consumer product a human's agent buys on their behalf — as two front doors to two different buyers, not a migration from one to the other.",
            "As of 22 July 2026, x402 and ACP are both live and adoptable today (x402 via the Linux Foundation's x402 Foundation; ACP powering OpenAI Instant Checkout); AP2 is announced and has a wide partner list but no independently confirmed stable version number; Cloudflare's Monetization Gateway, which would let a Cloudflare-fronted site accept x402 without building the gate itself, is still waitlist-stage.",
            "ChangeGamer's own answer, stated exactly as it stands: the self-hosted 402-plus-Bearer-key rail is live in production; the native x402 endpoint is scaffolded but dormant, answering `503 x402_not_configured` because no on-chain settlement variables are set; ACP and AP2 are not implemented here at all, because this site has no consumer checkout for an agent to complete on someone else's behalf."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/agentic-payment-protocols",
            "https://changegamer.ai/resources/agent-wallets-x402",
            "https://changegamer.ai/resources/selling-to-agents",
            "https://changegamer.ai/resources/paying-for-access-402"
          ],
          "html": "https://changegamer.ai/articles/acp-vs-ap2-vs-x402",
          "markdown": "https://changegamer.ai/articles/acp-vs-ap2-vs-x402.md",
          "json": "https://changegamer.ai/api/articles/acp-vs-ap2-vs-x402.json"
        },
        {
          "slug": "accepting-x402-payments",
          "title": "How to Accept x402 Stablecoin Payments: A Seller Implementation Guide",
          "description": "A build guide for sellers who have already decided x402 is the right rail: the 402 response shape, the wallet/facilitator/network choices, the verify-then-settle retry flow, exact vs. upto pricing, and how to ship it dormant until you are ready to go live.",
          "kind": "sub",
          "order": 4,
          "cluster": "selling-to-agents",
          "target_query": "how to accept x402 stablecoin payments",
          "secondary_queries": [
            "how to implement x402 payments",
            "x402 accepts array PaymentRequirements",
            "x402 facilitator verify settle flow",
            "x402 exact vs upto scheme"
          ],
          "tags": [
            "payments",
            "x402",
            "agents",
            "monetization",
            "402",
            "stablecoins"
          ],
          "published": "2026-07-31",
          "updated": "2026-08-19",
          "words": 1616,
          "takeaways": [
            "An x402 seller endpoint answers `402` with an `accepts` array of PaymentRequirements objects — scheme, network, maxAmountRequired, payTo, asset, resource, and a maxTimeoutSeconds — not a single price line; a client picks an entry it can satisfy and retries.",
            "Before writing any settlement code, a seller has to make four decisions: a wallet address to receive funds (`payTo`), a facilitator to verify and settle on its behalf, a network/asset pair (typically USDC on an EVM chain such as Base), and a price expressed in the asset's atomic units, not decimal dollars.",
            "The retry flow is a two-call round trip to the facilitator: the server sends the client's base64-encoded `X-PAYMENT` header to the facilitator's `/verify` endpoint, and only if that succeeds does it call `/settle`; a `200` with the resource body and an `X-PAYMENT-RESPONSE` settlement receipt follows only after both calls succeed.",
            "x402 defines two pricing schemes: `exact` authorizes a fixed amount upfront, while `upto` authorizes a ceiling and charges actual usage — the shape Apify uses for variable-cost Actor runs. ChangeGamer's own endpoint implements only `exact`; it does not support `upto`.",
            "Discovery is not a separate step: the x402 Bazaar, Coinbase's discovery catalog, auto-lists a seller's endpoint the first time its facilitator settles a real payment for it. There is no listing form to fill out.",
            "Shipping the endpoint dormant — hard-failing closed until every operator setting is in place — is a reusable pattern for building x402 support ahead of choosing a wallet, facilitator, or price, without ever risking a malformed payment requirement or a misdirected payout."
          ],
          "faq_count": 5,
          "resources": [
            "https://changegamer.ai/resources/agentic-payment-protocols",
            "https://changegamer.ai/resources/agent-wallets-x402",
            "https://changegamer.ai/resources/selling-to-agents",
            "https://changegamer.ai/resources/paying-for-access-402"
          ],
          "html": "https://changegamer.ai/articles/accepting-x402-payments",
          "markdown": "https://changegamer.ai/articles/accepting-x402-payments.md",
          "json": "https://changegamer.ai/api/articles/accepting-x402-payments.json"
        },
        {
          "slug": "api-key-issuance-for-agents",
          "title": "Issuing API Keys to AI Agents Automatically: A Build Guide",
          "description": "How to design a system that mints and delivers API keys to agent and software buyers with minimal human friction: trigger models, storage, delivery, key format, tiering, rotation and revocation — illustrated with ChangeGamer's own Stripe-webhook mechanism.",
          "kind": "sub",
          "order": 5,
          "cluster": "selling-to-agents",
          "target_query": "issuing API keys to AI agents automatically",
          "secondary_queries": [
            "automatic API key provisioning for AI agents",
            "payment-triggered API key minting",
            "how to deliver API keys to software buyers without a human",
            "revoking API keys automatically on cancellation"
          ],
          "tags": [
            "api-keys",
            "agents",
            "automation",
            "payments",
            "provisioning",
            "monetization"
          ],
          "published": "2026-07-31",
          "updated": "2026-07-31",
          "words": 1626,
          "takeaways": [
            "Three trigger models exist for minting a key — manual approval, instant self-serve on signup, and payment-confirmed auto-mint — and only the third removes a human from the loop after checkout, which is the shape an agent buyer needs.",
            "A minted key needs at least 128 bits of entropy from a cryptographic random source; ChangeGamer mints 160 bits (20 bytes from `crypto.getRandomValues`) formatted as `cg_` plus 40 hex characters.",
            "Delivery for a machine buyer should be a pollable endpoint an agent can `GET` and parse as JSON, not an inbox a script cannot read — ChangeGamer's webhook writes the key to KV on payment confirmation, and a client polls `/key?session_id=` until it returns 200 instead of 404.",
            "Storing keys as plaintext values in a key-value store keyed by the token itself is a real, working pattern — that is what ChangeGamer does — but it is a tradeoff against hashing at rest, and worth naming as one rather than presenting as best practice.",
            "Automatic revocation needs a second webhook, not just the minting one: ChangeGamer maps each subscription id to its token at mint time so a `customer.subscription.deleted` event can delete the token without any operator action at churn time.",
            "Payment-confirmed auto-mint still is not a keyless, fully agent-autonomous flow — it collapses the human step to one hosted checkout page, once, not to zero."
          ],
          "faq_count": 5,
          "resources": [
            "https://changegamer.ai/resources/paying-for-access-402",
            "https://changegamer.ai/resources/access-and-pricing",
            "https://changegamer.ai/resources/selling-to-agents",
            "https://changegamer.ai/resources/agent-identity-authentication",
            "https://changegamer.ai/resources/mcp-server-authentication",
            "https://changegamer.ai/resources/agent-spend-controls"
          ],
          "html": "https://changegamer.ai/articles/api-key-issuance-for-agents",
          "markdown": "https://changegamer.ai/articles/api-key-issuance-for-agents.md",
          "json": "https://changegamer.ai/api/articles/api-key-issuance-for-agents.json"
        },
        {
          "slug": "pricing-tiers-for-machine-buyers",
          "title": "Pricing Tiers for API and Corpus Access: What Actually Varies Between Them",
          "description": "The axes that actually distinguish one pricing tier from another for a machine buyer — rate limits, content scope, deliverables and license grant — and how ChangeGamer structures its own four tiers around deliverable and license, not gated content.",
          "kind": "sub",
          "order": 6,
          "cluster": "selling-to-agents",
          "target_query": "pricing tiers for API and corpus access",
          "secondary_queries": [
            "how to structure API pricing tiers for agents",
            "corpus license tiers for AI training",
            "tiered API access for machine buyers",
            "what should differ between pricing tiers"
          ],
          "tags": [
            "pricing",
            "tiers",
            "monetization",
            "licensing",
            "agents",
            "api-keys"
          ],
          "published": "2026-08-02",
          "updated": "2026-08-02",
          "words": 1599,
          "takeaways": [
            "A pricing tier for a machine buyer can differ on five axes — rate limit, content/corpus scope, SLA, license grant, and deliverable timing — and a seller does not have to vary all five to have a coherent tier ladder; picking which axes actually move is a design decision, not a default.",
            "ChangeGamer's own four paid tiers (starter, corpus, enterprise, corpus_annual) all unlock the identical premium resource set today — they differ in deliverable (key only, vs. key plus full corpus file) and license grant (internal AI-use vs. added commercial embedding and internal redistribution), not in gated content or rate limit.",
            "Two tiers can share the same access rank while differing in price and billing cadence: `corpus` and `corpus_annual` both rank 2 in ChangeGamer's `TIER_RANK` table — one-time vs. annual is a renewal-and-deliverable difference, not a content-access difference.",
            "A fail-safe tier resolver should default down, never up: ChangeGamer's `resolveTier()` and `tierRank()` treat any unrecognized, absent, or malformed tier value as the lowest tier, so a bug in tier assignment can under-grant access but never over-grant it.",
            "License grant is a legitimate axis to gate on even when content access is not: ChangeGamer's Corpus tier permits internal AI training, indexing, and bulk model-context use, while Enterprise adds commercial embedding and internal cross-org distribution of derived datasets — neither permits public raw-corpus redistribution or resale sublicensing."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/access-and-pricing",
            "https://changegamer.ai/resources/paying-for-access-402",
            "https://changegamer.ai/resources/agent-spend-controls"
          ],
          "html": "https://changegamer.ai/articles/pricing-tiers-for-machine-buyers",
          "markdown": "https://changegamer.ai/articles/pricing-tiers-for-machine-buyers.md",
          "json": "https://changegamer.ai/api/articles/pricing-tiers-for-machine-buyers.json"
        },
        {
          "slug": "agent-spend-limits-and-trust",
          "title": "Agent Spend Limits and Trust: What a Seller Should Verify Before Granting Access",
          "description": "The seller-side counterpart to agent spend controls — how an API operator reads an inbound agent's spend ceiling before granting access, which payment protocols actually prove that ceiling, how to revoke access, and what \"trust\" operationally means for a seller when no portable agent-reputation standard exists yet.",
          "kind": "sub",
          "order": 7,
          "cluster": "selling-to-agents",
          "target_query": "how a seller verifies an AI agent's spend limit before granting access",
          "secondary_queries": [
            "seller-side spend limits for AI agent buyers",
            "how to trust an AI agent's payment authorization",
            "revoking API access from a misbehaving agent",
            "does agent reputation or trust scoring exist"
          ],
          "tags": [
            "spend-controls",
            "trust",
            "agents",
            "payments",
            "x402",
            "revocation",
            "identity",
            "fraud"
          ],
          "published": "2026-08-03",
          "updated": "2026-08-03",
          "words": 1760,
          "takeaways": [
            "A bare Bearer API key tells a seller nothing about what the agent behind it is permitted to spend — x402's `upto` scheme, AP2's Intent Mandate, and ACP's Shared Payment Token each carry a cryptographically signed ceiling the seller can check before granting elevated access, which a static key cannot.",
            "Card-network agent tokens give a seller the cleanest kill switch available today: both Visa and Mastercard support revoking an agent's tokenized credential independently of the user's underlying card, so a seller (or the buyer's bank) can shut off one misbehaving agent without disrupting the human it acts for.",
            "Verified identity and a bounded, revocable payment ceiling are the two things a seller can actually check today — no portable agent-reputation or trust-score standard exists in the corpus as of August 2026, so \"trust\" for a seller currently means bounding the blast radius of an unknown counterparty, not scoring its history.",
            "Identity and authorization are separate checks a seller has to run independently: OAuth 2.1 for a remote MCP server proves a caller holds a validly issued, correctly audience-bound token, while a signed payment mandate proves a spend ceiling — neither one substitutes for the other.",
            "ChangeGamer's own revocation path (a Stripe subscription-cancellation webhook that deletes the token) is a working seller-side kill switch, but its worker has no per-key rate limit today — a real gap for a seller trying to bound how fast a single valid credential can be hit by a looping agent."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/agent-spend-controls",
            "https://changegamer.ai/resources/agentic-payment-protocols",
            "https://changegamer.ai/resources/agent-wallets-x402",
            "https://changegamer.ai/resources/agent-identity-authentication",
            "https://changegamer.ai/resources/mcp-server-authentication",
            "https://changegamer.ai/resources/agentic-security-checklist"
          ],
          "html": "https://changegamer.ai/articles/agent-spend-limits-and-trust",
          "markdown": "https://changegamer.ai/articles/agent-spend-limits-and-trust.md",
          "json": "https://changegamer.ai/api/articles/agent-spend-limits-and-trust.json"
        },
        {
          "slug": "refunds-and-disputes-with-agent-buyers",
          "title": "Refunds and Disputes with Agent Buyers: What a Seller Actually Does",
          "description": "What happens on the seller side when an autonomous agent's purchase needs to be reversed or is disputed — API-key refund mechanics, why x402 settlement cannot be undone, what card-token revocation does and does not prove, and what to log before you reverse anything.",
          "kind": "sub",
          "order": 8,
          "cluster": "selling-to-agents",
          "target_query": "how sellers handle refunds and disputes from AI agent buyers",
          "secondary_queries": [
            "refunds for automated agent purchases",
            "can an x402 payment be reversed",
            "disputing a purchase an AI agent made",
            "chargeback on an AI agent card token"
          ],
          "tags": [
            "refunds",
            "disputes",
            "chargebacks",
            "payments",
            "x402",
            "agents",
            "monetization"
          ],
          "published": "2026-08-03",
          "updated": "2026-08-03",
          "words": 1508,
          "takeaways": [
            "A one-time digital purchase and a subscription behave differently under EU withdrawal rules once delivery has happened: ChangeGamer's own tiers state that the 14-day right of withdrawal lapses on delivery of the digital deliverable, so a refund is realistically only available if the key or corpus file was never actually delivered — not because the buyer changed its mind after receiving it.",
            "Cancelling ChangeGamer's annual Corpus Updates subscription through the Stripe customer portal stops future renewals; it does not, by itself, refund the period already paid for — a refund on the current period is only offered if no corpus file was delivered during it.",
            "A settled x402 stablecoin payment has no documented reversal mechanism in this corpus: Apify's deposit-and-refund pattern for its `upto` scheme returns unused funds before final settlement on a variable-cost run, which is a different thing from undoing a payment that has already settled on-chain.",
            "Visa and Mastercard both document revoking an agent's tokenized card credential — a seller- or issuer-triggered kill switch — but neither the corpus nor a source verified this session documents that ordinary cardholder chargeback rights literally apply to a transaction made through an agent token; treat that continuity as a reasonable inference from normal card-rail behavior, not a confirmed policy.",
            "AP2 Intent/Cart/Payment Mandates and ACP Shared Payment Tokens prove that a purchase was authorized up to a signed ceiling at the moment it was made — neither protocol's documentation in this corpus describes a real dispute case or an issuer liability rule for what happens when a human principal later claims their agent exceeded that authorization.",
            "A seller's dispute runbook should separate three different questions before reversing anything: was the deliverable actually sent, was the payment actually settled or only authorized, and does the authorization on file (mandate, token, or subscription record) actually cover what was charged."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/access-and-pricing",
            "https://changegamer.ai/resources/agentic-payment-protocols",
            "https://changegamer.ai/resources/agent-wallets-x402",
            "https://changegamer.ai/resources/agent-spend-controls",
            "https://changegamer.ai/resources/selling-to-agents",
            "https://changegamer.ai/resources/paying-for-access-402"
          ],
          "html": "https://changegamer.ai/articles/refunds-and-disputes-with-agent-buyers",
          "markdown": "https://changegamer.ai/articles/refunds-and-disputes-with-agent-buyers.md",
          "json": "https://changegamer.ai/api/articles/refunds-and-disputes-with-agent-buyers.json"
        },
        {
          "slug": "packaging-a-corpus-as-a-product",
          "title": "Packaging a Corpus as a Product: Format, Schema, Versioning and Delivery",
          "description": "The packaging decisions behind selling a content corpus as a dataset product — export format, the free-sample/gated-full split, a per-record metadata schema, a corpus version number, and which of three delivery mechanisms to use — grounded in ChangeGamer's own three real export formats.",
          "kind": "sub",
          "order": 9,
          "cluster": "selling-to-agents",
          "target_query": "how to package content as a dataset product",
          "secondary_queries": [
            "corpus export format for RAG and fine-tuning",
            "versioning a dataset product",
            "how to deliver a licensed content corpus to buyers",
            "NDJSON vs full-text dump for a dataset export"
          ],
          "tags": [
            "corpus",
            "packaging",
            "ndjson",
            "versioning",
            "delivery",
            "monetization",
            "agents"
          ],
          "published": "2026-08-04",
          "updated": "2026-08-04",
          "words": 1622,
          "takeaways": [
            "A dataset product needs at least two export shapes, not one: a line-delimited record format for RAG/fine-tuning ingestion (NDJSON) and, if the buyer is meant to fine-tune directly, a chat-message format matching a training API's expected schema — a single flat text dump satisfies neither use case well.",
            "The honest way to run a free sample next to a gated full export is field-level asymmetry, not a shorter file: ChangeGamer's free `/api/corpus.jsonl` nulls out premium record bodies and adds an `access` pointer object only to those null records, while the gated `/api/corpus.full.jsonl` always populates `text` and never carries an `access` field at all — the sample and the product are structurally different files, not the same file truncated.",
            "A corpus version number and an MCP server version number answer different questions and should not be kept in lockstep: one tracks whether the content/schema changed, the other tracks the server manifest, and forcing them to match creates false-positive re-pull signals for a buyer who only cares about the first.",
            "A per-record JSON Schema is what lets a buyer validate an export programmatically instead of reverse-engineering field shapes from a sample — ChangeGamer publishes one at `/api/corpus.schema.json`, derived live from the same source data it describes so the two cannot drift apart.",
            "Pull endpoint, emailed file, and MCP tool are three delivery mechanisms with genuinely different latency and trust profiles, and a dataset seller should offer more than one rather than picking whichever is easiest to build first."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/access-and-pricing"
          ],
          "html": "https://changegamer.ai/articles/packaging-a-corpus-as-a-product",
          "markdown": "https://changegamer.ai/articles/packaging-a-corpus-as-a-product.md",
          "json": "https://changegamer.ai/api/articles/packaging-a-corpus-as-a-product.json"
        },
        {
          "slug": "discoverability-for-paid-agent-apis",
          "title": "How Do AI Agents Discover Paid APIs? A Guide to Every Surface",
          "description": "How an AI agent finds out a paid API or resource exists before it ever reads a price: llms.txt, the JSON API index, MCP registries, incidental 402 discovery, x402 auto-listing, and what .well-known does and does not cover.",
          "kind": "sub",
          "order": 10,
          "cluster": "selling-to-agents",
          "target_query": "how do AI agents discover paid APIs",
          "secondary_queries": [
            "how does an agent find a paid API",
            "AI agent discovery surfaces for paid content",
            "llms.txt vs MCP registry vs x402 discovery",
            "how do agents find out an endpoint is payable"
          ],
          "tags": [
            "discovery",
            "llms.txt",
            "mcp",
            "x402",
            "agents",
            "json-api"
          ],
          "published": "2026-08-04",
          "updated": "2026-08-04",
          "words": 1576,
          "takeaways": [
            "An agent discovers a paid surface in one of two modes that call for different designs: proactive discovery, where it is specifically shopping for a capability and reads an index before touching anything gated, and reactive discovery, where it stumbles into a 402 mid-task and learns the paid surface exists only at that moment.",
            "Four proactive surfaces matter as of August 2026: a curated `/llms.txt` index, a JSON API index such as `/api/resources.json`, listing in an MCP registry or aggregator, and automatic inclusion in the x402 Bazaar the moment a first payment settles — none of these require the same investment, and a seller can be found by some without building all four.",
            "There is no established `.well-known` convention for discovering prices or offers. The corpus confirms `.well-known` conventions for identity and auth discovery only — `/.well-known/agent-card.json` for A2A agent identity, `/.well-known/oauth-protected-resource` and `/.well-known/oauth-authorization-server` for MCP OAuth — none of it is about what something costs.",
            "For an agent with a fixed, single-fetch discovery budget, an `/llms.txt` or JSON index fetch outranks an MCP connection attempt: it costs one HTTP GET with no handshake, no auth negotiation, and no persistent session, and it can point onward to everything else in the same response.",
            "A seller with no MCP server and no x402 activity is still discoverable through llms.txt and a JSON API index alone — it is a weaker footprint, reaching only agents that already crawl or fetch directly, but it is not a non-starter, and it is the cheapest surface to stand up first.",
            "The x402 Bazaar inverts the usual order of marketing and revenue: a seller does not submit a listing, the facilitator auto-catalogs the endpoint the first time it settles a payment for it, so the first sale is the listing event, not the result of one."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/json-api",
            "https://changegamer.ai/resources/llms-txt-explained",
            "https://changegamer.ai/resources/mcp-server-discovery",
            "https://changegamer.ai/resources/agentic-payment-protocols",
            "https://changegamer.ai/resources/agent-wallets-x402",
            "https://changegamer.ai/resources/paying-for-access-402",
            "https://changegamer.ai/resources/mcp-vs-a2a",
            "https://changegamer.ai/resources/mcp-server-authentication"
          ],
          "html": "https://changegamer.ai/articles/discoverability-for-paid-agent-apis",
          "markdown": "https://changegamer.ai/articles/discoverability-for-paid-agent-apis.md",
          "json": "https://changegamer.ai/api/articles/discoverability-for-paid-agent-apis.json"
        },
        {
          "slug": "fraud-and-abuse-from-agent-traffic",
          "title": "Fraud and Abuse from AI Agent Traffic: What a Seller Should Detect",
          "description": "How a seller of APIs, content, or tools to AI agents spots and mitigates abuse once access is already granted — key sharing, over-scope scraping, spend-ceiling circumvention, spoofed identity, and rate-limit evasion patterns specific to autonomous agents.",
          "kind": "sub",
          "order": 11,
          "cluster": "selling-to-agents",
          "target_query": "preventing abuse from AI agent traffic",
          "secondary_queries": [
            "detecting API key sharing by AI agents",
            "AI agent scraping beyond licensed tier",
            "spoofed AI agent identity",
            "rate limit evasion by autonomous agents",
            "refund abuse patterns from AI agent buyers"
          ],
          "tags": [
            "fraud",
            "abuse",
            "security",
            "agents",
            "rate-limits",
            "identity",
            "x402",
            "monetization"
          ],
          "published": "2026-08-05",
          "updated": "2026-08-05",
          "words": 1602,
          "takeaways": [
            "A shared or leaked API key looks identical to legitimate use at the credential layer — the [agentic security checklist](/resources/agentic-security-checklist) recommendation that applies directly here is per-identifier logging with a unique trace id, which lets a seller see the same key called from patterns no single agent produces, rather than trying to detect sharing from the key itself.",
            "Web Bot Auth (RFC 9421 HTTP Message Signatures) exists specifically because a User-Agent string and IP range can be spoofed by anyone — as of July 1, 2026 Cloudflare folds signed agents into its Verified Bots classification, so a seller checking for a valid signature over an unauthenticated identity claim closes the cheapest spoofing vector first.",
            "A settled x402 payment is not a reusable credential: the verify-then-settle round trip against a facilitator checks a specific signed authorization once, so a captured payment header replayed against a second request has no documented path to a second successful settlement in this corpus.",
            "A total spend cap does not catch a fast loop in time — the practitioner pattern named in [agent spend controls](/resources/agent-spend-controls) is rate-of-spend (velocity) monitoring at a fixed sampling interval, and the same logic applies to a seller watching request volume from one key rather than a buyer watching wallet balance.",
            "Repeated refund or dispute claims tied to the same underlying identity — the same wallet, the same mandate signer, the same agent credential — across multiple purchases is a pattern-detection problem for a seller, separate from processing any single refund correctly.",
            "None of the payment or identity protocols in this corpus (x402, AP2, ACP, card-network agent tokens) publish a fraud-scoring or anomaly-detection feature as of August 2026 — a seller has to build velocity and pattern detection on its own request and payment logs, not rely on the rail to flag abuse for it."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/agentic-security-checklist",
            "https://changegamer.ai/resources/agent-identity-authentication",
            "https://changegamer.ai/resources/handling-rate-limits-and-retries",
            "https://changegamer.ai/resources/agent-spend-controls",
            "https://changegamer.ai/resources/web-bot-auth",
            "https://changegamer.ai/resources/agentic-payment-protocols",
            "https://changegamer.ai/resources/agent-wallets-x402",
            "https://changegamer.ai/resources/access-and-pricing"
          ],
          "html": "https://changegamer.ai/articles/fraud-and-abuse-from-agent-traffic",
          "markdown": "https://changegamer.ai/articles/fraud-and-abuse-from-agent-traffic.md",
          "json": "https://changegamer.ai/api/articles/fraud-and-abuse-from-agent-traffic.json"
        },
        {
          "slug": "measuring-agent-revenue",
          "title": "Measuring Revenue from AI Agent Traffic: Beyond the Traffic Log",
          "description": "The revenue-layer fields and queries a seller adds on top of a general traffic log — authorized-vs-settled, revenue per rail, revenue per tier, and how to avoid double-counting a webhook retry as two sales.",
          "kind": "sub",
          "order": 12,
          "cluster": "selling-to-agents",
          "target_query": "measuring revenue from AI agent traffic",
          "secondary_queries": [
            "how to track revenue from AI agent purchases",
            "x402 settlement vs authorization for revenue reporting",
            "avoiding double counted revenue from Stripe webhook retries",
            "revenue per payment rail for agent sales"
          ],
          "tags": [
            "analytics",
            "revenue",
            "measurement",
            "x402",
            "payments",
            "agents",
            "monetization"
          ],
          "published": "2026-08-05",
          "updated": "2026-08-05",
          "words": 1636,
          "takeaways": [
            "A `payment_required` or `upgrade` row in a traffic log is a signal of interest, not revenue — revenue exists only once a payment is actually settled, which for the key rail means a webhook-triggered mint and for x402 means an `X-PAYMENT-RESPONSE` settlement receipt, not the initial 402 or the initial `X-PAYMENT` retry.",
            "A revenue log needs at least four fields a general traffic log does not carry: a unique settlement or session id, the rail used, the tier or price actually charged, and a settled/authorized status — without the id, a Stripe webhook retry gets counted as a second sale.",
            "On ChangeGamer today, only one of its three rails has any measured revenue at all: the Stripe key-sale rail is live, native x402 returns HTTP 503 and settles nothing, and the RSL crawl-license rate is declared but not collected — so a revenue query grouped by rail should show two rows at zero no matter what the underlying traffic log says.",
            "The RSL declared rate (US$0.05 per crawl) and the 402 JSON body's `price_usd` field (also \"0.05\") are different numbers in different number spaces that happen to share a digit — a revenue query that sums them as one figure is wrong by construction, not just imprecise.",
            "The `upgrade` outcome — a valid key of insufficient tier hitting the paywall again — is the cleanest observable repeat-interest signal in the log, and counting it over time is a legitimate starting point for a revenue-over-time view even before enough purchases exist to compute anything resembling lifetime value."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/access-and-pricing",
            "https://changegamer.ai/resources/paying-for-access-402",
            "https://changegamer.ai/resources/agent-wallets-x402",
            "https://changegamer.ai/resources/selling-to-agents"
          ],
          "html": "https://changegamer.ai/articles/measuring-agent-revenue",
          "markdown": "https://changegamer.ai/articles/measuring-agent-revenue.md",
          "json": "https://changegamer.ai/api/articles/measuring-agent-revenue.json"
        }
      ]
    },
    {
      "id": "mcp-in-practice",
      "title": "MCP in practice",
      "description": "How to build, ship and run an MCP server in production — transport, auth, tool design, versioning, testing, distribution, observability, cost and failure modes.",
      "target_query": "how to build and run an MCP server in production",
      "status": "complete",
      "started": "2026-08-06",
      "target_subs": 12,
      "published_subs": 12,
      "pillar": {
        "slug": "mcp-server-in-production",
        "title": "MCP Server in Production: How to Build, Ship and Run One",
        "description": "The operator playbook for taking an MCP server past the quickstart: transport choice, OAuth 2.1 auth, tool design, versioning against a moving spec, testing across clients, distribution, observability, cost and the failure modes that show up once real clients connect.",
        "kind": "pillar",
        "order": 0,
        "cluster": "mcp-in-practice",
        "target_query": "how to build and run an MCP server in production",
        "secondary_queries": [
          "MCP server production checklist",
          "stdio vs streamable HTTP MCP transport",
          "OAuth 2.1 PKCE for MCP servers",
          "testing MCP servers across different clients",
          "MCP server observability and cost"
        ],
        "tags": [
          "mcp",
          "agents",
          "protocols",
          "production",
          "oauth",
          "observability",
          "tool-calling"
        ],
        "published": "2026-08-06",
        "updated": "2026-08-06",
        "words": 5876,
        "takeaways": [
          "A working demo and a production MCP server differ in exactly seven places: transport, auth, tool design, spec versioning, cross-client testing, distribution, and the observability/cost/failure-mode instrumentation around all of it. Skipping any one of them is what turns into an incident once real clients connect.",
          "Transport is a deployment decision, not a preference: stdio for a local, single-user tool with zero network exposure; Streamable HTTP for anything shared, remote or multi-tenant. As of the 2026-07-28 spec revision, Streamable HTTP is also stateless by default — no session handshake, no `Mcp-Session-Id` — so any state your server needs has to be an explicit handle the model passes back as a tool argument.",
          "Remote servers must speak OAuth 2.1 with mandatory PKCE (S256 only) and must never forward a client-presented Bearer token to an upstream API — that is a confused-deputy vulnerability the spec explicitly forbids, not a style preference.",
          "A tool description is attacker-controlled surface, not documentation. It ships to the model as trusted-looking text, which is exactly why a malicious or compromised server can use it to inject instructions — audit every description before connecting to a third-party server, and treat your own descriptions as something a red-teamer will read.",
          "The spec is a moving target: the MCP 2026-07-28 revision — its largest since launch — shipped final, on schedule, on that date, deprecating Sampling, Roots and Logging and removing the session handshake entirely. Anything you read about MCP transports or auth, including in this article, needs a date attached and should be reverified against modelcontextprotocol.io before you build against it."
        ],
        "faq_count": 5,
        "resources": [
          "https://changegamer.ai/resources/mcp-server-discovery",
          "https://changegamer.ai/resources/mcp-primitives",
          "https://changegamer.ai/resources/building-mcp-servers",
          "https://changegamer.ai/resources/mcp-server-authentication",
          "https://changegamer.ai/resources/mcp-vs-a2a",
          "https://changegamer.ai/resources/mcp-vs-function-calling",
          "https://changegamer.ai/resources/mcp-apps-explained",
          "https://changegamer.ai/resources/mcp-2026-spec-revision",
          "https://changegamer.ai/resources/agentic-security-checklist",
          "https://changegamer.ai/resources/agent-observability",
          "https://changegamer.ai/resources/durable-execution-for-agents",
          "https://changegamer.ai/resources/testing-ai-agents",
          "https://changegamer.ai/resources/reliable-tool-calling",
          "https://changegamer.ai/resources/agent-cost-latency-optimization",
          "https://changegamer.ai/resources/webmcp"
        ],
        "html": "https://changegamer.ai/articles/mcp-server-in-production",
        "markdown": "https://changegamer.ai/articles/mcp-server-in-production.md",
        "json": "https://changegamer.ai/api/articles/mcp-server-in-production.json"
      },
      "subs": [
        {
          "slug": "mcp-stdio-vs-streamable-http",
          "title": "stdio vs. Streamable HTTP for MCP Servers: A Decision Framework",
          "description": "Which MCP transport to build against and why: the single-client-vs-shared decision rule, how state works without a session handshake under the 2026-07-28 spec, the auth-model switching cost, and what actually breaks migrating off HTTP+SSE.",
          "kind": "sub",
          "order": 1,
          "cluster": "mcp-in-practice",
          "target_query": "stdio vs Streamable HTTP for MCP servers",
          "secondary_queries": [
            "MCP session handle without Mcp-Session-Id",
            "migrating MCP server from HTTP+SSE to Streamable HTTP",
            "does stdio MCP server need OAuth"
          ],
          "tags": [
            "mcp",
            "agents",
            "protocols",
            "transport",
            "oauth",
            "production"
          ],
          "published": "2026-08-06",
          "updated": "2026-08-06",
          "words": 1628,
          "takeaways": [
            "Pick transport by counting clients and machines, not by feature preference: stdio if the server and its one client always run on the same machine, Streamable HTTP the moment a second user, a second client, or a remote deployment enters the picture.",
            "As of the 2026-07-28 spec revision, Streamable HTTP dropped the `initialize`/`initialized` handshake and the `Mcp-Session-Id` header entirely — any request can land on any server instance, and a server that needs cross-call state (a basket, a wizard step) has to mint its own opaque handle and have the model pass it back as an ordinary tool argument on the next call.",
            "Moving a server from stdio to Streamable HTTP is not a drop-in swap of the transport binding — it is also an auth-model change, from \"no OAuth surface, credentials via environment variables\" to \"OAuth 2.1 required if the server authenticates at all,\" and it is legitimate to land on the unauthenticated end of that range for a public, read-only server.",
            "Migrating an existing server off the deprecated HTTP+SSE transport means re-deriving your auth model, not just re-pointing a client library — HTTP+SSE and Streamable HTTP have different auth surfaces, and any code that assumed a stable session ID will misbehave under the stateless 2026-07-28 model unless you replace that assumption with an explicit handle.",
            "WebMCP is not a third MCP transport and does not belong in this decision — it is a same-tab, no-network-hop browser API for a page to expose tools to an in-browser agent, explicitly distinct from MCP's client-server model."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/building-mcp-servers",
            "https://changegamer.ai/resources/mcp-server-authentication",
            "https://changegamer.ai/resources/mcp-2026-spec-revision",
            "https://changegamer.ai/resources/webmcp"
          ],
          "html": "https://changegamer.ai/articles/mcp-stdio-vs-streamable-http",
          "markdown": "https://changegamer.ai/articles/mcp-stdio-vs-streamable-http.md",
          "json": "https://changegamer.ai/api/articles/mcp-stdio-vs-streamable-http.json"
        },
        {
          "slug": "mcp-oauth-implementation",
          "title": "How to Implement OAuth 2.1 for an MCP Server",
          "description": "A wire-level implementation walkthrough for OAuth 2.1 on a remote MCP server: what the discovery documents actually contain, CIMD vs. Dynamic Client Registration in your server code, per-SEP detail from the 2026-07-28 hardening set, and token-validation mechanics.",
          "kind": "sub",
          "order": 2,
          "cluster": "mcp-in-practice",
          "target_query": "how to implement OAuth 2.1 for an MCP server",
          "secondary_queries": [
            "oauth-protected-resource metadata fields",
            "CIMD vs Dynamic Client Registration for MCP",
            "validating MCP OAuth token audience and issuer"
          ],
          "tags": [
            "mcp",
            "agents",
            "protocols",
            "oauth",
            "security",
            "production"
          ],
          "published": "2026-08-07",
          "updated": "2026-08-07",
          "words": 1548,
          "takeaways": [
            "The discovery chain is two JSON documents a client fetches before it ever authenticates: `/.well-known/oauth-protected-resource` (RFC 9728), which lists the authorization servers your server trusts, and `/.well-known/oauth-authorization-server` (RFC 8414) on that AS, which returns `authorization_endpoint`, `token_endpoint` and `registration_endpoint` — get either response wrong and no client can complete the flow.",
            "A Client ID Metadata Document (CIMD) replaces server-side client registration with a fetch: the `client_id` your server receives is itself an HTTPS URL, and your authorization server resolves it by fetching that URL for a JSON document describing the client, instead of looking up a row a Dynamic Client Registration call previously wrote to a database.",
            "Of the six 2026-07-28 authorization-hardening SEPs, three change what a server must actively validate or emit: SEP-2468 requires checking the `iss` claim against RFC 9207, SEP-837 adds an `application_type` field your registration handler has to read, and SEP-2350 requires accepting incremental scope requests during step-up re-authorization instead of forcing a full re-grant.",
            "Token validation on every request is three checks, not one: audience (does the `aud` claim match this server's URL), issuer (does `iss` match the authorization server your Protected Resource Metadata actually names), and signature/validity (via the AS's published keys or an introspection call) — a token that passes only the first check is still forgeable or replayable.",
            "A rejected request should look like a signpost, not a dead end: an HTTP 401 whose `WWW-Authenticate` header points back at your Protected Resource Metadata document, so a compliant client can restart discovery instead of failing silently."
          ],
          "faq_count": 3,
          "resources": [
            "https://changegamer.ai/resources/mcp-server-authentication",
            "https://changegamer.ai/resources/mcp-2026-spec-revision",
            "https://changegamer.ai/resources/agentic-security-checklist",
            "https://changegamer.ai/resources/building-mcp-servers"
          ],
          "html": "https://changegamer.ai/articles/mcp-oauth-implementation",
          "markdown": "https://changegamer.ai/articles/mcp-oauth-implementation.md",
          "json": "https://changegamer.ai/api/articles/mcp-oauth-implementation.json"
        },
        {
          "slug": "mcp-tool-description-injection",
          "title": "Defending MCP Clients Against Tool Description and Output Injection",
          "description": "Two distinct MCP injection surfaces — a tool description at connect-time and a tool's return value at call-time — and the client-side architectural patterns (Dual LLM, Action-Selector, Context-Minimization) that contain each one.",
          "kind": "sub",
          "order": 3,
          "cluster": "mcp-in-practice",
          "target_query": "MCP tool description injection and tool poisoning defense",
          "secondary_queries": [
            "MCP tool poisoning",
            "is MCP tool output trusted",
            "Dual LLM pattern for MCP tool calls",
            "MCP tool call result prompt injection"
          ],
          "tags": [
            "mcp",
            "agents",
            "security",
            "prompt-injection",
            "tool-calling",
            "architecture"
          ],
          "published": "2026-08-07",
          "updated": "2026-08-07",
          "words": 1545,
          "takeaways": [
            "MCP gives an attacker two separate injection surfaces, not one: a tool's description and schema at connect-time (does the tool's stated purpose lie or later change), and a tool's return value at call-time (does a normal, unmodified call return attacker-controlled content). Defending one does not defend the other.",
            "The call-time surface does not require a compromised or updated server — a search, fetch, or document-read tool that faithfully executes its stated purpose can still return content, from a source the server itself does not control, that carries embedded instructions on every single invocation.",
            "Of the six architectural prompt-injection patterns catalogued for agents generally, Dual LLM and Action-Selector map most directly onto an MCP client: the model that holds tool-call authority should never read a third-party tool's raw output directly, and a client that dynamically discovers tools from a remote server should still constrain what those tools can be composed into, not treat discovery as free-form capability grant.",
            "The agentic security checklist's guidance to \"validate that tool outputs conform to the expected schema and type before the model acts on them\" and to treat all tool responses as untrusted data applies to MCP tool-call results specifically, not just to web or RAG content — a `text` content block from an MCP `tools/call` response is exactly the kind of unstructured, attacker-reachable field that guidance is written for.",
            "This is a content-trust problem, not an authorization problem: OAuth 2.1 and scoped tokens govern who may call a tool, not whether that tool's output is safe for the calling model to read as instructions — see the OAuth mechanics in the companion article on MCP auth."
          ],
          "faq_count": 3,
          "resources": [
            "https://changegamer.ai/resources/prompt-injection-design-patterns",
            "https://changegamer.ai/resources/agentic-security-checklist",
            "https://changegamer.ai/resources/mcp-server-discovery"
          ],
          "html": "https://changegamer.ai/articles/mcp-tool-description-injection",
          "markdown": "https://changegamer.ai/articles/mcp-tool-description-injection.md",
          "json": "https://changegamer.ai/api/articles/mcp-tool-description-injection.json"
        },
        {
          "slug": "testing-mcp-servers-in-ci",
          "title": "How to Test an MCP Server in CI",
          "description": "The implementation mechanics below the three-layer test pyramid: what a mocked MCP transport actually replaces, what a Streamable HTTP cassette contains, a concrete CI job/trigger shape, and how to catch spec-version drift before it reaches production.",
          "kind": "sub",
          "order": 4,
          "cluster": "mcp-in-practice",
          "target_query": "how to test an MCP server",
          "secondary_queries": [
            "mocking the MCP transport in unit tests",
            "recording MCP tool call cassettes",
            "MCP server CI pipeline nightly smoke tests",
            "catching MCP spec drift with tests"
          ],
          "tags": [
            "mcp",
            "testing",
            "ci",
            "agents",
            "tool-calling"
          ],
          "published": "2026-08-09",
          "updated": "2026-08-09",
          "words": 1337,
          "takeaways": [
            "An MCP server's Layer 1 unit tests mock the transport, not the model — most servers don't call an LLM at all, so the seam you replace is the JSON-RPC channel your handlers sit behind, not an LLM client the way generic agent testing does.",
            "Cassette-style record/replay is confirmed to work for a Streamable HTTP MCP server, because every message on that transport is literally an HTTP POST to one endpoint; there is no confirmed equivalent for stdio's raw stdin/stdout exchange, so treat \"record once, replay in CI, scrub credentials\" as a pattern to adapt for stdio, not a library that already does it.",
            "Layer 3 live smoke tests belong on a separate CI job definition, not just a separate test file — a nightly or pre-release schedule with its own cost budget, distinct from the job that gates every push and pull request.",
            "An MCP SDK version bump is itself a legitimate reason to re-run the full pyramid, deliberately: a Layer 1 or Layer 2 test that asserts the negotiated `protocolVersion` explicitly is what turns a breaking version change into a caught test failure instead of a silent production break."
          ],
          "faq_count": 3,
          "resources": [
            "https://changegamer.ai/resources/testing-ai-agents",
            "https://changegamer.ai/resources/building-mcp-servers",
            "https://changegamer.ai/resources/reliable-tool-calling"
          ],
          "html": "https://changegamer.ai/articles/testing-mcp-servers-in-ci",
          "markdown": "https://changegamer.ai/articles/testing-mcp-servers-in-ci.md",
          "json": "https://changegamer.ai/api/articles/testing-mcp-servers-in-ci.json"
        },
        {
          "slug": "mcp-server-versioning-and-spec-migration",
          "title": "MCP Server Versioning and Spec Migration: An Operator Playbook",
          "description": "A migration runbook for MCP server operators: feature-detecting via capabilities instead of hard protocolVersion branching, a dual-version fleet rollout with rollback triggers, a compatibility shim for legacy clients still sending initialize, and a deprecation calendar built off the 12-month SEP-2577 floor.",
          "kind": "sub",
          "order": 5,
          "cluster": "mcp-in-practice",
          "target_query": "how to version an MCP server against a changing spec",
          "secondary_queries": [
            "MCP server migration runbook",
            "MCP protocolVersion feature detection",
            "legacy MCP client initialize handshake compatibility",
            "MCP spec deprecation window"
          ],
          "tags": [
            "mcp",
            "agents",
            "protocols",
            "versioning",
            "migration",
            "production"
          ],
          "published": "2026-08-11",
          "updated": "2026-08-11",
          "words": 1463,
          "takeaways": [
            "The 2026-07-28 MCP spec revision removed the initialize/initialized handshake entirely (SEP-2575) along with the Mcp-Session-Id header (SEP-2567); client capabilities, previously sent only during that handshake, now travel in a `_meta` field on every request instead. Any guide describing \"pinning protocolVersion during the initialize handshake\" is describing pre-2026-07-28 behavior, not the current mechanism.",
            "Feature-detect off declared capabilities, not off a hard-coded protocolVersion string comparison — a server or client that branches on an exact version string breaks the moment a new patch-level revision ships with the same capability set, while capability-based branching keeps working.",
            "A server fleet migrating across a spec revision should run old and new code side by side behind version-tagged, canaried traffic, with an explicit rollback trigger (a spike in malformed-request or protocolVersion-mismatch rates, not a fixed timer) rather than a single flag-day cutover.",
            "SEP-2577's 12-month deprecation floor is a concrete calendar item, not just a policy statement: Sampling, Roots and Logging were deprecated on 2026-07-28, so the earliest the spec permits their removal is 2027-07-28 — treat that date as a deadline to have migrated off them, not a date to start thinking about it.",
            "There is no published, spec-defined mechanism for how a post-2026-07-28 stateless server should respond to a legacy client that still opens with an initialize call — any compatibility shim for that case is an operator-built workaround, not a documented protocol feature, and should be tested against a real legacy client rather than assumed to work."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/mcp-2026-spec-revision",
            "https://changegamer.ai/resources/mcp-primitives"
          ],
          "html": "https://changegamer.ai/articles/mcp-server-versioning-and-spec-migration",
          "markdown": "https://changegamer.ai/articles/mcp-server-versioning-and-spec-migration.md",
          "json": "https://changegamer.ai/api/articles/mcp-server-versioning-and-spec-migration.json"
        },
        {
          "slug": "mcp-server-observability-opentelemetry",
          "title": "MCP Server Observability with OpenTelemetry: Spans, Metrics, and Trace Correlation",
          "description": "Instrumenting an MCP server past the pillar's baseline: what to put on a tool-call span beyond gen_ai.tool.name, what replaces the deprecated Logging primitive in practice, per-tool-name latency and error-rate metrics, and how a trace ID actually survives the agent-to-upstream-API hop.",
          "kind": "sub",
          "order": 6,
          "cluster": "mcp-in-practice",
          "target_query": "MCP server observability with OpenTelemetry",
          "secondary_queries": [
            "OpenTelemetry MCP tool call span attributes",
            "MCP server per-tool latency and error rate metrics",
            "MCP trace correlation across agent client server upstream API",
            "MCP logging primitive deprecated alternative"
          ],
          "tags": [
            "mcp",
            "observability",
            "opentelemetry",
            "tracing",
            "metrics",
            "agents",
            "production"
          ],
          "published": "2026-08-11",
          "updated": "2026-08-11",
          "words": 1683,
          "takeaways": [
            "A tool-call span on an MCP server should carry MCP-specific identifiers on top of the generic `gen_ai.tool.name` attribute — server name/version, transport (stdio vs. Streamable HTTP), the negotiated protocolVersion, and the request's JSON-RPC id — but as of August 2026 no confirmed joint MCP-OpenTelemetry semantic convention defines those attribute names; treat this as a practitioner-level naming convention you own, not a spec you are implementing.",
            "SEP-2577, final on 2026-07-28, marked the Logging primitive deprecated alongside Sampling and Roots — annotation-only, still functional, not eligible for removal before 2027-07-28. That deprecation is the trigger to route structured operational logs through your own OTel span events going forward rather than build anything new on Logging; that recommendation is this article's own guidance, not something the spec mandates as Logging's replacement.",
            "Per-tool-name p50/p95 latency and per-tool-name error rate, aggregated across calls into a dashboard rather than logged per-call, catch a single tool degrading inside a server whose overall request rate and average latency still look healthy — this is a metrics-layer concern distinct from both generic HTTP metrics and the pillar's per-call span logging.",
            "The MCP spec does not mandate trace-context propagation at all. Carrying one trace ID across the fourth hop — agent, to MCP client, to your MCP server, to whatever upstream API your server calls — is standard OpenTelemetry `traceparent` propagation applied by the operator across that hop, not a protocol guarantee every client or upstream honors."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/agent-observability",
            "https://changegamer.ai/resources/mcp-primitives"
          ],
          "html": "https://changegamer.ai/articles/mcp-server-observability-opentelemetry",
          "markdown": "https://changegamer.ai/articles/mcp-server-observability-opentelemetry.md",
          "json": "https://changegamer.ai/api/articles/mcp-server-observability-opentelemetry.json"
        },
        {
          "slug": "mcp-server-registry-publishing-playbook",
          "title": "How to Publish an MCP Server to the Official Registry",
          "description": "A step-by-step walkthrough of the mcp-publisher CLI and the server.json manifest for publishing an MCP server to registry.modelcontextprotocol.io, how to republish after a version bump, and how the registry relates to aggregators, marketplaces, and direct distribution.",
          "kind": "sub",
          "order": 7,
          "cluster": "mcp-in-practice",
          "target_query": "how to publish an MCP server to the official registry",
          "secondary_queries": [
            "server.json manifest fields for the MCP registry",
            "mcp-publisher CLI walkthrough",
            "updating a published MCP registry listing",
            "submitting an MCP server to PulseMCP Smithery Glama MCP.so"
          ],
          "tags": [
            "mcp",
            "registry",
            "publishing",
            "distribution",
            "agents",
            "production"
          ],
          "published": "2026-08-15",
          "updated": "2026-08-15",
          "words": 1214,
          "takeaways": [
            "Publishing an MCP server to the official registry runs through four mcp-publisher CLI steps — init, editing the generated server.json, mcp-publisher login github, and mcp-publisher publish — and none of them uploads the server package itself, which has to already exist on npm, PyPI, or another artifact registry first.",
            "A server.json manifest for the MCP registry states at minimum the server's name, version, transport type, and endpoint URL, validated against the schema at https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json; the schema defines further fields beyond those four, so consult it directly rather than assuming a field name this article has not stated.",
            "Updating a registry listing after a new release starts outside the registry entirely: the new package version has to reach npm, PyPI, or wherever it lives first, because the registry stores metadata only and never hosts the package itself.",
            "The official MCP registry remained in preview as of mid-2026, roughly a year after its September 2025 preview launch backed by Anthropic, GitHub, PulseMCP, and Microsoft.",
            "Community aggregators such as PulseMCP, Smithery, Glama, and MCP.so vary considerably in how rigorously they vet listings, so a server's presence on one is worth treating as a lead to investigate rather than an endorsement of its safety."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/mcp-server-discovery",
            "https://changegamer.ai/resources/building-mcp-servers"
          ],
          "html": "https://changegamer.ai/articles/mcp-server-registry-publishing-playbook",
          "markdown": "https://changegamer.ai/articles/mcp-server-registry-publishing-playbook.md",
          "json": "https://changegamer.ai/api/articles/mcp-server-registry-publishing-playbook.json"
        },
        {
          "slug": "mcp-server-cost-optimization",
          "title": "MCP Server Cost Optimization: Toolset Size, Caching Hints, and Fan-Out",
          "description": "How the token cost of an MCP server's tool list, the 2026-07-28 spec's ttlMs/cacheScope caching hints, fan-out from callers you do not control, and per-tool-name cost visibility each shape what a production MCP server actually costs to run.",
          "kind": "sub",
          "order": 8,
          "cluster": "mcp-in-practice",
          "target_query": "MCP server cost optimization",
          "secondary_queries": [
            "token cost of a large MCP tool list",
            "ttlMs cacheScope MCP caching hints",
            "measuring cost per MCP tool",
            "fan-out cost for an MCP server from parallel callers"
          ],
          "tags": [
            "mcp",
            "cost",
            "optimization",
            "caching",
            "observability",
            "agents",
            "production"
          ],
          "published": "2026-08-15",
          "updated": "2026-08-15",
          "words": 1498,
          "takeaways": [
            "A tool list re-injected into an agent's context on every session carries a token cost proportional to the number of tools registered, so a fifty-tool MCP server imposes roughly ten times the standing token tax of an equivalent five-tool server, independent of how often any individual tool actually gets called.",
            "The 2026-07-28 MCP spec revision added ttlMs and cacheScope parameters to list and resource results as an explicit, server-declared basis for client-side caching, which a client can use to skip re-fetching tools/list within the declared window instead of re-fetching by default.",
            "Setting a caching TTL longer than how often an MCP server's tool catalog actually changes per user or per session risks a client acting on a stale tool list — this is a reasoned caution about the caching hints, not a documented spec warning.",
            "From a single MCP server's vantage point, fan-out multiplies load the operator did not architect and cannot fix by changing their own code, because the calling side's sub-agent count and retry behavior are decisions made entirely outside the server.",
            "Tracking token cost per tool name, the same way per-tool-name latency and error-rate dashboards catch one degrading tool inside a healthy-looking average, prevents one expensive MCP tool from hiding inside a server-wide cost figure that still looks reasonable."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/agent-cost-latency-optimization",
            "https://changegamer.ai/resources/mcp-2026-spec-revision"
          ],
          "html": "https://changegamer.ai/articles/mcp-server-cost-optimization",
          "markdown": "https://changegamer.ai/articles/mcp-server-cost-optimization.md",
          "json": "https://changegamer.ai/api/articles/mcp-server-cost-optimization.json"
        },
        {
          "slug": "mcp-server-failure-modes",
          "title": "Common MCP Server Failure Modes and How to Fix Them",
          "description": "A runtime playbook for the two MCP server failure modes with no dedicated deep-dive elsewhere: unrecoverable state after a mid-call crash, and malformed or hallucinated tool calls that reach the handler despite upstream validation.",
          "kind": "sub",
          "order": 9,
          "cluster": "mcp-in-practice",
          "target_query": "common MCP server failure modes and how to fix them",
          "secondary_queries": [
            "MCP tool call idempotency key",
            "MCP server crash recovery",
            "handling hallucinated tool calls in an MCP handler",
            "malformed tool call arguments MCP server"
          ],
          "tags": [
            "mcp",
            "reliability",
            "idempotency",
            "tool-calling",
            "agents",
            "production"
          ],
          "published": "2026-08-21",
          "updated": "2026-08-21",
          "words": 1751,
          "takeaways": [
            "An MCP tool handler that writes to a database or calls a payment API needs an idempotency key derived from the run ID and step index, not from wall-clock time or a fresh random value, so a retried call after a crash lands as a no-op instead of a duplicate side effect.",
            "A hallucinated tool name or a malformed argument object can still reach an MCP handler even with a well-formed inputSchema declared, because schema declaration constrains what a well-behaved client sends, not what an unreliable model actually emits.",
            "Distinguishing a transient failure (network timeout, rate limit, 5xx) from a terminal one (bad request, business-logic rejection) at the point of failure determines whether an MCP handler should retry with backoff or fail fast and surface a clear error instead.",
            "The Berkeley Function Calling Leaderboard is the standard reference benchmark for tool-call reliability across providers, which means a hallucinated-tool-name or malformed-argument rate greater than zero should be treated as an expected input condition an MCP handler must defend against, not an edge case to leave unhandled.",
            "Rejecting an unknown tool name or a schema-invalid argument object before any handler logic runs turns a hallucinated or malformed call into a clean, typed error response instead of an unhandled exception or, worse, a partially executed side effect."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/durable-execution-for-agents",
            "https://changegamer.ai/resources/reliable-tool-calling"
          ],
          "html": "https://changegamer.ai/articles/mcp-server-failure-modes",
          "markdown": "https://changegamer.ai/articles/mcp-server-failure-modes.md",
          "json": "https://changegamer.ai/api/articles/mcp-server-failure-modes.json"
        },
        {
          "slug": "mcp-resources-and-prompts-vs-tools",
          "title": "MCP Tools vs Resources vs Prompts: How to Choose the Right Primitive",
          "description": "A decision procedure for MCP's three server-side primitives — who controls each one, a worked example of what it costs to expose a Resource as a Tool by mistake, and how Sampling and Elicitation fit as the client-side counterparts.",
          "kind": "sub",
          "order": 10,
          "cluster": "mcp-in-practice",
          "target_query": "MCP tools vs resources vs prompts",
          "secondary_queries": [
            "when to use MCP Resource instead of Tool",
            "MCP Prompt vs Tool difference",
            "MCP Sampling vs Tools",
            "choosing MCP server primitives"
          ],
          "tags": [
            "mcp",
            "protocols",
            "tool-calling",
            "architecture",
            "agents"
          ],
          "published": "2026-08-21",
          "updated": "2026-08-21",
          "words": 1490,
          "takeaways": [
            "MCP's three server-side primitives answer to three different controllers: the model decides when to call a Tool, the host application decides when to inject a Resource, and the user decides when to invoke a Prompt — and none of the three can invoke either of the others.",
            "Content that is read-only, always-relevant, and owned by the application — a config blob, the file a user has open, a live status value — belongs in a Resource, not a Tool, because a Resource is injected on the application's schedule while a Tool depends on the model remembering to ask for it.",
            "Registering read-only context as a Tool rather than a Resource adds a permanent entry to tools/list that every session pays a token cost for, and makes whether the model actually has that context on a given turn a matter of whether it chose to call the tool rather than a guarantee the application controls.",
            "Sampling and Elicitation are the client-side counterparts to Tools and run in the opposite direction: instead of a model asking a server to act, a server asks the connected client for an LLM completion or for structured user input, and both require a human review step before the result reaches the model or the server.",
            "ChangeGamer's own /mcp server, checked directly against its request handler as of August 2026, registers ten capabilities exclusively as Tools and declares no resources or prompts capability at all, including for its read-only resource catalog."
          ],
          "faq_count": 5,
          "resources": [
            "https://changegamer.ai/resources/mcp-primitives"
          ],
          "html": "https://changegamer.ai/articles/mcp-resources-and-prompts-vs-tools",
          "markdown": "https://changegamer.ai/articles/mcp-resources-and-prompts-vs-tools.md",
          "json": "https://changegamer.ai/api/articles/mcp-resources-and-prompts-vs-tools.json"
        },
        {
          "slug": "mcp-server-production-launch-checklist",
          "title": "The MCP Server Production Launch Checklist",
          "description": "A phase-by-phase go/no-go checklist for launching an MCP server: checkable gate conditions for transport and auth, tool design, cross-client testing, publish readiness, observability, and ongoing operation — with links to the mechanics each gate depends on.",
          "kind": "sub",
          "order": 11,
          "cluster": "mcp-in-practice",
          "target_query": "production launch checklist for an MCP server",
          "secondary_queries": [
            "MCP server go/no-go checklist",
            "is my MCP server ready for production",
            "MCP server launch phases and gates",
            "MCP server pre-launch readiness review"
          ],
          "tags": [
            "mcp",
            "production",
            "checklist",
            "launch",
            "agents",
            "operations"
          ],
          "published": "2026-08-22",
          "updated": "2026-08-22",
          "words": 1719,
          "takeaways": [
            "A production MCP server launch breaks into six sequential phases — transport and auth, tool design, cross-client testing, publish readiness, observability, and ongoing operation — and each phase needs a checkable go/no-go gate before the next one starts, not just a completed to-do item.",
            "The go/no-go gate for the testing phase is a successful end-to-end run completed against whichever client your users actually connect with, not a clean pass inside Inspector alone — Inspector confirms your server handles a well-formed call, and says nothing about how a real host reads your tool descriptions.",
            "The go/no-go gate for the publish phase requires a pinned SDK version and a server.json manifest that validates against the registry schema before the first submission, since the official registry stores metadata only and points at a package that must already be live elsewhere.",
            "The go/no-go gate for calling a server \"live\" is that every tool call already logs its trace ID, redacted arguments and response, latency, and outcome somewhere agents cannot quietly edit or delete afterward, because instrumenting observability after launch means the first real incident has no data trail to debug from.",
            "Deciding the auth model during the transport phase, before a single handler line is written, avoids a migration every existing client integration would otherwise have to go through once a server already carrying real traffic needs to add one."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/mcp-server-authentication",
            "https://changegamer.ai/resources/testing-ai-agents",
            "https://changegamer.ai/resources/agent-observability",
            "https://changegamer.ai/resources/mcp-server-discovery",
            "https://changegamer.ai/resources/reliable-tool-calling",
            "https://changegamer.ai/resources/agentic-security-checklist"
          ],
          "html": "https://changegamer.ai/articles/mcp-server-production-launch-checklist",
          "markdown": "https://changegamer.ai/articles/mcp-server-production-launch-checklist.md",
          "json": "https://changegamer.ai/api/articles/mcp-server-production-launch-checklist.json"
        },
        {
          "slug": "mcp-enterprise-sso-id-jag",
          "title": "Zero-Touch Enterprise Authorization for MCP Servers: ID-JAG and SEP-990",
          "description": "How Enterprise-Managed Authorization (SEP-990) removes the per-server OAuth consent screen for MCP servers: the ID-JAG grant mechanism, its RFC 8693/7523 building blocks, named launch adopters as of August 2026, and how it layers on top of standard OAuth 2.1 rather than replacing it.",
          "kind": "sub",
          "order": 12,
          "cluster": "mcp-in-practice",
          "target_query": "zero-touch enterprise authorization for MCP servers",
          "secondary_queries": [
            "what is ID-JAG for MCP",
            "SEP-990 Enterprise-Managed Authorization",
            "Okta Cross App Access MCP",
            "MCP single sign-on for enterprise IT"
          ],
          "tags": [
            "mcp",
            "oauth",
            "sso",
            "identity",
            "security",
            "agents",
            "production"
          ],
          "published": "2026-08-22",
          "updated": "2026-08-22",
          "words": 1229,
          "takeaways": [
            "Enterprise-Managed Authorization (EMA) is SEP-990, an MCP extension that reached stable status on 18 June 2026, letting an organization's identity provider grant access to approved MCP servers during single sign-on instead of showing a per-server OAuth consent screen.",
            "The ID-JAG mechanism chains two existing standards: an identity provider issues an Identity Assertion JWT Authorization Grant via RFC 8693 Token Exchange, and the MCP server's own authorization server redeems that grant for an access token via an RFC 7523 JWT Bearer grant, with no interactive prompt shown to the user.",
            "As of August 2026, Okta is EMA's first supporting identity provider through its Cross App Access (XAA) protocol, Anthropic's Claude and Microsoft's VS Code are named launch clients, and Asana, Atlassian, Canva, Figma, Granola, Linear and Supabase are named launch MCP servers, with Slack support in progress.",
            "Enterprise-Managed Authorization is optional and strictly additive: an MCP server or client that has not implemented SEP-990 falls back automatically to the standard interactive OAuth 2.1 flow with mandatory PKCE that every remote MCP server must already support.",
            "Enterprise-Managed Authorization solves two distinct problems at once — it removes the repeated per-server consent click for end users, and it gives enterprise IT administrators centralized, identity-provider-level control over which MCP servers are usable inside the organization at all."
          ],
          "faq_count": 4,
          "resources": [
            "https://changegamer.ai/resources/mcp-enterprise-managed-authorization",
            "https://changegamer.ai/resources/mcp-server-authentication"
          ],
          "html": "https://changegamer.ai/articles/mcp-enterprise-sso-id-jag",
          "markdown": "https://changegamer.ai/articles/mcp-enterprise-sso-id-jag.md",
          "json": "https://changegamer.ai/api/articles/mcp-enterprise-sso-id-jag.json"
        }
      ]
    }
  ],
  "articles": [
    {
      "slug": "agent-ready-website",
      "title": "The Agent-Ready Website: A Complete Guide to AI Visibility, Access Control and Monetization",
      "description": "The full operator playbook for making a website work for AI agents and AI crawlers: be fetchable, be readable, be controllable, be payable — with a 30-day implementation plan.",
      "kind": "pillar",
      "order": 0,
      "cluster": "agent-ready-web",
      "target_query": "how to make a website AI agent ready",
      "secondary_queries": [
        "optimize website for AI agents",
        "AI visibility for websites",
        "agent-first website architecture",
        "AI crawler strategy for publishers"
      ],
      "tags": [
        "ai-visibility",
        "agents",
        "crawlers",
        "llms.txt",
        "monetization",
        "seo"
      ],
      "published": "2026-07-26",
      "updated": "2026-07-26",
      "words": 4160,
      "takeaways": [
        "An agent-ready site does four things: it is **fetchable** at the edge, **readable** without a browser, **controllable** through published policy, and **payable** without a human in the loop. Most sites fail the first two for reasons that have nothing to do with content quality.",
        "The single highest-leverage change is not llms.txt. It is verifying that your WAF, bot-management rules and browser-integrity checks are not silently returning 403 to the crawlers you want.",
        "Blocking and monetizing are the same decision made twice: `robots.txt` and Content Signals express a preference, RSL expresses a licence, and HTTP 402 is the only layer that actually enforces a price.",
        "Measure agent traffic server-side by user agent and outcome. Analytics that depend on JavaScript record almost none of it.",
        "Agent traffic is no longer a rounding error: Cloudflare reported automated systems drove 57.5% of HTTP requests against 42.5% human in mid-2026 — the first such crossover it has recorded."
      ],
      "faq_count": 5,
      "resources": [
        "https://changegamer.ai/resources/llms-txt-explained",
        "https://changegamer.ai/resources/ai-crawler-policy",
        "https://changegamer.ai/resources/content-signals-explained",
        "https://changegamer.ai/resources/agentic-payment-protocols",
        "https://changegamer.ai/resources/paying-for-access-402",
        "https://changegamer.ai/resources/data-formats",
        "https://changegamer.ai/resources/json-api",
        "https://changegamer.ai/resources/agents-md-explained",
        "https://changegamer.ai/resources/mcp-server-discovery",
        "https://changegamer.ai/resources/building-mcp-servers",
        "https://changegamer.ai/resources/web-data-for-agents",
        "https://changegamer.ai/resources/handling-rate-limits-and-retries",
        "https://changegamer.ai/resources/agentic-browsers",
        "https://changegamer.ai/resources/nlweb-explained",
        "https://changegamer.ai/resources/c2pa-content-credentials",
        "https://changegamer.ai/resources/agent-control-specification"
      ],
      "html": "https://changegamer.ai/articles/agent-ready-website",
      "markdown": "https://changegamer.ai/articles/agent-ready-website.md",
      "json": "https://changegamer.ai/api/articles/agent-ready-website.json"
    },
    {
      "slug": "llms-txt-vs-robots-txt-vs-sitemap",
      "title": "llms.txt vs robots.txt vs sitemap.xml: Which File Does What",
      "description": "The three root-level files every agent-ready site publishes, what each one is actually for, and why publishing one does not substitute for the others.",
      "kind": "sub",
      "order": 1,
      "cluster": "agent-ready-web",
      "target_query": "llms.txt vs robots.txt vs sitemap.xml",
      "secondary_queries": [
        "difference between llms.txt and robots.txt",
        "do I need llms.txt if I have a sitemap",
        "root level files for AI crawlers"
      ],
      "tags": [
        "llms.txt",
        "robots.txt",
        "sitemap",
        "crawlers",
        "ai-visibility"
      ],
      "published": "2026-07-26",
      "updated": "2026-07-26",
      "words": 1226,
      "takeaways": [
        "`robots.txt` is **permission**, `sitemap.xml` is **inventory**, `llms.txt` is **curation**. Different questions, different consumers, no overlap in function.",
        "Only `robots.txt` changes crawler behaviour on compliant clients. A sitemap is a hint; llms.txt is a convenience that no vendor has committed to reading.",
        "You need all three for different reasons, and none of them fixes an edge rule that returns 403.",
        "The one file that can actively cost you traffic if written carelessly is `robots.txt` — a single misplaced `Disallow` removes you from products you wanted to be in."
      ],
      "faq_count": 3,
      "resources": [
        "https://changegamer.ai/resources/llms-txt-explained",
        "https://changegamer.ai/resources/ai-crawler-policy",
        "https://changegamer.ai/resources/content-signals-explained",
        "https://changegamer.ai/resources/agents-md-explained"
      ],
      "html": "https://changegamer.ai/articles/llms-txt-vs-robots-txt-vs-sitemap",
      "markdown": "https://changegamer.ai/articles/llms-txt-vs-robots-txt-vs-sitemap.md",
      "json": "https://changegamer.ai/api/articles/llms-txt-vs-robots-txt-vs-sitemap.json"
    },
    {
      "slug": "how-to-write-an-llms-txt-file",
      "title": "How to Write an llms.txt File (Format, Template, and Maintenance)",
      "description": "A step-by-step guide to writing a useful llms.txt: the exact format, a copy-paste template, what to put under ## Optional, how to validate it, and how to keep it from rotting.",
      "kind": "sub",
      "order": 2,
      "cluster": "agent-ready-web",
      "target_query": "how to write an llms.txt file",
      "secondary_queries": [
        "llms.txt template",
        "llms.txt format example",
        "llms.txt generator vs hand written"
      ],
      "tags": [
        "llms.txt",
        "ai-visibility",
        "agents",
        "documentation"
      ],
      "published": "2026-07-26",
      "updated": "2026-07-26",
      "words": 1301,
      "takeaways": [
        "The format is four elements in order: an H1 name, an optional blockquote summary, optional prose, then H2 sections of annotated links. Nothing else is defined.",
        "Curate ruthlessly. A model choosing what to fetch benefits from forty good links, not four thousand — a dumped sitemap is the most common way to make the file worthless.",
        "Point every link at a Markdown variant where you have one. The file exists to reduce token cost; linking to JavaScript-heavy HTML defeats the purpose.",
        "Generate it from the same source that generates your pages. A hand-maintained llms.txt drifts within weeks and then lies about your site.",
        "Put changelogs, archives and secondary material under `## Optional` — agents under context pressure are permitted to skip that whole section."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/llms-txt-explained",
        "https://changegamer.ai/resources/data-formats",
        "https://changegamer.ai/resources/getting-started"
      ],
      "html": "https://changegamer.ai/articles/how-to-write-an-llms-txt-file",
      "markdown": "https://changegamer.ai/articles/how-to-write-an-llms-txt-file.md",
      "json": "https://changegamer.ai/api/articles/how-to-write-an-llms-txt-file.json"
    },
    {
      "slug": "serving-markdown-variants-to-ai-agents",
      "title": "Serving Markdown Variants to AI Agents: The Cheapest Win in AI Visibility",
      "description": "How to publish a .md twin of every page — URL patterns, content negotiation, discovery headers, generation pitfalls — and why it cuts what an agent pays to read you.",
      "kind": "sub",
      "order": 3,
      "cluster": "agent-ready-web",
      "target_query": "serve markdown version of web pages for AI agents",
      "secondary_queries": [
        "markdown variant url pattern",
        "content negotiation text/markdown",
        "reduce token cost of web pages for LLMs"
      ],
      "tags": [
        "markdown",
        "formats",
        "agents",
        "ai-visibility",
        "tokens"
      ],
      "published": "2026-07-26",
      "updated": "2026-07-26",
      "words": 1091,
      "takeaways": [
        "A Markdown twin of an HTML page removes navigation, scripts, styling and ads from what a model sees — typically a large reduction in tokens with no loss of meaning.",
        "Use a predictable URL suffix (`/page` → `/page.md`). It is discoverable, cacheable, linkable and works with every CDN. Content negotiation is a nice addition, not a substitute.",
        "Generate Markdown from your source content, not from rendered HTML. HTML-to-Markdown conversion drags navigation and boilerplate back in — the exact thing you were removing.",
        "Advertise it: `<link rel=\"alternate\" type=\"text/markdown\">` in the HTML head, the `.md` URL in your llms.txt, and a `Link` header if you can.",
        "Keep the two in lockstep by rendering both from one source. Two hand-maintained copies means shipping two versions of the truth."
      ],
      "faq_count": 3,
      "resources": [
        "https://changegamer.ai/resources/data-formats",
        "https://changegamer.ai/resources/llms-txt-explained",
        "https://changegamer.ai/resources/json-api",
        "https://changegamer.ai/resources/getting-started"
      ],
      "html": "https://changegamer.ai/articles/serving-markdown-variants-to-ai-agents",
      "markdown": "https://changegamer.ai/articles/serving-markdown-variants-to-ai-agents.md",
      "json": "https://changegamer.ai/api/articles/serving-markdown-variants-to-ai-agents.json"
    },
    {
      "slug": "how-ai-search-engines-choose-sources",
      "title": "How AI Search Engines Choose Sources (And What You Can Actually Influence)",
      "description": "What is known, what is claimed and what is speculation about how ChatGPT, Perplexity and AI Overviews pick the pages they cite — and the short list of things a site owner can actually control.",
      "kind": "sub",
      "order": 4,
      "cluster": "agent-ready-web",
      "target_query": "how do AI search engines choose which sources to cite",
      "secondary_queries": [
        "get cited by ChatGPT and Perplexity",
        "generative engine optimization evidence",
        "AI Overviews citation factors"
      ],
      "tags": [
        "ai-visibility",
        "citations",
        "answer-engines",
        "seo",
        "rag"
      ],
      "published": "2026-07-26",
      "updated": "2026-07-26",
      "words": 1348,
      "takeaways": [
        "Answer engines are retrieval systems with a generation step. Citation is decided by retrieval (can a passage be found and matched) and by verifiability (can the model defend quoting it) — not by anything resembling PageRank.",
        "The strongest controllable factor is passage-level self-containment: a section that answers one question completely, without depending on the paragraph above it, is the unit that gets retrieved and quoted.",
        "Be explicit about facts: dates, numbers, named sources, versions. A model choosing between two passages will prefer the one it can attribute.",
        "Most \"GEO\" tactics circulating today are untested. Treat anything without a published mechanism as a hypothesis, and spend the budget on retrievability instead.",
        "You cannot be cited if you cannot be fetched. Access verification comes before any of this."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/rag-retrieval-for-agents",
        "https://changegamer.ai/resources/chunking-strategies-for-rag",
        "https://changegamer.ai/resources/ai-crawler-policy",
        "https://changegamer.ai/resources/data-formats"
      ],
      "html": "https://changegamer.ai/articles/how-ai-search-engines-choose-sources",
      "markdown": "https://changegamer.ai/articles/how-ai-search-engines-choose-sources.md",
      "json": "https://changegamer.ai/api/articles/how-ai-search-engines-choose-sources.json"
    },
    {
      "slug": "should-you-block-ai-crawlers",
      "title": "Should You Block AI Crawlers? A Decision Framework by Business Model",
      "description": "Blocking AI crawlers is four separate decisions, not one. A framework that maps each crawler class to what it costs and earns you, by business model, with the exact robots.txt for each answer.",
      "kind": "sub",
      "order": 5,
      "cluster": "agent-ready-web",
      "target_query": "should I block AI crawlers",
      "secondary_queries": [
        "block GPTBot pros and cons",
        "does blocking AI crawlers hurt SEO",
        "allow or block ClaudeBot PerplexityBot"
      ],
      "tags": [
        "crawlers",
        "robots.txt",
        "policy",
        "monetization",
        "ai-visibility"
      ],
      "published": "2026-07-26",
      "updated": "2026-07-26",
      "words": 1175,
      "takeaways": [
        "There is no single \"AI crawler\" decision. There are four: training collection, search indexing, live user-triggered fetches, and open web archives. They pay you back completely differently.",
        "Training opt-out tokens (`Google-Extended`, `Applebot-Extended`) cost you nothing in search visibility — they are policy tokens, not crawlers.",
        "Blocking search-indexing bots (`OAI-SearchBot`, `Claude-SearchBot`, `PerplexityBot`) removes you from those products' answers. That is a distribution decision, and usually the expensive one to get wrong.",
        "Blocking is enforcement-free: `robots.txt` is advisory, and some fetchers ignore it by design. If you need enforcement, that is a WAF rule or a 402, not a `Disallow`.",
        "The middle path most publishers actually want: allow answer-engine indexing, decline training, declare usage preferences, and price bulk access."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/ai-crawler-policy",
        "https://changegamer.ai/resources/content-signals-explained",
        "https://changegamer.ai/resources/agentic-payment-protocols",
        "https://changegamer.ai/resources/access-and-pricing"
      ],
      "html": "https://changegamer.ai/articles/should-you-block-ai-crawlers",
      "markdown": "https://changegamer.ai/articles/should-you-block-ai-crawlers.md",
      "json": "https://changegamer.ai/api/articles/should-you-block-ai-crawlers.json"
    },
    {
      "slug": "what-to-charge-ai-crawlers",
      "title": "What to Charge AI Crawlers: Pricing Models for Machine Buyers",
      "description": "Per-crawl, per-resource, corpus licence or subscription key — the four ways to price AI access, the arithmetic behind each, and why pricing before you have demand data is the standard mistake.",
      "kind": "sub",
      "order": 6,
      "cluster": "agent-ready-web",
      "target_query": "what to charge AI crawlers for content access",
      "secondary_queries": [
        "pay per crawl pricing",
        "how to price content licensing for AI",
        "per request pricing for AI agents"
      ],
      "tags": [
        "monetization",
        "pricing",
        "pay-per-crawl",
        "402",
        "crawlers"
      ],
      "published": "2026-07-26",
      "updated": "2026-07-26",
      "words": 1381,
      "takeaways": [
        "Four pricing shapes exist: per-crawl, per-resource unlock, corpus licence, and subscription key. They suit different demand patterns, and your logs tell you which pattern you have.",
        "Per-crawl pricing only works where crawl volume is high and content is homogeneous. For most sites, revenue per crawl is a fraction of a cent and the operational overhead exceeds it.",
        "The number that matters is not \"what is my content worth\" but \"what does this buyer save by buying instead of scraping\". Price against their alternative, which is usually cheap.",
        "Do not set prices before you can see demand. Concentrated 402s on a few URLs argue for per-resource; broad shallow crawling argues for a corpus licence.",
        "Whatever you charge, publish it machine-readably. A price an agent has to email you about is not a price."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/agentic-payment-protocols",
        "https://changegamer.ai/resources/paying-for-access-402",
        "https://changegamer.ai/resources/access-and-pricing",
        "https://changegamer.ai/resources/ai-crawler-policy"
      ],
      "html": "https://changegamer.ai/articles/what-to-charge-ai-crawlers",
      "markdown": "https://changegamer.ai/articles/what-to-charge-ai-crawlers.md",
      "json": "https://changegamer.ai/api/articles/what-to-charge-ai-crawlers.json"
    },
    {
      "slug": "http-402-paywall-implementation",
      "title": "Implementing an HTTP 402 Paywall an Agent Can Actually Pay",
      "description": "A working implementation guide for machine-payable content: the 402 response body, Link headers, key issuance and validation, caching rules, and the mistakes that make a 402 gate unpayable.",
      "kind": "sub",
      "order": 7,
      "cluster": "agent-ready-web",
      "target_query": "how to implement an HTTP 402 paywall",
      "secondary_queries": [
        "http 402 payment required example response",
        "machine readable paywall for AI agents",
        "api key issuance after stripe checkout worker"
      ],
      "tags": [
        "402",
        "paywall",
        "monetization",
        "agents",
        "implementation"
      ],
      "published": "2026-07-26",
      "updated": "2026-07-26",
      "words": 1262,
      "takeaways": [
        "A payable 402 has five things in the body: what was blocked, the price, where to pay, exactly how to retry, and links to terms and licence.",
        "Never gate the terms. If your 402 points at a pricing or licence page, that page must stay free, or the loop cannot close.",
        "Put the commercial metadata in `Link` headers too, so a `HEAD` request is enough to learn the price.",
        "Paid responses must be `Cache-Control: no-store`. A CDN that caches a paid body publicly leaks the product.",
        "Key validation belongs at the edge, in front of the asset — not inside the page. Return the same 402 shape for \"no key\" and \"key of insufficient tier\", differing only in the instruction."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/paying-for-access-402",
        "https://changegamer.ai/resources/agentic-payment-protocols",
        "https://changegamer.ai/resources/access-and-pricing",
        "https://changegamer.ai/resources/json-api"
      ],
      "html": "https://changegamer.ai/articles/http-402-paywall-implementation",
      "markdown": "https://changegamer.ai/articles/http-402-paywall-implementation.md",
      "json": "https://changegamer.ai/api/articles/http-402-paywall-implementation.json"
    },
    {
      "slug": "structured-data-for-ai-agents",
      "title": "Structured Data for AI Agents: Which Schema.org Types Earn Their Keep",
      "description": "Most schema.org markup is invisible to machine readers. The types that are worth the effort for AI agents, how to emit them without drift, and what to build instead of more markup.",
      "kind": "sub",
      "order": 8,
      "cluster": "agent-ready-web",
      "target_query": "schema.org structured data for AI agents",
      "secondary_queries": [
        "json-ld for llm consumption",
        "which schema types matter for AI",
        "structured data vs json api for agents"
      ],
      "tags": [
        "structured-data",
        "schema.org",
        "json-ld",
        "ai-visibility",
        "seo"
      ],
      "published": "2026-07-26",
      "updated": "2026-07-26",
      "words": 1148,
      "takeaways": [
        "Structured data helps machine readers most where it states facts the prose leaves implicit: dates, prices, authorship, identity, licence.",
        "A short, correct graph beats a long, aspirational one. Four accurate types are worth more than twenty types with placeholder values.",
        "Emit JSON-LD from the same source that renders the page. Hand-written markup drifts from the visible content, and contradiction is worse than absence.",
        "Never mark up something that is not visible on the page. It is a policy violation for search rich results and it makes the whole graph untrustworthy to any consumer.",
        "If the thing you are marking up is really data — a catalogue, prices, availability — publish a JSON endpoint. Structured data is a description of a page; an API is the data itself."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/data-formats",
        "https://changegamer.ai/resources/json-api",
        "https://changegamer.ai/resources/llms-txt-explained",
        "https://changegamer.ai/resources/c2pa-content-credentials"
      ],
      "html": "https://changegamer.ai/articles/structured-data-for-ai-agents",
      "markdown": "https://changegamer.ai/articles/structured-data-for-ai-agents.md",
      "json": "https://changegamer.ai/api/articles/structured-data-for-ai-agents.json"
    },
    {
      "slug": "json-api-design-for-agents",
      "title": "JSON API Design for AI Agents: Endpoints They Prefer Over Scraping",
      "description": "How to publish read-only JSON endpoints that agents choose over scraping your HTML: discovery index, stable shapes, freshness signals, bulk exports, and errors a machine can act on.",
      "kind": "sub",
      "order": 9,
      "cluster": "agent-ready-web",
      "target_query": "json api design for AI agents",
      "secondary_queries": [
        "api for llm consumption best practices",
        "machine readable endpoints instead of scraping",
        "openapi for agent tool use"
      ],
      "tags": [
        "json",
        "api",
        "agents",
        "openapi",
        "formats"
      ],
      "published": "2026-07-26",
      "updated": "2026-07-26",
      "words": 1288,
      "takeaways": [
        "Publish one discovery endpoint that lists every other endpoint with its content type and auth requirement. Without it, an agent guesses URLs.",
        "Give every collection a cheap freshness signal — a stats or version endpoint — so pollers stop re-fetching everything to learn nothing changed.",
        "Bulk beats pagination for corpora. One NDJSON export saves an agent hundreds of round trips and saves you the traffic.",
        "Errors must be machine-actionable: a stable error code, what to do next, and where the terms are. `{\"error\":\"not_found\"}` with no next step wastes a retry budget.",
        "Ship an OpenAPI description. Toolchains generate agent tools from it, which turns your API into something an agent can call without bespoke integration code."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/json-api",
        "https://changegamer.ai/resources/data-formats",
        "https://changegamer.ai/resources/reliable-tool-calling",
        "https://changegamer.ai/resources/handling-rate-limits-and-retries",
        "https://changegamer.ai/resources/streaming-for-agents"
      ],
      "html": "https://changegamer.ai/articles/json-api-design-for-agents",
      "markdown": "https://changegamer.ai/articles/json-api-design-for-agents.md",
      "json": "https://changegamer.ai/api/articles/json-api-design-for-agents.json"
    },
    {
      "slug": "measuring-ai-agent-traffic",
      "title": "Measuring AI Agent Traffic: Server-Side Telemetry That Answers Real Questions",
      "description": "Why client-side analytics miss AI agents entirely, the minimum row schema to log, the five queries worth running, and how to tell a real crawler from a spoofed user agent.",
      "kind": "sub",
      "order": 10,
      "cluster": "agent-ready-web",
      "target_query": "how to measure AI agent and crawler traffic",
      "secondary_queries": [
        "track GPTBot ClaudeBot in server logs",
        "AI crawler analytics setup",
        "verify AI crawler is real not spoofed"
      ],
      "tags": [
        "analytics",
        "observability",
        "crawlers",
        "measurement",
        "ai-visibility"
      ],
      "published": "2026-07-26",
      "updated": "2026-07-26",
      "words": 1221,
      "takeaways": [
        "Agents mostly do not execute JavaScript, so JS-based analytics record almost none of this traffic. Everything useful is server-side.",
        "Six fields are enough: timestamp, path, user agent, status, outcome class, and a bot-verified flag. Resist logging more, especially anything credential-shaped.",
        "The decisive metric is the fetch-to-referral ratio per crawler: high fetches with no referrals means you are supplying answers, not receiving visitors.",
        "User agents are trivially spoofed. Verify against published vendor IP ranges before you treat a row as a real vendor crawler.",
        "Set a decision threshold in advance — \"N distinct paywall hits in 30 days\" — so that pricing and blocking decisions are made on evidence rather than on the first interesting week."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/ai-crawler-policy",
        "https://changegamer.ai/resources/agent-observability",
        "https://changegamer.ai/resources/web-bot-auth",
        "https://changegamer.ai/resources/access-and-pricing"
      ],
      "html": "https://changegamer.ai/articles/measuring-ai-agent-traffic",
      "markdown": "https://changegamer.ai/articles/measuring-ai-agent-traffic.md",
      "json": "https://changegamer.ai/api/articles/measuring-ai-agent-traffic.json"
    },
    {
      "slug": "licensing-content-for-ai-training",
      "title": "Licensing Content for AI Training: RSL, Terms, and Provenance",
      "description": "How to publish machine-readable licence terms for AI use — what RSL is, what it does and does not do, how it differs from robots.txt and Content Signals, and where provenance standards fit.",
      "kind": "sub",
      "order": 11,
      "cluster": "agent-ready-web",
      "target_query": "how to license website content for AI training",
      "secondary_queries": [
        "RSL really simple licensing explained",
        "machine readable license for AI crawlers",
        "terms of service AI training clause"
      ],
      "tags": [
        "licensing",
        "rsl",
        "provenance",
        "policy",
        "monetization"
      ],
      "published": "2026-07-26",
      "updated": "2026-07-26",
      "words": 1042,
      "takeaways": [
        "Four layers, four different jobs: `robots.txt` controls access, Content Signals declare usage preference, a licence states terms, and a payment gate enforces a price. None substitutes for another.",
        "RSL (Really Simple Licensing) is a machine-readable licence document, typically an XML file discovered via a `License:` directive in robots.txt. It declares terms and compensation; it does not collect money.",
        "A licence is only useful if it is discoverable, free to read, unambiguous about the unit being licensed, and versioned.",
        "Provenance standards (C2PA Content Credentials) prove where an asset came from. That is a different guarantee from a licence and increasingly asked for alongside one.",
        "Publish the licence even if you never sell anything: it converts \"we assume this is allowed\" into a documented position."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/ai-crawler-policy",
        "https://changegamer.ai/resources/content-signals-explained",
        "https://changegamer.ai/resources/agentic-payment-protocols",
        "https://changegamer.ai/resources/c2pa-content-credentials",
        "https://changegamer.ai/resources/ai-supply-chain-provenance",
        "https://changegamer.ai/resources/access-and-pricing"
      ],
      "html": "https://changegamer.ai/articles/licensing-content-for-ai-training",
      "markdown": "https://changegamer.ai/articles/licensing-content-for-ai-training.md",
      "json": "https://changegamer.ai/api/articles/licensing-content-for-ai-training.json"
    },
    {
      "slug": "mcp-server-as-distribution-channel",
      "title": "Running an MCP Server as a Distribution Channel for Your Content",
      "description": "Why a content site should expose an MCP server, which tools to ship, how discovery and authentication work, how to gate paid tools, and the honest limits of the channel.",
      "kind": "sub",
      "order": 12,
      "cluster": "agent-ready-web",
      "target_query": "MCP server for a content website",
      "secondary_queries": [
        "expose website content as MCP tools",
        "mcp server distribution channel publishers",
        "which mcp tools should a content site offer"
      ],
      "tags": [
        "mcp",
        "distribution",
        "agents",
        "tools",
        "monetization"
      ],
      "published": "2026-07-26",
      "updated": "2026-07-26",
      "words": 1154,
      "takeaways": [
        "An MCP server turns your content from something agents scrape into something agents call. The client keeps the connection; you keep the interface.",
        "Ship five tools before anything clever: list, get, search, bulk-get, and an access/pricing tool. That covers almost every question an agent asks.",
        "Reuse your JSON layer. If you already publish an index, per-item and bulk endpoints, the MCP server is a thin adapter over them — not a second content system.",
        "Gate paid tools with the same entitlement check and the same payment-required payload your HTTP 402 gate returns, from one shared code path.",
        "Discovery is the weak link: a server nobody lists is a server nobody connects to. Registry presence and a `.well-known` descriptor do more for adoption than extra tools."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/building-mcp-servers",
        "https://changegamer.ai/resources/mcp-server-discovery",
        "https://changegamer.ai/resources/mcp-primitives",
        "https://changegamer.ai/resources/mcp-server-authentication",
        "https://changegamer.ai/resources/mcp-vs-function-calling",
        "https://changegamer.ai/resources/json-api"
      ],
      "html": "https://changegamer.ai/articles/mcp-server-as-distribution-channel",
      "markdown": "https://changegamer.ai/articles/mcp-server-as-distribution-channel.md",
      "json": "https://changegamer.ai/api/articles/mcp-server-as-distribution-channel.json"
    },
    {
      "slug": "why-ai-agents-cant-read-your-site",
      "title": "Why AI Agents Can't Read Your Site: Twelve Failure Modes and How to Find Them",
      "description": "A diagnostic catalogue of the twelve reasons AI agents and crawlers fail on real sites — from silent WAF blocks to JS-only rendering — each with the command that detects it and the fix.",
      "kind": "sub",
      "order": 13,
      "cluster": "agent-ready-web",
      "target_query": "why can AI agents not read my website",
      "secondary_queries": [
        "GPTBot getting 403 from my site",
        "ChatGPT cannot access my page",
        "AI crawler blocked by cloudflare fix"
      ],
      "tags": [
        "debugging",
        "crawlers",
        "waf",
        "rendering",
        "ai-visibility"
      ],
      "published": "2026-07-26",
      "updated": "2026-07-26",
      "words": 1407,
      "takeaways": [
        "The most common cause is not content: it is an edge rule returning 403 to crawlers your robots.txt explicitly allows.",
        "Diagnose from outside with a spoofed user agent. A page that looks fine in your browser proves nothing about what a crawler receives.",
        "JavaScript-only content is invisible to crawlers that do not render and expensive for those that do — check the raw HTML response, not the DOM.",
        "Soft 404s and 200-with-error-page responses are worse than honest errors, because an agent will quote the error page as your content.",
        "Fix in this order: access, then rendering, then structure, then formats. Each layer is worthless while the one above it is broken."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/ai-crawler-policy",
        "https://changegamer.ai/resources/web-data-for-agents",
        "https://changegamer.ai/resources/agentic-browsers",
        "https://changegamer.ai/resources/handling-rate-limits-and-retries",
        "https://changegamer.ai/resources/document-extraction-for-agents",
        "https://changegamer.ai/resources/data-formats"
      ],
      "html": "https://changegamer.ai/articles/why-ai-agents-cant-read-your-site",
      "markdown": "https://changegamer.ai/articles/why-ai-agents-cant-read-your-site.md",
      "json": "https://changegamer.ai/api/articles/why-ai-agents-cant-read-your-site.json"
    },
    {
      "slug": "selling-to-ai-agents",
      "title": "How to Sell to AI Agents: The Complete Guide to Machine Buyers",
      "description": "The operator playbook for selling content, APIs and tools to buyers that are software: how agents discover, evaluate, authorize and pay — and the four rails you can charge them on today.",
      "kind": "pillar",
      "order": 0,
      "cluster": "selling-to-agents",
      "target_query": "how to sell to AI agents",
      "secondary_queries": [
        "monetize AI agent traffic",
        "agent commerce for API providers",
        "machine buyers checkout",
        "charge AI agents for API access"
      ],
      "tags": [
        "monetization",
        "agent-commerce",
        "payments",
        "x402",
        "402",
        "pricing",
        "agents"
      ],
      "published": "2026-07-28",
      "updated": "2026-07-28",
      "words": 4074,
      "takeaways": [
        "A machine buyer cannot be persuaded, only **qualified**. Everything that works on a human landing page — social proof, urgency, design — is invisible. What decides the sale is whether your price, terms and preview are machine-readable at the moment the agent hits the wall.",
        "The funnel has five stages and each one is a separate engineering problem: discover, evaluate, authorize, pay, reuse. Most sellers build stage 4 and lose the sale at stage 1 or 2.",
        "Four rails are live today: a self-hosted HTTP 402 gate with API keys (fiat, no crypto), native x402 (agent pays end-to-end in stablecoins, no account), marketplace publishing, and crawl licensing. They are not alternatives so much as different buyers.",
        "Your buyer has a hard spending cap set by someone else — provider budgets, wallet ceilings, signed price mandates, tokenized card limits. Price under the cap or you are not in the consideration set.",
        "x402 has a distribution property no other rail has: Coinbase's discovery catalog lists an endpoint automatically the first time a payment settles for it. Your first sale is also your listing event."
      ],
      "faq_count": 5,
      "resources": [
        "https://changegamer.ai/resources/selling-to-agents",
        "https://changegamer.ai/resources/agent-wallets-x402",
        "https://changegamer.ai/resources/agent-spend-controls",
        "https://changegamer.ai/resources/agentic-payment-protocols",
        "https://changegamer.ai/resources/paying-for-access-402",
        "https://changegamer.ai/resources/access-and-pricing",
        "https://changegamer.ai/resources/json-api",
        "https://changegamer.ai/resources/data-formats",
        "https://changegamer.ai/resources/mcp-server-discovery",
        "https://changegamer.ai/resources/building-mcp-servers",
        "https://changegamer.ai/resources/agent-identity-authentication",
        "https://changegamer.ai/resources/web-bot-auth",
        "https://changegamer.ai/resources/llms-txt-explained"
      ],
      "html": "https://changegamer.ai/articles/selling-to-ai-agents",
      "markdown": "https://changegamer.ai/articles/selling-to-ai-agents.md",
      "json": "https://changegamer.ai/api/articles/selling-to-ai-agents.json"
    },
    {
      "slug": "agent-checkout-vs-human-checkout",
      "title": "Agent Checkout vs. Human Checkout: Why Your Payment Flow Fails Machine Buyers",
      "description": "Why checkout built for a person watching a screen is unusable by an AI agent, and what a checkout flow that actually completes for a machine buyer looks like — 402 + API key versus native x402.",
      "kind": "sub",
      "order": 1,
      "cluster": "selling-to-agents",
      "target_query": "why human checkout flows fail for AI agents",
      "secondary_queries": [
        "can an AI agent complete checkout",
        "machine readable checkout flow",
        "agent friendly payment flow",
        "402 vs x402 checkout"
      ],
      "tags": [
        "checkout",
        "monetization",
        "402",
        "x402",
        "agents",
        "payments",
        "api-keys"
      ],
      "published": "2026-07-29",
      "updated": "2026-07-29",
      "words": 1646,
      "takeaways": [
        "A checkout built for a person fails an agent at a specific, listable set of steps: email verification loops, a confirmation-inbox requirement, CAPTCHAs, cookie-dependent sessions, JS-rendered forms with no API equivalent, and multi-page redirects that assume a human is watching a screen.",
        "Two rails exist today that a machine can complete: a self-hosted HTTP 402 gate with API keys (fiat, no crypto, one human step at first purchase) and native x402 (the agent signs and pays end-to-end, no human step at all — dormant on most sites, including this one, until an operator turns on-chain settlement on).",
        "The dividing line is not \"is a human involved\" — it is \"is a human involved on every purchase, or only the first one\". A key rail asks for one human checkout ever; a human-only checkout asks for one on every single transaction.",
        "Fixing a checkout for agents is mostly not a payments problem, it is an idempotency and header problem: mint keys idempotently against retried webhooks, accept both `Authorization: Bearer` and `X-API-Key`, give the buyer a retrieval path for a lost key, and never gate the flow behind a cookie session.",
        "Test your checkout the way an agent will use it: with `curl`, no browser, no cookie jar. If the loop cannot be completed in that shape, no agent can complete it either."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/paying-for-access-402",
        "https://changegamer.ai/resources/agent-wallets-x402"
      ],
      "html": "https://changegamer.ai/articles/agent-checkout-vs-human-checkout",
      "markdown": "https://changegamer.ai/articles/agent-checkout-vs-human-checkout.md",
      "json": "https://changegamer.ai/api/articles/agent-checkout-vs-human-checkout.json"
    },
    {
      "slug": "machine-readable-pricing-pages",
      "title": "Machine-Readable Pricing Pages: How to Let an Agent Evaluate Your Offer Before It Pays",
      "description": "Why a prose pricing page cannot be evaluated by an AI agent, what fields a machine-readable offer catalog needs, and how to keep it in lockstep with your human pricing page and your 402 body.",
      "kind": "sub",
      "order": 2,
      "cluster": "selling-to-agents",
      "target_query": "machine readable pricing for AI agents",
      "secondary_queries": [
        "machine readable pricing page",
        "JSON pricing catalog for AI agents",
        "agent readable offer catalog",
        "pricing.json for agents"
      ],
      "tags": [
        "pricing",
        "monetization",
        "json-api",
        "402",
        "agents",
        "data-formats"
      ],
      "published": "2026-07-30",
      "updated": "2026-07-30",
      "words": 1570,
      "takeaways": [
        "An agent cannot evaluate a price it can only find in prose. A pricing page written as sentences forces the agent to either skip the parse or hit your paywall to find out what it costs — a machine-readable offer catalog at a stable JSON path answers that before any request is blocked.",
        "A usable offer entry needs, at minimum: an identifier, price, currency, interval, what it unlocks, the exact checkout URL, the deliverables the buyer actually receives, and the license grant — training, redistribution and indexing are separate permissions, not one bucket labeled \"access\".",
        "The same facts belong in three places that must never disagree: the JSON catalog, the human pricing page, and the 402 response body. Three independently-maintained copies of the same numbers is a drift bug waiting to ship; the fix is one source of truth and, ideally, a build-time assertion that fails the build on mismatch.",
        "ChangeGamer runs exactly this today: `/api/pricing.json` and the MCP `get_pricing` tool are both generated from one `OFFERS` array, and the build calls `assertPricingLockstep()` at module scope so a changed price or checkout URL that is not mirrored into the pricing resource and the 402 resource fails `astro build`, not a customer's retry loop.",
        "A machine-readable catalog is not the checkout — it is what an agent reads to decide whether checkout is worth attempting. It must be free and reachable before the paywall, or the agent has nothing to evaluate against and defaults to not buying."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/access-and-pricing",
        "https://changegamer.ai/resources/json-api",
        "https://changegamer.ai/resources/data-formats",
        "https://changegamer.ai/resources/paying-for-access-402"
      ],
      "html": "https://changegamer.ai/articles/machine-readable-pricing-pages",
      "markdown": "https://changegamer.ai/articles/machine-readable-pricing-pages.md",
      "json": "https://changegamer.ai/api/articles/machine-readable-pricing-pages.json"
    },
    {
      "slug": "acp-vs-ap2-vs-x402",
      "title": "ACP vs. AP2 vs. x402: Which Agent Payment Rail Should You Implement?",
      "description": "A decision framework for choosing between ACP, AP2, and x402 (plus the self-hosted 402 gate) — sorted by who your buyer actually is, what you are selling, and what is live versus waitlisted today.",
      "kind": "sub",
      "order": 3,
      "cluster": "selling-to-agents",
      "target_query": "ACP vs AP2 vs x402 for agent payments",
      "secondary_queries": [
        "which agent payment protocol should I use",
        "ACP vs AP2",
        "x402 vs ACP",
        "how to choose an agent payment rail"
      ],
      "tags": [
        "payments",
        "x402",
        "acp",
        "ap2",
        "agents",
        "monetization",
        "402"
      ],
      "published": "2026-07-30",
      "updated": "2026-07-30",
      "words": 1603,
      "takeaways": [
        "ACP and AP2 solve a different problem than x402 and the self-hosted 402 gate — the first pair authorizes an agent to spend a human's money at checkout over fiat rails; the second pair gates content or API access and settles a payment (crypto or fiat) directly against the request. Picking between them starts with naming which problem you actually have, not comparing feature tables.",
        "The single question that sorts almost every case: is the buyer a wallet-holding agent spending its own funds, or a consumer-facing agent spending a human's money with the human's consent? The first buyer fits x402 or a self-hosted 402-plus-key gate; the second fits ACP and/or AP2.",
        "These rails are not mutually exclusive. A seller with more than one product line can run a 402 gate or x402 for machine-to-machine content/API access on one line, and separately accept ACP- or AP2-authorized checkout for a consumer product a human's agent buys on their behalf — as two front doors to two different buyers, not a migration from one to the other.",
        "As of 22 July 2026, x402 and ACP are both live and adoptable today (x402 via the Linux Foundation's x402 Foundation; ACP powering OpenAI Instant Checkout); AP2 is announced and has a wide partner list but no independently confirmed stable version number; Cloudflare's Monetization Gateway, which would let a Cloudflare-fronted site accept x402 without building the gate itself, is still waitlist-stage.",
        "ChangeGamer's own answer, stated exactly as it stands: the self-hosted 402-plus-Bearer-key rail is live in production; the native x402 endpoint is scaffolded but dormant, answering `503 x402_not_configured` because no on-chain settlement variables are set; ACP and AP2 are not implemented here at all, because this site has no consumer checkout for an agent to complete on someone else's behalf."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/agentic-payment-protocols",
        "https://changegamer.ai/resources/agent-wallets-x402",
        "https://changegamer.ai/resources/selling-to-agents",
        "https://changegamer.ai/resources/paying-for-access-402"
      ],
      "html": "https://changegamer.ai/articles/acp-vs-ap2-vs-x402",
      "markdown": "https://changegamer.ai/articles/acp-vs-ap2-vs-x402.md",
      "json": "https://changegamer.ai/api/articles/acp-vs-ap2-vs-x402.json"
    },
    {
      "slug": "accepting-x402-payments",
      "title": "How to Accept x402 Stablecoin Payments: A Seller Implementation Guide",
      "description": "A build guide for sellers who have already decided x402 is the right rail: the 402 response shape, the wallet/facilitator/network choices, the verify-then-settle retry flow, exact vs. upto pricing, and how to ship it dormant until you are ready to go live.",
      "kind": "sub",
      "order": 4,
      "cluster": "selling-to-agents",
      "target_query": "how to accept x402 stablecoin payments",
      "secondary_queries": [
        "how to implement x402 payments",
        "x402 accepts array PaymentRequirements",
        "x402 facilitator verify settle flow",
        "x402 exact vs upto scheme"
      ],
      "tags": [
        "payments",
        "x402",
        "agents",
        "monetization",
        "402",
        "stablecoins"
      ],
      "published": "2026-07-31",
      "updated": "2026-08-19",
      "words": 1616,
      "takeaways": [
        "An x402 seller endpoint answers `402` with an `accepts` array of PaymentRequirements objects — scheme, network, maxAmountRequired, payTo, asset, resource, and a maxTimeoutSeconds — not a single price line; a client picks an entry it can satisfy and retries.",
        "Before writing any settlement code, a seller has to make four decisions: a wallet address to receive funds (`payTo`), a facilitator to verify and settle on its behalf, a network/asset pair (typically USDC on an EVM chain such as Base), and a price expressed in the asset's atomic units, not decimal dollars.",
        "The retry flow is a two-call round trip to the facilitator: the server sends the client's base64-encoded `X-PAYMENT` header to the facilitator's `/verify` endpoint, and only if that succeeds does it call `/settle`; a `200` with the resource body and an `X-PAYMENT-RESPONSE` settlement receipt follows only after both calls succeed.",
        "x402 defines two pricing schemes: `exact` authorizes a fixed amount upfront, while `upto` authorizes a ceiling and charges actual usage — the shape Apify uses for variable-cost Actor runs. ChangeGamer's own endpoint implements only `exact`; it does not support `upto`.",
        "Discovery is not a separate step: the x402 Bazaar, Coinbase's discovery catalog, auto-lists a seller's endpoint the first time its facilitator settles a real payment for it. There is no listing form to fill out.",
        "Shipping the endpoint dormant — hard-failing closed until every operator setting is in place — is a reusable pattern for building x402 support ahead of choosing a wallet, facilitator, or price, without ever risking a malformed payment requirement or a misdirected payout."
      ],
      "faq_count": 5,
      "resources": [
        "https://changegamer.ai/resources/agentic-payment-protocols",
        "https://changegamer.ai/resources/agent-wallets-x402",
        "https://changegamer.ai/resources/selling-to-agents",
        "https://changegamer.ai/resources/paying-for-access-402"
      ],
      "html": "https://changegamer.ai/articles/accepting-x402-payments",
      "markdown": "https://changegamer.ai/articles/accepting-x402-payments.md",
      "json": "https://changegamer.ai/api/articles/accepting-x402-payments.json"
    },
    {
      "slug": "api-key-issuance-for-agents",
      "title": "Issuing API Keys to AI Agents Automatically: A Build Guide",
      "description": "How to design a system that mints and delivers API keys to agent and software buyers with minimal human friction: trigger models, storage, delivery, key format, tiering, rotation and revocation — illustrated with ChangeGamer's own Stripe-webhook mechanism.",
      "kind": "sub",
      "order": 5,
      "cluster": "selling-to-agents",
      "target_query": "issuing API keys to AI agents automatically",
      "secondary_queries": [
        "automatic API key provisioning for AI agents",
        "payment-triggered API key minting",
        "how to deliver API keys to software buyers without a human",
        "revoking API keys automatically on cancellation"
      ],
      "tags": [
        "api-keys",
        "agents",
        "automation",
        "payments",
        "provisioning",
        "monetization"
      ],
      "published": "2026-07-31",
      "updated": "2026-07-31",
      "words": 1626,
      "takeaways": [
        "Three trigger models exist for minting a key — manual approval, instant self-serve on signup, and payment-confirmed auto-mint — and only the third removes a human from the loop after checkout, which is the shape an agent buyer needs.",
        "A minted key needs at least 128 bits of entropy from a cryptographic random source; ChangeGamer mints 160 bits (20 bytes from `crypto.getRandomValues`) formatted as `cg_` plus 40 hex characters.",
        "Delivery for a machine buyer should be a pollable endpoint an agent can `GET` and parse as JSON, not an inbox a script cannot read — ChangeGamer's webhook writes the key to KV on payment confirmation, and a client polls `/key?session_id=` until it returns 200 instead of 404.",
        "Storing keys as plaintext values in a key-value store keyed by the token itself is a real, working pattern — that is what ChangeGamer does — but it is a tradeoff against hashing at rest, and worth naming as one rather than presenting as best practice.",
        "Automatic revocation needs a second webhook, not just the minting one: ChangeGamer maps each subscription id to its token at mint time so a `customer.subscription.deleted` event can delete the token without any operator action at churn time.",
        "Payment-confirmed auto-mint still is not a keyless, fully agent-autonomous flow — it collapses the human step to one hosted checkout page, once, not to zero."
      ],
      "faq_count": 5,
      "resources": [
        "https://changegamer.ai/resources/paying-for-access-402",
        "https://changegamer.ai/resources/access-and-pricing",
        "https://changegamer.ai/resources/selling-to-agents",
        "https://changegamer.ai/resources/agent-identity-authentication",
        "https://changegamer.ai/resources/mcp-server-authentication",
        "https://changegamer.ai/resources/agent-spend-controls"
      ],
      "html": "https://changegamer.ai/articles/api-key-issuance-for-agents",
      "markdown": "https://changegamer.ai/articles/api-key-issuance-for-agents.md",
      "json": "https://changegamer.ai/api/articles/api-key-issuance-for-agents.json"
    },
    {
      "slug": "pricing-tiers-for-machine-buyers",
      "title": "Pricing Tiers for API and Corpus Access: What Actually Varies Between Them",
      "description": "The axes that actually distinguish one pricing tier from another for a machine buyer — rate limits, content scope, deliverables and license grant — and how ChangeGamer structures its own four tiers around deliverable and license, not gated content.",
      "kind": "sub",
      "order": 6,
      "cluster": "selling-to-agents",
      "target_query": "pricing tiers for API and corpus access",
      "secondary_queries": [
        "how to structure API pricing tiers for agents",
        "corpus license tiers for AI training",
        "tiered API access for machine buyers",
        "what should differ between pricing tiers"
      ],
      "tags": [
        "pricing",
        "tiers",
        "monetization",
        "licensing",
        "agents",
        "api-keys"
      ],
      "published": "2026-08-02",
      "updated": "2026-08-02",
      "words": 1599,
      "takeaways": [
        "A pricing tier for a machine buyer can differ on five axes — rate limit, content/corpus scope, SLA, license grant, and deliverable timing — and a seller does not have to vary all five to have a coherent tier ladder; picking which axes actually move is a design decision, not a default.",
        "ChangeGamer's own four paid tiers (starter, corpus, enterprise, corpus_annual) all unlock the identical premium resource set today — they differ in deliverable (key only, vs. key plus full corpus file) and license grant (internal AI-use vs. added commercial embedding and internal redistribution), not in gated content or rate limit.",
        "Two tiers can share the same access rank while differing in price and billing cadence: `corpus` and `corpus_annual` both rank 2 in ChangeGamer's `TIER_RANK` table — one-time vs. annual is a renewal-and-deliverable difference, not a content-access difference.",
        "A fail-safe tier resolver should default down, never up: ChangeGamer's `resolveTier()` and `tierRank()` treat any unrecognized, absent, or malformed tier value as the lowest tier, so a bug in tier assignment can under-grant access but never over-grant it.",
        "License grant is a legitimate axis to gate on even when content access is not: ChangeGamer's Corpus tier permits internal AI training, indexing, and bulk model-context use, while Enterprise adds commercial embedding and internal cross-org distribution of derived datasets — neither permits public raw-corpus redistribution or resale sublicensing."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/access-and-pricing",
        "https://changegamer.ai/resources/paying-for-access-402",
        "https://changegamer.ai/resources/agent-spend-controls"
      ],
      "html": "https://changegamer.ai/articles/pricing-tiers-for-machine-buyers",
      "markdown": "https://changegamer.ai/articles/pricing-tiers-for-machine-buyers.md",
      "json": "https://changegamer.ai/api/articles/pricing-tiers-for-machine-buyers.json"
    },
    {
      "slug": "agent-spend-limits-and-trust",
      "title": "Agent Spend Limits and Trust: What a Seller Should Verify Before Granting Access",
      "description": "The seller-side counterpart to agent spend controls — how an API operator reads an inbound agent's spend ceiling before granting access, which payment protocols actually prove that ceiling, how to revoke access, and what \"trust\" operationally means for a seller when no portable agent-reputation standard exists yet.",
      "kind": "sub",
      "order": 7,
      "cluster": "selling-to-agents",
      "target_query": "how a seller verifies an AI agent's spend limit before granting access",
      "secondary_queries": [
        "seller-side spend limits for AI agent buyers",
        "how to trust an AI agent's payment authorization",
        "revoking API access from a misbehaving agent",
        "does agent reputation or trust scoring exist"
      ],
      "tags": [
        "spend-controls",
        "trust",
        "agents",
        "payments",
        "x402",
        "revocation",
        "identity",
        "fraud"
      ],
      "published": "2026-08-03",
      "updated": "2026-08-03",
      "words": 1760,
      "takeaways": [
        "A bare Bearer API key tells a seller nothing about what the agent behind it is permitted to spend — x402's `upto` scheme, AP2's Intent Mandate, and ACP's Shared Payment Token each carry a cryptographically signed ceiling the seller can check before granting elevated access, which a static key cannot.",
        "Card-network agent tokens give a seller the cleanest kill switch available today: both Visa and Mastercard support revoking an agent's tokenized credential independently of the user's underlying card, so a seller (or the buyer's bank) can shut off one misbehaving agent without disrupting the human it acts for.",
        "Verified identity and a bounded, revocable payment ceiling are the two things a seller can actually check today — no portable agent-reputation or trust-score standard exists in the corpus as of August 2026, so \"trust\" for a seller currently means bounding the blast radius of an unknown counterparty, not scoring its history.",
        "Identity and authorization are separate checks a seller has to run independently: OAuth 2.1 for a remote MCP server proves a caller holds a validly issued, correctly audience-bound token, while a signed payment mandate proves a spend ceiling — neither one substitutes for the other.",
        "ChangeGamer's own revocation path (a Stripe subscription-cancellation webhook that deletes the token) is a working seller-side kill switch, but its worker has no per-key rate limit today — a real gap for a seller trying to bound how fast a single valid credential can be hit by a looping agent."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/agent-spend-controls",
        "https://changegamer.ai/resources/agentic-payment-protocols",
        "https://changegamer.ai/resources/agent-wallets-x402",
        "https://changegamer.ai/resources/agent-identity-authentication",
        "https://changegamer.ai/resources/mcp-server-authentication",
        "https://changegamer.ai/resources/agentic-security-checklist"
      ],
      "html": "https://changegamer.ai/articles/agent-spend-limits-and-trust",
      "markdown": "https://changegamer.ai/articles/agent-spend-limits-and-trust.md",
      "json": "https://changegamer.ai/api/articles/agent-spend-limits-and-trust.json"
    },
    {
      "slug": "refunds-and-disputes-with-agent-buyers",
      "title": "Refunds and Disputes with Agent Buyers: What a Seller Actually Does",
      "description": "What happens on the seller side when an autonomous agent's purchase needs to be reversed or is disputed — API-key refund mechanics, why x402 settlement cannot be undone, what card-token revocation does and does not prove, and what to log before you reverse anything.",
      "kind": "sub",
      "order": 8,
      "cluster": "selling-to-agents",
      "target_query": "how sellers handle refunds and disputes from AI agent buyers",
      "secondary_queries": [
        "refunds for automated agent purchases",
        "can an x402 payment be reversed",
        "disputing a purchase an AI agent made",
        "chargeback on an AI agent card token"
      ],
      "tags": [
        "refunds",
        "disputes",
        "chargebacks",
        "payments",
        "x402",
        "agents",
        "monetization"
      ],
      "published": "2026-08-03",
      "updated": "2026-08-03",
      "words": 1508,
      "takeaways": [
        "A one-time digital purchase and a subscription behave differently under EU withdrawal rules once delivery has happened: ChangeGamer's own tiers state that the 14-day right of withdrawal lapses on delivery of the digital deliverable, so a refund is realistically only available if the key or corpus file was never actually delivered — not because the buyer changed its mind after receiving it.",
        "Cancelling ChangeGamer's annual Corpus Updates subscription through the Stripe customer portal stops future renewals; it does not, by itself, refund the period already paid for — a refund on the current period is only offered if no corpus file was delivered during it.",
        "A settled x402 stablecoin payment has no documented reversal mechanism in this corpus: Apify's deposit-and-refund pattern for its `upto` scheme returns unused funds before final settlement on a variable-cost run, which is a different thing from undoing a payment that has already settled on-chain.",
        "Visa and Mastercard both document revoking an agent's tokenized card credential — a seller- or issuer-triggered kill switch — but neither the corpus nor a source verified this session documents that ordinary cardholder chargeback rights literally apply to a transaction made through an agent token; treat that continuity as a reasonable inference from normal card-rail behavior, not a confirmed policy.",
        "AP2 Intent/Cart/Payment Mandates and ACP Shared Payment Tokens prove that a purchase was authorized up to a signed ceiling at the moment it was made — neither protocol's documentation in this corpus describes a real dispute case or an issuer liability rule for what happens when a human principal later claims their agent exceeded that authorization.",
        "A seller's dispute runbook should separate three different questions before reversing anything: was the deliverable actually sent, was the payment actually settled or only authorized, and does the authorization on file (mandate, token, or subscription record) actually cover what was charged."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/access-and-pricing",
        "https://changegamer.ai/resources/agentic-payment-protocols",
        "https://changegamer.ai/resources/agent-wallets-x402",
        "https://changegamer.ai/resources/agent-spend-controls",
        "https://changegamer.ai/resources/selling-to-agents",
        "https://changegamer.ai/resources/paying-for-access-402"
      ],
      "html": "https://changegamer.ai/articles/refunds-and-disputes-with-agent-buyers",
      "markdown": "https://changegamer.ai/articles/refunds-and-disputes-with-agent-buyers.md",
      "json": "https://changegamer.ai/api/articles/refunds-and-disputes-with-agent-buyers.json"
    },
    {
      "slug": "packaging-a-corpus-as-a-product",
      "title": "Packaging a Corpus as a Product: Format, Schema, Versioning and Delivery",
      "description": "The packaging decisions behind selling a content corpus as a dataset product — export format, the free-sample/gated-full split, a per-record metadata schema, a corpus version number, and which of three delivery mechanisms to use — grounded in ChangeGamer's own three real export formats.",
      "kind": "sub",
      "order": 9,
      "cluster": "selling-to-agents",
      "target_query": "how to package content as a dataset product",
      "secondary_queries": [
        "corpus export format for RAG and fine-tuning",
        "versioning a dataset product",
        "how to deliver a licensed content corpus to buyers",
        "NDJSON vs full-text dump for a dataset export"
      ],
      "tags": [
        "corpus",
        "packaging",
        "ndjson",
        "versioning",
        "delivery",
        "monetization",
        "agents"
      ],
      "published": "2026-08-04",
      "updated": "2026-08-04",
      "words": 1622,
      "takeaways": [
        "A dataset product needs at least two export shapes, not one: a line-delimited record format for RAG/fine-tuning ingestion (NDJSON) and, if the buyer is meant to fine-tune directly, a chat-message format matching a training API's expected schema — a single flat text dump satisfies neither use case well.",
        "The honest way to run a free sample next to a gated full export is field-level asymmetry, not a shorter file: ChangeGamer's free `/api/corpus.jsonl` nulls out premium record bodies and adds an `access` pointer object only to those null records, while the gated `/api/corpus.full.jsonl` always populates `text` and never carries an `access` field at all — the sample and the product are structurally different files, not the same file truncated.",
        "A corpus version number and an MCP server version number answer different questions and should not be kept in lockstep: one tracks whether the content/schema changed, the other tracks the server manifest, and forcing them to match creates false-positive re-pull signals for a buyer who only cares about the first.",
        "A per-record JSON Schema is what lets a buyer validate an export programmatically instead of reverse-engineering field shapes from a sample — ChangeGamer publishes one at `/api/corpus.schema.json`, derived live from the same source data it describes so the two cannot drift apart.",
        "Pull endpoint, emailed file, and MCP tool are three delivery mechanisms with genuinely different latency and trust profiles, and a dataset seller should offer more than one rather than picking whichever is easiest to build first."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/access-and-pricing"
      ],
      "html": "https://changegamer.ai/articles/packaging-a-corpus-as-a-product",
      "markdown": "https://changegamer.ai/articles/packaging-a-corpus-as-a-product.md",
      "json": "https://changegamer.ai/api/articles/packaging-a-corpus-as-a-product.json"
    },
    {
      "slug": "discoverability-for-paid-agent-apis",
      "title": "How Do AI Agents Discover Paid APIs? A Guide to Every Surface",
      "description": "How an AI agent finds out a paid API or resource exists before it ever reads a price: llms.txt, the JSON API index, MCP registries, incidental 402 discovery, x402 auto-listing, and what .well-known does and does not cover.",
      "kind": "sub",
      "order": 10,
      "cluster": "selling-to-agents",
      "target_query": "how do AI agents discover paid APIs",
      "secondary_queries": [
        "how does an agent find a paid API",
        "AI agent discovery surfaces for paid content",
        "llms.txt vs MCP registry vs x402 discovery",
        "how do agents find out an endpoint is payable"
      ],
      "tags": [
        "discovery",
        "llms.txt",
        "mcp",
        "x402",
        "agents",
        "json-api"
      ],
      "published": "2026-08-04",
      "updated": "2026-08-04",
      "words": 1576,
      "takeaways": [
        "An agent discovers a paid surface in one of two modes that call for different designs: proactive discovery, where it is specifically shopping for a capability and reads an index before touching anything gated, and reactive discovery, where it stumbles into a 402 mid-task and learns the paid surface exists only at that moment.",
        "Four proactive surfaces matter as of August 2026: a curated `/llms.txt` index, a JSON API index such as `/api/resources.json`, listing in an MCP registry or aggregator, and automatic inclusion in the x402 Bazaar the moment a first payment settles — none of these require the same investment, and a seller can be found by some without building all four.",
        "There is no established `.well-known` convention for discovering prices or offers. The corpus confirms `.well-known` conventions for identity and auth discovery only — `/.well-known/agent-card.json` for A2A agent identity, `/.well-known/oauth-protected-resource` and `/.well-known/oauth-authorization-server` for MCP OAuth — none of it is about what something costs.",
        "For an agent with a fixed, single-fetch discovery budget, an `/llms.txt` or JSON index fetch outranks an MCP connection attempt: it costs one HTTP GET with no handshake, no auth negotiation, and no persistent session, and it can point onward to everything else in the same response.",
        "A seller with no MCP server and no x402 activity is still discoverable through llms.txt and a JSON API index alone — it is a weaker footprint, reaching only agents that already crawl or fetch directly, but it is not a non-starter, and it is the cheapest surface to stand up first.",
        "The x402 Bazaar inverts the usual order of marketing and revenue: a seller does not submit a listing, the facilitator auto-catalogs the endpoint the first time it settles a payment for it, so the first sale is the listing event, not the result of one."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/json-api",
        "https://changegamer.ai/resources/llms-txt-explained",
        "https://changegamer.ai/resources/mcp-server-discovery",
        "https://changegamer.ai/resources/agentic-payment-protocols",
        "https://changegamer.ai/resources/agent-wallets-x402",
        "https://changegamer.ai/resources/paying-for-access-402",
        "https://changegamer.ai/resources/mcp-vs-a2a",
        "https://changegamer.ai/resources/mcp-server-authentication"
      ],
      "html": "https://changegamer.ai/articles/discoverability-for-paid-agent-apis",
      "markdown": "https://changegamer.ai/articles/discoverability-for-paid-agent-apis.md",
      "json": "https://changegamer.ai/api/articles/discoverability-for-paid-agent-apis.json"
    },
    {
      "slug": "fraud-and-abuse-from-agent-traffic",
      "title": "Fraud and Abuse from AI Agent Traffic: What a Seller Should Detect",
      "description": "How a seller of APIs, content, or tools to AI agents spots and mitigates abuse once access is already granted — key sharing, over-scope scraping, spend-ceiling circumvention, spoofed identity, and rate-limit evasion patterns specific to autonomous agents.",
      "kind": "sub",
      "order": 11,
      "cluster": "selling-to-agents",
      "target_query": "preventing abuse from AI agent traffic",
      "secondary_queries": [
        "detecting API key sharing by AI agents",
        "AI agent scraping beyond licensed tier",
        "spoofed AI agent identity",
        "rate limit evasion by autonomous agents",
        "refund abuse patterns from AI agent buyers"
      ],
      "tags": [
        "fraud",
        "abuse",
        "security",
        "agents",
        "rate-limits",
        "identity",
        "x402",
        "monetization"
      ],
      "published": "2026-08-05",
      "updated": "2026-08-05",
      "words": 1602,
      "takeaways": [
        "A shared or leaked API key looks identical to legitimate use at the credential layer — the [agentic security checklist](/resources/agentic-security-checklist) recommendation that applies directly here is per-identifier logging with a unique trace id, which lets a seller see the same key called from patterns no single agent produces, rather than trying to detect sharing from the key itself.",
        "Web Bot Auth (RFC 9421 HTTP Message Signatures) exists specifically because a User-Agent string and IP range can be spoofed by anyone — as of July 1, 2026 Cloudflare folds signed agents into its Verified Bots classification, so a seller checking for a valid signature over an unauthenticated identity claim closes the cheapest spoofing vector first.",
        "A settled x402 payment is not a reusable credential: the verify-then-settle round trip against a facilitator checks a specific signed authorization once, so a captured payment header replayed against a second request has no documented path to a second successful settlement in this corpus.",
        "A total spend cap does not catch a fast loop in time — the practitioner pattern named in [agent spend controls](/resources/agent-spend-controls) is rate-of-spend (velocity) monitoring at a fixed sampling interval, and the same logic applies to a seller watching request volume from one key rather than a buyer watching wallet balance.",
        "Repeated refund or dispute claims tied to the same underlying identity — the same wallet, the same mandate signer, the same agent credential — across multiple purchases is a pattern-detection problem for a seller, separate from processing any single refund correctly.",
        "None of the payment or identity protocols in this corpus (x402, AP2, ACP, card-network agent tokens) publish a fraud-scoring or anomaly-detection feature as of August 2026 — a seller has to build velocity and pattern detection on its own request and payment logs, not rely on the rail to flag abuse for it."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/agentic-security-checklist",
        "https://changegamer.ai/resources/agent-identity-authentication",
        "https://changegamer.ai/resources/handling-rate-limits-and-retries",
        "https://changegamer.ai/resources/agent-spend-controls",
        "https://changegamer.ai/resources/web-bot-auth",
        "https://changegamer.ai/resources/agentic-payment-protocols",
        "https://changegamer.ai/resources/agent-wallets-x402",
        "https://changegamer.ai/resources/access-and-pricing"
      ],
      "html": "https://changegamer.ai/articles/fraud-and-abuse-from-agent-traffic",
      "markdown": "https://changegamer.ai/articles/fraud-and-abuse-from-agent-traffic.md",
      "json": "https://changegamer.ai/api/articles/fraud-and-abuse-from-agent-traffic.json"
    },
    {
      "slug": "measuring-agent-revenue",
      "title": "Measuring Revenue from AI Agent Traffic: Beyond the Traffic Log",
      "description": "The revenue-layer fields and queries a seller adds on top of a general traffic log — authorized-vs-settled, revenue per rail, revenue per tier, and how to avoid double-counting a webhook retry as two sales.",
      "kind": "sub",
      "order": 12,
      "cluster": "selling-to-agents",
      "target_query": "measuring revenue from AI agent traffic",
      "secondary_queries": [
        "how to track revenue from AI agent purchases",
        "x402 settlement vs authorization for revenue reporting",
        "avoiding double counted revenue from Stripe webhook retries",
        "revenue per payment rail for agent sales"
      ],
      "tags": [
        "analytics",
        "revenue",
        "measurement",
        "x402",
        "payments",
        "agents",
        "monetization"
      ],
      "published": "2026-08-05",
      "updated": "2026-08-05",
      "words": 1636,
      "takeaways": [
        "A `payment_required` or `upgrade` row in a traffic log is a signal of interest, not revenue — revenue exists only once a payment is actually settled, which for the key rail means a webhook-triggered mint and for x402 means an `X-PAYMENT-RESPONSE` settlement receipt, not the initial 402 or the initial `X-PAYMENT` retry.",
        "A revenue log needs at least four fields a general traffic log does not carry: a unique settlement or session id, the rail used, the tier or price actually charged, and a settled/authorized status — without the id, a Stripe webhook retry gets counted as a second sale.",
        "On ChangeGamer today, only one of its three rails has any measured revenue at all: the Stripe key-sale rail is live, native x402 returns HTTP 503 and settles nothing, and the RSL crawl-license rate is declared but not collected — so a revenue query grouped by rail should show two rows at zero no matter what the underlying traffic log says.",
        "The RSL declared rate (US$0.05 per crawl) and the 402 JSON body's `price_usd` field (also \"0.05\") are different numbers in different number spaces that happen to share a digit — a revenue query that sums them as one figure is wrong by construction, not just imprecise.",
        "The `upgrade` outcome — a valid key of insufficient tier hitting the paywall again — is the cleanest observable repeat-interest signal in the log, and counting it over time is a legitimate starting point for a revenue-over-time view even before enough purchases exist to compute anything resembling lifetime value."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/access-and-pricing",
        "https://changegamer.ai/resources/paying-for-access-402",
        "https://changegamer.ai/resources/agent-wallets-x402",
        "https://changegamer.ai/resources/selling-to-agents"
      ],
      "html": "https://changegamer.ai/articles/measuring-agent-revenue",
      "markdown": "https://changegamer.ai/articles/measuring-agent-revenue.md",
      "json": "https://changegamer.ai/api/articles/measuring-agent-revenue.json"
    },
    {
      "slug": "mcp-server-in-production",
      "title": "MCP Server in Production: How to Build, Ship and Run One",
      "description": "The operator playbook for taking an MCP server past the quickstart: transport choice, OAuth 2.1 auth, tool design, versioning against a moving spec, testing across clients, distribution, observability, cost and the failure modes that show up once real clients connect.",
      "kind": "pillar",
      "order": 0,
      "cluster": "mcp-in-practice",
      "target_query": "how to build and run an MCP server in production",
      "secondary_queries": [
        "MCP server production checklist",
        "stdio vs streamable HTTP MCP transport",
        "OAuth 2.1 PKCE for MCP servers",
        "testing MCP servers across different clients",
        "MCP server observability and cost"
      ],
      "tags": [
        "mcp",
        "agents",
        "protocols",
        "production",
        "oauth",
        "observability",
        "tool-calling"
      ],
      "published": "2026-08-06",
      "updated": "2026-08-06",
      "words": 5876,
      "takeaways": [
        "A working demo and a production MCP server differ in exactly seven places: transport, auth, tool design, spec versioning, cross-client testing, distribution, and the observability/cost/failure-mode instrumentation around all of it. Skipping any one of them is what turns into an incident once real clients connect.",
        "Transport is a deployment decision, not a preference: stdio for a local, single-user tool with zero network exposure; Streamable HTTP for anything shared, remote or multi-tenant. As of the 2026-07-28 spec revision, Streamable HTTP is also stateless by default — no session handshake, no `Mcp-Session-Id` — so any state your server needs has to be an explicit handle the model passes back as a tool argument.",
        "Remote servers must speak OAuth 2.1 with mandatory PKCE (S256 only) and must never forward a client-presented Bearer token to an upstream API — that is a confused-deputy vulnerability the spec explicitly forbids, not a style preference.",
        "A tool description is attacker-controlled surface, not documentation. It ships to the model as trusted-looking text, which is exactly why a malicious or compromised server can use it to inject instructions — audit every description before connecting to a third-party server, and treat your own descriptions as something a red-teamer will read.",
        "The spec is a moving target: the MCP 2026-07-28 revision — its largest since launch — shipped final, on schedule, on that date, deprecating Sampling, Roots and Logging and removing the session handshake entirely. Anything you read about MCP transports or auth, including in this article, needs a date attached and should be reverified against modelcontextprotocol.io before you build against it."
      ],
      "faq_count": 5,
      "resources": [
        "https://changegamer.ai/resources/mcp-server-discovery",
        "https://changegamer.ai/resources/mcp-primitives",
        "https://changegamer.ai/resources/building-mcp-servers",
        "https://changegamer.ai/resources/mcp-server-authentication",
        "https://changegamer.ai/resources/mcp-vs-a2a",
        "https://changegamer.ai/resources/mcp-vs-function-calling",
        "https://changegamer.ai/resources/mcp-apps-explained",
        "https://changegamer.ai/resources/mcp-2026-spec-revision",
        "https://changegamer.ai/resources/agentic-security-checklist",
        "https://changegamer.ai/resources/agent-observability",
        "https://changegamer.ai/resources/durable-execution-for-agents",
        "https://changegamer.ai/resources/testing-ai-agents",
        "https://changegamer.ai/resources/reliable-tool-calling",
        "https://changegamer.ai/resources/agent-cost-latency-optimization",
        "https://changegamer.ai/resources/webmcp"
      ],
      "html": "https://changegamer.ai/articles/mcp-server-in-production",
      "markdown": "https://changegamer.ai/articles/mcp-server-in-production.md",
      "json": "https://changegamer.ai/api/articles/mcp-server-in-production.json"
    },
    {
      "slug": "mcp-stdio-vs-streamable-http",
      "title": "stdio vs. Streamable HTTP for MCP Servers: A Decision Framework",
      "description": "Which MCP transport to build against and why: the single-client-vs-shared decision rule, how state works without a session handshake under the 2026-07-28 spec, the auth-model switching cost, and what actually breaks migrating off HTTP+SSE.",
      "kind": "sub",
      "order": 1,
      "cluster": "mcp-in-practice",
      "target_query": "stdio vs Streamable HTTP for MCP servers",
      "secondary_queries": [
        "MCP session handle without Mcp-Session-Id",
        "migrating MCP server from HTTP+SSE to Streamable HTTP",
        "does stdio MCP server need OAuth"
      ],
      "tags": [
        "mcp",
        "agents",
        "protocols",
        "transport",
        "oauth",
        "production"
      ],
      "published": "2026-08-06",
      "updated": "2026-08-06",
      "words": 1628,
      "takeaways": [
        "Pick transport by counting clients and machines, not by feature preference: stdio if the server and its one client always run on the same machine, Streamable HTTP the moment a second user, a second client, or a remote deployment enters the picture.",
        "As of the 2026-07-28 spec revision, Streamable HTTP dropped the `initialize`/`initialized` handshake and the `Mcp-Session-Id` header entirely — any request can land on any server instance, and a server that needs cross-call state (a basket, a wizard step) has to mint its own opaque handle and have the model pass it back as an ordinary tool argument on the next call.",
        "Moving a server from stdio to Streamable HTTP is not a drop-in swap of the transport binding — it is also an auth-model change, from \"no OAuth surface, credentials via environment variables\" to \"OAuth 2.1 required if the server authenticates at all,\" and it is legitimate to land on the unauthenticated end of that range for a public, read-only server.",
        "Migrating an existing server off the deprecated HTTP+SSE transport means re-deriving your auth model, not just re-pointing a client library — HTTP+SSE and Streamable HTTP have different auth surfaces, and any code that assumed a stable session ID will misbehave under the stateless 2026-07-28 model unless you replace that assumption with an explicit handle.",
        "WebMCP is not a third MCP transport and does not belong in this decision — it is a same-tab, no-network-hop browser API for a page to expose tools to an in-browser agent, explicitly distinct from MCP's client-server model."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/building-mcp-servers",
        "https://changegamer.ai/resources/mcp-server-authentication",
        "https://changegamer.ai/resources/mcp-2026-spec-revision",
        "https://changegamer.ai/resources/webmcp"
      ],
      "html": "https://changegamer.ai/articles/mcp-stdio-vs-streamable-http",
      "markdown": "https://changegamer.ai/articles/mcp-stdio-vs-streamable-http.md",
      "json": "https://changegamer.ai/api/articles/mcp-stdio-vs-streamable-http.json"
    },
    {
      "slug": "mcp-oauth-implementation",
      "title": "How to Implement OAuth 2.1 for an MCP Server",
      "description": "A wire-level implementation walkthrough for OAuth 2.1 on a remote MCP server: what the discovery documents actually contain, CIMD vs. Dynamic Client Registration in your server code, per-SEP detail from the 2026-07-28 hardening set, and token-validation mechanics.",
      "kind": "sub",
      "order": 2,
      "cluster": "mcp-in-practice",
      "target_query": "how to implement OAuth 2.1 for an MCP server",
      "secondary_queries": [
        "oauth-protected-resource metadata fields",
        "CIMD vs Dynamic Client Registration for MCP",
        "validating MCP OAuth token audience and issuer"
      ],
      "tags": [
        "mcp",
        "agents",
        "protocols",
        "oauth",
        "security",
        "production"
      ],
      "published": "2026-08-07",
      "updated": "2026-08-07",
      "words": 1548,
      "takeaways": [
        "The discovery chain is two JSON documents a client fetches before it ever authenticates: `/.well-known/oauth-protected-resource` (RFC 9728), which lists the authorization servers your server trusts, and `/.well-known/oauth-authorization-server` (RFC 8414) on that AS, which returns `authorization_endpoint`, `token_endpoint` and `registration_endpoint` — get either response wrong and no client can complete the flow.",
        "A Client ID Metadata Document (CIMD) replaces server-side client registration with a fetch: the `client_id` your server receives is itself an HTTPS URL, and your authorization server resolves it by fetching that URL for a JSON document describing the client, instead of looking up a row a Dynamic Client Registration call previously wrote to a database.",
        "Of the six 2026-07-28 authorization-hardening SEPs, three change what a server must actively validate or emit: SEP-2468 requires checking the `iss` claim against RFC 9207, SEP-837 adds an `application_type` field your registration handler has to read, and SEP-2350 requires accepting incremental scope requests during step-up re-authorization instead of forcing a full re-grant.",
        "Token validation on every request is three checks, not one: audience (does the `aud` claim match this server's URL), issuer (does `iss` match the authorization server your Protected Resource Metadata actually names), and signature/validity (via the AS's published keys or an introspection call) — a token that passes only the first check is still forgeable or replayable.",
        "A rejected request should look like a signpost, not a dead end: an HTTP 401 whose `WWW-Authenticate` header points back at your Protected Resource Metadata document, so a compliant client can restart discovery instead of failing silently."
      ],
      "faq_count": 3,
      "resources": [
        "https://changegamer.ai/resources/mcp-server-authentication",
        "https://changegamer.ai/resources/mcp-2026-spec-revision",
        "https://changegamer.ai/resources/agentic-security-checklist",
        "https://changegamer.ai/resources/building-mcp-servers"
      ],
      "html": "https://changegamer.ai/articles/mcp-oauth-implementation",
      "markdown": "https://changegamer.ai/articles/mcp-oauth-implementation.md",
      "json": "https://changegamer.ai/api/articles/mcp-oauth-implementation.json"
    },
    {
      "slug": "mcp-tool-description-injection",
      "title": "Defending MCP Clients Against Tool Description and Output Injection",
      "description": "Two distinct MCP injection surfaces — a tool description at connect-time and a tool's return value at call-time — and the client-side architectural patterns (Dual LLM, Action-Selector, Context-Minimization) that contain each one.",
      "kind": "sub",
      "order": 3,
      "cluster": "mcp-in-practice",
      "target_query": "MCP tool description injection and tool poisoning defense",
      "secondary_queries": [
        "MCP tool poisoning",
        "is MCP tool output trusted",
        "Dual LLM pattern for MCP tool calls",
        "MCP tool call result prompt injection"
      ],
      "tags": [
        "mcp",
        "agents",
        "security",
        "prompt-injection",
        "tool-calling",
        "architecture"
      ],
      "published": "2026-08-07",
      "updated": "2026-08-07",
      "words": 1545,
      "takeaways": [
        "MCP gives an attacker two separate injection surfaces, not one: a tool's description and schema at connect-time (does the tool's stated purpose lie or later change), and a tool's return value at call-time (does a normal, unmodified call return attacker-controlled content). Defending one does not defend the other.",
        "The call-time surface does not require a compromised or updated server — a search, fetch, or document-read tool that faithfully executes its stated purpose can still return content, from a source the server itself does not control, that carries embedded instructions on every single invocation.",
        "Of the six architectural prompt-injection patterns catalogued for agents generally, Dual LLM and Action-Selector map most directly onto an MCP client: the model that holds tool-call authority should never read a third-party tool's raw output directly, and a client that dynamically discovers tools from a remote server should still constrain what those tools can be composed into, not treat discovery as free-form capability grant.",
        "The agentic security checklist's guidance to \"validate that tool outputs conform to the expected schema and type before the model acts on them\" and to treat all tool responses as untrusted data applies to MCP tool-call results specifically, not just to web or RAG content — a `text` content block from an MCP `tools/call` response is exactly the kind of unstructured, attacker-reachable field that guidance is written for.",
        "This is a content-trust problem, not an authorization problem: OAuth 2.1 and scoped tokens govern who may call a tool, not whether that tool's output is safe for the calling model to read as instructions — see the OAuth mechanics in the companion article on MCP auth."
      ],
      "faq_count": 3,
      "resources": [
        "https://changegamer.ai/resources/prompt-injection-design-patterns",
        "https://changegamer.ai/resources/agentic-security-checklist",
        "https://changegamer.ai/resources/mcp-server-discovery"
      ],
      "html": "https://changegamer.ai/articles/mcp-tool-description-injection",
      "markdown": "https://changegamer.ai/articles/mcp-tool-description-injection.md",
      "json": "https://changegamer.ai/api/articles/mcp-tool-description-injection.json"
    },
    {
      "slug": "testing-mcp-servers-in-ci",
      "title": "How to Test an MCP Server in CI",
      "description": "The implementation mechanics below the three-layer test pyramid: what a mocked MCP transport actually replaces, what a Streamable HTTP cassette contains, a concrete CI job/trigger shape, and how to catch spec-version drift before it reaches production.",
      "kind": "sub",
      "order": 4,
      "cluster": "mcp-in-practice",
      "target_query": "how to test an MCP server",
      "secondary_queries": [
        "mocking the MCP transport in unit tests",
        "recording MCP tool call cassettes",
        "MCP server CI pipeline nightly smoke tests",
        "catching MCP spec drift with tests"
      ],
      "tags": [
        "mcp",
        "testing",
        "ci",
        "agents",
        "tool-calling"
      ],
      "published": "2026-08-09",
      "updated": "2026-08-09",
      "words": 1337,
      "takeaways": [
        "An MCP server's Layer 1 unit tests mock the transport, not the model — most servers don't call an LLM at all, so the seam you replace is the JSON-RPC channel your handlers sit behind, not an LLM client the way generic agent testing does.",
        "Cassette-style record/replay is confirmed to work for a Streamable HTTP MCP server, because every message on that transport is literally an HTTP POST to one endpoint; there is no confirmed equivalent for stdio's raw stdin/stdout exchange, so treat \"record once, replay in CI, scrub credentials\" as a pattern to adapt for stdio, not a library that already does it.",
        "Layer 3 live smoke tests belong on a separate CI job definition, not just a separate test file — a nightly or pre-release schedule with its own cost budget, distinct from the job that gates every push and pull request.",
        "An MCP SDK version bump is itself a legitimate reason to re-run the full pyramid, deliberately: a Layer 1 or Layer 2 test that asserts the negotiated `protocolVersion` explicitly is what turns a breaking version change into a caught test failure instead of a silent production break."
      ],
      "faq_count": 3,
      "resources": [
        "https://changegamer.ai/resources/testing-ai-agents",
        "https://changegamer.ai/resources/building-mcp-servers",
        "https://changegamer.ai/resources/reliable-tool-calling"
      ],
      "html": "https://changegamer.ai/articles/testing-mcp-servers-in-ci",
      "markdown": "https://changegamer.ai/articles/testing-mcp-servers-in-ci.md",
      "json": "https://changegamer.ai/api/articles/testing-mcp-servers-in-ci.json"
    },
    {
      "slug": "mcp-server-versioning-and-spec-migration",
      "title": "MCP Server Versioning and Spec Migration: An Operator Playbook",
      "description": "A migration runbook for MCP server operators: feature-detecting via capabilities instead of hard protocolVersion branching, a dual-version fleet rollout with rollback triggers, a compatibility shim for legacy clients still sending initialize, and a deprecation calendar built off the 12-month SEP-2577 floor.",
      "kind": "sub",
      "order": 5,
      "cluster": "mcp-in-practice",
      "target_query": "how to version an MCP server against a changing spec",
      "secondary_queries": [
        "MCP server migration runbook",
        "MCP protocolVersion feature detection",
        "legacy MCP client initialize handshake compatibility",
        "MCP spec deprecation window"
      ],
      "tags": [
        "mcp",
        "agents",
        "protocols",
        "versioning",
        "migration",
        "production"
      ],
      "published": "2026-08-11",
      "updated": "2026-08-11",
      "words": 1463,
      "takeaways": [
        "The 2026-07-28 MCP spec revision removed the initialize/initialized handshake entirely (SEP-2575) along with the Mcp-Session-Id header (SEP-2567); client capabilities, previously sent only during that handshake, now travel in a `_meta` field on every request instead. Any guide describing \"pinning protocolVersion during the initialize handshake\" is describing pre-2026-07-28 behavior, not the current mechanism.",
        "Feature-detect off declared capabilities, not off a hard-coded protocolVersion string comparison — a server or client that branches on an exact version string breaks the moment a new patch-level revision ships with the same capability set, while capability-based branching keeps working.",
        "A server fleet migrating across a spec revision should run old and new code side by side behind version-tagged, canaried traffic, with an explicit rollback trigger (a spike in malformed-request or protocolVersion-mismatch rates, not a fixed timer) rather than a single flag-day cutover.",
        "SEP-2577's 12-month deprecation floor is a concrete calendar item, not just a policy statement: Sampling, Roots and Logging were deprecated on 2026-07-28, so the earliest the spec permits their removal is 2027-07-28 — treat that date as a deadline to have migrated off them, not a date to start thinking about it.",
        "There is no published, spec-defined mechanism for how a post-2026-07-28 stateless server should respond to a legacy client that still opens with an initialize call — any compatibility shim for that case is an operator-built workaround, not a documented protocol feature, and should be tested against a real legacy client rather than assumed to work."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/mcp-2026-spec-revision",
        "https://changegamer.ai/resources/mcp-primitives"
      ],
      "html": "https://changegamer.ai/articles/mcp-server-versioning-and-spec-migration",
      "markdown": "https://changegamer.ai/articles/mcp-server-versioning-and-spec-migration.md",
      "json": "https://changegamer.ai/api/articles/mcp-server-versioning-and-spec-migration.json"
    },
    {
      "slug": "mcp-server-observability-opentelemetry",
      "title": "MCP Server Observability with OpenTelemetry: Spans, Metrics, and Trace Correlation",
      "description": "Instrumenting an MCP server past the pillar's baseline: what to put on a tool-call span beyond gen_ai.tool.name, what replaces the deprecated Logging primitive in practice, per-tool-name latency and error-rate metrics, and how a trace ID actually survives the agent-to-upstream-API hop.",
      "kind": "sub",
      "order": 6,
      "cluster": "mcp-in-practice",
      "target_query": "MCP server observability with OpenTelemetry",
      "secondary_queries": [
        "OpenTelemetry MCP tool call span attributes",
        "MCP server per-tool latency and error rate metrics",
        "MCP trace correlation across agent client server upstream API",
        "MCP logging primitive deprecated alternative"
      ],
      "tags": [
        "mcp",
        "observability",
        "opentelemetry",
        "tracing",
        "metrics",
        "agents",
        "production"
      ],
      "published": "2026-08-11",
      "updated": "2026-08-11",
      "words": 1683,
      "takeaways": [
        "A tool-call span on an MCP server should carry MCP-specific identifiers on top of the generic `gen_ai.tool.name` attribute — server name/version, transport (stdio vs. Streamable HTTP), the negotiated protocolVersion, and the request's JSON-RPC id — but as of August 2026 no confirmed joint MCP-OpenTelemetry semantic convention defines those attribute names; treat this as a practitioner-level naming convention you own, not a spec you are implementing.",
        "SEP-2577, final on 2026-07-28, marked the Logging primitive deprecated alongside Sampling and Roots — annotation-only, still functional, not eligible for removal before 2027-07-28. That deprecation is the trigger to route structured operational logs through your own OTel span events going forward rather than build anything new on Logging; that recommendation is this article's own guidance, not something the spec mandates as Logging's replacement.",
        "Per-tool-name p50/p95 latency and per-tool-name error rate, aggregated across calls into a dashboard rather than logged per-call, catch a single tool degrading inside a server whose overall request rate and average latency still look healthy — this is a metrics-layer concern distinct from both generic HTTP metrics and the pillar's per-call span logging.",
        "The MCP spec does not mandate trace-context propagation at all. Carrying one trace ID across the fourth hop — agent, to MCP client, to your MCP server, to whatever upstream API your server calls — is standard OpenTelemetry `traceparent` propagation applied by the operator across that hop, not a protocol guarantee every client or upstream honors."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/agent-observability",
        "https://changegamer.ai/resources/mcp-primitives"
      ],
      "html": "https://changegamer.ai/articles/mcp-server-observability-opentelemetry",
      "markdown": "https://changegamer.ai/articles/mcp-server-observability-opentelemetry.md",
      "json": "https://changegamer.ai/api/articles/mcp-server-observability-opentelemetry.json"
    },
    {
      "slug": "mcp-server-registry-publishing-playbook",
      "title": "How to Publish an MCP Server to the Official Registry",
      "description": "A step-by-step walkthrough of the mcp-publisher CLI and the server.json manifest for publishing an MCP server to registry.modelcontextprotocol.io, how to republish after a version bump, and how the registry relates to aggregators, marketplaces, and direct distribution.",
      "kind": "sub",
      "order": 7,
      "cluster": "mcp-in-practice",
      "target_query": "how to publish an MCP server to the official registry",
      "secondary_queries": [
        "server.json manifest fields for the MCP registry",
        "mcp-publisher CLI walkthrough",
        "updating a published MCP registry listing",
        "submitting an MCP server to PulseMCP Smithery Glama MCP.so"
      ],
      "tags": [
        "mcp",
        "registry",
        "publishing",
        "distribution",
        "agents",
        "production"
      ],
      "published": "2026-08-15",
      "updated": "2026-08-15",
      "words": 1214,
      "takeaways": [
        "Publishing an MCP server to the official registry runs through four mcp-publisher CLI steps — init, editing the generated server.json, mcp-publisher login github, and mcp-publisher publish — and none of them uploads the server package itself, which has to already exist on npm, PyPI, or another artifact registry first.",
        "A server.json manifest for the MCP registry states at minimum the server's name, version, transport type, and endpoint URL, validated against the schema at https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json; the schema defines further fields beyond those four, so consult it directly rather than assuming a field name this article has not stated.",
        "Updating a registry listing after a new release starts outside the registry entirely: the new package version has to reach npm, PyPI, or wherever it lives first, because the registry stores metadata only and never hosts the package itself.",
        "The official MCP registry remained in preview as of mid-2026, roughly a year after its September 2025 preview launch backed by Anthropic, GitHub, PulseMCP, and Microsoft.",
        "Community aggregators such as PulseMCP, Smithery, Glama, and MCP.so vary considerably in how rigorously they vet listings, so a server's presence on one is worth treating as a lead to investigate rather than an endorsement of its safety."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/mcp-server-discovery",
        "https://changegamer.ai/resources/building-mcp-servers"
      ],
      "html": "https://changegamer.ai/articles/mcp-server-registry-publishing-playbook",
      "markdown": "https://changegamer.ai/articles/mcp-server-registry-publishing-playbook.md",
      "json": "https://changegamer.ai/api/articles/mcp-server-registry-publishing-playbook.json"
    },
    {
      "slug": "mcp-server-cost-optimization",
      "title": "MCP Server Cost Optimization: Toolset Size, Caching Hints, and Fan-Out",
      "description": "How the token cost of an MCP server's tool list, the 2026-07-28 spec's ttlMs/cacheScope caching hints, fan-out from callers you do not control, and per-tool-name cost visibility each shape what a production MCP server actually costs to run.",
      "kind": "sub",
      "order": 8,
      "cluster": "mcp-in-practice",
      "target_query": "MCP server cost optimization",
      "secondary_queries": [
        "token cost of a large MCP tool list",
        "ttlMs cacheScope MCP caching hints",
        "measuring cost per MCP tool",
        "fan-out cost for an MCP server from parallel callers"
      ],
      "tags": [
        "mcp",
        "cost",
        "optimization",
        "caching",
        "observability",
        "agents",
        "production"
      ],
      "published": "2026-08-15",
      "updated": "2026-08-15",
      "words": 1498,
      "takeaways": [
        "A tool list re-injected into an agent's context on every session carries a token cost proportional to the number of tools registered, so a fifty-tool MCP server imposes roughly ten times the standing token tax of an equivalent five-tool server, independent of how often any individual tool actually gets called.",
        "The 2026-07-28 MCP spec revision added ttlMs and cacheScope parameters to list and resource results as an explicit, server-declared basis for client-side caching, which a client can use to skip re-fetching tools/list within the declared window instead of re-fetching by default.",
        "Setting a caching TTL longer than how often an MCP server's tool catalog actually changes per user or per session risks a client acting on a stale tool list — this is a reasoned caution about the caching hints, not a documented spec warning.",
        "From a single MCP server's vantage point, fan-out multiplies load the operator did not architect and cannot fix by changing their own code, because the calling side's sub-agent count and retry behavior are decisions made entirely outside the server.",
        "Tracking token cost per tool name, the same way per-tool-name latency and error-rate dashboards catch one degrading tool inside a healthy-looking average, prevents one expensive MCP tool from hiding inside a server-wide cost figure that still looks reasonable."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/agent-cost-latency-optimization",
        "https://changegamer.ai/resources/mcp-2026-spec-revision"
      ],
      "html": "https://changegamer.ai/articles/mcp-server-cost-optimization",
      "markdown": "https://changegamer.ai/articles/mcp-server-cost-optimization.md",
      "json": "https://changegamer.ai/api/articles/mcp-server-cost-optimization.json"
    },
    {
      "slug": "mcp-server-failure-modes",
      "title": "Common MCP Server Failure Modes and How to Fix Them",
      "description": "A runtime playbook for the two MCP server failure modes with no dedicated deep-dive elsewhere: unrecoverable state after a mid-call crash, and malformed or hallucinated tool calls that reach the handler despite upstream validation.",
      "kind": "sub",
      "order": 9,
      "cluster": "mcp-in-practice",
      "target_query": "common MCP server failure modes and how to fix them",
      "secondary_queries": [
        "MCP tool call idempotency key",
        "MCP server crash recovery",
        "handling hallucinated tool calls in an MCP handler",
        "malformed tool call arguments MCP server"
      ],
      "tags": [
        "mcp",
        "reliability",
        "idempotency",
        "tool-calling",
        "agents",
        "production"
      ],
      "published": "2026-08-21",
      "updated": "2026-08-21",
      "words": 1751,
      "takeaways": [
        "An MCP tool handler that writes to a database or calls a payment API needs an idempotency key derived from the run ID and step index, not from wall-clock time or a fresh random value, so a retried call after a crash lands as a no-op instead of a duplicate side effect.",
        "A hallucinated tool name or a malformed argument object can still reach an MCP handler even with a well-formed inputSchema declared, because schema declaration constrains what a well-behaved client sends, not what an unreliable model actually emits.",
        "Distinguishing a transient failure (network timeout, rate limit, 5xx) from a terminal one (bad request, business-logic rejection) at the point of failure determines whether an MCP handler should retry with backoff or fail fast and surface a clear error instead.",
        "The Berkeley Function Calling Leaderboard is the standard reference benchmark for tool-call reliability across providers, which means a hallucinated-tool-name or malformed-argument rate greater than zero should be treated as an expected input condition an MCP handler must defend against, not an edge case to leave unhandled.",
        "Rejecting an unknown tool name or a schema-invalid argument object before any handler logic runs turns a hallucinated or malformed call into a clean, typed error response instead of an unhandled exception or, worse, a partially executed side effect."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/durable-execution-for-agents",
        "https://changegamer.ai/resources/reliable-tool-calling"
      ],
      "html": "https://changegamer.ai/articles/mcp-server-failure-modes",
      "markdown": "https://changegamer.ai/articles/mcp-server-failure-modes.md",
      "json": "https://changegamer.ai/api/articles/mcp-server-failure-modes.json"
    },
    {
      "slug": "mcp-resources-and-prompts-vs-tools",
      "title": "MCP Tools vs Resources vs Prompts: How to Choose the Right Primitive",
      "description": "A decision procedure for MCP's three server-side primitives — who controls each one, a worked example of what it costs to expose a Resource as a Tool by mistake, and how Sampling and Elicitation fit as the client-side counterparts.",
      "kind": "sub",
      "order": 10,
      "cluster": "mcp-in-practice",
      "target_query": "MCP tools vs resources vs prompts",
      "secondary_queries": [
        "when to use MCP Resource instead of Tool",
        "MCP Prompt vs Tool difference",
        "MCP Sampling vs Tools",
        "choosing MCP server primitives"
      ],
      "tags": [
        "mcp",
        "protocols",
        "tool-calling",
        "architecture",
        "agents"
      ],
      "published": "2026-08-21",
      "updated": "2026-08-21",
      "words": 1490,
      "takeaways": [
        "MCP's three server-side primitives answer to three different controllers: the model decides when to call a Tool, the host application decides when to inject a Resource, and the user decides when to invoke a Prompt — and none of the three can invoke either of the others.",
        "Content that is read-only, always-relevant, and owned by the application — a config blob, the file a user has open, a live status value — belongs in a Resource, not a Tool, because a Resource is injected on the application's schedule while a Tool depends on the model remembering to ask for it.",
        "Registering read-only context as a Tool rather than a Resource adds a permanent entry to tools/list that every session pays a token cost for, and makes whether the model actually has that context on a given turn a matter of whether it chose to call the tool rather than a guarantee the application controls.",
        "Sampling and Elicitation are the client-side counterparts to Tools and run in the opposite direction: instead of a model asking a server to act, a server asks the connected client for an LLM completion or for structured user input, and both require a human review step before the result reaches the model or the server.",
        "ChangeGamer's own /mcp server, checked directly against its request handler as of August 2026, registers ten capabilities exclusively as Tools and declares no resources or prompts capability at all, including for its read-only resource catalog."
      ],
      "faq_count": 5,
      "resources": [
        "https://changegamer.ai/resources/mcp-primitives"
      ],
      "html": "https://changegamer.ai/articles/mcp-resources-and-prompts-vs-tools",
      "markdown": "https://changegamer.ai/articles/mcp-resources-and-prompts-vs-tools.md",
      "json": "https://changegamer.ai/api/articles/mcp-resources-and-prompts-vs-tools.json"
    },
    {
      "slug": "mcp-server-production-launch-checklist",
      "title": "The MCP Server Production Launch Checklist",
      "description": "A phase-by-phase go/no-go checklist for launching an MCP server: checkable gate conditions for transport and auth, tool design, cross-client testing, publish readiness, observability, and ongoing operation — with links to the mechanics each gate depends on.",
      "kind": "sub",
      "order": 11,
      "cluster": "mcp-in-practice",
      "target_query": "production launch checklist for an MCP server",
      "secondary_queries": [
        "MCP server go/no-go checklist",
        "is my MCP server ready for production",
        "MCP server launch phases and gates",
        "MCP server pre-launch readiness review"
      ],
      "tags": [
        "mcp",
        "production",
        "checklist",
        "launch",
        "agents",
        "operations"
      ],
      "published": "2026-08-22",
      "updated": "2026-08-22",
      "words": 1719,
      "takeaways": [
        "A production MCP server launch breaks into six sequential phases — transport and auth, tool design, cross-client testing, publish readiness, observability, and ongoing operation — and each phase needs a checkable go/no-go gate before the next one starts, not just a completed to-do item.",
        "The go/no-go gate for the testing phase is a successful end-to-end run completed against whichever client your users actually connect with, not a clean pass inside Inspector alone — Inspector confirms your server handles a well-formed call, and says nothing about how a real host reads your tool descriptions.",
        "The go/no-go gate for the publish phase requires a pinned SDK version and a server.json manifest that validates against the registry schema before the first submission, since the official registry stores metadata only and points at a package that must already be live elsewhere.",
        "The go/no-go gate for calling a server \"live\" is that every tool call already logs its trace ID, redacted arguments and response, latency, and outcome somewhere agents cannot quietly edit or delete afterward, because instrumenting observability after launch means the first real incident has no data trail to debug from.",
        "Deciding the auth model during the transport phase, before a single handler line is written, avoids a migration every existing client integration would otherwise have to go through once a server already carrying real traffic needs to add one."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/mcp-server-authentication",
        "https://changegamer.ai/resources/testing-ai-agents",
        "https://changegamer.ai/resources/agent-observability",
        "https://changegamer.ai/resources/mcp-server-discovery",
        "https://changegamer.ai/resources/reliable-tool-calling",
        "https://changegamer.ai/resources/agentic-security-checklist"
      ],
      "html": "https://changegamer.ai/articles/mcp-server-production-launch-checklist",
      "markdown": "https://changegamer.ai/articles/mcp-server-production-launch-checklist.md",
      "json": "https://changegamer.ai/api/articles/mcp-server-production-launch-checklist.json"
    },
    {
      "slug": "mcp-enterprise-sso-id-jag",
      "title": "Zero-Touch Enterprise Authorization for MCP Servers: ID-JAG and SEP-990",
      "description": "How Enterprise-Managed Authorization (SEP-990) removes the per-server OAuth consent screen for MCP servers: the ID-JAG grant mechanism, its RFC 8693/7523 building blocks, named launch adopters as of August 2026, and how it layers on top of standard OAuth 2.1 rather than replacing it.",
      "kind": "sub",
      "order": 12,
      "cluster": "mcp-in-practice",
      "target_query": "zero-touch enterprise authorization for MCP servers",
      "secondary_queries": [
        "what is ID-JAG for MCP",
        "SEP-990 Enterprise-Managed Authorization",
        "Okta Cross App Access MCP",
        "MCP single sign-on for enterprise IT"
      ],
      "tags": [
        "mcp",
        "oauth",
        "sso",
        "identity",
        "security",
        "agents",
        "production"
      ],
      "published": "2026-08-22",
      "updated": "2026-08-22",
      "words": 1229,
      "takeaways": [
        "Enterprise-Managed Authorization (EMA) is SEP-990, an MCP extension that reached stable status on 18 June 2026, letting an organization's identity provider grant access to approved MCP servers during single sign-on instead of showing a per-server OAuth consent screen.",
        "The ID-JAG mechanism chains two existing standards: an identity provider issues an Identity Assertion JWT Authorization Grant via RFC 8693 Token Exchange, and the MCP server's own authorization server redeems that grant for an access token via an RFC 7523 JWT Bearer grant, with no interactive prompt shown to the user.",
        "As of August 2026, Okta is EMA's first supporting identity provider through its Cross App Access (XAA) protocol, Anthropic's Claude and Microsoft's VS Code are named launch clients, and Asana, Atlassian, Canva, Figma, Granola, Linear and Supabase are named launch MCP servers, with Slack support in progress.",
        "Enterprise-Managed Authorization is optional and strictly additive: an MCP server or client that has not implemented SEP-990 falls back automatically to the standard interactive OAuth 2.1 flow with mandatory PKCE that every remote MCP server must already support.",
        "Enterprise-Managed Authorization solves two distinct problems at once — it removes the repeated per-server consent click for end users, and it gives enterprise IT administrators centralized, identity-provider-level control over which MCP servers are usable inside the organization at all."
      ],
      "faq_count": 4,
      "resources": [
        "https://changegamer.ai/resources/mcp-enterprise-managed-authorization",
        "https://changegamer.ai/resources/mcp-server-authentication"
      ],
      "html": "https://changegamer.ai/articles/mcp-enterprise-sso-id-jag",
      "markdown": "https://changegamer.ai/articles/mcp-enterprise-sso-id-jag.md",
      "json": "https://changegamer.ai/api/articles/mcp-enterprise-sso-id-jag.json"
    }
  ]
}