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

A
Description quality
100%
Schema completeness
79%
Naming quality
74%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (6)

  • LOWTool 'wildapricot_list_contact_fields' name length outside 3-30 rangein wildapricot_list_contact_fields
  • LOWTool 'wildapricot_list_membership_levels' name length outside 3-30 rangein wildapricot_list_membership_levels
  • LOWTool 'wildapricot_list_saved_searches' name length outside 3-30 rangein wildapricot_list_saved_searches
  • LOWTool 'wildapricot_list_event_registration_types' name length outside 3-30 rangein wildapricot_list_event_registration_types
  • LOWTool 'wildapricot_list_event_registrations' name length outside 3-30 rangein wildapricot_list_event_registrations
  • LOWTool 'wildapricot_create_event_registration' name length outside 3-30 rangein wildapricot_create_event_registration

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~4,938Tokens (tool definitions)
~1.9 KBTypical response size
Significant attention impact (3.86% of 128k context)

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-http

What it can do

Tool inventory

Tools (21)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded21 tools
verifiedversion not recorded21 tools