The Planning Center MCP connector routes your AI agent's tool calls to Planning Center's own MCP server through Scalekit. Each user signs in to Planning Center once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 65 tools.
- Tools
- 65
- What they doRead · write · destructive
- 62 · 3 · 062 read3 write0 destructive
- Users sign in with
- OAuth
- OAuth app
- Scalekit's or your own
Setup
Install the SDK
Terminal window npm install @scalekit-sdk/node dotenvTerminal window pip install scalekit-sdk-python python-dotenvSet your credentials
Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret>Create the Planning Center MCP connection
In AgentKit > Connections, create a Planning Center MCP connection. The name you give it is the
connection_nameyour code passes. See Configure connections.Scalekit credentials are available for Planning Center MCP server, so you don't need to register an OAuth app.
Authorize a user and make your first call
quickstart.mts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'import { createInterface } from 'node:readline/promises'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENVIRONMENT_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'planningcentermcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Planning Center MCP:', link)const rl = createInterface({ input: process.stdin, output: process.stdout })await rl.question('Press Enter after authorizing...')rl.close()// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'planningcentermcp_calendar_calendars',toolInput: {},})console.log(result)Terminal window npx tsx quickstart.mtsquickstart.py import osfrom scalekit import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "planningcentermcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Planning Center MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="planningcentermcp_calendar_calendars",connection_name=connection_name,identifier=identifier,)print(result)Terminal window python quickstart.pyEach user signs in once. See Authorize a user for the full flow and statuses.
Tools
Pass the exact name toexecute_toolplanningcentermcp_calendar_calendarsList the calendars configured in Planning Center Calendar (e.g.Read-onlyCalendarCalendars
List the calendars configured in Planning Center Calendar (e.g. "Youth Ministry", "Staff", "Worship"). Calendars partition an organization's events by ministry or context. Use this tool to see which calendars exist, resolve a calendar name to its id, or look up a calendar's description, color, or default status. This tool returns the full list of calendars; there is no server-side filtering by name or any other attribute. Organizations have only a small handful of calendars, so retrieve them all and match the one you want by name client-side.
Inputs
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
name-name output_fieldsarray- Specify which fields to include in the response.
planningcentermcp_calendar_conflictsRead booking conflicts in Planning Center Calendar — situations where two events have overlapping resource requests for the same room or piece of equipment.Read-onlyCalendarConflicts
Read booking conflicts in Planning Center Calendar — situations where two events have overlapping resource requests for the same room or piece of equipment. A conflict carries the contested `resource`, the `winner` event once staff have picked one, and `resolved_at` when the conflict has been settled. Use `filter: ["unresolved"]` to answer "what's overbooked right now" — that's the operationally interesting set, and it inherently scopes to conflicts on upcoming events (past-only conflicts drop out). `filter: ["resolved"]` returns conflicts that have been settled. The `resource` relationship id chains to the calendar_resources tool; the `winner` event id chains to calendar_events. Both are surfaced as JSON:API relationship linkages on every response.
Inputs
filterarray- Restrict to "unresolved" (currently overbooked, scoped to upcoming events) or "resolved" (settled).
includearray- Specify which relationships to include in the response.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
resolved_at-resolved_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10
planningcentermcp_calendar_event_instancesSearch specific occurrences of events in Planning Center Calendar — the "what is happening at this date and time" surface.Read-onlyCalendarEventInstances
Search specific occurrences of events in Planning Center Calendar — the "what is happening at this date and time" surface. An event instance is one occurrence of a parent event: a single Wednesday of a weekly Bible Study, next Sunday's service, or the one date of a one-off event. Recurring instances expose `recurrence` and `compact_recurrence_description` for human-readable patterns. Prefer this tool over `calendar_events` when the question is about specific dates or times ("what's happening next Sunday?", "when does the youth retreat happen?", "the next four Wednesdays of Bible Study"). Use `calendar_events` instead when the question is about the parent event template regardless of when it occurs. For questions about one particular event, resolve it with `calendar_events` and pass its id as `event_id` — more reliable than an `event_name` substring match when several events share a word. Pair it with `filter: ["future"]` for "when does this happen next?". Use `filter: ["future"]` for upcoming instances without computing a date filter yourself. Filter by name via `event_name` (a phrase-substring match — pass a bare substring like "bible study"; wildcards are not supported), by kind, by date range, by tag, or by calendar. To filter by tag, call `calendar_tags` to resolve a tag name to a tag id, then pass `tag_ids` here to narrow to that ministry, audience, or category. To filter by calendar, call `calendar_calendars` to resolve a calendar name to a calendar id, then pass `calendar_ids` here. `description`, `image_url`, and `kind` are heavier fields (rich HTML, image URL, event kind) and are only returned when you list them explicitly in `output_fields`.
Inputs
calendar_idsarray- Filter instances by calendar ids. A single id is the common case. Passing multiple ids returns instances on ANY of those calendars (a union) — `[worship_id, youth_id]` returns instances on either calendar. Resolve calendar names to ids via `calendar_calendars`.
created_at_endstring- Latest created at to include (inclusive), as YYYY-MM-DD.
created_at_startstring- Earliest created at to include (inclusive), as YYYY-MM-DD. Pair with created_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
ends_at_endstring- Latest ends at to include (inclusive), as YYYY-MM-DD.
ends_at_startstring- Earliest ends at to include (inclusive), as YYYY-MM-DD. Pair with ends_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
event_idstring- Limit to occurrences of this event, resolved via the calendar_events tool. Prefer this over event_name whenever you already know which event you mean. Only the "future" filter value is supported when scoped to an event; the approval-status filter values cannot be combined with event_id.
event_namestring- Filter instances by name (defaults to the parent event's name; can be overridden per instance). Phrase-substring match — pass a bare substring like "bible study"; wildcards are not supported.
filterarray- Named filter scopes. Use ["future"] to return only instances that have not yet ended. Approval-status scopes filter by each instance's booking status: "approved" also includes shared instances, "pending" also includes unresolved conflicts, and "rejected" also includes lost instances. The approval-status scopes are not available when event_id is supplied.
includearray- Specify which relationships to include in the response.
kindstring- Filter instances by their parent event's kind: "standard" for normal events, "blockout" for blockouts.one of
standardblockout order_bystring- Sort results by field. Use '-' prefix for descending order.one of
created_at-created_atupdated_at-updated_atstarts_at-starts_atends_at-ends_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 starts_at_endstring- Latest starts at to include (inclusive), as YYYY-MM-DD.
starts_at_startstring- Earliest starts at to include (inclusive), as YYYY-MM-DD. Pair with starts_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
tag_idsarray- Filter instances by tag ids. A single id is the common case. When you pass multiple ids, upstream composes them as OR within a tag group and AND across tag groups (ungrouped tags each count as their own group) — so `[youth_ministry_id, sunday_service_id]` returns instances tagged with BOTH, not either. Resolve tag names via `calendar_tags`.
updated_at_endstring- Latest updated at to include (inclusive), as YYYY-MM-DD.
updated_at_startstring- Earliest updated at to include (inclusive), as YYYY-MM-DD. Pair with updated_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
planningcentermcp_calendar_eventsSearch events in Planning Center Calendar.Read-onlyCalendarEvents
Search events in Planning Center Calendar. Calendar is the organization-wide event discovery surface and absorbs events originating in Services, Groups, and Registrations — a Sunday service plan, a small group meeting, and an event signup all appear here alongside Calendar-native events. Use this tool to find events across products: by name, approval status, Church Center visibility, feed, created/updated date, or the `future` named scope for upcoming events. Two views of the same record are simultaneously true: an event surfaced here may also be the source-of-truth for a product-native tool. When the user wants product-specific detail — a Services plan's order of service, a Registrations signup's attendees, a Group's roster — chain into `services_plans`, `registrations_signups`, or `groups_events` after discovering the event here. This tool doesn't surface which calendar an event belongs to — no calendar field or include here. To work by calendar, resolve the calendar id with `calendar_calendars` and pass it to `calendar_event_instances` as `calendar_ids`. That returns one row per occurrence, so dedupe on the `event` relationship id to count events.
Inputs
approval_statusstring- Filter by approval status: 'A' approved, 'P' pending, 'R' rejected.one of
APR created_at_endstring- Latest created at to include (inclusive), as YYYY-MM-DD.
created_at_startstring- Earliest created at to include (inclusive), as YYYY-MM-DD. Pair with created_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
featuredboolean- Filter by whether the event is featured on Church Center.
feed_idstring- Filter events by the feed they belong to (e.g. the Services, Groups, or Registrations feed that absorbs them into Calendar).
filterarray- Use ["future"] to return only events that have not yet ended, excluding past events.
includearray- Specify which relationships to include in the response.
link_onlyboolean- Filter by whether the event is published to Church Center through a direct link only.
namestring- Filter events by name. Matches exactly unless you include a '%' wildcard for partial matches.
output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 updated_at_endstring- Latest updated at to include (inclusive), as YYYY-MM-DD.
updated_at_startstring- Earliest updated at to include (inclusive), as YYYY-MM-DD. Pair with updated_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
visible_in_church_centerboolean- Filter by whether the event's Church Center visibility is Published (true) or Hidden (false).
planningcentermcp_calendar_resource_bookingsSearch resource bookings in Planning Center Calendar — a successful reservation of a room or piece of equipment for an event, over a start/end time range.Read-onlyCalendarResourceBookings
Search resource bookings in Planning Center Calendar — a successful reservation of a room or piece of equipment for an event, over a start/end time range. Use this tool to answer "what's booked?" questions, e.g. whether a room is reserved during a time window, or what's reserved for a particular event or occurrence. Provide `resource_id` (resolved via `calendar_resources`) to scope to a single room or resource, `event_id` (resolved via `calendar_events`) to scope to a single event's bookings, or `event_instance_id` (resolved via `calendar_event_instances`) to scope to one specific occurrence — provide at most one of the three. Omit all three to search bookings across the whole organization. Recurring events (weekly services, ongoing classes) attach their bookings to the individual event instance rather than the parent event, so prefer `event_instance_id` for "what's booked for this Sunday/this occurrence?" questions. Use the `event_resource_request` include to identify what was reserved and its approval status; chain into `calendar_events` for richer event detail — this tool does not include the full event record. A booking is a successful reservation, distinct from a scheduling conflict (overlapping reservations awaiting staff resolution) — for "what's overbooked?" questions, use `calendar_conflicts` instead.
Inputs
approval_statusstring- Limit to bookings with this approval status. This is a single value, not a list — use a compound value such as "approved_pending" to match multiple statuses in one call, since the API ORs statuses within a single value but ANDs separate filter values. Cannot be combined with event_id or event_instance_id (neither route supports approval-status scopes).one of
approvedpendingrejectedapproved_pendingapproved_rejectedpending_rejectedapproved_pending_rejected ends_at_endstring- Latest ends at to include (inclusive), as YYYY-MM-DD.
ends_at_startstring- Earliest ends at to include (inclusive), as YYYY-MM-DD. Pair with ends_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
event_idstring- Limit to bookings for this event, resolved via the calendar_events tool. Provide at most one of resource_id/event_id/event_instance_id. Only the "future" filter value is supported when scoped to an event; approval_status cannot be combined with event_id.
event_instance_idstring- Limit to bookings for this specific occurrence of an event, resolved via the calendar_event_instances tool. Provide at most one of resource_id/event_id/event_instance_id. Prefer this over event_id for recurring events — their bookings attach to the instance, not the parent event. Only the "future" filter value is supported when scoped to an event instance; approval_status cannot be combined with event_instance_id.
filterarray- Use ["future"] to limit to bookings that haven't ended yet.
includearray- Specify which relationships to include in the response.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
created_at-created_atends_at-ends_atstarts_at-starts_atupdated_at-updated_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 resource_idstring- Limit to bookings of this room or resource, resolved via the calendar_resources tool. Provide at most one of resource_id/event_id/event_instance_id.
starts_at_endstring- Latest starts at to include (inclusive), as YYYY-MM-DD.
starts_at_startstring- Earliest starts at to include (inclusive), as YYYY-MM-DD. Pair with starts_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
planningcentermcp_calendar_resourcesSearch rooms and equipment available for booking in Planning Center Calendar.Read-onlyCalendarResources
Search rooms and equipment available for booking in Planning Center Calendar. A "resource" is either a physical space (kind='Room') or an item of equipment (kind='Resource'). Each resource carries a `path_name` in the output showing its folder location (e.g. "Main Campus/Sanctuary"); path-based filtering isn't supported server-side, but you can scope to a specific folder via `resource_folder_id` (chain from `include: resource_folder`). Use this tool when the question is about *space or equipment booking* — "what rooms can we book?", "list all our A/V equipment", "which resources do we have?". If instead the question is about *check-in setup* (where kids get dropped off, which station a family checks in at), that's a Check-Ins locations concept and belongs to a separate Check-Ins tool. Resource ids returned here chain forward to Calendar tools that answer "is this resource booked at time X."
Inputs
created_at_endstring- Latest created at to include (inclusive), as YYYY-MM-DD.
created_at_startstring- Earliest created at to include (inclusive), as YYYY-MM-DD. Pair with created_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
filterarray- Use ["rooms"] for rooms only or ["resources"] for equipment only. Named scopes on the organization endpoint; equivalent to `kind=Room` / `kind=Resource`.
idsarray- Specific resource IDs to retrieve
includearray- Specify which relationships to include in the response.
kindstring- Filter by kind: 'Room' for physical bookable spaces, 'Resource' for equipment.one of
RoomResource namestring- Filter resources by name. Matches exactly unless you include a '%' wildcard for partial matches.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
created_at-created_atexpires_at-expires_atname-nameupdated_at-updated_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 resource_folder_idstring- Filter to resources in a specific folder. Chain from a prior response's `include: resource_folder` linkage, or from a folder id you already have.
updated_at_endstring- Latest updated at to include (inclusive), as YYYY-MM-DD.
updated_at_startstring- Earliest updated at to include (inclusive), as YYYY-MM-DD. Pair with updated_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
planningcentermcp_check_ins_check_insSearch individual check-in records — one row per person per event session, showing who checked in to which event, when, where, and whether they were checked out.Read-onlyCheckInsCheckIns
Search individual check-in records — one row per person per event session, showing who checked in to which event, when, where, and whether they were checked out. Use for attendance questions where individual identity matters (e.g. "who checked in to the 9am service last Sunday", "did the Smith family check in this morning"). Each record covers regular attendees, guests, or volunteers; filter by event, person, date, or check-in category. `checked_out_at` is ambiguous when null: it can mean the person hasn't been picked up yet, OR that the org doesn't record check-outs at all (many don't — they only badge people in). Report what the data shows and surface the ambiguity rather than asserting someone wasn't picked up. Use `include=checked_out_by` to surface the picker-upper when it was recorded. `security_code`, `medical_notes`, `emergency_contact_name`, and `emergency_contact_phone_number` are stripped from every response before it reaches you — the upstream API exposes them to admins, but this tool removes them on both the primary check-in record and any included resources. Sibling tools to disambiguate: - `check_ins_check_ins` (this tool) — one row per person per event session. Use for "who" and "how many" when individual identity matters. - `check_ins_headcounts` — pre-aggregated totals by event/category. Use for "how many" when only the count matters and no PII is needed (and the org actually recorded headcounts). - `services_plans` — planning-side schedules (who's scheduled to play / on the rotation), NOT attendance. To find check-ins for a Registrations signup, follow the chain: `registrations_signups` returns a signup id → pass that as `registration_event_id` on `check_ins_events` → take the resulting Check-Ins event's id → pass it as `event_id` here. The reverse direction (a Check-Ins event back to its source signup) is not exposed.
Inputs
account_center_person_idinteger- Limit to check-ins for a specific person. Pass a value returned by `people_search`. Note: one-time-guest check-ins have no person id and are excluded by this filter.
created_at_endstring- Latest created at to include (inclusive), as YYYY-MM-DD.
created_at_startstring- Earliest created at to include (inclusive), as YYYY-MM-DD. Pair with created_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
event_idinteger- Limit to check-ins for a specific Check-Ins event. Pass a value returned by `check_ins_events`.
filterstring- Limit to a check-in category: regular, guest, volunteer, attendee (regular + guest combined), first_time, one_time_guest, not_one_time_guest, checked_out, or not_checked_out.one of
regularguestvolunteerattendeefirst_timeone_time_guestnot_one_time_guestchecked_outnot_checked_out includearray- Specify which relationships to include in the response.
location_idsarray- Limit to check-ins at specific locations. Pass values returned by `check_ins_locations`.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
first_name-first_namelast_name-last_namenumber-numbercreated_at-created_atupdated_at-updated_atchecked_out_at-checked_out_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10
planningcentermcp_check_ins_event_timesList the individual sessions (event times) configured within a Check-Ins event — e.g.Read-onlyCheckInsEventTimes
List the individual sessions (event times) configured within a Check-Ins event — e.g. the 9:00 and 11:00 services of a Sunday Service event, or each night of VBS. Returns start times, when the session is visible in check-in UIs (`shows_at`/`hides_at`), and per-session attendance counts (`regular_count`, `guest_count`, `volunteer_count`). Pass `event_id` from `check_ins_events` to drill into a specific event's sessions. Only the current period's sessions are returned when scoped this way — historical sessions from past occurrences of a recurring event aren't available on this route. Omit `event_id` for an organization-wide list.
Inputs
event_idinteger- Limit to sessions for a specific event. Returns the event's current period's sessions only. Pass an id returned by `check_ins_events`.
includearray- Specify which relationships to include in the response.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
starts_at-starts_atshows_at-shows_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10
planningcentermcp_check_ins_eventsSearch events configured in Check-Ins (e.g.Read-onlyCheckInsEvents
Search events configured in Check-Ins (e.g. Sunday Service, Wednesday VBS). Returns events that are set up for check-in — not Calendar events, Services plans, or Registrations signups. Events may be native to Check-Ins or auto-created from a Registrations signup. To find the Check-Ins event spawned by a specific signup, pass the signup's event id as `registration_event_id`. (Going the other direction — a Check-Ins event back to its source signup — is not exposed on this endpoint.)
Inputs
campus_idinteger- Limit to events for a specific campus.
filterstring- Limit to archived, not-archived, headcount-enabled, or Registrations-spawned events.one of
archivednot_archivedfor_headcountsfor_registrations idsarray- Specific event IDs to retrieve.
includearray- Specify which relationships to include in the response.
namestring- Match events whose name contains this substring.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
name-namecreated_at-created_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 registration_event_idinteger- The Registrations event id of a signup. Use to find the Check-Ins event auto-created from that signup. Pass a value returned by `registrations_signups`.
planningcentermcp_check_ins_headcountsSearch manually-recorded headcount tallies for Check-Ins event times — counts that staff explicitly entered in the Headcounts app (e.g.Read-onlyCheckInsHeadcounts
Search manually-recorded headcount tallies for Check-Ins event times — counts that staff explicitly entered in the Headcounts app (e.g. "9am service / Adults = 187"). Each row pairs one event_time with one attendance_type and a total. An absent row may mean the count was zero. Use this only for explicit-tally counts. For attendance derived from individual people scanning in at a station, use `check_ins_check_ins` and aggregate. For who is *scheduled* on a service team for that service time, use `services_plans` instead. Pass `event_time_id` (an id from `check_ins_event_times`) to scope tallies to one session — the direct way to read or compare specific sessions (9am vs 11am). Headcount itself is only queryable by `created_at` / `updated_at`, so a time-window prompt ("last Sunday's 9am service") still means finding the session in `check_ins_event_times` first (by its `starts_at`) and passing its `event_time_id` here. Attendance-type names come from the included `attendance_type` resource (included by default); there is no separate MCP tool that lists attendance types, so this include is the only source of attendance-type names.
Inputs
created_at_endstring- Latest created at to include (inclusive), as YYYY-MM-DD.
created_at_startstring- Earliest created at to include (inclusive), as YYYY-MM-DD. Pair with created_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
event_time_idinteger- Scope to a single event time (session), returning only that session's headcount tallies. Pass an id from `check_ins_event_times`.
includearray- Specify which relationships to include in the response.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
created_at-created_attotal-totalupdated_at-updated_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 updated_at_endstring- Latest updated at to include (inclusive), as YYYY-MM-DD.
updated_at_startstring- Earliest updated at to include (inclusive), as YYYY-MM-DD. Pair with updated_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
planningcentermcp_check_ins_locationsSearch check-in locations configured for a single Check-Ins event — rooms, age groups, and other places people check in to.Read-onlyCheckInsLocations
Search check-in locations configured for a single Check-Ins event — rooms, age groups, and other places people check in to. Each location has age, grade, and gender gating that determines who's allowed to check in there. Requires an `event_id`; look one up with `check_ins_events`. Some locations have `kind="Folder"`, meaning they don't accept check-ins themselves — they contain other locations. Use `include=locations` to descend into a folder's children and `include=parent` to walk back up. To drop folders and return only check-in-able locations, pass `filter="locations"`; to keep only top-level entries (no parent folder), pass `filter="root"`. Note: Check-Ins locations are distinct from Calendar resources (physically bookable spaces like the sanctuary) — if a prompt says "rooms," confirm which is meant.
Inputs
event_idintegerrequired- List locations configured for this single event (see check_ins_events).
filterstring- `locations` drops folders (keeps only check-in-able locations); `root` keeps only top-level entries (no parent folder).one of
rootlocations includearray- Specify which relationships to include in the response.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
kind-kindname-nameposition-position output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10
planningcentermcp_giving_batch_groupsList giving batch groups — optional, customizable collections of giving batches that share common characteristics.Read-onlyGivingBatchGroups
List giving batch groups — optional, customizable collections of giving batches that share common characteristics. Each group carries `total_cents`/`total_currency` totals and a `committed`/`status` state (`uncommitted`, `updating`, or `committed`), and committing a group commits all of its batches and donations. Limit to `committed` or `in_progress` (uncommitted) groups, find a group by a partial match on its `description`, narrow by `updated_at` range, include the `owner` (the Giving admin who created it), and sort by `updated_at`. Use `giving_batches` to drill into the individual batches within a group.
Inputs
descriptionstring- Partial (substring) match on a batch group's description.
filterstring- Limit to `committed` batch groups or `in_progress` (uncommitted) batch groups.one of
committedin_progress includearray- Specify which relationships to include in the response.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
updated_at-updated_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 updated_at_endstring- Latest updated at to include (inclusive), as YYYY-MM-DD.
updated_at_startstring- Earliest updated at to include (inclusive), as YYYY-MM-DD. Pair with updated_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
planningcentermcp_giving_batchesList giving batches — groupings of donations.Read-onlyGivingBatches
List giving batches — groupings of donations. A batch starts uncommitted (`status` `in_progress`), acting as a staging area where its donations aren't yet visible to donors, and becomes visible once committed (`status` `committed`, with a `committed_at` timestamp). Each batch carries `total_cents`/`total_currency` totals (and `donations_count` on request). Filter to `committed` or `in_progress` batches, narrow by `updated_at` or `committed_at` range, and include the `batch_group` it belongs to or its `owner` (the Giving admin who created it). Sort by `committed_at` to surface the most recently committed batches.
Inputs
committed_at_endstring- Latest committed at to include (inclusive), as YYYY-MM-DD.
committed_at_startstring- Earliest committed at to include (inclusive), as YYYY-MM-DD. Pair with committed_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
filterstring- Limit to `committed` batches or `in_progress` (uncommitted) batches.one of
committedin_progress includearray- Specify which relationships to include in the response.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
updated_at-updated_atcommitted_at-committed_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 updated_at_endstring- Latest updated at to include (inclusive), as YYYY-MM-DD.
updated_at_startstring- Earliest updated at to include (inclusive), as YYYY-MM-DD. Pair with updated_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
planningcentermcp_giving_donationsSearch donations in Planning Center Giving - the individual gifts a church has received, with the amount, how it was paid, when it arrived, and whether it was refunded.Read-onlyGivingDonations
Search donations in Planning Center Giving - the individual gifts a church has received, with the amount, how it was paid, when it arrived, and whether it was refunded. All money is in cents (`amount_cents` 5000 is $50.00). `received_at` is the business date a gift counts toward and what the Giving admin UI filters on - prefer it over `created_at`, which is when the record was entered. Searches the whole organization by default. Pass at most one of `person_id` (one donor's giving history), `batch_id` (the gifts in one batch), or `campus_id` - none of these is filterable org-wide, so scoping to one changes which endpoint is used. A donation carries a single total with no fund attribution of its own: include `designations.fund` to see which funds a gift was split across, or filter by `fund_id` to answer "how much came into one fund". For totals, set `include_totals` - the response `meta` then carries `received_total_amount_cents` across everything matching the filters, ignoring pagination. Use it rather than paging through results to sum them by hand.
Inputs
batch_idinteger- List the donations in this batch (see giving_batches). Pass at most one of person_id, batch_id, or campus_id.
campus_idinteger- List the donations credited to this campus (see people_church_campuses). Pass at most one of person_id, batch_id, or campus_id.
created_at_endstring- Latest created at to include (inclusive), as YYYY-MM-DD.
created_at_startstring- Earliest created at to include (inclusive), as YYYY-MM-DD. Pair with created_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
filterstring- Limit to `succeeded` donations - gifts that actually settled. Can't be combined with person_id, batch_id, or campus_id.one of
succeeded fund_idinteger- Only donations designated to this fund (see giving_funds). Can't be combined with include_totals.
includearray- Specify which relationships to include in the response. Include `designations.fund` to see which funds a gift was split across. `note` requires permission to manage donation notes in Giving, and is silently absent otherwise.
include_totalsboolean- Add `received_total_amount_cents` to the response meta - the total received across every donation matching the filters, excluding refunded and failed gifts. Can't be combined with fund_id.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
received_at-received_atcreated_at-created_atupdated_at-updated_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
payment_methodstring- Only donations paid this way.one of
achcashcheckcard per_pageinteger- Maximum number of results to returndefault
10 person_idinteger- List the donations this person has given (see people_search). Pass at most one of person_id, batch_id, or campus_id.
received_at_endstring- Latest received at to include (inclusive), as YYYY-MM-DD.
received_at_startstring- Earliest received at to include (inclusive), as YYYY-MM-DD. Pair with received_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
updated_at_endstring- Latest updated at to include (inclusive), as YYYY-MM-DD.
updated_at_startstring- Earliest updated at to include (inclusive), as YYYY-MM-DD. Pair with updated_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
planningcentermcp_giving_donorsPer-donor giving totals in Planning Center Giving.Read-onlyGivingDonors
Per-donor giving totals in Planning Center Giving. Each row is one person who gave inside a date range, with their total, how many donations it came from, and when they first ever gave. Set `received_at_start` and `received_at_end` to the window you mean. The applied window isn't echoed back, so name the range you used. There is no combined household row. Each person in a couple is their own row with their own total, so a couple's combined giving means fetching both and adding `total_received_donation_amount_cents` yourself. Read `total_received_donation_amount_cents` with `total_received_donation_amount_currency`; it is in that currency's minor units. `donation_count` includes refunded and failed donations while the total counts only what was received, so the two don't divide into an average gift. `first_donated` is the lifetime first gift, not the first inside the range, and can be null even for someone with donations — a missing value doesn't mean they never gave. Rows carry no `links.html`, so don't promise a donor a page or construct a URL for one. For what someone committed to give rather than what they gave, use giving_pledges.
Inputs
campus_idinteger- Count only donations made at this campus. Takes a Planning Center campus id (see people_church_campuses); an id that matches no campus returns an error rather than being ignored.
filterarray- Restrict to donors who give as part of a joint giving unit — a couple giving together.
includearray- Specify which relationships to include in the response.
order_bystring- Sort results by field. Use '-' prefix for descending order. Sorting by `name` orders by last name, not by the full name shown in the `name` field.one of
name-nametotal_received_donation_amount_cents-total_received_donation_amount_centsdonation_count-donation_countfirst_donated-first_donated output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 person_idinteger- Return only this person's row. Use a person id from people_search — it is also the `id` on each row returned here.
received_at_endstring- Latest received at to include (inclusive), as YYYY-MM-DD. If neither received_at_start nor received_at_end is given, the API falls back to the last 30 days.
received_at_startstring- Earliest received at to include (inclusive), as YYYY-MM-DD. Pair with received_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range. If neither received_at_start nor received_at_end is given, the API falls back to the last 30 days.
planningcentermcp_giving_fundsList the giving funds configured for the organization.Read-onlyGivingFunds
List the giving funds configured for the organization. Funds track the intent of a donation (e.g. "General", "Building", "Missions") and let donors allocate gifts to a specific cause. Use `default: true` to find the organization's default fund.
Inputs
defaultboolean- Filter by whether the fund is the organization's default.
idsarray- Specific fund IDs to retrieve.
namestring- Filter funds by name. Substring match, partial names work.
output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 visibilitystring- Filter by how the fund is visible on Church Center. `everywhere`: anyone can donate; `admin_only`: hidden from donors, permitted Giving users only; `nowhere`: no new donations, retained in historical reports; `hidden`: hidden from the default donation form but reachable via direct link or Text-to-Give.one of
everywhereadmin_onlynowherehidden
planningcentermcp_giving_payment_sourcesList the payment sources configured for the organization.Read-onlyGivingPaymentSources
List the payment sources configured for the organization. A payment source is the platform a donation originated from — donations made through Giving carry the built-in "Planning Center" source, while donations imported from an external platform (Stripe, Pushpay, Tithe.ly, etc.) carry a source identifying that platform. This is organization-level configuration only and returns no donor or donation data. `status` is either `active` or `archived`. Archived sources can't be assigned to new donations, but their historical donations are retained. One exception: the built-in "Planning Center" source returns `status` as the number `0` (meaning active) and returns no `created_at`/`updated_at` — treat it as always-active and always-present rather than filtering on those fields. `payment_source_type` is only returned by organizations that have that feature enabled, so it may be absent from results. In practice organizations have a handful of sources. The endpoint offers no filters or sorting, so narrow the results yourself after fetching. `giving_donations` can't filter by payment source, but each donation carries its `payment_source` relationship — to split totals by source, group the donations by that id and match it against the sources here.
Inputs
output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10
planningcentermcp_giving_pledge_campaignsList pledge campaigns in Planning Center Giving — long-term commitment drives toward a goal (a building campaign, a missions push).Read-onlyGivingPledgeCampaigns
List pledge campaigns in Planning Center Giving — long-term commitment drives toward a goal (a building campaign, a missions push). Each campaign carries its `goal_cents` target and two running totals: `received_total_from_pledges_cents` (gifts that closed against a pledge) and `received_total_outside_of_pledges_cents` (gifts to the same fund with no pledge behind them). Reach for this for campaign-level progress questions like "how are we tracking against the building campaign goal?" Each campaign belongs to a fund. Filter by `fund_id` to find every campaign supporting a specific fund (look the fund up with giving_funds first), or include `fund` to see its name alongside each campaign. This tool returns campaign-level aggregates only — for the individual pledges behind a campaign, use giving_pledges. There is no "active" filter, so compose one from the date bounds — and set **both** together, not just one. A campaign is active when it has started and has not yet ended, so send `starts_at_end` = today (started on or before today) **and** `ends_at_start` = today (ends on or after today) in the same call. Sending only one bound returns campaigns that may already be over or not yet started, not active ones. To surface the campaigns wrapping up soonest, sort by `ends_at` ascending with no date bounds — that is a separate question from "active", so don't add the date filters unless the user asked only for active campaigns.
Inputs
ends_at_endstring- Latest ends at to include (inclusive), as YYYY-MM-DD.
ends_at_startstring- Earliest ends at to include (inclusive), as YYYY-MM-DD. Pair with ends_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
fund_idinteger- Only return campaigns supporting this fund. Look the fund up with giving_funds first.
includearray- Specify which relationships to include in the response.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
starts_at-starts_atends_at-ends_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 starts_at_endstring- Latest starts at to include (inclusive), as YYYY-MM-DD.
starts_at_startstring- Earliest starts at to include (inclusive), as YYYY-MM-DD. Pair with starts_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
planningcentermcp_giving_pledgesLook up pledges in Planning Center Giving - a person's commitment to give a set amount toward a pledge campaign, alongside how much they have actually donated against that commitment so far.Read-onlyGivingPledges
Look up pledges in Planning Center Giving - a person's commitment to give a set amount toward a pledge campaign, alongside how much they have actually donated against that commitment so far. Provide exactly one of `person_id` (the pledges one person has made) or `pledge_campaign_id` (everyone who pledged to one campaign). Each pledge carries `amount_cents` (the amount committed) and `donated_total_cents` (the amount delivered so far). To find donors who are behind on their commitments, compare those two fields on the returned records - there is no server-side filter for it, so the arithmetic has to be done here. When the pledger belongs to a joint giving unit - the "and Jane" half of "John and Jane pledged $5,000" - `joint_giver_amount_cents` and `joint_giver_donated_total_cents` carry that second person's amounts; both are 0 otherwise. Include `joint_giver` to see who they are.
Inputs
includearray- Specify which relationships to include in the response.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
created_at-created_atupdated_at-updated_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 person_idinteger- List the pledges this person has made (see people_search). Provide either this or pledge_campaign_id, not both.
pledge_campaign_idinteger- List the pledges made toward this campaign (see giving_pledge_campaigns). Provide either this or person_id, not both.
planningcentermcp_giving_recurring_donationsLook up recurring donations in Planning Center Giving - a donor's scheduled, repeating gift (weekly, monthly, etc.), including the amount, the schedule, when the last gift came in, and when the next one is due.Read-onlyGivingRecurringDonations
Look up recurring donations in Planning Center Giving - a donor's scheduled, repeating gift (weekly, monthly, etc.), including the amount, the schedule, when the last gift came in, and when the next one is due. Recurring donations are read-only. Reach for this for questions about scheduled future giving ("who gives monthly?", "whose recurring gift is paused?", "what is this person's recurring gift?"). For gifts that have actually been received, use giving_donations instead. `status` is `active`, `indefinite_hold` (paused with no end date), or `temporary_hold` (paused until `release_hold_at`). Include `designations` to see how a recurring gift is split across funds. Each designation carries its fund as a relationship id, so use giving_funds to get fund names. The donor is likewise returned as a person id - use people_search to resolve names. `amount_cents` on the gift is its total across every fund it is split between, so it does not answer how much goes to one fund. For that, include `designations` and read the amount on the designation whose `fund` is the one in question.
Inputs
fund_idinteger- Only return recurring donations that designate part of the gift to this fund (see giving_funds). Matching gifts may be split across other funds too, so to report the amount going to this fund, include `designations` and read the amount on the designation for it rather than the gift's `amount_cents`.
includearray- Specify which relationships to include in the response.
output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 person_idinteger- List the recurring donations set up by this person (see people_search). Omit to list them across the whole organization.
statusstring- Filter by whether the recurring donation is running or paused. `active` is giving on schedule. `indefinite_hold` is paused with no end date. `temporary_hold` is paused until `release_hold_at`.one of
activeindefinite_holdtemporary_hold
planningcentermcp_giving_refundsGet the refund on a single donation in Planning Center Giving - the amount refunded, the payment processing fee returned, and when the refund was processed.Read-onlyGivingRefunds
Get the refund on a single donation in Planning Center Giving - the amount refunded, the payment processing fee returned, and when the refund was processed. A donation has at most one refund. Requires a donation ID, so reach for this when a specific donation is already in hand and the question needs the refund record's own fields (the refund fee, the exact time the refund was processed). For aggregate questions like "how much did we refund last month?", use giving_donations to find refunded donations instead. A not-found result means the donation has no refund, the donation ID is invalid, or you don't have permission to manage donations in Giving (administrator or bookkeeper).
Inputs
donation_idintegerrequired- Get the refund on this donation (see giving_donations).
includearray- Specify which relationships to include in the response.
output_fieldsarray- Specify which fields to include in the response.
planningcentermcp_groups_event_attendancesLook up individual attendance records for a single event in Planning Center Groups - whether each person attended and their role (member, leader, visitor, or applicant) at the time of the event.Read-onlyGroupsEventAttendances
Look up individual attendance records for a single event in Planning Center Groups - whether each person attended and their role (member, leader, visitor, or applicant) at the time of the event.
Inputs
event_idintegerrequired- The ID of the event to look up attendance records for.
filterstring- Filter attendance records. Use 'attended' to return only people who attended.one of
attended includearray- Related resources to include in the response.
order_bystring- Field to order results by. Prefix with '-' for descending order.one of
role-role output_fieldsarray- List of fields to include in the response.
page_afterstring- Cursor for pagination. Use the value returned in the previous response to get the next page.
per_pageinteger- Number of results to return per page (1-100, default 10).
rolestring- Filter attendance records by the role of the attendee.one of
memberleadervisitorapplicant
planningcentermcp_groups_eventsSearch events in Planning Center Groups.Read-onlyGroupsEvents
Search events in Planning Center Groups. An event is a single meeting of a group with a start and end time, an optional location, and a cancellation status. By default searches events across every group. Provide group_id or person_id to list events for a specific group or person.
Inputs
campus_idsarray- Filter events by the campuses their groups belong to. (ignored when group_id or person_id is set).
ends_at_endstring- Latest ends at to include (inclusive), as YYYY-MM-DD.
ends_at_startstring- Earliest ends at to include (inclusive), as YYYY-MM-DD. Pair with ends_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
filterstring- Limit to canceled or not-canceled events.one of
cancelednot_canceled group_idinteger- List events for this single group. Provide either this or person_id, not both.
group_type_idsarray- Filter events by their group type IDs. (ignored when group_id or person_id is set).
includearray- Specify which relationships to include in the response.
namestring- Filter events by name. Matches exactly unless you include a '%' wildcard for partial matches.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
name-namestarts_at-starts_atends_at-ends_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 person_idinteger- List events across all groups a person belongs to. Provide either this or group_id, not both.
starts_at_endstring- Latest starts at to include (inclusive), as YYYY-MM-DD.
starts_at_startstring- Earliest starts at to include (inclusive), as YYYY-MM-DD. Pair with starts_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
planningcentermcp_groups_group_typesList or fetch group type categories (e.g.Read-onlyGroupsGroupTypes
List or fetch group type categories (e.g. "Small Groups", "Classes") from Planning Center Groups. Group types define the default settings, visibility, and color theme for the groups within them.
Inputs
idinteger- Filter to a specific group type by its ID.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
name-nameposition-position output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10
planningcentermcp_groups_membershipsLook up group memberships in Planning Center Groups - the association of a person to a group, with the member's role and the date they joined.Read-onlyGroupsMemberships
Look up group memberships in Planning Center Groups - the association of a person to a group, with the member's role and the date they joined. Provide exactly one of group_id (to list a group's members) or person_id (to list the groups a person belongs to).
Inputs
group_idinteger- List the members of this group (see groups_search). Provide either this or person_id, not both.
includearray- Specify which relationships to include in the response.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
joined_at-joined_atrole-role output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 person_idinteger- List the groups this person belongs to (see people_search). Provide either this or group_id, not both.
rolestring- Filter members by their role in the group.one of
memberleader
planningcentermcp_groups_searchSearch for groups.Read-onlyGroupsSearch
Search for groups. Groups are collections of people that meet together regularly (small groups, classes, Bible studies, etc.). Returns details like name, description, schedule, contact email, and membership count.
Inputs
archive_statusstring- Whether to include archived groups. Defaults to only active (not archived) groups.one of
not_archivedonlyinclude campus_idsarray- Filter groups by the campuses they belong to
enrollment_statusarray- Filter groups by enrollment/sign-up status
filterstring- Limit results to a predefined set. 'my_groups' returns only groups the current user belongs to.one of
my_groups group_type_idsarray- Filter groups by their group type IDs (see groups_group_types)
idsarray- Filter to specific group IDs
includearray- Specify which relationships to include in the response.
namestring- Filter groups by name (partial match)
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
name-namecreated_at-created_atmemberships_count-memberships_countcontact_email-contact_emailchat_enabled-chat_enabledlisted-listedmembers_are_confidential-members_are_confidential output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10
planningcentermcp_people_background_checksSearch for background checks.Read-onlyPeopleBackgroundChecks
Search for background checks. Optionally filter by a specific person using person_id. Current denotes the background check that best represents a person's current standing.
Inputs
expires_on_endstring- Latest expires on to include (inclusive), as YYYY-MM-DD.
expires_on_startstring- Earliest expires on to include (inclusive), as YYYY-MM-DD. Pair with expires_on_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
filterarray- Filter background checks. Multiple filters can be combined.
includearray- Specify which relationships to include in the response.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
expires_on-expires_onstatus_updated_at-status_updated_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 person_idinteger- The person ID to retrieve background checks for.
status_updated_at_endstring- Latest status updated at to include (inclusive), as YYYY-MM-DD.
status_updated_at_startstring- Earliest status updated at to include (inclusive), as YYYY-MM-DD. Pair with status_updated_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
planningcentermcp_people_church_campusesList the church campuses (physical sites) configured for the organization.Read-onlyPeopleChurchCampuses
List the church campuses (physical sites) configured for the organization. The returned campus IDs are what campus_id/campus_ids filters on other tools expect.
Inputs
created_at_endstring- Latest created at to include (inclusive), as YYYY-MM-DD.
created_at_startstring- Earliest created at to include (inclusive), as YYYY-MM-DD. Pair with created_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
idsarray- Specific campus IDs to retrieve
includearray- Specify which relationships to include in the response.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
name-namecreated_at-created_atupdated_at-updated_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 updated_at_endstring- Latest updated at to include (inclusive), as YYYY-MM-DD.
updated_at_startstring- Earliest updated at to include (inclusive), as YYYY-MM-DD. Pair with updated_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
planningcentermcp_people_current_organizationGet information about the authenticated user's organization.Read-onlyPeopleCurrentOrganization
Get information about the authenticated user's organization.
Inputs
output_fieldsarray- List of fields to include in the response (e.g. name, avatar_url, church_center_subdomain, country_code, time_zone, date_format, created_at).
planningcentermcp_people_field_dataSearch custom field data — the actual values of custom fields on people's profiles.Read-onlyPeopleFieldData
Search custom field data — the actual values of custom fields on people's profiles. Each field datum is tied to a field definition, which belongs to a custom tab. Use this to look up the values of custom fields for people.
Inputs
field_definition_idinteger- Filter by field definition ID. Use `people_field_definitions` tool to find IDs.
file_content_typestring- Filter by file content type (for file-type fields)
file_namestring- Filter by file name (for file-type fields)
file_sizeinteger- Filter by file size (for file-type fields)
includearray- Specify which relationships to include in the response.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
file-filefile_content_type-file_content_typefile_name-file_namefile_size-file_sizevalue-value output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 person_idinteger- Filter by person ID to get field data for a specific person
valuestring- Filter by field value. Matches exactly unless you include a '%' wildcard for partial matches.
planningcentermcp_people_field_definitionsSearch the custom field definitions configured for the organization.Read-onlyPeopleFieldDefinitions
Search the custom field definitions configured for the organization. A field definition represents a custom field — its name, data type, sequence, and which tab it belongs to. Use this to discover what custom fields exist on people profiles, then read a person's values with people_field_data.
Inputs
data_typestring- Filter field definitions by data type. (string = regular input, text = paragraph)one of
stringtextdatebooleanfileselectcheckboxesnumberheader filterstring- Include deleted field definitions in results. By default, deleted fields are excluded.one of
include_deleted idsarray- Specific field definition IDs to retrieve
includearray- Specify which relationships to include in the response.
namestring- Filter field definitions by name. For partial matches use a '%' at the beginning or end. (e.g. '%phone%' will match 'Home Phone Number')
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
name-namedata_type-data_typesequence-sequenceslug-slugtab_id-tab_id output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 slugstring- Filter field definitions by slug. Matches exactly unless you include a '%' wildcard for partial matches.
tab_idinteger- Filter field definitions by the tab ID they belong to
planningcentermcp_people_form_fieldsSearch the fields that make up a specific people form.Read-onlyPeopleFormFields
Search the fields that make up a specific people form. Each form field describes a single input on the form, including its label, field type, whether it is required, and its display order. Requires a form_id. Use to understand a form's structure before reading submissions.
Inputs
form_idintegerrequired- The ID of the form whose fields should be retrieved. See `people_forms`.
includearray- Specify which relationships to include in the response.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
created_at-created_atsequence-sequenceupdated_at-updated_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10
planningcentermcp_people_form_submissionsSearch for people form submissions.Read-onlyPeopleFormSubmissions
Search for people form submissions. A form submission represents an individual person's response to a specific people form. Use people_form_fields to see the questions.
Inputs
form_idintegerrequired- Filter people form submissions by the form ID they are associated with
created_at_endstring- Latest created at to include (inclusive), as YYYY-MM-DD.
created_at_startstring- Earliest created at to include (inclusive), as YYYY-MM-DD. Pair with created_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
includearray- Specify which relationships to include in the response.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
created_at-created_atupdated_at-updated_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 person_idsarray- Filter people form submissions by the person IDs they are associated with
updated_at_endstring- Latest updated at to include (inclusive), as YYYY-MM-DD.
updated_at_startstring- Earliest updated at to include (inclusive), as YYYY-MM-DD. Pair with updated_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
planningcentermcp_people_formsSearch for people forms.Read-onlyPeopleForms
Search for people forms. Forms is a tool for gathering information from people via customizable online forms.
Inputs
campus_idinteger- Filter people forms by campus ID they are associated with
filterstring- Get forms by status.one of
openclosedarchived idsarray- Specific people form IDs to retrieve
includearray- Specify which relationships to include in the response.
namestring- Filter people forms by their name. Matches partial names automatically — pass the bare term (e.g. 'Connect'); do not use a '%' wildcard.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
name-namecreated_at-created_atupdated_at-updated_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10
planningcentermcp_people_householdsSearch households — groups of people who live together (typically a family), each with a primary contact.Read-onlyPeopleHouseholds
Search households — groups of people who live together (typically a family), each with a primary contact. Filter by household or primary-contact name.
Inputs
created_at_endstring- Latest created at to include (inclusive), as YYYY-MM-DD.
created_at_startstring- Earliest created at to include (inclusive), as YYYY-MM-DD. Pair with created_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
includearray- Specify which relationships to include in the response.
namestring- Filter households by their name. Matches exactly unless you include a '%' wildcard for partial matches.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
name-namecreated_at-created_atupdated_at-updated_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 primary_contact_namestring- Filter households by primary contact's name. Matches exactly unless you include a '%' wildcard for partial matches.
updated_at_endstring- Latest updated at to include (inclusive), as YYYY-MM-DD.
updated_at_startstring- Earliest updated at to include (inclusive), as YYYY-MM-DD. Pair with updated_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
planningcentermcp_people_list_resultsRetrieves the people that appear in a specific Planning Center People list.Read-onlyPeopleListResults
Retrieves the people that appear in a specific Planning Center People list. Requires a list_id (find one via people_lists).
Inputs
list_idintegerrequired- The ID of the list to retrieve results for
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
created_at-created_atupdated_at-updated_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 person_idinteger- Filter results to a specific person by their ID
planningcentermcp_people_listsSearch for people lists.Read-onlyPeopleLists
Search for people lists. A list is a powerful tool for finding and grouping people together. To get the people in a list, use people_list_results.
Inputs
campus_idinteger- Filter people lists by campus ID they are associated with
created_at_endstring- Latest created at to include (inclusive), as YYYY-MM-DD.
created_at_startstring- Earliest created at to include (inclusive), as YYYY-MM-DD. Pair with created_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
idsarray- Specific people list IDs to retrieve
includearray- Specify which relationships to include in the response.
namestring- Filter people lists by their name. For partial matches use a '%' at the beginning or end. (e.g. '%members' will match 'New Members')
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
name-namecreated_at-created_atupdated_at-updated_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 updated_at_endstring- Latest updated at to include (inclusive), as YYYY-MM-DD.
updated_at_startstring- Earliest updated at to include (inclusive), as YYYY-MM-DD. Pair with updated_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
planningcentermcp_people_note_categoriesSearch note categories in Planning Center People.Read-onlyPeopleNoteCategories
Search note categories in Planning Center People. Note categories organize and classify notes on people profiles.
Inputs
includearray- Specify which relationships to include in the response.
namestring- Filter note categories by name. For partial matches use a '%' at the beginning or end. (e.g. '%pastoral' will match 'Pastoral Care')
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
name-namecreated_at-created_atupdated_at-updated_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10
planningcentermcp_people_notesSearch for notes attached to people's profiles.Read-onlyPeopleNotes
Search for notes attached to people's profiles. A note is text with a category connected to a person's profile.
Inputs
includearray- Specify which relationships to include in the response.
notestring- Filter notes by content text. Supports partial matches without `%`.
note_category_idinteger- Filter notes by note category ID
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
created_at-created_atdisplay_date-display_datenote-notenote_category_id-note_category_idupdated_at-updated_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 person_idinteger- Optional person ID to scope notes to a specific person.
planningcentermcp_people_searchSearch for people by name, contact info, status, campus, membership, and more.Read-onlyPeopleSearch
Search for people by name, contact info, status, campus, membership, and more.
Inputs
age_typestring- Filter people by age groupone of
childadult campus_idsarray- Filter people by campus IDs they are associated with
created_at_endstring- Latest created at to include (inclusive), as YYYY-MM-DD.
created_at_startstring- Earliest created at to include (inclusive), as YYYY-MM-DD. Pair with created_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
emailstring- Filter people by email address. Matches exactly unless you include a '%' wildcard (e.g. '%@example.com').
first_namestring- Filter people by first name. Matches exactly unless you include a '%' wildcard (e.g. 'Jo%' for names starting with Jo, '%nath%' for a substring).
genderstring- Filter people by genderone of
MaleFemaleUnspecified gradeinteger- Filter people by school grade as an integer (e.g. PreK = -1, 1st = 1)
idsarray- Specific person IDs to retrieve
inactivated_at_endstring- Latest inactivated at to include (inclusive), as YYYY-MM-DD.
inactivated_at_startstring- Earliest inactivated at to include (inclusive), as YYYY-MM-DD. Pair with inactivated_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
includearray- Specify which relationships to include in the response.
last_namestring- Filter people by last name. Matches exactly unless you include a '%' wildcard (e.g. 'Sm%', '%ith').
membership_typestring- Filter people by membership status (e.g. Member, Regular Attender, Visitor). Matches the full value exactly; partial matches and '%' wildcards are not supported.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
last_name-last_namecreated_at-created_atupdated_at-updated_atinactivated_at-inactivated_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 phone_numberstring- Filter people by phone number; matches partial digit sequences automatically. For international numbers, use E.164 format with a leading '+' (e.g., +15551234567).
statusstring- Filter people by status. Omitting it returns both active and inactive people; pass `active` to count the people in the church.one of
activeinactive updated_at_endstring- Latest updated at to include (inclusive), as YYYY-MM-DD.
updated_at_startstring- Earliest updated at to include (inclusive), as YYYY-MM-DD. Pair with updated_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
planningcentermcp_people_tabsSearch people custom tabs.Read-onlyPeopleTabs
Search people custom tabs. A tab groups field definitions on the profile (e.g., 'Volunteer Info', 'Church Info'). Tabs contain field definitions which describe the custom fields whose per-person values come from people_field_data.
Inputs
idsarray- Specific tab IDs to retrieve
namestring- Filter tabs by name. Matches exactly unless you include a '%' wildcard for partial matches (e.g. '%Info').
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
name-namesequence-sequenceslug-slug output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 slugstring- Filter tabs by slug. Matches exactly unless you include a '%' wildcard for partial matches.
planningcentermcp_people_workflow_cardsSearch people workflow cards.Read-onlyPeopleWorkflowCards
Search people workflow cards. Cards are workflow steps assigned to a staff member to perform for a specific person. Requires a workflow_id (find one via people_workflows).
Inputs
workflow_idintegerrequired- Cards for specified workflow to retrieve
after_moved_to_step_atstring- Return cards moved to current step on or after this date.
assignee_idsarray- Filter cards by assignee person IDs.
includearray- Specify which relationships to include in the response.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
moved_to_step_at-moved_to_step_at output_fieldsarray- Specify which fields to include in the response.
overdueboolean- Filter for overdue cards. NOTE: Only supports true.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 stagestring- Filter cards by stage.one of
readysnoozedcompletedremoved step_idsarray- Filter cards by workflow step IDs.
planningcentermcp_people_workflow_categoriesSearch the categories that organize people workflows.Read-onlyPeopleWorkflowCategories
Search the categories that organize people workflows. Use this to find a category by name; then filter people_workflows by its workflow_category_id.
Inputs
idsarray- Specific workflow categories to retrieve
namestring- Filter workflow categories by their name. Matches partial values automatically; no wildcard needed.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
name-namecreated_at-created_atupdated_at-updated_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10
planningcentermcp_people_workflowsSearch for people workflows.Read-onlyPeopleWorkflows
Search for people workflows. A workflow consists of a series of steps to complete a specific task. Steps consist of cards assigned to a staff member for a specific person. Use people_workflow_cards for per-person cards, and people_workflow_categories for categories.
Inputs
campus_idinteger- Filter people workflows by campus ID they are associated with
created_at_endstring- Latest created at to include (inclusive), as YYYY-MM-DD.
created_at_startstring- Earliest created at to include (inclusive), as YYYY-MM-DD. Pair with created_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
filterarray- Filter workflows. Use one value: `not_archived` for active workflows, or `has_my_cards` for workflows with a card assigned to me (already active). Don't combine them — `has_my_cards` already excludes archived workflows, so combining adds nothing.
idsarray- Specific people workflow IDs to retrieve
includearray- Specify which relationships to include in the response.
namestring- Filter people workflow by their name. Matches partial values automatically; no wildcard needed.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
name-namecreated_at-created_atupdated_at-updated_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 updated_at_endstring- Latest updated at to include (inclusive), as YYYY-MM-DD.
updated_at_startstring- Earliest updated at to include (inclusive), as YYYY-MM-DD. Pair with updated_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
workflow_category_idinteger- Filter people workflows by their category
planningcentermcp_publishing_channelsSearch sermon channels in Planning Center Publishing.Read-onlyPublishingChannels
Search sermon channels in Planning Center Publishing. A "channel" is a top-level content grouping for sermons (e.g. "Sunday Morning", "Wednesday Bible Study"). Each channel carries its own feature flags (enable_audio, enable_on_demand_video, enable_watch_live, general_chat_enabled/group_chat_enabled, sermon_notes_enabled, podcast configuration) and a lifecycle pair (published, archived). This is the foundational Publishing tool. `publishing_episode_statistics` requires a channel id from here. `publishing_episodes` and `publishing_series` can't filter by channel — request their `channel` include and group by it client-side. For lifecycle questions ("is this channel published or archived?", "show me archived channels") use the `filter` param (archived, not_archived, published, podcast_enabled) rather than fetching every channel and inspecting the published/archived attributes yourself — the filter dispatches server-side. Pass multiple values to combine scopes, e.g. `["published", "podcast_enabled"]` for published channels with podcasting enabled. A channel's `services_service_type_remote_identifier` links it to a Planning Center Services service type. To answer "which channel is paired with our Sunday 9am service type?", call `services_service_types` first to find that service type's id, then match it against a channel's `services_service_type_remote_identifier` here. `general_chat_enabled`/`group_chat_enabled` read `false` both when chat is off and when the org lacks a Groups subscription; check `can_enable_chat` to tell those two cases apart.
Inputs
filterarray- Limit channels to one or more lifecycle or feature scopes: "archived", "not_archived", "published", "podcast_enabled". Pass multiple values to combine them. Omit to include all.
namestring- Filter channels by name (partial match).
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
name-nameposition-position output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10
planningcentermcp_publishing_episode_statisticsChurch Center viewership statistics for the episodes in a single Publishing channel.Read-onlyPublishingEpisodeStatistics
Church Center viewership statistics for the episodes in a single Publishing channel. Returns one entry per episode with its Church Center live watch count (live_watch_count), library watch count (library_watch_count), and a per-EpisodeTime breakdown (times, each carrying its own watch_count). Counts are Church Center plays only. Views on YouTube, Vimeo, Facebook, or other external platforms are NOT included — this mirrors the per-episode statistics panel the Publishing admin sees. This tool takes a channel_id. First call `publishing_channels` to pick the relevant channel (typically the main Sunday channel), then call this tool with that channel's id. Answer questions like "most-watched episodes this month" or "average listen count per episode" by fetching a channel's statistics and aggregating client-side — do NOT fan out per episode. Aggregates cover only the episodes you have fetched, so set `per_page` to 100 and keep paging with `page_after` until `has_more` is false before summarizing. Use `type` and the after/before date range to narrow server-side: `type: "live"` bounds by when episodes were published live, `type: "library"` bounds by when they were added to the library, and omitting `type` returns episodes matching either. `after` is an inclusive lower bound (includes the whole named day). `before` is an exclusive upper bound: it cuts off at the start of the named day, so episodes published on the `before` date itself are NOT included. Both are YYYY-MM-DD.
Inputs
channel_idstringrequired- ID of the channel whose episode statistics to return. Get channel ids from `publishing_channels`.
afterstring- Earliest publish date to include, as YYYY-MM-DD. Inclusive — the whole named day is included. Applies to the column selected by `type`.
beforestring- Upper bound on publish date, as YYYY-MM-DD. Exclusive — episodes published on this date are NOT included (the bound is the start of the named day). Applies to the column selected by `type`.
output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 typestring- Restrict to episodes published live ("live", bounds by published_live_at) or added to the library ("library", bounds by published_to_library_at). Omit to include episodes matching either.one of
livelibrary
planningcentermcp_publishing_episodesSearch episodes in Planning Center Publishing.Read-onlyPublishingEpisodes
Search episodes in Planning Center Publishing. An episode is a single sermon — it carries title, description, art, audio/video URLs (both live-stream and on-demand library), and publication timestamps (`published_live_at`, `published_to_library_at`). Use `search` to find sermons by topic, book, or passage (e.g. "sermons on Romans") — it matches against the episode's title only (not description, and not speaker or preacher name). Use `church_center_url` for a link to the episode on Church Center. `page_actions` is intentionally not exposed — two of its three actions are admin-write actions (remove from series, edit); `church_center_url` covers the one navigation action. Cross-product chaining: an episode carries `services_plan_remote_identifier` (the Services Plan that was live for this sermon) and `services_service_type_remote_identifier` (the Services Service Type its channel is paired with) — resolve a plan or service type id from `services_plans` / `services_service_types` first, then pass it here (e.g. "last Sunday's sermon" resolves by first finding the Sunday-service plan, then matching its id here). Filter by `series_id` to get all episodes in a sermon series — resolve the series by name with `publishing_series` first, then pass its id here. Filter by speaker with `speaker_id` and `speaker_type` together — both are required (a speaker id alone is ambiguous because a Person and a Guest can share the same id). Resolve them from `publishing_speakers` first, which returns each speaker's `id` and `speaker_type`, then pass both here. For a prompt naming both a speaker and a topic (e.g. "Find Pastor John's sermons on Romans"), resolve the speaker via `publishing_speakers`, then call this tool with the speaker pair plus `search` on the topic (`{"speaker_id": "...", "speaker_type": "Person", "search": "Romans"}`). To surface the most recent sermons, pair `order_by: -published_live_at` with `filter: published_live`. Without the filter, episodes that never went live or are only scheduled can sort above the genuinely most-recent sermons. Only add the filter when the user wants sermons that have already aired; omit it to sort across all episodes.
Inputs
filterstring- Limit episodes to a lifecycle or connection scope: "published_live", "connected_to_services", or "published_on_church_center". These are lifecycle states, not date ranges — "published_live" means the episode has gone live at some point, not that it went live within any specific period. Omit to include all.one of
published_liveconnected_to_servicespublished_on_church_center includearray- Specify which relationships to include in the response.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
title-titlestream_type-stream_typepublished_live_at-published_live_atpublished_to_library_at-published_to_library_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 searchstring- Filter episodes by title (partial match). Does not match against the episode description.
series_idstring- Filter to episodes in a specific series. Chain from `publishing_series` — resolve the series id there, then pass it here.
services_plan_remote_identifierstring- Filter to the episode linked to a specific Services plan. Chain from `services_plans` — resolve the plan id there, then pass it here.
services_service_type_remote_identifierstring- Filter to episodes whose channel is paired with a specific Services service type. Chain from `services_service_types`.
speaker_idstring- Filter to episodes by a specific speaker. Must be sent together with `speaker_type` (a speaker id alone is ambiguous). Chain from `publishing_speakers` — resolve the speaker's `id` there, then pass it here along with its `speaker_type`.
speaker_typestring- The speaker's type, from `publishing_speakers`. Required whenever `speaker_id` is set; sending one without the other returns an error.one of
PersonGuest
planningcentermcp_publishing_seriesSearch sermon series in Planning Center Publishing.Read-onlyPublishingSeries
Search sermon series in Planning Center Publishing. A "series" is a collection of episodes organized around a theme (e.g. "Romans", "Easter", "Advent"), scoped to a single channel. Each series carries a title, description, art, the run window (started_at / ended_at), an episodes_count, and a published lifecycle flag. Use this tool for questions about series metadata: "what's the current sermon series?", "how many episodes are in the Romans series?", "show me all the series we've done this year". Filter by title with the `title` param (partial match on the series title). For lifecycle questions use the `filter` param ("published", "not_published", "published_on_church_center") rather than fetching every series and inspecting the published attribute yourself — the filter dispatches server-side. Pass multiple values to combine scopes. To find the *current* series, request filter=["published"] with order_by="-started_at", then pick the most recent series whose window covers today (started_at on or before today, and ended_at empty or on/after today) — there is no server-side "current" filter. To list the episodes within a series, resolve the series id here first, then pass it to `publishing_episodes` as `series_id`.
Inputs
filterarray- Limit series to one or more scopes: "published", "not_published", "published_on_church_center". Pass multiple values to combine them. Omit to include all.
includearray- Specify which relationships to include in the response.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
title-titleepisodes_count-episodes_countstarted_at-started_atended_at-ended_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 titlestring- Filter series by title (partial match).
planningcentermcp_publishing_speakersSearch speakers in Planning Center Publishing.Read-onlyPublishingSpeakers
Search speakers in Planning Center Publishing. A "speaker" is a unified abstraction over two underlying record types, distinguished by `speaker_type`: `"Person"` (a PCO People record) or `"Guest"` (an ad-hoc record for external speakers with no People record). Use the `search` param to filter by name (matches first_name or last_name, partial match) — this resolves name-based prompts directly, e.g. "has Pastor John preached recently?" → `search: "John"`. For sermon-content questions about a specific speaker, resolve the speaker's `id` and `speaker_type` here first, then chain both into `publishing_episodes`'s `speaker_id` and `speaker_type` filters (both are required together) to find their sermons. For `"Person"` speakers, `id` is the same People account-center id `people_search` returns, so you can alternatively resolve via `people_search` first and match the account-center id against a speaker here. `"Guest"` speakers only exist in Publishing — they have no People record, so `people_search` will never find them, and the response has no `links.html` for them (Person speakers do have one, pointing at the People record). Requires Publishing administrator access; other org members will get a permission error.
Inputs
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
first_name-first_name output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 searchstring- Filter speakers by name (matches first_name or last_name, partial match).
planningcentermcp_registrations_attendeesSearch the attendees registered for a specific Planning Center signup.Read-onlyRegistrationsAttendees
Search the attendees registered for a specific Planning Center signup. An attendee is a person registered for a signup, with status flags for whether they are active, canceled, complete, or waitlisted. Requires a signup_id.
Inputs
signup_idintegerrequired- The ID of the signup to retrieve attendees for
filterstring- Limit to active, waitlisted, or canceled attendees.one of
activewaitlistcanceled includearray- Specify which relationships to include in the response. Include selection_type to see which registration option an attendee chose and its price.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
created_at-created_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 person_idinteger- Limit attendees to a specific person (see people_search).
registration_idinteger- Limit attendees to a single registration (see registrations_registrations).
planningcentermcp_registrations_registrationsSearch registrations for a specific signup.Read-onlyRegistrationsRegistrations
Search registrations for a specific signup. A registration is a single submission to a signup. Requires a signup_id.
Inputs
signup_idintegerrequired- The signup whose registrations to retrieve
includearray- Specify which relationships to include in the response. Include 'registrant_contact' to get the person responsible for the registration. This is the registrant's identity even for simple signups, where individual attendees are not linked to person records.
output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10
planningcentermcp_registrations_signupsSearch signups.Read-onlyRegistrationsSignups
Search signups. A signup is an ongoing program, opportunity, or event that people can register for.
Inputs
campus_idinteger- Filter signups by the campus they are associated with
category_idinteger- Filter by category. Categories say what kind of event a signup is (names don't); find IDs by including `categories`.
filterstring- Limit to archived or unarchived signups. Omit to return both; past events are often archived.one of
archivedunarchived idsarray- Specific signup IDs to retrieve
includearray- Specify which relationships to include in the response. `categories` for what kind of event a signup is; `signup_times` for when it happens (`open_at`/`close_at` are the registration window, not the event dates).
output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10
planningcentermcp_services_blockoutsSearch the blockout dates for a specific person.Read-onlyServicesBlockouts
Search the blockout dates for a specific person. A blockout is a date or recurring date range when a person is unavailable to be scheduled to serve (e.g. vacation). Requires a person_id.
Inputs
person_idintegerrequired- The ID of the person whose blockouts to retrieve.
filterarray- Use ["future"] to return only upcoming blockouts (one-time blockouts that have not yet ended and ongoing recurring blockouts), excluding ones fully in the past.
group_identifierstring- Filter blockouts to a specific recurrence group by its group_identifier.
output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10
planningcentermcp_services_plan_itemsSearch the items (the order of service) within a specific plan in Planning Center Services.Read-onlyServicesPlanItems
Search the items (the order of service) within a specific plan in Planning Center Services. Each item is one element in a plan's sequence — a song, header, media, or announcement. Requires a service_type_id and plan_id; items are returned in plan sequence order.
Inputs
plan_idintegerrequired- The ID of the plan whose items to retrieve.
service_type_idintegerrequired- The ID of the service type the plan belongs to.
includearray- Specify which relationships to include in the response.
output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10
planningcentermcp_services_plan_peopleList the people scheduled to serve on a specific plan in Planning Center Services — the plan's roster.Read-onlyServicesPlanPeople
List the people scheduled to serve on a specific plan in Planning Center Services — the plan's roster. Each entry includes the person's name, the team and position they're filling, and their confirmation status. Requires a service_type_id and plan_id. Use filter or read each person's status to narrow by confirmation state.
Inputs
plan_idintegerrequired- The ID of the plan whose roster you want to list.
service_type_idintegerrequired- The ID of the service type that contains the plan.
filterarray- Filter scheduled people by confirmation state.
includearray- Related resources to include in the response.
output_fieldsarray- Limit which fields are returned in the response.
page_afterstring- Pagination cursor from the previous response to fetch the next page.
per_pageinteger- Number of results to return per page (1–100).default
10 team_idinteger- Filter results to a specific team within the plan.
planningcentermcp_services_plansSearch plans within a Planning Center Services service type.Read-onlyServicesPlans
Search plans within a Planning Center Services service type. A plan is a single worship service or event (e.g. "Sunday Morning, June 8") containing its dates, series, item and people counts, and length. Requires a service_type_id. Note: sort_date is the plan's service date; plans are commonly scheduled into the future. To find the most recent service, combine filter "past" with order_by -sort_date.
Inputs
service_type_idintegerrequired- The ID of the service type whose plans to retrieve. Find one via the services_service_types tool.
created_at_endstring- Latest created at to include (inclusive), as YYYY-MM-DD.
created_at_startstring- Earliest created at to include (inclusive), as YYYY-MM-DD. Pair with created_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
filterstring- Limit plans by service date relative to today: "past" (on or before today), "future" (upcoming), or "no_dates" (unscheduled). Omit to include all.one of
pastfutureno_dates includearray- Specify which relationships to include in the response.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
created_at-created_atsort_date-sort_datetitle-titleupdated_at-updated_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 series_titlestring- Filter plans by series title (partial match).
titlestring- Filter plans by title (partial match).
updated_at_endstring- Latest updated at to include (inclusive), as YYYY-MM-DD.
updated_at_startstring- Earliest updated at to include (inclusive), as YYYY-MM-DD. Pair with updated_at_end; set both to the same day to match a single date, or pass just one side for an open-ended range.
planningcentermcp_services_schedulesRetrieve a person's schedule in Planning Center Services — the worship service plans they are scheduled to serve in.Read-onlyServicesSchedules
Retrieve a person's schedule in Planning Center Services — the worship service plans they are scheduled to serve in. Defaults to the authenticated user's own schedule when person_id is omitted. Provide a person_id to look up someone else's schedule.
Inputs
includearray- Specify which relationships to include in the response.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
starts_at-starts_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 person_idinteger- Planning Center person ID whose schedule to retrieve. Omit to return the authenticated user's own schedule.
plan_idinteger- Filter the schedule to a specific plan ID.
planningcentermcp_services_service_typesSearch for service types.Read-onlyServicesServiceTypes
Search for service types. A Service Type is a container for plans, typically a recurring worship event like Sunday AM, Wednesday Service, or Christmas Eve. Service Types group all the plans, teams, schedules, and song lists for that service.
Inputs
idsarray- Specific service type IDs to retrieve
includearray- Specify which relationships to include in the response.
namestring- Filter service types by name. Partial matches are automatic; the API performs a substring match. Send the bare search term without % wildcards.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
name-namesequence-sequence output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
parent_idinteger- Filter service types by parent folder ID. Use to list only the service types inside a specific folder; leave blank to list all.
per_pageinteger- Maximum number of results to returndefault
10
planningcentermcp_services_songsSearch the Planning Center Services song library.Read-onlyServicesSongs
Search the Planning Center Services song library. A song is a reusable piece of music (title, author, CCLI number, copyright, and themes) that can be scheduled into service plans. Use to find songs by title, author, theme, or CCLI number.
Inputs
authorstring- Filter songs by author. Supports partial matches without `%`.
ccli_numberinteger- Filter songs by CCLI number.
hiddenboolean- Filter by whether the song is hidden from the library.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
created_at-created_atlast_scheduled_at-last_scheduled_attitle-titleupdated_at-updated_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 themesstring- Filter songs by themes. Supports partial matches without `%`.
titlestring- Filter songs by title. Supports partial matches without `%`.
planningcentermcp_services_team_positionsSearch the team positions within a service type in Planning Center Services.Read-onlyServicesTeamPositions
Search the team positions within a service type in Planning Center Services. A team position is a role within a team that people are scheduled into — for example "Acoustic Guitar", "Vocals", or "Camera 1". Requires a service_type_id.
Inputs
service_type_idintegerrequired- The ID of the service type whose team positions to retrieve.
includearray- Specify which relationships to include in the response.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
name-name output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10
planningcentermcp_services_teamsSearch teams in Planning Center Services.Read-onlyServicesTeams
Search teams in Planning Center Services. A team is a group within a service type that people are scheduled into to serve (e.g. Band, Vocals, Production, Hospitality). Pass a service_type_id to limit results to a single service type, or omit to search across the whole organization.
Inputs
includearray- Specify which relationships to include in the response.
namestring- Filter teams by name. Matches exactly unless you include a '%' wildcard for partial matches.
order_bystring- Sort results by field. Use '-' prefix for descending order.one of
created_at-created_atname-nameupdated_at-updated_at output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10 service_type_idinteger- Limit results to teams in a specific service type. When omitted, returns teams across the whole organization. Find one via the services_service_types tool.
planningcentermcp_calendar_feedsList the feeds configured in Planning Center Calendar.WriteCalendar Feeds
List the feeds configured in Planning Center Calendar. A feed is the pipe that carries events into Calendar from somewhere else: an organization has one Registrations feed, one Groups feed per group type, and one feed per Calendar form. Use this tool to resolve a feed's name or kind to the id that `calendar_events` accepts as `feed_id`. There is no server-side filtering by name, so filter by `feed_type` and match any name yourself. Events created directly in Calendar belong to a built-in feed whose id is the literal string `"calendar"`, so pass that to `feed_id` rather than looking it up. Setting `feed_type` returns every match in one unordered response, so `order_by`, `per_page`, and `page_after` apply only to an unfiltered list.
Inputs
feed_typestring- Limit to feeds of this kind.one of
registrationsgroupsformcalendar order_bystring- Sort results by field. Use '-' prefix for descending order.one of
name-name output_fieldsarray- Specify which fields to include in the response.
page_afterstring- Pagination token from previous response's next_page_token field
per_pageinteger- Maximum number of results to returndefault
10
planningcentermcp_people_form_submissions_createRecord a submission to a people form, for submissions captured outside of Church Center (e.g.WritePeopleFormSubmissionsCreate
Record a submission to a people form, for submissions captured outside of Church Center (e.g. a paper form). The caller must be able to manage the target form. Identify the submitter with either person_id (existing person) or person_attributes. Submitting triggers notification/confirmation emails, workflow cards, and profile updates.
Inputs
form_idintegerrequired- ID of the form to submit to. See people_forms.
person_attributesobject- Submitter details when person_id is unknown. Matches an existing profile by name + email, otherwise creates a new person. Provide this OR person_id.
person_idinteger- ID of an existing person who submitted the form. Provide this OR person_attributes.
valuesarray- The submitted answers, one entry per answered field.
planningcentermcp_people_notes_createCreate a note on a person's profile.WritePeopleNotesCreate
Create a note on a person's profile. A note is text filed under a note category and attached to a specific person. Use people_notes to read existing notes and people_note_categories to discover which category to file the note under.
Inputs
notestringrequired- The note text.
note_category_idintegerrequired- ID of the note category to file the note under. See people_note_categories.
person_idintegerrequired- ID of the person to attach the note to.
display_datestring- Optional date the note should be displayed under. Defaults to the creation time.
No tools match.