---
name: signupgenius
description: Read sign-up sheets, slot reports, and groups on SignUpGenius — and add members to your groups. Triggers on phrases like "check SignUpGenius", "what am I signed up for", "what slots are left for [event]", "available slots", "list my SignUpGenius groups", "add [person] to my [group] group", or any request involving SignUpGenius sign-ups, RSVPs, volunteer slots, potlucks, carpools, classroom helpers, or PTA/HOA/Scout/team sign-ups. Works against your own signed-in account; supports Pro key for full slot reports.
---

# signupgenius-mcp

MCP server for [SignUpGenius](https://www.signupgenius.com) — 14 read tools + 2 write across profile, groups, sign-ups, and reports.

- **npm:** [npmjs.com/package/signupgenius-mcp](https://www.npmjs.com/package/signupgenius-mcp)
- **Source:** [github.com/chrischall/signupgenius-mcp](https://github.com/chrischall/signupgenius-mcp)

## Setup

Three auth modes, tried in priority order — first match wins. **You only need one.**

### Mode 1 — fetchproxy fallback (zero env vars, recommended)

Install the ContextMint Bridge browser extension once ([releases](https://github.com/nullnet-app/contextmint-bridge/releases): Chrome loads the chrome zip unpacked; Safari isn't available yet, so use Chrome for now — it's the fetchproxy extension renamed, source at https://github.com/nullnet-app/contextmint-bridge, verify a zip with its `.sha256` file), sign into [signupgenius.com](https://www.signupgenius.com), and add to `.mcp.json` (project) or `~/.claude/mcp.json` (global):

```json
{
  "mcpServers": {
    "signupgenius": {
      "command": "npx",
      "args": ["-y", "signupgenius-mcp"]
    }
  }
}
```

At startup the MCP reads your `accessToken` / `cfid` / `cftoken` cookies once via the extension, then talks to SignUpGenius directly — the extension is **not** in the request hot path after that. Works with free accounts.

### Mode 2 — session login (email + password)

Add an env block with your direct-login credentials (won't work with Google/Apple/Facebook/Microsoft SSO or 2FA):

```json
{
  "mcpServers": {
    "signupgenius": {
      "command": "npx",
      "args": ["-y", "signupgenius-mcp"],
      "env": {
        "SIGNUPGENIUS_EMAIL": "you@example.com",
        "SIGNUPGENIUS_PASSWORD": "your-password"
      }
    }
  }
}
```

### Mode 3 — Pro API key (required for slot reports)

The three `signupgenius_report_*` tools that list filled / available / all participants for a given sign-up only work against the documented Pro v2 API. Get a key from **Pro Tools → API Management** in your SignUpGenius dashboard (Pro subscription required), then:

```json
"env": { "SIGNUPGENIUS_USER_KEY": "your-api-key" }
```

Modes can be combined; Pro key wins where it applies, session/fetchproxy handles everything else.

## Tools

### Profile

- **`signupgenius_get_profile`** — Your own profile (name, email, account type).

### Groups

- **`signupgenius_list_groups`** — Every group you own or belong to.
- **`signupgenius_list_group_members`** — Members of one of your groups.
- **`signupgenius_get_group_member`** — One member's full record.
- **`signupgenius_add_group_member`** *(write)* — Add a person to one of your groups (they may start receiving the group's invitations). Same confirmation as the other writes: a client that can show a prompt gets one (unless the server sets `MCP_CONFIRM_ELICITATION=off`); otherwise the first call adds nothing and returns a preview plus a `confirmToken` — show it to the user, then repeat the call with the same arguments plus `confirmToken`.

### Sign-ups — created by you

- **`signupgenius_list_created_active`** — Sign-ups you've created that are still open.
- **`signupgenius_list_created_expired`** — Sign-ups you've created that have ended.
- **`signupgenius_list_created_all`** — Both active and expired in one call.

### Sign-ups — others'

- **`signupgenius_list_invited`** — Sign-ups you've been invited to.
- **`signupgenius_list_signedupfor`** — Sign-ups you've taken a slot on. (Session-mode also includes the bonus `signupgenius_legacy_get_my_signups` which calls the same backend the SignUpGenius web wizard uses and sometimes returns fuller data.)
- **`signupgenius_legacy_get_my_signups`** *(session only)* — Bonus richer "what am I signed up for" lookup.

### Public sign-up

- **`signupgenius_get_public_signup`** — Sheet metadata by URL or slug: title, description, organizer, category, timezone, and the custom questions a sign-up must answer. **No auth required.** Metadata only — it carries no slots.
- **`signupgenius_list_slots`** — Every slot on ANY public sign-up: date, day of week, start/end time, title, location, capacity, filled vs available, and who has signed up (with the number of spots each entry consumes). **No auth required**, and it works on sheets the user did not create. Reach for this first for "what's still open" — the report tools below cannot answer it for someone else's sheet.
- **`signupgenius_rsvp`** *(write)* — RSVP yes/no/maybe to a headcount (Yes/No/Maybe) sheet. Never writes on the first call: a client that can show a prompt gets one (unless the server sets `MCP_CONFIRM_ELICITATION=off`); otherwise you get a preview plus a `confirmToken` — show the preview to the user and, only after they approve, repeat the call with the same arguments plus `confirmToken`. Responds as the signed-in account unless you pass `firstname`/`lastname`/`email` (see *Who a sign-up is for* below). Not for slot-based sheets.
- **`signupgenius_claim_slot`** *(write)* — Sign up for a slot on a slot-based sheet. The first call writes nothing and returns a preview of the sheet, slot and identity (plus a `confirmToken` when the client cannot show a prompt, or when the server sets `MCP_CONFIRM_ELICITATION=off`); show it to the user, then repeat the call with the same arguments plus `confirmToken`. Pass the sheet's required custom fields (read them from `signupgenius_get_public_signup`). Signs up as the signed-in account unless you pass `firstname`/`lastname`/`email` (see *Who a sign-up is for* below).
- **`signupgenius_release_slot`** *(write)* — Give up a slot the user signed up for. Same two-step confirmation as above. Takes `item_member_id` **and** `slotitemid` from the same `signupgenius_list_slots` row; it only ever withdraws the signed-in user's own entry and refuses anyone else's.

### Reports — slots for a sign-up (Pro key only, **owner-scoped**)

- **`signupgenius_report_all`** — Every slot + participant on a sign-up.
- **`signupgenius_report_filled`** — Filled slots only.
- **`signupgenius_report_available`** — Available slots only.

These need `SIGNUPGENIUS_USER_KEY` **and** answer only for sign-ups the key holder created — a Pro key is not a workaround for someone else's sheet. Use `signupgenius_list_slots` for availability *and* participant names on any sheet; the reports add only what it cannot carry: custom-question answers.

Outside key mode these fail fast with a `KeyModeRequiredError` naming the tool, the mode required and the mode in effect, and instructing the user to set `SIGNUPGENIUS_USER_KEY`.

## Who a sign-up is for

`signupgenius_claim_slot` and `signupgenius_rsvp` default the name and email to the signed-in account's profile. Omit `firstname`, `lastname` and `email` when the user is signing up themselves, which is the usual case. Pass them only when the user asks to sign up someone else, such as a spouse or child. The tool allows that, but the preview then shows `identityDiffersFromAccount: true` and an `identityNote` naming both people. Point this out to the user before they confirm, because the entry stays tied to their account. Every preview's `identity` block shows the name and email that will be sent, and `source` says whether they came from the `account`, were `supplied`, or were `mixed`. The confirm token is bound to that identity, so changing it after the preview means previewing again.

## Trigger examples

- "Check SignUpGenius — what am I signed up for this week?" → `signupgenius_list_signedupfor` (+ `_legacy_get_my_signups` in session mode)
- "What slots are still open on the PTA potluck sign-up?" → `signupgenius_list_slots` (no auth, works on anyone's sheet)
- "Who signed up for which slot on MY potluck?" → `signupgenius_report_all` (Pro key, own sheets only)
- "List my SignUpGenius groups" → `signupgenius_list_groups`
- "Add Jordan Smith (<jordan@example.com>) to my Scouts group" → `signupgenius_add_group_member`
- "What sign-ups have I created that are still active?" → `signupgenius_list_created_active`
- "RSVP me to slot 3 on this SignUpGenius link" → `signupgenius_rsvp`

## Gotchas

- **Reports require Pro.** `signupgenius_report_*` only work with `SIGNUPGENIUS_USER_KEY` — session/fetchproxy users get a clear error pointing at the key.
- **SSO accounts not supported.** Session mode is direct email/password only — no Google/Apple/Facebook/Microsoft SSO, no 2FA. Use fetchproxy mode instead if your account uses SSO.
- **Session listings collapse.** In session mode the v3 `signups/created` endpoint returns active + expired in one paginated call — the three `list_created_*` tools all hit the same endpoint and filter client-side. Pro key mode has separate endpoints and exposes the real distinction.
- **Write surface is small.** Only `signupgenius_add_group_member`, `signupgenius_rsvp`, `signupgenius_claim_slot` and `signupgenius_release_slot` mutate, all behind the confirmation gate; everything else is read-only.
- **ToS caveat.** SignUpGenius's terms generally prohibit scripted/automated access. Personal-account, personal-scale use is the intended audience; running this against accounts you don't own or at scale is your problem.
