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