# CalendarFundraiser MCP - Agent Instructions

CalendarFundraiser runs calendar fundraisers: each date on a calendar is a donation equal to the date (the 3rd = $3), for one month or a whole year, for one organizer or a whole team. This server lets an AI agent work inside an organization's account: read campaigns, totals, rosters and payout status; create and change draft campaigns; add participants and invite-list contacts; and prepare messages a person approves and sends.

The agent never moves money and never reaches people on its own. Publishing, refunds, payouts, deletion and sending all stay with a person in the dashboard.

## Server

```
https://calendarfundraiser.com/mcp
```

Remote MCP over streamable HTTP. Scoped to one organization per connection. Every call is written to that organization's AI Access page (https://calendarfundraiser.com/dashboard/ai) with the app, the time and what it asked for.

## Authentication

Two ways, both set up by the organization:

1. **OAuth 2.1 (one-click sign-in).** Add the server address to your MCP app and sign in when it asks. The consent screen lists the scopes below; the person picks what the agent may do. Discovery: `https://calendarfundraiser.com/.well-known/oauth-authorization-server`.
2. **Access key.** Created at Settings → AI Access. Send it as a header:

```
Authorization: Bearer YOUR_KEY
```

AI Access must be turned on for the organization first (an organization admin does that from the dashboard).

## Scopes

- `campaigns:read` — read campaigns, totals, rosters, supporters and payout status
- `campaigns:draft` — create and change DRAFT campaigns (never publish)
- `roster:write` — add participants and invite-list contacts (reversible in the dashboard)
- `messages:draft` — prepare messages the organizer approves and sends

## Connect

```
claude mcp add --transport http calendarfundraiser https://calendarfundraiser.com/mcp
codex mcp add calendarfundraiser --url "https://calendarfundraiser.com/mcp"
```

```json
{ "mcpServers": { "calendarfundraiser": { "url": "https://calendarfundraiser.com/mcp" } } }
```

ChatGPT: Settings → Connectors → Create, server URL `https://calendarfundraiser.com/mcp`, then sign in.

## Rules the server gives every connected model

