Skip to content
Scalekit Docs

Roam MCP

Vendor MCP56 toolsOAuth 2.1/DCRCommunicationCollaborationCalendar

Connect to Roam MCP. Access and manage meetings, transcripts, chat messages, calendar events, and people data across your Roam virtual office workspace.

Roam MCP connector

  1. Terminal window
    npm install @scalekit-sdk/node

    Full SDK reference: Node.js | Python

  2. Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

    .env
    SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
    SCALEKIT_CLIENT_ID=<your-client-id>
    SCALEKIT_CLIENT_SECRET=<your-client-secret>
  3. quickstart.ts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENV_URL,
    process.env.SCALEKIT_CLIENT_ID,
    process.env.SCALEKIT_CLIENT_SECRET,
    )
    const actions = scalekit.actions
    const connector = 'roammcp'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize Roam MCP:', link)
    process.stdout.write('Press Enter after authorizing...')
    await new Promise(r => process.stdin.once('data', r))
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'roammcp_calendar_list',
    toolInput: {},
    })
    console.log(result)

Connect this agent connector to let your agent:

  • Unsubscribe webhook — Unsubscribe from a webhook by ID
  • Subscribe webhook — Subscribe to receive webhook events at a URL
  • Deliveries webhook — List recent FAILED webhook delivery attempts for the authenticated client — timeouts (statusCode 0, error “timeout”), connection errors, and non-2xx responses
  • List user, reaction, onair guest — List users (people) in your workspace
  • Info user, token, onair guest — Resolve a member, guest, or automated actor by user ID
  • Post story, chat — Post a photo or video story to the caller’s Roam

Use the exact tool names from the Tool list below when you call execute_tool. If you’re not sure which name to use, list the tools available for the current user first.

roammcp_asset_create#Create a file upload and get back a self-describing instruction for sending the bytes out of band. This is step 1 of attaching a file (image, PDF, document, etc.) to a chat message, posting a story, **or** hosting an avatar image. Files are **not** sent through this tool — only metadata. The bytes are uploaded directly to the returned URL, so they never pass through the model. Flow: 1. Call `asset_create` with the file `name` (include the extension, e.g. `photo.png`) and, if known, the `size` in bytes. For stories pass `purpose: "story"`. For avatars pass `purpose: "avatar"` and `size` (required, max 10 MiB). 2. The response contains `assetId`, `uploadUrl`, `uploadMethod`, and `uploadHeaders`. Avatar responses also include `imageUrl`. Upload the raw file bytes in a **single request**: use `uploadMethod` (a `POST`) against `uploadUrl`, send every header in `uploadHeaders`, and put the file bytes in the request body. 3. After the upload returns success: - **Chat attachment:** pass the `assetId` to `chat_post` via its `assetIds` argument. - **Story:** pass the `assetId` to `story_post` (wait until processing completes if needed). - **Avatar:** pass `imageUrl` as `sender.imageUrl` on `chat_post`, or as `hosts[].imageUrl` on `onair_event_create` / `onair_event_update`. Wait a few seconds for image processing (the URL 404s until the asset is ready). Parameters: - name (required): File name including extension. - size (optional): File size in bytes (recommended). Required for `purpose: "avatar"` (max 10 MiB). - purpose (optional): `"file"` (default) for chat attachments, `"story"` for story media (personal tokens only), or `"avatar"` for Roam-hosted profile/host images. Notes: - Send all `uploadHeaders` exactly as given. They authorize the upload and select the single-request upload protocol; omitting them will cause the upload to fail. - The upload URL is short-lived. If it expires, call `asset_create` again for a fresh one. - Processing (thumbnails, previews, avatar WebP, etc.) happens automatically once the bytes land; you do not need a separate "complete" or "finish" call. - Story-purpose assets expire after 48 hours (24h story lifetime plus a posting window). Post with `story_post` well before that, or create a new asset. - `sender.imageUrl` and On-Air `hosts.imageUrl` must be a Roam-hosted avatar URL. Create one with `purpose: "avatar"` rather than linking a third-party image. 3 params

Create a file upload and get back a self-describing instruction for sending the bytes out of band. This is step 1 of attaching a file (image, PDF, document, etc.) to a chat message, posting a story, **or** hosting an avatar image. Files are **not** sent through this tool — only metadata. The bytes are uploaded directly to the returned URL, so they never pass through the model. Flow: 1. Call `asset_create` with the file `name` (include the extension, e.g. `photo.png`) and, if known, the `size` in bytes. For stories pass `purpose: "story"`. For avatars pass `purpose: "avatar"` and `size` (required, max 10 MiB). 2. The response contains `assetId`, `uploadUrl`, `uploadMethod`, and `uploadHeaders`. Avatar responses also include `imageUrl`. Upload the raw file bytes in a **single request**: use `uploadMethod` (a `POST`) against `uploadUrl`, send every header in `uploadHeaders`, and put the file bytes in the request body. 3. After the upload returns success: - **Chat attachment:** pass the `assetId` to `chat_post` via its `assetIds` argument. - **Story:** pass the `assetId` to `story_post` (wait until processing completes if needed). - **Avatar:** pass `imageUrl` as `sender.imageUrl` on `chat_post`, or as `hosts[].imageUrl` on `onair_event_create` / `onair_event_update`. Wait a few seconds for image processing (the URL 404s until the asset is ready). Parameters: - name (required): File name including extension. - size (optional): File size in bytes (recommended). Required for `purpose: "avatar"` (max 10 MiB). - purpose (optional): `"file"` (default) for chat attachments, `"story"` for story media (personal tokens only), or `"avatar"` for Roam-hosted profile/host images. Notes: - Send all `uploadHeaders` exactly as given. They authorize the upload and select the single-request upload protocol; omitting them will cause the upload to fail. - The upload URL is short-lived. If it expires, call `asset_create` again for a fresh one. - Processing (thumbnails, previews, avatar WebP, etc.) happens automatically once the bytes land; you do not need a separate "complete" or "finish" call. - Story-purpose assets expire after 48 hours (24h story lifetime plus a posting window). Post with `story_post` well before that, or create a new asset. - `sender.imageUrl` and On-Air `hosts.imageUrl` must be a Roam-hosted avatar URL. Create one with `purpose: "avatar"` rather than linking a third-party image.

NameTypeRequiredDescription
namestringrequiredThe file name including its extension, e.g. "report.pdf" or "photo.png". Roam uses the extension to infer the file's content type and to generate previews or thumbnails after upload.
purposestringoptionalWhat the uploaded file is for: "file" (default) for a chat message attachment, "story" for story media (personal tokens only), or "avatar" for a Roam-hosted profile or host image. Choosing "avatar" makes size required and adds an imageUrl to the response.
sizeintegeroptionalThe file size in bytes. Optional but recommended for ordinary chat/story attachments; required when purpose is "avatar", where uploads are capped at 10 MiB.
roammcp_calendar_event_create#Create a new calendar event on the authenticated user's calendar. Automatically adds a Roam meeting link and sends email notifications to attendees.9 params

Create a new calendar event on the authenticated user's calendar. Automatically adds a Roam meeting link and sends email notifications to attendees.

