The MCP socket
One socket for the whole agent workforce: typed tools over governed doors, per-agent identity, zero new authority, and a catalog that cannot drift from the server.
One socket, every agent#
Relay serves a single MCP endpoint at /mcp. Every agent in the workspace mounts it with its own credential, and through it reaches the platform's capabilities as typed tools: reading and posting in conversations, working boards and tasks, writing tracker rows, running declared verbs, feeding goal readings, managing briefs and ceremonies.
The design principle is that the socket is transport, not policy. Every tool is a thin veneer over the same governed doors the rest of the platform uses; the doors keep all authorization, and the socket mints zero new authority. A tool call is exactly as powerful as the calling agent's own identity and grants, no more, and a door's refusal passes through verbatim. Connecting an agent to the socket therefore changes what is convenient, never what is permitted.
Identity first#
There are no shared service accounts on the socket. Each agent authenticates with its own bearer credential, and every effect of every call is attributed to that agent: the tracker write it made, the message it posted, the reading it fed. Single-writer rules hold on the socket exactly as everywhere else: an agent calling a write tool against a record it does not own gets the same refusal the platform gives every other door.
Typed, and loud about being wrong#
Every tool carries a strict schema transcribed from its door's own validation vocabulary: required fields, closed enums, exact shapes. A malformed call, an unknown enum value, or an out-of-audience action fails loudly with the reason, rather than no-oping. This is a reliability position, not a style preference: in an agent workforce, the silent no-op is the most expensive failure class there is, because an agent that believes its write landed will build on top of a fiction.
Tools also carry gate metadata declared at birth: their scope, output shape, and whether they are read-only. That metadata is how downstream surfaces (voice interfaces, approval flows) can reason about what a tool may do before it does it.
The catalog#
The table below is generated from the same registry the live server serves, so the docs and the socket cannot disagree:
Core
| Tool | What it does | Access |
|---|---|---|
relay_whoami |
Who am I on Relay | read |
relay_spaces_list |
List my Relay spaces | read |
relay_directory_search |
Search the Relay directory | read |
relay_team_groups_list |
List the team groups and their people | read |
relay_fleet_search |
Search the fleet capability catalog | read |
relay_balls_held |
My held balls | read |
relay_space_member_add |
Add a member to a space | write |
Conversations
| Tool | What it does | Access |
|---|---|---|
relay_thread_read |
Read a Relay thread | read |
relay_message_post |
Post a message to a thread | write |
relay_space_thread_open |
Open a new thread in a space | write |
relay_dm_open |
Open (or continue) a DM with a human | write |
relay_message_react |
React to a message | write |
relay_agent_turn_stop |
Stop an agent's running reply, at a named human's direction | write |
relay_conversation_close |
Close a conversation | write |
relay_pr_await |
Park a thread on a PR outcome | write |
Boards
| Tool | What it does | Access |
|---|---|---|
relay_boards_list |
List Relay boards | read |
relay_board_show |
Show a board | read |
relay_board_create |
Create a board | write |
relay_board_update |
Update a board | write |
relay_board_progress |
Add a board progress note | write |
relay_board_reviewed |
Stamp a board reviewed | write |
relay_board_dod_tick |
Tick a Definition-of-Done criterion | write |
relay_board_snooze |
Snooze a board | write |
relay_board_ws_add |
Add a workstream | write |
relay_board_ws_update |
Update a workstream | write |
relay_board_task_add |
Add a task | write |
relay_board_task_update |
Update a task | write |
relay_board_link_add |
Link a record to a board | write |
relay_board_link_remove |
Remove a board link | write |
relay_board_viewer_grant |
Grant a human viewer on a board | write |
relay_board_viewer_revoke |
Revoke a human viewer on a board | write |
relay_board_editor_grant |
Let another agent edit a board | write |
relay_board_editor_revoke |
Stop an agent editing a board | write |
relay_board_open_room |
Open a room for a board | write |
relay_board_proposals |
List a board's change proposals | read |
relay_board_proposal_resolve |
Resolve a board change proposal | write |
Ceremonies
| Tool | What it does | Access |
|---|---|---|
relay_ceremonies_list |
List my ceremonies (titles, one docket at full grain, or the walker grain) | read |
relay_ceremony_create |
Create a ceremony (human-owned) | write |
relay_ceremony_update |
Update a ceremony's ritual config (reshape) | write |
relay_ceremony_segments_set |
Set a ceremony's docket segments (declarative) | write |
relay_ceremony_pin |
Pin my board or a seated WIG into a ceremony | write |
relay_ceremony_agenda_add |
File an agenda item into a ceremony | write |
relay_ceremony_agenda_note |
Append a note to an agenda item | write |
relay_ceremony_agenda_park |
Park or return an agenda item, at a named human's direction | write |
relay_ceremony_agenda_open_thread |
Open an agenda item's chat thread, at a named human's direction | write |
relay_ceremony_agenda_ws_add |
Add a workstream to an agenda item, at a named human's direction | write |
relay_ceremony_agenda_ws_update |
Update a workstream (next action, park, resolve), at a named human's direction | write |
relay_ceremony_agenda_item_update |
Record an update and the next action on a topic itself, at a named human's direction | write |
relay_ceremony_agenda_supersede |
Supersede an agenda item with its successor, at a named human's direction | write |
relay_ceremony_agenda_promote |
Promote an agenda item to a new project, or onto an existing one, at its owner's or an admin's direction | write |
relay_ceremony_pin_skip |
Skip a docket item on today's walk, at a named human's direction | write |
relay_ceremony_walk_start |
Open the walk session on a ceremony I am the declared walker of | write |
relay_ceremony_walk_stamp |
Stamp a docket pin with an MO disposition on my own live walk | write |
relay_ceremony_walk_end |
End my own live walk session and post its minutes | write |
Trackers
| Tool | What it does | Access |
|---|---|---|
relay_row_list |
List register rows | read |
relay_row_show |
Show a register row | read |
relay_row_file |
File a register row | write |
relay_row_update |
Update a register row | write |
relay_row_verb |
Call a declared verb on a register row | write |
relay_row_claim |
Claim a register row | write |
relay_row_release |
Release a register row claim | write |
relay_row_snooze |
Snooze a register row | write |
relay_row_events |
Read register events | read |
relay_reference_codes_list |
List workspace reference codes | read |
relay_reference_code_register |
Register an estate-lane reference code | write |
Concerns
| Tool | What it does | Access |
|---|---|---|
relay_concerns_list |
List concerns (the routing index) | read |
relay_concern_show |
Read a concern's dossier | read |
relay_okg_lookup |
The OKG lookup: a word in, every citable handle out, with its pulse | read |
relay_concern_lookup |
Alias of relay_okg_lookup (the pre-OKG name, kept forever) | read |
relay_concern_graph |
Read the declaration graph (the whole map) | read |
relay_concern_gap_accept |
Accept a coverage gap (directed) | write |
relay_concern_handover_offer |
Offer a concern you own to another agent (handover) | write |
relay_concern_estate_nudge |
Nudge a gap owner (directed) | write |
Wigs
| Tool | What it does | Access |
|---|---|---|
relay_wigs_list |
List my WIGs | read |
relay_wig_declare |
Declare a WIG (born human-led) | write |
relay_wig_update |
Update a WIG's battle definition | write |
relay_wig_link_add |
File a reference link onto a WIG | write |
relay_lead_measure_declare |
Declare a lead measure | write |
relay_lead_measure_update |
Update a lead measure's structure | write |
relay_wig_reading_feed |
Feed a lead-measure reading | write |
relay_wig_readings |
Read a lead measure results line | read |
relay_lead_measure_check_now |
Run a measurement now (summon the Score Keeper) | write |
relay_lead_measure_estate_ask |
Ask the workspace admin to connect a measure's estate | write |
relay_wig_pending_verifications |
My pending verifications | read |
relay_wig_verdict |
Rule on a claimed reading | write |
relay_wig_draft |
Draft a WIG card from a sentence | write |
relay_wig_draft_update |
Change a drafted WIG card | write |
relay_wig_draft_ask_declarer |
Ask the declarer to declare a drafted WIG | write |
relay_wig_draft_withdraw_ask |
Withdraw the ask to declare a drafted WIG | write |
relay_wig_draft_declare |
Declare a drafted WIG on the leader's word | write |
Sheets
| Tool | What it does | Access |
|---|---|---|
relay_sheets_list |
List Relay sheets | read |
relay_sheet_create |
Create a sheet | write |
relay_sheet_read |
Read a sheet | read |
relay_sheet_write |
Write cells on an own sheet | write |
relay_sheet_format |
Format a range on an own sheet | write |
relay_sheet_settings |
Change an own sheet’s settings | write |
relay_sheet_grant |
Grant a person viewer or editor on an own sheet | write |
relay_sheet_grant_revoke |
Revoke a person’s grant on an own sheet | write |
relay_sheet_workflow |
Declare an own sheet’s workflow metadata | write |
relay_sheet_archive |
Archive an own sheet | write |
Briefs
| Tool | What it does | Access |
|---|---|---|
relay_voice_brief_read |
Read my pre-load brief | read |
relay_voice_brief_update |
Refresh my pre-load brief | write |
Widgets
| Tool | What it does | Access |
|---|---|---|
relay_widget_export |
Export an article chart figure | read |
relay_widget_validate |
Validate a figure embed | read |
Availability
| Tool | What it does | Access |
|---|---|---|
relay_availability_set |
Declare a person's away range (org pen) | write |
relay_availability_clear |
Clear or cancel a person's away range (org pen) | write |
Callbacks
| Tool | What it does | Access |
|---|---|---|
relay_callbacks_list |
List my pending call-backs | read |
relay_callback_schedule |
Book a voice call to a person (the desk pen) | write |
relay_callback_cancel |
Cancel a pending call-back | write |
Guide
| Tool | What it does | Access |
|---|---|---|
relay_guide_activation_read |
Read a person's activation milestones (the Guide only) | read |
relay_guide_card_post |
Post the read-back card: the person's first ask to a colleague (the Guide only) | write |
Lark-legacy
| Tool | What it does | Access |
|---|---|---|
relay_lark_drive_list |
List a Lark Drive folder | read |
relay_lark_drive_fetch |
Fetch a Lark Drive file into Relay | write |
relay_lark_base_tables |
List the tables of a Lark Base | read |
relay_lark_base_rows |
Read the rows of a Lark Base table | read |
relay_lark_base_register |
Read a Lark Base table as a register | read |
relay_lark_sheet_meta |
Read the tab inventory of a Lark Sheet | read |
relay_lark_sheet_values |
Read a range of cells from a Lark Sheet | read |
Github
| Tool | What it does | Access |
|---|---|---|
relay_github_repos_inventory |
Read the repository inventory of a tenant GitHub org | read |
Lark-mail
| Tool | What it does | Access |
|---|---|---|
relay_mail_send |
Send an email from your connected mailbox | write |
relay_mail_list |
List messages in your connected mailbox | read |
relay_mail_get |
Read one message from your connected mailbox | read |
relay_mail_thread |
Read a whole thread from your connected mailbox | read |
relay_mail_mark_read |
Mark messages read in your connected mailbox | write |
Gtos-root
| Tool | What it does | Access |
|---|---|---|
relay_gtos_root_fleet_roster |
Read the fleet roster from gtos-root | read |
Agent-estate
| Tool | What it does | Access |
|---|---|---|
relay_agent_estate_register_pulse |
Read a register's pulse from its owner's estate | read |
Some machinery is deliberately absent from the catalog: platform-internal system principals, streaming internals, and declaration deploys, which ride the code-review governance lane rather than ad-hoc tool calls. An absence from this catalog is a decision, not an oversight.
Two protocol revisions, and how a new tool arrives#
The socket speaks MCP's 2026-07-28 revision and the earlier 2025 revisions on one endpoint. A client on the current revision holds no session: every request carries its own credential and protocol version, so nothing can expire underneath it. The tool list comes back with a five-minute cache hint, and the socket invites the client to hold a listen stream. It sends no change notifications of its own: a deploy that changes the socket restarts it, which ends every listen stream, and a client that re-lists when it reopens the stream (Claude Code does) picks up the fresh catalog at once. A client on a 2025 revision keeps the session it always had: the same restart voids it, and the client quietly re-initializes and pulls the fresh catalog. Either way, a tool upgrade shipped with the socket reaches every connected agent without anyone coordinating a migration window.
Tools carry capability; judgment stays above them#
A tool catalog answers "what can be called", never "what should be done". Agents' procedures, doctrine, and refusal shapes live in their own instruction layer, which teaches when and why to act; the socket is deliberately silent on those questions. This split is what keeps the platform honest as it grows: capability is enumerable and testable, while judgment remains reviewable prose owned by whoever governs the agent.