remind-mcp
MCP server for Remind — read your classes, chats and messages, and manage notification settings.
This project was developed and is maintained by AI. Use at your own discretion.
Remind exposes a single GraphQL endpoint that is reachable server-side, so only the credential needs a browser: the session is lifted once from a signed-in tab through the fetchproxy bridge, and every request after that is a plain server-side fetch.
Install
npx -y @chrischall/remind-mcp
{
"mcpServers": {
"remind": { "command": "npx", "args": ["-y", "@chrischall/remind-mcp"] }
}
}
Authentication
Two headers are captured from a signed-in remind.com tab: the full Cookie header and the
x-csrf-token value. Either let the bridge capture them (needs the Transporter Chrome
extension and a signed-in tab), or supply them yourself:
| Variable | Required | Description |
|---|---|---|
REMIND_COOKIE | no | Captured Cookie request header. Skips the bridge when set with the next one. |
REMIND_CSRF_TOKEN | no | Captured x-csrf-token value. |
REMIND_WS_PORT | no | fetchproxy bridge concentrator port (default 37149). |
REMIND_SESSION_FILE | no | Where the captured session is cached. Defaults to $MCP_DATA_DIR/$HOME under .remind-mcp. |
The server boots without either, so a host's install-time tools/list probe succeeds; the
error surfaces on the first tool call instead.
The browser is needed once. A captured session is cached (mode 0600) and reused across
restarts, and every call after the bootstrap is a plain server-side fetch. This matters because
the capture completes only while the signed-in tab is actually issuing a /graphql request — so
without the cache, a restart would sit waiting unless you happened to be using Remind.
Tools
| Tool | |
|---|---|
remind_me | The signed-in account. |
remind_list_entities | Classes and chats with unread counts — start here, it yields the uuids. |
remind_get_classes | Full class detail by uuid. |
remind_list_chats | Conversation streams and their permissions (canSend). |
remind_get_messages | Messages in a chat stream. |
remind_get_notification_settings | Preferences and delivery devices. |
remind_set_notification_devices | Enable/disable delivery devices. Confirm-gated. |
remind_send_message | Send to a chat or class. Confirm-gated. |
remind_graphql | Arbitrary read-only GraphQL; introspection is enabled. Mutations refused. |
remind_healthcheck | Verify the session still authenticates. |
Write tools take confirm: true. Without it they make no network call and return a dry-run
preview of the exact payload.
Without the server
skills/remind-fpx/ is a shell-only skill covering the same read surface with fpx + curl —
no MCP process required.
Notes
- An expired session returns HTTP 200 with
errors[0].message = "Unauthorized"; the same string also means "your account may not do that" (scheduled messages are owner/teacher-only). - An unknown field reports as
Internal service error, not a field error — introspect rather than guess.docs/REMIND-API.mdis the capture log.
Development
npm install && npm run build && npm test
npm run test:coverage
License
MIT