NameTypeRequiredDescription
endstringrequiredThe event's end time as an RFC3339 datetime, e.g. "2026-09-15T15:00:00Z".
startstringrequiredThe event's start time as an RFC3339 datetime, e.g. "2026-09-15T14:00:00Z".
titlestringrequiredThe event's title, shown on the calendar and in invite emails sent to attendees.
allDaybooleanoptionalWhether this is an all-day event with no specific start/end time of day. Defaults to false.
attendeesarrayoptionalAttendees to invite, each as an email address or a "Name <email>" string. Each attendee receives an email notification containing the Roam meeting link.
descriptionstringoptionalFree-text description or agenda for the event, included in the calendar invite sent to attendees.
hoststringoptionalThe host's email address. Required when calling with a bot or org token; optional for personal tokens, where it defaults to the authenticated user.
rrulestringoptionalAn iCalendar RFC 5545 recurrence rule describing how the event repeats, e.g. "FREQ=WEEKLY;COUNT=10" for ten weekly occurrences.
timeZonestringoptionalThe IANA time zone the start and end times should be interpreted in, e.g. "America/New_York". Required for recurring events (when rrule is set) and recommended for every event to avoid ambiguity.
roammcp_calendar_list#List scheduled calendar events within a date range from the user's connected calendars (Google Calendar, Outlook). Returns upcoming meetings with times, attendees, and recurrence info. Note: returns scheduled events, not completed meeting transcripts — use meeting_list for transcripts.2 params

List scheduled calendar events within a date range from the user's connected calendars (Google Calendar, Outlook). Returns upcoming meetings with times, attendees, and recurrence info. Note: returns scheduled events, not completed meeting transcripts — use meeting_list for transcripts.

NameTypeRequiredDescription
endDatestringoptionalEnd of the date range to list events for, as a YYYY-MM-DD date. Defaults to startDate plus 7 days.
startDatestringoptionalStart of the date range to list events for, as a YYYY-MM-DD date. Defaults to today in the user's time zone.
roammcp_chat_delete#Delete a bot message. Specify the message by chatId and timestamp. Idempotent. Requires a bot token or a personal token with useBotIdentity=true.3 params

Delete a bot message. Specify the message by chatId and timestamp. Idempotent. Requires a bot token or a personal token with useBotIdentity=true.

NameTypeRequiredDescription
chatIdstringrequiredThe UUID of the chat conversation the message belongs to.
timestampstringrequiredThe RFC3339 timestamp (with microsecond precision) of the message to delete, exactly as returned by chat_history or chat_search.
threadTimestampstringoptionalThe RFC3339 timestamp of the thread's root message, if the message being deleted is a reply in a thread. Omit for a main-channel message.
roammcp_chat_history#Read messages from a specific chat conversation. A chat target is required — provide exactly one of chatId, groupId, or userIds: - chatId: UUID of an existing conversation (from chat_list results) - groupId: UUID of a group (from group_list results) — reads the group's channel - userIds: UUID(s) of users — opens or creates a DM conversation When "after" is specified, returns messages in forward chronological order (oldest first). Otherwise, returns messages in reverse chronological order (newest first). Parameters: - chatId (optional): UUID of a chat conversation - groupId (optional): UUID of a group - userIds (optional): Array of user UUIDs for a DM - threadTimestamp (optional): Thread root RFC3339 datetime (from a prior message's `timestamp`) to read thread replies - before (optional): Only messages before this time (RFC3339) - after (optional): Only messages after this time (RFC3339) - ascending (optional): Sort ascending by time (true/false) - limit (optional): Max messages per page (max 200) - cursor (optional): Pagination cursor from a previous response Each returned message carries: - `timestamp` — RFC3339 send time (with microsecond precision). Pass back into chat_post, chat_update, chat_delete, reaction_* as-is. - `threadTimestamp` — RFC3339 thread root (only on replies / when replying to a thread). - `userId` — UUID of the sender (resolve via the response envelope's `addresses` map; see below). - `text` — canonical message text with Slack-syntax mention tokens: `<@uuid>` for principals (users and bots), `<!subteam^uuid>` for groups and channels, and `<!channel>` for the broadcast. Tokens are never rewritten by the server. - `mentions` — flat list of payloads referenced by mention tokens in `text`: bare address UUIDs (from both `<@uuid>` and `<!subteam^uuid>` tokens) and the literal `"all"` for `<!channel>`. Order-preserving and deduplicated. Always present when `text` contains mentions; use this to know what was mentioned without re-parsing the regex. The response envelope additionally carries an `addresses` map keyed by UUID — every sender and mention-target address referenced on this page, with display name, type (`user`/`bot`/`userGroup`/`standardGroup`/`meetingGroup`/`teamRoam`), and type-specific fields (e.g. `botCode`, `email`, `isGuest`). Use it to render display names: replace `<@<uuid>>` and `<!subteam^<uuid>>` in `text` with `@` + `addresses.<uuid>.displayName`, and `<!channel>` with `@all`. The map omits IDs the caller is not authorized to view (cross-roam bots, private cross-account groups, etc.) — render those as `@unknown`. To look up a message from a Roam chat link URL, use resolve_chat_link instead of parsing the URL yourself. To get a shareable link to a message, use create_chat_link instead of constructing the URL yourself. 9 params

Read messages from a specific chat conversation. A chat target is required — provide exactly one of chatId, groupId, or userIds: - chatId: UUID of an existing conversation (from chat_list results) - groupId: UUID of a group (from group_list results) — reads the group's channel - userIds: UUID(s) of users — opens or creates a DM conversation When "after" is specified, returns messages in forward chronological order (oldest first). Otherwise, returns messages in reverse chronological order (newest first). Parameters: - chatId (optional): UUID of a chat conversation - groupId (optional): UUID of a group - userIds (optional): Array of user UUIDs for a DM - threadTimestamp (optional): Thread root RFC3339 datetime (from a prior message's `timestamp`) to read thread replies - before (optional): Only messages before this time (RFC3339) - after (optional): Only messages after this time (RFC3339) - ascending (optional): Sort ascending by time (true/false) - limit (optional): Max messages per page (max 200) - cursor (optional): Pagination cursor from a previous response Each returned message carries: - `timestamp` — RFC3339 send time (with microsecond precision). Pass back into chat_post, chat_update, chat_delete, reaction_* as-is. - `threadTimestamp` — RFC3339 thread root (only on replies / when replying to a thread). - `userId` — UUID of the sender (resolve via the response envelope's `addresses` map; see below). - `text` — canonical message text with Slack-syntax mention tokens: `<@uuid>` for principals (users and bots), `<!subteam^uuid>` for groups and channels, and `<!channel>` for the broadcast. Tokens are never rewritten by the server. - `mentions` — flat list of payloads referenced by mention tokens in `text`: bare address UUIDs (from both `<@uuid>` and `<!subteam^uuid>` tokens) and the literal `"all"` for `<!channel>`. Order-preserving and deduplicated. Always present when `text` contains mentions; use this to know what was mentioned without re-parsing the regex. The response envelope additionally carries an `addresses` map keyed by UUID — every sender and mention-target address referenced on this page, with display name, type (`user`/`bot`/`userGroup`/`standardGroup`/`meetingGroup`/`teamRoam`), and type-specific fields (e.g. `botCode`, `email`, `isGuest`). Use it to render display names: replace `<@<uuid>>` and `<!subteam^<uuid>>` in `text` with `@` + `addresses.<uuid>.displayName`, and `<!channel>` with `@all`. The map omits IDs the caller is not authorized to view (cross-roam bots, private cross-account groups, etc.) — render those as `@unknown`. To look up a message from a Roam chat link URL, use resolve_chat_link instead of parsing the URL yourself. To get a shareable link to a message, use create_chat_link instead of constructing the URL yourself.

NameTypeRequiredDescription
afterstringoptionalOnly return messages sent after this RFC3339 timestamp. When set, results are returned oldest-first instead of newest-first.
ascendingstringoptionalWhether to sort results ascending by time (oldest first), passed as the string "true" or "false". If omitted, results are newest-first unless after is set.
beforestringoptionalOnly return messages sent before this RFC3339 timestamp.
chatIdstringoptionalThe UUID of an existing chat conversation to read, from chat_list results. Provide exactly one of chatId, groupId, or userIds to identify the conversation.
cursorstringoptionalPagination cursor from a previous response, used to fetch the next page of messages.
groupIdstringoptionalThe UUID of a group/channel to read, from group_list results — reads that group's channel. Provide exactly one of chatId, groupId, or userIds.
limitintegeroptionalMaximum number of messages to return per page (max 200).
threadTimestampstringoptionalThe RFC3339 timestamp of a thread's root message (from a prior message's timestamp field), to read that thread's replies instead of the main channel.
userIdsarrayoptionalOne or more user UUIDs identifying a direct message conversation to read, opening or creating it if needed. Provide exactly one of chatId, groupId, or userIds.
roammcp_chat_list#List your recent conversations (DMs and groups), sorted by most recent activity. 2 params

