Skip to main content
Glama
README.md
# procare-mcp

**First MCP server for the Procare Connect API** — talk to your child care center data from Claude, Cursor, or any MCP client.

Procare is the leading child care management platform used by **30,000+ daycare centers, preschools, and before/after-school programs** in the US. The public Connect API is documented at <https://api-docs.procareconnect.com/> and powers the Procare Online + SchoolCare Works products. This server wraps that API in the [Model Context Protocol](https://modelcontextprotocol.io) so you can ask your AI agent questions like "which children at school 1234 were absent on Monday?" or "what's the balance on family 555?" — without hand-rolling a REST client.

## What you can do with it

```
You:   "Pull the attendance log for school 1234 for last week and tell me
        which kids had 3+ absences."
Claude: *calls list_schools, then list_attendance with school_id+date_from
        +date_to, summarises the result*

You:   "Show me the enrollment roster for the summer camp at our
        Westside location."
Claude: *calls list_programs then list_registrations with school_id +
        program_id filters*

You:   "What's the outstanding balance for family 555?"
Claude: *calls get_family, returns the balance_cents field with a
        human-readable summary*
```

## Install

```bash
pip install -e .
```

## Configure

Procare uses OAuth 2 `client_credentials` against your **tenant subdomain**, not a shared host. Find your subdomain by looking at the URL of the Procare dashboard you log into — it'll be `https://<your-subdomain>.procareconnect.com`. Your Procare account admin can mint a `client_id` / `client_secret` pair with API access enabled.

```bash
export PROCARE_BASE_URL="https://<your-subdomain>.procareconnect.com"
export PROCARE_CLIENT_ID="..."
export PROCARE_CLIENT_SECRET="..."
```

### Who uses this?

1. **Child care center owners and operators** who want to query their data via Claude / Cursor without building a custom integration.
2. **Multi-location operators** (5+ centers) who need to roll up attendance, payments, and enrollment across the enterprise.
3. **API Partners** building tools on top of Procare.

If you don't have API credentials yet, contact your Procare account manager or open a ticket with [Procare support](https://www.procaresupport.com/).

## Use with Claude Desktop

Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or the equivalent path on Windows / Linux:

```json
{
  "mcpServers": {
    "procare-mcp": {
      "command": "procare_mcp",
      "env": {
        "PROCARE_BASE_URL": "https://your-subdomain.procareconnect.com",
        "PROCARE_CLIENT_ID": "your-client-id",
        "PROCARE_CLIENT_SECRET": "your-client-secret"
      }
    }
  }
}
```

## Use with Claude Code

```bash
claude mcp add procare-mcp -- procare_mcp \
  --env PROCARE_BASE_URL=https://your-subdomain.procareconnect.com \
  --env PROCARE_CLIENT_ID=your-client-id \
  --env PROCARE_CLIENT_SECRET=your-client-secret
```

## Tools

| Tool | Type | What it does |
| --- | --- | --- |
| `health_check` | Diagnostic | Verifies credentials by listing schools (counts them) |
| `list_schools` | Read | All schools/locations in the enterprise account |
| `get_school` | Read | Single school by id |
| `list_children` | Read | Children, filterable by school_id / paginated via offset+limit |
| `get_child` | Read | Single child by id (allergies, schedule, classroom) |
| `list_families` | Read | Families (households), filterable by school_id / paginated |
| `get_family` | Read | Single family by id (guardians, children, contacts, balance) |
| `list_attendance` | Read | Attendance records, filterable by school / child / date range |
| `list_programs` | Read | Programs (camps, preschool, after-school), filterable by school / active |
| `get_program` | Read | Single program by id (description, schedule, capacity, fee) |
| `list_registrations` | Read | Enrollments, filterable by program / child / school |
| `list_payments` | Read | Payments, filterable by family / school / date range |
| `list_staff` | Read | Staff members, filterable by school / active flag |
| `get_staff_member` | Read | Single staff member by id |
| `list_classrooms` | Read | Classrooms, filterable by school |
| `get_classroom` | Read | Single classroom by id (capacity, age range, lead teacher) |

The read-only cut covers every endpoint exposed by the Connect API that the v0.1 surface needs. Write tools (check-in, check-out, create registration) will land in a follow-up once the upstream write contract is stable across Procare Online and SchoolCare Works.

## Engineering

This server follows the industry-leading patterns baked into [`mcp-vertical-template`](https://github.com/sanjibani/mcp-vertical-template):

- **Shared `httpx.AsyncClient`** with connection pooling and transport-level retries
- **OAuth 2 `client_credentials`** with proactive refresh (5-min buffer) and an `asyncio.Lock` to serialize concurrent refreshes
- **Typed exception hierarchy** (`ProcareAuthError`, `ProcareNotFoundError`, `ProcareRateLimitError`, `ProcareAPIError`, `ProcareConnectionError`) with structured fields (`http_status`, `error_code`, `request_id`, `retry_after`)
- **Dispatch table** for HTTP status → exception (no `if/elif` chains)
- **Application-level retry** with exponential backoff + full jitter on 429/5xx, honoring `Retry-After`
- **Single 401 retry** that force-refreshes the OAuth token (handles server-side revocation)
- **JSONL audit logging** per tool call (stderr default, `PROCARE_AUDIT_LOG` env var override) with secret redaction
- **Bare `raise` inside MCP tool handlers** — `isError=true` on the wire, per the [Blackwell MCP security audit](https://www.blackwell.systems) baseline
- **`respx` mocks + `hypothesis` property tests** (no live API in CI)
- **`ruff` full rule set + `mypy --strict`**
- **CI matrix** on Python 3.10-3.13 × Ubuntu/macOS/Windows

## Development

```bash
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest -v
procare_mcp
```

## License

MIT.

## See also

- [Model Context Protocol spec](https://modelcontextprotocol.io)
- [MCP Python SDK](https://github.com/modelcontextprotocol/python-sdk)
- [Procare developer docs](https://api-docs.procareconnect.com/)
- [awesome-mcp-servers](https://github.com/punkpeye/awesome-mcp-servers)
- [Other vertical MCPs in the same portfolio](https://github.com/sanjibani?q=-mcp)
- [Custom MCP engagements](https://sanjibani.github.io/mcp-services/)

TDQS

A4/5.0

Scored across 16 tools

Disambiguation5/5

Each tool has a clear, distinct purpose: singular get_* for individual records, plural list_* for collections, and health_check for auth verification. No two tools overlap in functionality.

Naming Consistency5/5

All tools follow a consistent verb_noun snake_case pattern (e.g., get_child, list_schools). The only outlier is health_check, which still follows verb_noun and is standard for such tools.

Tool Count5/5

16 tools cover the major entities (children, classrooms, families, programs, schools, staff, attendance, payments, registrations) without being excessive. The number is well-scoped for a child care management API.

Completeness2/5

The tool set is entirely read-only (get and list only). No create, update, or delete operations exist for any entity, which is a significant gap for typical CRUD workflows and will cause agent failures when mutation is needed.

Maintenance

ActivityStale
ResponsivenessNo issues