{
  "report": "Agent Readiness Report",
  "url": "https://aibuildersunite.vercel.app",
  "scannedOrigin": "https://aibuildersunite.vercel.app",
  "framework": "ASO (Agent Signal Optimization)",
  "asoScore": 63,
  "asoMax": 100,
  "agentReadiness": "Ready",
  "autoVerifiableMax": 89,
  "level": {
    "id": "ASO-3",
    "name": "Invocable",
    "range": "50-69",
    "meaning": "Agents can understand how to call the service."
  },
  "certification": {
    "eligible": true,
    "tier": "ASO Certified Invocable",
    "note": "Score and verified invocation path meet the ASO Certified Invocable threshold. Formal certification additionally requires registry entry with timestamped verification."
  },
  "pillars": [
    {
      "pillar": "Discoverability",
      "points": 18,
      "maxPoints": 20,
      "signals": [
        {
          "id": "ai-crawler-rules",
          "name": "AI crawler rules in robots.txt",
          "pillar": "Discoverability",
          "maxPoints": 4,
          "points": 4,
          "status": "pass",
          "sources": [
            "ai-bot-rules",
            "robots-txt"
          ],
          "note": "AI bot rules: Explicit rules for 9 AI crawlers: gptbot, oai-searchbot, chatgpt-user, claudebot, claude-web, anthropic-ai, google-extended, perplexitybot"
        },
        {
          "id": "sitemap",
          "name": "Current sitemap.xml",
          "pillar": "Discoverability",
          "maxPoints": 4,
          "points": 2,
          "status": "partial",
          "sources": [
            "sitemap"
          ],
          "note": "Sitemap: robots.txt declares https://aibuildersunite.com/sitemap.xml but it returned 200"
        },
        {
          "id": "llms-txt",
          "name": "Published llms.txt",
          "pillar": "Discoverability",
          "maxPoints": 4,
          "points": 4,
          "status": "pass",
          "sources": [
            "llms-txt"
          ],
          "note": "llms.txt: /llms.txt published (1363 bytes)"
        },
        {
          "id": "well-known-agent-endpoint",
          "name": "Well-known AI or agent endpoint",
          "pillar": "Discoverability",
          "maxPoints": 4,
          "points": 4,
          "status": "pass",
          "sources": [
            "well-known-ai",
            "a2a-agent-card",
            "mcp-server-card",
            "agent-json",
            "api-catalog",
            "agent-skills",
            "webmcp"
          ],
          "note": "Well-known AI manifest (/.well-known/ai): /.well-known/ai serves JSON manifest"
        },
        {
          "id": "directory-listings",
          "name": "Directory listings / DNS discovery",
          "pillar": "Discoverability",
          "maxPoints": 4,
          "points": 4,
          "status": "pass",
          "sources": [
            "dns-aid",
            "link-headers"
          ],
          "note": "Link headers: Agent-relevant Link header: </llms.txt>; rel=\"llms-txt\", </index.md>; rel=\"alternate\"; type=\"text/markdown\", </.well-known/agent-card.json>; rel=\"agent-card\""
        }
      ]
    },
    {
      "pillar": "Identity",
      "points": 15,
      "maxPoints": 20,
      "signals": [
        {
          "id": "json-ld",
          "name": "JSON-LD schema",
          "pillar": "Identity",
          "maxPoints": 5,
          "points": 5,
          "status": "pass",
          "sources": [
            "json-ld"
          ],
          "note": "JSON-LD / schema.org: JSON-LD present (@type: Organization, WebSite)"
        },
        {
          "id": "openapi",
          "name": "Complete OpenAPI spec",
          "pillar": "Identity",
          "maxPoints": 5,
          "points": 0,
          "status": "fail",
          "sources": [
            "openapi"
          ],
          "note": "OpenAPI spec: No OpenAPI spec at common paths"
        },
        {
          "id": "agent-json",
          "name": "agent.json manifest",
          "pillar": "Identity",
          "maxPoints": 5,
          "points": 5,
          "status": "pass",
          "sources": [
            "agent-json",
            "a2a-agent-card"
          ],
          "note": "agent.json manifest: agent.json at /agent.json: \"AI Builders Unite\""
        },
        {
          "id": "llm-docs",
          "name": "LLM-readable documentation",
          "pillar": "Identity",
          "maxPoints": 5,
          "points": 5,
          "status": "pass",
          "sources": [
            "llm-docs",
            "markdown-negotiation"
          ],
          "note": "LLM-readable documentation: /index.md serves markdown source"
        }
      ]
    },
    {
      "pillar": "Trust",
      "points": 11,
      "maxPoints": 15,
      "signals": [
        {
          "id": "https",
          "name": "HTTPS enforced",
          "pillar": "Trust",
          "maxPoints": 4,
          "points": 4,
          "status": "pass",
          "sources": [
            "https-enforced"
          ],
          "note": "HTTPS enforced: HTTP redirects to HTTPS"
        },
        {
          "id": "auth-docs",
          "name": "Auth clearly documented",
          "pillar": "Trust",
          "maxPoints": 4,
          "points": 0,
          "status": "fail",
          "sources": [
            "auth-md",
            "oauth-as",
            "oauth-pr"
          ],
          "note": "Auth.md: No /auth.md or /.well-known/auth.md"
        },
        {
          "id": "governance",
          "name": "Governance or provenance signals",
          "pillar": "Trust",
          "maxPoints": 4,
          "points": 4,
          "status": "pass",
          "sources": [
            "security-txt",
            "content-signals",
            "web-bot-auth"
          ],
          "note": "security.txt: RFC 9116 security.txt published"
        },
        {
          "id": "status",
          "name": "Operational status visibility",
          "pillar": "Trust",
          "maxPoints": 3,
          "points": 3,
          "status": "pass",
          "sources": [
            "status-endpoint"
          ],
          "note": "Operational status: Operational status at /health"
        }
      ]
    },
    {
      "pillar": "Commerce",
      "points": 0,
      "maxPoints": 15,
      "signals": [
        {
          "id": "pricing",
          "name": "Machine-readable pricing",
          "pillar": "Commerce",
          "maxPoints": 5,
          "points": 0,
          "status": "fail",
          "sources": [
            "pricing"
          ],
          "note": "Machine-readable pricing: No machine-readable pricing signals"
        },
        {
          "id": "payment-manifest",
          "name": "x402 or payment manifest",
          "pillar": "Commerce",
          "maxPoints": 5,
          "points": 0,
          "status": "fail",
          "sources": [
            "x402",
            "mpp"
          ],
          "note": "x402: No x402 payment manifest"
        },
        {
          "id": "purchase-path",
          "name": "Agent-safe purchase path",
          "pillar": "Commerce",
          "maxPoints": 5,
          "points": 0,
          "status": "fail",
          "sources": [
            "ucp",
            "acp"
          ],
          "note": "UCP (Universal Commerce Protocol): No UCP manifest at /.well-known/ucp"
        }
      ]
    },
    {
      "pillar": "Reputation",
      "points": 4,
      "maxPoints": 15,
      "signals": [
        {
          "id": "uptime-metrics",
          "name": "Uptime and latency metrics",
          "pillar": "Reputation",
          "maxPoints": 4,
          "points": 4,
          "status": "pass",
          "sources": [
            "status-endpoint"
          ],
          "note": "Operational status: Operational status at /health"
        },
        {
          "id": "success-rates",
          "name": "Success or completion rates",
          "pillar": "Reputation",
          "maxPoints": 4,
          "points": 0,
          "status": "manual",
          "sources": [],
          "note": "Not auto-verifiable by a crawler — earns points via manual ASO audit or registry evidence."
        },
        {
          "id": "citations",
          "name": "Citations or third-party mentions",
          "pillar": "Reputation",
          "maxPoints": 4,
          "points": 0,
          "status": "manual",
          "sources": [],
          "note": "Not auto-verifiable by a crawler — earns points via manual ASO audit or registry evidence."
        },
        {
          "id": "reviews",
          "name": "Reviews or endorsements",
          "pillar": "Reputation",
          "maxPoints": 3,
          "points": 0,
          "status": "manual",
          "sources": [],
          "note": "Not auto-verifiable by a crawler — earns points via manual ASO audit or registry evidence."
        }
      ]
    },
    {
      "pillar": "Memory",
      "points": 15,
      "maxPoints": 15,
      "signals": [
        {
          "id": "persistent-identity",
          "name": "Stable persistent identity",
          "pillar": "Memory",
          "maxPoints": 5,
          "points": 5,
          "status": "pass",
          "sources": [
            "identity-consistency"
          ],
          "note": "Identity consistency: Consistent identity across 4 sources: \"AI Builders Unite\""
        },
        {
          "id": "consistent-signals",
          "name": "Consistent signals across files",
          "pillar": "Memory",
          "maxPoints": 5,
          "points": 5,
          "status": "pass",
          "sources": [
            "signal-consistency"
          ],
          "note": "Signal consistency: 5 core signals present and coherent: robots-txt, llms-txt, agent-json, a2a-agent-card, well-known-ai"
        },
        {
          "id": "versioning",
          "name": "Versioning and return paths",
          "pillar": "Memory",
          "maxPoints": 5,
          "points": 5,
          "status": "pass",
          "sources": [
            "versioning"
          ],
          "note": "Versioning & return paths: Version fields found in 3 manifest(s): 1.0.0, 1.0.0, 1.0.0"
        }
      ]
    }
  ],
  "checks": [
    {
      "id": "robots-txt",
      "name": "robots.txt",
      "category": "Discoverability",
      "status": "pass",
      "evidence": "200 OK, 1046 bytes, has User-agent groups"
    },
    {
      "id": "sitemap",
      "name": "Sitemap",
      "category": "Discoverability",
      "status": "partial",
      "evidence": "robots.txt declares https://aibuildersunite.com/sitemap.xml but it returned 200",
      "recommendation": "Fix the sitemap URL declared in robots.txt."
    },
    {
      "id": "link-headers",
      "name": "Link headers",
      "category": "Discoverability",
      "status": "pass",
      "evidence": "Agent-relevant Link header: </llms.txt>; rel=\"llms-txt\", </index.md>; rel=\"alternate\"; type=\"text/markdown\", </.well-known/agent-card.json>; rel=\"agent-card\""
    },
    {
      "id": "dns-aid",
      "name": "DNS for AI Discovery (DNS-AID)",
      "category": "Discoverability",
      "specUrl": "https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-dnsaid/",
      "status": "fail",
      "evidence": "No TXT records at _agent.aibuildersunite.vercel.app, _index._agents.aibuildersunite.vercel.app, _agents.aibuildersunite.vercel.app",
      "recommendation": "Publish DNS-AID records (TXT/SVCB at _agent.<domain>) so agents can discover you via DNS. Emerging IETF draft — optional but differentiating."
    },
    {
      "id": "well-known-ai",
      "name": "Well-known AI manifest (/.well-known/ai)",
      "category": "Discoverability",
      "specUrl": "https://agentsignaloptimization.com",
      "status": "pass",
      "evidence": "/.well-known/ai serves JSON manifest",
      "data": {
        "name": "AI Builders Unite",
        "description": "A global community of people building with AI: an interactive, privacy-fuzzed member globe and a Discord community.",
        "url": "https://aibuildersunite.com",
        "version": "1.0.0",
        "capabilities": [
          "community-discovery",
          "member-map",
          "chat-community"
        ],
        "signals": {
          "llmsTxt": "/llms.txt",
          "markdown": "/index.md",
          "agentCard": "/.well-known/agent-card.json",
          "identity": "/agent.json",
          "status": "/health"
        },
        "contentPolicy": {
          "search": true,
          "aiInput": true,
          "aiTrain": false
        },
        "privacy": "Member personal data and locations are never exposed to agents; the directory is searchable on-site only and is not indexed."
      }
    },
    {
      "id": "markdown-negotiation",
      "name": "Markdown negotiation",
      "category": "Content Accessibility",
      "specUrl": "https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/",
      "status": "fail",
      "evidence": "Accept: text/markdown → content-type: text/html; charset=utf-8",
      "recommendation": "Support Markdown content negotiation (Cloudflare 'Markdown for agents') so agents get clean text instead of HTML."
    },
    {
      "id": "llms-txt",
      "name": "llms.txt",
      "category": "Content Accessibility",
      "specUrl": "https://llmstxt.org",
      "status": "pass",
      "evidence": "/llms.txt published (1363 bytes)",
      "data": "# AI Builders Unite\n\n> A global community map of AI builders. Members add themselves as a glowing,\n> privacy-fuzzed dot on an interactive 3D globe and connect through the\n> community Discord.\n\nAI Builders Unite exists for people deep in building with AI who want to find\nothers with the same mindset. Location is coarse by design: dots are randomized\nnear a country or US-state centroid and exact locations are never collected.\n\n## Pages\n\n- [Home](https://aibuildersunite.com/): Interactive 3D globe of members with hero and community values\n- [Join](https://aibuildersunite.com/join): Add yourself — handle or name, one or more locations, optional email\n- [Community](https://aibuildersunite.com/community): Discord invite, live widget, and community values\n- [Support](https://aibuildersunite.com/support): Donations that fund hosting and community tools\n\n## Markdown mirror\n\n- [Plain-text site summary](https://aibuildersunite.com/index.md)\n\n## Facts\n\n- Membership is free; email is optional and never displayed or shared\n- A member can place multiple dots (one per place they call home)\n- Member dots are privacy-fuzzed: country or US-state level only\n- The member directory is searchable on-site only and is NOT search-indexed\n- Chat happens on Discord; the site embeds the official widget\n- The community is donation-supported with no ads and no data sales\n"
    },
    {
      "id": "llm-docs",
      "name": "LLM-readable documentation",
      "category": "Content Accessibility",
      "status": "pass",
      "evidence": "/index.md serves markdown source"
    },
    {
      "id": "ai-bot-rules",
      "name": "AI bot rules",
      "category": "Bot Access Control",
      "status": "pass",
      "evidence": "Explicit rules for 9 AI crawlers: gptbot, oai-searchbot, chatgpt-user, claudebot, claude-web, anthropic-ai, google-extended, perplexitybot"
    },
    {
      "id": "content-signals",
      "name": "Content Signals",
      "category": "Bot Access Control",
      "specUrl": "https://contentsignals.org",
      "status": "pass",
      "evidence": "Content Signals declared: Content-Signal: search=yes, ai-input=yes, ai-train=no"
    },
    {
      "id": "web-bot-auth",
      "name": "Web Bot Auth",
      "category": "Bot Access Control",
      "specUrl": "https://blog.cloudflare.com/web-bot-auth/",
      "status": "fail",
      "evidence": "No Web Bot Auth signals found",
      "recommendation": "Optional: support Web Bot Auth (HTTP Message Signatures) to verify legitimate agents instead of blocking by UA string."
    },
    {
      "id": "api-catalog",
      "name": "API Catalog",
      "category": "API / Auth / MCP",
      "specUrl": "https://www.rfc-editor.org/rfc/rfc9727",
      "status": "fail",
      "evidence": "/.well-known/api-catalog: HTTP 404",
      "recommendation": "Publish an RFC 9727 api-catalog linkset so agents can enumerate your APIs."
    },
    {
      "id": "oauth-as",
      "name": "OAuth discovery",
      "category": "API / Auth / MCP",
      "specUrl": "https://www.rfc-editor.org/rfc/rfc8414",
      "status": "fail",
      "evidence": "/.well-known/oauth-authorization-server: HTTP 404",
      "recommendation": "If you offer OAuth, publish RFC 8414 authorization server metadata."
    },
    {
      "id": "oauth-pr",
      "name": "OAuth Protected Resource",
      "category": "API / Auth / MCP",
      "specUrl": "https://datatracker.ietf.org/doc/html/rfc9728",
      "status": "fail",
      "evidence": "/.well-known/oauth-protected-resource: HTTP 404",
      "recommendation": "If your APIs require OAuth, publish RFC 9728 protected resource metadata (also required for remote MCP auth)."
    },
    {
      "id": "auth-md",
      "name": "Auth.md",
      "category": "API / Auth / MCP",
      "status": "fail",
      "evidence": "No /auth.md or /.well-known/auth.md",
      "recommendation": "Publish auth.md describing how agents authenticate: token acquisition, scopes, and example requests."
    },
    {
      "id": "mcp-server-card",
      "name": "MCP Server Card",
      "category": "API / Auth / MCP",
      "specUrl": "https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2127",
      "status": "fail",
      "evidence": "No MCP Server Card found",
      "recommendation": "If you run an MCP server, publish /.well-known/mcp/server-card.json advertising transport, capabilities, and tools."
    },
    {
      "id": "a2a-agent-card",
      "name": "A2A Agent Card (Google A2A)",
      "category": "API / Auth / MCP",
      "specUrl": "https://a2a-protocol.org/latest/specification/",
      "status": "pass",
      "evidence": "Valid A2A Agent Card: \"AI Builders Unite\" v1.0.0, 2 skill(s)",
      "data": {
        "protocolVersion": "0.3.0",
        "name": "AI Builders Unite",
        "description": "A global community of people building with AI. Discover the community, learn how to join the member map, and find where to connect. Member personal data is not exposed to agents.",
        "url": "https://aibuildersunite.com",
        "version": "1.0.0",
        "provider": {
          "organization": "AI Builders Unite",
          "url": "https://aibuildersunite.com"
        },
        "documentationUrl": "https://aibuildersunite.com/llms.txt",
        "capabilities": {
          "streaming": false,
          "pushNotifications": false,
          "stateTransitionHistory": false
        },
        "defaultInputModes": [
          "text/plain"
        ],
        "defaultOutputModes": [
          "text/plain",
          "application/json"
        ],
        "skills": [
          {
            "id": "community-info",
            "name": "Community information",
            "description": "Answer questions about what AI Builders Unite is, its values, and how the member globe works.",
            "tags": [
              "community",
              "ai",
              "builders",
              "discovery"
            ],
            "examples": [
              "What is AI Builders Unite?",
              "How does the member globe protect privacy?"
            ]
          },
          {
            "id": "join-guidance",
            "name": "How to join",
            "description": "Explain how a person adds themselves (and multiple locations) to the community map.",
            "tags": [
              "join",
              "onboarding"
            ],
            "examples": [
              "How do I add myself to the map?",
              "Can I add more than one location?"
            ]
          }
        ]
      }
    },
    {
      "id": "agent-skills",
      "name": "Agent Skills",
      "category": "API / Auth / MCP",
      "specUrl": "https://agentskills.io",
      "status": "fail",
      "evidence": "No /.well-known/skills endpoint",
      "recommendation": "Optional: publish Agent Skills so coding/browser agents can load task instructions for your service."
    },
    {
      "id": "webmcp",
      "name": "WebMCP",
      "category": "API / Auth / MCP",
      "specUrl": "https://webmcp.org",
      "status": "fail",
      "evidence": "No WebMCP signals",
      "recommendation": "Optional: expose in-page tools via WebMCP (navigator.modelContext) for browser agents."
    },
    {
      "id": "x402",
      "name": "x402",
      "category": "Commerce",
      "specUrl": "https://www.x402.org",
      "status": "fail",
      "evidence": "No x402 payment manifest",
      "recommendation": "If agents can pay you per-request, publish an x402 manifest (/.well-known/x402) describing payable routes and pricing."
    },
    {
      "id": "mpp",
      "name": "MPP (Machine Payments Protocol)",
      "category": "Commerce",
      "specUrl": "https://mpp.dev",
      "status": "fail",
      "evidence": "No MPP (Machine Payments Protocol) manifest",
      "recommendation": "Optional: support Stripe/Tempo MPP for pre-authorized agent spending sessions."
    },
    {
      "id": "ucp",
      "name": "UCP (Universal Commerce Protocol)",
      "category": "Commerce",
      "specUrl": "https://ucp.dev",
      "status": "fail",
      "evidence": "No UCP manifest at /.well-known/ucp",
      "recommendation": "If you sell products, publish a Universal Commerce Protocol manifest so shopping agents can discover checkout capabilities."
    },
    {
      "id": "acp",
      "name": "ACP (Agentic Commerce Protocol)",
      "category": "Commerce",
      "specUrl": "https://agenticcommerce.dev",
      "status": "fail",
      "evidence": "No ACP (Agentic Commerce Protocol) discovery signals",
      "recommendation": "Optional: implement ACP (OpenAI/Stripe agentic checkout) if you want ChatGPT/Copilot instant checkout."
    },
    {
      "id": "pricing",
      "name": "Machine-readable pricing",
      "category": "Commerce",
      "status": "fail",
      "evidence": "No machine-readable pricing signals",
      "recommendation": "Publish machine-readable pricing. Agents skip services whose cost they cannot determine."
    },
    {
      "id": "https-enforced",
      "name": "HTTPS enforced",
      "category": "Identity & Trust (ASO)",
      "status": "pass",
      "evidence": "HTTP redirects to HTTPS"
    },
    {
      "id": "json-ld",
      "name": "JSON-LD / schema.org",
      "category": "Identity & Trust (ASO)",
      "status": "pass",
      "evidence": "JSON-LD present (@type: Organization, WebSite)"
    },
    {
      "id": "openapi",
      "name": "OpenAPI spec",
      "category": "Identity & Trust (ASO)",
      "status": "fail",
      "evidence": "No OpenAPI spec at common paths",
      "recommendation": "Publish an OpenAPI spec (and reference it from api-catalog / agent.json) — the canonical invocation contract."
    },
    {
      "id": "agent-json",
      "name": "agent.json manifest",
      "category": "Identity & Trust (ASO)",
      "status": "pass",
      "evidence": "agent.json at /agent.json: \"AI Builders Unite\"",
      "data": {
        "name": "AI Builders Unite",
        "description": "A global community of people building with AI — an interactive member globe plus a Discord. This manifest is the agent-readable identity for the site.",
        "url": "https://aibuildersunite.com",
        "version": "1.0.0",
        "contact": "hello@aibuildersunite.com",
        "capabilities": [
          "community-discovery",
          "member-map",
          "chat-community"
        ],
        "signals": {
          "llmsTxt": "https://aibuildersunite.com/llms.txt",
          "markdown": "https://aibuildersunite.com/index.md",
          "agentCard": "https://aibuildersunite.com/.well-known/agent-card.json",
          "wellKnownAi": "https://aibuildersunite.com/.well-known/ai",
          "sitemap": "https://aibuildersunite.com/sitemap.xml",
          "securityTxt": "https://aibuildersunite.com/.well-known/security.txt",
          "status": "https://aibuildersunite.com/health"
        },
        "privacy": {
          "memberData": "not-exposed-to-agents",
          "directory": "on-site search only; noindex; not crawlable as data",
          "location": "coarse country/US-state centroid with jitter; exact location never collected"
        }
      }
    },
    {
      "id": "security-txt",
      "name": "security.txt",
      "category": "Identity & Trust (ASO)",
      "specUrl": "https://www.rfc-editor.org/rfc/rfc9116",
      "status": "pass",
      "evidence": "RFC 9116 security.txt published"
    },
    {
      "id": "status-endpoint",
      "name": "Operational status",
      "category": "Identity & Trust (ASO)",
      "status": "pass",
      "evidence": "Operational status at /health"
    },
    {
      "id": "versioning",
      "name": "Versioning & return paths",
      "category": "Identity & Trust (ASO)",
      "status": "pass",
      "evidence": "Version fields found in 3 manifest(s): 1.0.0, 1.0.0, 1.0.0"
    },
    {
      "id": "identity-consistency",
      "name": "Identity consistency",
      "category": "Identity & Trust (ASO)",
      "status": "pass",
      "evidence": "Consistent identity across 4 sources: \"AI Builders Unite\""
    },
    {
      "id": "signal-consistency",
      "name": "Signal consistency",
      "category": "Identity & Trust (ASO)",
      "status": "pass",
      "evidence": "5 core signals present and coherent: robots-txt, llms-txt, agent-json, a2a-agent-card, well-known-ai"
    }
  ],
  "summary": {
    "pass": 16,
    "partial": 1,
    "fail": 16,
    "manual": 0,
    "error": 0
  },
  "topRecommendations": [
    "[+5 pts] x402: If agents can pay you per-request, publish an x402 manifest (/.well-known/x402) describing payable routes and pricing.",
    "[+5 pts] MPP (Machine Payments Protocol): Optional: support Stripe/Tempo MPP for pre-authorized agent spending sessions.",
    "[+5 pts] UCP (Universal Commerce Protocol): If you sell products, publish a Universal Commerce Protocol manifest so shopping agents can discover checkout capabilities.",
    "[+5 pts] ACP (Agentic Commerce Protocol): Optional: implement ACP (OpenAI/Stripe agentic checkout) if you want ChatGPT/Copilot instant checkout.",
    "[+5 pts] Machine-readable pricing: Publish machine-readable pricing. Agents skip services whose cost they cannot determine.",
    "[+5 pts] OpenAPI spec: Publish an OpenAPI spec (and reference it from api-catalog / agent.json) — the canonical invocation contract.",
    "[+4 pts] OAuth discovery: If you offer OAuth, publish RFC 8414 authorization server metadata.",
    "[+4 pts] OAuth Protected Resource: If your APIs require OAuth, publish RFC 9728 protected resource metadata (also required for remote MCP auth)."
  ]
}