List your recent conversations (DMs and groups), sorted by most recent activity.

NameTypeRequiredDescription
cursorstringoptionalPagination cursor from a previous response, used to fetch the next page of conversations.
limitintegeroptionalMaximum number of conversations to return per page. Defaults to 10.
roammcp_chat_post#Send a message to a chat conversation. Messages are delivered asynchronously by default, or can be scheduled for later with `sendAt`. Messages are sent as the bot persona associated with this token. Specify exactly one of chatId, groupId, or userIds to identify the target: - chatId: UUID of an existing conversation (from chat_list results) - groupId: UUID of a group (from group_list results) — sends to the group's channel - userIds: UUID(s) of users — sends a DM (creates the conversation if needed) Parameters: - chatId (optional): UUID of a chat conversation - groupId (optional): UUID of a group - userIds (optional): Array of user UUIDs for a DM - text (required): Message text (markdown by default — set markdown=false for plain text) - threadTimestamp (optional): Reply to a thread (group chats only, not DMs) — use a `timestamp` value from chat_history results - blocks (optional): Block Kit blocks for rich formatting - items (optional): Item IDs to attach - sender (optional): Override the bot sender's name and image. `sender.imageUrl` must be a Roam-hosted avatar URL. - sendAt (optional): RFC3339 datetime on a 15-minute UTC boundary (:00/:15/:30/:45), up to 30 days ahead. Incompatible with sync, poll, threadKey, and replyTimestamp. When set, the response is `{chatId, scheduledMessageId, sendAt}` instead of a message timestamp. 14 params

Send a message to a chat conversation. Messages are delivered asynchronously by default, or can be scheduled for later with `sendAt`. Messages are sent as the bot persona associated with this token. Specify exactly one of chatId, groupId, or userIds to identify the target: - chatId: UUID of an existing conversation (from chat_list results) - groupId: UUID of a group (from group_list results) — sends to the group's channel - userIds: UUID(s) of users — sends a DM (creates the conversation if needed) Parameters: - chatId (optional): UUID of a chat conversation - groupId (optional): UUID of a group - userIds (optional): Array of user UUIDs for a DM - text (required): Message text (markdown by default — set markdown=false for plain text) - threadTimestamp (optional): Reply to a thread (group chats only, not DMs) — use a `timestamp` value from chat_history results - blocks (optional): Block Kit blocks for rich formatting - items (optional): Item IDs to attach - sender (optional): Override the bot sender's name and image. `sender.imageUrl` must be a Roam-hosted avatar URL. - sendAt (optional): RFC3339 datetime on a 15-minute UTC boundary (:00/:15/:30/:45), up to 30 days ahead. Incompatible with sync, poll, threadKey, and replyTimestamp. When set, the response is `{chatId, scheduledMessageId, sendAt}` instead of a message timestamp.

NameTypeRequiredDescription
textstringrequiredThe message text to send. Rendered as Markdown by default; set markdown to false to send it as plain text.
assetIdsarrayoptionalAsset IDs returned by asset_create to attach as files to this message. Upload the file's bytes to the asset's uploadUrl before sending.
blocksarrayoptionalBlock Kit blocks for rich, structured message formatting, as an array of block objects.
chatIdstringoptionalThe UUID of an existing chat conversation to post into, from chat_list results. Provide exactly one of chatId, groupId, or userIds to identify the target.
colorstringoptionalA color accent for the message, either a hex code or one of the named values good, danger, or warning.
groupIdstringoptionalThe UUID of a group/channel to post into, from group_list results — sends to the group's main channel. Provide exactly one of chatId, groupId, or userIds.
itemsarrayoptionalItem IDs to attach to the message as references to existing workspace items.
markdownbooleanoptionalWhether to interpret text as Markdown (bold, links, code, etc.). Defaults to true; set to false to send plain text verbatim.
sendAtstringoptionalSchedule the message to send later instead of immediately. Must be an RFC3339 datetime on a 15-minute UTC boundary (:00, :15, :30, or :45), up to 30 days in the future. Incompatible with sync, threadKey, and replying to a thread. When set, the response returns a scheduledMessageId instead of a message timestamp.
senderobjectoptionalOverride the bot's displayed sender identity for this message. imageUrl, if set, must be a Roam-hosted avatar URL created via asset_create with purpose avatar.
syncbooleanoptionalWhether to wait for delivery confirmation before returning. Defaults to false (fire-and-forget).
threadKeystringoptionalAn idempotency key used when starting a new thread, to avoid creating duplicate threads if the call is retried.
threadTimestampstringoptionalReply into an existing thread by passing the RFC3339 timestamp of the thread's root message, from chat_history results. Only supported in group chats, not DMs.
userIdsarrayoptionalOne or more user UUIDs to send a direct message to; the conversation is created if it doesn't already exist. Provide exactly one of chatId, groupId, or userIds.
roammcp_chat_scheduled_cancel#Cancel a pending scheduled message before it is sent, by the scheduledMessageId returned from chat_post. Only messages scheduled by this credential's bot identity can be canceled; already-sent messages return scheduled_message_already_sent.1 param

Cancel a pending scheduled message before it is sent, by the scheduledMessageId returned from chat_post. Only messages scheduled by this credential's bot identity can be canceled; already-sent messages return scheduled_message_already_sent.

NameTypeRequiredDescription
scheduledMessageIdstringrequiredThe UUID of the scheduled message to cancel, as returned in the scheduledMessageId field of chat_post's response when sendAt was set. Only messages scheduled by this credential's own bot identity can be canceled.
roammcp_chat_scheduled_list#List pending messages scheduled via chat_post's sendAt that have not been sent yet. Only messages scheduled by this credential's bot identity are returned, ascending by sendAt. Supports an optional chatId filter, sendAt range filtering, and pagination.5 params

