The Roam MCP connector routes your AI agent's tool calls to Roam's own MCP server through Scalekit. Each user signs in to Roam once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 70 tools.
- Tools
- 70
- What they doRead · write · destructive
- 33 · 33 · 433 read33 write4 destructive
- Users sign in with
- OAuth
- OAuth app
- Scalekit's or your own
Setup
Install the SDK
Terminal window npm install @scalekit-sdk/node dotenvTerminal window pip install scalekit-sdk-python python-dotenvSet your credentials
Add your Scalekit credentials to your
.envfile. 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>Create the Roam MCP connection
In AgentKit > Connections, create a Roam MCP connection. The name you give it is the
connection_nameyour code passes. See Configure connections.Scalekit credentials are available for Roam MCP server, so you don't need to register an OAuth app.
Authorize a user and make your first call
quickstart.mts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'import { createInterface } from 'node:readline/promises'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENVIRONMENT_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'roammcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Roam MCP:', link)const rl = createInterface({ input: process.stdin, output: process.stdout })await rl.question('Press Enter after authorizing...')rl.close()// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'roammcp_get_me',toolInput: {},})console.log(result)Terminal window npx tsx quickstart.mtsquickstart.py import osfrom scalekit import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "roammcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Roam MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="roammcp_get_me",connection_name=connection_name,identifier=identifier,)print(result)Terminal window python quickstart.pyEach user signs in once. See Authorize a user for the full flow and statuses.
Tools
Pass the exact name toexecute_toolroammcp_calendar_listList scheduled calendar events within a date range from the user's connected calendars (Google Calendar, Outlook).Read-onlyList calendar events
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.
Inputs
endDatestring- End of the date range to list events for, as a YYYY-MM-DD date. Defaults to startDate plus 7 days.
startDatestring- Start 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_historyRead messages from a specific chat conversation.Read-onlyGet 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.
Inputs
afterstring- Only return messages sent after this RFC3339 timestamp. When set, results are returned oldest-first instead of newest-first.
ascendingstring- Whether 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.
beforestring- Only return messages sent before this RFC3339 timestamp.
chatIdstring- The UUID of an existing chat conversation to read, from chat_list results. Provide exactly one of chatId, groupId, or userIds to identify the conversation.
cursorstring- Pagination cursor from a previous response, used to fetch the next page of messages.
groupIdstring- The UUID of a group/channel to read, from group_list results — reads that group's channel. Provide exactly one of chatId, groupId, or userIds.
limitinteger- Maximum number of messages to return per page (max 200).
threadTimestampstring- The 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.
userIdsarray- One 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_listList your recent conversations (DMs and groups), sorted by most recent activity.Read-onlyList chats
List your recent conversations (DMs and groups), sorted by most recent activity.
Inputs
cursorstring- Pagination cursor from a previous response, used to fetch the next page of conversations.
limitinteger- Maximum number of conversations to return per page. Defaults to 10.default
10
roammcp_chat_scheduled_listList pending messages scheduled via chat_post's sendAt that have not been sent yet.Read-onlyList scheduled chat messages
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.
Inputs
afterstring- Only return messages scheduled to send after this RFC3339 timestamp.
beforestring- Only return messages scheduled to send before this RFC3339 timestamp.
chatIdstring- Only return scheduled messages targeting this chat UUID.
cursorstring- Pagination cursor from a previous response, used to fetch the next page of scheduled messages.
limitinteger- Maximum number of scheduled messages to return per page.
roammcp_chat_searchSearch chat messages matching a query and filters.Read-onlySearch chat messages
Search chat messages matching a query and filters. This tool searches **across every chat the caller can see** (subject to chatTypes), so it is the right tool for a workspace-wide pulse — what is going on across all conversations, not just one. Prefer it over fanning out per-chat with chat_history when you want broad situational awareness. By default, searches every indexed chat type the caller can see — DMs, channels, teamRoam, and meeting channels (Magic Minutes summaries and other meeting-channel posts). Use chatTypes to narrow to specific types. To list recent messages across chats without a search query, use sort: "recent" with an empty query. Examples: - Search all chats: {"query": "budget report"} - List recent activity across the workspace: {"sort": "recent"} - List recent teamRoam messages: {"sort": "recent", "chatTypes": ["teamRoam"]} - List recent DMs: {"sort": "recent", "chatTypes": ["address"]} - Drop noisy automated channels: {"sort": "recent", "excludeChatIds": ["<chatId-from-prior-result>"]} - Drop a noisy bot sender: {"sort": "recent", "excludeUserIds": ["<userId-from-prior-result>"]} When summarizing recent activity, follow a two-pass workflow: 1. First pass: call chat_search with sort: "recent" and no exclusions to see who is posting where. 2. If a small number of chats or senders dominate the results with automated/bot noise (CI bots, deploy bots, alert webhooks, etc.), call chat_search again with those chat IDs in excludeChatIds and/or those sender userIds in excludeUserIds. The second pass should surface human conversation. Parameters: - query (optional): Search text - chatTypes (optional): Filter by chat type — array of "channel", "teamRoam", "address", or "meetingChannel" (default: all indexed types). - in (optional): Group names to search within - from (optional): Sender email addresses - with (optional): Conversation participant emails - excludeChatIds (optional): Chat IDs to exclude. Populate from the chatId field on prior results to drop automated/noisy channels. - excludeUserIds (optional): Sender user IDs to exclude. Populate from the `userId` field on prior results to drop automated/bot senders. - before/after (optional): Date filters (YYYY-MM-DD). Both are optional — omit both to search all time. Never set before and after to the same date (returns nothing). Dates are treated as midnight, so to search a single day like 2024-04-14, use after: "2024-04-14" and before: "2024-04-15". - has (optional): "mention" or "item" - sort (optional): "relevant" (default) or "recent". For recent messages with no query, prefer sort "recent" with no date filters. - limit (optional): Max results per page - cursor (optional): Pagination cursor from 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. 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`). Replace `<@<uuid>>` and `<!subteam^<uuid>>` in `text` with `@` + `addresses.<uuid>.displayName` to render, 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`. For excludeUserIds, pass the `userId` field from a prior result (matches the wire shape).
Inputs
afterstring- Only include messages sent after this date (YYYY-MM-DD, treated as midnight). Optional; omit both before and after to search all time.
beforestring- Only include messages sent before this date (YYYY-MM-DD, treated as midnight). Optional; omit both before and after to search all time. Never set before and after to the same date, since the range would be empty.
chatTypesarray- Restrict results to specific chat types: channel, teamRoam, address (DMs), or meetingChannel (Magic Minutes and other meeting-channel posts). Defaults to searching all indexed types the caller can see.
cursorstring- Pagination cursor from a previous response, used to fetch the next page of results.
excludeChatIdsarray- Chat UUIDs to exclude from results, typically populated from the chatId field of a prior noisy/automated result to drop that channel on a follow-up search.
excludeUserIdsarray- Sender user UUIDs to exclude from results, typically populated from the userId field of a prior result to drop a noisy bot or automated sender on a follow-up search.
fromarray- Restrict results to messages sent by these sender email addresses.
hasarray- Restrict results to messages that have a mention or an attached item.
inarray- Restrict the search to messages within these group/channel names.
limitinteger- Maximum number of results to return per page.
querystring- Free-text search query to match against message content across the caller's visible chats. Leave empty (with sort set to recent) to list recent activity instead of searching.
sortstring- How to order results: relevant (default) ranks by relevance to query, recent sorts newest-first. Use recent with an empty query to list recent activity across chats.one of
relevantrecentdefaultrelevant witharray- Restrict results to conversations that include these participant email addresses.
roammcp_conversation_listList conversations from the workspace's attendance/reporting log, with per-participant time-in-conversation detail.Read-onlyList conversations
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).
Inputs
afterstring- RFC3339 datetime, conversations after this time. When ascending is omitted, this also sorts oldest-first.
ascendingstring- Sort oldest-first (true) or newest-first (false). Repeat on later pages. When omitted, after still sorts oldest-first.
beforestring- RFC3339 datetime, conversations before this time
cursorstring- Pagination cursor from a previous response
expandstring- Comma-separated extra fields: ip (participant IP addresses; org tokens only)
limitinteger- Results per page (default 10, max 100)
roammcp_create_chat_linkCreate a shareable Roam link to a specific chat message.Read-onlyCreate chat message link
Create a shareable Roam link to a specific chat message. WHEN TO USE THIS TOOL: - When a user asks for a link to a message so they can share or reference it - To turn a message found via chat_history or chat_search into a URL that opens that message in Roam Parameters: - chatId, groupId, or userIds (exactly one required): the chat containing the message - timestamp (required): the message's timestamp in Unix microseconds - threadTimestamp (optional): the thread root's timestamp, required when the message is a thread reply The message must exist and be readable by this credential; otherwise the call fails and no link is returned. Returns the link URL along with the resolved chatId and timestamps. The link identifies the message but does not grant access — recipients see it only if they are members of the chat.
Inputs
timestampintegerrequired- Message timestamp in Unix microseconds, as returned by chat_history or chat_search.
chatIdstring- Chat ID (UUID) containing the message. Exactly one of chatId, groupId, or userIds is required.
groupIdstring- Group ID (UUID) whose channel chat contains the message.
threadTimestampinteger- Thread root timestamp in Unix microseconds. Required when the message is a thread reply.
userIdsarray- User ID(s) (UUIDs) identifying the DM or group DM containing the message.
roammcp_get_meGet the authenticated user's identity: `id`, `name`, and (when the token has the `user:read.email` scope) `email`.Read-onlyGet my user info
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.
Inputs
This tool takes no inputs.
roammcp_group_infoGet information about a group/channel by ID or name.Read-onlyGet group info
Get information about a group/channel by ID or name.
Inputs
idstring- Group ID (UUID)
namestring- Group name (exact match)
roammcp_group_listList non-archived groups/channels in your workspace, visible to the authenticated user.Read-onlyList groups
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.
Inputs
cursorstring- Pagination cursor from a previous response
limitinteger- Page limit (default 50, max 100)default
50 querystring- Case-insensitive name search, ranked by match quality
typestring- Comma-separated group types to include: standard, magicast, meeting, roam, onair
roammcp_lobby_booking_listList all bookings for a specific lobby.Read-onlyList lobby bookings
List all bookings for a specific lobby. Supports date range filtering and pagination.
Inputs
lobbyIdstringrequired- Lobby configuration ID (UUID)
afterstring- Return bookings after this time. When ascending is omitted, this also sorts oldest-first.
ascendingstring- Sort oldest-first (true) or newest-first (false). Repeat on later pages. When omitted, after still sorts oldest-first.
beforestring- Return bookings before this time
cursorstring- Pagination cursor
limitinteger- Max bookings to return
roammcp_lobby_listList all lobbies configured for the authenticated account.Read-onlyList lobbies
List all lobbies configured for the authenticated account. Optionally filter by handle.
Inputs
handlestring- Filter lobbies by handle slug
roammcp_magicast_infoGet 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.Read-onlyGet 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.
Inputs
idstringrequired- The Magicast ID (UUID) to look up, e.g. one returned by List Magicasts.
roammcp_magicast_listList Magicasts.Read-onlyList Magicasts
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.
Inputs
afterstring- RFC3339 datetime, events after this time
ascendingstring- Sort oldest-first (true) or newest-first (false). Repeat on later pages. When omitted, after still sorts oldest-first.
beforestring- RFC3339 datetime, events before this time
cursorstring- Pagination cursor
limitinteger- Results per page (max 100)
roammcp_meeting_infoRetrieve detailed information about a specific meeting including AI-generated summary, action items, and chapter breakdowns.Read-onlyGet 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.
Inputs
idstringrequired- The meeting ID (UUID) to retrieve, from List Meetings or a search result.
maxParticipantsinteger- Maximum number of participants to include in the response (default 10).default
10
roammcp_meeting_link_infoGet details about a specific meeting link.Read-onlyGet meeting link info
Get details about a specific meeting link.
Inputs
idstringrequired- The meeting link ID (UUID) to look up.
roammcp_meeting_listList meeting transcripts with optional date filters and pagination.Read-onlyList meetings
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.
Inputs
afterstring- Only include meetings that started after this RFC3339 datetime. Leave unset for recent-period requests.
beforestring- Only include meetings that started before this RFC3339 datetime. Leave unset for recent-period requests.
cursorstring- Pagination cursor from a previous List Meetings response, used to page backwards through older meetings.
expandstring- Comma-separated list of extra per-meeting fields to include: summary, actionItems, chapters.
limitinteger- Maximum number of meetings to return per page.
roammcp_meeting_participantsList participants of a meeting with pagination.Read-onlyList meeting participants
List participants of a meeting with pagination. Returns name, email, and member/guest type.
Inputs
idstringrequired- The meeting ID (UUID) whose participants should be listed.
cursorstring- Pagination cursor from a previous response's nextCursor, used to fetch the next page of participants.
limitinteger- Maximum number of participants to return per page (default 50, max 200).default
50
roammcp_meeting_promptAsk a question or give an instruction about a meeting's transcript.Read-onlyPrompt a meeting
Ask a question or give an instruction about a meeting's transcript. Uses AI to answer based on the meeting content.
Inputs
idstringrequired- The meeting ID (UUID) whose transcript the question or instruction applies to.
promptstringrequired- The question or instruction to answer using the meeting's transcript, e.g. "What decisions were made about the launch date?"
roammcp_meeting_searchSearch meeting recordings by content.Read-onlySearch meetings
Search meeting recordings by content. Supports natural language queries like "meetings with John last week" or "discussions about the product launch". WHEN TO USE THIS TOOL: - Use this when searching for meetings by TOPIC or CONTENT (e.g., "meetings about budgets", "discussions with the marketing team") - Use this when the user mentions specific keywords or topics they want to find - For browsing by date only (e.g., "my meeting yesterday"), use meeting_list instead WORKFLOW: 1. Use meeting_search to find relevant meetings by content/topic 2. Use meeting_info with the result's meetingId (passed as the id parameter) to get detailed summary and chapters 3. If the summary doesn't answer the question, use meeting_transcript for the full transcript Parameters: - query (required): Search query for meeting content. Supports: - Keywords: "budget review", "product launch" - Natural language filters: "meetings with John last week", "calls about hiring in January" - after (optional): Only include meetings after this date (YYYY-MM-DD) - before (optional): Only include meetings before this date (YYYY-MM-DD) - timezone (optional): Timezone for date interpretation (e.g. America/New_York) Returns meeting results with: - meetingId (pass this as the id parameter to meeting_info and meeting_transcript) - Meeting name and date - Highlighted matches showing where query terms appear in summaries and transcripts
Inputs
querystringrequired- Search query for meeting content — keywords (e.g. "budget review") or natural language filters (e.g. "meetings with John last week").
afterstring- Only include meetings after this date (YYYY-MM-DD). Leave unset to search without a lower bound.
beforestring- Only include meetings before this date (YYYY-MM-DD). Leave unset to search without an upper bound.
timezonestring- IANA timezone used to interpret the after/before dates (e.g. America/New_York). Defaults to the workspace timezone if omitted.
roammcp_meeting_transcriptRetrieve the verbatim transcript for a meeting as WebVTT (timestamped cues with speaker names in `<v>` tags).Read-onlyGet 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.
Inputs
idstringrequired- Meeting ID (UUID) from meeting_list or meeting_search results.
roammcp_onair_attendance_listList attendance records for an OnAir event.Read-onlyList OnAir attendance
List attendance records for an OnAir event.
Inputs
eventIdstringrequired- The OnAir event ID to list attendance records for.
cursorstring- Pagination cursor from a previous response, used to fetch the next page of results.
limitinteger- Maximum number of attendance records to return per page.
roammcp_onair_event_infoGet details about a specific OnAir broadcast event.Read-onlyGet OnAir event info
Get details about a specific OnAir broadcast event.
Inputs
idstringrequired- The OnAir event ID to retrieve.
roammcp_onair_event_listList OnAir broadcast events.Read-onlyList OnAir events
List OnAir broadcast events.
Inputs
cursorstring- Pagination cursor from a previous response, used to fetch the next page of results.
limitinteger- Results per page (default 50).
roammcp_onair_guest_infoGet details about an OnAir event guest.Read-onlyGet OnAir guest info
Get details about an OnAir event guest.
Inputs
eventIdstringrequired- Event ID
guestIdstringrequired- Guest ID
roammcp_onair_guest_listList guests for an OnAir event.Read-onlyList OnAir guests
List guests for an OnAir event.
Inputs
eventIdstringrequired- ID of the OnAir event to list guests for.
cursorstring- Opaque pagination cursor for fetching the next page of results.
limitinteger- Maximum number of guests to return in one page of results.
roammcp_reaction_listList emoji reactions and poll votes on a message.Read-onlyList reactions
List emoji reactions and poll votes on a message.
Inputs
chatIdstringrequired- ID (UUID) of the chat containing the message.
timestampstringrequired- RFC3339 datetime of the message to list reactions for, with microsecond precision.
threadTimestampstring- RFC3339 datetime of the thread root message, when the message is a threaded reply.
roammcp_resolve_chat_linkResolve a Roam chat link URL into the referenced message.Read-onlyResolve chat link
Resolve a Roam chat link URL into the referenced message. WHEN TO USE THIS TOOL: - When a user provides a Roam chat link (e.g., https://ro.am/r/#/c/...) - To look up the content of a specific message referenced by a link Parameters: - link (required): A Roam chat link URL (e.g., https://ro.am/r/#/c/{idStr}/{code}) Returns the message content including sender, timestamp, text, and replyCount. If the caller lacks access to the chat, the response still includes the chatId and timestamps of the referenced message, but readable is false and no message content is returned.
Inputs
linkstringrequired- Roam chat link URL (e.g., https://ro.am/r/#/c/{idStr}/{code})
roammcp_searchSearch the caller's Roam workspace.Read-onlySearch Roam
Search the caller's Roam workspace. This tool exists so MCP clients that hard-code a `search` tool name (e.g. ChatGPT) hit a working endpoint without per-client configuration. It is a thin alias for `chat_search` and forwards every call to the same chat search index, which covers DMs, channels, teamRoam, and meeting channels (Magic Minutes summaries and other indexed meeting-channel posts). For filtering by sender, group, date range, attachments, exclusions, sort, or chat type, call `chat_search` directly. For LLM-summarized search across meeting transcripts, use `meeting_search`. Parameters: - query (required): Search text. Each returned message carries: - `timestamp` — RFC3339 send time (with microsecond precision). - `threadTimestamp` — RFC3339 thread root (only on replies). - `chatId` — chat the message belongs to. - `userId` — UUID of the sender; look up in the response envelope's `addresses` map. - `text` — canonical message text with Slack-syntax mention tokens: `<@uuid>` principals, `<!subteam^uuid>` groups/channels, `<!channel>` broadcast. Not rewritten by the server. - `mentions` — flat list of payloads (bare UUIDs from both token forms, and the literal `"all"` for `<!channel>`) referenced in `text`. The response envelope additionally carries an `addresses` map keyed by UUID with display name + type + type-specific fields (botCode, email, isGuest, etc.) for every sender and mention target. Use it to render display names; missing keys mean the caller isn't authorized to view that address.
Inputs
querystringrequired- The text to search for across the caller's Roam workspace.
roammcp_token_infoReturns 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).Read-onlyGet 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).
Inputs
This tool takes no inputs.
roammcp_user_infoResolve a member, guest, or automated actor by user ID.Read-onlyGet principal 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.
Inputs
emailstring- Workspace member email address
expandstring- Comma-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
idstring- Principal user ID (bare or tagged UUID)
roammcp_user_listList users (people) in your workspace.Read-onlyList users
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
Inputs
cursorstring- Pagination cursor
expandstring- Expand fields: status. status also includes willReturn (out-of-office until returnTime, with optional reason) when a user has one set
idsstring- Comma-separated principal IDs to hydrate (maximum 100). Cannot be combined with q, limit, or cursor; unresolved IDs are omitted
limitinteger- Page limit (default 10)default
10 qstring- Filter 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_deliveriesList recent FAILED webhook delivery attempts for the authenticated client — timeouts (statusCode 0, error "timeout"), connection errors, and non-2xx responses.Read-onlyList failed 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.
Inputs
afterstring- Return failures after this RFC3339 timestamp. When ascending is omitted, this also sorts oldest-first.
ascendingstring- Sort oldest-first (true) or newest-first (false). Repeat on later pages. When omitted, after still sorts oldest-first.
beforestring- Return failures before this RFC3339 timestamp (for pagination)
eventstring- Filter to a single event type (e.g. chat.message)
limitinteger- Max rows to return (default 10, max 100)
webhookstring- Filter to a single webhook subscription ID (UUID)
roammcp_asset_createCreate a file upload and get back a self-describing instruction for sending the bytes out of band.WriteCreate a file upload
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.
Inputs
namestringrequired- The 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.
purposestring- What 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.one of
filestoryavatardefaultfile sizeinteger- The 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_createCreate a new calendar event on the authenticated user's calendar.WriteCreate a calendar event
Create a new calendar event on the authenticated user's calendar. Automatically adds a Roam meeting link and sends email notifications to attendees.
Inputs
endstringrequired- End time (RFC3339)
startstringrequired- Start time (RFC3339)
titlestringrequired- Event title
allDayboolean- Whether this is an all-day event (default false)
attendeesarray- Attendee emails or 'Name <email>' strings
descriptionstring- Event description
hideGuestListboolean- Hide the attendee list from guests so they cannot see who else was invited (Google: guests can't see other guests; Outlook: hide attendees). Use when the user asks to hide or conceal the guest list, keep attendees private, or bcc invitees on a group invite. Default false.
hoststring- Host email (required for bot/org tokens, optional for personal tokens â defaults to the authenticated user)
rrulestring- iCalendar RFC 5545 recurrence rule (e.g. FREQ=WEEKLY;COUNT=10)
timeZonestring- IANA timezone (e.g. America/New_York). Required for recurring events, recommended for all.
roammcp_chat_postSend a message to a chat conversation.WritePost a chat message
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.
Inputs
textstringrequired- Message text
assetIdsarray- Asset IDs from asset_create to attach
blocksarray- Block Kit blocks
chatIdstring- Chat ID (UUID)
colorstring- Message color (hex or good/danger/warning)
groupIdstring- Group ID (UUID)
itemsarray- Item IDs (attachments)
markdownboolean- Treat text as markdown (default true)
sendAtstring- RFC3339 datetime on a 15-minute boundary (:00/:15/:30/:45 UTC), up to 30 days ahead; incompatible with sync/poll/threadKey/replyTimestamp
senderobject- Bot sender identity
syncboolean- Wait for delivery confirmation
threadKeystring- Idempotency key for thread creation
threadTimestampstring- Reply to thread (RFC3339 datetime of the thread root)
userIdsarray- User IDs (UUID) for DM
roammcp_chat_scheduled_cancelCancel a pending scheduled message before it is sent, by the scheduledMessageId returned from chat_post.WriteCancel a scheduled chat message
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.
Inputs
scheduledMessageIdstringrequired- The 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_updateUpdate a bot message's content.WriteUpdate a chat message
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.
Inputs
chatIdstringrequired- Chat ID (UUID)
timestampstringrequired- Message RFC3339 datetime (e.g. 2026-04-22T13:04:57.123456Z)
assetIdsarray- Asset IDs from asset_create to attach
blocksarray- Block Kit blocks
colorstring- Message color (hex or good/danger/warning)
itemsarray- Item IDs (attachments)
markdownboolean- Treat text as markdown (default true)default
true textstring- Updated message text
threadTimestampstring- Thread RFC3339 datetime (omit for a main-channel message)
roammcp_folder_add_contentsFile meetings and Magicasts into a folder (up to 100 per call).WriteFolder Add Contents
File meetings and Magicasts into a folder (up to 100 per call). Every folder member gains access to them. With personal access you must be a folder admin and able to view each item.
Inputs
idstringrequired- Folder ID (UUID)
magicastIdsarray- Magicast IDs (UUIDs)
meetingIdsarray- Meeting IDs (UUIDs)
roammcp_folder_add_membersAdd people to a folder or change their role (up to 100 per call).WriteFolder Add Members
Add people to a folder or change their role (up to 100 per call). Admins can manage the folder; viewers can see it and everything in it. A folder must keep at least one admin. Requires the admin role on the folder with personal access.
Inputs
idstringrequired- Folder ID (UUID)
userIdsarrayrequired- User IDs to add or update
rolestring- Role to grant (default viewer)one of
vieweradmin
roammcp_folder_contentsList the items filed in a folder.WriteFolder Contents
List the items filed in a folder. type is not a closed set; ignore types you do not understand. A file is type, id, and addedAt with no embedded object. Meetings and Magicasts include their metadata. Newest first unless ascending is true, or ascending is omitted and after is set. Folder members can read every item in the folder: use meeting_transcript, meeting_prompt, or meeting_info for a meeting, and magicast_info for a Magicast.
Inputs
idstringrequired- Folder ID (UUID)
afterstring- RFC3339 datetime, items added after this time. When ascending is omitted, this also sorts oldest-first.
ascendingstring- Sort oldest-first (true) or newest-first (false). Repeat on later pages. When omitted, after still sorts oldest-first.
beforestring- RFC3339 datetime, items added before this time
cursorstring- Pagination cursor
limitinteger- Results per page (max 100)
typestring- Only return this kind of itemone of
assetmagicastmeeting
roammcp_folder_createCreate a folder for meetings and Magicasts.WriteFolder Create
Create a folder for meetings and Magicasts. With personal access you become the folder's admin; with organization access, ownerId (a user ID in the account) is required and becomes the admin. The folder is private to its members until you add more with folder_add_members.
Inputs
namestringrequired- Folder name (max 255 characters)
ownerIdstring- Organization access only: user ID of the folder admin
roammcp_folder_infoGet a folder by ID: name, item count, creation time, and your role.WriteFolder Info
Get a folder by ID: name, item count, creation time, and your role.
Inputs
idstringrequired- Folder ID (UUID)
roammcp_folder_listList folders of meetings and Magicasts.WriteFolder List
List folders of meetings and Magicasts. With personal access, only folders you belong to are returned, with your role (admin or viewer). Use folder_contents to see what is filed in a folder.
Inputs
afterstring- RFC3339 datetime, folders created after this time. When ascending is omitted, this also sorts oldest-first.
ascendingstring- Sort oldest-first (true) or newest-first (false). Repeat on later pages. When omitted, after still sorts oldest-first.
beforestring- RFC3339 datetime, folders created before this time
cursorstring- Pagination cursor
limitinteger- Results per page (max 100)
roammcp_folder_membersList a folder's members and their roles (admin or viewer).WriteFolder Members
List a folder's members and their roles (admin or viewer). Use user_info or user_list to resolve user IDs to names.
Inputs
idstringrequired- Folder ID (UUID)
roammcp_folder_renameRename a folder.WriteFolder Rename
Rename a folder. Requires the admin role on the folder with personal access.
Inputs
idstringrequired- Folder ID (UUID)
namestringrequired- New folder name (max 255 characters)
roammcp_group_createCreate a new group/channel with initial members.WriteCreate a group
Create a new group/channel with initial members.
Inputs
membersarrayrequired- Initial members with roles, as an array of {userId, role} objects. userId is the member's UUID; role is "member" (default) or "admin".
namestringrequired- Group name (max 64 chars)
descriptionstring- Group description (max 1024 chars)
enforceThreadsboolean- Enforce threaded messages
privateboolean- Whether group is private
roammcp_group_joinJoin a public group/channel as the calling identity.WriteJoin a group
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.
Inputs
idstringrequired- Group ID (UUID)
roammcp_meeting_link_createCreate a new meeting link with a specified time window and optional host assignment.WriteCreate a meeting link
Create a new meeting link with a specified time window and optional host assignment.
Inputs
endstringrequired- End time of the meeting window, as an RFC3339 datetime.
namestringrequired- The display name shown for this meeting link.
startstringrequired- Start time of the meeting window, as an RFC3339 datetime.
hoststring- Email address of the meeting host. Required when authenticating with a bot or organization token.
requireUnconfirmedEmailboolean- Whether guests must verify an unconfirmed email address before joining via this link.
roammcp_meeting_link_updateUpdate an existing meeting link's name and time window.WriteUpdate a meeting link
Update an existing meeting link's name and time window.
Inputs
idstringrequired- The meeting link ID (UUID) to update.
namestringrequired- Updated display name for the meeting link (max 255 characters).
endstring- Updated end time of the meeting window, as an RFC3339 datetime.
hoststring- Host email address, for reference. The host of an existing meeting link cannot be changed.
requireUnconfirmedEmailboolean- Whether guests must verify an unconfirmed email address before joining via this link.
startstring- Updated start time of the meeting window, as an RFC3339 datetime.
roammcp_onair_event_cancelCancel an OnAir broadcast event.WriteCancel OnAir event
Cancel an OnAir broadcast event.
Inputs
idstringrequired- The OnAir event ID to cancel.
roammcp_onair_event_createCreate a new OnAir broadcast event.WriteCreate OnAir event
Create a new OnAir broadcast event. hosts[].imageUrl must be a Roam-hosted avatar URL from asset_create with purpose "avatar".
Inputs
calendarHostEmailstringrequired- Email address of the calendar host for this event.
endstringrequired- Event end time (RFC3339).
startstringrequired- Event start time (RFC3339).
timeZonestringrequired- IANA timezone used to interpret the start/end times (e.g. America/New_York).
titlestringrequired- The event's title, shown to guests and on the event page.
autoAdmitboolean- Whether to automatically admit guests into the broadcast without manual approval.
descriptionstring- A description of the event, shown on the event page.
disableRSVPboolean- Whether to disable RSVP collection for this event.
enableSEOboolean- Whether to make this event discoverable by search engines.
hostsarray- 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. Example: [{"name": "Jane Doe", "imageUrl": "https://cdn.ro.am/avatars/abc123.png"}]
roammcp_onair_event_updateUpdate an existing OnAir event.WriteUpdate OnAir event
Update an existing OnAir event. hosts[].imageUrl must be a Roam-hosted avatar URL from asset_create with purpose "avatar".
Inputs
idstringrequired- The OnAir event ID to update.
descriptionstring- Updated event description. Leave unset to keep the existing description.
endstring- Updated end time (RFC3339). Leave unset to keep the existing end time.
hostsarray- Replacement 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"}]
startstring- Updated start time (RFC3339). Leave unset to keep the existing start time.
timeZonestring- Updated IANA timezone (e.g. America/New_York). Leave unset to keep the existing timezone.
titlestring- Updated event title. Leave unset to keep the existing title.
roammcp_onair_guest_addAdd guests to an OnAir event.WriteAdd OnAir guests
Add guests to an OnAir event.
Inputs
eventIdstringrequired- The OnAir event ID to add guests to.
guestsarrayrequired- Guests 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_removeRemove a guest from an OnAir event.WriteRemove OnAir guest
Remove a guest from an OnAir event.
Inputs
eventIdstringrequired- Event ID
guestIdstringrequired- Guest ID
roammcp_onair_guest_updateUpdate an OnAir event guest.WriteUpdate OnAir guest
Update an OnAir event guest.
Inputs
eventIdstringrequired- Event ID
guestIdstringrequired- Guest ID
statusstringrequired- No description.
emailstring- No description.
namestring- No description.
roammcp_reaction_addAdd an emoji reaction to a message.WriteAdd a reaction
Add an emoji reaction to a message.
Inputs
chatIdstringrequired- ID (UUID) of the chat containing the message.
namestringrequired- Emoji short code identifying the reaction.
timestampstringrequired- RFC3339 datetime of the message to react to, with microsecond precision.
threadTimestampstring- RFC3339 datetime of the thread root message, when reacting to a threaded reply.
roammcp_reaction_removeRemove an emoji reaction from a message.WriteRemove a reaction
Remove an emoji reaction from a message.
Inputs
chatIdstringrequired- ID (UUID) of the chat containing the message.
namestringrequired- Emoji short code identifying the reaction to remove.
timestampstringrequired- RFC3339 datetime of the message to remove the reaction from, with microsecond precision.
threadTimestampstring- RFC3339 datetime of the thread root message, when the message is a threaded reply.
roammcp_story_postPost a photo or video story to the caller's Roam.WritePost a story
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).
Inputs
assetIdstringrequired- UUID of the uploaded asset (from asset_create with purpose "story") to post.
captionstring- Optional caption text for the story, up to 2048 characters.
roammcp_user_status_bubble_clearClear the user's current thought bubble, whether it was set through Roam or an integration.WriteUser Status Bubble Clear
Clear the user's current thought bubble, whether it was set through Roam or an integration. Personal connections may only clear their owner; organization connections may clear any active workspace member.
Inputs
userIdstringrequired- User ID (bare or tagged UUID) or workspace member email
roammcp_user_status_bubble_getGet the live thought bubble shown over a user's assigned office seats.WriteUser Status Bubble Get
Get the live thought bubble shown over a user's assigned office seats. Personal connections may only read their owner's bubble; organization connections may read any active workspace member's bubble.
Inputs
userIdstringrequired- User ID (bare or tagged UUID) or workspace member email
roammcp_user_status_bubble_setSet or replace the thought bubble shown over a user's assigned office seats.WriteUser Status Bubble Set
Set or replace the thought bubble shown over a user's assigned office seats. The text is shared with the Roam UI and expires after 24 hours by default. Personal connections may only update their owner; organization connections may update any active workspace member.
Inputs
textstringrequired- Status text; 1â20 Unicode code points after trimming
userIdstringrequired- User ID (bare or tagged UUID) or workspace member email
ttlSecondsinteger- Optional lifetime in seconds; defaults to 86400 (24 hours)
roammcp_webhook_subscribeSubscribe to receive webhook events at a URL.WriteSubscribe to webhook
Subscribe to receive webhook events at a URL.
Inputs
eventstringrequired- Event type (e.g. chat.message, onair.event.created)
urlstringrequired- Webhook delivery URL (HTTPS, max 1024 chars)
destinationobject- Optional delivery auth. {"type":"grok_bot","token":"<Grok routine sender key or whsec_>"} signs deliveries for Grok Bot webhook routines. Omit for Standard Webhooks with the API client's signing secret. The token is never returned.
filterobject- Event-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_unsubscribeUnsubscribe from a webhook by ID.WriteUnsubscribe from webhook
Unsubscribe from a webhook by ID.
Inputs
idstringrequired- Webhook subscription ID (UUID)
roammcp_chat_deleteDelete a bot message.DestructiveDelete a chat message
Delete a bot message. Specify the message by chatId and timestamp. Idempotent. Requires a bot token or a personal token with useBotIdentity=true.
- Idempotent
Inputs
chatIdstringrequired- The UUID of the chat conversation the message belongs to.
timestampstringrequired- The RFC3339 timestamp (with microsecond precision) of the message to delete, exactly as returned by chat_history or chat_search.
threadTimestampstring- The 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_folder_deleteDelete a folder.DestructiveFolder Delete
Delete a folder. Its members lose the access the folder gave them; the meetings and Magicasts themselves are not deleted. Requires the admin role on the folder with personal access.
Inputs
idstringrequired- Folder ID (UUID)
roammcp_folder_remove_contentsRemove meetings and Magicasts from a folder (up to 100 per call).DestructiveFolder Remove Contents
Remove meetings and Magicasts from a folder (up to 100 per call). The items are not deleted. Requires the admin role on the folder with personal access.
Inputs
idstringrequired- Folder ID (UUID)
magicastIdsarray- Magicast IDs (UUIDs)
meetingIdsarray- Meeting IDs (UUIDs)
roammcp_folder_remove_membersRemove people from a folder (up to 100 per call).DestructiveFolder Remove Members
Remove people from a folder (up to 100 per call). A folder must keep at least one admin. Requires the admin role on the folder with personal access.
Inputs
idstringrequired- Folder ID (UUID)
userIdsarrayrequired- User IDs to remove
No tools match.