> ## Documentation Index
> Fetch the complete documentation index at: https://docs.gomry.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Available Tools

> Every MCP tool the Gomry server exposes — what it returns, what privilege it requires

# Available Tools

The MCP server exposes **19 tools** organized into three groups. Each tool maps to a public REST endpoint and returns the same response shape — you can cross-reference any field against the [API Reference](/api-reference/events/list-events).

<Note>
  Tools are advertised to your client **only if your dashboard privileges include the required RBAC permission**. If `list_attendees` doesn't appear in your client, your role lacks `TICKETS_READ_TICKETS`. Ask an admin to grant it.
</Note>

## Reading events

<ResponseField name="list_events" type="tool">
  List the organization's events. Returns paginated results sorted by creation date.

  **Required privilege:** `EVENTS_READ_EVENTS`

  **Arguments:** `page`, `page_size` (max 200), `status` (CSV: `active`, `inactive`; default `active`)

  Equivalent REST: [`GET /events`](/api-reference/events/list-events)
</ResponseField>

<ResponseField name="get_event" type="tool">
  Fetch one event by ID. Cross-tenant IDs return `Event not found.` with no existence leak.

  **Required privilege:** `EVENTS_READ_EVENTS`

  **Arguments:** `event_id` (required)

  Equivalent REST: [`GET /events/:id`](/api-reference/events/get-event)
</ResponseField>

## Reading attendees & tickets

<ResponseField name="list_attendees" type="tool">
  List attendees (tickets) for one of your events. Each attendee includes name, email, status, ticket-class info, and check-in timestamp. **Form answers live on applications, not attendees** — use `list_applications` for that.

  **Required privilege:** `TICKETS_READ_TICKETS`

  **Arguments:** `event_id` (required), `page`, `page_size`, `status` (CSV: `valid`, `checked_in`, `pending_approval`, `invited`; default `valid,checked_in`)

  Equivalent REST: [`GET /events/:id/attendees`](/api-reference/attendees/list-attendees)
</ResponseField>

<ResponseField name="get_attendee" type="tool">
  Fetch one attendee (ticket) by ID, scoped to an event you own.

  **Required privilege:** `TICKETS_READ_TICKETS`

  **Arguments:** `event_id`, `attendee_id` (both required)

  Equivalent REST: [`GET /events/:id/attendees/:attendeeId`](/api-reference/attendees/get-attendee)
</ResponseField>

<ResponseField name="list_ticket_classes" type="tool">
  List all ticket classes (products) for an event.

  **Required privilege:** `EVENTS_READ_EVENTS`

  **Arguments:** `event_id` (required)

  Equivalent REST: [`GET /events/:id/ticket-classes`](/api-reference/ticket-classes/list-ticket-classes)
</ResponseField>

<ResponseField name="get_ticket_class" type="tool">
  Fetch one ticket class by ID for an event you own.

  **Required privilege:** `EVENTS_READ_EVENTS`

  **Arguments:** `event_id`, `ticket_class_id` (both required)

  Equivalent REST: [`GET /events/:id/ticket-classes/:tcId`](/api-reference/ticket-classes/get-ticket-class)
</ResponseField>

## Reading forms & submissions

<ResponseField name="list_forms" type="tool">
  List the organization's forms. Each form includes its `questions` array — the schema you need to interpret answers from `list_applications`.

  **Required privilege:** `FORMS_READ_FORMS`

  **Arguments:** `page`, `page_size`, `status` (CSV: `active`, `inactive`; default `active`)

  Equivalent REST: [`GET /forms`](/api-reference/forms/list-forms)
</ResponseField>

<ResponseField name="get_form" type="tool">
  Fetch one form by ID, including the full `questions` array. Use each question's `id` to map answers back to the question that produced them.

  **Required privilege:** `FORMS_READ_FORMS`

  **Arguments:** `form_id` (required)

  Equivalent REST: [`GET /forms/:id`](/api-reference/forms/get-form)
</ResponseField>

<ResponseField name="list_applications" type="tool">
  **Primary tool for analyzing form submissions.** Each application carries an `answers` array keyed by `question_id` — pair with `get_form` to render answers grouped by question.

  **Required privilege:** `FORMS_READ_FORMS`

  **Arguments:** `page`, `page_size`, `form_id` (filter to one form), `contact_id` (filter to one submitter), `status` (CSV: `Draft`, `Pending`, `Accepted`, `Rejected`; default all), `created_after` / `created_before` (ISO timestamps bounding `created_at`, inclusive), `submitted_after` / `submitted_before` (ISO timestamps bounding `submitted_at`, inclusive), `sort` (`created_at_desc` (default), `created_at_asc`, `submitted_at_desc`, `submitted_at_asc`, `updated_at_desc`, `updated_at_asc`)

  Results are sorted newest-first by `created_at` by default. To count submissions over a window, pass `created_after` + `created_before` and read `pagination.total` — no need to page through and dedupe.

  Equivalent REST: [`GET /applications`](/api-reference/applications/list-applications)