List pending messages scheduled via chat_post's sendAt that have not been sent yet. Only messages scheduled by this credential's bot identity are returned, ascending by sendAt. Supports an optional chatId filter, sendAt range filtering, and pagination.

NameTypeRequiredDescription
afterstringoptionalOnly return messages scheduled to send after this RFC3339 timestamp.
beforestringoptionalOnly return messages scheduled to send before this RFC3339 timestamp.
chatIdstringoptionalOnly return scheduled messages targeting this chat UUID.
cursorstringoptionalPagination cursor from a previous response, used to fetch the next page of scheduled messages.
limitintegeroptionalMaximum number of scheduled messages to return per page.
roammcp_chat_update#Update a bot message's content. Specify the message by chatId and timestamp. Supports text, markdown, block kit, and attachments. Requires a bot token or a personal token with useBotIdentity=true.9 params

Update a bot message's content. Specify the message by chatId and timestamp. Supports text, markdown, block kit, and attachments. Requires a bot token or a personal token with useBotIdentity=true.

NameTypeRequiredDescription
chatIdstringrequiredChat ID (UUID)
timestampstringrequiredMessage RFC3339 datetime (e.g. 2026-04-22T13:04:57.123456Z)
assetIdsarrayoptionalAsset IDs from asset_create to attach
blocksarrayoptionalBlock Kit blocks
colorstringoptionalMessage color (hex or good/danger/warning)
itemsarrayoptionalItem IDs (attachments)
markdownbooleanoptionalTreat text as markdown (default true)
textstringoptionalUpdated message text
threadTimestampstringoptionalThread RFC3339 datetime (omit for a main-channel message)
roammcp_conversation_list#List conversations from the workspace's attendance/reporting log, with per-participant time-in-conversation detail. Supports date range filtering and pagination. WHEN TO USE THIS TOOL: - Use for attendance and usage questions: "who was in meetings yesterday", "how long did we spend in huddles last week", "which rooms get used". - Unlike meeting_list (which is transcript-oriented), conversation_list covers every conversation — including short huddles and calls without a transcript or recording — and reports how long each participant was present. - For meeting content (summaries, transcripts, action items), use meeting_list / meeting_info / meeting_transcript instead. WHAT IT RETURNS: - One entry per conversation: id, place, room, roomType, start/end times, and meetingLinkIds when the room was booked through a meeting link. - participants: each participant's name and total seconds in the conversation. Requires the user:read scope; emails additionally require user:read.email. ACCESS: - Org tokens list every conversation in the workspace (requires broad meeting access). - Personal tokens list only conversations the token owner participated in. A page may then contain fewer than `limit` matches (even zero) while more history remains — keep following nextCursor until it is empty. Parameters: - after (optional): RFC3339 datetime; only conversations after this time (switches results to ascending order) - before (optional): RFC3339 datetime; only conversations before this time - limit (optional): Max conversations per page (default 10, max 100) - cursor (optional): Pagination cursor from a previous response's nextCursor - expand (optional): Comma-separated extra fields. "ip" adds each participant's client IP address (org tokens only). 5 params

List conversations from the workspace's attendance/reporting log, with per-participant time-in-conversation detail. Supports date range filtering and pagination. WHEN TO USE THIS TOOL: - Use for attendance and usage questions: "who was in meetings yesterday", "how long did we spend in huddles last week", "which rooms get used". - Unlike meeting_list (which is transcript-oriented), conversation_list covers every conversation — including short huddles and calls without a transcript or recording — and reports how long each participant was present. - For meeting content (summaries, transcripts, action items), use meeting_list / meeting_info / meeting_transcript instead. WHAT IT RETURNS: - One entry per conversation: id, place, room, roomType, start/end times, and meetingLinkIds when the room was booked through a meeting link. - participants: each participant's name and total seconds in the conversation. Requires the user:read scope; emails additionally require user:read.email. ACCESS: - Org tokens list every conversation in the workspace (requires broad meeting access). - Personal tokens list only conversations the token owner participated in. A page may then contain fewer than `limit` matches (even zero) while more history remains — keep following nextCursor until it is empty. Parameters: - after (optional): RFC3339 datetime; only conversations after this time (switches results to ascending order) - before (optional): RFC3339 datetime; only conversations before this time - limit (optional): Max conversations per page (default 10, max 100) - cursor (optional): Pagination cursor from a previous response's nextCursor - expand (optional): Comma-separated extra fields. "ip" adds each participant's client IP address (org tokens only).

NameTypeRequiredDescription
afterstringoptionalRFC3339 datetime, conversations after this time (switches to ascending order)
beforestringoptionalRFC3339 datetime, conversations before this time
cursorstringoptionalPagination cursor from a previous response
expandstringoptionalComma-separated extra fields: ip (participant IP addresses; org tokens only)
limitintegeroptionalResults per page (default 10, max 100)
roammcp_get_me#Get the authenticated user's identity: `id`, `name`, and (when the token has the `user:read.email` scope) `email`. This is a projection over `token.info` that returns only the user object — useful for quickly answering "who am I" without parsing the full token payload. For org tokens, returns the bot identity. 0 params

Get the authenticated user's identity: `id`, `name`, and (when the token has the `user:read.email` scope) `email`. This is a projection over `token.info` that returns only the user object — useful for quickly answering "who am I" without parsing the full token payload. For org tokens, returns the bot identity.

roammcp_group_create#Create a new group/channel with initial members.5 params

Create a new group/channel with initial members.

NameTypeRequiredDescription
membersarrayrequiredInitial members with roles, as an array of {userId, role} objects. userId is the member's UUID; role is "member" (default) or "admin".
namestringrequiredGroup name (max 64 chars)
descriptionstringoptionalGroup description (max 1024 chars)
enforceThreadsbooleanoptionalEnforce threaded messages
privatebooleanoptionalWhether group is private
roammcp_group_info#Get information about a group/channel by ID or name.2 params

Get information about a group/channel by ID or name.

NameTypeRequiredDescription
idstringoptionalGroup ID (UUID)
namestringoptionalGroup name (exact match)
roammcp_group_join#Join a public group/channel as the calling identity. Org tokens join as the bot; personal tokens join as the owner. Private groups cannot be joined. Idempotent if already a member.1 param

Join a public group/channel as the calling identity. Org tokens join as the bot; personal tokens join as the owner. Private groups cannot be joined. Idempotent if already a member.

NameTypeRequiredDescription
idstringrequiredGroup ID (UUID)
roammcp_group_list#List non-archived groups/channels in your workspace, visible to the authenticated user. Use the returned group IDs with chat_history (groupId) to read messages, or chat_post (groupId) to send messages. Group types: - "standard": user-created chat channels (like Slack channels). Most groups are this type. - "magicast": AI-generated channels. - "meeting": auto-created for recorded meetings, named after the meeting. - "roam": the automatic all-hands group for the workspace (one per workspace). - "onair": on-air event groups. 4 params

