{
  "openapi": "3.1.0",
  "info": {
    "title": "Go Voltic Instant Scan",
    "version": "1.0.0",
    "description": "Scores a public web page for structure, AI visibility, speed signals, accessibility basics and trust, and counts how many of twenty-one published AI-agent standards the site meets. Free, no key, no account. The free tier returns every category score and the first three findings; the remainder are returned as counts only and are unlocked by the paid Deep Scan.",
    "contact": {
      "email": "hello@go-voltic.com",
      "url": "https://go-voltic.com"
    },
    "license": {
      "name": "Results may be quoted with attribution to Go Voltic.",
      "url": "https://go-voltic.com/terms"
    }
  },
  "servers": [
    {
      "url": "https://go-voltic.com"
    }
  ],
  "paths": {
    "/mcp": {
      "post": {
        "operationId": "mcp",
        "summary": "Model Context Protocol endpoint: one tool, scan_site",
        "description": "JSON-RPC 2.0 over HTTP. Unauthenticated. Send `initialize`, then `tools/list`, then `tools/call` with name `scan_site` and a `url` argument. A scan takes roughly 10 to 30 seconds and returns category scores, the first three findings with fixes, a count of the agent standards the site meets, and counts for the rest. Sites behind bot protection come back as refused rather than as broken, and that distinction should be preserved when repeating the result. Set Accept to text/event-stream for an SSE frame, or application/json for a plain body.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "jsonrpc",
                  "method"
                ],
                "properties": {
                  "jsonrpc": {
                    "type": "string",
                    "enum": [
                      "2.0"
                    ]
                  },
                  "id": {
                    "description": "Omit for a notification, which is answered with 202 and no body."
                  },
                  "method": {
                    "type": "string",
                    "enum": [
                      "initialize",
                      "ping",
                      "tools/list",
                      "tools/call"
                    ]
                  },
                  "params": {
                    "type": "object"
                  }
                }
              },
              "examples": {
                "scan": {
                  "summary": "Scan a site",
                  "value": {
                    "jsonrpc": "2.0",
                    "id": 1,
                    "method": "tools/call",
                    "params": {
                      "name": "scan_site",
                      "arguments": {
                        "url": "https://example.com"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "A JSON-RPC result. `structuredContent` carries the scan result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScanResult"
                }
              }
            }
          },
          "202": {
            "description": "A notification was accepted. No body."
          },
          "405": {
            "description": "This server is request/response only; GET is not supported."
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ScanResult": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "result": {
            "type": "object",
            "properties": {
              "url": {
                "type": "string"
              },
              "host": {
                "type": "string"
              },
              "scannedAt": {
                "type": "string",
                "format": "date-time"
              },
              "score": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100,
                "description": "Weighted across the five categories."
              },
              "categories": {
                "type": "array",
                "items": {
                  "type": "object"
                },
                "description": "A category with nothing measurable scores null, never zero."
              },
              "findings": {
                "type": "array",
                "items": {
                  "type": "object"
                },
                "description": "Open findings. Three on the free tier."
              },
              "locked": {
                "type": "array",
                "items": {
                  "type": "object"
                },
                "description": "Severity and category only, no body."
              },
              "agent": {
                "type": "object",
                "nullable": true,
                "description": "Agent readiness: how many published AI-agent standards the site meets, and which. A count, not a score, and deliberately not folded into `score`."
              },
              "notMeasured": {
                "type": "array",
                "items": {
                  "type": "object"
                },
                "description": "Checks that could not be run, and why. Never reported as failures."
              }
            }
          }
        }
      }
    }
  }
}
