Session Multiplayer
OfficialIt is an MCP server that lets AI agent sessions (across harnesses like Claude Code, Codex, or OpenCode) create/join end-to-end encrypted P2P rooms, exchange plain-text messages with delivery priorities, and manage membership/status.
Create or reuse named rooms and generate single-use 5-minute invite codes (
create_invite)Join a friend's room by redeeming an invite code over a direct P2P connection (
join_room)Send plain-text messages to a room, optionally addressed to specific display names, with
interrupt,normal, orpassivepriorities (send_message)Check and clear unread messages across all rooms, including passive ones (
check_messages)Read recent room history non-destructively, including messages received while offline (
show_history)View display name, rooms, connected peers, members with last-seen times, queued messages, and unread count (
status)Set the display name shown to peers (
set_display_name)Leave/forget a room's key and disconnect from its peers (
leave_room)
Allows OpenAI Codex sessions to join the same encrypted multiplayer rooms, exchange messages through inbox-based delivery, and check for messages using the check_messages tool, with a registration command for Codex.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Session Multiplayercreate an invite for room bug-hunt"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Session Multiplayer
Session multiplayer for AI coding agents. Your agent session and a friend's — any harness that speaks MCP (Claude Code and Codex are just the two with bundled adapters), any mix of accounts and machines, anywhere on the internet — exchange messages over a direct, end-to-end encrypted P2P connection. No relay, no central server, nothing to host, nothing to sign up for.
It works just as well entirely on your own device: two of your own sessions, in different projects or different harnesses, can share a room — a Claude Code session coordinating with a Codex session three terminals over is the same mechanism as a friend across the internet.
you (Claude Code): "create an invite for room bug-hunt"
→ invite code: X7KQ-2MPF-3HV9 (text it to your friend)
friend (Codex): "join room X7KQ-2MPF-3HV9"
→ connected, directly, encrypted, across harnesses
you: "tell bug-hunt: the leak is in token refresh, check session.ts"
friend: "check my messages"Built on Hyperswarm: peers find each other through a public BitTorrent-style DHT, hole-punch a direct UDP connection, and talk over Noise-encrypted sockets. Exposed to agents as an MCP server — the same server on every harness, so rooms mix harnesses freely.
Current release: v0.3.1 (LTS) — the wire protocol is specified in PROTOCOL.md and frozen for 0.3.x. Fully interoperable with claude-together v0.3, this project's ancestor: a claude-together peer and a session-multiplayer peer can share a room.
▶ 34-second explainer