List non-archived groups/channels in your workspace, visible to the authenticated user. Use the returned group IDs with chat_history (groupId) to read messages, or chat_post (groupId) to send messages. Group types: - "standard": user-created chat channels (like Slack channels). Most groups are this type. - "magicast": AI-generated channels. - "meeting": auto-created for recorded meetings, named after the meeting. - "roam": the automatic all-hands group for the workspace (one per workspace). - "onair": on-air event groups.

NameTypeRequiredDescription
cursorstringoptionalPagination cursor from a previous response
limitintegeroptionalPage limit (default 50, max 100)
querystringoptionalCase-insensitive name search, ranked by match quality
typestringoptionalComma-separated group types to include: standard, magicast, meeting, roam, onair
roammcp_lobby_booking_list#List all bookings for a specific lobby. Supports date range filtering and pagination.5 params

List all bookings for a specific lobby. Supports date range filtering and pagination.

NameTypeRequiredDescription
lobbyIdstringrequiredLobby configuration ID (UUID)
afterstringoptionalReturn bookings after this time
beforestringoptionalReturn bookings before this time
cursorstringoptionalPagination cursor
limitintegeroptionalMax bookings to return
roammcp_lobby_list#List all lobbies configured for the authenticated account. Optionally filter by handle.1 param

List all lobbies configured for the authenticated account. Optionally filter by handle.

NameTypeRequiredDescription
handlestringoptionalFilter lobbies by handle slug
roammcp_magicast_info#Get a Magicast by ID, including transcript cues, chapters, duration, video status, a signed video download URL when ready, and an existing share URL if one has already been minted. Does not create a share link.1 param

Get a Magicast by ID, including transcript cues, chapters, duration, video status, a signed video download URL when ready, and an existing share URL if one has already been minted. Does not create a share link.

NameTypeRequiredDescription
idstringrequiredThe Magicast ID (UUID) to look up, e.g. one returned by List Magicasts.
roammcp_magicast_list#List Magicasts. Supports date range filtering and pagination. Returns metadata only (id, name, createdAt, owner, cover). Use magicast_info for transcript cues, chapters, and video.5 params

List Magicasts. Supports date range filtering and pagination. Returns metadata only (id, name, createdAt, owner, cover). Use magicast_info for transcript cues, chapters, and video.

NameTypeRequiredDescription
afterstringoptionalOnly include Magicasts created after this RFC3339 datetime.
ascendingstringoptionalSort results ascending by time when set to "true"; descending (most recent first) when "false" or left blank.
beforestringoptionalOnly include Magicasts created before this RFC3339 datetime.
cursorstringoptionalPagination cursor from a previous List Magicasts response, used to fetch the next page.
limitintegeroptionalMaximum number of Magicasts to return per page (max 100).
roammcp_meeting_info#Retrieve detailed information about a specific meeting including AI-generated summary, action items, and chapter breakdowns. WHEN TO USE THIS TOOL: - Use this AFTER finding a meeting ID via meeting_list or meeting_search - This provides the AI-generated summary which answers most questions about what was discussed - Only use meeting_transcript if the summary doesn't contain the specific detail needed WORKFLOW: 1. First use meeting_list (by date) or meeting_search (by content) to find the meeting 2. Use this tool (meeting_info) with the meeting id to get the summary and chapters 3. If the summary is insufficient, use meeting_transcript for verbatim transcript Parameters: - id (required): The meeting ID (UUID) from meeting_list or meeting_search results - maxParticipants (optional): Max participants to return (default 10) Returns: - Meeting title, start time, and participants - Overall AI-generated summary of the meeting - Action items: each entry includes `id`, `title`, `description`, `complete`, `assigneeId` (explicit assignment), `suggestedAssigneeId` (AI-suggested assignee address ID), and `suggestedAssigneeName` (display name for `assigneeId` when set, otherwise the AI-suggested name). On personal access tokens only, also includes `assignedToMe` and `suggestedForMe` booleans. Skip items with `complete: true` unless the user asked for history. Prefer `assignedToMe: true`; treat `suggestedForMe: true` as a suggestion, not a confirmed assignment. - Chapters: meetings are divided into topic-based chapters, each with a name, synopsis, and `start` (milliseconds since the start of the meeting) - `hasVideo`: whether the meeting was video recorded. `videoStatus` says whether that recording can be watched yet: `available`, `processing` (the upload has not finished — check again shortly), or `none` (not recorded). Once `videoStatus` is `available`, use meeting_share_link to get a shareable link to it. Note: Transcripts are NOT included here to keep response size manageable. Use meeting_transcript if you need the verbatim transcript. 2 params

Retrieve detailed information about a specific meeting including AI-generated summary, action items, and chapter breakdowns. WHEN TO USE THIS TOOL: - Use this AFTER finding a meeting ID via meeting_list or meeting_search - This provides the AI-generated summary which answers most questions about what was discussed - Only use meeting_transcript if the summary doesn't contain the specific detail needed WORKFLOW: 1. First use meeting_list (by date) or meeting_search (by content) to find the meeting 2. Use this tool (meeting_info) with the meeting id to get the summary and chapters 3. If the summary is insufficient, use meeting_transcript for verbatim transcript Parameters: - id (required): The meeting ID (UUID) from meeting_list or meeting_search results - maxParticipants (optional): Max participants to return (default 10) Returns: - Meeting title, start time, and participants - Overall AI-generated summary of the meeting - Action items: each entry includes `id`, `title`, `description`, `complete`, `assigneeId` (explicit assignment), `suggestedAssigneeId` (AI-suggested assignee address ID), and `suggestedAssigneeName` (display name for `assigneeId` when set, otherwise the AI-suggested name). On personal access tokens only, also includes `assignedToMe` and `suggestedForMe` booleans. Skip items with `complete: true` unless the user asked for history. Prefer `assignedToMe: true`; treat `suggestedForMe: true` as a suggestion, not a confirmed assignment. - Chapters: meetings are divided into topic-based chapters, each with a name, synopsis, and `start` (milliseconds since the start of the meeting) - `hasVideo`: whether the meeting was video recorded. `videoStatus` says whether that recording can be watched yet: `available`, `processing` (the upload has not finished — check again shortly), or `none` (not recorded). Once `videoStatus` is `available`, use meeting_share_link to get a shareable link to it. Note: Transcripts are NOT included here to keep response size manageable. Use meeting_transcript if you need the verbatim transcript.

