[Cotlet](https://cotlet.dev/index.md) · [Integrations](https://cotlet.dev/integrations.md) · [How it works](https://cotlet.dev/how-it-works.md) · [Use cases](https://cotlet.dev/use-cases.md) · [Security](https://cotlet.dev/security.md) · [For developers](https://cotlet.dev/for-developers.md) · [For automation agencies](https://cotlet.dev/for-agencies.md) · [Blog](https://cotlet.dev/blog.md) · [API docs](https://cotlet.dev/docs.md) · [Help center](https://cotlet.dev/help.md) · [Changelog](https://cotlet.dev/changelog.md) · [Contact](https://cotlet.dev/contact.md) · [Pricing](https://cotlet.dev/pricing.md) · [Sign up](https://cotlet.dev/signup)

# Planning Center API and MCP server

> Planning Center has a full REST API for Calendar, Check-Ins, Giving, Groups, People and Services, and since August 2026 an official MCP server, but the MCP is mostly read-only (checked 22 Oct 2026). Its only writes are in People: notes on profiles and forms. It has no Services write tools, so it cannot send scheduling emails.

Church management software in separate products: People for profiles, lists and workflows, Services for plans and volunteer scheduling, Check-Ins for attendance, plus Giving, Calendar, Groups and Registrations.

## What is the Planning Center API?

Cotlet's Planning Center API exposes 12 endpoints for your own Planning Center account: search people, get person, list service plans, get plan team, list my schedule, list workflow cards, list first-time guests, send scheduling emails, respond to schedule request, complete workflow step, snooze workflow card and add person note. The search_people endpoint returns people profiles that match a name or email. Each endpoint takes simple JSON inputs like person_id, plan_id or from and works both as an operation of the planning_center_read or planning_center_write MCP tool for agents and as a REST call for scripts.

- **Category:** [Creators & communities](https://cotlet.dev/integrations/category/creators-communities.md)
- **Endpoints:** 12 (7 read, 5 write)
- **Updated:** 2026-10-21

Planning Center has a full REST API for Calendar, Check-Ins, Giving, Groups, People and Services, and since August 2026 an official MCP server, but the MCP is mostly read-only (checked 22 Oct 2026). Cotlet is a hosted MCP server and REST API for Planning Center with 12 endpoints (7 read, 5 write): you sign in once in your own cloud browser, your AI agent does the work.

## Does Planning Center have an official API?

Planning Center has a full REST API for Calendar, Check-Ins, Giving, Groups, People and Services, and since August 2026 an official MCP server, but the MCP is mostly read-only (checked 22 Oct 2026). Its only writes are in People: notes on profiles and forms. It has no Services write tools, so it cannot send scheduling emails.

| Task | Planning Center official | Cotlet |
|---|---|---|
| Search people and read profiles | Yes: People API and the official MCP, read | Yes |
| Read service plans and team status | Yes: Services API and the official MCP, read | Yes |
| List first-time guests from Check-Ins | Yes: Check-Ins API has a first_times filter | Yes |
| Add a profile note | Yes: The official MCP creates notes in People | Yes |
| Send scheduling emails from a plan | Partly: The official MCP has no Services write tools; through the API you build and host it yourself | Yes |
| Accept or decline your own schedule requests | Partly: Not in the official MCP | Yes |
| Complete or snooze workflow cards | Partly: Not in the official MCP; Zapier has a New Workflow Card trigger only | Yes |
| Read workflow cards | Yes: People API | Yes |

Sources: [Planning Center Help: Connect AI tools to Planning Center](https://help.planningcenter.com/en/151880-connect-ai-tools-to-planning-center.html), [Planning Center Blog: Announcing the Planning Center MCP](https://www.planningcenter.com/blog/2026/08/announcing-the-planning-center-mcp-connect-chatgpt-claude-and-other-ai-tools), [Planning Center Help: The Planning Center API](https://help.planningcenter.com/en/144877-the-planning-center-api.html), [Planning Center: Zapier integration](https://www.planningcenter.com/integrations/zapier)

## For AI agents

```text
Planning Center has a full REST API for Calendar, Check-Ins, Giving, Groups, People and Services, and since August 2026 an official MCP server, but the MCP is mostly read-only (checked 22 Oct 2026). Its only writes are in People: notes on profiles and forms. It has no Services write tools, so it cannot send scheduling emails.
Cotlet provides a hosted MCP server and REST API for Planning Center: 12 tools (7 read, 5 write).
Access       Sign up at https://cotlet.dev/app/signup?app=planning-center, then request the app and create API keys in the Cotlet console.

MCP server   https://cotlet.dev/mcp/v1
MCP tools    planning_center_read, planning_center_write, reads and writes apart; call one with {"operation": "<operation>", "arguments": {...}}
REST base    https://cotlet.dev/api/v1/planning-center, each operation at its own route, e.g. POST /api/v1/planning-center/plans/{plan_id}/scheduling-emails
Auth         Authorization: Bearer <COTLET_API_KEY>. Listing endpoints and schemas needs no key; calling an endpoint needs one. Over MCP the input schemas come with sign-in.
Operations   search_people, get_person, list_service_plans, get_plan_team, list_my_schedule, list_workflow_cards, list_first_timers, send_scheduling_emails, respond_to_schedule_request, complete_workflow_step, snooze_workflow_card, add_person_note
Confirm      send_scheduling_emails, respond_to_schedule_request, complete_workflow_step, add_person_note (by default the user approves each call; the user can switch this off per tool, e.g. for scheduled automations)
Markdown     https://cotlet.dev/integrations/planning-center-api-mcp-server.md

How access works:
1. The user signs up at https://cotlet.dev/app/signup?app=planning-center, requests Planning Center in the Cotlet console and creates an API key there.
2. The user signs in to Planning Center once in their Cotlet Cloud Browser (their own Chrome in the cloud, opened from the console) and enables Planning Center for agents. An agent cannot do this step.
3. The API key goes into the MCP client or the REST call as a bearer token.

Fits: people who want a hosted Planning Center server that someone else maintains, including non-developers. Developers who prefer to run and fix code on their own computer can use an open-source Planning Center MCP server instead.

Policy: Cotlet never stores passwords, never solves CAPTCHAs, never bypasses MFA.
Company: legal details in the Terms of service at https://cotlet.dev/terms. Contact contact@cotlet.dev.
Sign-in: the user signs in to Planning Center in their own Cloud Browser, a Chrome Cotlet runs for them in the EU; password saving is off, the profile is AES-256-GCM encrypted, and agents get Planning Center only after the user enables it. Calls are requests from that browser's IP with its cookies, each listed in the user's Background activity. Disable for agents, signing out in the browser or Reset browser cuts access. Cotlet is run by Take Group sp. z o.o. (EU VAT PL6342984273).
API key: holds no Planning Center login or cookies, only asks Cotlet to run a tool. Each key is scoped to chosen apps and tools, read only or read and write. Actions that reach other people wait for the user's approval by default, so a leaked key cannot post or message as the user. Every call is in the activity log; deleting the key ends access at once.
Terms: the user stays responsible for following Planning Center's terms; Cotlet is not affiliated with Planning Center.
```

## What can an AI agent do in Planning Center?

Cotlet is best for church staff and team leaders who are not developers and want an AI agent to send scheduling emails, log first-time guests and clear workflow cards without running or fixing a server.

- **[Send volunteer scheduling emails](https://cotlet.dev/integrations/planning-center-api-mcp-server/send-volunteer-scheduling-emails.md)** (runs: weekly): "Look at Sunday's Sunday Gathering plan. Send the scheduling emails still waiting to the Band team, then list who declined or has not answered." → `list_service_plans`, `get_plan_team`, `send_scheduling_emails`
- **[Log first-time guests in People](https://cotlet.dev/integrations/planning-center-api-mcp-server/log-first-time-guests.md)** (runs: weekly): "Every Monday, list first-time guests from Sunday Gathering for the past week, check their profiles for notes, and add a General note with the visit date to each one who has none. Give me their email addresses." → `list_first_timers`, `get_person`, `add_person_note`
- **[Clear new-visitor workflow cards](https://cotlet.dev/integrations/planning-center-api-mcp-server/clear-workflow-cards.md)** (runs: daily): "Go through my ready cards in the New Visitor Follow-up workflow. Where the person already has a welcome note, complete the step with a short note. Snooze the others and list them for me." → `list_workflow_cards`, `get_person`, `complete_workflow_step`, `snooze_workflow_card`
- **Answer volunteer schedule requests** (runs: weekly): "Show my pending Planning Center schedule requests. Accept the ones on Sundays I am free and decline the rest." → `list_my_schedule`, `respond_to_schedule_request`
- **Weekly volunteer coverage report** (runs: weekly): "Every Tuesday, list the next three Sunday plans and how many volunteers on each team are confirmed, declined or still unconfirmed." → `list_service_plans`, `get_plan_team`

## Can Planning Center automations run on a schedule in n8n, Make or Zapier?

Yes. Cotlet does not replace your automation platform: it gives it a Planning Center connection it does not have, with the same API key as your agent. Write actions ask for your OK by default; switch that off in your dashboard for the tools you choose, for example to send volunteer scheduling emails, and the schedule runs on its own. Cotlet runs in the cloud, so it keeps going while your computer is off.

| Where | How to connect | How to schedule |
|---|---|---|
| Your AI agent | Add https://cotlet.dev/mcp/v1 with your API key. | A scheduled agent run, for example a Claude Code routine. |
| n8n | MCP Client node with https://cotlet.dev/mcp/v1, or an HTTP Request node with the endpoint's method and URL, such as GET https://cotlet.dev/api/v1/planning-center/service-plans. | Schedule Trigger node. |
| Make | HTTP module: the endpoint's method and URL with an Authorization: Bearer header, and a JSON body for POST, PUT and PATCH. | Scenario schedule. |
| Zapier | Webhooks by Zapier, Custom Request: the same method, URL, header and body. | Schedule by Zapier trigger. |
| Your own script | GET https://cotlet.dev/api/v1/planning-center/service-plans with your API key. | cron or GitHub Actions. |

## Tools

**For AI agents:** Every endpoint and its schema is public. The 12 endpoints on this page, with parameters and example responses, can be listed without an account. Calling one returns 401 without an API key and 403 while the key has no access to Planning Center.

### search_people

People profiles that match a name or email. Access: read. REST: `GET /api/v1/planning-center/peoples/search`. MCP: `planning_center_read → search_people`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `query` | string | yes | Name or email address to search for. |

Searches People for the text you give and returns the matching profiles, best match first. Use person_id with get_person and add_person_note. You only get profiles your account can see in People.

Example response:

```json
{
  "people": [
    {
      "person_id": "48215",
      "name": "Dana Whitfield",
      "email": "dana@example.org"
    },
    {
      "person_id": "48990",
      "name": "Dana Whitfield-Cole",
      "email": "dana.wc@example.org"
    }
  ]
}
```

### get_person

One People profile with contact details and the notes you can see. Access: read. REST: `GET /api/v1/planning-center/persons/{person_id}`. MCP: `planning_center_read → get_person`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `person_id` | string | yes | Person id from search_people or list_first_timers. |

Returns the name, emails and phone numbers on the profile, and its notes with category, date and author. Notes from categories your account cannot view are left out. Nothing on the profile changes.

Example response:

```json
{
  "person_id": "51207",
  "name": "Hannah Cole",
  "emails": [
    "hannah@example.org"
  ],
  "phone_numbers": [
    "+1 555 0142"
  ],
  "notes": [
    {
      "category": "General",
      "date": "2026-10-12",
      "author": "Grace Miller",
      "body": "Asked about the youth group."
    }
  ]
}
```

### list_service_plans

Services plans of a service type in a date range, in date order. Access: read. REST: `GET /api/v1/planning-center/service-plans`. MCP: `planning_center_read → list_service_plans`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `service_type` | string | yes | Service type name as the Plans page shows it, for example Sunday Gathering. |
| `from` | date | no | First plan date to include. |
| `to` | date | no | Last plan date to include. |

Returns the plans of one service type from the Plans page, earliest first, with the plan id you pass to get_plan_team and send_scheduling_emails. Plans of other service types are not mixed in.

Example response:

```json
{
  "plans": [
    {
      "plan_id": "71234",
      "service_type": "Sunday Gathering",
      "date": "2026-10-25",
      "title": "Harvest Sunday"
    },
    {
      "plan_id": "71301",
      "service_type": "Sunday Gathering",
      "date": "2026-11-01",
      "title": "All Saints Sunday"
    }
  ]
}
```

### get_plan_team

Scheduled volunteers of a plan with position, status and whether their email is still waiting. Access: read. REST: `GET /api/v1/planning-center/plans/{plan_id}/team`. MCP: `planning_center_read → get_plan_team`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `plan_id` | string | yes | Plan id from list_service_plans. |
| `status` | enum | no | all, unconfirmed, confirmed or declined. Default: all. |
| `team` | string | no | Team name, for example Band. Default: every team. |

Returns every scheduled person on the plan's Teams tab with team, position and status as shown there. prepared is true when the person's first scheduling email has not been sent, the ✉️ icon in Planning Center. Filter by status or team to shorten the answer.

Example response:

```json
{
  "plan_id": "71234",
  "date": "2026-10-25",
  "members": [
    {
      "person_id": "48215",
      "name": "Dana Whitfield",
      "team": "Band",
      "position": "Vocals",
      "status": "unconfirmed",
      "prepared": true
    },
    {
      "person_id": "48377",
      "name": "Marcus Bell",
      "team": "Band",
      "position": "Drums",
      "status": "unconfirmed",
      "prepared": true
    },
    {
      "person_id": "48642",
      "name": "Priya Nair",
      "team": "Band",
      "position": "Keys",
      "status": "unconfirmed",
      "prepared": true
    },
    {
      "person_id": "49018",
      "name": "Tom Reyes",
      "team": "Sound",
      "position": "Front of house",
      "status": "declined",
      "prepared": false
    }
  ]
}
```

### list_my_schedule

Your own pending and confirmed requests, as My Schedule shows them. Access: read. REST: `GET /api/v1/planning-center/my-schedules`. MCP: `planning_center_read → list_my_schedule`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `section` | enum | no | pending or confirmed. Default: pending. |

Returns the positions you were asked to fill, grouped like the Pending and Confirmed sections of My Schedule. Only requests whose scheduling email was sent appear, because Planning Center hides the rest until then. Each row has the plan id for respond_to_schedule_request.

Example response:

```json
{
  "requests": [
    {
      "plan_id": "71234",
      "date": "2026-10-25",
      "service_type": "Sunday Gathering",
      "team": "Band",
      "position": "Keys",
      "section": "pending"
    }
  ]
}
```

### list_workflow_cards

Cards of a People workflow that are ready or snoozed, with person, step and assignee. Access: read. REST: `GET /api/v1/planning-center/workflow-cards`. MCP: `planning_center_read → list_workflow_cards`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `workflow` | string | yes | Workflow name as People shows it. |
| `view` | enum | no | ready or snoozed. Default: ready. |

Returns the cards behind the Ready filter of a workflow, or its Snoozed option. Each card has the person, the current step and the assignee. Use card_id with complete_workflow_step and snooze_workflow_card.

Example response:

```json
{
  "cards": [
    {
      "card_id": "9031",
      "person_id": "51207",
      "person": "Hannah Cole",
      "step": "Add welcome note",
      "assignee": "Grace Miller"
    },
    {
      "card_id": "9034",
      "person_id": "51330",
      "person": "Ben Ortiz",
      "step": "Add welcome note",
      "assignee": "Grace Miller"
    }
  ]
}
```

### list_first_timers

People whose check-in to an event was their first, in a date range. Access: read. REST: `GET /api/v1/planning-center/first-timers`. MCP: `planning_center_read → list_first_timers`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `event` | string | yes | Check-Ins event name, for example Sunday Gathering. |
| `from` | date | no | First day to include. |
| `to` | date | no | Last day to include. |

Returns the check-ins marked as a first time for the event, one row per person with the date. Visitors checked in by label only are not saved in People and are not returned. Use person_id with get_person.

Example response:

```json
{
  "first_timers": [
    {
      "person_id": "51207",
      "name": "Hannah Cole",
      "checked_in": "2026-10-18"
    },
    {
      "person_id": "51330",
      "name": "Ben Ortiz",
      "checked_in": "2026-10-18"
    },
    {
      "person_id": "51402",
      "name": "Maya Singh",
      "checked_in": "2026-10-18"
    }
  ]
}
```

### send_scheduling_emails

Send the scheduling emails that are still waiting on a plan, for one team, one person or everyone. Access: write, asks the user first. REST: `POST /api/v1/planning-center/plans/{plan_id}/scheduling-emails`. MCP: `planning_center_write → send_scheduling_emails`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `plan_id` | string | yes | Plan id from list_service_plans. |
| `team` | string | no | Team name, for example Band. Default: every team of the plan. |
| `person_id` | string | no | Email only this person. Overrides team. |
| `message` | string | no | Custom text added to the email. |

Does what the Send button on the Teams tab does: emails people whose prepared notification is unsent, with their times, Accept and Decline buttons and a plan link. People who already got their email are skipped. Returns who was emailed. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "plan_id": "71234",
  "team": "Band",
  "sent": [
    {
      "person_id": "48215",
      "name": "Dana Whitfield"
    },
    {
      "person_id": "48377",
      "name": "Marcus Bell"
    },
    {
      "person_id": "48642",
      "name": "Priya Nair"
    }
  ],
  "skipped_already_emailed": 0
}
```

### respond_to_schedule_request

Accept or decline your own pending request for a plan, as you. Access: write, asks the user first. REST: `POST /api/v1/planning-center/plans/{plan_id}/schedule-request/replies`. MCP: `planning_center_write → respond_to_schedule_request`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `plan_id` | string | yes | Plan id from list_my_schedule. |
| `response` | enum | yes | accept or decline. |

Answers all your pending positions on the plan, like Accept pending or Decline all on the plan card in My Schedule. A decline notifies your team leaders. Positions split into several times are not answered here; answer them in Planning Center. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "plan_id": "71234",
  "response": "accept",
  "positions": [
    {
      "team": "Band",
      "position": "Keys",
      "status": "confirmed"
    }
  ]
}
```

### complete_workflow_step

Complete the current step of a workflow card and move it to the next step. Access: write, asks the user first. REST: `POST /api/v1/planning-center/cards/{card_id}/workflow-step/complete`. MCP: `planning_center_write → complete_workflow_step`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `card_id` | string | yes | Card id from list_workflow_cards. |
| `note` | string | no | Note saved in the card history. |

Does what Complete step does on the card. The card moves to the next step, whose assignee is notified, and that step can run an automatic action when the card arrives. The optional note goes into the card history. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "card_id": "9031",
  "person": "Hannah Cole",
  "completed_step": "Add welcome note",
  "now_at": "Welcome call",
  "note": "Welcome note found on profile, step done."
}
```

### snooze_workflow_card

Hide a workflow card from your list for a duration. Access: write. REST: `POST /api/v1/planning-center/cards/{card_id}/workflow-card/snooze`. MCP: `planning_center_write → snooze_workflow_card`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `card_id` | string | yes | Card id from list_workflow_cards. |
| `duration` | string | yes | One of the durations the Select snooze... dropdown offers on the card. |

Does what Select snooze... does on the card: the card leaves your Ready list until the time ends, then its assignee gets an email. It reaches nobody until then, and one more call with another duration changes it, so it does not wait for your OK.

Example response:

```json
{
  "card_id": "9034",
  "person": "Ben Ortiz",
  "snoozed": true,
  "until": "2026-10-23T09:00:00-05:00"
}
```

### add_person_note

Add a note to a person's profile in a note category. Access: write, asks the user first. REST: `POST /api/v1/planning-center/persons/{person_id}/note`. MCP: `planning_center_write → add_person_note`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `person_id` | string | yes | Person id from search_people or list_first_timers. |
| `category` | string | yes | Note category name, for example General. |
| `body` | string | yes | Text of the note. |
| `date` | date | no | Date of the note. Default: today. |

Adds a note on the profile's Notes tab with the category, date and text you give; Planning Center shows the date and you as the author. Your account needs View / Create access to that category, or the call fails. Nobody is emailed, but anyone with access to the category can read the note. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "note_id": "330142",
  "person_id": "51207",
  "category": "General",
  "date": "2026-10-19",
  "author": "Grace Miller",
  "body": "First visit at Sunday Gathering on 18 Oct. Follow up this week."
}
```

## How do I connect Planning Center to Claude Code, Codex or Cursor?

Connecting Planning Center takes three steps: sign up, sign in to Planning Center once in your Cloud Browser and enable it for agents, then add one MCP server or call the REST API with the same key.

### Connect Planning Center to your agent.

1. **Create an account** Sign up and add Planning Center in the console. Your API key is there too.

2. **Sign in to Planning Center in your Cloud Browser** Open your Cloud Browser in the console: your own Chrome in the cloud. Sign in to Planning Center there yourself, the way you always do, then press Enable for agents, read only or read and write. We never save your password, and your agent keeps working even when your computer is off.

3. **Add Cotlet to your agent** Paste the snippet for your client. The same server and key serve every app you connect, so you do this once.

   Claude Code:

```
claude mcp add --transport http cotlet \
  https://cotlet.dev/mcp/v1 \
  --header "Authorization: Bearer $COTLET_API_KEY"
```

   Cursor:

```
{
  "mcpServers": {
    "cotlet": {
      "url": "https://cotlet.dev/mcp/v1",
      "headers": {
        "Authorization": "Bearer ${COTLET_API_KEY}"
      }
    }
  }
}
```

   Codex:

```
# ~/.codex/config.toml
[mcp_servers.cotlet]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY"
```

4. **Ask your agent** Ask in plain words. Your agent finds the Planning Center tools on the server and calls them for you; anything that reaches other people waits for your OK unless you switch that off for a tool.

```
Look at Sunday's Sunday Gathering plan. Send the scheduling emails still waiting to the Band team, then list who declined or has not answered.
```

### Call Planning Center from your scripts.

1. **Export your API key** Your scripts use the same API key as your agent. Keep it in an environment variable, never in your code.

```
export COTLET_API_KEY="cotlet_..."
```

2. **Call a tool** Every tool is an endpoint under /api/v1/planning-center with its own method and path, listed with the endpoints above. Path parameters go in the URL; the other parameters go in the query for GET and DELETE and in a JSON body otherwise.

```
curl -X POST https://cotlet.dev/api/v1/planning-center/plans/71234/scheduling-emails \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"team":"Band"}'
```

3. **Read the result** You get plain JSON back, ready for your script. A failed call costs nothing.

```
{
  "plan_id": "71234",
  "team": "Band",
  "sent": [
    {
      "person_id": "48215",
      "name": "Dana Whitfield"
    },
    {
      "person_id": "48377",
      "name": "Marcus Bell"
    },
    {
      "person_id": "48642",
      "name": "Priya Nair"
    }
  ],
  "skipped_already_emailed": 0
}
```

## Why use Cotlet for Planning Center?

**Built for agents**

- One MCP server for every app you connect.
- The same tools as a REST API for scripts and cron jobs.
- Works with Claude Code, Codex and Cursor.

**Your login stays yours**

- You sign in to Planning Center yourself, in your own Cloud Browser. We never save your password; the profile is encrypted with AES-256-GCM, the cipher 1Password uses.
- A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory.
- The model never sees a login.
- No stored passwords, no CAPTCHA solving, no MFA bypass.

**You stay in control**

- Scope each API key: its apps, its tools, read only or read and write.
- Anything that reaches other people waits for your OK, so a leaked key cannot post or message as you.
- Every background request listed in your Background activity. Disable for agents in one click.

**Kept working for you**

- We test every integration every 6 hours.
- When Planning Center changes, the tool pauses until we fix it.
- Failed calls cost nothing.

## Is it safe to connect Planning Center to Cotlet?

Yes. You sign in to Planning Center yourself, in your own Cloud Browser, and we never save your password. Your agents only get Planning Center once you enable it, and every background request is listed. The browser profile is stored encrypted with AES-256-GCM, the same cipher 1Password uses for its vaults and Apple for iCloud Keychain. Independent public scanners grade cotlet.dev A+ and find it clean; click a result to rerun it yourself.

- **A+ on Qualys SSL Labs**: Encryption in transit: TLS setup and certificates, on all four server addresses. [Live result](https://www.ssllabs.com/ssltest/analyze.html?d=cotlet.dev)
- **A+ on securityheaders.com**: Browser protections sent with every page, all six headers present. [Live result](https://securityheaders.com/?q=cotlet.dev&followRedirects=on)
- **A+ on Mozilla Observatory**: Mozilla's web security baseline: score 120 of 100, 12 of 12 tests passed. [Live result](https://developer.mozilla.org/en-US/observatory/analyze?host=cotlet.dev)
- **Clean on Sucuri SiteCheck**: No malware, spam or defacement, and not on any of 9 blocklists, Google Safe Browsing included. [Live result](https://sitecheck.sucuri.net/results/cotlet.dev)

[How Cotlet protects your access](https://cotlet.dev/security.md)

### Common concerns

**Who runs Cotlet?**

Cotlet is run by Take Group, a Polish software company working since 2019. Take Group runs about 3,200 websites on its own systems and has its own DevOps team for infrastructure security. We built and used integrations like this inside the company for years before opening them as Cotlet.

**Is this an official Planning Center integration?**

No, Cotlet is independent of Planning Center. Planning Center's own API is too limited for this work. Cotlet works through your own Planning Center account, the way you use Planning Center in the browser, so you need no partner approval and no developer setup.

**What about client data and GDPR?**

Cotlet is run from the EU and follows the GDPR. Cloud Browsers run in Finland, a Tier 1 country in the ITU Global Cybersecurity Index 2024. Data passes through a call and is not kept after it.

**Can I start with read only?**

Yes. Enable the app for agents as read only, or make the API key read only, and anything that reaches other people waits for your OK unless you switch that off per tool.

**Is it reliable?**

Every Cotlet service is checked every 3 minutes from Europe, North America, Asia and Australia. The live results and any outage are public at status.cotlet.dev.

**How do I stop?**

Press Disable for agents next to Planning Center in your console: your agents lose access at once and you stay signed in. Signing out of Planning Center in the browser works too, and Reset browser deletes the whole profile.

## Is there a Planning Center MCP server on GitHub?

Yes. Community Planning Center MCP servers exist on GitHub, usually maintained by one person. You install one on your own computer, create an API token, and keep it running yourself; when the API or your church setup changes, you or the maintainer fix it. Cotlet hosts the same kind of server for you, works in your own signed-in session and our team keeps it working.

|  | GitHub MCP server | Cotlet |
|---|---|---|
| Setup | Clone the repo, install it, create a token in Planning Center, add it to each MCP client | Sign up, sign in to Planning Center once, add one MCP server or API key |
| When Planning Center changes | It breaks until you or the maintainer fix it | Our team tests it daily and fixes it for you; failed calls are free |
| Your Planning Center access | A token in a file on your computer, readable by any program you run | Your session lives in your own Cloud Browser in the EU, profile encrypted, only for the apps you enable, disabled for agents in one click |
| When the session expires | Tools fail until you create or paste a new token | Your Cloud Browser keeps you signed in; if Planning Center logs you out, your agent gets a link to sign in again |
| Upkeep | You update, monitor and debug it yourself | Nothing to host or update |
| Where it runs | Your computer, while it is on | Hosted: Claude Code, Codex, Cursor, n8n and scripts, also on a schedule |
| Price | Free, paid for with your time | Free 7-day trial, then pay-as-you-go credit packs, no subscription |

### Which one fits you

**Pick Cotlet if**

- you are not a developer, or you do not want to maintain a server
- you need it to keep working when Planning Center changes, without checking it yourself
- your agent or a script should run it on a schedule, also while your computer is off

**Pick an open-source server if**

- you are comfortable installing, updating and fixing it yourself
- you want your sign-in to stay on your own computer
- you only need it now and then, from one MCP client

## How much does the Planning Center API cost?

Free 7-day trial with 2,000 credits, no card needed. After that, the Planning Center API is pay as you go with no limit on apps: Credit packs from $29 for 5,000 credits, one-time, no subscription. A successful call uses 20 to 30 credits (25 for most tools, about $0.10 to $0.15), your Cloud Browser uses 50 credits a day while it has an app enabled for agents, however many apps that is, and an agent driving the browser itself uses 5 credits a minute. Credit packs stay valid for 12 months and stack, so unused credits carry over.

| Credits | Price, one time | Calls at 25 credits | Per 1,000 credits |
|---|---|---|---|
| 5,000 | $29 | 200 | $5.80 |
| 15,000 | $79 | 600 | $5.27 |
| 32,000 | $149 | 1,280 | $4.66 |
| 60,000 | $249 | 2,400 | $4.15 |

Only successful calls use credits; failed calls and timeouts cost nothing. At a balance of 0 calls pause, never a surprise charge. Authenticate with the `Authorization: Bearer` header. [See full pricing](https://cotlet.dev/pricing.md)

## How Cotlet holds your access

Cotlet hosts MCP servers and REST APIs for apps with no usable API. Your agent works in your own Planning Center account.

- **Company details:** Cotlet is run by Take Group sp. z o.o., a company registered in Poland. Its full address and registration numbers are in the Terms of service. [Terms of service](https://cotlet.dev/terms)
- **Your sign-in:** You sign in to Planning Center yourself, in your own Cloud Browser: a Chrome we run for you in the EU, one per app. We never save your password (password saving is off), the profile is stored encrypted with AES-256-GCM, and your agents get Planning Center only after you enable it. When Planning Center signs you out, your agent gives you a link to sign in again. [Security](https://cotlet.dev/security.md)
- **Revoking access:** Press Disable for agents next to Planning Center, sign out of Planning Center in your Cloud Browser, or reset the browser. Every background request is listed in your Background activity. Actions that reach other people wait for your OK unless you switch that off per tool.
- **What we never do:** Store passwords, solve CAPTCHAs or bypass MFA.
- **Planning Center's terms:** You use your own Planning Center account and stay responsible for following Planning Center's terms. Cotlet is independent and not affiliated with Planning Center. [Terms](https://cotlet.dev/terms)
- **Contact:** Questions about the company, security or an app: [contact@cotlet.dev](mailto:contact@cotlet.dev)

## Frequently asked questions

**How do I get access?**

Sign up free, open Planning Center in the console and press Request access. Then you create your API key and connect Planning Center there.

**Do I need to be technical?**

No. You sign in to Planning Center once in your Cloud Browser, a normal Chrome you open from the console, and paste one command into your agent, or one URL into n8n. Your agent can walk you through it. There is no server to install, update or fix.

**Is it safe to connect Planning Center to Cotlet?**

Yes. You sign in to Planning Center yourself, in your own Cloud Browser in the EU, and we never save your password. Your agents only get Planning Center once you enable it, every background request is listed, and the browser profile is stored encrypted with AES-256-GCM, the cipher 1Password uses for its vaults. The AI model never sees a login, posts and messages wait for your OK, and Disable for agents cuts access in one click. Independent scanners grade cotlet.dev A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory; live results are on https://cotlet.dev/security.

**Is a hosted server safer than a local one? My Planning Center sign-in would leave my computer.**

On Cotlet you sign in inside your own Cloud Browser, which only you open, and its profile is stored encrypted with AES-256-GCM in the EU. Agents get only the apps you enable, and every background request is listed. A local server keeps your Planning Center cookie in a plain file on your computer, readable by any program you run, and stops when your computer is off.

**Why does Cotlet send requests instead of clicking in my browser?**

To be fast, Cotlet doesn't click through Planning Center's pages. It sends the same requests your browser would, from your browser's IP with its cookies, without opening a window. Planning Center sees the same browser and IP you signed in with, and every request is listed in your Background activity.

**What if someone gets my Cotlet API key?**

The key holds no Planning Center login or cookies, it only asks Cotlet to run a tool. It can call only the apps and tools you gave it, and a read-only key changes nothing. Anything that reaches other people, like posts, comments or messages, waits for your OK in the dashboard by default, so a leaked key cannot post or message as you. When you switch approval off for a scheduled job, give that job its own key limited to that one tool. Every call is in your activity log, and deleting the key ends access at once.

**Why a signed-in browser and not OAuth, like other integration platforms?**

Planning Center offers no OAuth token you can simply grant for these tools: its official API leaves them out or needs a developer app, a plan or an approval first (see the official API section above). That is why Cotlet sets the limits itself: per key, per tool, with your approval before anything reaches other people. Cotlet is run by Take Group sp. z o.o., an EU company (VAT PL6342984273).

**Which Planning Center role does my agent need?**

The same role you have, because the agent acts in your signed-in session. Planning Center says people only see data within their permissions. Scheduling emails need a team leader role in Services (see Permissions in Services), and notes need View / Create access to the note category in People.

**Is the official Planning Center MCP enough for reading?**

For reading, often yes. It covers Services, Giving, People, Registrations, Calendar, Groups, Publishing and Check-Ins, and admins decide who can connect. It cannot send scheduling emails, answer requests or move workflow cards, which is what Cotlet adds. Both can run side by side.

**Does Cotlet touch Giving or donations?**

No. The tools cover People, Services and Check-Ins only. There is no tool that reads or changes donations, funds or payments.

**Can my agent post or send messages in Planning Center without asking me?**

No. Every call to send_scheduling_emails, respond_to_schedule_request, complete_workflow_step or add_person_note waits for your OK by default. For scheduled automations you can switch confirmation off per tool in your dashboard, for example only for approvals. snooze_workflow_card runs without asking, because it sends nothing to anyone and one call undoes it.

**Can I use the Planning Center API in n8n?**

Yes. Add https://cotlet.dev/mcp/v1 with your API key in n8n's MCP Client node, or call its endpoints under https://cotlet.dev/api/v1/planning-center from the HTTP Request node.

---

Give your AI agents your signed-in browser.

**Product:** [Integrations](https://cotlet.dev/integrations.md) · [Use cases](https://cotlet.dev/use-cases.md) · [How it works](https://cotlet.dev/how-it-works.md) · [Pricing](https://cotlet.dev/pricing.md) · [Security](https://cotlet.dev/security.md)

**Resources:** [Blog](https://cotlet.dev/blog.md) · [API docs](https://cotlet.dev/docs.md) · [Help center](https://cotlet.dev/help.md) · [Changelog](https://cotlet.dev/changelog.md) · [GitHub](https://github.com/cotletdev/cotlet)

**Solutions:** [For developers](https://cotlet.dev/for-developers.md) · [For automation agencies](https://cotlet.dev/for-agencies.md)

**Company:** [About](https://cotlet.dev/about.md) · [AI info: company facts](https://cotlet.dev/ai-info.md) · [Contact](https://cotlet.dev/contact.md)

**Legal:** [Terms of service](https://cotlet.dev/terms) · [Privacy policy](https://cotlet.dev/privacy) · [Refund policy](https://cotlet.dev/refunds) · [Acceptable use](https://cotlet.dev/acceptable-use) · [Cookie policy](https://cotlet.dev/cookies) · [DPA](https://cotlet.dev/dpa) · [Subprocessors](https://cotlet.dev/subprocessors)

**Elsewhere:** [Status page](https://status.cotlet.dev) · [Cotlet on GitHub](https://github.com/cotletdev) · [Cotlet on X](https://x.com/cotletdev) · [Cotlet on LinkedIn](https://www.linkedin.com/company/cotletdev) · [Cotlet on Product Hunt](https://www.producthunt.com/products/cotlet) · [Cotlet on Crunchbase](https://www.crunchbase.com/organization/cotlet) · [Cotlet on SaaSHub](https://www.saashub.com/cotlet)

Cotlet is an independent service. It is not affiliated with, endorsed by or sponsored by any of the products listed on this site. Product names are trademarks of their respective owners.

## For AI agents: sign your user up

Is your user asking you to sign them up for Cotlet? You can do it for them, no account or key needed.

1. Read the fields and their allowed values: GET https://cotlet.dev/api/v1/access-requests
2. Ask the user for each value: email, apps, what you will do with them. If they leave the password to you, generate a strong one and show it to them.
3. Show the user what you will send, then POST it as JSON to https://cotlet.dev/api/v1/access-requests.

One call creates the account and sends the access request; we email the user when access is granted.
