Wraps Luma's web API to search public events by category or city, with distance filtering from your home address and calendar export to ICS. You get two modes: category search for deep results in your region (hundreds of events tagged with AI, tech, food, etc.) and city search for curated top events anywhere. It handles geocoding via Nominatim, persists preferences in SQLite, and can optionally log in via Playwright to pull events from calendars you follow on Luma. The new event tracker flags anything added in the last N days. Reach for this when you want event discovery in Claude without opening a browser, especially if you're filtering by distance or exporting to your calendar app.
Public tool metadata for what this MCP can expose to an agent.
luma_list_aspect_ratiosList all available aspect ratios for Luma video generation. Shows all available aspect ratio options with their use cases. Use this to understand which aspect ratio to choose for your video. Returns: Table of all aspect ratios with their descriptions and use cases.List all available aspect ratios for Luma video generation. Shows all available aspect ratio options with their use cases. Use this to understand which aspect ratio to choose for your video. Returns: Table of all aspect ratios with their descriptions and use cases.
No parameter schema in public metadata yet.
luma_list_actionsList all available Luma API actions and corresponding tools. Reference guide for what each action does and which tool to use. Helpful for understanding the full capabilities of the Luma MCP. Returns: Categorized list of all actions and their corresponding tools.List all available Luma API actions and corresponding tools. Reference guide for what each action does and which tool to use. Helpful for understanding the full capabilities of the Luma MCP. Returns: Categorized list of all actions and their corresponding tools.
No parameter schema in public metadata yet.
luma_get_taskQuery the status and result of a video generation task. Use this to check if a generation is complete and retrieve the resulting video URLs, thumbnails, and other metadata. Use this when: - You want to check if a generation has completed - You need to retrieve video URLs from...1 paramsQuery the status and result of a video generation task. Use this to check if a generation is complete and retrieve the resulting video URLs, thumbnails, and other metadata. Use this when: - You want to check if a generation has completed - You need to retrieve video URLs from...
task_idstringluma_get_tasks_batchQuery multiple video generation tasks at once. Efficiently check the status of multiple tasks in a single request. More efficient than calling luma_get_task multiple times. Use this when: - You have multiple pending generations to check - You want to get status of several vide...1 paramsQuery multiple video generation tasks at once. Efficiently check the status of multiple tasks in a single request. More efficient than calling luma_get_task multiple times. Use this when: - You have multiple pending generations to check - You want to get status of several vide...
task_idsarrayluma_generate_videoGenerate AI video from a text prompt using Luma Dream Machine. This is the simplest way to create video - just describe what you want and Luma will generate a high-quality AI video. Use this when: - You want to create a video from a text description - You don't have reference...6 paramsGenerate AI video from a text prompt using Luma Dream Machine. This is the simplest way to create video - just describe what you want and Luma will generate a high-quality AI video. Use this when: - You want to create a video from a text description - You don't have reference...
loopbooleanpromptstringtimeoutvalueenhancementbooleanaspect_ratiostring16:9 · 9:16 · 1:1 · 4:3 · 3:4 · 21:9default: 16:9callback_urlvalueluma_generate_video_from_imageGenerate AI video using reference images as start and/or end frames. This allows you to control the video by specifying what the first frame and/or last frame should look like. Luma will generate smooth motion between them. Use this when: - You have a specific image you want t...8 paramsGenerate AI video using reference images as start and/or end frames. This allows you to control the video by specifying what the first frame and/or last frame should look like. Luma will generate smooth motion between them. Use this when: - You have a specific image you want t...
loopbooleanpromptstringtimeoutvalueenhancementbooleanaspect_ratiostring16:9 · 9:16 · 1:1 · 4:3 · 3:4 · 21:9default: 16:9callback_urlvalueend_image_urlstringstart_image_urlstringluma_extend_videoExtend an existing video with additional content. This allows you to continue a previously generated video, adding more motion and content after the original video ends. Use this when: - A generated video is too short and you want to add more - You want to continue the story o...3 paramsExtend an existing video with additional content. This allows you to continue a previously generated video, adding more motion and content after the original video ends. Use this when: - A generated video is too short and you want to add more - You want to continue the story o...
promptstringvideo_idstringend_image_urlstringluma_extend_video_from_urlExtend an existing video using its URL. Similar to luma_extend_video, but uses the video URL instead of video ID. This is useful when you have the video URL but not the original video ID. Use this when: - You have the video URL from a previous generation - You want to extend a...3 paramsExtend an existing video using its URL. Similar to luma_extend_video, but uses the video URL instead of video ID. This is useful when you have the video URL but not the original video ID. Use this when: - You have the video URL from a previous generation - You want to extend a...
promptstringvideo_urlstringend_image_urlstringA FastMCP server that discovers events from Luma — combining the Discover feed and subscribed calendars — with distance filtering and ICS export. No API key required for basic discovery.
Luma's Discover API has two endpoints that behave very differently:
This MCP uses both via two search modes:
city param) — searches your preferred categories via the Category API. Deep, rich results filtered by address and distance.city) — fetches the curated top events for that city via the Place API.On first run, the server returns popular events near you (geo-biased by IP), then walks you through setting up categories, address, and login for progressively richer results.
| Tool | What it does |
|---|---|
search_events | Home mode: search by category with address/distance filtering. Travel mode: curated events for a specific city. |
set_preferences | Save default categories (list), address, and max distance. Persists in SQLite across restarts. |
get_event | Fetch full details for a single event by API id or lu.ma URL. |
export_event_ics | Generate an ICS string for any event — paste into Apple Calendar, Google Calendar, Outlook, etc. |
git clone <this-repo>
cd "Luma Cal MCP"
uv venv .venv --python 3.12
source .venv/bin/activate
uv pip install -e .
To access events from calendars you follow on Luma, install the optional auth dependencies:
uv pip install -e ".[auth]"
playwright install chromium
On first use, the raw Discover feed returns hundreds of popular events near you (geo-biased by IP). The server then walks you through setup one prompt at a time to narrow results:
Each prompt appears after returning results, so you see events immediately. After you configure a preference, the search reruns automatically and the next prompt appears. You can respond "not now" (prompt reappears next time) or "never" (permanently dismissed).
Use set_preferences to save defaults that persist across restarts:
set_preferences(address="3180 18th St, San Francisco", max_distance_miles=15)
set_preferences(categories=["ai", "tech"])
# stdio transport (for Cursor, Claude Desktop, etc.)
fastmcp run src/luma_mcp/server.py
# or directly
python -m luma_mcp.server
Subscribed calendars require a Luma session cookie. The server handles this automatically via an inline login flow.
How it works:
search_events with login=true. A Chromium browser opens to lu.ma/signin; log in normally. The session cookie is stored in the local SQLite DB.search_events with skip_login_days=N to defer (0 = ask next time, -1 = never).The server maintains a local SQLite database (~/.luma-mcp/events.db by default) that records the first time each event is seen. This enables two filters on search_events:
added_within_days — only return events first seen within the last N days.new_only — only return events that have never been seen before.Every result also includes first_seen_at (ISO timestamp) and is_new (boolean).
Add to your Cursor MCP settings (.cursor/mcp.json):
{
"mcpServers": {
"luma-events": {
"command": "uv",
"args": [
"run",
"--directory", "/path/to/Luma Cal MCP",
"fastmcp", "run", "src/luma_mcp/server.py"
],
"env": {
"PYTHONPATH": "/path/to/Luma Cal MCP/src"
}
}
}
}
| Source | Auth | Coverage |
|---|---|---|
Discover (api.lu.ma) | None required | Public events by city and category — same feed as luma.com/discover |
Subscribed calendars (api.lu.ma) | Browser login (auto-managed) | Events from calendars you follow on Luma |
Without logging in, the server still works — Discover is fully available with no authentication.
Set a home address via set_preferences(address="...") with max_distance_miles. In home mode, events beyond the radius are excluded. Events without location data are included by default (with distance_miles: null). In travel mode, distance filtering uses the city center at 25 miles automatically.
Geocoding uses Nominatim (free, OpenStreetMap) by default. For higher volume, set GEOCODING_PROVIDER=google or mapbox with the corresponding GEOCODING_API_KEY in your environment.
Event times (start_at, end_at) are returned in the user's system timezone. The timezone field from Luma is included in every result for reference.
get_event returns the RSVP URL; there's no headless registration path. Use export_event_ics to add events to your calendar.api.lu.ma), which can change without notice. Breakage is isolated to luma_web_client.py.com.mcparmory/google-search
io.github.pipeworx-io/brave-search
marcopesani/mcp-server-serper
brave/brave-search-mcp-server
com.mcparmory/google-search-console
acamolese/google-search-console-mcp