NameTypeRequiredDescription
idstringrequiredThe meeting ID (UUID) to retrieve, from List Meetings or a search result.
maxParticipantsintegeroptionalMaximum number of participants to include in the response (default 10).
roammcp_meeting_list#List meeting transcripts with optional date filters and pagination. WHEN TO USE THIS TOOL: - Use this tool FIRST when the user asks about meetings - Start by calling with NO date parameters to get the most recent meetings - Use the cursor from the response to page backwards through older meetings - For keyword searches (e.g., "meetings about budgets"), use meeting_search instead CRITICAL DATE FILTER GUIDANCE: - For recent requests (e.g., "recent meetings", "today", "yesterday", "this week", "last week"), DO NOT set after/before - For those requests, call meeting_list without date filters and page backwards with cursor; filter by returned start/end timestamps - Only set after/before when the user gave explicit calendar boundaries or you need a strict historical window - Avoid guessing relative dates for after/before EXPAND FIELDS: - For broad questions across many recent meetings (action items, weekly recaps, status updates, decision logs), pass `expand: "summary,actionItems,chapters"` so each returned item already carries that data. - This avoids firing one meeting_info per row, which is the slow path. Reserve meeting_info for when you need full detail (participants) on a specific meeting. - Allowed values are `summary`, `actionItems`, and `chapters`. Pass them as a single comma-separated string. - When `actionItems` is expanded, each entry includes `id`, `complete`, `assigneeId` (explicit assignment), `suggestedAssigneeId` (AI suggestion), and `suggestedAssigneeName` (display name for `assigneeId` when set, otherwise the AI-suggested name). On personal access tokens only, also includes `assignedToMe` and `suggestedForMe`. Skip `complete: true` items unless the user wants history. Prefer `assignedToMe: true`; treat `suggestedForMe: true` as a suggestion. - Meetings without a transcript (e.g. very short calls, calls without recording) will simply omit those fields. WORKFLOW: 1. Call meeting_list (no dates) to get recent meetings. Add `expand` if you need cross-meeting content rather than just titles. 2. Use the nextCursor to page backwards if the meeting isn't in the first page. 3. Use meeting_info with the ID for full detail (participants) on a specific meeting, or meeting_transcript for verbatim transcript. Parameters: - after (optional): Only include meetings after this time (RFC3339). Prefer leaving unset for recent-period requests. - before (optional): Only include meetings before this time (RFC3339). Prefer leaving unset for recent-period requests. - limit (optional): Maximum number of meetings to return - cursor (optional): Pagination cursor from a previous response to fetch the next page - expand (optional): Comma-separated extra per-meeting fields: `summary`, `actionItems`, `chapters`. Use this when scanning many meetings at once. Returns paginated meeting list with meeting name, start/end times, participant count, `hasVideo` (whether the meeting was video recorded), and `videoStatus` (`available`, `processing`, or `none` — once `available`, use meeting_share_link to get a shareable link to the recording). Each meeting includes an id for use with meeting_info and meeting_transcript. When expand is set, each item additionally carries the requested fields. 5 params

List meeting transcripts with optional date filters and pagination. WHEN TO USE THIS TOOL: - Use this tool FIRST when the user asks about meetings - Start by calling with NO date parameters to get the most recent meetings - Use the cursor from the response to page backwards through older meetings - For keyword searches (e.g., "meetings about budgets"), use meeting_search instead CRITICAL DATE FILTER GUIDANCE: - For recent requests (e.g., "recent meetings", "today", "yesterday", "this week", "last week"), DO NOT set after/before - For those requests, call meeting_list without date filters and page backwards with cursor; filter by returned start/end timestamps - Only set after/before when the user gave explicit calendar boundaries or you need a strict historical window - Avoid guessing relative dates for after/before EXPAND FIELDS: - For broad questions across many recent meetings (action items, weekly recaps, status updates, decision logs), pass `expand: "summary,actionItems,chapters"` so each returned item already carries that data. - This avoids firing one meeting_info per row, which is the slow path. Reserve meeting_info for when you need full detail (participants) on a specific meeting. - Allowed values are `summary`, `actionItems`, and `chapters`. Pass them as a single comma-separated string. - When `actionItems` is expanded, each entry includes `id`, `complete`, `assigneeId` (explicit assignment), `suggestedAssigneeId` (AI suggestion), and `suggestedAssigneeName` (display name for `assigneeId` when set, otherwise the AI-suggested name). On personal access tokens only, also includes `assignedToMe` and `suggestedForMe`. Skip `complete: true` items unless the user wants history. Prefer `assignedToMe: true`; treat `suggestedForMe: true` as a suggestion. - Meetings without a transcript (e.g. very short calls, calls without recording) will simply omit those fields. WORKFLOW: 1. Call meeting_list (no dates) to get recent meetings. Add `expand` if you need cross-meeting content rather than just titles. 2. Use the nextCursor to page backwards if the meeting isn't in the first page. 3. Use meeting_info with the ID for full detail (participants) on a specific meeting, or meeting_transcript for verbatim transcript. Parameters: - after (optional): Only include meetings after this time (RFC3339). Prefer leaving unset for recent-period requests. - before (optional): Only include meetings before this time (RFC3339). Prefer leaving unset for recent-period requests. - limit (optional): Maximum number of meetings to return - cursor (optional): Pagination cursor from a previous response to fetch the next page - expand (optional): Comma-separated extra per-meeting fields: `summary`, `actionItems`, `chapters`. Use this when scanning many meetings at once. Returns paginated meeting list with meeting name, start/end times, participant count, `hasVideo` (whether the meeting was video recorded), and `videoStatus` (`available`, `processing`, or `none` — once `available`, use meeting_share_link to get a shareable link to the recording). Each meeting includes an id for use with meeting_info and meeting_transcript. When expand is set, each item additionally carries the requested fields.

NameTypeRequiredDescription
afterstringoptionalOnly include meetings that started after this RFC3339 datetime. Leave unset for recent-period requests.
beforestringoptionalOnly include meetings that started before this RFC3339 datetime. Leave unset for recent-period requests.
cursorstringoptionalPagination cursor from a previous List Meetings response, used to page backwards through older meetings.
expandstringoptionalComma-separated list of extra per-meeting fields to include: summary, actionItems, chapters.
limitintegeroptionalMaximum number of meetings to return per page.
roammcp_meeting_participants#List participants of a meeting with pagination. Returns name, email, and member/guest type.3 params

List participants of a meeting with pagination. Returns name, email, and member/guest type.

NameTypeRequiredDescription
idstringrequiredThe meeting ID (UUID) whose participants should be listed.
cursorstringoptionalPagination cursor from a previous response's nextCursor, used to fetch the next page of participants.
limitintegeroptionalMaximum number of participants to return per page (default 50, max 200).
roammcp_meeting_prompt#Ask a question or give an instruction about a meeting's transcript. Uses AI to answer based on the meeting content.2 params

Ask a question or give an instruction about a meeting's transcript. Uses AI to answer based on the meeting content.

NameTypeRequiredDescription
idstringrequiredThe meeting ID (UUID) whose transcript the question or instruction applies to.
promptstringrequiredThe question or instruction to answer using the meeting's transcript, e.g. "What decisions were made about the launch date?"
roammcp_meeting_transcript#Retrieve the verbatim transcript for a meeting as WebVTT (timestamped cues with speaker names in `<v>` tags). WHEN TO USE THIS TOOL: - Use this ONLY when meeting_info's summary doesn't contain the specific detail needed - Use this when the user needs exact quotes or specific wording from the meeting - Use this when looking for detailed context not captured in the summary WORKFLOW: 1. First use meeting_list or meeting_search to find the meeting 2. Use meeting_info to get the summary and chapter list 3. If the summary is insufficient, use this tool for the verbatim transcript Parameters: - id (required): The meeting ID (UUID) from meeting_list or meeting_search results Note: Transcripts can be very long. Prefer meeting_info first — its summary usually answers the question. ERRORS: A 404 with code `transcript_pending` means the meeting is in progress or the transcript is still processing — it will exist soon; do not retry in a tight loop. A 404 with code `transcript_unavailable` means the meeting was not transcribed and the transcript will never exist — stop retrying. 1 param