CalendarFundraiser: calendar fundraisers where each date is a donation equal to the date (the 3rd = $3, times the campaign's multiplier); a campaign covers one month, or a whole year on one calendar. All tools are scoped to the connected organization, and every call is recorded on the organization's AI Access page. You can read everything the organizer sees, create and update DRAFT campaigns, add participants and invite-list contacts, and PREPARE messages the organizer approves in the dashboard — you can never publish, refund, pay out, delete, or send. Drafts NEVER collect money — a person publishes from the dashboard. Every tool answer ends with the next step and its link: repeat that step to the user. Call list_templates before create_campaign_draft whenever the user wants a themed/occasion campaign; occasion keys must come from that list (update_campaign_draft can apply one later). Use exact URLs from tool results — never invent links. Anonymous donors stay anonymous; donor contact info is never available. Data is live — avoid redundant repeated calls. Vocabulary: the people who raise money on a team are "participants" (never "fundraisers"); the event is a "calendar fundraiser" or "campaign". Never state fee percentages or amounts and never say there are no fees; if fees come up, say the details are in the Terms of Service at https://calendarfundraiser.com/terms. When describing what the organization keeps, say it keeps 100% of calendar donations (always scoped to "calendar donations", never "every dollar").

## Best practices

- **Draft, then hand off.** Create or change drafts freely; then give the person the link to publish. Never say a campaign is live unless a tool result says so.
- **Check readiness before promising.** Call `get_publish_readiness` and repeat its next step and link; do not guess at what is missing.
- **Templates come from the list.** Call `list_templates` before drafting a themed campaign; occasion keys must come from it.
- **Use the links you are given.** Every tool answer carries the next step and its exact URL. Never invent a link.
- **Check before adding.** Call `list_participants` or `get_invite_status` before `add_participants` or `add_contacts` so you do not add the same people twice.
- **Messages are prepared, not sent.** `prepare_message` writes a draft for the organizer to approve in the dashboard. Say so.
- **Vocabulary.** People raising money on a team are participants, never fundraisers. The event is a calendar fundraiser or a campaign.
- **Money words.** Never state a fee amount or percentage and never say there are no fees; point to https://calendarfundraiser.com/terms. The organization keeps 100% of calendar donations (scoped to calendar donations).
- **Privacy.** Anonymous donors stay anonymous. Donor contact details are never available through this server.
- **Data is live.** Do not repeat the same read in a loop.

## Tools

| Tool | Needs | What it does |
|---|---|---|
| `list_templates` | `campaigns:read` | Themed campaign templates (holidays, school and PTO, sports, celebrations) with their keys. Call it before drafting a themed campaign. |
| `list_campaigns` | `campaigns:read` | The organization's campaigns with status and live totals. Use it to find a campaign. |
| `get_campaign` | `campaigns:read` | One campaign in depth: raised against goal, claimed and open dates with amounts, pace, link opens and shares. |
| `get_recent_donations` | `campaigns:read` | The most recent gifts on one campaign (name, amount, date, message), up to 50. Anonymous donors stay anonymous. |
| `get_participant_leaderboard` | `campaigns:read` | Team campaigns: every participant with what they have raised, dates claimed and their personal link. |
| `get_share_kit` | `campaigns:read` | Everything to promote a campaign: public URL, join link and access code, each participant link, QR code, calendar picture. |
| `create_campaign_draft` | `campaigns:draft` | Create a DRAFT campaign. Drafts never collect money; a person publishes from the dashboard. |
| `render_campaign_board` | `campaigns:read` | Show the live calendar picture for one campaign inside the chat. |
| `update_campaign_draft` | `campaigns:draft` | Change a draft: name, description, event line, template, dates, goal. |
| `get_publish_readiness` | `campaigns:read` | Why a campaign cannot go live yet: payout account, plan room, audience. Returns the next step and its link. |
| `get_payout_status` | `campaigns:read` | Which payout account is connected (Stripe or Square), whether it is verified, the payout delay, what has cleared. |
| `list_participants` | `campaigns:read` | Team campaigns: the roster as it stands, who has joined, who has not started. |
| `add_participants` | `roster:write` | Team campaigns: add participants by name. Each gets a personal calendar link. Reversible in the dashboard. |
| `add_contacts` | `roster:write` | Add people to a campaign's invite list from rows or a pasted block of emails. Bad addresses are skipped and reported. |
| `get_invite_status` | `campaigns:read` | Email activity for one campaign: on the list, invited, delivered, opened, clicked, bounced, complained. |
| `get_week_in_review` | `campaigns:read` | What happened on one campaign over the last N days: gifts and dollars per day, joins, invites, link opens. |
| `get_program_status` | `campaigns:read` | Program calendars (dues, fees, signups): who has paid, who has not, who is exempt. |
| `get_supporters` | `campaigns:read` | The organization's past donors across campaigns: name, gifts, total, campaigns, last gift. For thank-yous. |
| `get_financial_summary` | `campaigns:read` | The treasurer numbers for one campaign or the organization: gifts, calendar dollars raised, boosts, payouts. |
| `prepare_message` | `messages:draft` | Write a message for the organizer to approve and send from the dashboard. This tool never sends anything. |

## What the agent can never do

Publish or activate a campaign · issue a refund · change payout or bank settings · pay out · delete anything · send email or texts · see donor contact details. Those are a person's, in the dashboard.

## Errors and limits

Errors come back as MCP tool errors with a plain message. `401` means the key or sign-in is missing or revoked; a scope message means the person did not grant that permission; "AI access is turned off" means an organization admin has to switch it on. Rate limit: 60 tool-bearing requests per minute per organization.

## Links

- MCP page: https://calendarfundraiser.com/calendarfundraiser-mcp
- Step-by-step guide with pictures: https://calendarfundraiser.com/ai-fundraising-assistant
- Privacy policy: https://calendarfundraiser.com/privacy-policy · Terms: https://calendarfundraiser.com/terms
