{
  "openapi": "3.1.0",
  "info": {
    "title": "Anomity Catalog API",
    "version": "1.0.0",
    "summary": "Public, read-only risk profiles for AI tools, MCP servers, IDE extensions, plugins, skills, and WebMCP tools.",
    "description": "No authentication, no cookies, no analytics, no rate-limit key required. Every score is a pure function of declared trust, declared capabilities, and matched dangerous combinations — the formula is published at https://catalog.anomity.ai/about.",
    "license": {
      "name": "MIT",
      "identifier": "MIT"
    },
    "contact": {
      "name": "Anomity",
      "url": "https://anomity.ai"
    }
  },
  "servers": [
    {
      "url": "https://catalog.anomity.ai",
      "description": "Production"
    }
  ],
  "externalDocs": {
    "url": "https://catalog.anomity.ai/llms.txt",
    "description": "Plain-text catalog index for LLM context windows"
  },
  "paths": {
    "/api/categories": {
      "get": {
        "operationId": "listCategories",
        "summary": "List the catalog kinds and how many entries each holds.",
        "responses": {
          "200": {
            "description": "Categories",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CategoryList"
                }
              }
            }
          }
        }
      }
    },
    "/api/entries": {
      "get": {
        "operationId": "searchEntries",
        "summary": "Search and page through catalog entries.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "description": "Free-text match over name, publisher, description, slug, and capability IDs.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          },
          {
            "name": "kind",
            "in": "query",
            "description": "Restrict to one kind.",
            "schema": {
              "type": "string",
              "enum": [
                "mcp",
                "agent",
                "extension",
                "plugin",
                "skill",
                "webmcp"
              ]
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 24
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of entries",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EntryPage"
                }
              }
            }
          }
        }
      }
    },
    "/api/entries/{kind}/{slug}": {
      "get": {
        "operationId": "getEntry",
        "summary": "Fetch one entry by kind and slug.",
        "parameters": [
          {
            "name": "kind",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "mcp",
                "agent",
                "extension",
                "plugin",
                "skill",
                "webmcp"
              ]
            }
          },
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The entry",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "entry": {
                      "$ref": "#/components/schemas/Entry"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "No such entry"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "CategoryList": {
        "type": "object",
        "properties": {
          "categories": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "enum": [
                    "mcp",
                    "agent",
                    "extension",
                    "plugin",
                    "skill",
                    "webmcp"
                  ]
                },
                "label": {
                  "type": "string"
                },
                "labelPlural": {
                  "type": "string"
                },
                "pitch": {
                  "type": "string"
                },
                "count": {
                  "type": "integer"
                }
              }
            }
          }
        }
      },
      "EntryPage": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string"
          },
          "kind": {
            "type": [
              "string",
              "null"
            ]
          },
          "page": {
            "type": "integer"
          },
          "pages": {
            "type": "integer"
          },
          "pageSize": {
            "type": "integer"
          },
          "total": {
            "type": "integer"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Entry"
            }
          }
        }
      },
      "Entry": {
        "type": "object",
        "description": "A catalog entry with its computed risk profile.",
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "mcp",
              "agent",
              "extension",
              "plugin",
              "skill",
              "webmcp"
            ]
          },
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "vendor": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "website": {
            "type": [
              "string",
              "null"
            ]
          },
          "repository": {
            "type": [
              "string",
              "null"
            ]
          },
          "license": {
            "type": [
              "string",
              "null"
            ]
          },
          "version": {
            "type": [
              "string",
              "null"
            ]
          },
          "trustLevel": {
            "type": "string",
            "enum": [
              "official",
              "community",
              "unknown"
            ]
          },
          "capabilities": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "risk": {
            "$ref": "#/components/schemas/Risk"
          }
        }
      },
      "Risk": {
        "type": "object",
        "properties": {
          "score": {
            "type": "integer",
            "minimum": 0,
            "maximum": 100
          },
          "band": {
            "type": "string",
            "enum": [
              "low",
              "medium",
              "high",
              "critical"
            ]
          },
          "signals": {
            "type": "array",
            "description": "Every term that moved the score, with its contribution. These sum, with clamping, to `score`.",
            "items": {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "contribution": {
                  "type": "integer"
                }
              }
            }
          },
          "dangerousCombos": {
            "type": "array",
            "items": {
              "type": "object"
            }
          }
        }
      }
    }
  }
}