Retrieve the verbatim transcript for a meeting as WebVTT (timestamped cues with speaker names in `<v>` tags). WHEN TO USE THIS TOOL: - Use this ONLY when meeting_info's summary doesn't contain the specific detail needed - Use this when the user needs exact quotes or specific wording from the meeting - Use this when looking for detailed context not captured in the summary WORKFLOW: 1. First use meeting_list or meeting_search to find the meeting 2. Use meeting_info to get the summary and chapter list 3. If the summary is insufficient, use this tool for the verbatim transcript Parameters: - id (required): The meeting ID (UUID) from meeting_list or meeting_search results Note: Transcripts can be very long. Prefer meeting_info first — its summary usually answers the question. ERRORS: A 404 with code `transcript_pending` means the meeting is in progress or the transcript is still processing — it will exist soon; do not retry in a tight loop. A 404 with code `transcript_unavailable` means the meeting was not transcribed and the transcript will never exist — stop retrying.

NameTypeRequiredDescription
idstringrequiredMeeting ID (UUID) from meeting_list or meeting_search results.
roammcp_onair_attendance_list#List attendance records for an OnAir event.3 params

List attendance records for an OnAir event.

NameTypeRequiredDescription
eventIdstringrequiredThe OnAir event ID to list attendance records for.
cursorstringoptionalPagination cursor from a previous response, used to fetch the next page of results.
limitintegeroptionalMaximum number of attendance records to return per page.
roammcp_onair_event_cancel#Cancel an OnAir broadcast event.1 param

Cancel an OnAir broadcast event.

NameTypeRequiredDescription
idstringrequiredThe OnAir event ID to cancel.
roammcp_onair_event_create#Create a new OnAir broadcast event. hosts[].imageUrl must be a Roam-hosted avatar URL from asset_create with purpose "avatar".10 params

Create a new OnAir broadcast event. hosts[].imageUrl must be a Roam-hosted avatar URL from asset_create with purpose "avatar".

NameTypeRequiredDescription
calendarHostEmailstringrequiredEmail address of the calendar host for this event.
endstringrequiredEvent end time (RFC3339).
startstringrequiredEvent start time (RFC3339).
timeZonestringrequiredIANA timezone used to interpret the start/end times (e.g. America/New_York).
titlestringrequiredThe event's title, shown to guests and on the event page.
autoAdmitbooleanoptionalWhether to automatically admit guests into the broadcast without manual approval.
descriptionstringoptionalA description of the event, shown on the event page.
disableRSVPbooleanoptionalWhether to disable RSVP collection for this event.
enableSEObooleanoptionalWhether to make this event discoverable by search engines.
hostsarrayoptionalOn-screen hosts for the broadcast. Each host has a display name and, optionally, an avatar image URL that must come from asset_create called with purpose "avatar" — a third-party image link will not work. Example: [{"name": "Jane Doe", "imageUrl": "https://cdn.ro.am/avatars/abc123.png"}]
roammcp_onair_event_info#Get details about a specific OnAir broadcast event.1 param

Get details about a specific OnAir broadcast event.

NameTypeRequiredDescription
idstringrequiredThe OnAir event ID to retrieve.
roammcp_onair_event_list#List OnAir broadcast events.2 params

List OnAir broadcast events.

NameTypeRequiredDescription
cursorstringoptionalPagination cursor from a previous response, used to fetch the next page of results.
limitintegeroptionalResults per page (default 50).
roammcp_onair_event_update#Update an existing OnAir event. hosts[].imageUrl must be a Roam-hosted avatar URL from asset_create with purpose "avatar".7 params

Update an existing OnAir event. hosts[].imageUrl must be a Roam-hosted avatar URL from asset_create with purpose "avatar".

NameTypeRequiredDescription
idstringrequiredThe OnAir event ID to update.
descriptionstringoptionalUpdated event description. Leave unset to keep the existing description.
endstringoptionalUpdated end time (RFC3339). Leave unset to keep the existing end time.
hostsarrayoptionalReplacement list of on-screen hosts for the broadcast. Each host has a display name and, optionally, an avatar image URL that must come from asset_create called with purpose "avatar" — a third-party image link will not work. Leave unset to keep the existing hosts. Example: [{"name": "Jane Doe", "imageUrl": "https://cdn.ro.am/avatars/abc123.png"}]
startstringoptionalUpdated start time (RFC3339). Leave unset to keep the existing start time.
timeZonestringoptionalUpdated IANA timezone (e.g. America/New_York). Leave unset to keep the existing timezone.
titlestringoptionalUpdated event title. Leave unset to keep the existing title.
roammcp_onair_guest_add#Add guests to an OnAir event.2 params

Add guests to an OnAir event.

NameTypeRequiredDescription
eventIdstringrequiredThe OnAir event ID to add guests to.
guestsarrayrequiredGuests to add. Each entry can include an email address, display name, phone number, and status. Example: [{"email": "guest@example.com", "name": "Jane Doe"}]
roammcp_onair_guest_info#Get details about an OnAir event guest.2 params

Get details about an OnAir event guest.

NameTypeRequiredDescription
eventIdstringrequiredID of the OnAir event the guest belongs to.
idstringrequiredID of the guest to look up.
roammcp_onair_guest_list#List guests for an OnAir event.3 params

List guests for an OnAir event.

NameTypeRequiredDescription
eventIdstringrequiredID of the OnAir event to list guests for.
cursorstringoptionalOpaque pagination cursor for fetching the next page of results.
limitintegeroptionalMaximum number of guests to return in one page of results.
roammcp_onair_guest_remove#Remove a guest from an OnAir event.2 params

Remove a guest from an OnAir event.

NameTypeRequiredDescription
eventIdstringrequiredID of the OnAir event the guest belongs to.
idstringrequiredID of the guest to remove.
roammcp_onair_guest_update#Update an OnAir event guest.5 params

Update an OnAir event guest.

NameTypeRequiredDescription
eventIdstringrequiredID of the OnAir event the guest belongs to.
idstringrequiredID of the guest to update.
statusstringrequiredUpdated status for the guest (e.g. their RSVP or attendance state). The upstream API requires this field on every update call once other fields like name/email are set.
emailstringoptionalUpdated email address for the guest.
namestringoptionalUpdated display name for the guest.
roammcp_reaction_add#Add an emoji reaction to a message.4 params

Add an emoji reaction to a message.

NameTypeRequiredDescription
chatIdstringrequiredID (UUID) of the chat containing the message.
namestringrequiredEmoji short code identifying the reaction.
timestampstringrequiredRFC3339 datetime of the message to react to, with microsecond precision.
threadTimestampstringoptionalRFC3339 datetime of the thread root message, when reacting to a threaded reply.
roammcp_reaction_list#List emoji reactions and poll votes on a message.3 params

List emoji reactions and poll votes on a message.

NameTypeRequiredDescription
chatIdstringrequiredID (UUID) of the chat containing the message.
timestampstringrequiredRFC3339 datetime of the message to list reactions for, with microsecond precision.
threadTimestampstringoptionalRFC3339 datetime of the thread root message, when the message is a threaded reply.
roammcp_reaction_remove#Remove an emoji reaction from a message.4 params

Remove an emoji reaction from a message.

