Watch, inbox and reminder MCP tools
Reference for the MCP tools that create and manage watches, read the inbox and schedule one-time Slack reminders.
Eleven nima MCP tools cover two separate features. Watches tell a person when something happens to a signal, beacon, spec, pull request or tracker ticket, and the inbox lists what nima told them. Reminders save a one-time message to your own Slack DM at a time you choose. Every tool acts on the caller's own rows only. For the ideas behind both features, read Watches and reminders. For connecting a client, read the MCP server overview.
Watches: off until a workspace owner or admin turns them on. The switch is the triggersEnabled workspace setting, changed with PATCH /organizations/settings from a signed-in owner or admin session (no API key or MCP token can call it, and the admin panel has no control for it), or ask the nima team. Reminders: on for every workspace. They need only your Slack account linked in the workspace. See Availability of watch tools.
Watch, inbox and reminder tools at a glance
| Tool | What it does | Scope |
|---|---|---|
list_event_types | Lists the events a watch can react to | subscriptions:read |
create_subscription | Creates a watch | subscriptions:write |
update_subscription | Edits, resumes or clears conditions on your watch | subscriptions:write |
list_watches | Lists your watches | subscriptions:read |
unwatch | Pauses a watch | subscriptions:write |
get_inbox | Reads your inbox | inbox:read |
get_scheduling_context | Returns the time, a suggested timezone and whether Slack is linked | subscriptions:read |
schedule_message | Saves a one-time reminder | subscriptions:write |
list_scheduled_messages | Lists your reminders | subscriptions:read |
update_scheduled_message | Edits or reschedules a pending reminder | subscriptions:write |
cancel_scheduled_message | Cancels a pending reminder | subscriptions:write |
All three scopes are on the OAuth consent screen, so a default connection holds them. A tool answers 403 if the token lacks the scope. The same operations are available over HTTP: see Watches and Scheduled messages. The event history tool get_history needs signals:read and is documented in Pipeline MCP tools.
list_event_types tool
list_event_types returns the fixed catalog of events a watch can react to: 16 event types, each with its subject kind, a one-line description, whether it is material and a JSON Schema for its payload. Read it before creating a watch, because triggerTypes and payloadEquals are validated against it.
/v1/triggers/event-typessubscriptions:readMCP toollist_event_typesThe tool takes no input. The response is { subjectKinds, eventTypes }, and each entry of eventTypes carries type, subjectKind, description, material and payloadSchema. Subject kinds are signal, beacon, spec, pr and ticket. A material event can interrupt a person who was already told about the subject; pr.drift_checked does so only when the verdict is drifted on an open pull request. Non-material events about a subject you were already told about fold into the 09:00 digest (09:00 in your own timezone).
create_subscription tool
create_subscription saves a watch: when a listed event happens to one signal, beacon, spec or pull request, or to an item downstream of it, nima runs your saved instructions with fresh context and sends the answer to your inbox and Slack.
/v1/watchessubscriptions:writeMCP toolcreate_subscriptionscopestringuser (the default) watches one subject. org creates a workspace rule over tracker tickets. See Workspace rules.
subjectKindstringrequiredsignal, beacon, spec or pr (a tracker ticket id, for example from an inbox item, is also accepted). Required for a personal watch.
subjectIduuidrequiredThe id of the subject, from the list tools. Required for a personal watch.
triggerTypesstring[]requiredEvent types to react to, from list_event_types. At least one.
instructionsstringrequired1 to 4000 characters. What nima should analyze and answer when the event happens. Required for a personal watch.
namestring1 to 160 characters. A short title for the watch.
payloadEqualsobjectConditions. Every named payload field must equal the given string, number or boolean exactly. Every field must exist on every selected event type. Omit it to react to any occurrence.
contextstring1 to 8000 characters. Preferences to save for the future answer.
expiresAtISO datetimeWhen the watch expires. Must be in the future. null means no expiry.
The input is strict: unknown fields are rejected. The tool returns the watch with id, name, handler, payloadEquals, subjectKind, subjectId, triggerTypes, templateKey, createdVia, state, pausedReason, expiresAt, lastFiredAt, fireCount and createdAt.
A watch reacts to future changes only. Events that happened before the watch existed never fire it. A watch on a signal also hears events on the beacon, spec and pull request that signal flowed into. Conditions are exact equality only: there are no ranges, or, not, timers or topic subscriptions. A watch pins one existing subject.
Repeating an identical active request returns the existing watch instead of creating a second one, so the tool is idempotent.
| Status | When |
|---|---|
409 | Watches are not enabled for the workspace ("Subscriptions are not enabled for this workspace"). |
404 | The subject does not exist in your workspace ("Subscription subject not found"). |
400 | An event type is earlier in the pipeline than the watched subject (order: signal, beacon, spec, pr, ticket), so a watch on a spec cannot subscribe to beacon.ready. |
400 | payloadEquals names a field an event type does not have, or a value of the wrong type ("Unsupported event conditions"). |
400 | expiresAt is in the past. |
403 | The owner no longer holds read, update and AI-generation permissions in the workspace. |
Create a workspace rule with create_subscription
create_subscription with scope: "org" creates a workspace rule over every tracker ticket event instead of a watch on one subject. It needs an owner or admin (the integrations-management permission), watches on for the workspace and outbound dispatch on for the workspace. No MCP token or API key can create one today. The route needs subscriptions:write and a workspace rule also needs integrations:write, and no token holds both: a default OAuth connection and a key from Settings lack integrations:write, and the Slack /nima mcp-key integrations key holds only integrations:write. Create workspace rules with POST /v1/watches from a signed-in owner or admin session, or ask the nima team. The fields below describe that request.
An org rule takes no subjectKind or subjectId. triggerTypes may only be ticket.opened, ticket.assigned and ticket.comment_added. Send one handler:
{ "kind": "notify", "to": { "role": "assignee" }, "fallback": "owner" }withtemplateKey: "tracker_assignee_reminder".roleisowner,assignee,reporterorspec_owner.fallbackisownerornoneand defaults tonone.templateKeyis required for a notify rule.fallbackcan also go insideto.{ "kind": "agent", "instructions": "...", "tools": ["reply_on_ticket"], "maxActions": 1 }.instructionsis 1 to 4000 characters,contextis optional (1 to 8000), andmaxActionscan only be 1. An agent rule takes notemplateKey. A proposed reply waits for approval unless an owner or admin has set ticket replies toautofor an internal project and the asker is a verified workspace member. See Outbound actions.
mention on a notify handler is rejected ("mention is not supported yet"). Sending handler or templateKey without scope: "org" answers 400.
| Status | When |
|---|---|
403 | Any MCP token or API key: a default connection or Settings key lacks integrations:write, and the Slack integrations key lacks subscriptions:write. From a signed-in session: the caller is not an owner or admin. |
409 | Watches are off ("Subscriptions are not enabled for this workspace"), or outbound dispatch is off ("Outbound dispatch is not enabled for this workspace"). |
update_subscription tool
update_subscription changes one of your own conversational watches: its events, conditions, instructions, context or expiry, or resumes it. The subject cannot change, so create a new watch for a different subject.
/v1/watches/{id}subscriptions:writeMCP toolupdate_subscriptioniduuidrequiredThe watch id from list_watches.
triggerTypes, instructions, context, name, expiresAtfieldsSame limits as create_subscription. Send only what changes.
payloadEqualsobjectReplaces the conditions. Send {} to clear them.
statestringactive is the only accepted value: it resumes a paused or expired watch. To resume an expired watch, also send a new future expiresAt or null. To pause, use unwatch.
Only watches whose handler is an AI response can be edited. Automatic notification watches (created by a bell reaction, by promoting a beacon, or for the spec owner when a spec is written) and workspace rules answer 400 "Only conversational subscriptions can be edited". A resumed watch does not fire on events from its paused period.
| Status | When |
|---|---|
404 | The id is missing or belongs to someone else ("Watch not found"). |
409 | Resuming or editing would produce a definition identical to another active watch ("An identical subscription is already active"), or watches are off for the workspace. |
400 | The same validation errors as create_subscription. |
list_watches tool
list_watches returns your own watches, at most 200, with active ones first, then paused and expired ones, newest first within each group. It includes conversational watches, automatic notification watches and any workspace rules you created.
/v1/watchessubscriptions:readMCP toollist_watchesThe tool takes no input and has no pagination. There is no call that lists another person's watches: their ids answer 404. Each row has the same fields as the create_subscription response, including state (active, paused or expired), pausedReason, createdVia and fireCount.
unwatch tool
unwatch pauses one of your own watches by id and returns it as it now stands. Nothing is deleted, so past notifications stay explainable.
/v1/watches/{id}subscriptions:writeMCP toolunwatchiduuidrequiredThe watch id from list_watches.
The call returns HTTP 200 with the watch and state: "paused". Pausing an already paused or expired watch changes nothing. It also stops that watch's pending items in the 09:00 digest. Resume it with update_subscription and state: "active". Another person's id answers 404.
get_inbox tool
get_inbox returns your own nima inbox, newest first: everything nima has told you about what you watch, one item per notification.
/v1/inboxinbox:readMCP toolget_inboxpageintegerStarting at 1.
limitinteger1 to 100. Defaults to 20.
The response is a page (data and meta, see Pagination). Each item has id, kind, state, ruleId, subjectKind, subjectId, title, body, links, channel, deliveredAt, digestedAt and createdAt. channel says how the item reached you:
| Channel | Meaning |
|---|---|
slack_dm | Sent to you as a Slack direct message. |
digest | Folded into your 09:00 digest DM. |
inbox | Kept in the inbox only, for example because your Slack account is not linked. |
get_scheduling_context tool
get_scheduling_context returns the current time, a suggested timezone and whether your Slack account is linked. Call it before schedule_message.
/v1/scheduled-messages/contextsubscriptions:readMCP toolget_scheduling_contextThe tool takes no input and returns now (ISO 8601 UTC), suggestedTimeZone, slackConnected and guidance. The suggestion is your Slack profile timezone, or UTC when that cannot be read. It is only a suggestion, so confirm the timezone with the person before scheduling.
schedule_message tool
schedule_message saves a one-time message to your own linked Slack DM at an exact future time. nima stores the text now and sends it as written. It does not research or run anything later.
/v1/scheduled-messagessubscriptions:writeMCP toolschedule_messagerequestKeystringrequired1 to 128 characters. A stable idempotency key. Reuse it when retrying the same request.
messagestringrequired1 to 12000 characters. The exact text to send.
sendAtISO datetimerequiredISO 8601 with a UTC offset, for example 2026-10-05T09:00:00+03:00. Must be in the future and no more than 366 days ahead.
timeZonestringrequiredA confirmed IANA timezone such as Asia/Jerusalem, 1 to 100 characters.
The input is strict. The tool returns a reminder with id, message, sendAt, localDeliveryTime, timeZone, state, version, delivery (slack_dm), sentAt, failureReason and createdAt. Delivery is accurate to about one minute.
Retrying with the same requestKey returns the original reminder, even after its due time. Reusing a key with a different message, time or timezone answers 409.
| Status | When |
|---|---|
400 | "Choose a future time within the next 366 days", or "Choose a valid IANA timezone". |
400 | "Link your Slack account in this workspace before scheduling a message". |
409 | You already have 100 pending reminders. Cancel one first. |
409 | The requestKey belongs to a different reminder. Use its id to edit it. |
409 | Scheduled messages are switched off platform-wide. |
403 | You no longer hold reminder permissions in the workspace. |
A reminder goes only to your own Slack DM, never to a channel or another person. Reminder states are pending, delivering, sent, cancelled, failed and uncertain. uncertain means Slack did not confirm delivery. nima never resends an uncertain reminder, so check Slack before sending it again.
list_scheduled_messages tool
list_scheduled_messages returns your own reminders and their delivery status: up to 200, with pending reminders first by delivery time, then recent history.
/v1/scheduled-messagessubscriptions:readMCP toollist_scheduled_messagesThe tool takes no input. Each row includes the id and version you need to edit or cancel it. Do not report an uncertain reminder as sent.
update_scheduled_message tool
update_scheduled_message edits or reschedules one of your pending reminders. Read its id and version from list_scheduled_messages first.
/v1/scheduled-messages/{id}subscriptions:writeMCP toolupdate_scheduled_messageiduuidrequiredThe reminder id.
versionintegerrequiredThe current version, at least 1. It stops you overwriting a concurrent change.
message, sendAt, timeZonefieldsOptional. Same limits as schedule_message. The new time is checked again.
Only a pending reminder can change. If delivery has started or the version is stale, the call answers 409 "The reminder changed or delivery has started. List reminders again before editing." A missing id answers 404. The tool is not idempotent: each successful call bumps version, so re-read the list before retrying. Editing also answers 409 while scheduled messages are switched off platform-wide, and the send time is checked again even when only message changes.
cancel_scheduled_message tool
cancel_scheduled_message cancels one of your pending reminders and returns it with state: "cancelled".
/v1/scheduled-messages/{id}subscriptions:writeMCP toolcancel_scheduled_messageiduuidrequiredThe reminder id from list_scheduled_messages.
Cancelling an already cancelled reminder changes nothing. If delivery has started, the call answers 409. A missing id answers 404.
Availability of watch tools
Watch tools work only in a workspace where watches are switched on. Creating or editing a watch in any other workspace answers 409 "Subscriptions are not enabled for this workspace". The tools still appear in tools/list, and reading tools (list_event_types, list_watches, get_inbox) still answer. Events are recorded while watches are off, but nothing fires or is sent until an owner or admin sets triggersEnabled to true with PATCH /organizations/settings from a signed-in session, or the nima team does it for you. Turning it off again stops existing watches without an error.
Workspace rules also need outbound dispatch on for the workspace, and they can only be created from a signed-in owner or admin session with POST /v1/watches, not over MCP. See Availability of features.
Reminder tools do not depend on that setting. They need the caller's Slack account linked in the workspace and a token with the subscriptions:* scopes. Owners, admins and members can all use them.
Signal, beacon and spec MCP tools
Reference for search_signals, get_signal, get_signal_source, create_signal, list_beacons, get_beacon, list_specs, get_document_markdown, get_spec_delivery and get_history.
Agent operation and publishing MCP tools
Reference for the MCP tools that start and control agent operations, configure hosted compute and manage GitHub publishing, plus the tools only a nima VM can call.