{
  "$schema": "https://modelcontextprotocol.io/schemas/mcp-discovery.json",
  "name": "open-cinema",
  "title": "Open Cinema Project",
  "description": "Read-only MCP server for indie & repertory cinema showtimes from the nonprofit Open Cinema Project. Search screenings, theaters, and films; check data freshness.",
  "version": "1.0.0",
  "vendor": {
    "name": "Open Cinema Project",
    "url": "https://opencinemaproject.com",
    "email": "hi@opencinemaproject.com"
  },
  "documentation": "https://github.com/opencinemaproject/opencinemaproject/blob/main/docs/MCP.md",
  "transport": {
    "type": "http",
    "url": "https://opencinemaproject.com/api/mcp"
  },
  "endpoints": [
    {
      "type": "streamable-http",
      "url": "https://opencinemaproject.com/api/mcp"
    }
  ],
  "capabilities": {
    "tools": [
      {
        "name": "search_screenings",
        "description": "Find upcoming movie screenings filtered by location, date, theater, or film title."
      },
      {
        "name": "search_theaters",
        "description": "Find theaters by location (lat/lon + radius) or by id list."
      },
      {
        "name": "lookup_film",
        "description": "Fetch film details (title, year, runtime, poster, synopsis, trailer, cast) by id or title."
      },
      {
        "name": "get_status",
        "description": "Snapshot of scraper-fleet health and per-theater freshness timestamps."
      },
      {
        "name": "report_broken_link",
        "description": "Flag a screening whose ticket purchase URL is broken or wrong. Queues a re-scrape and notifies webhook subscribers."
      },
      {
        "name": "list_follows",
        "description": "List films, theaters, and city radii the signed-in user follows. Requires a personal MCP token (Bearer ocu_…) minted at /me/mcp-token."
      },
      {
        "name": "follow",
        "description": "Subscribe the signed-in user to email alerts when new screenings appear for a film, theater, or city radius. Requires a personal MCP token."
      },
      {
        "name": "unfollow",
        "description": "Unsubscribe the signed-in user from a follow by its id. Requires a personal MCP token."
      }
    ],
    "resources": [
      {
        "uri": "opencinema://theaters",
        "name": "theaters_index",
        "description": "Browsable list of all theaters in the catalog (capped at 200)."
      },
      {
        "uriTemplate": "opencinema://theaters/{theater_id}",
        "name": "theater",
        "description": "Single theater detail by id."
      },
      {
        "uriTemplate": "opencinema://films/{film_id}",
        "name": "film",
        "description": "Single film detail by canonical id or alias (TMDB-enriched when available)."
      }
    ],
    "prompts": []
  },
  "authentication": {
    "type": "optional-bearer",
    "notes": "Read tools work anonymously (30 req/min, 200 req/day per IP). For higher limits send a free API key from /developers as `Authorization: Bearer oc_live_…` (60 req/min, 10000 req/day per key). To use the per-user write tools (follow / unfollow / list_follows), sign in at /me/follows and mint a personal MCP token at /me/mcp-token, then send it as `Authorization: Bearer ocu_…`."
  },
  "rateLimit": {
    "anonymous":    { "perMinute": 30, "perDay": 200,    "scope": "per-ip" },
    "authenticated":{ "perMinute": 60, "perDay": 10000,  "scope": "per-key" }
  }
}
