session-relay
This server provides MCP tools for sharing and continuing coding-agent sessions, searching team handoffs, and collaborating live.
List and filter shared sessions by repo, file, branch, agent, author, or handoffs assigned to you.
Full-text search shared sessions, including
file:andbranch:filters.Load a shared session as a handoff in summary, recent-tail, or full-transcript mode.
Share the current session with goal, decisions, done/next steps, open questions, sections, PR link, recipients/visibility, transcript scope, and optional redacted diff.
Retrieve a session’s attached code changes as a unified diff for
git apply.Get the repo’s handoff template and required sections before sharing.
See recent team activity: new shares, handoffs for you, pickups, and comments.
Comment on shared sessions.
Edit shares, append next steps, change recipients/visibility, or publish drafts.
Start, update, and stop live sessions; see who is live; send/receive live messages and ask/answer questions.
Session Relay
Pick up where your teammate left off. Share coding-agent sessions across Claude Code, Codex, OpenCode, Gemini CLI, Copilot CLI, Cursor and ZCode. Your teammate continues in whichever tool they use, with the goal, decisions, next steps and recent conversation.
You (Claude Code): /share
Teammate (OpenCode): /pickup your webhook retry work
Why
Handing off agent work means copy-pasting chat logs, or the next person starting from zero. With Session Relay:
/share: the agent writes a handoff (goal, decisions, done, next steps, open questions) and shares it with the recent conversation and the files touched./pickup: the next person's agent finds it, reads it, checks the code and continues, in any of the supported agents.Handoff chains: work picked up and shared again is linked, so every session shows who started it and who continued it.
Work live together (
/live): when two people work at the same time, see who's on what and which files they touch, and send messages that reach each other's agent between steps. Agents show messages to you first, unless you let them act on their own.Handoffs for someone: share "for Akshat" and it's first in their
/pickup. Edit a share any time (next steps, title, who it's for).Auto-share drafts (opt-in): every Claude Code, Gemini CLI and Copilot CLI session is saved as a private draft when it ends; publish it when it's ready.
Share without your prompts:
/share without my promptsorrelay config prompts hidekeeps what you typed on your laptop; teammates still get the agent's work and the summary.Diff snapshots: attach your uncommitted changes to a share; the next person
git applys them.Handoff templates: admins decide what a handoff must include per repo ("Tests run", "Migration notes") in a guided editor with ready-made sections and a preview;
/sharefollows it.Comments: teammates leave notes on a session; the agent that picks it up reads them.
Linked to PRs and files: shares carry the branch's pull request; find every session that touched a file with
file:src/billing.ts.Web app: browse, search and read everything your team has shared (All, For me, Shared by me, My drafts), plus an Activity digest, team Stats and Settings in simple tabs. Light and dark, works on phones.
Export and audit: download any session as Markdown or JSON; admins see an audit log of everything.
Easy onboarding: invite links, and
relay loginsigns in through the browser.Search everything: titles, summaries and full transcripts; filter by file, branch, agent, person.
Private by default: nothing is uploaded unless you share it, secrets are removed on your laptop first (test your own patterns in Settings → Privacy), and shares can be limited to specific people.
All of it: Features.
Related MCP server: Relay
Hosting
Self-hosted · available now | One |
Cloud · coming soon | We run it for you: sign in with GitHub, invite your team, no server. → Roadmap |
The CLI is on npm: session-relay.
Quick start
Run the server (once per team):
git clone https://github.com/Ryrahul/session-relay.git && cd session-relay
cp deploy/.env.example deploy/.env # set POSTGRES_PASSWORD, PUBLIC_URL, DOMAIN
docker compose -f deploy/docker-compose.yml --env-file deploy/.env up -d --build
docker compose -f deploy/docker-compose.yml --env-file deploy/.env logs server | grep -A2 "setup code"Open your server's URL, enter the setup code, and create your organization. You're the owner.
Connect each laptop:
npm install -g session-relay
relay login --server https://relay.your-team.com # approve in the browser
relay setup # adds /share, /pickup and /live to every agent you have installedFull walkthrough: Getting started.
Docs
Online at https://relay.rahulweb.online. Sources are in docs/.
Getting started: laptop setup, sharing, picking up
Features: everything it does, in one list
Self-hosting: Docker, HTTPS, backups, upgrades
Deploy to Cloudflare: Workers, Hyperdrive, R2, no server
Agents: how each agent connects, manual setup, MCP tools
Working live:
/live, messages between sessions, overlap warningsSecurity & privacy: what's uploaded, redaction, permissions
How it works
Claude Code ─┐
Codex ─┤ ┌─ web app (browse, search, read, edit)
OpenCode ─┤ │
Gemini CLI ─┼─ relay CLI / relay mcp ─┼─ Relay server (Hono + Postgres)
Copilot CLI ─┤ read · redact · share │
Cursor ─┤ └─ your team's agents via MCP
ZCode ─┘Package | |
|
|
| API: orgs, members, invites, tokens, sessions, search, retention, audit. Runs on Node (Docker) or Cloudflare Workers |
| Web app (React), served by the server or Workers Static Assets |
| Session format and API types |
Development
npm install
npm run dev:all # Postgres in Docker + API on :8787 + web on :5173
npm run bootstrap:dev -- --org Dev --email you@example.com --name You
npm test # unit tests
npm run test:integration # API against a throwaway Postgres
npm run test:e2e -- <repo> # full stack, real agent sessions from <repo>, MCP clientWork on feature/* branches with PRs to main. Releases go main → deploy; see deploy-pipeline.md.
License
AGPL-3.0. You can use, modify and self-host Session Relay freely; if you run a modified version as a service for others, you must publish your changes under the same license.
Available Tools
15 toolscheck_live_inboxCheck live messagesA
Take new messages from teammates sent to this live session (they are marked as read).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the crucial non-obvious behavior: messages are marked as read, which explains why readOnlyHint=false and idempotentHint=false despite this looking like a fetch. It doesn't cover blocking behavior, rate limits, or whether all messages or only unseen ones come back.
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 short sentence with no padding, and the read-marking side effect is placed where it is immediately visible. The phrasing 'Take new messages... sent to this live session' is slightly convoluted but not wasteful.
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?
With no parameters and no output schema, the agent still has no idea what comes back (a list of messages? an empty result when none?) or whether the call waits for new messages. For a polling-inbox tool that is a meaningful gap, though the critical read-marking behavior is covered.
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?
Zero parameters, so there is nothing for the description to document; the baseline for a parameterless tool applies. No parameter semantics gap exists.
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 resource and scope are specific: new messages from teammates addressed to this live session. The verb 'take' is a little ambiguous (retrieve vs. consume), but the parenthetical clarifies the side effect and sets it apart from send_live_message.
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?
No guidance on when to call this versus siblings like live_status or team_activity, and no statement of polling cadence or preconditions (e.g., must start_live have been called first). The agent must infer the call context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
comment_on_sessionComment on a sessionA
Leave a short note on a shared session for the team: a question, a finding, or that you picked it up. Never include secrets.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Session id | |
| body | Yes | The note, in plain text or Markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write/append shape (readOnlyHint=false, destructiveHint=false, openWorldHint=true), and the description adds a genuine unstated constraint: "Never include secrets," which matters precisely because the note is team-visible. It does not disclose that repeated calls create separate additive notes (idempotentHint=false) or that notes cannot be edited or removed, which would complete the picture.
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 front-loaded sentence names the action, the audience, and the accepted content types, closing with the safety caveat. Nothing is redundant and nothing needs to be re-read.
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 two-parameter tool with full schema coverage and annotations covering the safety profile, the description supplies purpose, audience, and content constraints, so an agent can call it correctly. What is missing is edge behavior — whether the session must already be shared, and what happens on failure — though with no output schema this is a minor gap.
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 both `id` and `body` (with minLength/maxLength and plain-text-or-Markdown guidance) are fully documented structurally. The description adds only the "short note" framing and the no-secrets content rule for `body`, which is a modest increment over 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 ("leave a short note on a shared session") and enumerates the note types (question, finding, picked-it-up), which clearly separates it from update_session or share_current_session. It stops short of naming any sibling explicitly, so the differentiation is inferential rather than stated.
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 examples given ("a question, a finding, or that you picked it up") communicate when an agent should reach for this tool rather than mutating the session. There are no explicit exclusions or named alternatives, so a borderline case like "I want to change session metadata" has to be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sessionLoad a shared sessionARead-only
Load a shared session as a handoff: summary, decisions, next steps, files and conversation. mode "tail" (default) = summary + recent messages; "summary" = summary only; "full" = full transcript, paged with offset.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Session id from list_sessions or search_sessions | |
| mode | No | How much to load (default "tail") | |
| tail | No | With mode "tail": only this many of the most recent messages (default: all that were shared) | |
| offset | No | With mode "full": message to start from, for paging |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered; the description adds real value on top by disclosing default behavior ('tail' is default), the payload shape, and that 'full' is paged via offset. It does not state sharing/permission prerequisites or any size limits for retrieving a shared session, which would have pushed this higher.
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?
Very compact: one sentence naming the payload followed by a terse mode legend, with the default mode stated up front. It is dense but every clause carries information; a slightly cleaner breakdown of mode-to-parameter pairing would earn a 5.
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?
With no output schema, the description does the necessary work of naming returned content and explaining paging, which is enough for an agent to call it correctly. Missing pieces are minor: where the id comes from is only in the schema, and there is no mention of permission or sharing requirements for open-world session access.
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 semantic meaning beyond the schema: it clarifies the interplay of mode with offset ('full' = full transcript, paged with offset) rather than merely restating the enum values. The 'tail' integer parameter's interaction with mode is only implied, not spelled out in the description.
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?
States a specific verb and resource ('Load a shared session') and enumerates the payload an agent gets back: summary, decisions, next steps, files and conversation. It does not explicitly differentiate itself from the similarly-named sibling get_session_diff or point to list_sessions/search_sessions for id discovery, so sibling routing is left to inference.
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?
Explains the three modes and their trade-offs clearly — 'tail' (default) for summary plus recent messages, 'summary' for summary only, 'full' for the complete transcript with offset paging. What is missing is guidance on when to prefer a sibling such as get_session_diff or when to fall back to search_sessions instead of loading.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_session_diffGet a session's code changesARead-only
The uncommitted changes a teammate attached to a shared session, as a unified diff. Use it to see exact code state; to apply it, write it to a file and run git apply.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Session id | |
| max_chars | No | Cut the diff at this many characters (default 100000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered; the description adds genuinely new context: the diff is uncommitted work authored by a teammate, it is a unified diff, and it is not applied by this tool. It does not describe truncation behavior, though max_chars in the schema covers that.
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 short sentences with no filler; the core deliverable is stated first and the operational follow-up second. Every clause carries 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?
With no output schema, the description carries the return-value burden and does so by naming the format (unified diff). Minor gaps remain: behavior on a session with no attached changes, or on a missing/unauthorized session id, is not stated.
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 both `id` and `max_chars` (with range and default) are already documented in structured data. The description adds no syntax or format detail about either parameter, so baseline 3 applies.
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?
States precisely what is returned: the uncommitted changes attached to a shared session, in unified diff format. This is a specific resource plus an explicit output format, and it clearly separates the tool from siblings like get_session (metadata) and list_sessions.
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?
"Use it to see exact code state" gives a positive selection criterion, and the follow-up tells the agent exactly what to do with the result (write to file, `git apply`). It stops short of naming an alternative sibling or stating when not to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sessionsList shared sessionsARead-only
List sessions teammates have shared. Defaults to the current repo; pass all_repos to see everything. for_me lists handoffs assigned to you (from any repo).
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | Only sessions that touched this file (part of the path is fine) | |
| tool | No | Only sessions from this coding agent | |
| limit | No | How many to return, newest first (default 10) | |
| author | No | Name, email or "me" | |
| branch | No | Only sessions shared from this git branch | |
| for_me | No | Only handoffs assigned to you | |
| all_repos | No | List sessions from every repo, not just the current one |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds a real behavioral fact the annotations don't carry: results are silently filtered to the current repo unless all_repos is set. That default-scoping disclosure is the kind of context an agent needs to avoid missing data.
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?
Three short sentences, no repetition. The core purpose and the important default-scope caveat come first, with the for_me exception last. Every sentence carries information an agent would otherwise have to guess.
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 read-only, fully documented list tool with annotations and no output schema, this covers the essentials: scope default, escaping the default, and the for_me exception. It could still say what ordering/pagination look like or point to search_sessions for filtered lookups, but nothing needed to call it correctly 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%, so the schema already explains all seven parameters and their defaults; baseline is 3. The one genuine addition is that for_me pulls handoffs 'from any repo', clarifying how that flag interacts with the default repo scope — but the remaining parameters get no extra description-level meaning.
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 a specific verb and resource: 'List sessions teammates have shared.' The shared/teammate framing and repo scoping help separate it from generic listing siblings, but it never names search_sessions or get_session, so the boundary with those siblings is left implicit.
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 concrete scoping rules (default current repo, all_repos for everything, for_me for handoffs), which is useful context, but it never states when to prefer this over search_sessions or get_session. The agent must infer the alternative from the sibling name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
live_statusWho's working liveARead-only
Who is working live right now: repo, branch, what they're doing, files they touched recently, and whether this session is live.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered; the description adds genuine value by enumerating exactly what the payload reports, including the live-vs-stale distinction. It stops short of noting permission/scope limits (whose sessions are visible) or freshness/caching behavior, which matters for a presence tool.
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 sentence with zero filler, front-loaded with the core framing and then listing the returned fields in the order an agent would evaluate them. Nothing is repeated from the title or annotations.
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?
With no parameters and no output schema, the description carries the return-value burden and does so by naming every reported field, which is sufficient for an agent to judge relevance. The only gap is scope: it never says whose activity is returned (own team, org, or open world).
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?
Zero parameters, so the baseline of 4 applies and there is no parameter semantics burden to satisfy. The description correctly implies the call takes no arguments by framing it as an ambient status read.
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?
Clearly states the resource and intent: current live presence plus a concrete inventory of what the response contains (repo, branch, activity, recent files, live flag). It does not, however, distinguish itself from close siblings like list_sessions, team_activity, or get_session, so an agent must infer which to pick.
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 phrase 'right now' implicitly scopes this to real-time presence checks rather than historical session queries, which weakly separates it from list_sessions and get_session. There is no explicit when-to-use guidance, no named alternatives, and no statement of preconditions (e.g., whether a live session must exist).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_sessionsSearch shared sessionsARead-only
Full-text search over shared sessions (titles, summaries, messages). The query can include "file:" and "branch:" filters.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Words to look for, e.g. "invoice rounding" or "file:billing.ts retry" | |
| author | No | Only sessions shared by this person: name, email or "me" | |
| this_repo_only | No | Limit to the current repo (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds which fields are searched and the inline filter syntax, but says nothing about result ordering, ranking, result caps, or whether filters must appear in the query string versus using the separate author/this_repo_only parameters.
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 front-loaded sentences with no filler: the first defines scope, the second supplies the non-obvious query syntax. Nothing to trim.
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?
With no output schema, the description should hint at what a result looks like and how matches are ordered or limited; it omits both. Adequate to invoke the tool, but leaves an agent guessing about result shape and the interaction between query filters and the author/this_repo_only parameters.
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 the baseline is 3; the description earns a point by documenting the 'file:<path>' and 'branch:<name>' query-filter syntax, which goes beyond the schema's single example string and clarifies in-query filtering behavior.
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?
States a specific verb and resource (full-text search over shared sessions) and names the searched fields (titles, summaries, messages). It is clearly distinguishable from get_session or share_current_session, though it never contrasts itself with the closest sibling list_sessions.
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?
Usage is implied by 'full-text search' versus a listing tool, and the filter syntax hints at narrowing behavior. There is no explicit statement of when to prefer this over list_sessions or how to combine author/this_repo_only with the inline filters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_live_messageMessage a teammate's live sessionA
Send a short message to a teammate who is working live: it reaches their agent between steps. Use it to tell them about a change that affects them, ask a question, or answer theirs. Never include secrets.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Teammate name or email, "everyone" (all live in this repo), or a live session id. Optional when replying. | |
| kind | No | "question" asks them to answer; "answer" replies to one (with reply_to) | |
| message | Yes | The message, in plain words | |
| reply_to | No | Number of the message you're answering | |
| wait_seconds | No | For questions: wait up to this long for the answer and return it (default 0, don't wait) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond the annotations: delivery is interleaved with the teammate's work ('between steps'), so it's a live, non-durable channel, and there is an explicit safety constraint against secrets. Open-world and non-idempotent hints are consistent with sending to people, but the description doesn't say what happens if no live session exists.
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?
Three short sentences, front-loaded with the action and delivery mechanism, then purpose, then the safety rule. 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?
Given a fully documented schema and no output schema, the description supplies the missing conceptual context: who receives it, when it lands, and the secrets prohibition. Gaps remain around failure modes (no live teammate, message length limits) and whether a response is returned.
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%, and every parameter (to, kind, reply_to, wait_seconds) is documented in the schema itself. The description only reinforces brevity ('short message') and the secret prohibition, adding little parameter-level meaning. Baseline 3 applies.
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?
States a specific verb and resource (send a short message) plus the delivery target: a teammate's live agent, reaching them between steps. That distinguishes it from a durable comment or inbox check, though it never names the sibling it differs from (e.g. comment_on_session, check_live_inbox).
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?
Gives concrete when-to-use contexts: flag a change that affects them, ask a question, answer theirs — plus a clear safety rule ('Never include secrets'). It stops short of explicit exclusions or naming alternative tools for durable/asynchronous communication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_liveGo liveAIdempotent
Start working live in this repo: teammates see what you're working on and which files you touch, and their messages reach you between steps. Lists who else is live here.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | What this session is working on, in a few words | |
| autonomy | No | Let this agent act on teammates' messages without asking the user first. Only true if the user explicitly asked for it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses real consequences the annotations cannot express: teammates see what you're working on and which files you touch, and their messages are injected between steps. That is meaningful disclosure of side effects and social visibility. It is consistent with readOnlyHint=false, idempotentHint=true and destructiveHint=false.
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 compact sentences with the core action front-loaded and no filler. The final clause about listing who else is live is secondary information that could arguably live in a return-value note, but it is not wasteful.
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 an all-optional, two-parameter state-changing tool, the description covers the effect on teammates and hints at the return content ('lists who else is live'). With no output schema and no annotations explaining output, the response shape is only partially covered, which keeps this short of a 5.
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 both 'title' and 'autonomy' are already documented in the schema, including the important caveat about only setting autonomy=true when explicitly requested. The description adds nothing about either parameter, so the schema-carries-it baseline of 3 applies.
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?
States a specific verb and resource ('Start working live in this repo') and describes the resulting state change — activity visible to teammates and messages delivered between steps. It is clearly distinct from stop_live/update_live, though the trailing 'Lists who else is live here' blurs it slightly with live_status.
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?
Usage is implied: this is the entry point for going into a live session in a repo. However, there is no explicit when-to-use/when-not, no mention of prerequisites, and no routing to the near-duplicate sibling live_status for reading peer state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_liveStop working liveAIdempotent
End this session's live session: teammates stop seeing it and messages stop arriving.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (idempotent, non-destructive, open-world), so the description's job is to add effect detail — and it does: teammates stop seeing the session and messages stop arriving. It does not say whether the live session can be resumed or what happens to already-sent messages, but the core observable effects are disclosed.
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 sentence with the action front-loaded and two concrete consequences appended; nothing is wasted and nothing critical is buried.
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?
With no parameters, no output schema, and annotations carrying the safety profile, the description covers what an agent needs to invoke it correctly. The one gap is recoverability — whether the live session can be restarted — which would help an agent decide before ending it.
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 takes zero parameters, so there is nothing for the description to disambiguate. Baseline applies.
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?
States a specific verb ('End') and resource ('this session's live session'), making the action unambiguous. It is distinguishable from start_live by the 'End' verb, though it never names the sibling explicitly.
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 scope word 'this session's' implies when the tool applies, but there is no explicit when-to-use/when-not guidance and no mention of alternatives such as start_live for restarting or live_status for checking state. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
team_activityTeam activityBRead-only
What the team did recently: new shares by repo, handoffs for you, who picked up what, and new comments.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look back this many days (default 1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds useful scope cues — results are personalized ('handoffs for you') and grouped by repo — but says nothing about result limits, ordering, or whether the aggregation spans workspaces.
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?
One compact sentence, front-loaded with the core concept and then the content categories. Slightly list-like and fragmentary, but nothing is wasted.
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 read-only feed with no output schema, the description usefully previews the returned content categories. It still omits things an agent would want — ordering, pagination or truncation, and how 'for you' is determined — which leaves it merely adequate.
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 the single 'days' parameter is fully documented in the schema (1-30, default 1). The description's 'recently' loosely reinforces the lookback window but adds no format, timezone, or boundary semantics beyond 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 enumerates the concrete content of the feed (new shares by repo, handoffs, pickups, comments), which lets an agent tell it apart from the session-centric siblings like list_sessions or search_sessions. It stops short of a clean verb+resource statement ('What the team did recently' is a noun phrase), but the intent is unambiguous.
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?
There is no guidance on when to call this versus list_sessions, search_sessions, or get_session, and no exclusions or prerequisites. The agent must infer that this is a cross-repo digest feed rather than a per-session lookup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_liveUpdate your live sessionAIdempotent
Change what teammates see about this live session (title, current status), or whether this agent may act on their messages without asking.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | What this session is working on | |
| status | No | What you're doing right now, e.g. "running the migration tests" | |
| autonomy | No | true only if the user explicitly asked to let you act on teammates' messages without asking |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, idempotent, non-destructive, open-world. The description adds genuinely new context: changes are visible to teammates, and the autonomy flag has a consent precondition ('true only if the user explicitly asked'). It doesn't say whether omitted fields are left unchanged, though idempotentHint implies replacement semantics.
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 sentence, front-loaded with the verb and the affected surface. The trailing 'or whether this agent may act...' clause is slightly convoluted but earns its place by covering the third parameter group.
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?
With full schema coverage and annotations covering the safety profile, the description covers what the agent needs to call it. The notable remaining gap is disambiguation from the 'update_session' sibling, which would materially help selection.
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 all three parameters are already documented and the autonomy constraint is largely restated from the schema. The description adds only the framing that title/status are teammate-visible, which is useful but thin.
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 ('Change') and resource ('this live session') and names the two field groups affected (teammate-visible info, and act-on-messages permission). It does not distinguish this from the sibling 'update_session', leaving ambiguity between two similarly named update 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?
Usage is implied by 'what teammates see' but there is no explicit when-to-use, when-not-to-use, or named alternative (e.g. update_session vs update_live). The agent must infer the choice from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_sessionEdit a shared sessionADestructiveIdempotent
Change a share you made (or any share, if you're an admin): title, summary fields, who it's for, the PR link or visibility. Summary lists you pass replace the old ones; use add_next to append next steps.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Id of the session to change | |
| for | No | Teammate name or email, or "none" | |
| done | No | Replaces what was done | |
| goal | No | New goal | |
| next | No | Replaces the next steps | |
| title | No | New title | |
| people | No | Make it visible only to these people; an empty list makes it visible to the whole team | |
| pr_url | No | Pull request URL, or "none" | |
| publish | No | Publish a draft (saved automatically at session end) to the team, or to `people` | |
| add_next | No | Next steps to append to the existing ones | |
| sections | No | Replaces the extra sections | |
| decisions | No | Replaces the decisions | |
| open_questions | No | Replaces the open questions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=true, but the description supplies the crucial detail those hints can't: which operations overwrite (list fields replace) versus append (add_next). It also discloses the admin escalation path. It stops short of describing what publish does to visibility or what a rejected update looks like.
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 and permissions, then the non-obvious replace/append rule. Dense with no filler, though the parenthetical about admin rights interrupts the field enumeration slightly.
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 13-parameter mutation with a fully described schema and safety annotations, the description covers the ambiguous parts: scope of authority and overwrite behavior. The publish, sections, and decisions semantics are left entirely to the schema, which is acceptable given 100% coverage and no output schema.
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 all 13 parameters are already documented, including the replace/append distinction. The description reinforces the add_next choice but adds no format, cardinality, or interaction detail beyond what the schema states, so the baseline 3 applies.
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 verb 'change' and resource 'a share you made' are concrete, and the description enumerates the editable surfaces (title, summary fields, audience, PR link, visibility). It doesn't name a sibling, but no other tool in the list is an edit on an existing share, so confusion risk is low.
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?
'a share you made (or any share, if you're an admin)' gives real authorization context, and the add_next note guides selection between two similar parameters. However, there is no explicit when-not-to-use case and no pointer to an alternative tool for creating a share versus editing one, so routing is only implied.
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.
6 tool updates
v0.1.2- Added
check_live_inbox - Added
live_status - Added
send_live_message - Added
start_live - Added
stop_live - Added
update_live
7 tool updates
v0.1.1- Changed
comment_on_session2 fields changed- added
Input schema / properties / body / descriptionAdded value: +"The note, in plain text or Markdown" - added
Input schema / properties / id / descriptionAdded value: +"Session id"
- Changed
get_session4 fields changed- added
Input schema / properties / id / descriptionAdded value: +"Session id from list_sessions or search_sessions" - added
Input schema / properties / mode / descriptionAdded value: +"How much to load (default \"tail\")" - added
Input schema / properties / offset / descriptionAdded value: +"With mode \"full\": message to start from, for paging" - added
Input schema / properties / tail / descriptionAdded value: +"With mode \"tail\": only this many of the most recent messages (default: all that were shared)"
- Changed
get_session_diff2 fields changed- added
Input schema / properties / id / descriptionAdded value: +"Session id" - added
Input schema / properties / max_chars / descriptionAdded value: +"Cut the diff at this many characters (default 100000)"
- Changed
list_sessions4 fields changed- added
Input schema / properties / all_repos / descriptionAdded value: +"List sessions from every repo, not just the current one" - added
Input schema / properties / branch / descriptionAdded value: +"Only sessions shared from this git branch" - added
Input schema / properties / limit / descriptionAdded value: +"How many to return, newest first (default 10)" - added
Input schema / properties / tool / descriptionAdded value: +"Only sessions from this coding agent"
- Changed
search_sessions2 fields changed- added
Input schema / properties / author / descriptionAdded value: +"Only sessions shared by this person: name, email or \"me\"" - added
Input schema / properties / query / descriptionAdded value: +"Words to look for, e.g. \"invoice rounding\" or \"file:billing.ts retry\""
- Changed
share_current_session4 fields changed- added
Input schema / properties / done / descriptionAdded value: +"What was finished in this session" - changed
Input schema / properties / include / descriptionPrevious value: -"Default \"summary+tail\""New value: +"What to upload besides your summary: nothing, the last 30 messages, or the whole transcript. Default \"summary+tail\"" - added
Input schema / properties / open_questions / descriptionAdded value: +"Unresolved questions the next person should know about" - added
Input schema / properties / title / descriptionAdded value: +"Short title; defaults to the first prompt"
- Changed
update_session7 fields changed- added
Input schema / properties / decisions / descriptionAdded value: +"Replaces the decisions" - added
Input schema / properties / done / descriptionAdded value: +"Replaces what was done" - added
Input schema / properties / goal / descriptionAdded value: +"New goal" - added
Input schema / properties / id / descriptionAdded value: +"Id of the session to change" - added
Input schema / properties / next / descriptionAdded value: +"Replaces the next steps" - added
Input schema / properties / open_questions / descriptionAdded value: +"Replaces the open questions" - added
Input schema / properties / title / descriptionAdded value: +"New title"
9 tool updates
v0.1.0- First observed
comment_on_session - First observed
get_session - First observed
get_session_diff - First observed
list_sessions - First observed
search_sessions - First observed
share_current_session - First observed
share_template - First observed
team_activity - First observed
update_session
TDQS
Scored across 15 tools
Most tools split cleanly between live-session coordination and shared-session handoffs, and descriptions clarify their targets. A few boundaries are softer: live_status vs. team_activity both summarize activity, and update_live vs. update_session both mutate metadata, though their scopes differ.
Most names are verb-first and use recognizable live/session domain prefixes, such as start_live, get_session, and list_sessions. live_status and team_activity are noun phrases, and comment_on_session uses a preposition, which are minor deviations from the dominant pattern.
The 15 tools cover two related workflows—live collaboration and shared-session handoffs—and each has a plausible role, including helper tools like share_template and get_session_diff. The count sits at the high end of the ideal range, with a couple of status/update tools that could potentially be merged, but it is not excessive.
Live-session lifecycle is fully covered: start, status, messaging, inbox, update, and stop. Shared sessions cover sharing, listing, searching, loading, commenting, updating, and diff retrieval, but there is no explicit delete/unshare operation and no obvious tool for attaching a diff to a share.
Maintenance
Related MCP Connectors
The team layer for AI coding agents: shared contracts, collision alerts, E2EE sessions.
Shared memory for coding agents. Stop re-explaining your codebase every session.
One shared project for a team's coding agents: decisions, a task board and handoffs.
Shared memory for AI coding agents. Save once, reuse from Cursor, Claude Code, Codex.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables AI coding agents to collaborate on the same project by sharing session briefs and reading each other's native transcripts, memories, and instructions in place, with zero-copy, across different agent tools.58 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables separate Claude Code sessions across a team to see teammates' live presence, warn before editing a file someone else is editing, route shared-contract changes to the developers whose code depends on them, and produce structured handoffs when a session ends.304 npm1MIT
- AlicenseNot gradedqualityAmaintenanceLets coding agents like Codex, Cursor, and Claude Code share and resume each other's chats, and attach to a common task with saved notes that can be searched later. This keeps task state and decisions in sync no matter which agent you switch to.76 npm2MIT
- FlicenseAqualityAmaintenanceOne shared project for your team's Claude Code, Codex, Cursor and OpenCode agents: a task board, decisions and handoffs. Everyone keeps their own plan.1389-