Harness support
Harness | Registration | Delivery |
Claude Code |
| Hooks inject messages live: |
OpenAI Codex |
| No hook system: messages land in the inbox; the agent reads them with |
OpenCode |
| Same inbox + |
Any MCP harness | register a stdio server running | Same as Codex: inbox + |
Every message and join announcement carries the sender's display name, hostname,
project label, a per-process session id, and a harness: <name> tag (for example
harness: codex), so you always know which of your friend's sessions is talking.
Related MCP server: Multiplayer MCP Server
Install (each person, ~2 minutes)
Requires Node.js ≥ 18.
git clone https://github.com/wybe-labs/session-multiplayer
cd session-multiplayer
npm install
npm run register:claude # Claude Code
npm run register:codex # OpenAI Codex
npm run register:opencode # OpenCodeThen restart your agent session. On Codex, verify with /mcp.
Usage
On Claude Code, slash commands or plain natural language; on other harnesses, natural language ("create an invite for room bug-hunt", "check my messages") — everything ends up calling the same MCP tools.
Slash command (Claude Code) | Shorthand for |
| create a room + invite code |
| redeem a friend's code |
| send a message (lands when their turn ends) |
| address specific people |
| barge into their running session |
| check new + passive messages |
| re-read recent room chat (non-destructive) |
| rooms, peers, members + last seen, queues |
MCP tools: create_invite, join_room, send_message, check_messages,
show_history, status, set_display_name, leave_room.
Delivery
Priorities (interrupt / normal / passive) are delivery advice. On Claude
Code, installed hooks honor them live. On harnesses without injection hooks
(Codex and most others), every message waits in the inbox for check_messages —
the codex adapter suggests an AGENTS.md line so the agent checks mail at task
boundaries. Any message can carry a to: list of display names; only those named
get active delivery, everyone else receives it passively.
Every injected message is framed as untrusted data with an explicit instruction to relay it to the human and ask before acting on anything it requests — a friend's message can inform your agent, never command it.
Membership is per project, not per machine
Joining a room is an explicit act, scoped to the project directory the session
runs in: each project gets its own store under
~/.session-multiplayer/projects/<name>-<hash>/. A session in another folder is
not in your rooms and has to redeem its own invite. Only your display name and
signing identity are machine-global. Set SESSION_MULTIPLAYER_DIR to share one
store deliberately (CLAUDE_TOGETHER_DIR works as a legacy alias, so a
claude-together store can be reused as-is).
Groups, not just co-op
Rooms are N-way meshes: any member can invite, messages relay through friends (recent room log replayed on reconnect — store-and-forward through the group, no server), and offline members catch up through whoever saw the message.
Version mismatches are detected on connect. Sessions exchange their version in the room handshake; if a peer is older, your agent tells you and suggests passing the update along — and if you are the outdated one, it offers to update for you and reminds you that restarting your agent and resuming keeps the session.
Security model
End-to-end encrypted (Noise via Hyperswarm); the DHT sees only opaque topic hashes. Only key-holders can connect: the trust boundary is the people you invite.
Room-key authenticated connections (keyed BLAKE2b challenge-response, direction-bound, replay-safe).
Sender authenticity is trust-on-first-use: every message is signed with a long-lived ed25519 identity key; receivers pin a sender's key on first sight and warn loudly on key changes or signature downgrades. First contact is taken on faith;
host/label/sidare signed,harnessis advisory.Invites are single-grant: a code is spent the moment its room key is handed over; 5-minute expiry; argon2id-stretched.
Plain text only, 16 KB cap; peer-supplied ids validated before touching the filesystem; inbound frames bounded.
Messages are data, not instructions — untrusted-data framing on every delivery, on every harness.
Limitations you should know before trusting it with anything sensitive: a room
key is permanent and unrevocable (no eviction, no forward secrecy — to exclude
someone, start a new room); any member can invite anyone; prompt-injection risk
is real when messages reach an agent with tool access (prefer normal/passive
over interrupt with people you don't fully trust); and every message leaks
your hostname, project-folder name, and harness to the room
(SESSION_MULTIPLAYER_LABEL overrides the folder name).
Repo layout
PROTOCOL.md— the wire protocol spec (the standard other implementations can target)src/server.js— MCP server and tool definitions (harness-agnostic)src/transport.js— Hyperswarm swarm, pairing, room auth, TOFU signing, at-least-once messagingsrc/crypto.js— invite codes, argon2 stretching, MACs, secretbox, ed25519src/store.js— persistence: identity, room keys, inbox/outboxsrc/scope.js— per-project store scopingadapters/claude-code/— Claude Code registration, delivery hooks,/sm-*commandsadapters/codex/— Codex registration (~/.codex/config.toml)adapters/opencode/— OpenCode registration (opencode.json)test/— scope, end-to-end smoke (local DHT testnet), and security tests
License
MIT
Available Tools
8 toolscheck_messagesCheck for new messagesA
Fetch and clear all unread messages from all rooms — including passive ones that are never auto-delivered. On Claude Code, interrupt/normal messages usually reach sessions automatically via the delivery hooks; on harnesses without hooks (Codex, others) THIS is how messages arrive — call it whenever the user asks what their friends said, and consider checking it when starting or finishing a task.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden, and it clearly discloses the 'Fetch and clear' side effect and the nuance about passive messages. It does not specify whether clearing is permanent deletion or just marking as read, nor describe the return format, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and scope, then provides targeted environment-specific guidance. Both sentences earn their place, and the structure moves from 'what' to 'when' efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool, this is nearly complete: it covers purpose, side effects, delivery behavior, and usage timing. The only notable omission is what exactly the tool returns beyond 'messages' and the permanence of the clearing behavior, especially since no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero parameters and 100% coverage, so the baseline is 4. The description adds contextual meaning about what 'messages' means and when results arrive, which is sufficient for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Fetch and clear all unread messages from all rooms.' It also distinguishes this from passive delivery and sibling tools by noting it covers 'passive ones that are never auto-delivered.' This makes the tool's unique role clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: call it 'whenever the user asks what their friends said' and consider checking it when starting or finishing a task. It also distinguishes environments: Claude Code usually delivers automatically via hooks, while harnesses without hooks require this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_inviteCreate room inviteA
Create (or reuse) a named room and generate a short single-use invite code (like X7KQ-2MPF-3HV9) valid for 5 minutes. Codes are independent: several can be pending for the same room at once, and an expired code is replaced by just creating a new one. Share the code with a friend over any channel; when they redeem it with join_room, both sessions are peered directly over an end-to-end encrypted P2P connection. Rooms are scoped to this project directory. Keep this session open until they join.
| Name | Required | Description | Default |
|---|---|---|---|
| room_name | Yes | Name for the room, e.g. "auth-refactor" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: TTL, single-use, independence of codes, room scoping, P2P/encryption, and the requirement to keep the session open are all disclosed. It also clarifies that expired codes are handled by creating a new one.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in sentence one, and the remaining sentences each add distinct operational detail: expiry/reuse, redemption, scoping, and session requirement. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with no output schema and no annotations, this covers the lifecycle end-to-end: creation, code characteristics, delivery, redemption, encryption, scope, and session-lifetime requirement. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and room_name is already described with an example. The description only refers to 'named room' without adding constraints or naming rules beyond the schema, so it meets the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific action ('Create (or reuse) a named room') and the concrete deliverable ('short single-use invite code'), with an explicit code format example. This clearly separates it from the sibling join_room, which is the redemption step, and from messaging tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete workflow: generate a code, share it, have the friend redeem it with join_room, and keep the session open until they join. It does not explicitly enumerate when-not-to-use alternatives, but the flow is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
join_roomJoin a room with an invite codeA
Redeem an invite code from a friend to join their room. Works across harnesses: the inviter can be on Claude Code, Codex, or any MCP agent. Waits up to 90 seconds for the direct P2P connection; the inviter's session must be open. Membership is scoped to this project directory — sessions in other projects on this machine are unaffected and must join explicitly. Joining announces you to the room: your display name, machine hostname, session label (the project folder name, or SESSION_MULTIPLAYER_LABEL if set), and harness are sent to all members.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The invite code, e.g. X7KQ-2MPF-3HV9 (dashes/case optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so thoroughly. It discloses waiting up to 90 seconds for a P2P connection, the requirement that the inviter's session be open, project-directory scoping of membership, and that joining announces user details (display name, hostname, session label, harness) to all members. These are non-obvious side effects and constraints an agent must know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although longer than a one-liner, every sentence adds distinct value: purpose, cross-harness compatibility, timeout and prerequisite, project scoping, and user-announcement behavior. The most important facts (purpose, timeout, prerequisite) are front-loaded, and there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purose, prerequisites, timeout, scoping, and side effects — enough for an agent to invoke it correctly. The main omission is success/error return behavior (e.g., what happens on invalid code or timeout), but since no output schema exists this might be useful. Still, the provided context is strong and complete for the decision to call the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% — the single 'code' parameter is already described with an example format and note that dashes/case are optional. The description only repeats 'invite code from a friend' and adds no new semantic information about the parameter beyond what the schema already provides. Baseline 3 applies because the schema handles parameter documentation fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Redeem an invite code from a friend to join their room,' which is a specific verb-resource pairing that clearly distinguishes joining from the sibling tool create_invite. The title reinforces the action, so a model can immediately identify what this tool does even without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly defines when to use the tool: when you have a friend's invite code and want to join their room. It provides essential usage conditions: the inviter's session must be open, waits up to 90 seconds, and membership is project-directory-scoped. However, it does not explicitly name sibling tools like create_invite or leave_room as alternatives or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
leave_roomLeave a roomA
Forget this project's copy of a room's key and stop connecting to its peers. Other projects that joined the room keep their membership. This cannot be undone without a new invite.
| Name | Required | Description | Default |
|---|---|---|---|
| room_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for disclosing side effects. It explicitly states that peer connections stop, other projects' memberships are unaffected, and the action cannot be undone without a new invite—strong transparency for a mutating operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler. The primary action is front-loaded, and the second sentence adds essential side-effect and irreversibility context efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with no output schema and no annotations, the description covers what happens, scope, side effects, and undo conditions. Nothing essential is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only room_name as a required string with zero description coverage. The description does not directly document the parameter, but the surrounding language makes clear that room_name identifies the room to leave; adequate for a single self-evident parameter but not explicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: forget this project's copy of a room's key and stop connecting to its peers. It distinguishes leave_room from sibling tools like join_room and create_invite by focusing on leaving and membership scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case is evident: call this when this project wants to leave a room while other projects keep membership. It gives clear contextual effects but does not explicitly name alternatives or state when not to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_messageSend a message to a roomA
Send a plain-text message to a room. Every message goes into the shared room chat log for all members; priority controls how it lands in their agent sessions: "interrupt" is injected mid-turn at their next tool boundary (use sparingly — it barges in), "normal" (default) is delivered when their agent finishes its current turn or they next prompt, "passive" just sits in their inbox until they check it. Priorities need delivery hooks (installed on Claude Code); on harnesses without hooks, such as Codex, everything lands in the inbox and is read with check_messages. To address specific people, pass their display names in "to": only the named recipients get the active priority; everyone else in the room receives the message passively (inbox/chat log only, no interruption). Omit "to" to deliver at the given priority to the whole room. If no peer is online, the message queues locally and delivers on reconnect.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Display names of the intended recipients (as shown in status). Only they get the active priority; everyone else in the room still sees the message, but passively. Omit to address the whole room. Best-effort: display names are self-chosen and not unique, so this steers attention — it is not an access control; everyone in the room can read every message. | |
| message | Yes | Plain text message (no files or commands) | |
| priority | No | interrupt = barge into their running session now; normal (default) = deliver when their turn ends; passive = inbox only | |
| room_name | Yes | Room to send to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and fully delivers. It discloses reliability caveats (local queueing and delivery on reconnect when no peer is online), platform dependence (hooks vs. Codex fallback), access-control reality ('to' is best-effort steering, not access control; everyone can read everything), and interruption semantics — all far beyond what the schema encodes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The lead sentence states the core operation, and every subsequent sentence covers a distinct behavior: shared log, priority semantics, harness fallback, recipient scoping, default addressing, and offline queuing. For a four-parameter tool with three delivery modes, the length is proportionate and contains zero fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Thoroughly covers the hardest parts — priority semantics, harness differences, offline queueing, and recipient scoping — for a tool with no output schema. It remains silent on what the call returns on success or failure, and does not mention prerequisites like joining the room first (a join_room sibling exists). Minor gaps against otherwise exceptional coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: delivery timing behind each priority enum (mid-turn injection at next tool boundary, end-of-turn delivery, inbox-only), the stated default ('normal'), and the best-effort/not-access-control caveat for 'to.' It does not add per-parameter syntax details, but it genuinely clarifies behavior the enum names alone would leave ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with 'Send a plain-text message to a room,' pairing a specific verb with a concrete resource and scope. The detailed coverage of priorities, recipient steering, and queuing makes it unmistakably distinct from siblings like check_messages, show_history, and join_room.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names an explicit sibling and the condition that selects it: 'on harnesses without hooks, such as Codex, everything lands in the inbox and is read with check_messages.' It also gives usage guidance for priorities ('use sparingly — it barges in') and explains when to include vs. omit 'to.' It does not exhaustively route across all seven siblings, but the send/read distinction is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_display_nameSet display nameA
Set the name shown to peers on your messages.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It indicates a mutation of the peer-visible name, which is transparent about the operation's primary effect. It does not clarify persistence, whether past messages are affected, or any permission/error conditions, but for a simple setter this is acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single concise sentence that front-loads the action and resource, with no filler or redundancy. Every word adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema setter, the description is largely complete: it states the operation, the target attribute, and the audience. Minor gaps like return value, error behavior, and scope of effect (future messages vs history) are not critical for basic invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain the parameter. It does so directly: 'name' is the display name shown to peers. This adds meaning beyond the bare schema property and resolves ambiguity about what kind of 'name' is expected.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Set') and a specific resource ('display name'), and clarifies the exact scope: 'shown to peers on your messages'. This clearly distinguishes it from sibling tools like send_message, status, or join_room.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description's effect is clear enough to imply its use case — call when you need to change the name peers see on your messages. However, it gives no explicit guidance on when not to use it or how it compares to alternatives (e.g., whether it affects history).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_historyShow room historyA
Read the recent chat log of a room (up to the last 200 messages / 7 days), including messages relayed while you were offline. Non-destructive: unlike check_messages this clears nothing — use it to answer "what did they say earlier?".
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | How many recent messages (default 30) | |
| room_name | Yes | Room whose history to show |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It clearly discloses that the operation is non-destructive, does not clear anything, and includes messages relayed while offline. This goes beyond the schema by describing side-effect-free behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action, then the key differentiator and usage intent. There is no filler; every sentence adds decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with two well-documented parameters and no output schema, the description covers purpose, behavior, limits, and sibling distinction. The agent has everything needed to call it correctly and understand what it will do.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 even without parameter details in the description. The description does add context like the 7-day window and offline relay, but count and room_name are already well documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Read the recent chat log of a room' with clear bounds (200 messages / 7 days). It also distinguishes itself from the sibling tool check_messages by noting this tool clears nothing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly contrasts with check_messages: 'unlike check_messages this clears nothing' and gives the exact use case: 'use it to answer "what did they say earlier?"'. This tells an agent when to select this tool over its sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statusMultiplayer statusA
Show your display name, rooms joined by this project, currently connected peers, known room members with last-seen times, queued undelivered messages, and unread count.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description alone must signal behavioral traits. The verb 'Show' strongly implies a read-only operation with no side effects, and the list of returned data is helpful. Still, it does not explicitly state that no state is changed, nor mention freshness, permissions, or failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficiently structured sentence that front-loads the action ('Show') and then lists the distinct data categories in a readable sequence. Every listed item adds useful information, with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless status tool with no output schema, the description provides a comprehensive semantic picture of the return content. It covers identity, rooms, peers, member activity, message queue, and unread count, which is sufficient for an agent to understand the tool's full scope without needing additional detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description does not need to explain any parameter semantics because there are none, and it accurately focuses on what the tool returns.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb, 'Show', and names the resource (multiplayer status) along with a detailed enumeration of the exact information returned: display name, rooms, peers, members with last-seen times, queued messages, and unread count. This clearly distinguishes it from sibling tools like check_messages or show_history, which focus on narrower message or history concerns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied by the tool name and the listed contents: call this when you need a broad multiplayer status snapshot. However, there is no explicit guidance about when to prefer this over alternatives such as check_messages or show_history, and no exclusions or conditions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
8 tool updates
v0.3.0- First observed
check_messages - First observed
create_invite - First observed
join_room - First observed
leave_room - First observed
send_message - First observed
set_display_name - First observed
show_history - First observed
status
TDQS
Each tool maps to a distinct action: invite creation, joining, sending, checking unread messages, reading history, status, display name, and leaving. The closest pair, check_messages and show_history, is clearly separated by clearing versus non-destructive reading.
The tool set overwhelmingly follows a verb_noun pattern (create_invite, join_room, send_message, check_messages, show_history, set_display_name, leave_room). The single noun-only tool, status, is a minor deviation that could have been get_status.
Eight tools is well-scoped for a session-multiplayer collaboration server. Each tool addresses a real user or agent need without redundant surface area.
The core workflow is fully covered: invite/join/leave room lifecycle, sending and receiving messages, non-destructive history, status visibility, and profile naming. There are no obvious dead ends or missing operations that would prevent the primary multiplayer session use case.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
End-to-end encrypted messaging and work coordination for autonomous AI agents.
271The team layer for AI coding agents: shared contracts, collision alerts, E2EE sessions.
Ephemeral REST chatrooms for AI agents to coordinate. Share a room URL — agents talk live.
AI agents can Create rooms and store/retrieve text and images, and hand link to humans no sign-up.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables peer-to-peer communication, discovery, shared state, and file coordination between AI coding agents across machines and sessions.2819Elastic 2.0
- AlicenseNot gradedqualityBmaintenanceEnables coding agents to join a secure agent-to-agent network for team collaboration, with tools for direct messaging, shared rooms, and approval-gated file/command requests.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI coding agents to communicate asynchronously via a decentralized, peer-to-peer LAN bridge with automatic discovery and direct messaging.MIT
- AlicenseAqualityBmaintenanceAllows two AI coding agents on different machines to securely pair and share files, context, and conventions through an end-to-end encrypted peer-to-peer channel with human-in-the-loop consent.956MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/wybe-labs/session-multiplayer'
If you have feedback or need assistance with the MCP directory API, please join our Discord server