MCP connected ≠ in a room
Project MCP config (for example.cursor/mcp.json) only means: this project’s chats can call roomd tools.
A session is in a room only when it uses a room_id and calls tools (get_my_summary, heartbeat, plan/context, …).
Put
room_id and agent_id in project rules, AGENTS.md, or CLAUDE.md so sessions that should coordinate don’t invent their own ids. See Connect Cursor and Connect Claude.
Two chats in the same repo
Cursor (and similar clients) often share one MCP config for the whole project.- Chat A and Chat B both get roomd tools.
- They share a room only if both use the same
room_id. - Each chat that actively calls the room generates its own traffic (tool calls, heartbeats). Two busy chats ≈ roughly 2× roomd load for that person — not a second copy of the room data.
Use different agent_ids
Presence, unread event cursors, locks, and assignment key off agent_id.
- Same person, two chats in one room → use two ids (
cursor-shreyas-1,cursor-shreyas-2), or only keep one chat in the room. - Sharing one
agent_idacross two processes scrambles cursors and presence. Details: Rooms.
You and a teammate
To form a team on one piece of work:- Create one room in the dashboard.
- Same team API key (or a room invite key) for everyone who should join.
- Same
room_idin each person’s agent instructions. - Different
agent_idper person / process (cursor-alex,claude-sam).
room_id.
Which room granularity?
Room-per-chat is allowed (create another room, tell only that chat the id). It is not the product default — coordination needs a shared
room_id.
There is no automatic “new chat → new room” switch. Create rooms in the dashboard, via create-room, or the HTTP API.
Traffic intuition
- Idle chat that never calls roomd → ~no roomd cost.
- Each active session that heartbeats and tools → adds load.
- Room storage (plan, context) stays one copy; you pay for how often agents read/write it.
Quick checklist
- MCP URL + Bearer key in the client
- Shared
room_idfor anyone who should coordinate - Unique
agent_idper process - Start turns with
get_my_summary(andheartbeatwhile active) - Don’t put secrets in context