{
  "openapi": "3.1.0",
  "info": {
    "title": "JENRIKS public API",
    "version": "1.0.0",
    "summary": "Read-only JSON API and MCP server for the JENRIKS daily photoblog (one photo per day since 2006).",
    "description": "Everything here is public, read-only and free: no API key, no OAuth, no accounts, no write operations. Stable REST operations carry a major version in the path (/api/v1). Backward-compatible fields may be added within v1; breaking changes get a new major path. Before a version is removed, JENRIKS publishes a migration note at /developers/#versioning and signals it with RFC 9745 Deprecation and Link headers; a dated Sunset header is announced at least 90 days ahead. No sunset is scheduled. Every error is an RFC 9457 problem document (application/problem+json) with a stable code and a resolution hint. Quota: 120 requests per minute per client IP on /api and /mcp, advertised through RateLimit headers; a 429 carries Retry-After. Photographs are copyrighted: credit the photographer and link the page; licensing via https://jenriks.com/contact/.",
    "termsOfService": "https://jenriks.com/developers/#licensing",
    "contact": {
      "name": "JENRIKS",
      "url": "https://jenriks.com/contact/",
      "email": "jenriks@gmail.com"
    },
    "license": {
      "name": "Photographs: all rights reserved. API documents: may be copied freely.",
      "url": "https://jenriks.com/developers/#licensing"
    }
  },
  "servers": [
    {
      "url": "https://jenriks.com",
      "description": "JENRIKS production"
    }
  ],
  "externalDocs": {
    "description": "Developer documentation",
    "url": "https://jenriks.com/developers/"
  },
  "x-api-lifecycle": {
    "current_major_version": "v1",
    "deprecation_policy_url": "https://jenriks.com/developers/#versioning",
    "sunset_notice_days": 90
  },
  "x-rate-limit-policy": {
    "name": "public-read",
    "quota": 120,
    "window_seconds": 60,
    "partition": "client IP address",
    "scope": [
      "/api",
      "/mcp"
    ]
  },
  "tags": [
    {
      "name": "Photos",
      "description": "Search and fetch photographs from the archive"
    },
    {
      "name": "Site",
      "description": "Site-level information and health"
    },
    {
      "name": "MCP",
      "description": "Model Context Protocol server (Streamable HTTP, JSON responses)"
    },
    {
      "name": "Discovery documents",
      "description": "Well-known and machine-readable documents"
    },
    {
      "name": "Content",
      "description": "Feeds and markdown alternates"
    }
  ],
  "paths": {
    "/api/v1": {
      "get": {
        "operationId": "getApiIndex",
        "tags": [
          "Site"
        ],
        "summary": "API index",
        "description": "Lists every v1 endpoint with its parameters, plus links to the documentation, the OpenAPI document and the MCP server.",
        "security": [],
        "responses": {
          "200": {
            "description": "Endpoint index",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Link": {
                "description": "RFC 8288 links: service-desc (this document), service-doc (/developers/), api-catalog",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiIndex"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Allow": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (120 requests per minute per client IP)",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/photos": {
      "get": {
        "operationId": "searchPhotos",
        "tags": [
          "Photos"
        ],
        "summary": "Search photos",
        "description": "Search the whole archive, newest first. Without parameters it returns the latest photos.",
        "security": [],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "description": "Free text matched against title, place, categories, tags and photographer (case-insensitive substring)",
            "schema": {
              "type": "string",
              "maxLength": 200
            },
            "example": "fog"
          },
          {
            "name": "photographer",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "Erik",
                "Jens"
              ]
            }
          },
          {
            "name": "category",
            "in": "query",
            "description": "Abstract, Architecture, B&W, Humans, Landscapes, Macro, Nature, News, Street, Studio, Time exposure",
            "schema": {
              "type": "string",
              "maxLength": 40
            }
          },
          {
            "name": "year",
            "in": "query",
            "description": "Four-digit publication year",
            "schema": {
              "type": "integer",
              "minimum": 2005,
              "maximum": 2100
            }
          },
          {
            "name": "location",
            "in": "query",
            "description": "City or country name (substring)",
            "schema": {
              "type": "string",
              "maxLength": 120
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 10
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Matching photos",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Link": {
                "description": "RFC 8288 links: service-desc (this document), service-doc (/developers/), api-catalog",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotoSearchResult"
                }
              }
            }
          },
          "400": {
            "description": "Invalid parameter",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Allow": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (120 requests per minute per client IP)",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/photos/latest": {
      "get": {
        "operationId": "getLatestPhoto",
        "tags": [
          "Photos"
        ],
        "summary": "Today's photo",
        "description": "The newest post. A new photo appears every day at 00:00 Europe/Berlin.",
        "security": [],
        "responses": {
          "200": {
            "description": "The latest photo",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Link": {
                "description": "RFC 8288 links: service-desc (this document), service-doc (/developers/), api-catalog",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotoEnvelope"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Allow": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (120 requests per minute per client IP)",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/photos/random": {
      "get": {
        "operationId": "getRandomPhoto",
        "tags": [
          "Photos"
        ],
        "summary": "Random photo",
        "description": "One random photo, optionally limited to a photographer, category or year.",
        "security": [],
        "parameters": [
          {
            "name": "photographer",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "Erik",
                "Jens"
              ]
            }
          },
          {
            "name": "category",
            "in": "query",
            "description": "Abstract, Architecture, B&W, Humans, Landscapes, Macro, Nature, News, Street, Studio, Time exposure",
            "schema": {
              "type": "string",
              "maxLength": 40
            }
          },
          {
            "name": "year",
            "in": "query",
            "description": "Four-digit publication year",
            "schema": {
              "type": "integer",
              "minimum": 2005,
              "maximum": 2100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A random photo (found=false when no photo matches the filters)",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Link": {
                "description": "RFC 8288 links: service-desc (this document), service-doc (/developers/), api-catalog",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RandomPhotoResult"
                }
              }
            }
          },
          "400": {
            "description": "Invalid parameter",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Allow": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (120 requests per minute per client IP)",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/photos/{date}": {
      "get": {
        "operationId": "getPhotoByDate",
        "tags": [
          "Photos"
        ],
        "summary": "Photo by publication date",
        "description": "One post per day exists from 2006-01-01 to today.",
        "security": [],
        "parameters": [
          {
            "name": "date",
            "in": "path",
            "required": true,
            "description": "YYYY-MM-DD",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
            },
            "example": "2026-09-04"
          }
        ],
        "responses": {
          "200": {
            "description": "The photo published on that date",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Link": {
                "description": "RFC 8288 links: service-desc (this document), service-doc (/developers/), api-catalog",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotoEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Malformed date",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "No post on that date",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Allow": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (120 requests per minute per client IP)",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/overview": {
      "get": {
        "operationId": "getSiteOverview",
        "tags": [
          "Site"
        ],
        "summary": "Site overview",
        "description": "Totals, photographers, categories with counts, posts per year, section URLs, URL pattern and license terms.",
        "security": [],
        "responses": {
          "200": {
            "description": "Overview",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Link": {
                "description": "RFC 8288 links: service-desc (this document), service-doc (/developers/), api-catalog",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SiteOverview"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Allow": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (120 requests per minute per client IP)",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/health": {
      "get": {
        "operationId": "getApiHealth",
        "tags": [
          "Site"
        ],
        "summary": "API and MCP health",
        "security": [],
        "responses": {
          "200": {
            "description": "Healthy",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Link": {
                "description": "RFC 8288 links: service-desc (this document), service-doc (/developers/), api-catalog",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Health"
                }
              }
            }
          },
          "503": {
            "description": "Photo index unavailable",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Allow": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (120 requests per minute per client IP)",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/mcp": {
      "post": {
        "operationId": "mcp",
        "tags": [
          "MCP"
        ],
        "summary": "MCP server (JSON-RPC 2.0 over Streamable HTTP, JSON responses)",
        "security": [],
        "description": "Methods: initialize, ping, tools/list, tools/call, resources/list, resources/read. Tools: search_photos, get_photo, get_latest_photo, random_photo, get_site_overview (each declares an outputSchema). Stateless: no sessions, no server-initiated event stream. Server card: /.well-known/mcp/server-card.json; registry manifest: /server.json.",
        "parameters": [
          {
            "name": "MCP-Protocol-Version",
            "in": "header",
            "required": false,
            "description": "MCP protocol version negotiated during initialize (2025-06-18, 2025-03-26 or 2024-11-05); echoed in the response header of the same name",
            "schema": {
              "type": "string",
              "enum": [
                "2025-06-18",
                "2025-03-26",
                "2024-11-05"
              ]
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/JsonRpcRequest"
                  },
                  {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/JsonRpcRequest"
                    },
                    "maxItems": 20
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "JSON-RPC response (array when the request was a batch)",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "MCP-Protocol-Version": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/JsonRpcResponse"
                    },
                    {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/JsonRpcResponse"
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "Notification accepted, no body",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "400": {
            "description": "Body is not valid JSON (JSON-RPC parse error) or an invalid request",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JsonRpcResponse"
                }
              }
            }
          },
          "413": {
            "description": "Body larger than 64 KB",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "415": {
            "description": "Content-Type is not application/json",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Allow": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (120 requests per minute per client IP)",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "get": {
        "operationId": "mcpGet",
        "tags": [
          "MCP"
        ],
        "summary": "Not supported (no server-initiated event stream)",
        "security": [],
        "responses": {
          "405": {
            "description": "Method not allowed; POST JSON-RPC instead",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              },
              "Allow": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/mcp/health": {
      "get": {
        "operationId": "getMcpHealth",
        "tags": [
          "MCP"
        ],
        "summary": "MCP server health",
        "security": [],
        "responses": {
          "200": {
            "description": "Healthy",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Health"
                }
              }
            }
          },
          "503": {
            "description": "Photo index unavailable",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/.well-known/mcp/server-card.json": {
      "get": {
        "operationId": "getMcpServerCard",
        "summary": "MCP server card",
        "description": "Also served at /mcp/server-card as application/mcp-server-card+json, and at /.well-known/mcp.json, /mcp.json, /mcp/manifest.json, /.well-known/mcp/manifest.json for clients that probe those paths.",
        "tags": [
          "MCP"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "MCP server card",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/McpServerCard"
                }
              }
            }
          },
          "404": {
            "description": "Document not published",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/server.json": {
      "get": {
        "operationId": "getMcpRegistryManifest",
        "summary": "MCP Registry server.json manifest",
        "description": "MCP Registry format (schema 2025-12-11) describing the remote Streamable HTTP endpoint.",
        "tags": [
          "MCP"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "MCP Registry server.json manifest",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/McpRegistryServer"
                }
              }
            }
          },
          "404": {
            "description": "Document not published",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/.well-known/api-catalog": {
      "get": {
        "operationId": "getApiCatalog",
        "summary": "API catalog (RFC 9727 linkset)",
        "description": "Lists the REST API, the MCP server and the site with service-desc, service-doc, service-meta and status links.",
        "tags": [
          "Discovery documents"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "API catalog (RFC 9727 linkset)",
            "content": {
              "application/linkset+json": {
                "schema": {
                  "$ref": "#/components/schemas/Linkset"
                }
              }
            }
          },
          "404": {
            "description": "Document not published",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/.well-known/ai-catalog.json": {
      "get": {
        "operationId": "getAiCatalog",
        "summary": "AI catalog (ARD manifest)",
        "description": "Agentic Resource Discovery manifest; also served as application/ai-catalog+json when requested.",
        "tags": [
          "Discovery documents"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "AI catalog (ARD manifest)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiCatalog"
                }
              }
            }
          },
          "404": {
            "description": "Document not published",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/.well-known/agent-skills/index.json": {
      "get": {
        "operationId": "getAgentSkillsIndex",
        "summary": "Agent skills discovery index",
        "description": "Lists the jenriks-photos SKILL.md with its SHA-256 digest.",
        "tags": [
          "Discovery documents"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "Agent skills discovery index",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentSkillsIndex"
                }
              }
            }
          },
          "404": {
            "description": "Document not published",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/.well-known/ai-plugin.json": {
      "get": {
        "operationId": "getAiPluginManifest",
        "summary": "AI plugin manifest",
        "description": "Legacy plugin manifest pointing at this OpenAPI document; auth type none.",
        "tags": [
          "Discovery documents"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "AI plugin manifest",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "Document not published",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/auth.md": {
      "get": {
        "operationId": "getAuthMd",
        "summary": "Authentication note",
        "description": "States that no authentication or registration exists.",
        "tags": [
          "Discovery documents"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "Authentication note",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "Document not published",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/llms.txt": {
      "get": {
        "operationId": "getLlmsTxt",
        "summary": "Agent index (llms.txt)",
        "description": "What the site is, when to use it, how to fetch it, license and contact.",
        "tags": [
          "Content"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "Agent index (llms.txt)",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "Document not published",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/llms-full.txt": {
      "get": {
        "operationId": "getLlmsFullTxt",
        "summary": "Expanded agent index",
        "description": "Counts per photographer, category, location and year plus URL conventions.",
        "tags": [
          "Content"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "Expanded agent index",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "Document not published",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/feed.xml": {
      "get": {
        "operationId": "getRssFeed",
        "summary": "RSS feed",
        "description": "Latest 20 photos as RSS 2.0.",
        "tags": [
          "Content"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "RSS feed",
            "content": {
              "application/rss+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "Document not published",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/sitemap.xml": {
      "get": {
        "operationId": "getSitemap",
        "summary": "XML sitemap",
        "description": "Every photo page with image extensions.",
        "tags": [
          "Content"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "XML sitemap",
            "content": {
              "application/xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "Document not published",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/index.md": {
      "get": {
        "operationId": "getTodayMarkdown",
        "summary": "Today's photo (markdown)",
        "description": "Also returned by GET / with Accept: text/markdown.",
        "tags": [
          "Content"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "Today's photo (markdown)",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "Document not published",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/about.md": {
      "get": {
        "operationId": "getAboutMarkdown",
        "summary": "About page (markdown)",
        "description": "Also returned by GET /about/ with Accept: text/markdown.",
        "tags": [
          "Content"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "About page (markdown)",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "Document not published",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/contact.md": {
      "get": {
        "operationId": "getContactMarkdown",
        "summary": "Contact page (markdown)",
        "description": "Prints, licensing and press.",
        "tags": [
          "Content"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "Contact page (markdown)",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "Document not published",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/developers.md": {
      "get": {
        "operationId": "getDevelopersMarkdown",
        "summary": "Developer documentation (markdown)",
        "description": "Markdown alternate of /developers/.",
        "tags": [
          "Content"
        ],
        "security": [],
        "responses": {
          "200": {
            "description": "Developer documentation (markdown)",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "Document not published",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error, as an RFC 9457 problem document",
            "headers": {
              "RateLimit-Policy": {
                "description": "Quota policy, IETF RateLimit structured field: \"public-read\";q=120;w=60",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit": {
                "description": "Remaining quota and seconds until reset: \"public-read\";r=57;t=41",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Compatibility form of the quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Compatibility form of the remaining quota",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the window resets",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem details. Served as application/problem+json on every 4xx/5xx from /api, /mcp and the discovery documents, and on page URLs when the client accepts only JSON.",
        "required": [
          "type",
          "title",
          "status",
          "detail",
          "instance",
          "code",
          "resolution"
        ],
        "properties": {
          "type": {
            "description": "URI identifying the problem type; resolves to the matching entry in /developers/#errors",
            "type": "string",
            "format": "uri"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer",
            "minimum": 400,
            "maximum": 599
          },
          "detail": {
            "type": "string"
          },
          "instance": {
            "description": "The request URL",
            "type": "string",
            "format": "uri"
          },
          "code": {
            "description": "Stable machine-readable code",
            "type": "string",
            "enum": [
              "not_found",
              "api_route_not_found",
              "photo_not_found",
              "method_not_allowed",
              "invalid_parameter",
              "not_acceptable",
              "unsupported_media_type",
              "payload_too_large",
              "rate_limit_exceeded",
              "service_unavailable"
            ]
          },
          "resolution": {
            "description": "What to do instead",
            "type": "string"
          },
          "documentation_url": {
            "type": "string",
            "format": "uri"
          }
        },
        "additionalProperties": true
      },
      "PhotoImage": {
        "type": "object",
        "required": [
          "full"
        ],
        "properties": {
          "full": {
            "description": "1600 px long edge",
            "type": "string",
            "format": "uri"
          },
          "thumbnail": {
            "description": "400 px long edge",
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          }
        }
      },
      "Photo": {
        "type": "object",
        "required": [
          "title",
          "photographer",
          "date",
          "url",
          "categories",
          "tags",
          "image",
          "credit"
        ],
        "properties": {
          "title": {
            "type": "string"
          },
          "photographer": {
            "type": "string",
            "enum": [
              "Erik",
              "Jens"
            ]
          },
          "date": {
            "description": "Publication date, YYYY-MM-DD",
            "type": "string",
            "format": "date"
          },
          "url": {
            "description": "Permanent page URL",
            "type": "string",
            "format": "uri"
          },
          "location": {
            "type": [
              "string",
              "null"
            ],
            "description": "City and country when known"
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "image": {
            "$ref": "#/components/schemas/PhotoImage"
          },
          "credit": {
            "description": "Ready-made credit line: photographer, JENRIKS, page URL",
            "type": "string"
          }
        }
      },
      "PhotoSearchResult": {
        "type": "object",
        "required": [
          "total_matches",
          "offset",
          "returned",
          "photos"
        ],
        "properties": {
          "total_matches": {
            "type": "integer",
            "minimum": 0
          },
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "returned": {
            "type": "integer",
            "minimum": 0
          },
          "photos": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Photo"
            }
          },
          "next_offset": {
            "description": "Present when more matches exist",
            "type": "integer"
          }
        }
      },
      "PhotoEnvelope": {
        "type": "object",
        "required": [
          "photo"
        ],
        "properties": {
          "photo": {
            "$ref": "#/components/schemas/Photo"
          }
        }
      },
      "PhotoLookupResult": {
        "type": "object",
        "required": [
          "found"
        ],
        "properties": {
          "found": {
            "type": "boolean"
          },
          "photo": {
            "$ref": "#/components/schemas/Photo"
          },
          "date": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "hint": {
            "type": "string"
          }
        }
      },
      "RandomPhotoResult": {
        "type": "object",
        "required": [
          "found"
        ],
        "properties": {
          "found": {
            "type": "boolean"
          },
          "photo": {
            "$ref": "#/components/schemas/Photo"
          },
          "pool_size": {
            "type": "integer"
          },
          "hint": {
            "type": "string"
          }
        }
      },
      "SiteOverview": {
        "type": "object",
        "required": [
          "site",
          "description",
          "total_photos",
          "first_date",
          "latest_date",
          "photographers",
          "categories",
          "years",
          "sections",
          "url_pattern",
          "license"
        ],
        "properties": {
          "site": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "total_photos": {
            "type": "integer"
          },
          "first_date": {
            "type": "string",
            "format": "date"
          },
          "latest_date": {
            "type": "string",
            "format": "date"
          },
          "photographers": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "name",
                "full_name",
                "photos",
                "page"
              ],
              "properties": {
                "name": {
                  "type": "string"
                },
                "full_name": {
                  "type": "string"
                },
                "photos": {
                  "type": "integer"
                },
                "page": {
                  "type": "string",
                  "format": "uri"
                }
              }
            }
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "name",
                "photos"
              ],
              "properties": {
                "name": {
                  "type": "string"
                },
                "photos": {
                  "type": "integer"
                }
              }
            }
          },
          "years": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "year",
                "photos"
              ],
              "properties": {
                "year": {
                  "type": "string"
                },
                "photos": {
                  "type": "integer"
                }
              }
            }
          },
          "sections": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "format": "uri"
            }
          },
          "url_pattern": {
            "type": "string"
          },
          "license": {
            "type": "string"
          }
        }
      },
      "Health": {
        "type": "object",
        "required": [
          "status",
          "server",
          "version",
          "endpoint",
          "time"
        ],
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "ok",
              "degraded"
            ]
          },
          "server": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "endpoint": {
            "type": "string",
            "format": "uri"
          },
          "photos_indexed": {
            "type": [
              "integer",
              "null"
            ]
          },
          "time": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "ApiIndex": {
        "type": "object",
        "required": [
          "name",
          "version",
          "documentation",
          "openapi",
          "endpoints"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "documentation": {
            "type": "string",
            "format": "uri"
          },
          "openapi": {
            "type": "string",
            "format": "uri"
          },
          "mcp": {
            "type": "string",
            "format": "uri"
          },
          "rate_limit": {
            "type": "string"
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "method",
                "path",
                "description"
              ],
              "properties": {
                "method": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "parameters": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      },
      "JsonRpcRequest": {
        "type": "object",
        "required": [
          "jsonrpc",
          "method"
        ],
        "properties": {
          "jsonrpc": {
            "type": "string",
            "const": "2.0"
          },
          "id": {
            "type": [
              "string",
              "integer",
              "null"
            ]
          },
          "method": {
            "type": "string",
            "examples": [
              "initialize",
              "tools/list",
              "tools/call",
              "resources/list",
              "resources/read",
              "ping"
            ]
          },
          "params": {
            "type": "object"
          }
        }
      },
      "JsonRpcError": {
        "type": "object",
        "required": [
          "code",
          "message"
        ],
        "properties": {
          "code": {
            "type": "integer"
          },
          "message": {
            "type": "string"
          },
          "data": {}
        }
      },
      "JsonRpcResponse": {
        "type": "object",
        "required": [
          "jsonrpc",
          "id"
        ],
        "properties": {
          "jsonrpc": {
            "type": "string",
            "const": "2.0"
          },
          "id": {
            "type": [
              "string",
              "integer",
              "null"
            ]
          },
          "result": {
            "type": "object"
          },
          "error": {
            "$ref": "#/components/schemas/JsonRpcError"
          }
        }
      },
      "McpServerCard": {
        "type": "object",
        "required": [
          "name",
          "version",
          "description",
          "serverInfo",
          "transport",
          "capabilities",
          "remotes"
        ],
        "properties": {
          "$schema": {
            "type": "string",
            "format": "uri"
          },
          "name": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "websiteUrl": {
            "type": "string",
            "format": "uri"
          },
          "remotes": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "type",
                "url"
              ],
              "properties": {
                "type": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "supportedProtocolVersions": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "serverInfo": {
            "type": "object",
            "required": [
              "name",
              "version"
            ],
            "properties": {
              "name": {
                "type": "string"
              },
              "title": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "transport": {
            "type": "object",
            "required": [
              "type",
              "endpoint"
            ],
            "properties": {
              "type": {
                "type": "string"
              },
              "endpoint": {
                "type": "string",
                "format": "uri"
              }
            }
          },
          "protocolVersion": {
            "type": "string"
          },
          "capabilities": {
            "type": "object"
          },
          "authentication": {
            "type": "object"
          },
          "documentation": {
            "type": "string",
            "format": "uri"
          },
          "registryManifest": {
            "type": "string",
            "format": "uri"
          },
          "health": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "McpRegistryServer": {
        "type": "object",
        "required": [
          "name",
          "description",
          "version"
        ],
        "properties": {
          "$schema": {
            "type": "string",
            "format": "uri"
          },
          "name": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "websiteUrl": {
            "type": "string",
            "format": "uri"
          },
          "remotes": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "type",
                "url"
              ],
              "properties": {
                "type": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                }
              }
            }
          }
        }
      },
      "Linkset": {
        "type": "object",
        "required": [
          "linkset"
        ],
        "properties": {
          "linkset": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "anchor"
              ],
              "properties": {
                "anchor": {
                  "type": "string",
                  "format": "uri"
                }
              },
              "additionalProperties": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "href"
                  ],
                  "properties": {
                    "href": {
                      "type": "string",
                      "format": "uri"
                    },
                    "type": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "AiCatalog": {
        "type": "object",
        "required": [
          "specVersion",
          "host",
          "entries"
        ],
        "properties": {
          "specVersion": {
            "type": "string"
          },
          "host": {
            "type": "object",
            "required": [
              "displayName",
              "identifier"
            ],
            "properties": {
              "displayName": {
                "type": "string"
              },
              "identifier": {
                "type": "string"
              },
              "url": {
                "type": "string",
                "format": "uri"
              },
              "description": {
                "type": "string"
              },
              "contact": {
                "type": "string",
                "format": "uri"
              }
            }
          },
          "entries": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "identifier",
                "displayName",
                "type"
              ],
              "properties": {
                "identifier": {
                  "type": "string"
                },
                "displayName": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "type": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "representativeQueries": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      },
      "AgentSkillsIndex": {
        "type": "object",
        "required": [
          "$schema",
          "skills"
        ],
        "properties": {
          "$schema": {
            "type": "string",
            "format": "uri"
          },
          "skills": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "name",
                "type",
                "description",
                "url",
                "digest"
              ],
              "properties": {
                "name": {
                  "type": "string"
                },
                "type": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "digest": {
                  "type": "string",
                  "pattern": "^sha256:[0-9a-f]{64}$"
                }
              }
            }
          }
        }
      }
    }
  }
}
