Run your events end to end — create, ticket, discount, invite, and manage every guest.
A Model Context Protocol (MCP) server that exposes Luma's API for event creation, ticketing, coupons, and guest management.
The mewcp-luma MCP Server provides full lifecycle control over Luma events and their guests:
- Create and update events, ticket types, and discount coupons
- Add, invite, approve, decline, waitlist, and re-ticket guests
- Read event details, guest lists, ticket types, coupons, and calendar metadata
Perfect for:
- Automating event setup — event, tickets, pricing, and promo codes in one flow
- Running guest operations at scale — bulk adds, invites, and approval sweeps
- Reporting on registrations, check-ins, and ticket orders from an agent
get_calendar — Read the calendar's metadata
Retrieves details for a calendar and returns its metadata, including name, slug, URL, description, location, coordinates, and social handles.
Inputs:
(no parameters)
Output data schema:
{
id: string;
name: string | null;
slug: string | null;
avatar_url: string | null;
url: string | null;
description: string | null;
social_image_url: string | null;
cover_image_url: string | null;
is_personal: boolean | null;
location: {
city: string | null;
region: string | null;
country: string | null;
country_code: string | null;
timezone: string | null;
} | null;
coordinate: {
longitude: number | null;
latitude: number | null;
} | null;
instagram_handle: string | null;
twitter_handle: string | null;
youtube_handle: string | null;
website: string | null;
}get_event — Read one event's full details
Retrieves the full details of a single event you have manage access for, including hosts and a breakdown of guest counts by status.
Inputs:
- `event_id` (string, required) — Event ID, this usually starts with evt-.
Output data schema:
{
platform: string | null;
id: string;
user_id: string | null;
calendar_id: string | null;
start_at: string | null;
duration_interval: string | null;
end_at: string | null;
created_at: string | null;
timezone: string | null;
name: string | null;
geo_address_json: {
address: string | null;
city: string | null;
region: string | null;
country: string | null;
city_state: string | null;
full_address: string | null;
google_maps_place_id: string | null;
apple_maps_place_id: string | null;
description: string | null;
} | null;
coordinate: {
longitude: number | null;
latitude: number | null;
} | null;
meeting_url: string | null;
location_type: string | null;
location_visibility: string | null;
cover_url: string | null;
registration_questions: {
id: string | null;
label: string | null;
required: boolean | null;
question_type: string | null;
collect_job_title: boolean | null;
job_title_label: string | null;
options: string[] | null;
terms: {
content_type: string | null;
content_md: string | null;
collect_signature: boolean | null;
require_review: boolean | null;
} | null;
}[] | null;
url: string | null;
visibility: string | null;
waitlist_status: string | null;
registration_open: boolean | null;
require_approval: boolean | null;
spots_remaining: number | null;
display_price: {
amount: number | null;
currency: string | null;
is_flexible: boolean | null;
} | null;
feedback_email: {
enabled: boolean | null;
delay: string | null;
} | null;
access: string | null;
description: string | null;
description_md: string | null;
hosts: {
id: string | null;
email: string | null;
name: string | null;
first_name: string | null;
last_name: string | null;
avatar_url: string | null;
}[] | null;
guest_counts: {
approved: { guests: number | null; tickets: number | null } | null;
pending_approval: { guests: number | null; tickets: number | null } | null;
waitlist: { guests: number | null; tickets: number | null } | null;
invited: { guests: number | null; tickets: number | null } | null;
declined: { guests: number | null; tickets: number | null } | null;
checked_in: { guests: number | null; tickets: number | null } | null;
} | null;
}get_guest — Read one guest, with ticket orders
Retrieves the details of a single guest for an event, including ticket order details.
Inputs:
- `event_id` (string, required) — Event ID, this usually starts with evt-.
- `id` (string, required) — Guest identifier — the guest ID (gst-), a ticket key, a guest key (g-), or the user's email.
Output data schema:
{
id: string;
user_id: string | null;
user_email: string | null;
user_name: string | null;
user_first_name: string | null;
user_last_name: string | null;
approval_status: string | null;
check_in_qr_code: string | null;
eth_address: string | null;
invited_at: string | null;
joined_at: string | null;
phone_number: string | null;
registered_at: string | null;
registration_answers: {
label: string | null;
question_id: string | null;
value: any | null;
question_type: string | null;
}[] | null;
solana_address: string | null;
utm_source: string | null;
event_tickets: {
id: string | null;
amount: number | null;
amount_discount: number | null;
amount_tax: number | null;
currency: string | null;
checked_in_at: string | null;
event_ticket_type_id: string | null;
is_captured: boolean | null;
name: string | null;
}[] | null;
event_ticket_orders: {
id: string | null;
amount: number | null;
amount_discount: number | null;
amount_tax: number | null;
currency: string | null;
coupon_info: {
api_id: string | null;
percent_off: number | null;
cents_off: number | null;
currency: string | null;
code: string | null;
} | null;
is_captured: boolean | null;
}[] | null;
}get_ticket_type — Read one ticket type
Retrieves the details of a single ticket type.
Inputs:
- `event_ticket_type_id` (string, required) — Ticket type ID, this usually starts with ttype-.
Output data schema:
{
id: string;
name: string | null;
require_approval: boolean | null;
is_hidden: boolean | null;
description: string | null;
valid_start_at: string | null;
valid_end_at: string | null;
max_capacity: number | null;
type: string | null;
cents: number | null;
currency: string | null;
is_flexible: boolean | null;
min_cents: number | null;
}list_event_coupons — Page through an event's coupons
Returns a paginated list of coupons associated with an event.
Inputs:
- `event_id` (string, required) — Event ID, this usually starts with evt-.
- `pagination_cursor` (string, optional, default: null) — Value of next_cursor from a previous request.
- `pagination_limit` (number, optional, default: null) — The number of items to return. The server enforces a maximum.
Output data schema:
{
entries: {
id: string;
code: string | null;
remaining_count: integer | null;
valid_start_at: string | null;
valid_end_at: string | null;
percent_off: number | null;
cents_off: number | null;
currency: string | null;
event_ticket_type_id: string | null;
}[];
has_more: boolean | null;
next_cursor: string | null;
}list_guests — Page through an event's guests
Returns a paginated list of guests who have registered or been invited to an event, including guest summaries and event_tickets (use get_guest for order-level detail).
Inputs:
- `event_id` (string, required) — Event ID, this usually starts with evt-.
- `approval_status` (string, optional, default: null) — Filter by status: approved, session, pending_approval, invited, declined, or waitlist.
- `pagination_cursor` (string, optional, default: null) — Value of next_cursor from a previous request.
- `pagination_limit` (number, optional, default: null) — The number of items to return. The server enforces a maximum.
- `sort_column` (string, optional, default: null) — name, email, created_at, registered_at, or checked_in_at.
- `sort_direction` (string, optional, default: null) — asc, desc, asc nulls last, or desc nulls last.
Output data schema:
{
entries: {
id: string;
user_id: string | null;
user_email: string | null;
user_name: string | null;
user_first_name: string | null;
user_last_name: string | null;
approval_status: string | null;
check_in_qr_code: string | null;
eth_address: string | null;
invited_at: string | null;
joined_at: string | null;
phone_number: string | null;
registered_at: string | null;
registration_answers: {
label: string | null;
question_id: string | null;
value: any | null;
question_type: string | null;
}[] | null;
solana_address: string | null;
utm_source: string | null;
event_tickets: {
id: string | null;
amount: number | null;
amount_discount: number | null;
amount_tax: number | null;
currency: string | null;
checked_in_at: string | null;
event_ticket_type_id: string | null;
is_captured: boolean | null;
name: string | null;
}[] | null;
}[];
has_more: boolean | null;
next_cursor: string | null;
}list_ticket_types — List every ticket type on an event
Returns the full list of ticket types for an event in one response (not paginated).
Inputs:
- `event_id` (string, required) — Event ID, this usually starts with evt-.
- `include_hidden` (string, optional, default: null) — Include hidden ticket types in the results.
Output data schema:
{
entries: {
id: string;
name: string | null;
require_approval: boolean | null;
is_hidden: boolean | null;
description: string | null;
valid_start_at: string | null;
valid_end_at: string | null;
max_capacity: number | null;
type: string | null;
cents: number | null;
currency: string | null;
is_flexible: boolean | null;
min_cents: number | null;
}[];
}request_event_cancellation — Step 1 of cancelling: token + impact preview
Requests a short-lived cancellation token and impact preview (guest count, whether paid) for an event — the first step of Luma's two-step cancellation flow.
Inputs:
- `event_id` (string, required) — Event ID, this usually starts with evt-.
Output data schema:
{
cancellation_token: string;
is_paid: boolean | null;
guest_count: number | null;
}create_event — Create a new event
Creates a new event and returns its id.
Inputs:
- `name` (string, required) — Event name.
- `start_at` (string, required) — ISO 8601 datetime the event starts.
- `timezone` (string, required) — IANA timezone, e.g. America/New_York.
- `can_register_for_multiple_tickets` (boolean, optional, default: null) — Whether a single guest can register for multiple tickets.
- `cover_url` (string, optional, default: null) — Cover image URL; must be hosted on the Luma CDN (images.lumacdn.com), uploaded via /v1/images/create-upload-url first.
- `coordinate` (object, optional, default: null) — {longitude, latitude} for the event location.
- `description_md` (string, optional, default: null) — Markdown description, converted internally to Luma's rich text format; embedded images must be hosted on the Luma CDN.
- `end_at` (string, optional, default: null) — ISO 8601 datetime the event ends.
- `geo_address_json` (object, optional, default: null) — Either {type: "manual", address} for a free-text address, or {type: "google", place_id, description?} for a Google Maps Place ID.
- `location_visibility` (string, optional, default: null) — public (default) or guests-only — hides the precise location from unapproved guests.
- `max_capacity` (number, optional, default: null) — Maximum registrations before the event is marked sold out (or guests join the waitlist, if enabled).
- `meeting_url` (string, optional, default: null) — Virtual meeting URL for online events.
- `name_requirement` (string, optional, default: null) — full-name or first-last — whether to split the guest name field into first/last.
- `phone_number_requirement` (string, optional, default: null) — optional or required — whether guests must supply a phone number at registration; omit to not collect it.
- `registration_open` (boolean, optional, default: null) — Whether to accept registrations. Defaults to true.
- `registration_questions` (object[], optional, default: null) — Custom registration questions; each object is discriminated by question_type (agree-check, company, dropdown, github, instagram, linkedin, long-text, multi-select, phone-number, telegram, text, twitter, url, youtube, terms).
- `reminders_disabled` (boolean, optional, default: null) — Turns off Luma's default pre-event reminder emails.
- `feedback_email` (object, optional, default: null) — {enabled, delay} settings for the post-event feedback email; delay defaults to PT0M, maximum P7D.
- `show_guest_list` (boolean, optional, default: null) — Whether approved guests can see who else is attending.
- `slug` (string, optional, default: null) — URL slug for the event page (luma.com/<slug>); creation fails if unavailable.
- `tint_color` (string, optional, default: null) — Hex color, e.g. #bb2dc7; alpha channels are stripped.
- `visibility` (string, optional, default: null) — public, members-only, or private.
- `waitlist_status` (string, optional, default: null) — disabled or enabled — whether new registrations join a waitlist once capacity is reached.
Output data schema:
{
id: string;
}create_ticket_type — Add a ticket type to an event
Creates a new ticket type for an event and returns the created ticket type, including its id.
Inputs:
- `event_id` (string, required) — Event ID, this usually starts with evt-.
- `name` (string, required) — Ticket type name.
- `type` (string, required) — free or paid.
- `require_approval` (boolean, optional, default: null) — Whether registrations for this ticket type require host approval.
- `is_hidden` (boolean, optional, default: null) — Hides the ticket type from public view, e.g. for an invite-only tier.
- `description` (string, optional, default: null) — Ticket type description.
- `valid_start_at` (string, optional, default: null) — ISO 8601 date the ticket type becomes available.
- `valid_end_at` (string, optional, default: null) — ISO 8601 date the ticket type stops being available.
- `max_capacity` (number, optional, default: null) — Maximum number of this ticket type that can be issued.
- `cents` (number, optional, default: null) — Ticket price as an integer in the smallest unit of currency (e.g. cents for USD); only meaningful when type is paid.
- `currency` (string, optional, default: null) — Currency code for cents.
- `is_flexible` (boolean, optional, default: null) — Enables "pay what you want" pricing for a paid ticket.
- `min_cents` (number, optional, default: null) — Minimum amount a guest may pay when is_flexible is true.
Output data schema:
{
id: string;
name: string | null;
require_approval: boolean | null;
is_hidden: boolean | null;
description: string | null;
valid_start_at: string | null;
valid_end_at: string | null;
max_capacity: number | null;
type: string | null;
cents: number | null;
currency: string | null;
is_flexible: boolean | null;
min_cents: number | null;
}create_coupon — Create a discount or unlock code
Creates a new discount coupon for an event and returns the created coupon.
Inputs:
- `code` (string, required) — Code the guest enters on the event page. Case-insensitive, maximum 20 characters.
- `discount` (object, required) — Discriminated union: {discount_type: "percent", percent_off} (0-100), or {discount_type: "amount", cents_off, currency}.
- `event_id` (string, required) — Event ID, this usually starts with evt-.
- `remaining_count` (integer, optional, default: null) — Number of times the coupon can be used. Set to 1000000 for unlimited uses.
- `valid_start_at` (string, optional, default: null) — ISO 8601 datetime the coupon becomes valid.
- `valid_end_at` (string, optional, default: null) — ISO 8601 datetime the coupon expires.
- `event_ticket_type_id` (string, optional, default: null) — Restrict the coupon to a single ticket type. If that ticket type is hidden, the coupon acts as an unlock/access code instead of a discount.
Output data schema:
{
id: string;
code: string | null;
remaining_count: integer | null;
valid_start_at: string | null;
valid_end_at: string | null;
percent_off: number | null;
cents_off: number | null;
currency: string | null;
event_ticket_type_id: string | null;
}add_guests — Add guests straight onto an event
Adds one or more guests directly to an event (default status "Going", one ticket of the default type unless overridden) and returns an empty response on success.
Inputs:
- `event_id` (string, required) — Event ID, this usually starts with evt-.
- `guests` (object[], required) — Guests to add, each requiring at least email; existing names are not overwritten. Each guest may include registration_answers (question_id + value) for the event's registration questions.
- `ticket` (object, optional, default: null) — Assign a single ticket of the specified event_ticket_type_id to each guest. Cannot be combined with tickets.
- `tickets` (object[], optional, default: null) — Assign multiple tickets (each by event_ticket_type_id) to each guest. Cannot be combined with ticket.
- `approval_status` (string, optional, default: null) — Status to assign each added guest: approved, pending_approval, or waitlist. Defaults to approved.
- `send_email` (boolean, optional, default: null) — Whether Luma should email each added guest. Defaults to true.
Output data schema:
{
event_id: string | null;
guests_requested: integer | null;
}send_invites — Email soft invites to guests (destructive)
DESTRUCTIVE — REQUIRES EXPLICIT USER CONFIRMATION BEFORE CALLING. Sends one or more guests a soft invite to an event by email (and SMS if their phone is linked to their Luma account) that they can accept, returning an empty response on success. This sends real communications to every listed guest — the original invite state is not returned and cannot be recovered from this call. NEVER call this tool autonomously or as part of an automated flow. You MUST stop, tell the user exactly which guests will be invited and what the message will say, and wait for their explicit written confirmation before proceeding.
Inputs:
- `event_id` (string, required) — Event ID, this usually starts with evt-.
- `guests` (object[], required) — Guests to invite, each requiring at least email; existing names are not overwritten.
- `message` (string, optional, default: null) — Personalized message included in the invite. Maximum 200 characters.
Output data schema:
{
event_id: string | null;
guests_invited: integer | null;
}cancel_event — Permanently cancel an event (destructive)
DESTRUCTIVE — REQUIRES EXPLICIT USER CONFIRMATION BEFORE CALLING. Cancels an event using a cancellation token from request_event_cancellation and returns an empty response on success. This action is irreversible — the event is deleted, all guests are notified, and refunds are processed if requested; the event cannot be recovered after this call. NEVER call this tool autonomously or as part of an automated flow. You MUST stop, tell the user exactly what event will be permanently cancelled and that it is irreversible, and wait for their explicit written confirmation before proceeding.
Inputs:
- `event_id` (string, required) — Event ID, this usually starts with evt-.
- `cancellation_token` (string, required) — The cancellation token returned by request_event_cancellation.
- `should_refund` (boolean, optional, default: null) — Whether to refund paid guests. Conditionally required — must be set if the event has paid guests (see is_paid from request_event_cancellation).
Output data schema:
{
event_id: string | null;
}update_event — Update an event, with before/after state
Updates an existing event's details. Only the fields you provide are changed — others keep their current value. NOTE: this overwrites the current field values, and the original values are not preserved after the call — the response includes both the before and after state (fetched via the same lookup as get_event) so you have a full record of what changed.
Inputs:
- `event_id` (string, required) — Event ID, this usually starts with evt-.
- `suppress_notifications` (boolean, optional, default: null) — If true, guests are not notified (email/push) when the name, time, or location changes.
- `can_register_for_multiple_tickets` (boolean, optional, default: null) — Whether a single guest can register for multiple tickets.
- `cover_url` (string, optional, default: null) — Cover image URL; must be hosted on the Luma CDN (images.lumacdn.com).
- `coordinate` (object, optional, default: null) — {longitude, latitude} for the event location.
- `description_md` (string, optional, default: null) — Markdown description, converted internally to Luma's rich text format.
- `end_at` (string, optional, default: null) — ISO 8601 datetime the event ends.
- `geo_address_json` (object, optional, default: null) — Either {type: "manual", address} or {type: "google", place_id, description?}.
- `location_visibility` (string, optional, default: null) — public (default) or guests-only.
- `max_capacity` (number, optional, default: null) — Maximum registrations before the event is marked sold out (or joins the waitlist, if enabled).
- `meeting_url` (string, optional, default: null) — Virtual meeting URL for online events.
- `name` (string, optional, default: null) — Event name.
- `name_requirement` (string, optional, default: null) — full-name or first-last.
- `phone_number_requirement` (string, optional, default: null) — optional or required; omit to not collect it.
- `registration_open` (boolean, optional, default: null) — Whether to accept registrations.
- `registration_questions` (object[], optional, default: null) — Custom registration questions; each object is discriminated by question_type.
- `reminders_disabled` (boolean, optional, default: null) — Turns off Luma's default pre-event reminder emails.
- `feedback_email` (object, optional, default: null) — {enabled, delay} settings for the post-event feedback email.
- `show_guest_list` (boolean, optional, default: null) — Whether approved guests can see who else is attending.
- `slug` (string, optional, default: null) — URL slug for the event page; update fails if unavailable.
- `start_at` (string, optional, default: null) — ISO 8601 datetime the event starts.
- `timezone` (string, optional, default: null) — IANA timezone, e.g. America/New_York.
- `tint_color` (string, optional, default: null) — Hex color; alpha channels are stripped.
- `visibility` (string, optional, default: null) — public, members-only, or private.
- `waitlist_status` (string, optional, default: null) — disabled or enabled.
Output data schema:
before and after each carry the same shape as get_event's data.
{
before: Event;
after: Event;
}update_guest_status — Approve, decline, or waitlist a guest
Updates a guest's status (approved, declined, pending_approval, or waitlist), optionally refunding them and/or emailing a personal message. NOTE: this overwrites the guest's current status, and the original status is not preserved after the call — the response includes both the before and after state (fetched via the same lookup as get_guest) so you have a full record of what changed.
Inputs:
- `event_id` (string, required) — Event ID, this usually starts with evt-.
- `guest_id` (string, required) — Guest identifier — the guest ID (gst-), a ticket key, a guest key (g-), or the user's email.
- `status` (string, required) — approved, declined, pending_approval, or waitlist.
- `should_refund` (boolean, optional, default: null) — If moving a paid guest to declined, waitlist, or pending_approval, whether to refund their payment. Defaults to false.
- `send_email` (boolean, optional, default: null) — Whether Luma should email the guest about the status change. Defaults to true.
- `message` (string, optional, default: null) — Personal message included in the status-change email. Maximum 200 characters. Can't be combined with send_email: false.
Output data schema:
before and after each carry the same shape as get_guest's data.
{
before: Guest;
after: Guest;
}update_guest_tickets — Grant or invalidate a guest's tickets
Administratively adds complimentary tickets to or removes/invalidates tickets from an existing guest with no payment or refund processed. NOTE: this overwrites the guest's ticket set, and the original ticket set is not preserved after the call — the response includes both the before and after state (fetched via the same lookup as get_guest) so you have a full record of what changed.
Inputs:
- `event_id` (string, required) — Event ID, this usually starts with evt-.
- `guest_id` (string, required) — Guest identifier — the guest ID (gst-), a ticket key, a guest key (g-), or the user's email.
- `ticket_ids_to_remove` (string[], optional, default: null) — Existing ticket IDs to invalidate. Removing tickets does not issue a refund, and at least one valid ticket must remain on the guest. Default [].
- `tickets_to_add` (object[], optional, default: null) — Complimentary tickets to grant (each by event_ticket_type_id); each entry creates a new $0 administrative ticket even for a normally paid ticket type. Default [].
- `send_email` (boolean, optional, default: null) — Whether Luma may email the guest about the ticket change. Defaults to true and still respects notification preferences.
Output data schema:
before and after each carry the same shape as get_guest's data.
{
before: Guest;
after: Guest;
}update_ticket_type — Update a ticket type, with before/after state
Updates an existing ticket type's details and returns the updated ticket type. Only the fields you provide are changed — others keep their current value. NOTE: this overwrites the current field values — the original state is not stored after the call. The response includes both the before and after state so you have a full record of what changed.
Inputs:
- `event_ticket_type_id` (string, required) — Ticket type ID, this usually starts with ttype-.
- `name` (string, optional, default: null) — Ticket type name.
- `require_approval` (boolean, optional, default: null) — Whether registrations for this ticket type require host approval.
- `is_hidden` (boolean, optional, default: null) — Hides the ticket type from public view.
- `description` (string, optional, default: null) — Ticket type description.
- `valid_start_at` (string, optional, default: null) — ISO 8601 date the ticket type becomes available.
- `valid_end_at` (string, optional, default: null) — ISO 8601 date the ticket type stops being available.
- `max_capacity` (number, optional, default: null) — Maximum number of this ticket type that can be issued.
- `type` (string, optional, default: null) — free or paid.
- `cents` (number, optional, default: null) — Ticket price as an integer in the smallest unit of currency; only meaningful when type is paid.
- `currency` (string, optional, default: null) — Currency code for cents.
- `is_flexible` (boolean, optional, default: null) — Enables "pay what you want" pricing for a paid ticket.
- `min_cents` (number, optional, default: null) — Minimum amount a guest may pay when is_flexible is true.
Output data schema:
before and after each carry the same shape as get_ticket_type's data.
{
before: TicketType;
after: TicketType;
}Response Envelope
Every tool returns the same top-level envelope. Only data varies per tool.
// Success
{
"success": true,
"statusCode": 200,
"retriable": false,
"retry_after_seconds": null,
"error": null,
"data": { ... }
}
// Error
{
"success": false,
"statusCode": 400,
"retriable": false,
"retry_after_seconds": null,
"error": { "code": "VALIDATION_ERROR", "message": "ticket and tickets cannot both be set", "details": {} },
"data": null
}retriable—truewhen it is safe to retry (rate limit, network error, 503).falsefor validation and auth errors.retry_after_seconds— seconds to wait before retrying; present only whenretriableistrueand the upstream specifies a delay.error.code— machine-readable string:VALIDATION_ERROR,AUTH_ERROR,UPSTREAM_ERROR,SERVER_ERROR.
Common Parameters
pagination_limit— The number of items to return. The server enforces a maximum.pagination_cursor— Value ofnext_cursorfrom a previous request. Keep paging whilehas_moreistrue.approval_status— Guest status filter:approved,session,pending_approval,invited,declined, orwaitlist.sort_column/sort_direction— Order guest results byname,email,created_at,registered_at, orchecked_in_at, usingasc,desc,asc nulls last, ordesc nulls last.send_email— Whether Luma sends its own notification email for the action. Defaults totruewhere supported.
Resource Formats
Event ID:
evt-<identifier>
Example: evt-4KJDaiFgHYYYYYY
Ticket type ID:
ttype-<identifier>
Example: ttype-3nAdgWzEXXXXXX
Guest identifier:
gst-<identifier> | <ticket key> | g-<guest key> | <email address>
Example: gst-1YY0nkFZZZZZZZ
Datetimes:
ISO 8601
Example: 2026-08-14T18:00:00Z
Steps
- Go to Luma and open the calendar you want the key to act on
- Open Settings for that calendar and select the Options tab
- Find the API section and click Create API Key (an eligible Luma plan is required)
- Copy the generated key — you will only see it once
Missing or Invalid Headers
- Cause: API key not provided in request headers or incorrect format
- Solution:
- Verify
Authorization: Bearer YOUR_API_KEYandX-Mewcp-Credential-Id: CREDENTIAL-IDheaders are present - Check API key is active in your MewCP account
- Verify
Insufficient Credits
- Cause: API calls have exceeded your request limits
- Solution:
- Check credit usage in your Curious Layer dashboard
- Upgrade to a paid plan or add credits for higher limits
- Contact support for credit adjustments
Credential Not Connected
- Cause: No Luma credential linked to your account
- Solution:
- Go to Credentials in your MewCP dashboard
- Add your Luma API key (static credential)
- Retry the request with the correct
X-Mewcp-Credential-Idheader
Malformed Request Payload
- Cause: JSON payload is invalid or missing required fields
- Solution:
- Validate JSON syntax before sending
- Ensure all required tool parameters are included
- Check parameter types match expected values — for example,
ticketandticketscannot both be set onadd_guests, andmessagecannot be combined withsend_email: falseonupdate_guest_status
Server Not Found
- Cause: Incorrect server name in the API endpoint
- Solution:
- Verify endpoint format:
mewcp-luma/mcp/{tool-name} - Use correct server name from documentation
- Check available servers in your Curious Layer account
- Verify endpoint format:
Luma API Error
- Cause: Upstream Luma API returned an error
- Solution:
- Check Luma service status at Luma Status Page
- Verify your credential has manage access to the event or calendar you are acting on
- Review the error message for specific details — expired
cancellation_tokenvalues and unavailableslugvalues are common causes
Resources
- Luma API Documentation — Official API reference
- Luma API Reference — Complete endpoint reference
- FastMCP Docs — FastMCP specification
- FastMCP Credentials — FastMCP Credentials package for credential handling