codex-intercom-mcp
Cross-harness, same-machine messaging for Codex sessions: discover peers, exchange messages, and coordinate tasks over a shared local broker.
intercom_whoami— get this session's own intercom ID, name, cwd, and model for reliable targeting.intercom_list— discover other connected Pi/Codex/Claude/OpenCode sessions, scoped to machine, directory, or repo.intercom_status— check connection health, active sessions, unread messages, and pending asks.intercom_send— fire a non-blocking direct message to a session by name, full ID, or unique ID prefix (optional file/snippet/context attachments).intercom_ask— send a question and block for a reply (up to 120s) when your next step depends on the answer.intercom_pending— read queued inbound messages and unresolved asks, optionally marking them read.intercom_reply— answer a pending ask, selecting a specific sender and oldest/latest ask.intercom_team— view your current manager and the live coworkers it owns.intercom_join— list, join, or create named task teams (create=true joins as manager).intercom_set_summary— publish a short discoverable status of what this session is doing.Combined with
coi/bridge, this enables wake-on-message workers, manager→worker delegation, and team-based multi-agent coordination; plain MCP sessions are polling-only.
Click on "Deploy 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., "@codex-intercom-mcpList other coding agents and check for pending messages."
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.
Codex Intercom
Agent Intercom is a cross-harness, same-machine messaging system for coding agents. Its Pi, Codex, Claude Code, OpenCode, Grok Build, and AGY adapters share one local broker and protocol, so sessions can discover and message each other regardless of which harness they run in.
Harness | Repository |
Core / Protocol | |
Pi | |
Codex | |
Claude Code | |
OpenCode | |
Grok Build | |
AGY | |
Fleet lifecycle |
Grok Build and AGY support
Grok Build and AGY are supported as first-class protocol peers through two dedicated npm packages:
Host | npm package | Installed MCP launcher |
Grok Build |
| |
AGY |
|
The host packages depend on @ctliz/agent-intercom-claude and load its MCP runtime internally. Users do not need to install or place claude-intercom-mcp on PATH separately. Once connected, Grok and AGY sessions share the same local broker and protocol as Pi, Codex, Claude Code, and OpenCode, and expose the MCP operations: intercom_whoami, intercom_list, intercom_send, intercom_ask, intercom_reply, intercom_pending, intercom_status, intercom_team, intercom_join, and intercom_set_summary.
Install the host adapter before installing its plugin:
npm install -g @ctliz/agent-intercom-grok
npm install -g @ctliz/agent-intercom-agyFor multi-pane or Auto-Team-style use, the supervisor must give every MCP child a unique literal identity and the same scope as its intended peers:
AGENT_INTERCOM_SESSION_ID=<unique-pane-or-worker-id>
AGENT_INTERCOM_SESSION_NAME=<human-readable-name>
AGENT_INTERCOM_SCOPE_ID=<shared-team-or-workspace-scope>The plugin manifests intentionally do not contain static session IDs, because sharing one ID across concurrent panes would create identity collisions. CLAUDE_INTERCOM_SESSION_ID and CLAUDE_INTERCOM_NAME remain higher-priority compatibility aliases.
Grok Build and AGY currently provide polling-only MCP integrations. Messages are durably retained, but there is no host-specific wake bridge to inject a new turn. Each active agent should call intercom_pending at startup and at natural work boundaries. They can join an existing team and exchange messages with every other adapter, but Agent Intercom Orchestrator does not currently spawn or lifecycle-manage Grok or AGY workers.
Related MCP server: aichat-mcp
Maintenance & Upstream Provenance
Maintained by
ctliz: This distribution is maintained independently by ctliz.Upstream Heritage: Agent Intercom grew from Nico Bailon's original
pi-intercomand the upstreamdataforxyz/agent-intercom-*repositories. This project is not officially endorsed by or affiliated with upstream organizations.Package Namespace: The canonical npm namespace is
@ctliz/*. The historical@dataforxyz/*namespace was used up to and includingconnect.1and is retained only as provenance and as a migration-detection input; it is never treated as a current or healthy installation. The Agent Intercom branding and theintercom_*API surface are unchanged.
Protocol v4 & Broker-Enforced Scope
Agent Intercom protocol v4 introduces broker-enforced scope routing via AGENT_INTERCOM_SCOPE_ID:
Registration: The client submits its
scopeIdonce in the top-level registration payload.Broker Enforcement: The shared local broker stores the scope in its private
ConnectedSessionrecord and enforces same-scope discovery (intercom_list), naming, and prefix matching.Cross-Scope Routing: Cross-scope messaging is fail-closed; communication across different scopes is permitted only when addressing an explicit full session ID.
UX Routing Isolation: Scope is designed for same-OS-user workflow isolation (e.g. per-project or per-workspace agent teams), not as a cryptographic security principal, tenant boundary, or authentication credential.
Leak-Free: The raw
scopeIdvalue never entersSessionInfo, list payloads, lifecycle events, frontend displays, or execution logs.Standalone First:
AGENT_INTERCOM_SCOPE_IDis a general shell/IDE/service launcher contract. Agent Intercom works completely standalone in any terminal, tmux window, or script; TmuxDeck is optional visual tooling.
Origin and thanks
Agent Intercom grew from Nico Bailon's original pi-intercom. A sincere thank you to Nico and the original contributors for creating the Pi extension and the foundation this cross-harness family builds on.
This repository contains the Codex adapter. It gives Codex sessions native intercom tools and wakeable workers while remaining fully interoperable with the other Agent Intercom harnesses.
The bundled client and broker use strict intercom protocol v4. A send is only reported as delivered after the receiving adapter acknowledges it. Unfinished outbound sends are persisted under the shared intercom runtime directory and replayed with their original IDs after reconnect, making retries safe with receiver deduplication. Incompatible older local brokers fail closed without killing, downgrading, or creating second islands.
The project has two related pieces:
codex-intercom-mcp: an MCP server that exposes intercom tools inside a normal Codex session.coi: a wakeable Codex sidecar launcher. It starts a Codex app-server, registers an intercom identity, and starts Codex turns when another session sends it work.
Use plain MCP when you only need tools inside an already-active Codex turn. Use
coi when you want another session to wake the worker automatically or when
you want the host-level Alt+I and Alt+M shortcuts. Codex's MCP interface can
provide intercom tools, but it cannot add custom keybindings to the Codex TUI.
Status
Preview. This is the Codex adapter in the cross-harness Agent Intercom family.
Plain Codex MCP sessions do not receive Pi-style unsolicited visible turns.
Incoming messages are queued while the MCP server is running; call
intercom_pending to read them. Wake-on-message workflows require coi or the
app-server bridge.
For delegated work in a plain MCP session, keep the Codex turn active until
the required reports arrive. intercom_pending({ mark_read: true, wait_ms: 60000 }) waits up to one minute for an incoming message and returns as soon
as it arrives. Already queued messages return immediately. Repeat the bounded
wait after a timeout while required results remain outstanding. This also
receives ordinary completion reports sent with intercom_send; it does not
require intercom_ask or a correlated reply. Cancelling the tool or disconnecting
releases the wait. Restart the Codex session after updating the plugin to load
the new tool schema and coordination instructions.
When an external intercom turn completes, coi refreshes the attached remote
TUI by resuming the same thread. The inbound message and final response then
appear in the already-open terminal instead of existing only in the saved
transcript. This refresh happens after the turn is idle so Codex does not reopen
in a phantom Working state. Retryable app-server stream errors are reported as reconnecting without terminating the sidecar, allowing Codex's own retry to complete. Orchestrated fresh: true launches remove the saved coi thread state before registration.
The additive Stage-B boss-run-v1 adapter contracts are present but dormant.
Ordinary local and remote-access communication continues to use the existing
protocol-v4 behavior when Boss metadata is omitted. The legacy broker does not
advertise or bind Boss participants until a protected provider supplies all of
the required broker identity, credential-registry, authority-transition, and
participant-health predicates. Boss-scoped discovery and routing fail closed
across ordinary sessions and other Boss runs. The boss_participant and
boss_reviewer launch-profile markers make production Codex launches fail
with PROVIDER_AUTHORITY_UNAVAILABLE: this adapter has no broker-owned,
artifact-attested provider executable and therefore never resolves protected
launches through caller PATH. Their non-spawning parser validators still
reject disabled approvals and danger-full-access, and reviewers remain
read-only. The markers do not install or advertise a restricted operation client.
Restricted Boss operation clients are not advertised or exported yet. They
remain unavailable until the protected broker can provision both the binding
and transport through a non-caller-forgeable factory.
Install
For normal use, install the package so the command-line entry points are on
PATH:
npm install -g @ctliz/agent-intercom-codex@connect
# or by exact prerelease version
npm install -g @ctliz/agent-intercom-codex@0.12.1This provides:
codex-intercom-mcpcodex-intercom-bridgecoi
Then add the MCP server to Codex:
codex mcp add codex-intercom -- codex-intercom-mcpOptional MCP identity variables can be attached at registration time:
codex mcp add codex-planner \
--env CODEX_INTERCOM_NAME=planner \
--env CODEX_INTERCOM_SESSION_ID=codex-planner \
--env CODEX_INTERCOM_MODEL=codex \
-- codex-intercom-mcpPer-command environment variables passed to codex exec are not forwarded into
the MCP server process. Configure identity on the MCP server entry when you need
stable names or IDs.
To let a Pi manager create Codex workers with owned systemd cgroups, leases, model/effort selection, logs, and verified cleanup, install the companion Pi packages:
pi install git:github.com/ctliz/agent-intercom-pi@v0.12.2
pi install git:github.com/ctliz/agent-intercom-orchestrator@v0.12.0-connect.5Restart Pi or run /reload, then call agent_fleet({ action: "doctor" }). The orchestrator invokes the installed coi command, or a separately configured minimal wrapper such as coim; it does not replace this Codex adapter.
Plugin Use
This repo also includes Codex plugin metadata:
.codex-plugin/plugin.json.mcp.jsonskills/codex-intercom/SKILL.md
The plugin packages the MCP server and the optional intercom skill. It is useful
when you want Codex to install and manage the intercom integration as a plugin.
For a deliberately minimal profile, prefer direct MCP configuration with
codex-intercom-mcp; that lets you disable plugins and skills while keeping the
intercom tools.
Tools
intercom_whoami: show this session's intercom ID, name, cwd, and model.intercom_team({ team? }): show all named task memberships, inspect one team, or fall back to managed-team discovery.intercom_join({ name?, create?, members?, work? }): add task-team membership without leaving earlier teams; managers add connected peers in one call.intercom_status: show connection status and pending message counts.intercom_list: list local Pi, Codex, Claude Code, and OpenCode sessions in your scope (protocol v4 is same-scope; cross-scope contact requires an exact full session ID).intercom_set_summary: publish a short discoverable status.intercom_send: send a non-blocking message.intercom_ask: send a question and wait for the target's reply.intercom_pending: read queued inbound messages and unresolved asks.intercom_reply: reply to an inbound ask or ordinary message viaaskIdorcontextIdfromintercom_pending; replies inherit the original team. Within one task,topluswhich: "oldest" | "latest"also selects an ask.
Task teams
When the user delegates to named peers, the agent asks once whether to form a team for this task and waits for approval. Explicit create/join requests are already approval; approved tasks and inbound team messages do not prompt again. Discover the peers, then add everyone in one call:
intercom_join({ name: "launch", create: true, members: ["front", "writer"], work: "Launch page" })
intercom_send({ to: "front", team: "launch", message: "Implement the header." })Membership and roles are per task and additive; joining preserves earlier teams and registration scope. Reuse an approved team for the same task and append approved peers as manager. For initial contact without a shared team, omit team; unrelated memberships do not block messaging or silently create teams. Multiple shared teams require team on sends/asks. Replies retain the original message's team via exact selectors, not a mutable current team. App-server workers also retain the team on automatic replies.
Pending output never exposes protocol message IDs. Keep at most one unresolved intercom_ask to the same recipient; the broker rejects a second ask and recommends intercom_send for a non-blocking follow-up. Use intercom_send—not intercom_ask—for assignments and progress/status checkpoints.
Persistent Codex bridges and plain MCP runtimes automatically reconnect their stable Intercom identity after a broker restart, so a live worker does not need to be respawned merely to become reachable again.
Example:
intercom_team({})
// Manager: manager-id [connected]
// You: worker-a
// Coworkers: reviewer target=reviewer (claude, challenger, running) [connected]
intercom_ask({
to: "worker-a",
message: "Please inspect the failing test and reply with the likely cause.",
timeout_ms: 45000
})Blocking asks default to a short bounded wait and reject waits over 120 seconds.
For longer work, use intercom_send and check later with intercom_pending.
Wakeable Workers With coi
coi starts a per-agent Codex app-server socket, registers an intercom sidecar
for that socket, creates or resumes the sidecar's app-server thread, then
launches an interactive Codex UI attached to the same socket and thread.
Native thread renames (thread/name/updated) update the sidecar's Intercom
presence without changing its stable ID. Reconnects retain the updated name;
resuming a thread adopts its persisted thread.name rather than replacing it
with the launcher's default. The notification schema was checked against Codex
CLI 0.155.1 and 0.159.2. Protocol v4 and delivery ACK behavior are unchanged.
Start a named worker:
coi --name worker-a --id worker-aIf you launch wakeable workers often, a shell alias keeps coi distinct from a
plain codex session:
alias codex-intercom='coi'Then run codex-intercom --name worker-a --id worker-a. The alias is optional;
the important part is launching through coi, because the wrapper owns the
app-server sidecar that wakes on incoming work and the terminal integration
that provides Alt+I and Alt+M. Starting codex directly with only the MCP server
still provides intercom tools, but not those host-level behaviors.
Useful flags:
coi --name api-worker --id api-worker
coi --cwd /path/to/project --instructions "Reply tersely. Ask before destructive changes."
coi --no-tui --name background-worker --id background-workerEverything not recognized as a sidecar flag is passed through to
codex resume --remote, so normal Codex flags still work. Prompt arguments are
placed after the resumed sidecar thread ID.
While the coi TUI is open, press Alt+I to copy a short handoff snippet for
the current intercom session. As in pi-intercom, the snippet uses the unique
session name when possible and falls back to the stable intercom session ID.
The shortcut is provided by the coi launcher; plain MCP-only Codex sessions do
not have a plugin API for custom TUI actions.
Press Alt+M to insert the Codex intercom session-picker request. Codex will
call intercom_list, show the available sessions, ask which peer and message
you want, then use intercom_send. Codex does not expose native slash-command
or overlay registration, so coi provides this assisted flow instead of
claiming a native /intercom command. The equivalent MCP tools remain
available directly in every Codex session.
Action | Codex surface |
Choose a session and send | Alt+M in |
Copy this session's contact target | Alt+I in |
Find an orchestrator-owned manager or coworker |
|
Script or ask directly |
|
The shortcut uses native clipboard helpers locally and OSC 52 for SSH sessions.
If clipboard access fails, coi inserts the snippet into the Codex composer.
Disable the PTY-backed shortcut with --no-intercom-shortcut or
CODEX_INTERCOM_SHORTCUT=0. The optional node-pty dependency is only loaded
when the shortcut is enabled in an interactive terminal; if it is unavailable,
coi launches the normal Codex TUI without the shortcut.
coi also applies Codex runtime flags such as --sandbox,
--ask-for-approval, and --add-dir to wake-triggered sidecar turns. For
example, coi --name worker-a --id worker-a --sandbox workspace-write lets
intercom-woken turns write inside the worker workspace instead of falling back
to read-only.
The sidecar inherits CODEX_HOME, which makes it useful with a normal Codex
home or a dedicated minimal home.
Every packaged executable writes one machine-searchable identity line to stderr before application startup:
[agent-intercom-build] package=@ctliz/agent-intercom-codex version=0.11.0-connect.2 target=coi sourceSha256=<64-hex-source-identity>dist/build-info.json records the same deterministic runtime-source identity.
Use the line from the actual process journal—not the current file path or
mtime—to prove which bundle a remote worker loaded. Test-only changes do not
alter the identity; any runtime, build-script, package, or pinned-dependency
change does.
Minimal Wakeable Profile
A minimal profile is useful for workers that should stay focused on code and coordination. It reduces prompt/tool surface area by isolating the worker from your normal Codex config, memories, plugins, browser surfaces, image generation, and extra skills. Keep goals and multi-agent support on so the worker can track the task and delegate subtasks.
Create a dedicated Codex home:
export CODEX_MIN_HOME="$HOME/.codex-min-intercom"
mkdir -p "$CODEX_MIN_HOME"$CODEX_MIN_HOME/config.toml:
model = "gpt-5.5"
web_search = "disabled"
[features]
apps = false
memories = false
web_search = false
web_search_cached = false
web_search_request = false
# Keep the core coding-agent surface.
goals = true
multi_agent = true
shell_tool = true
unified_exec = true
auto_compaction = true
tool_call_mcp_elicitation = true
# Disable optional/distraction-heavy surfaces.
browser_use = false
browser_use_external = false
browser_use_full_cdp_access = false
in_app_browser = false
computer_use = false
image_generation = false
plugins = false
plugin_sharing = false
tool_suggest = false
skill_mcp_dependency_install = false
hooks = false
workspace_dependencies = false
[mcp_servers.codex-intercom]
command = "codex-intercom-mcp"After the first launch, Codex may populate system skills under the alternate home. To keep the profile minimal without deleting anything, list the skill paths:
find "$CODEX_MIN_HOME/skills" -name SKILL.md -printFor each skill you want disabled, add a config entry:
[[skills.config]]
path = "/absolute/path/from/find/SKILL.md"
enabled = falseThere is no required alias name. A short alias such as cim keeps the minimal
worker easy to launch:
cim() {
local home="${CODEX_MIN_HOME:-$HOME/.codex-min-intercom}"
local yolo="${CODEX_YOLO:-1}"
case "${1:-}" in
yolo|--yolo|on) shift; yolo=1 ;;
safe|--safe|off) shift; yolo=0 ;;
esac
local args=(--name codex-min)
[ "$yolo" = 1 ] && args+=(--dangerously-bypass-approvals-and-sandbox)
CODEX_HOME="$home" coi "${args[@]}" "$@"
}This alias intentionally defaults the minimal worker to yolo mode: no approval
prompts and no filesystem sandbox. Use it only for workers you trust with the
current machine account, or remove the bypass flag when you want a safer
workspace-scoped worker. Use cim safe ... or set CODEX_YOLO=0 to launch
without the bypass flag.
Use it like:
cim --name worker-a --id worker-a
cim --name reviewer --id reviewer --instructions "Review only; do not edit files."
cim --no-tui --name background-worker --id background-worker
cim safe --name safe-worker --id safe-worker --sandbox workspace-writeIf you are developing this repository from a checkout instead of installing the package, build and link it:
npm install
npm run build
npm linkOr point an alias directly at the checkout:
cim() {
local home="${CODEX_MIN_HOME:-$HOME/.codex-min-intercom}"
local repo="${CODEX_INTERCOM_REPO:-/absolute/path/to/agent-intercom-codex}"
local yolo="${CODEX_YOLO:-1}"
case "${1:-}" in
yolo|--yolo|on) shift; yolo=1 ;;
safe|--safe|off) shift; yolo=0 ;;
esac
local args=(--name codex-min)
[ "$yolo" = 1 ] && args+=(--dangerously-bypass-approvals-and-sandbox)
CODEX_HOME="$home" node "$repo/dist/coi.mjs" "${args[@]}" "$@"
}Manager And Worker Pattern
Use one Codex session as the manager and one or more coi sessions as wakeable
workers. The manager keeps the task shaped, feeds work to workers, watches for
drift, and decides when the work is ready to finish.
Example worker launch in tmux:
tmux new-session -d -s worker-a 'cd /path/to/project && cim --name worker-a --id worker-a'Then ask the worker from the manager session:
intercom_ask({
to: "worker-a",
message: "Please create a goal for the task, inspect the handoff, and report your first plan.",
timeout_ms: 45000
})Recommended manager prompt:
Start a wakeable worker in tmux using the minimal intercom alias:
tmux new-session -d -s <worker-id> 'cd <repo> && cim --name <worker-id> --id <worker-id>'
Give the worker a FEAT.md-style handoff:
# FEAT: <short task name>
Objective: <what must be true when done>
Context: <repo, branch, issue, constraints, important files>
Approach: <suggested first steps, but allow the worker to adjust>
Verification: <commands/tests/checks that should pass>
Definition of done: <clear finish criteria>
Coordination: create a goal, use subagents when useful, keep the manager updated through intercom, ask before risky or broad changes, and keep work in a branch/worktree when appropriate.
Tell the worker to create and maintain its own goal, use agents for parallel investigation or review, and report blockers early. As manager, keep sending focused follow-up work through intercom, keep the worker on task, and handle PR or final handoff when the implementation is ready.For non-blocking delegation, use intercom_send and check back later. For a
decision the manager needs before continuing, use intercom_ask.
App-Server Bridge
Use codex-intercom-bridge when you want one process to publish one or more
configured virtual Codex workers without launching an interactive TUI for each
worker.
Create a bridge config:
{
"statePath": "/path/to/intercom/codex-bridge-state.json",
"agents": [
{
"id": "codex-worker",
"name": "codex-worker",
"cwd": "/path/to/project",
"model": "gpt-5.5",
"instructions": "Reply concisely. Ask before making destructive changes."
}
]
}Start it:
codex-intercom-bridge --config "$HOME/.config/codex-intercom/bridge.json"Then other local sessions can target codex-worker with intercom_send or
intercom_ask. The bridge stores each worker's app-server threadId in
statePath, so later messages continue the same Codex thread.
By default, bridge turns run with approvalPolicy: "never" and read-only,
network-disabled sandboxing. Override approvalPolicy or sandboxPolicy in
the agent config only when you explicitly want a background worker to have more
authority.
Development
Clone and run from source:
git clone https://github.com/ctliz/agent-intercom-codex.git
cd agent-intercom-codex
npm install
npm run build
npm testFor MCP development, register the TypeScript source directly:
codex mcp add codex-intercom-dev -- npx --no-install tsx ./codex/server.tsUse either the built install or the dev install in a given Codex profile. Running both at the same time can register duplicate intercom MCP tools.
Agent Intercom Compatibility
agent-intercom-pi is the Pi-native adapter with overlays, inline rendering,
and Pi triggerTurn delivery. This repository, agent-intercom-codex, is the
Codex MCP/plugin adapter plus wake-on-message Codex app-server sidecars. The
Claude Code and OpenCode adapters join the same broker and appear in the same
session list.
All four repositories vendor the compatible local broker/client protocol so any adapter can start the broker and communicate across harness boundaries.
Releasing
Releases are automated from version tags. Update package.json, the lockfile when
present, and CHANGELOG.md on main, then push an annotated tag that exactly
matches the package version:
git tag -a vX.Y.Z -m "vX.Y.Z"
git push origin vX.Y.ZThe release workflow verifies that the tag points into main, runs typecheck,
tests, and the build, publishes the public npm package with trusted OIDC
provenance, and creates the GitHub Release. Existing npm versions and GitHub
Releases are skipped safely when a workflow is rerun.
Compatibility, Migration & Rollback
Single Shared Broker: The broker-capable adapters on the machine —
pi,claude,codex, andopencode— connect to one local broker over a Unix domain socket (~/.pi/agent/intercom/broker.sockor$PI_CODING_AGENT_DIR/intercom/broker.sock).Coordinated Upgrade Set: Protocol v4 changes broker negotiation, so the broker-capable adapters that are actually installed and enabled on this machine must be upgraded together in one maintenance window. Adapters you do not use do not need to be installed to satisfy the upgrade.
@ctliz/agent-intercom-coreis an internal dependency that arrives with the adapters and is never installed or upgraded on its own.Orchestrator is Optional:
agent-intercom-orchestratoris an optional Linux/systemd lifecycle component. It does not implement or start a Broker and is not part of the Broker compatibility set. Omitting it — for example on macOS, or when using TmuxDeck — is a fully supported configuration and is not a mixed or unsupported state. If it is installed on a supported Linux host, or on WSL with a systemd user manager enabled, update it together with the adapters it manages.Fail-Closed Legacy Handling: An incompatible legacy (v3) broker or client fails closed. It is rejected at negotiation and never killed, never downgraded, and never allowed to form a second broker island.
Rollback: Rolling back covers only the components that were actually installed on this machine before the upgrade. Restore the exact specs and lockfiles you backed up, then reload the affected agent sessions. Roll Orchestrator back only if it was installed to begin with. There is no published pre-v4 tag under
ctliz, so a pre-upgrade backup of the exact installed specs/locks is the supported rollback material. Leaving some installed broker-capable adapters on the old protocol while others are upgraded is an unsupported mixed state.
License
The current project is licensed under the GNU Affero General Public License
v3.0 or later (AGPL-3.0-or-later). If you modify this software and
make the modified version available to users over a network, the AGPL requires
you to offer those users the corresponding source code.
Portions derived from the original MIT-licensed pi-intercom project retain
their original notices. See THIRD_PARTY_NOTICES.md and
licenses/MIT-pi-intercom.txt. Versions already
published under MIT remain available under their original terms. See
LICENSE_TRANSITION.md for the exact commit and tag boundary.
Upgrading from connect.1 to connect.2
connect.2 renames the package namespace from @dataforxyz/* to @ctliz/*. The two namespaces are different packages to npm. Pi Git package installations deduplicate by repository URL without ref, but running agent sessions continue to execute legacy code in memory, and npm or global installs along with binary links can coexist and conflict. Operators must stop active sessions, clean active install surfaces, and follow remove-before-install — side-by-side installation is not supported.
Back up the exact specs, lock files, and settings of every installed component.
Stop or close the installed broker-capable adapters.
Remove the old
@dataforxyz/*specs, packages, and binary links that are actually installed.Assert the old identity is gone from the active install surfaces of the current OS user: Pi settings and extension specs, resolved managed install roots, actual
node_modulesinstallations, and conflicting binary links that the currentPATHwould resolve. Do not scan or delete unrelated source checkouts, historical documentation, or other users' files — a@dataforxyz/*string in an unrelated development clone is not an installation.Install the
@ctliz/*connect.2exact tags for the components you actually use (v0.11.0-connect.2).Reload or restart, then verify exactly one broker is running.
Classification rule. Migration-aware connect.2 setup and update tooling must classify an old-namespace-only install surface as MIGRATION_REQUIRED, and the simultaneous presence of both namespaces as a duplicate/dual-load hard error that refuses setup, update, and further installation. This tooling does not exist for every platform and adapter combination; where it is not available, apply the same two rules manually against the surfaces in step 4. Do not assume every adapter emits this code automatically.
Rollback reverses this and covers only the components that were installed on this machine before the upgrade: remove the @ctliz/* packages, then restore the backed-up exact @dataforxyz/* specs and locks. Roll Orchestrator back only if it was installed to begin with.
The connect.1 tags, source commits, and published release assets are immutable and are not modified by this migration. Release notes may carry an explicit erratum, which corrects the description only and never moves a tag or replaces an asset.
These packages are not published on the npm registry yet; install from the GitHub tags shown above.
Available Tools
10 toolsintercom_askA
Ask another intercom session a question only when the next step depends on its reply. Use intercom_send for assignments, progress/status checkpoints, and notifications.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| team | No | Task team; required when multiple teams are shared. | |
| message | Yes | ||
| timeout_ms | No | Maximum time to wait for a reply before returning an error. Use intercom_send plus intercom_pending for longer work. | |
| attachments | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare openWorldHint=true and non-destructive/non-idempotent, but they do not convey that this is a blocking, wait-for-reply operation; the phrase 'only when the next step depends on its reply' supplies that behavioral trait. The schema carries the timeout/error contract, so the remaining gap (reply shape, failure modes) is minor.
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, zero filler, with the core purpose front-loaded and the alternative routing in the second sentence. Nothing wastes the agent's attention.
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 moderate-complexity cross-session request tool with no output schema, the description covers purpose and routing well and the schema covers the timeout contract. It stops short of describing what a reply contains or how a timeout surfaces to the caller, which would have made it fully self-sufficient.
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 only 40%, so the description is expected to compensate, yet it mentions no parameters at all. The required 'to' and 'message' fields and the 'attachments' array are documented nowhere, leaving half the surface undefined.
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 ('Ask another intercom session a question') and immediately contrasts itself with the sibling intercom_send, so the agent can tell the two apart without opening either schema. The request/response nature of the call 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?
Gives an explicit selection condition ('only when the next step depends on its reply') and names the alternative (intercom_send) along with the cases it covers (assignments, progress/status checkpoints, notifications). This is exactly the when-to-use / when-not-to-use routing an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
intercom_joinA
After user approval, create or join a task team. Membership is additive; members lets the manager add connected peers in one call. Omit name to list teams.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Team name to join. Omit to list joinable teams. | |
| work | No | Task description when creating a team. | |
| create | No | Create this named team and join as manager. Requires name. | |
| members | No | Connected session names or IDs to add; manager only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (write, open-world, non-idempotent, non-destructive), and the description adds genuinely new context: a consent prerequisite and the key behavioral trait that 'Membership is additive' rather than replacing. It does not describe error behavior or what join does when the team is absent.
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 approval precondition and the create/join/list modes. No filler; every clause carries an instruction or constraint.
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 four-parameter mutation tool with no output schema, the description covers modes, prerequisites, and the additive-membership semantics. Remaining gaps (return shape for the list mode, failure behavior) are minor.
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 documents all four parameters including the manager-only constraint on members and the create/name dependency. The description largely restates this ('members lets the manager add connected peers', 'Omit name to list teams'), so it adds little beyond 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?
States specific verbs and resource: 'create or join a task team', plus a third mode ('Omit name to list teams'). This is clear, though it does not explicitly differentiate itself from the sibling intercom_team, which plausibly overlaps.
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 a precondition ('After user approval') and a mode-switch rule ('Omit name to list teams'), plus who may pass members ('the manager'). No explicit alternatives are named against the sibling tools, so it stops 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.
intercom_listARead-onlyIdempotent
List intercom-connected Pi or Codex sessions on this machine.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | machine | |
| include_self | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful scopng context—'intercom-connected Pi or Codex sessions' and 'on this machine'—but does not disclose return format, ordering, filtering, or other runtime behavior. No contradiction with the annotations is present.
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 focused sentence with no filler. The verb 'List' and the key resource and location qualifiers are front-loaded, making the core purpose immediately clear.
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-only list tool, the description is usable and the annotations provide the safety context. However, the two optional parameters are not semantically explained, no output schema exists to clarify return values, and there is no guidance distinguishing this from status/pending siblings, so the description is not fully self-sufficient.
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 compensate for missing parameter meaning. The phrase 'on this machine' weakly aligns with the default scope=machine, but the description does not explain the directory/repo scope values or the meaning of include_self at all.
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 'List' with a clear resource: 'intercom-connected Pi or Codex sessions' on 'this machine'. This differentiates it from siblings like intercom_reply, intercom_send, and intercom_ask, which are communication actions, and from intercom_status/intercom_whoami, which query status or identity rather than enumerate 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?
The description implies the tool should be used when an agent needs to enumerate local intercom sessions, but it does not explicitly state when to prefer this tool over siblings such as intercom_status or intercom_pending. There are no clear exclusions or alternative routing clues beyond the verb and resource.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
intercom_pendingADestructiveIdempotent
Read unread inbound messages and unresolved asks. When awaiting delegated results, use wait_ms: 60000 and mark_read: true to wait for incoming completion reports without ending the Codex turn. Repeat after a timeout while results are still required. Plain MCP cannot wake an idle Codex turn; use coi for automatic wake-on-message.
| Name | Required | Description | Default |
|---|---|---|---|
| wait_ms | No | Wait up to this many milliseconds if the inbox is empty. Returns immediately when a message arrives. | |
| mark_read | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorld, idempotent and destructive behavior; the description adds genuinely new context beyond them, namely the waiting semantics, that the wait does not end the Codex turn, and that plain MCP cannot wake an idle turn. It does not, however, explain that mark_read permanently clears unread state, which is the likely source of the destructiveHint.
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?
Purpose is front-loaded in the first sentence, followed by increasingly specific usage notes; four sentences carry distinct information. Slightly jargon-heavy (Codex turn, coi) but every sentence earns its place.
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 two-parameter read-with-wait tool and no output schema, the description covers purpose and the waiting workflow well but omits the shape of what is returned (messages vs. asks, counts) and the mutating effect of mark_read. Adequate but with clear gaps given no output schema to lean on.
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 50%: wait_ms is documented in the schema, mark_read is not. The description adds usage intent (wait_ms: 60000 to wait for incoming completion reports, mark_read: true alongside it) but never states what mark_read actually does as a side effect, leaving the undocumented parameter only partially compensated.
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?
Clear specific verb+resource: "Read unread inbound messages and unresolved asks" tells the agent exactly what the tool returns (pending inbox items). It does not, however, differentiate itself from siblings like intercom_list or intercom_status, so an agent must infer why 'pending' is distinct.
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 situational guidance: use wait_ms: 60000 and mark_read: true when awaiting delegated results, and repeat after a timeout while results are still required. It also names an alternative mechanism (coi for automatic wake-on-message), though it does not mention sibling tools as alternatives or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
intercom_replyADestructive
Reply to an inbound ask or ordinary message using askId or contextId from intercom_pending. Inherits the original team; team cannot override it.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Optional sender/session selector; never a message or thread ID. | |
| team | No | Must match the original message; omit to inherit. | |
| askId | No | Stable receiver-local pending ask selector. | |
| which | No | Select the oldest or latest ask from the chosen sender. | |
| message | Yes | ||
| contextId | No | Exact inbound context selector, including ordinary messages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnly=false, destructive=true, idempotent=false, openWorld=true). The description adds behavior the annotations can't convey: the reply inherits the original team and that team cannot be overridden, which is a meaningful constraint on how the call should be formed.
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, zero waste. The action and its object are front-loaded, and the inheritance constraint follows immediately, so an agent gets purpose and key rule in one pass.
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 destructive, non-idempotent write tool with no output schema and no annotations on team, the description covers purpose, selector sourcing, and the team constraint well. It leaves some behavioral detail unstated (e.g., what a 'destructive' reply actually changes, or response/pagination behavior), but nothing critical 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 83%, so the schema baseline carries most parameters (to, which). The description still adds value: it ties askId/contextId to their source in intercom_pending and reinforces the team parameter's immutable-inheritance semantics beyond the schema's terse 'omit to inherit'.
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 (Reply) plus its target (an inbound ask or ordinary message) and identifies the exact selectors to use (askId/contextId from intercom_pending). This scope — responding to an existing inbound thread — is clearly distinct from the create-new-message siblings like intercom_send or intercom_ask without having to open a 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?
The description gives clear context for use and, crucially, tells the agent where the askId/contextId values come from (intercom_pending), which is a real precondition. It does not name an alternative tool or state when NOT to use this (e.g., for starting a fresh thread), so it stops short of explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
intercom_sendB
Send a non-blocking direct message to another intercom session by name, full ID, or unique ID prefix.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| team | No | Task team; required when multiple teams are shared. Omit for ungrouped contact. | |
| message | Yes | ||
| attachments | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false and destructiveHint=false, so the mutation/safety profile is covered. The description adds one genuinely useful trait beyond the annotations - 'non-blocking' delivery - but says nothing about delivery failure handling, retry semantics (relevant given idempotentHint=false), or whether attachments are persisted.
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 with zero filler; the core action leads and the addressing detail follows. Nothing is redundant with the schema 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?
For a non-idempotent mutation tool with no output schema and 25% parameter coverage, the description is thin: no delivery/error semantics, no guidance on attachment usage, no note on required permissions or what a failed send looks like. It leaves real gaps an agent would need filled before invoking confidently.
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 only 25%, so the description must compensate. It does explain the 'to' parameter's accepted forms (name, full ID, unique ID prefix), which the bare schema does not, but it adds nothing for 'message' or 'attachments' beyond what the nested schema shows. Partial compensation only.
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 (send) and resource (direct message to another intercom session) plus the addressing modes (name, full ID, unique ID prefix). It is clear what the tool does, but it never distinguishes itself from close siblings like intercom_reply or intercom_ask, which an agent must choose between.
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 only implied: an agent can infer you call this to message a peer session, but there is no explicit when-to-use, when-not, or named alternative (e.g. versus intercom_reply for threaded responses). The addressing-format sentence hints at how to target recipients but not when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
intercom_set_summaryADestructiveIdempotent
Publish a short status summary so other sessions can discover what this Codex session is doing.
| Name | Required | Description | Default |
|---|---|---|---|
| summary | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=true, covering the mutation and repeat-call behavior. The description adds the transparency that the summary is published for other sessions to discover, which is useful beyond the schema. It does not contradict annotations.
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 concise sentence with all necessary information: the action, object, and purpose. No filler or redundancy. Front-loaded with the key verb 'Publish' and the resource.
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 tool is simple: one required parameter, no output schema, no nested objects. The description plus annotations provide enough to call it correctly. It states what to put in the summary, why, and the mutating behavior is captured by annotations. Minor omission: it doesn't explicitly say that calling it again overwrites the previous summary, though that's implied by idempotentHint and the nature of a status setter.
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 0%, so the description must compensate for the 'summary' parameter. It specifies that the summary should be 'short' and should describe what this Codex session is doing, giving meaningful content guidance. However, it does not clarify format, tone, or whether the summary replaces a previous one. For a single param, this is adequate but not thorough.
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 the verb 'Publish' with the resource 'short status summary' and specifies the audience and purpose: helping other sessions discover what this Codex session is doing. This clearly differentiates from sibling tools like intercom_reply or intercom_send, which focus on interactive communication, and from intercom_status, which likely retrieves status rather than setting it. It lacks an explicit contrast with siblings but the purpose is evident.
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 implies the usage: use it when you want other sessions to discover what this session is currently working on. That is a contextual signal, but there is no explicit when-to-use versus alternatives or exclusions. It does not mention that intercom_status could be an alternative for status retrieval, so the guidance remains implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
intercom_statusARead-onlyIdempotent
Show intercom connection status, active sessions, unread messages, and pending asks.
| 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, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds the specific status elements returned, which is useful but does not add behavioral traits beyond the annotations. No contradiction 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?
The description is one short sentence, front-loaded with the main purpose and followed by a clear list of included items. Every word contributes information; there is no redundancy or filler.
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, read-only status tool with safety annotations already provided, the description is nearly complete. It names all reported categories. However, it leaves minor ambiguity about how 'pending asks' relates to the sibling intercom_pending tool, which could be clarified without much extra text.
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 input schema has zero parameters, and schema description coverage is 100% (vacuously). With no parameters to describe, the description's silence is appropriate. Baseline for 0-param tools is 4, and nothing is lacking.
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 and resource ('Show intercom connection status') and enumerates concrete contents: connection status, active sessions, unread messages, and pending asks. It clearly distinguishes itself from action-oriented siblings like send/reply/ask, though it does not explicitly differentiate from intercom_pending, which may overlap on 'pending asks'.
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 is given on when to use this tool versus alternatives. The sibling list includes intercom_pending and intercom_list, which could serve similar informational purposes, but the description never mentions them or gives selection criteria. The usage context is entirely implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
intercom_teamBRead-onlyIdempotent
Show all your named task teams, or inspect one by name. Falls back to managed-team discovery.
| Name | Required | Description | Default |
|---|---|---|---|
| team | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds a fallback behavior ('managed-team discovery'), which is legitimate context beyond annotations, but it is vague and unexplained.
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 the list/inspect distinction front-loaded. Efficient, though the trailing fallback clause is opaque and adds little clarity per word.
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 and safety already covered by annotations, the description is serviceable but leaves the fallback mechanism and the format of returned team data unexplained. An agent can call it, but cannot predict the response shape or the fallback's implications.
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 schema gives no meaning for 'team' beyond 'string'. The description partially compensates by saying inspection is 'by name', implying the parameter is a team name rather than an ID, but it remains thin for a low-coverage parameter.
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 clear verb (Show/inspect) and resource (named task teams), and covers both modes: listing all teams or inspecting one by name. It does not distinguish itself from siblings like intercom_list or intercom_whoami, so it stops short of a 5.
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 two modes imply usage – omit the parameter to list, supply a name to inspect – but this is left to inference rather than stated. No alternatives among the sibling tools are named, and 'Falls back to managed-team discovery' describes behavior rather than when 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.
intercom_whoamiARead-onlyIdempotent
Return this Codex session's intercom identity for reliable targeting.
| 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, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds that the returned identity is meant for targeting, but it does not disclose the return format or any further behavioral details.
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 sentence with no wasted words. The key information is front-loaded: what the tool returns and why it is useful.
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 no-parameter, read-only identity lookup, the description is sufficient. It clearly tells the agent what the tool produces and why that output matters, and no additional invocation guidance is needed.
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 and 100% schema coverage, so the parameter semantics burden is minimal. The baseline for a zero-parameter tool is 4, and the description does not need to explain parameter 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 ('Return'), a specific resource ('this Codex session's intercom identity'), and a clear purpose ('for reliable targeting'). This distinguishes it from the sibling intercom tools, which handle other actions like sending, replying, or listing.
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 'for reliable targeting' gives clear context for when to call this tool: before actions that need to address the current session. However, it does not explicitly name alternatives or state when not to use it.
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.
1 tool update
v0.13.3- Changed
intercom_pending1 field changed- added
Input schema / properties / wait_msAdded value: +{ + "default": 0, + "description": "Wait up to this many milliseconds if the inbox is empty. Returns immediately when a message arrives.", + "maximum": 60000, + "minimum": 0, + "type": "integer" +}
5 tool updates
v0.13.0- Changed
intercom_ask1 field changed- added
Input schema / properties / teamAdded value: +{ + "description": "Task team; required when multiple teams are shared.", + "type": "string" +}
- Changed
intercom_join2 fields changed- added
Input schema / properties / membersAdded value: +{ + "description": "Connected session names or IDs to add; manager only.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / workAdded value: +{ + "description": "Task description when creating a team.", + "maxLength": 2000, + "type": "string" +}
- Changed
intercom_reply3 fields changed- added
Input schema / properties / askIdAdded value: +{ + "description": "Stable receiver-local pending ask selector.", + "type": "string" +} - added
Input schema / properties / contextIdAdded value: +{ + "description": "Exact inbound context selector, including ordinary messages.", + "type": "string" +} - added
Input schema / properties / teamAdded value: +{ + "description": "Must match the original message; omit to inherit.", + "type": "string" +}
- Changed
intercom_send1 field changed- added
Input schema / properties / teamAdded value: +{ + "description": "Task team; required when multiple teams are shared. Omit for ungrouped contact.", + "type": "string" +}
- Changed
intercom_team1 field changed- added
Input schema / properties / teamAdded value: +{ + "type": "string" +}
1 tool update
v0.12.1- Added
intercom_join
9 tool updates
v0.11.0-connect.1- First observed
intercom_ask - First observed
intercom_list - First observed
intercom_pending - First observed
intercom_reply - First observed
intercom_send - First observed
intercom_set_summary - First observed
intercom_status - First observed
intercom_team - First observed
intercom_whoami
TDQS
Scored across 10 tools
Most tools have clearly distinct purposes, but intercom_join's 'omit name to list teams' behavior overlaps with intercom_team, and intercom_status vs intercom_pending both report unread messages/pending asks. Descriptions do clarify the primary intent, so only minor confusion is likely.
All tools use a uniform intercom_<action> snake_case pattern, making the set highly predictable. The only slight deviation is noun-like action names (intercom_status, intercom_pending), but the convention remains consistent.
Ten tools is well-scoped for an inter-session messaging and team management server. Each tool maps to a distinct capability (identity, discovery, messaging, status) without obvious filler.
Core workflows are covered: identity, discovery, team join/inspect, send/ask/reply, pending reads, and status summaries. Minor gaps exist, such as no leave/disband team operation or team-wide broadcast, but agents can work around these by sending to individual members.
Maintenance
Related MCP Connectors
Real-time chat for AI agents. Claude Code, Cursor, Cline and Codex join channels over MCP.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Shared memory and mail for your AI agents. Verified with Claude Code; other MCP clients in testing.
Remote MCP server for The Colony — a social network for AI agents (posts, DMs, search, marketplace).
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceA local MCP server that connects AI coding agents (Claude Code, Codex, Cursor, etc.) on the same machine via a shared message bus, enabling them to chat, delegate tasks, and collaborate privately without cloud or internet.23 npm20MIT
- AlicenseAqualityDmaintenanceMCP server for inter-agent communication. Gives multiple Claude Code sessions a shared message board, agent registry, and orchestration layer — backed by a cloud relay so agents can coordinate across machines, repos, and teams.825 npmMIT
- AlicenseAqualityBmaintenanceEnables multiple coding agents (Claude Code, Codex, Cursor) to discover each other's sessions, search transcripts, ask questions, and handoff tasks through a shared MCP server.52 npmMIT
- AlicenseAqualityAmaintenanceAn MCP server that lets multiple agent sessions (e.g., Claude Code, Claude Desktop) on the same machine communicate over shared channels like walkie-talkies, enabling them to exchange messages and coordinate tasks without any central broker.7182 PyPI3MIT