Roam MCP

Live

OAUTH 2.1

TEAM CHAT

Communication

Roam MCP gives your agent authenticated access to team chat and meetings: search meeting transcripts, ask questions about a meeting, post chat messages, and run OnAir events as the signed-in user.

  • Per-user credentials: each call uses the actual user's token, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
Roam MCP
agent · Acme Q3
Run
What did we decide in yesterday's pricing review?
S
roammcp_meeting_prompt
212ms
Meeting agent
The team agreed to keep the Pro tier at $49 a month and raise the annual discount to 20%. Maya owns the pricing page update.
Sources: 1 meeting transcript, Oct 9
roammcp
1 meeting
18:29
Message Claude...

Tools your team assistant agent reaches for on Roam, scoped per user.

CALL ANY TOOL
56 tools for team chat and meetings in Roam: search and read transcripts, post and schedule chat messages, create calendar events and meeting links, and manage OnAir events and guests.
roammcp_asset_create
Create asset
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.
Parameters
Name
Type
Required
Description
name
string
Required
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.
purpose
string
Optional
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: `file`, `story`, `avatar`. Default: `file`.
size
integer
Optional
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_list
List calendar
roammcp_chat_delete
Delete chat
roammcp_chat_history
Chat history
roammcp_chat_list
List chat
roammcp_chat_post
Post chat
roammcp_chat_scheduled_cancel
Cancel chat scheduled
roammcp_chat_search
Search chat
roammcp_chat_update
Update chat
roammcp_conversation_list
List conversation
roammcp_create_chat_link
Create chat link
roammcp_get_me
Get me
roammcp_group_join
Join group
roammcp_lobby_booking_list
List lobby booking
roammcp_magicast_list
List magicast
roammcp_magicast_share_link
Magicast share link
roammcp_meeting_link_create
Create meeting link
roammcp_meeting_link_info
Meeting link info
roammcp_meeting_list
List meeting
roammcp_meeting_prompt
Meeting prompt
roammcp_meeting_search
Search meeting
roammcp_meeting_transcript
Meeting transcript
roammcp_onair_event_list
List onair event
roammcp_onair_event_update
Update onair event
roammcp_onair_guest_add
Add onair guest
roammcp_onair_guest_info
Onair guest info
roammcp_onair_guest_remove
Remove onair guest
roammcp_reaction_list
List reaction
roammcp_token_info
Token info
roammcp_webhook_deliveries
Webhook deliveries

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// Roam MCP tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["roammcp"], toolNames: [
    "roammcp_meeting_search",
    "roammcp_meeting_transcript",
    "roammcp_chat_post"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "What did we decide in yesterday's pricing review?" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["roammcp"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "What did we decide in yesterday's pricing review?" }],
  tools,
});

// Execute the tool call with the user's vaulted Roam token
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["roammcp"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "What did we decide in yesterday's pricing review?" }],
  tools,
});

// Tool call runs with the user's vaulted Roam token
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["roammcp"] }, pageSize: 100,
});

const agent = new Agent({
  name: "meeting_agent",
  model: "gemini-2.5-pro",
  instruction: "Roam MCP tools scoped to this user",
  tools,
});

await agent.run("What did we decide in yesterday's pricing review?");
Try these prompts
Copy any prompt into your agent. Each maps directly to a Roam MCP tool. Click to copy, paste into your agent, done.
Meetings
Copy the prompt
Copied
Find meetings with John from last week.
Copy the prompt
Copied
Get the transcript of this morning's standup.
Copy the prompt
Copied
What action items came out of the product launch meeting?
Chat
Copy the prompt
Copied
Search chat messages about the Q4 roadmap.
Copy the prompt
Copied
Post a message in the design group that the review moved to 3pm.
Copy the prompt
Copied
Schedule a reminder in the team chat for Friday at 9am.
Calendar and OnAir
Copy the prompt
Copied
Create a calendar event with Priya tomorrow at 2pm.
Copy the prompt
Copied
List my upcoming OnAir events.
Copy the prompt
Copied
Add these 3 guests to the customer webinar OnAir event.
SEE HOW AUTH WORKS
Each user signs in to Roam once; Scalekit stores and refreshes their tokens. Tokens stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
Roam MCP
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Roam MCP
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Roam MCP
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Roam MCP
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other communication and meeting connectors.
Support and Ops Teams
Meeting prep
Pulls agenda, participant context, and open action items before every meeting.
Engineering Teams
Slack triage
Polls Slack for new messages, classifies bugs and support requests with a LangGraph router, files GitHub issues or Zendesk tickets, and confirms in the thread.
Engineering Teams
Engineering standup agent
Pulls commits from GitHub and GitLab, tracks issue movement in Jira, and posts a per-engineer standup brief to Slack. Each engineer's activity is read on their own delegated OAuth.
GTM and RevOps Teams
Deal intelligence agent
Pulls recent Gong calls, scores deal risk with an LLM, cross-references the record in Attio, and DMs each owner their at-risk deals in Slack. Every read is scoped to that rep's own access.
Test other agents
See the same per-user auth pattern across other communication and meeting connectors.
OPS
Meeting prep agent
Assemble the agenda, HubSpot attendee history, and open action items from Gmail before every meeting on the calendar.
ENGINEERING
Slack triage agent
Classify new Slack messages as bugs or support requests, file the GitHub issue or Zendesk ticket, and reply in the thread.
ENGINEERING
Engineering standup agent
Pull commits from GitHub and GitLab, track Jira issue movement, and post a per-engineer standup brief to Slack.
SALES
Deal intelligence agent
Score Gong call risk with an LLM, cross-reference the Attio record, and DM each owner their at-risk deals in Slack.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Roam token looks fine in a demo. In production every chat message looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared key
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Roam today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access Roam as the user or as a shared key?
As the user. Each user signs in to Roam once, and Scalekit stores and refreshes their tokens. Audit logs attribute every action to that user, not a shared service account.
Where is the Roam OAuth token stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. Refresh is automatic. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in Roam?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example meeting search and transcripts without chat posting. Scalekit also enforces scope checks before every API call.
What happens when a user revokes Roam access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
What can the agent do in Roam?
56 tools across meetings, transcripts, chat, groups, calendar events, meeting links, lobbies, Magicasts, OnAir events, reactions, stories, and webhooks. Of those, 33 read data, 22 write, and 1 deletes chat messages. Use roammcp_meeting_prompt to ask questions about a meeting's transcript.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""roammcp"": {
""url"": ""https://mcp.scalekit.com/roammcp"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.roammcp]
url = ""https://mcp.scalekit.com/roammcp""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""roammcp"": {
""url"": ""https://mcp.scalekit.com/roammcp"",
""type"": ""http""
}
}
}