remind-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@remind-mcpcheck my unread Remind messages and classes"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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"] }
}
}Related MCP server: Classroom 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 |
| no | Captured |
| no | Captured |
| no | fetchproxy bridge concentrator port (default |
| no | Where the captured session is cached. Defaults to |
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.
The cache is bounded: analytics and consent cookies are dropped from the jar before it is used or
stored, the record is bound to the Remind account (me.uuid) it authenticated as when captured —
a restored session that answers as a different account, or as none, is discarded and re-captured —
and it is re-captured from the browser after at most 7 days. An env-supplied session is never
restored from the cache.
Tools
Tool | |
| The signed-in account. |
| Classes and chats with unread counts — start here, it yields the uuids. |
| Full class detail by uuid. |
| Conversation streams and their permissions ( |
| Messages in a chat stream. |
| Preferences and delivery devices. |
| Enable/disable delivery devices. Asks you to confirm first. |
| Send to a chat or class. Asks you to confirm first. |
| Arbitrary read-only GraphQL; introspection is enabled. Mutations refused. |
| Verify the session still authenticates. |
Confirmations
Write tools ask you to confirm before anything is sent. A client that can show a confirmation
prompt (Claude Code) shows one. Otherwise the first call makes no network call and returns a
preview of the exact payload plus a confirmToken; only a repeat call with that token (and the
same arguments) performs the write. A token works once, and changing any argument between the
two calls voids it.
variable | default | |
|
| What a write does on a client that cannot show a confirmation prompt (claude.ai, Claude Desktop). |
|
| How long a token stays valid. |
| random per process | Signing key; set it only if tokens must survive a server restart. |
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:coverageLicense
MIT
Available Tools
10 toolsremind_get_classesARead-onlyIdempotent
Get full detail for one or more classes by uuid: name, join code/url, member and message counts, owner count, history and messaging flags, and what this account may edit.
| Name | Required | Description | Default |
|---|---|---|---|
| uuids | Yes | Class uuids, from remind_list_entities. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds real value beyond that by disclosing the shape of the payload (join code/url, member/message/owner counts, history and messaging flags) and permission-scoped output ('what this account may edit').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence with the verb and resource front-loaded and the field list trailing. Every clause earns its place, though the field enumeration is long and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, single-parameter getter with no output schema, the description's return-field enumeration compensates well for the missing output schema. Only the lack of explicit routing against remind_list_entities keeps it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage, so the schema already documents the uuid array and its provenance. The description adds no format or sourcing detail beyond 'by uuid', which is the expected baseline when schema coverage is complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get full detail for one or more classes by uuid') and enumerates the returned fields, so an agent knows exactly what it gets. It does not explicitly name the sibling remind_list_entities as the source of uuids (only the schema does), so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'by uuid' implies this is a follow-up lookup rather than a discovery call, and the schema notes uuids come 'from remind_list_entities', but the description itself gives no explicit when-to-use or when-not-to-use guidance versus remind_list_entities or remind_list_chats.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remind_get_messagesARead-onlyIdempotent
Read messages in one or more chat streams, newest-last. Items are typed: MessageItem (a real message with sender, body and attachments), SystemMessageItem (joins, stream creation) or GapItem (a paging gap of size unloaded messages).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max non-gap messages per stream. | |
| uuids | Yes | Chat stream uuids, from remind_list_chats. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this as a safe, idempotent read. The description adds useful behavior beyond that: result ordering is 'newest-last' and returned items are typed as MessageItem, SystemMessageItem, or GapItem, including the paging-gap semantics. It does not detail pagination limits or attachment shape, but the added context is substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then adds the item-type taxonomy in a compact second sentence. It is appropriately sized and wastes little space, though the parenthetical item definitions make it slightly denser than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description partially compensates by describing return item types and ordering. It remains incomplete on deeper pagination behavior and attachment fields, but for a read tool with complete annotations and a fully documented input schema, it gives an agent enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters, including the uuids source and the limit's meaning. The description adds no parameter-level detail beyond restating 'one or more chat streams,' so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: 'Read messages in one or more chat streams,' and adds scope via 'newest-last.' It clearly distinguishes the tool from write siblings like remind_send_message, though it does not name alternatives explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'Read messages in one or more chat streams,' but there is no explicit when-to-use guidance, when-not-to-use guidance, or named alternative. The schema points to remind_list_chats for uuids, but the description itself does not route the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remind_get_notification_settingsARead-onlyIdempotent
Get notification settings: reply/announcement-copy/incoming-call preferences plus every registered delivery device (email, sms, apns) with its enabled state. The canManage* flags say which preferences this account is actually allowed to change — a subscriber account cannot change most.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, idempotent operation, so the bar is lower. The description still adds meaningful behavior beyond annotations by explaining the `canManage*` flags and the subscriber-account limitation on changes, which is real permission context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences that front-load the resource and its contents, then add the permission caveat. Every clause is informative and nothing is repeated from structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema but zero parameters, the description carries the full burden of explaining the return shape, and it does so by naming the preference categories and device types returned. The permission semantics round out what an agent needs to interpret the response correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There are no parameter names or formats to clarify, and the description correctly does not waste space on non-existent inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (notification settings), and enumerates the exact sub-settings returned (reply/announcement-copy/incoming-call preferences, delivery devices). It does not explicitly contrast itself with the sibling `remind_set_notification_devices`, so it stops short of the sibling-differentiation bar for a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never states when to call this tool versus alternatives such as `remind_set_notification_devices`, nor does it give any prerequisite or timing guidance. Usage is only implied by the verb 'Get', which is not enough for a 3.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remind_graphqlARead-only
Run an arbitrary READ-ONLY GraphQL query against Remind's API. Introspection is enabled, so { __schema { ... } } and { __type(name:"Class") { fields { name } } } work for discovering fields the typed tools do not expose. Mutations are rejected — use the write tools, which preview the change and ask you to confirm first. Note: Remind reports an unknown field as a 500-backed GRAPHQL_VALIDATION_FAILED, not a field error.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | A GraphQL query document. | |
| variables | No | Variables for the document. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses three non-obvious behaviors: introspection is enabled, mutations are rejected, and unknown fields surface as a 500-backed GRAPHQL_VALIDATION_FAILED rather than a normal field error. The error-shape warning is exactly the kind of operational detail annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core capability, then the introspection affordance, then the write-boundary and error caveat. Every sentence carries a distinct operational fact and none is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a raw-query escape hatch whose return shape is defined by the caller's own query, the definition covers the constraints an agent needs: read-only scope, introspection availability, the write alternative, and the unusual error semantics. No output schema is required since responses are arbitrary by design.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (query, variables) are documented in the schema, so baseline 3 applies. The description adds GraphQL syntax examples for the query string, but nothing about how variables bind to the document, so it is largely redundant with the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run an arbitrary READ-ONLY GraphQL query against Remind's API') and immediately differentiates from the typed sibling tools by noting it reaches fields 'the typed tools do not expose'. An agent can distinguish this escape hatch from remind_get_classes, remind_list_chats, etc. without reading any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly scopes when to use it (introspection-based field discovery) and when not to (mutations are rejected), directing writes to the write tools and noting those preview and confirm. The alternative path is named, not left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remind_healthcheckARead-onlyIdempotent
Verify the Remind session end-to-end by running the smallest authenticated query. Reports whether the captured browser session still authenticates.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description still adds real behavioral value by disclosing the mechanism (an actual authenticated query against the live session) and the reported outcome (auth still valid or not), which is not in the annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and followed by the reported result. No filler, no repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, annotated, no-output-schema healthcheck, the description covers what it does and what it reports. A minor gap is that it does not say what the agent should do on failure (e.g., re-auth flow), but nothing essential to invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There is nothing for the description to clarify or compensate for, and it does not add any misleading param behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Verify the Remind session', 'healthcheck via smallest authenticated query') and explains the outcome it reports. It is readily distinguishable from sibling tools like remind_graphql or remind_list_chats, which perform real work rather than a connectivity/auth probe.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the usage context clear ('verify the session end-to-end', 'whether the captured browser session still authenticates'), which implies running it before/after other Remind calls when auth is in doubt. It does not, however, name explicit alternatives or state when not to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remind_list_chatsARead-onlyIdempotent
List conversation streams with unread counts, member counts, last-updated time and the per-stream permissions (notably canSend). Filter to specific uuids, a class, or a search string.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Search chats by participant/title. | |
| uuids | No | Restrict to these chat stream uuids. | |
| class_id | No | Numeric class id to scope chats to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds genuinely useful behavior the annotations do not: the payload includes unread counts, member counts, last-updated timestamps and per-stream permissions such as canSend, which is valuable given no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero filler; the resource and its returned fields come first, followed by the filtering options. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates what comes back, and the read-only/idempotent annotations mean no mutation caveats are needed. It falls slightly short on ordering, pagination, and the default behavior when no filter is supplied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (query, uuids, class_id) are already documented in the schema. The description only echoes those filters in prose and adds no syntax, matching behavior, or precedence rules, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List conversation streams') and even enumerates the salient return fields (unread counts, member counts, last-updated, per-stream permissions). It is clearly distinct from remind_get_messages or remind_send_message, though it never names a sibling to route against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence ('Filter to specific uuids, a class, or a search string') implies when to narrow results, but it merely restates the three schema parameters rather than saying when to prefer this tool over remind_get_messages or remind_list_entities. No exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remind_list_entitiesARead-onlyIdempotent
List everything in the Remind sidebar — classes and chats — as the app itself renders it, with unread counts. This is the entry point: it yields the uuids the other tools take. Optionally filter with a search query, and page with the returned cursor.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Filter by name. | |
| cursor | No | `cursor` from a previous call, to page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds useful context beyond that: results include unread counts, mirror the app's rendering, expose uuids for downstream tools, and support cursor paging.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with zero waste; the core purpose and entry-point role are front-loaded before the filtering and paging notes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description covers the essentials an agent needs: what is returned (classes, chats, unread counts), that uuids feed other tools, and how to page. A little more on return ordering or result size would make it fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the schema already documents both parameters. The description reiterates the query filter and cursor paging in prose without adding format, syntax, or edge-case detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ("List everything in the Remind sidebar — classes and chats") and clarifies scope ("as the app itself renders it, with unread counts"). It implicitly distinguishes itself from siblings like remind_get_classes and remind_list_chats by being the combined entry point.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"This is the entry point: it yields the uuids the other tools take" gives clear when-to-use context and explains its role relative to the other tools. It stops short of explicit exclusions (e.g., when to prefer remind_get_classes or remind_list_chats directly).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remind_meARead-onlyIdempotent
Get the signed-in Remind account: uuid, name, email, locale, admin/child flags and sign-in count.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds genuine value beyond that by disclosing the returned fields (uuid, name, email, locale, admin/child flags, sign-in count), which is important since there is no output schema. It stops short of mentioning auth requirements or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence that front-loads the action and resource, then lists return fields without waste. Every clause earns its place and nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of telling the agent what comes back, and it does so with a concrete field list. It is nearly complete for a zero-parameter read, though it omits any mention of error behavior or whether the response is a single object.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, which is the baseline 4 case; there is nothing for the description to clarify and it correctly avoids inventing parameter guidance. It stays focused on the resource rather than padding with irrelevant input detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Get') and resource ('the signed-in Remind account') and even enumerates the fields returned, which is far more informative than the ambiguous tool name 'remind_me' suggests. It does not explicitly contrast itself with siblings like remind_get_classes or remind_graphql, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus the many sibling read tools, no prerequisites, and no exclusions. The phrase 'signed-in' hints that it returns the current user's own profile, but the agent must infer that this is the tool for identity/account context rather than anything explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remind_send_messageADestructive
Send a message to a chat stream or class. Delivers to real people and CANNOT be unsent. Nothing is sent until confirmed; the preview shows the exact payload. Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call returns a preview and a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE). Check permissions.canSend on the target first (remind_list_chats).
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Message text. | |
| urgent | No | Send as an urgent message. | |
| confirmToken | No | ONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 "confirmation-required" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation. | |
| recipient_type | No | `chat` for a conversation stream, `group` for a whole class. | chat |
| recipient_uuid | Yes | Chat stream uuid, or class uuid. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint=true annotation by disclosing that the action CANNOT be unsent, that nothing is sent until confirmed, that a preview shows the exact payload, and how the two-step confirmToken fallback works. This is exactly the kind of irreversibility and auth/permission context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and the irreversibility warning, then layers the confirmation mechanics and the permission prerequisite. Every sentence carries functional information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive send tool with no output schema, the description covers the confirmation protocol, the non-reversibility, the token fallback, and the pre-flight permission check. Nothing an agent needs to invoke this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents body, urgent, recipient_type, recipient_uuid and the confirmToken contract in detail. The description adds the permission pre-check context for the recipient but no additional parameter syntax or semantics beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Send a message to a chat stream or class') plus the delivery target distinction. It effectively separates itself from read-oriented siblings such as remind_get_messages by making clear this is an outbound send to real people.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit prerequisites and sequencing: check `permissions.canSend` on the target first (via remind_list_chats), then confirm before sending. It also names the fallback path (confirmToken) and the MCP_CONFIRM_MODE condition that selects between confirmation mechanisms.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remind_set_notification_devicesA
Enable or disable notification delivery devices by id (from remind_get_notification_settings). Nothing is sent until confirmed; the preview shows the exact mutation input. Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call returns a preview and a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE).
| Name | Required | Description | Default |
|---|---|---|---|
| enable | No | Device ids to enable. | |
| disable | No | Device ids to disable. | |
| confirmToken | No | ONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 "confirmation-required" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare only readOnlyHint=false and destructiveHint=false; the description adds substantial behavior beyond that — the preview of the exact mutation input, the no-op-until-confirmed guarantee, and the two-phase confirmToken protocol with explicit prohibitions (never on first call, never invented, never reused).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and the id source, then layers the confirmation semantics. Dense but every clause carries a constraint; the parenthetical mode reference is the only slight compression cost, keeping it just short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-param toggle with no output schema, the description covers the full call lifecycle: id sourcing, preview behavior, both confirmation routes, and token handling. An agent has everything needed to invoke it correctly on the first attempt.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds framing the schema cannot: that confirmToken belongs only to the elicitation-less fallback, must be supplied with identical arguments on the second call, and is ignored when elicitation exists. That meaningfully shapes how the parameter is used rather than merely restating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (enable/disable) and resource (notification delivery devices), keyed by id, and names the sibling tool (remind_get_notification_settings) where those ids come from. An agent can distinguish it from peers like remind_get_notification_settings or remind_send_message at a glance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent where to obtain the device ids, that nothing is sent until confirmed, and gives the two alternative confirmation paths (native prompt vs. preview + confirmToken retry). The conditional 'otherwise' clause names the fallback and the governing mode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v1.2.1- First observed
remind_get_classes - First observed
remind_get_messages - First observed
remind_get_notification_settings - First observed
remind_graphql - First observed
remind_healthcheck - First observed
remind_list_chats - First observed
remind_list_entities - First observed
remind_me - First observed
remind_send_message - First observed
remind_set_notification_devices
TDQS
Scored across 10 tools
Most tools target a distinct resource+action, and descriptions clarify roles (list_entities as the entry point, get_classes for detail, list_chats for streams). There is mild overlap between remind_list_entities and remind_list_chats (entities already includes chats), and remind_me vs remind_healthcheck both touch the session, but the descriptions resolve these boundaries.
All tools share a consistent remind_ prefix and predominantly follow verb_noun (get_classes, list_chats, send_message, set_notification_devices). Minor deviations like remind_me and remind_healthcheck/remind_graphql (noun-only) are readable and don't break the pattern.
Ten tools is well within the ideal range and each earns its place: identity, settings, entity/class/chat/message reads, a write, and a read-only GraphQL escape hatch. Nothing looks redundant or padded.
Core read and messaging workflows are covered (account, settings, entities, classes, chats, messages, send), and the read-only GraphQL tool provides a discovery fallback for unexposed fields. There are minor gaps around write operations like creating/editing classes or marking messages read, but agents can largely work around them.
Maintenance
Related MCP Connectors
Messaging tools for AI agents: send messages, manage chats, groups and channels.
Read email/chat conversations, messages, contacts and teams; draft, send and update threads.
Carbon Voice MCP serves as a bridge that connects AI assistants like ChatGPT, Claude, and Cursor to a user's Carbon Voice account, turning voice messages and conversations into a private, on-demand knowledge base. It provides 28 specialized tools for comprehensive voice messaging management, including creating and sending messages, accessing conversation history with instant transcription, running AI actions (summarization, TLDR generation, meeting notes), and managing workspace collaboration through folders, contacts, and team communications.
- mcpOAuthcom.vibgrate
Query your team's drift, vulnerability, and upgrade data from any AI assistant. OAuth 2.1, 51 tools.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables Claude to access ParentSquare school-parent communication platform, including feeds, calendar, conversations, and media files.4832 PyPI9MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to operate Google Classroom, letting users list courses and students, check assignment submissions, and create coursework and announcements through natural language.-
- AlicenseAqualityAmaintenanceEnables AI agents to query and manage EduPage school accounts, including timetables, grades, homework, meals, messages, multi-school discovery, role-aware student switching, and 2FA login.29278 PyPI1MIT
- AlicenseAqualityFmaintenanceEnables Claude to access the ParentSquare school-parent communication platform via its web interface and internal APIs, covering parent features like feeds, calendars, messages, forms, and payments, plus school admin roster management such as students, guardians, classes, and staff.481MIT