Wild Apricot MCP by usefulapi
by usefulapi.io · remote · no sign-in to list tools · v1.16.3 · published by io.usefulapi
Look up members, events, registrations, invoices and payments, and add contacts or check in guests.
21 tools: 4 can delete or cancel things, 1 change things and 16 only read.
Scanned Oct 21, 2026
- Deletes or cancels4Claude Code: deny: see these tools
- Can't be undone0Claude Code: ask
- Changes things1Claude Code: ask: see these tools
- Only reads16Claude Code: allow: see these tools
1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http wild-apricot https://wild-apricot.usefulapi.io/mcpFindings
Matches of fixed checks, with the text they matched.
The server marks "wildapricot_get_saved_search" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true}; The name "wildapricot_get_saved_search" says "get": a word for reading.
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
21 tools
Deletes or cancels 4Claude Code: deny
wildapricot_check_in_attendeeMark an event registration as checked in (checked_in=true) or undo it (false); for anonymous guests, set how many are checked in.No findings
Why it is in this group
- The description's first verb is "mark": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it 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.
Annotations the server declares
- title: Check an attendee in or out
- destructiveHint: true
wildapricot_create_contactCreate a contact.No findings
Why it is in this group
- The name "wildapricot_create_contact" says "create": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it 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.
Annotations the server declares
- title: Create a contact or member
- destructiveHint: true
wildapricot_create_event_registrationRegister an existing contact for an event under one registration type (from wildapricot_list_event_registration_types).No findings
Why it is in this group
- The name "wildapricot_create_event_registration" says "create": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it 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.
Annotations the server declares
- title: Register a contact for an event
- destructiveHint: true
wildapricot_update_contactUpdate an existing contact: names, email, membership level/status, or custom field values.No findings
Why it is in this group
- The name "wildapricot_update_contact" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it 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}.
Annotations the server declares
- title: Update a contact or member
- destructiveHint: true
Changes things 1Claude Code: ask
wildapricot_get_saved_searchRun one saved search and return the ids of the contacts it currently matches.1 finding
Why it is in this group
- The name "wildapricot_get_saved_search" says "get": a word for reading.
- The description's first verb is "run": a word for a change.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "wildapricot_get_saved_search" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true}; The name "wildapricot_get_saved_search" says "get": a word for reading.
Description, as the server wrote it Run one saved search and return the ids of the contacts it currently matches. Wild Apricot: GET /accounts/{accountId}/savedsearches/{savedSearchId}.
Annotations the server declares
- title: Run a saved search
- readOnlyHint: true
Only reads 16Claude Code: allow
wildapricot_get_accountFetch the current account's details (name, primary domain, time zone, currency, billing plan, contact limit).No findings
Why it is in this group
- The name "wildapricot_get_account" says "get": a word for reading.
Description, as the server wrote it Fetch the current account's details (name, primary domain, time zone, currency, billing plan, contact limit). Wild Apricot: GET /accounts/{accountId}.
Annotations the server declares
- title: Get the account
- readOnlyHint: true
wildapricot_get_contactFetch one contact or member with all field values, membership level and status.No findings
Why it is in this group
- The name "wildapricot_get_contact" says "get": a word for reading.
Description, as the server wrote it 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}.
Annotations the server declares
- title: Get one contact
- readOnlyHint: true
wildapricot_get_eventFetch one event with its details — description, registration types, registration fields, sessions, registration counts and totals paid/due.No findings
Why it is in this group
- The name "wildapricot_get_event" says "get": a word for reading.
Description, as the server wrote it 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}.
Annotations the server declares
- title: Get one event
- readOnlyHint: true
wildapricot_list_accountsList the Wild Apricot accounts this API key can reach — id, name, primary domain, currency, contact limit.No findings
Why it is in this group
- The name "wildapricot_list_accounts" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List accounts
- readOnlyHint: true
wildapricot_list_audit_logList audit log items (membership changes, payments, invoices and other admin/member activity) within a date range.No findings
Why it is in this group
- The name "wildapricot_list_audit_log" says "list": a word for reading.
Description, as the server wrote it List audit log items (membership changes, payments, invoices and other admin/member activity) within a date range. Wild Apricot: GET /accounts/{accountId}/auditLogItems.
Annotations the server declares
- title: List audit log items
- readOnlyHint: true
wildapricot_list_contact_fieldsList the contact and membership field definitions — names, system codes, types, allowed values, whether each is searchable ($filter) and editable.No findings
Why it is in this group
- The name "wildapricot_list_contact_fields" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List contact fields
- readOnlyHint: true
wildapricot_list_contactsSearch contacts and members.No findings
Why it is in this group
- The name "wildapricot_list_contacts" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Search contacts and members
- readOnlyHint: true
wildapricot_list_donationsList donations — donor, amount, date, comments and donation field values — optionally within a date range.No findings
Why it is in this group
- The name "wildapricot_list_donations" says "list": a word for reading.
Description, as the server wrote it List donations — donor, amount, date, comments and donation field values — optionally within a date range. Wild Apricot: GET /accounts/{accountId}/donations.
Annotations the server declares
- title: List donations
- readOnlyHint: true
wildapricot_list_event_registration_typesList an event's registration types (ticket types) — price, availability, limits, waitlist.No findings
Why it is in this group
- The name "wildapricot_list_event_registration_types" says "list": a word for reading.
Description, as the server wrote it 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=.
Annotations the server declares
- title: List event registration types
- readOnlyHint: true
wildapricot_list_event_registrationsList registrations for an event (attendee list) or for a contact (what they signed up for) — registration type, fee, paid, checked in, waitlist.No findings
Why it is in this group
- The name "wildapricot_list_event_registrations" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List event registrations
- readOnlyHint: true
wildapricot_list_eventsList events.No findings
Why it is in this group
- The name "wildapricot_list_events" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List events
- readOnlyHint: true
wildapricot_list_invoicesList invoices, optionally for one contact, event or event registration, paid/unpaid only, or within a created-date range.No findings
Why it is in this group
- The name "wildapricot_list_invoices" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List invoices
- readOnlyHint: true
wildapricot_list_member_groupsList ad hoc member groups (id, name, description).No findings
Why it is in this group
- The name "wildapricot_list_member_groups" says "list": a word for reading.
Description, as the server wrote it List ad hoc member groups (id, name, description). Wild Apricot: GET /accounts/{accountId}/membergroups.
Annotations the server declares
- title: List member groups
- readOnlyHint: true
wildapricot_list_membership_levelsList membership levels — name, fee, renewal period, individual vs bundle, whether the public can apply.No findings
Why it is in this group
- The name "wildapricot_list_membership_levels" says "list": a word for reading.
Description, as the server wrote it List membership levels — name, fee, renewal period, individual vs bundle, whether the public can apply. Wild Apricot: GET /accounts/{accountId}/membershiplevels.
Annotations the server declares
- title: List membership levels
- readOnlyHint: true
wildapricot_list_paymentsList payments received, optionally for one contact or event, unsettled only, or within a created-date range.No findings
Why it is in this group
- The name "wildapricot_list_payments" says "list": a word for reading.
Description, as the server wrote it List payments received, optionally for one contact or event, unsettled only, or within a created-date range. Wild Apricot: GET /accounts/{accountId}/payments.
Annotations the server declares
- title: List payments
- readOnlyHint: true
wildapricot_list_saved_searchesList the contact saved searches defined by admins (id, name, description).No findings
Why it is in this group
- The name "wildapricot_list_saved_searches" says "list": a word for reading.
Description, as the server wrote it List the contact saved searches defined by admins (id, name, description). Wild Apricot: GET /accounts/{accountId}/savedsearches.
Annotations the server declares
- title: List saved searches
- readOnlyHint: true
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 1.16.3. Values in angle brackets are yours to fill in.
claude mcp add --transport http wild-apricot https://wild-apricot.usefulapi.io/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__wild-apricot__wildapricot_list_accounts",
"mcp__wild-apricot__wildapricot_get_account",
"mcp__wild-apricot__wildapricot_list_contacts",
"mcp__wild-apricot__wildapricot_get_contact",
"mcp__wild-apricot__wildapricot_list_contact_fields",
"mcp__wild-apricot__wildapricot_list_membership_levels",
"mcp__wild-apricot__wildapricot_list_member_groups",
"mcp__wild-apricot__wildapricot_list_saved_searches",
"mcp__wild-apricot__wildapricot_list_events",
"mcp__wild-apricot__wildapricot_get_event",
"mcp__wild-apricot__wildapricot_list_event_registration_types",
"mcp__wild-apricot__wildapricot_list_event_registrations",
"mcp__wild-apricot__wildapricot_list_invoices",
"mcp__wild-apricot__wildapricot_list_payments",
"mcp__wild-apricot__wildapricot_list_donations",
"mcp__wild-apricot__wildapricot_list_audit_log"
],
"ask": [
"mcp__wild-apricot__wildapricot_get_saved_search"
],
"deny": [
"mcp__wild-apricot__wildapricot_create_contact",
"mcp__wild-apricot__wildapricot_update_contact",
"mcp__wild-apricot__wildapricot_create_event_registration",
"mcp__wild-apricot__wildapricot_check_in_attendee"
]
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as wild-apricot. Review it before you use it.