Every tool the Enclave MCP server exposes, with inputs, output shapes and the scope and permission each one needs. Written for people building prompts, agents and integrations.
POST https://api.enclavehq.com/api/mcp2026-07-28, Streamable HTTP, stateless60 calls per minute per token/.well-known/oauth-protected-resource/api/mcp/.well-known/oauth-authorization-serverevents:read · events:write (implies read) · registrations:readevents.viewread-onlyidempotentSearch and page through the organization's events.
| Field | Type | Notes | |
|---|---|---|---|
limit | integer 1-100 | optional | Default 20. |
offset | integer | optional | Default 0. |
search | string ≤200 | optional | Case-insensitive name search. |
timeFilter | "upcoming" | "past" | optional | |
visibility | "public" | "unlisted" | "private" | optional | |
locationType | "online" | "offline" | "hybrid" | optional | |
sortBy | "name" | "startAt" | "createdAt" | optional | |
sortOrder | "asc" | "desc" | optional |
attendeeCount is sold seats, not people checked in. Use checkin_stats for that.{
"events": [{
"id": "evt_…", "slug": "…", "name": "…",
"visibility": "public" | "unlisted" | "private",
"locationType": "online" | "offline" | "hybrid",
"startAt": "2026-10-03T19:00:00+02:00", "endAt": "…" | null,
"timezone": "Europe/Ljubljana",
"maxCapacity": 30 | null, "attendeeCount": 24 | null,
"isSeries": false
}],
"total": 3, "limit": 20, "offset": 0, "nextOffset": null
}{ "name": "events_list",
"arguments": { "timeFilter": "upcoming", "visibility": "private", "limit": 10 } }events.viewread-onlyidempotentFull detail of one event, including its ticket types.
| Field | Type | Notes | |
|---|---|---|---|
eventId | string | required | From events_list, for example evt_abc123. |
attendeeCount is null here. It is populated only by events_list.{
…event summary fields,
"descriptionText": "…" | null,
"address": "…" | null, "latitude": 46.05 | null, "longitude": 14.5 | null,
"meetingUrl": "…" | null,
"requireApproval": false, "enableWaitlist": true, "showGuestList": false,
"seriesId": "…" | null,
"ticketTypes": [{ "id": "…", "name": "…", "priceCents": 4500, "currency": "EUR" }],
"createdAt": "…", "updatedAt": "…"
}{ "name": "events_get", "arguments": { "eventId": "evt_abc123" } }events.manageCreate an event, or a recurring series. Same fields as the console form, with a plain-text description.
| Field | Type | Notes | |
|---|---|---|---|
name | string ≤200 | required | |
locationType | "online" | "offline" | "hybrid" | required | Online and hybrid need meetingUrl. |
startAt | ISO 8601 with offset | required | |
endAt | ISO 8601 with offset | optional | |
timezone | IANA name | required | For example Europe/Ljubljana. |
descriptionText | string ≤20000 | optional | Plain text. Blank lines separate paragraphs. |
visibility | "public" | "unlisted" | "private" | optional | Default public. |
geoAddress | object | optional | placeName, street, city, state, country, postalCode. |
latitude, longitude | number | optional | |
meetingUrl | URL | optional | |
maxCapacity | integer 1-1000000 | optional | |
requireApproval, enableWaitlist, showGuestList | boolean | optional | |
recurrence | object | optional | freq, interval, byWeekday, monthlyMode, ends. Makes a series. For weekly, byWeekday must include the start weekday. |
descriptionText to the stored document.{
…event summary fields,
"descriptionText": "…" | null,
"address": "…" | null, "latitude": 46.05 | null, "longitude": 14.5 | null,
"meetingUrl": "…" | null,
"requireApproval": false, "enableWaitlist": true, "showGuestList": false,
"seriesId": "…" | null,
"ticketTypes": [{ "id": "…", "name": "…", "priceCents": 4500, "currency": "EUR" }],
"createdAt": "…", "updatedAt": "…"
}{ "name": "events_create",
"arguments": {
"name": "Onboarding Q&A", "locationType": "online",
"startAt": "2026-09-15T18:00:00+02:00", "endAt": "2026-09-15T19:00:00+02:00",
"timezone": "Europe/Ljubljana", "meetingUrl": "https://meet.example.com/x",
"descriptionText": "Bring your questions."
} }events.manageidempotentChange any subset of fields on an event, or on part of a series.
| Field | Type | Notes | |
|---|---|---|---|
eventId | string | required | From events_list, for example evt_abc123. |
scope | "this" | "following" | "all" | optional | Required only when the event belongs to a recurring series. |
…any create field | | optional | All optional. Omitted fields keep their value. |
descriptionText | string | null | optional | Pass null to clear. |
maxCapacity | integer | null | optional | Pass null to remove the cap. |
scope returns a tool error asking for one.{
…event summary fields,
"descriptionText": "…" | null,
"address": "…" | null, "latitude": 46.05 | null, "longitude": 14.5 | null,
"meetingUrl": "…" | null,
"requireApproval": false, "enableWaitlist": true, "showGuestList": false,
"seriesId": "…" | null,
"ticketTypes": [{ "id": "…", "name": "…", "priceCents": 4500, "currency": "EUR" }],
"createdAt": "…", "updatedAt": "…"
}{ "name": "events_update",
"arguments": { "eventId": "evt_abc123", "maxCapacity": 80 } }events.deletedestructiveidempotentCancel an event. A soft cancel: the event stays in the console as cancelled.
| Field | Type | Notes | |
|---|---|---|---|
eventId | string | required | From events_list, for example evt_abc123. |
scope | "this" | "following" | "all" | optional | Required only when the event belongs to a recurring series. |
confirm | true | required | Must be literally true. Ask the user first. |
destructiveHint. Clients that honour it ask the user before calling. The confirm field covers clients that do not.{ "id": "evt_abc123", "deleted": true }{ "name": "events_delete",
"arguments": { "eventId": "evt_abc123", "confirm": true } }registrations.viewread-onlyidempotentAttendees of one event, with paging and filters.
| Field | Type | Notes | |
|---|---|---|---|
eventId | string | required | From events_list, for example evt_abc123. |
limit | integer 1-100 | optional | Default 20. |
offset | integer | optional | Default 0. |
search | string ≤200 | optional | Attendee name or email. |
status | "pending" | "confirmed" | "cancelled" | "waitlisted" | "rejected" | "awaiting_approval" | optional | |
type | "ticket" | "rsvp" | optional | |
ticketTypeId | string | optional | |
sortBy, sortOrder | string | optional |
registrations_get.{
"registrations": [{
"id": "reg_…", "eventId": "evt_…",
"type": "ticket" | "rsvp", "status": "confirmed",
"attendeeName": "…",
"createdAt": "…", "cancelledAt": "…" | null
}],
"total": 88, "limit": 20, "offset": 0, "nextOffset": 20
}{ "name": "registrations_list",
"arguments": { "eventId": "evt_abc123", "status": "waitlisted" } }registrations.viewread-onlyidempotentOne registration. Contact fields appear only when the caller holds registrations.manage.
| Field | Type | Notes | |
|---|---|---|---|
eventId | string | required | From events_list, for example evt_abc123. |
registrationId | string | required | From registrations_list. |
{
…registration summary fields,
"email": "…", // only with registrations.manage
"phone": "…" | null // only with registrations.manage
}{ "name": "registrations_get",
"arguments": { "eventId": "evt_abc123", "registrationId": "reg_def456" } }registrations.viewread-onlyidempotentAggregate attendance counts for one event. Live during the event.
| Field | Type | Notes | |
|---|---|---|---|
eventId | string | required | From events_list, for example evt_abc123. |
{
"allGuests": 150, // ticket seats + RSVP-only guests
"going": 32, // confirmed, not yet checked in
"checkedIn": 118,
"notGoing": 4, // guest cancellations
"declined": 2, // organizer-rejected approvals
"pending": 6,
"waitlisted": 12,
"rsvp": 20 // RSVP-only guests
}{ "name": "checkin_stats", "arguments": { "eventId": "evt_abc123" } }events.viewread-onlyidempotentTicket types of one event: price, sales window, caps.
| Field | Type | Notes | |
|---|---|---|---|
eventId | string | required | From events_list, for example evt_abc123. |
{
"ticketTypes": [{
"id": "…", "name": "…", "description": "…" | null,
"type": "free" | "paid", "priceCents": 4500, "currency": "EUR",
"access": "everyone" | "members_only",
"isHidden": false, "requireApproval": false,
"maxQuantity": 100 | null, "seatsPerTicket": 1, "maxPerAttendee": 4 | null,
"salesStartAt": "…" | null, "salesEndAt": "…" | null,
"sortOrder": 0
}]
}{ "name": "ticket_types_list", "arguments": { "eventId": "evt_abc123" } }Transport problems are HTTP errors. Problems the model can fix are tool results with isError: true and a plain message.
error code, so clients do not loop on re-authorization.scope on a series event, not found, or the staff role lacks the permission. Read the message and adjust the call.Dates are ISO 8601 with an offset. Time zones are IANA names. Always pass one when you set a date and time.
Results carry structuredContent, validated against the tool's output schema, plus a text block with a one-line summary and the same JSON.
Series: events in a recurring series need scope on update and delete: this, following or all.
Descriptions are plain text in and out. Blank lines separate paragraphs.
tools/list is static and cacheable: cacheScope: private, ttlMs: 300000.
Audit: every create, update and delete writes an audit row with source: mcp and the client ID.
Origin: browser requests must come from an allowed origin. Requests without an Origin header, such as command-line clients, are allowed. The bearer token is what authenticates.
Permissions resolve through the same resolver as the console, so custom roles behave the same way.