</ResponseField>

<ResponseField name="get_application" type="tool">
  Fetch one submission by ID, including all answers.

  **Required privilege:** `FORMS_READ_FORMS`

  **Arguments:** `application_id` (required)

  Equivalent REST: [`GET /applications/:id`](/api-reference/applications/get-application)
</ResponseField>

## Reading custom fields

<ResponseField name="list_custom_fields" type="tool">
  List the organization's custom field definitions. Filter by `record_type` (`contact`, `event`, etc.) to scope to a specific record family.

  **Required privilege:** `FIELDS_READ_FIELDS`

  **Arguments:** `page`, `page_size`, `record_type` (optional filter)

  Equivalent REST: [`GET /custom-fields`](/api-reference/custom-fields/list-custom-fields)
</ResponseField>

<ResponseField name="get_custom_field" type="tool">
  Fetch one custom field definition by ID.

  **Required privilege:** `FIELDS_READ_FIELDS`

  **Arguments:** `field_id` (required)

  Equivalent REST: [`GET /custom-fields/:id`](/api-reference/custom-fields/get-custom-field)
</ResponseField>

## Reading payments

<ResponseField name="list_payments" type="tool">
  List successful payments by default. Filter by event, product, form, status, or date range. Each payment carries the relational keys (`event_id`, `application_id`, `form_id`, `contact_user_id`) so you can join across resources.

  **Required privilege:** `PAYMENTS_READ_PAYMENTS`

  **Arguments:** `page`, `page_size`, `event_id`, `product_id`, `form_id`, `from` (ISO timestamp), `to` (ISO timestamp), `status` (CSV; default `succeeded`)

  Equivalent REST: [`GET /payments`](/api-reference/payments/list-payments)
</ResponseField>

<ResponseField name="get_payment" type="tool">
  Fetch one payment by ID. Includes customer email and the Stripe payment ID for cross-referencing.

  **Required privilege:** `PAYMENTS_READ_PAYMENTS`

  **Arguments:** `payment_id` (required)

  Equivalent REST: [`GET /payments/:id`](/api-reference/payments/get-payment)
</ResponseField>

## Contacts & lists

These tools predate the read surface above and have a slightly different shape — they accept a `spaceId` argument for space-level scoping and return `spaceIds` on each contact.

<ResponseField name="get_contacts" type="tool">
  Paginated contact list. Omit `spaceId` for an org-wide view; pass a space ID to scope to one space.

  **Required privilege:** `CONTACTS_READ_CONTACTS`

  **Arguments:** `page`, `page_size` (max 50), `sortBy`, `sortOrder`, `spaceId`, `listIds` (CSV)
</ResponseField>

<ResponseField name="search_contacts" type="tool">
  Full-text search across contact name, email, phone, and other text fields. Backed by Algolia.

  **Required privilege:** `CONTACTS_READ_CONTACTS`

  **Arguments:** `query` (required), `page`, `page_size` (max 50)
</ResponseField>

<ResponseField name="get_lists" type="tool">
  List the organization's contact lists. Filter by name with `search`.

  **Required privilege:** `LISTS_READ_LISTS`

  **Arguments:** `search` (optional)
</ResponseField>

<ResponseField name="add_contacts_to_list" type="tool">
  Add contacts to a list. Each contact ID is verified to belong to your organization before the write happens — invalid IDs are skipped, not failed.

  **Required privilege:** `CONTACTS_UPDATE_CONTACTS`

  **Arguments:** `listId` (required), `contactIds` (CSV, required)
</ResponseField>

<ResponseField name="remove_contacts_from_list" type="tool">
  Remove contacts from a list. Same org-membership verification as the add tool.

  **Required privilege:** `CONTACTS_UPDATE_CONTACTS`

  **Arguments:** `listId` (required), `contactIds` (CSV, required)
</ResponseField>

## Common patterns

### "Analyze submissions to form X"

1. `get_form` with `form_id` → returns the question schema (each question's `id`, `title`, `type`).
2. `list_applications` with `form_id` → returns the matching submissions, each carrying `answers` keyed by `question_id`.
3. Claude correlates `answers[].question_id` → `questions[].id` and renders grouped output.

### "Find paying attendees of event Y"

1. `list_attendees` with `event_id` → list of tickets.
2. `list_payments` with `event_id, status: succeeded` → list of payments.
3. Claude joins on `customer_email` or `contact_user_id`.

### "Group last month's submissions by status"

1. `list_applications` with `status: Pending,Accepted,Rejected` (or omit for all).
2. Claude buckets the results client-side. Status is on every application.

## Limits

* **Rate limit:** 120 requests / 60 seconds per token (sliding window). Burstable up to 120 in a single window.
* **Page size:** max `200` for the new read tools, max `50` for the contacts tools.
* **Token cache:** validated tokens are cached server-side for 5 minutes — revocation propagates within that window.
* **User context cache:** RBAC privileges are cached for 5 minutes — privilege changes take effect within that window.
