Back to the catalog

io.github.chrischall/remind-mcp

Read Remind classes, chats and messages, and manage notification settings.

Open source Open in the app JSON README (API)

About

Read Remind classes, chats and messages, and manage notification settings.

Details

Kind
MCP servers
Topic
No topic detected
Publisher
chrischall
Origin
official
Category
ferramentas
Transport
local
Version
0.4.0
Last push
2026-09-04T22:19:40Z
Repository state
ativo
Language
TypeScript
License
MIT
Added
2026-08-29 03:02:34
Updated
2026-09-04 23:00:30
Origin id
io.github.chrischall/remind-mcp

README

# remind-mcp

MCP server for [Remind](https://www.remind.com) — 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

```bash
npx -y @chrischall/remind-mcp
```

```json
{
  "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.md` is the capture log.

## Development

```bash
npm install && npm run build && npm test
npm run test:coverage
```

## License

MIT

More