NameTypeRequiredDescription
chatIdstringrequiredID (UUID) of the chat containing the message.
namestringrequiredEmoji short code identifying the reaction to remove.
timestampstringrequiredRFC3339 datetime of the message to remove the reaction from, with microsecond precision.
threadTimestampstringoptionalRFC3339 datetime of the thread root message, when the message is a threaded reply.
roammcp_story_post#Post a photo or video story to the caller's Roam. Stories appear above the author's profile picture for ~24 hours in the roam's shared story chat. **Personal access tokens only.** Unlike `chat_post` (which posts as a bot persona), stories are authored by the token owner as themselves. Org tokens are rejected. This is step 3 of posting a story. Media is **not** sent through this tool: 1. Call `asset_create` with `purpose: "story"`, the file `name` (include extension, e.g. `clip.mp4`), and optional `size`. 2. Upload the raw bytes out of band using the returned `uploadUrl` / `uploadMethod` / `uploadHeaders` (same single-request flow as chat attachments). 3. Call `story_post` with the `assetId` once processing completes. If you get "still processing", retry after a short delay. Parameters: - assetId (required): UUID from `asset_create` with `purpose: "story"`. Must be owned by the token owner, photo or video only, and not yet near its 48h asset expiry (leave enough headroom for the 24h story lifetime). - caption (optional): Text caption, up to 2048 characters. Response: `{itemId, chatId, expiresAt}` where `expiresAt` is when the story disappears (~24h from post). 2 params

Post a photo or video story to the caller's Roam. Stories appear above the author's profile picture for ~24 hours in the roam's shared story chat. **Personal access tokens only.** Unlike `chat_post` (which posts as a bot persona), stories are authored by the token owner as themselves. Org tokens are rejected. This is step 3 of posting a story. Media is **not** sent through this tool: 1. Call `asset_create` with `purpose: "story"`, the file `name` (include extension, e.g. `clip.mp4`), and optional `size`. 2. Upload the raw bytes out of band using the returned `uploadUrl` / `uploadMethod` / `uploadHeaders` (same single-request flow as chat attachments). 3. Call `story_post` with the `assetId` once processing completes. If you get "still processing", retry after a short delay. Parameters: - assetId (required): UUID from `asset_create` with `purpose: "story"`. Must be owned by the token owner, photo or video only, and not yet near its 48h asset expiry (leave enough headroom for the 24h story lifetime). - caption (optional): Text caption, up to 2048 characters. Response: `{itemId, chatId, expiresAt}` where `expiresAt` is when the story disappears (~24h from post).

NameTypeRequiredDescription
assetIdstringrequiredUUID of the uploaded asset (from asset_create with purpose "story") to post.
captionstringoptionalOptional caption text for the story, up to 2048 characters.
roammcp_token_info#Returns information about the current API token, including the authenticated user's identity (ID, name, email), the OAuth client ID, scopes, account, and bot persona (if any). 0 params

Returns information about the current API token, including the authenticated user's identity (ID, name, email), the OAuth client ID, scopes, account, and bot persona (if any).

roammcp_user_info#Resolve a member, guest, or automated actor by user ID. The required type field is user or bot; isGuest identifies non-member users. Email lookup remains workspace-member-only.3 params

Resolve a member, guest, or automated actor by user ID. The required type field is user or bot; isGuest identifies non-member users. Email lookup remains workspace-member-only.

NameTypeRequiredDescription
emailstringoptionalWorkspace member email address
expandstringoptionalComma-separated expand fields: status, available. status also includes willReturn (out-of-office until returnTime, with optional reason) when the user has one set — check it before pinging someone who may be away
idstringoptionalPrincipal user ID (bare or tagged UUID)
roammcp_user_list#List users (people) in your workspace. Returns active members of the account. Supports pagination. To find ONE specific person (e.g. resolve a name to their email/id so you can DM or @mention them), pass `q` with their name — that returns just the matches in a single call, no paging. Parameters: - q (optional): Filter to users whose name or email contains this text (case-insensitive). Use it to look a person up by name. - limit (optional): Max results per page (default 10) - cursor (optional): Pagination cursor from a previous response - expand (optional): Additional fields to include (e.g., "status"). "status" also includes willReturn (out-of-office until returnTime, with optional reason) when a user has one set 5 params

List users (people) in your workspace. Returns active members of the account. Supports pagination. To find ONE specific person (e.g. resolve a name to their email/id so you can DM or @mention them), pass `q` with their name — that returns just the matches in a single call, no paging. Parameters: - q (optional): Filter to users whose name or email contains this text (case-insensitive). Use it to look a person up by name. - limit (optional): Max results per page (default 10) - cursor (optional): Pagination cursor from a previous response - expand (optional): Additional fields to include (e.g., "status"). "status" also includes willReturn (out-of-office until returnTime, with optional reason) when a user has one set

NameTypeRequiredDescription
cursorstringoptionalPagination cursor
expandstringoptionalExpand fields: status. status also includes willReturn (out-of-office until returnTime, with optional reason) when a user has one set
idsstringoptionalComma-separated principal IDs to hydrate (maximum 100). Cannot be combined with q, limit, or cursor; unresolved IDs are omitted
limitintegeroptionalPage limit (default 10)
qstringoptionalFilter to users whose name or email contains this text (case-insensitive) — use it to look one person up by name in a single call
roammcp_webhook_deliveries#List recent FAILED webhook delivery attempts for the authenticated client — timeouts (statusCode 0, error "timeout"), connection errors, and non-2xx responses. Use this to diagnose why an endpoint is not receiving events. Successful deliveries are not recorded. Each row has timestamp, webhookId, event, url, statusCode, error (class), response (server's error body, when any), durationMs, and messageId. Results are newest-first and strictly scoped to the caller's own subscriptions. Failures are retained for about 30 days.5 params

List recent FAILED webhook delivery attempts for the authenticated client — timeouts (statusCode 0, error "timeout"), connection errors, and non-2xx responses. Use this to diagnose why an endpoint is not receiving events. Successful deliveries are not recorded. Each row has timestamp, webhookId, event, url, statusCode, error (class), response (server's error body, when any), durationMs, and messageId. Results are newest-first and strictly scoped to the caller's own subscriptions. Failures are retained for about 30 days.

NameTypeRequiredDescription
afterstringoptionalReturn failures after this RFC3339 timestamp
beforestringoptionalReturn failures before this RFC3339 timestamp (for pagination)
eventstringoptionalFilter to a single event type (e.g. chat.message)
limitintegeroptionalMax rows to return (default 10, max 100)
webhookstringoptionalFilter to a single webhook subscription ID (UUID)
roammcp_webhook_subscribe#Subscribe to receive webhook events at a URL.3 params

Subscribe to receive webhook events at a URL.

NameTypeRequiredDescription
eventstringrequiredEvent type (e.g. chat.message, onair.event.created)
urlstringrequiredWebhook delivery URL (HTTPS, max 1024 chars)
filterobjectoptionalEvent-specific filter object (e.g. {"hasVideo": true} on meeting.ended to only receive meetings that were video recorded; the recording may still be uploading when the event fires)
roammcp_webhook_unsubscribe#Unsubscribe from a webhook by ID.1 param

Unsubscribe from a webhook by ID.

NameTypeRequiredDescription
idstringrequiredWebhook subscription ID (UUID)