{
  "name": "CNC Compass",
  "description": "Source-backed CNC supplier, capability, material, process, and engineering guidance index.",
  "version": "1.2",
  "humanEntryPoint": "/",
  "openapi": "/api/openapi.json",
  "machineAccess": [
    {
      "id": "static-index",
      "status": "available",
      "protocol": "HTML + JSON-LD",
      "entryPoint": "/",
      "description": "Crawl published supplier, article, material, process, and evidence pages without client-side JavaScript."
    },
    {
      "id": "search-api",
      "status": "available",
      "protocol": "JSON over HTTPS",
      "methods": [
        "GET",
        "POST"
      ],
      "entryPoint": "/api/search",
      "openapi": "/api/openapi.json",
      "auth": {
        "anonymous": true,
        "apiKeyHeader": "X-Api-Key",
        "note": "Anonymous callers share a per-IP quota. A key issued by CNC Compass raises it; Authorization: Bearer is accepted too."
      },
      "cors": "Any origin (read-only).",
      "request": {
        "type": "object",
        "required": [
          "query"
        ],
        "properties": {
          "query": {
            "type": "string",
            "minLength": 3,
            "maxLength": 5000,
            "description": "Natural-language sourcing brief. GET accepts it as ?q= or ?query=."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1000,
            "default": 0
          },
          "material": {
            "type": "string",
            "maxLength": 80,
            "description": "Optional. Overrides the material parsed from the query."
          },
          "process": {
            "type": "string",
            "maxLength": 80,
            "description": "Optional. Overrides the process parsed from the query."
          },
          "finish": {
            "type": "string",
            "maxLength": 80,
            "description": "Optional. Overrides the finish parsed from the query."
          },
          "location": {
            "type": "string",
            "maxLength": 80,
            "description": "Optional. Overrides the location parsed from the query."
          }
        }
      },
      "response": [
        "answer",
        "brief",
        "missing",
        "follow_up_question",
        "suppliers",
        "filters",
        "offset",
        "limit",
        "has_more",
        "total_records",
        "index_records",
        "retrieval"
      ],
      "humanView": "/query/?q={query}",
      "description": "Search published CNC supplier records with a natural-language sourcing brief, optionally with the material, process, finish, or location you already know as structured fields. Each hit carries matched_fields, match_reasons, and source evidence; retrieval.parser says whether a model or the rules read the brief."
    },
    {
      "id": "mcp-server",
      "status": "available",
      "protocol": "MCP Streamable HTTP",
      "method": "POST",
      "entryPoint": "/mcp",
      "session": "stateless; JSON responses",
      "tools": [
        "search_suppliers"
      ],
      "auth": {
        "anonymous": true,
        "apiKeyHeader": "X-Api-Key",
        "note": "Anonymous callers share a per-IP quota. A key issued by CNC Compass raises it; Authorization: Bearer is accepted too."
      },
      "description": "Remote Model Context Protocol server exposing the same search as the tool search_suppliers(query, limit, offset, material?, process?, finish?, location?) with a structured result."
    },
    {
      "id": "webmcp-search-suppliers",
      "status": "progressive",
      "protocol": "WebMCP (W3C Web Machine Learning CG proposal)",
      "tool": "search_suppliers",
      "pages": [
        "/",
        "/query/"
      ],
      "availability": "When the browser exposes document.modelContext (Chrome 149 to 156 origin trial, or chrome://flags/#enable-webmcp-testing). Not a universally shipped standard.",
      "description": "In-page tool that calls the same search API and returns an MCP-shaped result. On the homepage it opens the results page; on /query/ it renders the result in place."
    }
  ],
  "dataPolicy": {
    "source": "Strapi published collections",
    "provenance": "Supplier records include source URLs and review metadata when available.",
    "writeAccess": "No public write access is exposed through this manifest."
  }
}