The Problem
Event organizers using Luma need to manage events, guests, tickets, and registrations through AI coding agents like Codex and Cursor. Without an MCP server, agents have no structured way to call the Luma API, and users must switch between their AI client and the Luma dashboard.
What This Does
luma-events-mcp is an unofficial MCP server that exposes Luma calendar operations as agent-callable tools. It covers event CRUD, guest and ticket management, host coordination, waitlist approval, invitations, and registration summaries. A setup wizard (src/setup.ts) detects installed AI clients and writes their MCP configuration files.
The server is published to npm as luma-events and requires Node.js 20+. It targets MCP protocol 2025-06-18 for compatibility with stable Codex, Cursor, Claude Code, Gemini CLI, and Grok CLI releases.
How It Is Wired
Execution starts at runCli in src/index.ts:1173, which reaches 14 functions and is the main entry point. From there, control flows to createServer, which registers MCP tools. The heaviest internal dependency is the request function, called from 9 places—it is the single choke point for all Luma API calls. pickPrimitiveFields (5 callers) and requireRecord (4 callers) are the next most-connected helpers.
Key operational paths:
updateGuestTickets→request×4,requireRecord×3,recordArray×2updateGuestStatus→request×3,requireRecord×2deleteTicketTypeanddeleteEvent→request×3 each
All mutation tools funnel through requireConfirmation before executing, which is the safety gate for destructive operations.
File map:
src/index.ts— MCP server, all tool handlers,runClientry point (28 functions)src/setup.ts— client detection, API key storage, config writing (32 functions)src/version.ts— version constantscripts/prepare-release.mjs— release prep- Test files:
src/index.test.ts,src/setup.test.ts,src/mcp.integration.test.ts
The module graph is clean: 8 internal modules, 7 import edges, no circular dependencies. src/setup.ts is the hub (imported by 3 files) but has zero outgoing internal imports.
How To Use It
Setup — run the interactive wizard without cloning:
npx -y luma-events setup
Configuration — obtain a Luma calendar API key from Luma's API settings. The wizard stores it locally with owner-only permissions on POSIX systems. Never commit the key.
Running — the server runs as an MCP client configuration, not as a standalone process. Configure it in .cursor/mcp.json or .mcp.json after running the wizard.
Development — clone with:
git clone https://github.com/moses-y/luma-events-mcp
cd luma-events-mcp
pnpm install
pnpm build
Tests live alongside source files (src/*.test.ts) and run via the project's test setup.
Real-World Use
An event organizer using Cursor asks: "Invite everyone who attended last month's workshop to the new launch event, but exclude anyone on the waitlist." The agent calls inviteGuestsFromEvent, which pulls prior attendees, filters by approval status, and creates invitations—all gated by a confirmation prompt before any write occurs.
Code Health & Issues
Static analysis found 5 findings (0 high, 4 medium, 1 low):
- Med — Oversized files:
src/setup.ts,src/index.ts, andsrc/index.test.tsexceed reasonable size (676 code lines in one file). Split by responsibility. - Med — No Dependabot or Renovate configured; dependency advisories go unpatched.
- Med — No dependency vulnerability scan in CI (
.github/workflows/publish.yml). Adddependency-review-actionorosv-scanner. - Med — Generated
dist/(18 files) is committed. Gitignore it and build in CI. - Med —
persist-credentials: falsemissing on checkout inpublish.yml; the token remains available to later steps. - Low — No
timeout-minuteson workflow jobs; a wedged step runs to the six-hour default.
Tests and CI are present; no committed secrets found.
The Bottom Line
A solid, well-structured MCP server for Luma with a clean module graph and a thoughtful confirmation safety layer. The main risks are the oversized core files and the unpatched dependency pipeline. Suitable for event organizers already using Codex or Cursor; the npm distribution makes adoption straightforward.