cineplex-mcp
The cineplex-mcp server lets you look up Cineplex Canada showtimes and find ones with good seats available, with interactive and text-based seat map visualizations.
Find nearby theatres: Search for theatres near a location by latitude/longitude with an optional radius, returning each theatre's ID, name, address, and distance.
Find a movie: Fuzzy-match a movie title against Cineplex's current catalog to retrieve the movie ID needed for other tools.
Find optimal showtimes: For a given movie, theatre, and date, find showtimes matching a format (e.g. IMAX, UltraAVX, Dolby) and score them for seat quality — excluding front rows, side seats, and requiring a minimum contiguous block of seats.
Get optimal seats for a known showtime: Fetch and score the seat map for a specific showtime (by theatre ID + showtime ID) with configurable quality parameters.
Render an interactive HTML seat map: Generate a self-contained HTML page with a pannable/zoomable auditorium map, showtime picker, and live filter controls.
Render an ASCII seat map: Produce a compact text/emoji seat map diagram highlighting optimal seats and including a ticket purchase link.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@cineplex-mcpFind IMAX showtimes for The Odyssey near me with good seats"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
cineplex-mcp
An MCP (Model Context Protocol) server that lets Claude look up Cineplex Canada showtimes and find ones with good seats available — e.g. "Find showtimes for The Odyssey in IMAX 70mm near me with good seats, not the first 3 rows, not on the sides."
This is a personal-use tool, not a commercial product. Cineplex has no
official partner API for this data; this server calls Cineplex's
undocumented public web endpoints directly. It's built to cache
aggressively, keep request volume low, and fail gracefully rather than
pretend otherwise. See cineplex-mcp-PRD.md for the full design rationale.
Status: all four Cineplex data endpoints are confirmed working
All four calls this server depends on hit real, live apis.cineplex.com
endpoints, tested end-to-end against real responses as of 2026-07-19. See
CAPTURE.md for how they were found and what to do if
Cineplex changes something in the future (e.g. rotates the theatrical API's
subscription key).
Related MCP server: Movie Search MCP Server
Setup
npm installNode.js 18+ is required (for built-in fetch).
No environment variables or session tokens are required — every endpoint
this server calls was confirmed to work unauthenticated (theatre/movie/
showtime discovery uses a static, public subscription key baked into
cineplexClient.js; seat data needs no key at all). See CAPTURE.md if
that ever changes.
Running
npm startThis starts the MCP server on stdio, for use by an MCP client (Claude Desktop, Claude Code, etc.) — it's not meant to be run standalone for interactive use.
Claude Desktop configuration
Add to your Claude Desktop config (claude_desktop_config.json):
{
"mcpServers": {
"cineplex": {
"command": "node",
"args": ["/absolute/path/to/cineplex-mcp/src/index.js"]
}
}
}Restart Claude Desktop after editing the config.
Claude Code configuration
claude mcp add cineplex -- node /absolute/path/to/cineplex-mcp/src/index.jsTools exposed
find_theatres—{ lat, lon, rangeKm? }→ nearby theatres (id, name, address, distance), sorted by distance.find_movie—{ title }→ best fuzzy match against Cineplex's current movie catalog, including the Cineplex movie ID.find_optimal_showtimes—{ movieTitle, theatreId, date, formatMatch?, excludeFrontRows?, excludeSideSeats?, minContiguous? }→ showtimes matching a format (default"IMAX", case-insensitive substring match — also works for"IMAX 70mm","UltraAVX","Dolby", etc.), scored for seat quality. Returns both the full scored list and anoptimalsubset.get_optimal_seats—{ theatreId, showtimeId, excludeFrontRows?, excludeSideSeats?, minContiguous? }→ seat score for a single already-known showtime. Cineplex's seat endpoints are keyed by the(theatreId, showtimeId)pair, not showtimeId alone.render_seat_map_html—{ movieTitle, theatreId, date, theatreName?, theatreAddress?, distanceKm?, formatMatch?, excludeFrontRows?, excludeSideSeats?, minContiguous? }→ a complete, self-contained HTML page visualizing real seat availability: showtime chips, a pannable/zoomable auditorium seat map, live filter controls, and a stats strip. Meant to be rendered inline in the chat as a widget (via the Visualizer'sshow_widget), not saved to a file, published as a hosted artifact, or read as data — seesrc/seatMapTemplate.html/.js. The tool only injects real data into an already-built, already-tested template; it never generates new HTML/JS per call, so there's no risk of a fresh generation shipping a UI bug.render_seat_map_ascii—{ theatreId, showtimeId, partySize?, excludeFrontRows?, excludeSideSeats?, monochrome?, theatreName?, showLabel?, buyUrl? }→ a compact ASCII/emoji seat-map diagram as plain text: a centered SCREEN banner, the auditorium as a grid of squares (🟩 open, ⬛ taken, 🟪 accessible), the bestpartySize-block highlighted (🟦, centered within the run), a one-line recommendation, and a trailing🎟 Buy tickets: <url>line. The lightweight, text-only sibling ofrender_seat_map_html— for when a visual helps but an interactive widget is overkill or unavailable (e.g. a plain terminal). The seat grid is pasted verbatim into a fenced code block; the buy line is kept out of the fence and rendered as a clickable Markdown link just below it (links don't linkify inside ```). PassbuyUrlthrough fromfind_optimal_showtimesfor the correct D-BOX-aware link, or omit it to build acineplex.com/ticketing/previewlink from the IDs. Setmonochrome: true(·/▓/+/★) where emoji width misaligns the grid. Rendering logic lives insrc/seatMapAscii.js.
theatreId/showtimeId accept either a string or a number — Cineplex's IDs
are numeric, and find_theatres/find_optimal_showtimes hand them back as
numbers, so chaining one tool's output straight into the next one's input
just works.
Seat-quality parameters
excludeFrontRows(default3): drop this many front rows entirely.excludeSideSeats(default3): trim this many seats from each side of every remaining row (by position, not raw seat number, so aisle gaps don't cause off-by-N errors).minContiguous(default1): require a contiguous block of at least this many available seats — set to2for a couple,4for a group, etc.
Bundled skill: inline seat-map visualization (optional)
This repo ships both an MCP server and a Claude skill
(.claude/skills/cineplex-seat-map).
They serve different jobs, and the dependency only runs one way:
The MCP server works on its own. All five tools return real data as plain text/JSON — theatre lists, showtimes, seat scores. You can ask "which IMAX showtimes have good seats" or "score seats for this showtime" and get a complete answer with no skill involved.
render_seat_map_htmllikewise just returns a finished HTML string; a client is free to save it, open it, or ignore it.The skill is the visualization layer — use it when you want the interactive seat map. Its only job is to take
render_seat_map_html's output and render it inline in the chat as a widget (via the Visualizer'sshow_widget) rather than dumping HTML, saving a file, or publishing a hosted artifact. It's optional: remove the skill and every tool still works; you just render the HTML yourself.
In short: the server answers the question; the skill draws the picture. The skill can't function without this server (it orchestrates these exact tools), but the server never depends on the skill — which is why they live in one repo but stay cleanly separable.
Example prompts
"Find theatres near me at lat 43.65, lon -79.38."
"Look up the movie 'The Odyssey' on Cineplex."
"Find IMAX 70mm showtimes for The Odyssey at theatre 9806 on 2026-07-20 with good seats, not the first 3 rows or within 3 seats of the wall."
"Same as above but I need 2 seats together for me and my partner."
Testing
Unit tests (no network required)
npm testRuns test/seatScoring.test.js (Node's built-in test runner) against a
synthetic 10-row, 12-seat auditorium, covering front-row exclusion,
side-seat exclusion with row gaps, contiguous-run detection, and the
minContiguous parameter.
Manual smoke test (live endpoints)
node -e "
import('./src/cineplexClient.js').then(async (c) => {
const theatres = await c.getTheatres({ lat: 43.6532, lon: -79.3832, rangeKm: 25 });
console.log('theatres found:', theatres.length, theatres[0]);
const movie = await c.findMovieByTitle('Dune');
console.log('best movie match:', movie);
});
"If this returns real data, the caching/throttling/error-handling plumbing
in cineplexClient.js is confirmed working end-to-end. A CineplexApiError
here means something changed upstream — see CAPTURE.md's "If this breaks
in the future" section.
Architecture
src/
index.js # MCP server entrypoint; registers tools, thin glue only
cineplexClient.js # All HTTP calls to Cineplex's API; caching + throttling
seatScoring.js # Pure functions: normalized seat map -> score. No
# network calls, no Cineplex-specific knowledge.
seatMapTemplate.html # Self-contained widget UI (CSS + JS): tabs,
# showtime chips, pan/zoom seat map, live filters.
# Has a JSON-data placeholder, no server logic.
seatMapTemplate.js # Loads the .html above and injects real data into
# its data placeholder. Never regenerates the HTML.
.claude/
skills/
cineplex-seat-map/ # Optional visualization skill: renders
SKILL.md # render_seat_map_html's output inline as a widget.
# Consumes the server; the server never depends on it.
CAPTURE.md # Record of how the live endpoints were found, and how
# to re-capture them if something changesseatScoring.js never sees Cineplex's raw JSON shape — only the normalized
form. normalizeCineplexSeatMap() in cineplexClient.js is the sole
adapter between the two, so a future Cineplex response-shape change (or a
future non-Cineplex chain) only requires a new adapter, not scoring
changes.
Non-goals (v1)
No ticket purchasing — read-only lookups only. Pricing itself isn't even fetched; Cineplex doesn't expose it outside its login-gated checkout flow.
No chains other than Cineplex.
No persistent database — in-memory cache only (process lifetime; seat availability is never cached, since it changes as people book/abandon carts).
No login/auth flows. Every endpoint this server calls was confirmed to work without one.
License
MIT — see LICENSE. This remains an unofficial, personal-use
tool built against Cineplex's undocumented endpoints; see the disclaimer at
the top of this file and in cineplex-mcp-PRD.md before relying on it for
anything beyond that.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityBmaintenanceMCP Server for the Notion API, enabling Claude to interact with Notion workspaces.Last updated311,127912MIT
- AlicenseDqualityDmaintenanceAn MCP server that allows users to search for movies, get detailed information, receive genre-based recommendations, and discover popular/trending films using OMDb and TMDb APIs.Last updated523MIT
- Flicense-qualityCmaintenanceAn MCP server that scrapes movie theater schedules from eiga.com to provide movie, theater, and showtime data to AI assistants. It enables users to search for screenings and calculate the optimal viewing order for watching multiple movies.Last updated
- Alicense-qualityFmaintenanceAn MCP server that allows Claude Code to interact with the OpenAI Codex CLI.Last updated4221MIT
Related MCP Connectors
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
MCP server for OpenAI Sora AI video generation
MCP server for Grok Imagine AI video generation
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/yinbri/cineplex-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server