{
  "openapi": "3.1.0",
  "info": {
    "title": "Church Near Me API",
    "version": "1.1.0",
    "description": "Read-only API for the UK Christian church directory. Anonymous access. Service times are included only where verified."
  },
  "servers": [
    {
      "url": "https://churchnearme.org.uk"
    }
  ],
  "paths": {
    "/api/churches": {
      "get": {
        "summary": "List detailed church records",
        "responses": {
          "200": {
            "description": "Directory data returned successfully."
          },
          "400": {
            "description": "Invalid query parameters."
          }
        },
        "parameters": [
          {
            "name": "access",
            "in": "query",
            "description": "A recorded facility; absence is not evidence of unavailability.",
            "schema": {
              "type": "string",
              "enum": [
                "wheelchair",
                "hearing",
                "family",
                "quiet"
              ]
            }
          },
          {
            "name": "day",
            "in": "query",
            "description": "Matches the same listed service as time and language.",
            "schema": {
              "type": "string",
              "enum": [
                "Monday",
                "Tuesday",
                "Wednesday",
                "Thursday",
                "Friday",
                "Saturday",
                "Sunday"
              ]
            }
          },
          {
            "name": "period",
            "in": "query",
            "description": "UK local service start: morning before 12:00, afternoon before 17:00, evening from 17:00.",
            "schema": {
              "type": "string",
              "enum": [
                "morning",
                "afternoon",
                "evening"
              ]
            }
          },
          {
            "name": "language",
            "in": "query",
            "description": "Explicitly recorded service language. Coverage is limited; language is never inferred.",
            "schema": {
              "type": "string",
              "enum": [
                "welsh",
                "english",
                "latin"
              ]
            }
          },
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "denomination",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "country",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "city",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          }
        ]
      }
    },
    "/api/search-basic": {
      "get": {
        "summary": "Search open listings by church name, place or postcode",
        "description": "Open data with scoped parish corrections. Service suspensions are explicit. A correction does not verify all fields.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "country",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "denomination",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "city",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Matching items, total, offset and limit. Each item includes its canonical slug, location and any parish update or service-status notice."
          }
        }
      }
    },
    "/api/churches/{slug}": {
      "get": {
        "summary": "Get one detailed church by slug",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Directory data returned successfully."
          },
          "400": {
            "description": "Invalid query parameters."
          },
          "404": {
            "description": "No detailed record found."
          }
        }
      }
    },
    "/api/churches/nearby": {
      "get": {
        "summary": "Churches near a latitude and longitude",
        "description": "Distance filtering requires recorded coordinates. Some churches have none. Results are sorted by distance.",
        "parameters": [
          {
            "name": "access",
            "in": "query",
            "description": "A recorded facility; absence is not evidence of unavailability.",
            "schema": {
              "type": "string",
              "enum": [
                "wheelchair",
                "hearing",
                "family",
                "quiet"
              ]
            }
          },
          {
            "name": "day",
            "in": "query",
            "description": "Matches the same listed service as time and language.",
            "schema": {
              "type": "string",
              "enum": [
                "Monday",
                "Tuesday",
                "Wednesday",
                "Thursday",
                "Friday",
                "Saturday",
                "Sunday"
              ]
            }
          },
          {
            "name": "period",
            "in": "query",
            "description": "UK local service start: morning before 12:00, afternoon before 17:00, evening from 17:00.",
            "schema": {
              "type": "string",
              "enum": [
                "morning",
                "afternoon",
                "evening"
              ]
            }
          },
          {
            "name": "language",
            "in": "query",
            "description": "Explicitly recorded service language. Coverage is limited; language is never inferred.",
            "schema": {
              "type": "string",
              "enum": [
                "welsh",
                "english",
                "latin"
              ]
            }
          },
          {
            "name": "lat",
            "in": "query",
            "required": true,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "lon",
            "in": "query",
            "required": true,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "radiusKm",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Directory data returned successfully."
          },
          "400": {
            "description": "Invalid query parameters."
          }
        }
      }
    },
    "/api/denominations": {
      "get": {
        "summary": "List denominations",
        "responses": {
          "200": {
            "description": "Directory data returned successfully."
          },
          "400": {
            "description": "Invalid query parameters."
          }
        }
      }
    },
    "/api/cities": {
      "get": {
        "summary": "List cities",
        "responses": {
          "200": {
            "description": "Directory data returned successfully."
          },
          "400": {
            "description": "Invalid query parameters."
          }
        }
      }
    },
    "/mcp": {
      "post": {
        "summary": "MCP JSON-RPC 2.0 (tools/list, tools/call, or direct tool names)",
        "responses": {
          "200": {
            "description": "JSON-RPC result or error response."
          }
        }
      }
    }
  }
}