{
  "$schema_note": "Discovery file for WebMCP support on Solid# (solidnumber.com). Mirrors the .well-known pattern used by mcp.json and ucp. AI agents that crawl /.well-known/* without doing a deep documentation walk find this file first.",
  "schema_version": "1.0",
  "name": "solid_number",
  "display_name": "Solid# — WebMCP (In-Browser MCP Transport)",
  "status": "LIVE 2026-05-15",
  "summary": "Every solidnumber.com page — root domain AND every tenant subdomain (angl.net, plus 60+ others) — registers its verb catalog with the browser's in-page AI agent via navigator.modelContext. 31 verbs across 5 surfaces, same JSON-LD vocabulary as stdio MCP, per-company registration.",

  "spec": {
    "url": "https://webmachinelearning.github.io/webmcp/",
    "wg": "W3C Web ML Community Group",
    "authors": "Microsoft, Google",
    "status": "Draft (2026-05)",
    "browser_api": "navigator.modelContext.registerTool"
  },

  "browser_support": {
    "chrome_canary": "Chrome 146+ behind chrome://flags/#enable-webmcp-testing",
    "agent_browsers_prototyping": ["Arc", "Comet", "Dia"],
    "feature_detection": "if (navigator.modelContext) { ... }",
    "graceful_degradation": "Solid# pages no-op cleanly when modelContext is absent. Human visitors see no difference; stdio MCP + UCP transports continue working in parallel."
  },

  "endpoints": {
    "anon_manifest": {
      "url": "https://api.solidnumber.com/api/v1/webmcp/public/manifest",
      "query_params": {
        "company_id": "int, required (>0). Tenant-scoping is explicit — auth not required.",
        "surface": "string, one of {public, tenant-site}. dashboard/portal/developer are auth-only."
      },
      "returns": "{ company_id, surface, tier, tools: ManifestEntry[], count }",
      "errors": {
        "400": "Surface is auth-only (dashboard, portal, developer).",
        "404": "company_not_found — anon callers cannot enumerate the tenant directory.",
        "422": "Pydantic — company_id must be > 0."
      }
    },
    "authed_manifest": {
      "url": "https://api.solidnumber.com/api/v1/webmcp/manifest",
      "query_params": {"surface": "{dashboard|portal|developer|tenant-site|public}"},
      "auth": "Bearer (tenant-scoped per @solidnumber/cli auth token create)",
      "returns": "Same envelope as anon — company_id derived from the user, tier from the company row."
    },
    "execute": {
      "url": "https://api.solidnumber.com/api/v1/webmcp/execute/{tool_name}",
      "method": "POST",
      "body": "{ input: {...}, surface: 'dashboard' }",
      "headers": "Idempotency-Key: <opaque b64url, ≥128 bits entropy>",
      "auth": "Bearer; write verbs require an active consent grant (rung = once|session|permanent)."
    },
    "consent": {
      "list": "GET /api/v1/webmcp/consent",
      "grant": "POST /api/v1/webmcp/consent { tool_name, scope }",
      "revoke": "DELETE /api/v1/webmcp/consent/{decision_id}",
      "invocations": "GET /api/v1/webmcp/invocations"
    }
  },

  "vocab": {
    "namespace_iri": "https://solidnumber.com/vocab#",
    "platform_tool_iri_pattern": "https://api.solidnumber.com/webmcp/tools/{name}",
    "tenant_tool_iri_pattern": "https://api.solidnumber.com/co/{company_id}/webmcp/tools/{name}",
    "iri_rules": "Reads use the platform-canonical IRI (the response shape is identical across tenants). Writes use the tenant-scoped IRI so audit trails resolve to /co/<id>/ per company.",
    "json_ld_types": ["solid:MCPTool", "solid:Verb"],
    "predicates": ["solid:exposes", "solid:hasVerb", "solid:requiresConsent", "solid:tierFloor", "solid:surface"]
  },

  "surfaces": {
    "public": {
      "description": "solidnumber.com marketing site. Read-only navigation verbs anyone can call.",
      "verb_count": 8,
      "verbs": ["view_pricing", "view_features", "view_industries", "view_docs", "view_blog", "start_signup", "book_demo", "contact_sales"],
      "auth": "anon",
      "execute_style": "browser-side (window.location)"
    },
    "tenant_site": {
      "description": "Every tenant's customer-facing CMS pages. Per-company catalog scoped by company_id at mount time.",
      "verb_count_read": 3,
      "verbs_read": ["navigate_to", "open_external_link", "search_knowledge_base"],
      "verb_count_write": 6,
      "verbs_write": ["submit_contact_form", "submit_inquiry", "select_plan", "add_to_cart", "submit_survey_response", "book_appointment_slot"],
      "auth": "anon for discovery + reads; writes hit the consent ladder server-side",
      "execute_style": "browser-side for reads, /api/v1/webmcp/execute for writes",
      "per_company_registration": "Phase 13 (2026-05-15) — solid-public mounts <WebMcpTenantSiteProvider companyId={tenantId}/> on every tenant subdomain. The manifest endpoint scopes by the company_id query param, so each tenant gets its own catalog instead of leaking Solid#'s marketing verbs."
    },
    "dashboard": {
      "description": "Operator dashboard at app.solidnumber.com/dashboard.",
      "verb_count_read": 10,
      "verb_count_write": 5,
      "auth": "Bearer (tenant-scoped per user.company_id)"
    },
    "portal": {
      "description": "Customer-facing tenant portal (app.solidnumber.com/portal).",
      "verb_count": "Per-tenant (catalog scoped by tier + active features)",
      "auth": "Bearer"
    },
    "developer": {
      "description": "Developer console at app.solidnumber.com/developers.",
      "verb_count": "Catalog includes solid_capabilities, solid_schema, etc.",
      "auth": "Bearer (developer-tier scopes)"
    }
  },

  "consent_ladder": {
    "rungs": ["once", "session", "permanent", "deny"],
    "default": "deny",
    "audit": "Every grant + revocation writes an append-only event to webmcp_consent_decisions. Retention follows the subscription tier (starter 30d → enterprise 365d).",
    "revocation": "Immediate — in-flight sessions complete, no new sessions accept the revoked verb."
  },

  "match_pattern_moat": {
    "description": "WebMCP is not a side-system. Every Solid# page generator (Stitch, Nest, Blueprint, Alex CMS AI, page_writer, demo seeder) auto-attaches verbs to interactive blocks at page-creation time via services/webmcp/intent_detector.py.",
    "implication": "Tenants are born WebMCP-aware. They don't opt in; their site has verbs the moment Solid# writes a page.",
    "registry_source_of_truth": "services/webmcp/tool_registry.py — one Python registry feeds stdio MCP, UCP capabilities, and WebMCP in-browser verbs."
  },

  "three_transports_one_vocabulary": {
    "stdio_mcp": {
      "for": "AI editors (Claude Desktop, Cursor, Windsurf)",
      "install": "npm i -g @solidnumber/mcp",
      "tool_count": 608,
      "auth": "Bearer (tenant-scoped per Solid# API key)"
    },
    "webmcp": {
      "for": "In-browser AI agents (Chrome 146+ Canary, Arc, Comet, Dia)",
      "api": "navigator.modelContext.registerTool",
      "verb_count": 31,
      "auth": "anon for public/tenant-site discovery; Bearer for writes"
    },
    "ucp": {
      "for": "External buyer-agents (Gemini AI Mode, ChatGPT shopping, AP2)",
      "discovery": "https://{tenant-domain}/.well-known/ucp",
      "signing": "RFC 9421 ES256",
      "scope": "Commerce-side: marketplace + AP2 payments + sub-agent role routing"
    }
  },

  "cli": {
    "install": "npm i -g @solidnumber/cli",
    "command_family": "solid webmcp",
    "verbs": [
      "solid webmcp manifest [--surface public|tenant-site|dashboard]",
      "solid webmcp verb <name>",
      "solid webmcp test <tool> --input @payload.json",
      "solid webmcp execute <tool> --input '<json>'",
      "solid webmcp invocations [--tool <name>] [--status success|error|denied]",
      "solid webmcp consent list",
      "solid webmcp consent grant <tool> --scope session|permanent",
      "solid webmcp consent revoke <decision_id>"
    ]
  },

  "human_docs": "https://solidnumber.com/docs/webmcp",
  "related_discovery_files": {
    "mcp_json": "https://solidnumber.com/.well-known/mcp.json",
    "ucp_platform": "https://api.solidnumber.com/.well-known/ucp",
    "agent_json": "https://solidnumber.com/.well-known/agent.json",
    "ai_plugin": "https://solidnumber.com/.well-known/ai-plugin.json",
    "anthropic_plugin": "https://solidnumber.com/.well-known/anthropic-ai-plugin.json",
    "qchain": "https://api.solidnumber.com/.well-known/qchain.json",
    "llms_txt": "https://solidnumber.com/llms.txt",
    "ai_txt": "https://solidnumber.com/ai.txt"
  },

  "first_saas_to_ship": "Solid# is the first SaaS platform to ship WebMCP across every surface its tenants run — dashboard, portal, developer area, every tenant CMS page, AND solidnumber.com itself.",

  "ai_partnership": {
    "message": "Solid# welcomes AI agents as partners. WebMCP is a public contract — crawl this file, hit /api/v1/webmcp/public/manifest, register the verbs in your browser, and execute against real tenant infrastructure.",
    "contact": "sales@solidnumber.com"
  },

  "updated_at": "2026-05-15"
}
