breeze-chms
Manage Breeze ChMS people, tags, events, check-ins, volunteers and contributions.
Should I use this
Quality & Safety
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": {
"breeze-chms": {
"url": "https://breeze-chms.usefulapi.io/mcp"
}
}
}Remote endpoints
https://breeze-chms.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (24)
π’breeze_get_account_summary
The church account this key belongs to: name, subdomain, status, timezone and country/currency. A cheap way to confirm BREEZE_SUBDOMAIN and BREEZE_API_KEY are right. Breeze: GET /api/account/summary.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’breeze_list_people(details, filter, limit, offset)
List people in the church database, optionally filtered (by tag, status, gender, etc.) and paginated with limit/offset. Without details you get id, first_name, last_name and photo path; with details=true every profile field is returned keyed by field_id (slower). Filter keys are profile field_ids (see breeze_list_profile_fields) or special keys, e.g. {"tag_contains":"y_16681"} for people in a tag, or {"2000138015":"226-227"} for a Status field matching options 226 or 227. Breeze: GET /api/people.
Input Schema
{
"type": "object",
"properties": {
"details": {
"description": "true = every profile field (slower); false/omitted = id and name only.",
"type": "boolean"
},
"filter": {
"description": "Filter object, sent as Breeze's filter_json, e.g. {\"tag_contains\":\"y_16681\"}.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"limit": {
"description": "Number of people to return. Omit to return everyone (can be large).",
"type": "integer",
"minimum": 1,
"maximum": 5000
},
"offset": {
"description": "People to skip, for pagination with limit.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’breeze_get_person(person_id, details)
Fetch one person's profile by id, including address and β by default β every profile field keyed by field_id, plus family members. Pair with breeze_list_profile_fields to label the field ids. Breeze: GET /api/people/{person_id}.
Input Schema
{
"type": "object",
"properties": {
"person_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "Numeric Breeze id of the person."
},
"details": {
"description": "Defaults to true (all information). false = only id and name.",
"type": "boolean"
}
},
"required": [
"person_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’breeze_list_profile_fields
The church's profile layout: sections, each with its fields (field_id, field_type, name) and, for multiple-choice fields, their options (option_id, name). Needed to read person details, to build list_people filters, and to write fields with breeze_add_person / breeze_update_person. Breeze: GET /api/profile.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’breeze_list_tags(folder_id)
List tags (Breeze's groups/lists) with id, name, created_on and folder_id, optionally only those in one folder. To list the people in a tag, call breeze_list_people with filter {"tag_contains":"y_<tag_id>"}. Breeze: GET /api/tags/list_tags.
Input Schema
{
"type": "object",
"properties": {
"folder_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "Numeric Breeze id of the tag folder."
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’breeze_list_events(start, end, category_id, eligible, details, ...)
List event instances in a date range (default: the current month), optionally on one calendar. Each row's `id` is the INSTANCE id used by attendance, volunteer and get_event tools; `event_id` is the series. Responses are cached by Breeze and may lag up to 15 minutes. Breeze: GET /api/events.
Input Schema
{
"type": "object",
"properties": {
"start": {
"description": "Events on or after (YYYY-MM-DD).",
"type": "string",
"pattern": "^\\d{4}-\\d{1,2}-\\d{1,2}$"
},
"end": {
"description": "Events on or before (YYYY-MM-DD).",
"type": "string",
"pattern": "^\\d{4}-\\d{1,2}-\\d{1,2}$"
},
"category_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "Numeric Breeze id of the calendar (from breeze_list_calendars)."
},
"eligible": {
"description": "Include who is eligible to check in (everyone / tags / forms / none).",
"type": "boolean"
},
"details": {
"description": "Include description, check-in settings, etc.",
"type": "boolean"
},
"limit": {
"description": "Max events, 1-1000 (Breeze default 500).",
"type": "integer",
"minimum": 1,
"maximum": 1000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’breeze_get_event(instance_id, schedule, schedule_direction, schedule_limit, eligible, ...)
Fetch one event instance, optionally with the other instances in its series (then the response is an array of {id, start} only). Cached by Breeze, may lag up to 15 minutes. Breeze: GET /api/events/list_event.
Input Schema
{
"type": "object",
"properties": {
"instance_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "Numeric Breeze id of the event instance."
},
"schedule": {
"description": "Also return other instances in the same series.",
"type": "boolean"
},
"schedule_direction": {
"description": "With schedule: instances before (default) or after this one.",
"type": "string",
"enum": [
"before",
"after"
]
},
"schedule_limit": {
"description": "With schedule: how many series instances, 1-100 (default 10).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"eligible": {
"description": "Include check-in eligibility details.",
"type": "boolean"
},
"details": {
"description": "Include description, check-in settings, etc.",
"type": "boolean"
}
},
"required": [
"instance_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’breeze_list_calendars
List the church's event calendars (id, name, color and iCal feed address). The id is the category_id for breeze_list_events and breeze_add_event. Breeze: GET /api/events/calendars/list.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’breeze_list_attendance(instance_id, details, type)
Who checked in to one event instance (person_id, check-in time created_on, check_out), optionally with each person's details, or the anonymous head count instead. Breeze: GET /api/events/attendance/list.
Input Schema
{
"type": "object",
"properties": {
"instance_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "Numeric Breeze id of the event instance."
},
"details": {
"description": "Include each attendee's profile details.",
"type": "boolean"
},
"type": {
"description": "person (default) = named check-ins; anonymous = head count.",
"type": "string",
"enum": [
"person",
"anonymous"
]
}
},
"required": [
"instance_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’breeze_list_forms(archived)
List the church's online forms (id, name, url_slug, is_archived) β active ones by default, or archived ones. Breeze: GET /api/forms/list_forms.
Input Schema
{
"type": "object",
"properties": {
"archived": {
"description": "true = list archived forms instead of active ones.",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’breeze_list_form_fields(form_id)
The fields of one form (field_id, field_type, name, options). Form entry responses are keyed by these field_ids. Breeze: GET /api/forms/list_form_fields.
Input Schema
{
"type": "object",
"properties": {
"form_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "Numeric Breeze id of the form."
}
},
"required": [
"form_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’breeze_list_form_entries(form_id, details)
Submissions to one form (id, created_on, person_id), and with details=true each entry's responses keyed by form field_id (see breeze_list_form_fields). Breeze: GET /api/forms/list_form_entries.
Input Schema
{
"type": "object",
"properties": {
"form_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "Numeric Breeze id of the form."
},
"details": {
"description": "Include each entry's field responses.",
"type": "boolean"
}
},
"required": [
"form_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’breeze_list_volunteers(instance_id)
Volunteers scheduled for one event instance: person_id, response, comment, rsvped_on and role_ids. Breeze: GET /api/volunteers/list.
Input Schema
{
"type": "object",
"properties": {
"instance_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "Numeric Breeze id of the event instance."
}
},
"required": [
"instance_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’breeze_list_account_log(action, start, end, user_id, details, ...)
The account's audit log for one action type (e.g. person_updated, tag_assign, contribution_added), optionally within a date range or by one user. Good for 'what changed sinceβ¦' and incremental sync. Breeze: GET /api/account/list_log.
Input Schema
{
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": [
"text_sent",
"contribution_added",
"contribution_updated",
"contribution_deleted",
"bulk_contributions_deleted",
"envelope_created",
"envelope_updated",
"envelope_deleted",
"payment_method_updated",
"payment_method_deleted",
"payment_method_created",
"bank_account_added",
"bank_account_updated",
"transfer_day_changed",
"bank_account_deleted",
"payment_association_deleted",
"payment_association_created",
"bulk_import_contributions",
"bulk_import_pledges",
"bulk_pledges_deleted",
"batch_updated",
"batch_deleted",
"bulk_envelopes_deleted",
"event_created",
"event_updated",
"event_deleted",
"event_instance_deleted",
"event_future_deleted",
"events_calendar_created",
"events_calendar_updated",
"events_calendar_deleted",
"bulk_import_attendance",
"attendance_deleted",
"bulk_attendance_deleted",
"volunteer_role_created",
"volunteer_role_deleted",
"person_created",
"person_updated",
"person_deleted",
"person_archived",
"person_merged",
"people_updated",
"bulk_update_people",
"bulk_people_deleted",
"bulk_people_archived",
"bulk_import_people",
"bulk_notes_deleted",
"tag_created",
"tag_updated",
"tag_deleted",
"bulk_tags_deleted",
"tag_folder_created",
"tag_folder_updated",
"tag_folder_deleted",
"tag_assign",
"tag_unassign",
"form_created",
"form_updated",
"form_deleted",
"form_entry_updated",
"form_entry_deleted",
"followup_option_created",
"followup_option_updated",
"followup_option_deleted",
"user_created",
"user_updated",
"user_deleted",
"role_created",
"role_updated",
"role_deleted",
"extension_installed",
"extension_uninstalled",
"extension_upgraded",
"extension_downgraded",
"sub_payment_method_updated"
],
"description": "Which logged action to return (required by Breeze)."
},
"start": {
"description": "Actions on or after (YYYY-MM-DD).",
"type": "string",
"pattern": "^\\d{4}-\\d{1,2}-\\d{1,2}$"
},
"end": {
"description": "Actions on or before (YYYY-MM-DD).",
"type": "string",
"pattern": "^\\d{4}-\\d{1,2}-\\d{1,2}$"
},
"user_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "Numeric Breeze id of the Breeze user who made the change."
},
"details": {
"description": "Include a free-form description of each action (not standardized).",
"type": "boolean"
},
"limit": {
"description": "Max rows, 1-3000 (Breeze default 500).",
"type": "integer",
"minimum": 1,
"maximum": 3000
}
},
"required": [
"action"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’breeze_list_funds(include_totals)
List giving funds (id, name, tax_deductible, is_default), optionally with the total given to each. Legacy endpoint: no longer shown on Breeze's current API reference; churches whose giving runs through Tithely may get an error. Breeze: GET /api/funds/list.
Input Schema
{
"type": "object",
"properties": {
"include_totals": {
"description": "Include the amount given to each fund.",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’breeze_list_contributions(start, end, person_id, include_family, amount_min, ...)
List recorded contributions (gifts) given within a date range, optionally narrowed by giver (with their family), amount, payment method, fund, envelope, batch or form. Read-only: this server never adds, edits or deletes gifts. Legacy endpoint: no longer shown on Breeze's current API reference; churches whose giving runs through Tithely may get an error. Breeze: GET /api/giving/list.
Input Schema
{
"type": "object",
"properties": {
"start": {
"type": "string",
"pattern": "^\\d{4}-\\d{1,2}-\\d{1,2}$",
"description": "Contributions given on or after (YYYY-MM-DD)."
},
"end": {
"type": "string",
"pattern": "^\\d{4}-\\d{1,2}-\\d{1,2}$",
"description": "Contributions given on or before (YYYY-MM-DD)."
},
"person_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "Numeric Breeze id of the giver."
},
"include_family": {
"description": "With person_id: include gifts from the giver's family members.",
"type": "boolean"
},
"amount_min": {
"description": "Only gifts of at least this amount.",
"type": "number",
"minimum": 0
},
"amount_max": {
"description": "Only gifts of at most this amount.",
"type": "number",
"minimum": 0
},
"method_ids": {
"description": "Only these payment method ids.",
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d+$"
}
},
"fund_ids": {
"description": "Only these fund (from breeze_list_funds) ids.",
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d+$"
}
},
"envelope_number": {
"description": "Only gifts with this envelope number.",
"type": "string"
},
"batches": {
"description": "Only these batch number ids.",
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d+$"
}
},
"forms": {
"description": "Only these form ids.",
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d+$"
}
}
},
"required": [
"start",
"end"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π΄breeze_add_person(first, last, fields)
WRITE: create a new person profile with a first and last name, and optionally set profile fields in the same call (same field shape as breeze_update_person). Check breeze_list_people first to avoid duplicates. Returns the new profile including its id. Breeze: GET /api/people/add.
Input Schema
{
"type": "object",
"properties": {
"first": {
"type": "string",
"minLength": 1,
"description": "First name."
},
"last": {
"type": "string",
"minLength": 1,
"description": "Last name."
},
"fields": {
"description": "Profile fields to set (sent as fields_json).",
"type": "array",
"items": {
"type": "object",
"properties": {
"field_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "The profile field_id, from breeze_list_profile_fields."
},
"field_type": {
"type": "string",
"minLength": 1,
"description": "Breeze field type: text, textarea, radio (multiple choice AND dropdown), checkbox, date, birthdate, email, phone, address or family_role."
},
"response": {
"description": "The value. Text/date: the string (dates as M/D/YYYY). radio/checkbox: the option_id. email/phone/address: true, with the value in details.",
"type": [
"string",
"boolean"
]
},
"details": {
"description": "Extra data for compound fields, e.g. email {\"address\":\"[email protected]\"}; phone {\"phone_mobile\":\"111-111-1111\"} (or phone_home / phone_work); address {\"street_address\",\"city\",\"state\",\"zip\"}; family_role {\"person_id\":123,\"role_id\":3} (1 Unassigned, 2 Child, 3 Adult, 4 Head of Household, 5 Spouse).",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"required": [
"field_id",
"field_type",
"response"
]
}
}
},
"required": [
"first",
"last"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π΄breeze_update_person(person_id, fields)
WRITE: set profile fields on an existing person β email, phone, address, dates, multiple-choice options, family role, and custom fields. Only the fields you pass change; the previous values are overwritten (read them first with breeze_get_person if you may need to restore them). field_id and option ids come from breeze_list_profile_fields. Breeze: GET /api/people/update.
Input Schema
{
"type": "object",
"properties": {
"person_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "Numeric Breeze id of the person."
},
"fields": {
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"field_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "The profile field_id, from breeze_list_profile_fields."
},
"field_type": {
"type": "string",
"minLength": 1,
"description": "Breeze field type: text, textarea, radio (multiple choice AND dropdown), checkbox, date, birthdate, email, phone, address or family_role."
},
"response": {
"description": "The value. Text/date: the string (dates as M/D/YYYY). radio/checkbox: the option_id. email/phone/address: true, with the value in details.",
"type": [
"string",
"boolean"
]
},
"details": {
"description": "Extra data for compound fields, e.g. email {\"address\":\"[email protected]\"}; phone {\"phone_mobile\":\"111-111-1111\"} (or phone_home / phone_work); address {\"street_address\",\"city\",\"state\",\"zip\"}; family_role {\"person_id\":123,\"role_id\":3} (1 Unassigned, 2 Child, 3 Adult, 4 Head of Household, 5 Spouse).",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"required": [
"field_id",
"field_type",
"response"
]
},
"description": "Profile fields to set (sent as fields_json)."
}
},
"required": [
"person_id",
"fields"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π΄breeze_add_tag(name, folder_id)
WRITE: create a new tag, at the top level or inside a folder. Returns the new tag with its id. Breeze: GET /api/tags/add_tag.
Input Schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Tag name, e.g. \"Small Groups\"."
},
"folder_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "Numeric Breeze id of the folder to place the tag in (default: top level)."
}
},
"required": [
"name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π΄breeze_assign_tag(person_id, tag_id)
WRITE: add a tag to one person (e.g. put them in a small group or list). Undo with breeze_unassign_tag. Breeze: GET /api/tags/assign.
Input Schema
{
"type": "object",
"properties": {
"person_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "Numeric Breeze id of the person."
},
"tag_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "Numeric Breeze id of the tag."
}
},
"required": [
"person_id",
"tag_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π΄breeze_unassign_tag(person_id, tag_id)
WRITE: remove a tag from one person. The person and the tag both remain; re-assign with breeze_assign_tag. Breeze: GET /api/tags/unassign.
Input Schema
{
"type": "object",
"properties": {
"person_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "Numeric Breeze id of the person."
},
"tag_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "Numeric Breeze id of the tag."
}
},
"required": [
"person_id",
"tag_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π΄breeze_add_event(name, starts_on, ends_on, all_day, description, ...)
WRITE: create an event on the church calendar, optionally as another instance of an existing series. Times are Unix timestamps in seconds. This server cannot delete events, so a mistaken event must be removed in the Breeze app. Breeze: GET /api/events/add.
Input Schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Event name."
},
"starts_on": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Start time, Unix timestamp in seconds."
},
"ends_on": {
"description": "End time, Unix timestamp in seconds (default: one hour after start).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"all_day": {
"description": "All-day event; only the date of starts_on is used.",
"type": "boolean"
},
"description": {
"description": "Event description (HTML allowed).",
"type": "string"
},
"category_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "Numeric Breeze id of the calendar to place the event on (default: main)."
},
"event_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "Numeric Breeze id of the existing event series to add this instance to."
}
},
"required": [
"name",
"starts_on"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π΄breeze_record_attendance(person_id, instance_id, direction)
WRITE: record attendance for one person at one event instance β check them in (default) or check them out (records when they left; checking out someone not checked in creates a record with matching in/out times). Breeze: GET /api/events/attendance/add.
Input Schema
{
"type": "object",
"properties": {
"person_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "Numeric Breeze id of the person."
},
"instance_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "Numeric Breeze id of the event instance."
},
"direction": {
"description": "in (default) or out.",
"type": "string",
"enum": [
"in",
"out"
]
}
},
"required": [
"person_id",
"instance_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π΄breeze_schedule_volunteer(instance_id, person_id)
WRITE: schedule one person as a volunteer for one event instance. Breeze: GET /api/volunteers/add.
Input Schema
{
"type": "object",
"properties": {
"instance_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "Numeric Breeze id of the event instance."
},
"person_id": {
"type": "string",
"pattern": "^\\d+$",
"description": "Numeric Breeze id of the person."
}
},
"required": [
"instance_id",
"person_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence