Cabinet Assistant MCP connector
README.md
# Cabinet Assistant — MCP connector
A small, **standalone, detachable** remote-MCP service that gives Dr Amraoui's Claude a short menu of
one-call actions over the cabinet's **Notion** (tasks + cases) and **Supabase** (fast reads).
It **never touches the cockpit web app** — same databases, same field mappings, separate service.
Google Calendar stays on **Claude's own Google Calendar connector**; this service only returns the
event ids to create/update/delete, and stores them back on the task (`link_event`).
## What it exposes (16 tools)
**Reads (instant, from Supabase):** `list_my_day`, `list_team_tasks`, `list_cases`, `find_patient`, `find_staff`
**Task writes (preview → confirm):** `add_personal_task` (private), `add_clinic_task`, `edit_task`,
`reschedule_task`, `complete_task`, `assign_task`, plus `link_event` (mechanical).
**Cases (preview → confirm):** `add_case` (+ auto triage task, web-app parity), `assign_case`, `verify_case`, `set_report_status`.
Every write returns a **confirm_token** first (nothing is saved); it only writes when called again
with that token. Single-use token = confirmation enforced + idempotent.
## Environment (`.env.local`, same values as the cockpit)
| Var | Meaning |
|---|---|
| `NOTION_TOKEN` | cockpit Notion integration (already shared with the DBs) |
| `SUPABASE_URL`, `SUPABASE_SERVICE_ROLE_KEY` | same Supabase project |
| `MCP_SECRET` | long random string; the endpoint is `/mcp/<MCP_SECRET>` |
| `OWNER_PERSONNEL_ID` | optional; else resolved from `app_members.is_owner` |
## Run locally
```bash
npm install
npm start # http://localhost:8787/health
node test/smoke.mjs # end-to-end MCP test (handshake, read, preview→commit, guard, cleanup)
node test/smoke2.mjs # clinic delegation + case (dossier + triage) parity
```
## Deploy on Render (free)
Repo: https://github.com/Esubalew-kunta/MCP (the connector is at the repo root).
1. Render → **New → Web Service** → connect this GitHub repo.
2. Root Directory = **(blank / repo root)**, Build `npm install`, Start `npm start`, Health check `/health`, Plan **Free**.
3. Add the env vars above (values from the cockpit's `.env.local`).
4. Deploy. Your MCP URL is: `https://<service>.onrender.com/mcp/<MCP_SECRET>`
## Keep it awake (free tier sleeps after 15 min)
Point a free pinger at `GET https://<service>.onrender.com/health` every ~4 min:
**cron-job.org**, **UptimeRobot**, or an **n8n** Schedule → HTTP Request node.
## Connect in her Claude
Claude → Settings → **Connectors → Add custom connector** → paste the full MCP URL (with the secret).
Works in the **mobile app** too. Then a normal chat can create/assign/edit tasks & cases by voice.
## Move to her VPS later
Deploy the same folder on the VPS (`npm install && npm start` behind HTTPS), repoint the connector URL.
## Detach (remove entirely)
1. Remove the connector in her Claude settings.
2. Suspend/delete the Render service.
→ Cockpit, web app, Notion, calendar all unaffected. Nothing to clean up.
## Security notes (pilot vs production)
- Pilot auth = **capability URL** (secret path). Good for a private demo on an obscure URL.
- Before real patients: put it behind **OAuth**, rotate `MCP_SECRET`, restrict egress. No PHI is stored here.
This server cannot be deployed
Maintenance
ActivityStale
ResponsivenessNo issues