docs
MCP Server

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

ToolWhat it doesScope
list_event_typesLists the events a watch can react tosubscriptions:read
create_subscriptionCreates a watchsubscriptions:write
update_subscriptionEdits, resumes or clears conditions on your watchsubscriptions:write
list_watchesLists your watchessubscriptions:read
unwatchPauses a watchsubscriptions:write
get_inboxReads your inboxinbox:read
get_scheduling_contextReturns the time, a suggested timezone and whether Slack is linkedsubscriptions:read
schedule_messageSaves a one-time remindersubscriptions:write
list_scheduled_messagesLists your reminderssubscriptions:read
update_scheduled_messageEdits or reschedules a pending remindersubscriptions:write
cancel_scheduled_messageCancels a pending remindersubscriptions: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.

GET/v1/triggers/event-types
scopesubscriptions:readMCP toollist_event_types

The 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.

POST/v1/watches
scopesubscriptions:writeMCP toolcreate_subscription
scopestring

user (the default) watches one subject. org creates a workspace rule over tracker tickets. See Workspace rules.

subjectKindstringrequired

signal, beacon, spec or pr (a tracker ticket id, for example from an inbox item, is also accepted). Required for a personal watch.

subjectIduuidrequired

The id of the subject, from the list tools. Required for a personal watch.

triggerTypesstring[]required

Event types to react to, from list_event_types. At least one.

instructionsstringrequired

1 to 4000 characters. What nima should analyze and answer when the event happens. Required for a personal watch.

namestring

1 to 160 characters. A short title for the watch.

payloadEqualsobject

Conditions. 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.

contextstring

1 to 8000 characters. Preferences to save for the future answer.

expiresAtISO datetime

When 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.

StatusWhen
409Watches are not enabled for the workspace ("Subscriptions are not enabled for this workspace").
404The subject does not exist in your workspace ("Subscription subject not found").
400An 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.
400payloadEquals names a field an event type does not have, or a value of the wrong type ("Unsupported event conditions").
400expiresAt is in the past.
403The 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" } with templateKey: "tracker_assignee_reminder". role is owner, assignee, reporter or spec_owner. fallback is owner or none and defaults to none. templateKey is required for a notify rule. fallback can also go inside to.
  • { "kind": "agent", "instructions": "...", "tools": ["reply_on_ticket"], "maxActions": 1 }. instructions is 1 to 4000 characters, context is optional (1 to 8000), and maxActions can only be 1. An agent rule takes no templateKey. A proposed reply waits for approval unless an owner or admin has set ticket replies to auto for 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.

StatusWhen
403Any 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.
409Watches 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.

PATCH/v1/watches/{id}
scopesubscriptions:writeMCP toolupdate_subscription
iduuidrequired

The watch id from list_watches.

triggerTypes, instructions, context, name, expiresAtfields

Same limits as create_subscription. Send only what changes.

payloadEqualsobject

Replaces the conditions. Send {} to clear them.

statestring

active 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.

StatusWhen
404The id is missing or belongs to someone else ("Watch not found").
409Resuming or editing would produce a definition identical to another active watch ("An identical subscription is already active"), or watches are off for the workspace.
400The 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.

GET/v1/watches
scopesubscriptions:readMCP toollist_watches

The 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.

DELETE/v1/watches/{id}
scopesubscriptions:writeMCP toolunwatch
iduuidrequired

The 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.

GET/v1/inbox
scopeinbox:readMCP toolget_inbox
pageinteger

Starting at 1.

limitinteger

1 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:

ChannelMeaning
slack_dmSent to you as a Slack direct message.
digestFolded into your 09:00 digest DM.
inboxKept 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.

GET/v1/scheduled-messages/context
scopesubscriptions:readMCP toolget_scheduling_context

The 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.

POST/v1/scheduled-messages
scopesubscriptions:writeMCP toolschedule_message
requestKeystringrequired

1 to 128 characters. A stable idempotency key. Reuse it when retrying the same request.

messagestringrequired

1 to 12000 characters. The exact text to send.

sendAtISO datetimerequired

ISO 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.

timeZonestringrequired

A 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.

StatusWhen
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".
409You already have 100 pending reminders. Cancel one first.
409The requestKey belongs to a different reminder. Use its id to edit it.
409Scheduled messages are switched off platform-wide.
403You 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.

GET/v1/scheduled-messages
scopesubscriptions:readMCP toollist_scheduled_messages

The 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.

PATCH/v1/scheduled-messages/{id}
scopesubscriptions:writeMCP toolupdate_scheduled_message
iduuidrequired

The reminder id.

versionintegerrequired

The current version, at least 1. It stops you overwriting a concurrent change.

message, sendAt, timeZonefields

Optional. 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".

DELETE/v1/scheduled-messages/{id}
scopesubscriptions:writeMCP toolcancel_scheduled_message
iduuidrequired

The 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.