Wild Apricot MCP by usefulapi
Look up members, events, registrations, invoices and payments, and add contacts or check in guests.
Should I use this
Quality & Safety
Findings (6)
- LOWin wildapricot_list_contact_fields
- LOWin wildapricot_list_membership_levels
- LOWin wildapricot_list_saved_searches
- LOWin wildapricot_list_event_registration_types
- LOWin wildapricot_list_event_registrations
- LOWin wildapricot_create_event_registration
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"wild-apricot": {
"url": "https://wild-apricot.usefulapi.io/mcp"
}
}
}Remote endpoints
https://wild-apricot.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (21)
🟢wildapricot_list_accounts
List the Wild Apricot accounts this API key can reach — id, name, primary domain, currency, contact limit. A cheap way to confirm the key works. Wild Apricot: GET /accounts.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢wildapricot_get_account
Fetch the current account's details (name, primary domain, time zone, currency, billing plan, contact limit). Wild Apricot: GET /accounts/{accountId}.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢wildapricot_list_contacts(simple_query, filter, select, sort, top, ...)
Search contacts and members. Use simple_query for a substring match on name, organization, email or phone, or filter for an OData-style expression over field names/system codes (e.g. "'Membership status' eq 'Active'", "'Profile last updated' gt 2026-01-01"). Runs synchronously ($async=false). Wild Apricot: GET /accounts/{accountId}/contacts.
Input Schema
{
"type": "object",
"properties": {
"simple_query": {
"description": "Substring matched against first/last name, organization, email or phone.",
"type": "string"
},
"filter": {
"description": "$filter expression; field names come from wildapricot_list_contact_fields.",
"type": "string"
},
"select": {
"description": "$select: comma-separated field names to return; quote names with spaces, e.g. 'First name','e-Mail'.",
"type": "string"
},
"sort": {
"description": "Sort order.",
"type": "string",
"enum": [
"Name asc",
"Name desc",
"MemberSince asc",
"MemberSince desc"
]
},
"top": {
"description": "Maximum records to return, 1-100 (Wild Apricot's cap is 100).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"skip": {
"description": "Records to skip, for paging with top.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"count": {
"description": "When true, return only the number of matching records.",
"type": "boolean"
},
"ids_only": {
"description": "When true, return only matching ids.",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢wildapricot_get_contact(contact_id, extended_membership_info)
Fetch one contact or member with all field values, membership level and status. Set extended_membership_info for the pending membership order, its invoice and allowed actions. Wild Apricot: GET /accounts/{accountId}/contacts/{contactId}.
Input Schema
{
"type": "object",
"properties": {
"contact_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The contact id."
},
"extended_membership_info": {
"description": "Include pending membership order status, invoice and allowed actions.",
"type": "boolean"
}
},
"required": [
"contact_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢wildapricot_list_contact_fields
List the contact and membership field definitions — names, system codes, types, allowed values, whether each is searchable ($filter) and editable. Use it to build filters and field_values. Wild Apricot: GET /accounts/{accountId}/contactfields.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢wildapricot_list_membership_levels
List membership levels — name, fee, renewal period, individual vs bundle, whether the public can apply. Wild Apricot: GET /accounts/{accountId}/membershiplevels.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢wildapricot_list_member_groups(top, skip)
List ad hoc member groups (id, name, description). Wild Apricot: GET /accounts/{accountId}/membergroups.
Input Schema
{
"type": "object",
"properties": {
"top": {
"description": "Maximum records to return, 1-100 (Wild Apricot's cap is 100).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"skip": {
"description": "Records to skip, for paging with top.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢wildapricot_list_saved_searches
List the contact saved searches defined by admins (id, name, description). Wild Apricot: GET /accounts/{accountId}/savedsearches.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢wildapricot_get_saved_search(saved_search_id, exclude_archived)
Run one saved search and return the ids of the contacts it currently matches. Wild Apricot: GET /accounts/{accountId}/savedsearches/{savedSearchId}.
Input Schema
{
"type": "object",
"properties": {
"saved_search_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The saved search id."
},
"exclude_archived": {
"description": "Leave archived contacts out.",
"type": "boolean"
}
},
"required": [
"saved_search_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢wildapricot_list_events(filter, sort, top, skip, count, ...)
List events. filter supports e.g. "IsUpcoming eq true", "StartDate gt 2026-01-01", "RegistrationEnabled eq true", "Tags in [workshop]", "Id in [1,2]". Wild Apricot: GET /accounts/{accountId}/events.
Input Schema
{
"type": "object",
"properties": {
"filter": {
"description": "$filter expression over Id, RegistrationEnabled, IsUpcoming, Tags, StartDate, EndDate, Name.",
"type": "string"
},
"sort": {
"description": "Sort order.",
"type": "string",
"enum": [
"ByStartDate asc",
"ByStartDate desc",
"ByStartSession asc"
]
},
"top": {
"description": "Maximum records to return, 1-100 (Wild Apricot's cap is 100).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"skip": {
"description": "Records to skip, for paging with top.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"count": {
"description": "When true, return only the number of matching records.",
"type": "boolean"
},
"ids_only": {
"description": "When true, return only matching ids.",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢wildapricot_get_event(event_id)
Fetch one event with its details — description, registration types, registration fields, sessions, registration counts and totals paid/due. Wild Apricot: GET /accounts/{accountId}/events/{eventId}.
Input Schema
{
"type": "object",
"properties": {
"event_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The event id."
}
},
"required": [
"event_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢wildapricot_list_event_registration_types(event_id)
List an event's registration types (ticket types) — price, availability, limits, waitlist. You need a type id to register someone. Wild Apricot: GET /accounts/{accountId}/EventRegistrationTypes?eventId=.
Input Schema
{
"type": "object",
"properties": {
"event_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The event id."
}
},
"required": [
"event_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢wildapricot_list_event_registrations(event_id, contact_id, include_details, include_waitlist, include_canceled)
List registrations for an event (attendee list) or for a contact (what they signed up for) — registration type, fee, paid, checked in, waitlist. Wild Apricot: GET /accounts/{accountId}/eventregistrations.
Input Schema
{
"type": "object",
"properties": {
"event_id": {
"description": "Registrations for this event.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"contact_id": {
"description": "Registrations of this contact.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"include_details": {
"description": "Include registration form field values.",
"type": "boolean"
},
"include_waitlist": {
"description": "Include waitlist entries.",
"type": "boolean"
},
"include_canceled": {
"description": "Include canceled registrations.",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢wildapricot_list_invoices(contact_id, event_id, event_registration_id, unpaid_only, paid_only, ...)
List invoices, optionally for one contact, event or event registration, paid/unpaid only, or within a created-date range. Wild Apricot: GET /accounts/{accountId}/invoices.
Input Schema
{
"type": "object",
"properties": {
"contact_id": {
"description": "Invoices assigned to this contact.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"event_id": {
"description": "Invoices for this event's registrations.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"event_registration_id": {
"description": "The invoice of this registration.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"unpaid_only": {
"description": "Only unpaid invoices.",
"type": "boolean"
},
"paid_only": {
"description": "Only paid invoices.",
"type": "boolean"
},
"include_voided": {
"description": "Also return voided invoices.",
"type": "boolean"
},
"start_date": {
"description": "Created on/after this date (YYYY-MM-DD).",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}([T ][0-9:.+\\-Z]*)?$"
},
"end_date": {
"description": "Created before this date (YYYY-MM-DD).",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}([T ][0-9:.+\\-Z]*)?$"
},
"top": {
"description": "Maximum records to return, 1-100 (Wild Apricot's cap is 100).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"skip": {
"description": "Records to skip, for paging with top.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"ids_only": {
"description": "When true, return only matching ids.",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢wildapricot_list_payments(contact_id, event_id, unsettled_only, start_date, end_date, ...)
List payments received, optionally for one contact or event, unsettled only, or within a created-date range. Wild Apricot: GET /accounts/{accountId}/payments.
Input Schema
{
"type": "object",
"properties": {
"contact_id": {
"description": "Payments made by this contact.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"event_id": {
"description": "Payments settled to this event's invoices.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"unsettled_only": {
"description": "Only payments not fully allocated to invoices.",
"type": "boolean"
},
"start_date": {
"description": "Created on/after this date (YYYY-MM-DD).",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}([T ][0-9:.+\\-Z]*)?$"
},
"end_date": {
"description": "Created before this date (YYYY-MM-DD).",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}([T ][0-9:.+\\-Z]*)?$"
},
"top": {
"description": "Maximum records to return, 1-100 (Wild Apricot's cap is 100).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"skip": {
"description": "Records to skip, for paging with top.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"ids_only": {
"description": "When true, return only matching ids.",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢wildapricot_list_donations(start_date, end_date, top, skip, ids_only)
List donations — donor, amount, date, comments and donation field values — optionally within a date range. Wild Apricot: GET /accounts/{accountId}/donations.
Input Schema
{
"type": "object",
"properties": {
"start_date": {
"description": "Created on/after this date (YYYY-MM-DD).",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}([T ][0-9:.+\\-Z]*)?$"
},
"end_date": {
"description": "Created before this date (YYYY-MM-DD).",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}([T ][0-9:.+\\-Z]*)?$"
},
"top": {
"description": "Maximum records to return, 1-100 (Wild Apricot's cap is 100).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"skip": {
"description": "Records to skip, for paging with top.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"ids_only": {
"description": "When true, return only matching ids.",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢wildapricot_list_audit_log(start_date, end_date, top, skip)
List audit log items (membership changes, payments, invoices and other admin/member activity) within a date range. Wild Apricot: GET /accounts/{accountId}/auditLogItems.
Input Schema
{
"type": "object",
"properties": {
"start_date": {
"description": "Items created on/after this date (YYYY-MM-DD).",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}([T ][0-9:.+\\-Z]*)?$"
},
"end_date": {
"description": "Items created before this date (YYYY-MM-DD).",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}([T ][0-9:.+\\-Z]*)?$"
},
"top": {
"description": "Maximum records to return, 1-100 (Wild Apricot's cap is 100).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"skip": {
"description": "Records to skip, for paging with top.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴wildapricot_create_contact(first_name, last_name, email, organization, membership_enabled, ...)
Create a contact. To make them a member set membership_enabled=true and membership_level_id (Wild Apricot may create a membership invoice unless recreate_invoice=false). Custom fields go in field_values. Wild Apricot: POST /accounts/{accountId}/contacts.
Input Schema
{
"type": "object",
"properties": {
"first_name": {
"description": "First name.",
"type": "string"
},
"last_name": {
"description": "Last name.",
"type": "string"
},
"email": {
"description": "Primary email — must be unique in the account.",
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"organization": {
"description": "Organization.",
"type": "string"
},
"membership_enabled": {
"description": "true to make the contact a member (also set membership_level_id).",
"type": "boolean"
},
"membership_level_id": {
"description": "Membership level to assign, from wildapricot_list_membership_levels.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"status": {
"description": "Membership status.",
"type": "string",
"enum": [
"Active",
"Lapsed",
"PendingNew",
"PendingRenewal",
"PendingUpgrade"
]
},
"field_values": {
"description": "Custom/common field values to set. Only include fields you want to change.",
"type": "array",
"items": {
"type": "object",
"properties": {
"FieldName": {
"description": "Field title as shown in Wild Apricot.",
"type": "string"
},
"SystemCode": {
"description": "Field system code (stable even if the title is renamed), from wildapricot_list_contact_fields.",
"type": "string"
},
"Value": {
"description": "The value: string / number / boolean / ISO date, or {Id, Label} for a choice field, or an array of those for multi-choice."
}
},
"required": [
"Value"
]
}
},
"recreate_invoice": {
"description": "Whether Wild Apricot should (re)create the membership invoice. Wild Apricot's default is true.",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴wildapricot_update_contact(contact_id, first_name, last_name, email, organization, ...)
Update an existing contact: names, email, membership level/status, or custom field values. Only the fields you pass are sent. Wild Apricot: PUT /accounts/{accountId}/contacts/{contactId}.
Input Schema
{
"type": "object",
"properties": {
"contact_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The contact id."
},
"first_name": {
"description": "First name.",
"type": "string"
},
"last_name": {
"description": "Last name.",
"type": "string"
},
"email": {
"description": "Primary email — must be unique in the account.",
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"organization": {
"description": "Organization.",
"type": "string"
},
"membership_enabled": {
"description": "true to make the contact a member (also set membership_level_id).",
"type": "boolean"
},
"membership_level_id": {
"description": "Membership level to assign, from wildapricot_list_membership_levels.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"status": {
"description": "Membership status.",
"type": "string",
"enum": [
"Active",
"Lapsed",
"PendingNew",
"PendingRenewal",
"PendingUpgrade"
]
},
"field_values": {
"description": "Custom/common field values to set. Only include fields you want to change.",
"type": "array",
"items": {
"type": "object",
"properties": {
"FieldName": {
"description": "Field title as shown in Wild Apricot.",
"type": "string"
},
"SystemCode": {
"description": "Field system code (stable even if the title is renamed), from wildapricot_list_contact_fields.",
"type": "string"
},
"Value": {
"description": "The value: string / number / boolean / ISO date, or {Id, Label} for a choice field, or an array of those for multi-choice."
}
},
"required": [
"Value"
]
}
},
"recreate_invoice": {
"description": "Whether Wild Apricot should (re)create the membership invoice. Wild Apricot's default is true.",
"type": "boolean"
}
},
"required": [
"contact_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴wildapricot_create_event_registration(event_id, contact_id, registration_type_id, on_waitlist, memo, ...)
Register an existing contact for an event under one registration type (from wildapricot_list_event_registration_types). Can add to the waitlist instead. Wild Apricot: POST /accounts/{accountId}/eventregistrations.
Input Schema
{
"type": "object",
"properties": {
"event_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The event id."
},
"contact_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The contact to register."
},
"registration_type_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The registration type id."
},
"on_waitlist": {
"description": "Create a waitlist entry instead of a registration.",
"type": "boolean"
},
"memo": {
"description": "Internal note on the registration.",
"type": "string"
},
"show_to_public": {
"description": "Show this registrant to other registrants.",
"type": "boolean"
},
"registration_fields": {
"description": "Registration form field values.",
"type": "array",
"items": {
"type": "object",
"properties": {
"FieldName": {
"description": "Field title as shown in Wild Apricot.",
"type": "string"
},
"SystemCode": {
"description": "Field system code (stable even if the title is renamed), from wildapricot_list_contact_fields.",
"type": "string"
},
"Value": {
"description": "The value: string / number / boolean / ISO date, or {Id, Label} for a choice field, or an array of those for multi-choice."
}
},
"required": [
"Value"
]
}
},
"recreate_invoice": {
"description": "Create/update the related invoice to match the registration fee.",
"type": "boolean"
}
},
"required": [
"event_id",
"contact_id",
"registration_type_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴wildapricot_check_in_attendee(registration_id, checked_in, checked_in_guests)
Mark an event registration as checked in (checked_in=true) or undo it (false); for anonymous guests, set how many are checked in. Wild Apricot: POST /rpc/{accountId}/CheckInEventAttendee.
Input Schema
{
"type": "object",
"properties": {
"registration_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The event registration id."
},
"checked_in": {
"type": "boolean",
"description": "true to check in, false to check out."
},
"checked_in_guests": {
"description": "For registrations with guests-as-number, how many guests are checked in.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"registration_id",
"checked_in"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence