T3 Code thread MCP
This MCP server globally manages persistent T3 threads across projects and computers, without requiring a parent thread ID, by connecting to T3 desktop or direct server environments.
Environment & project discovery:
list_environments,list_projects, andcreate_projectlet agents find or create projects on configured computers.Thread creation:
create_threadcreates an empty persistent thread in a project with optional model selection and command ID.Thread listing & reading:
list_threadsandread_threadexpose active conversation history with pagination and truncation limits.Messaging & workflow:
send_message_to_threadsends follow-ups, starts or queues work, revives settled threads, and can include reply routing.Waiting on threads:
wait_threadswaits for up to eight threads to finish or need attention, using cursors to avoid repeated results.Lifecycle control:
set_thread_settled,interrupt_thread,set_thread_archived,delete_thread,set_thread_title,set_thread_pinned, andset_thread_snoozedmanage thread state.Approval and user input handling:
respond_to_approval,respond_to_user_input, anddismiss_user_inputmanage explicit pending requests.Provider/model awareness:
list_providersreads installed providers, authentication status, and model catalog; tools accept model selections.Multi-environment routing: Supports desktop discovery or direct connections, with per-environment IDs and optional source thread references for replies.
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., "@T3 Code thread MCPcreate a thread titled "Auth refactor" and ask it to fix the failing login tests"
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.
T3 Code thread MCP
Manage persistent T3 threads across projects and computers from one globally installed MCP server. No parent thread ID is required. Each computer needs a running T3 server and an authorized connection. Threads remain visible in T3's desktop, web, and mobile clients.
Install globally
Requires Node 22 or later. Desktop discovery requires the companion T3 desktop build linked below. Direct connections were tested with released T3 0.0.40 and 0.0.42.
npm install -g https://github.com/samdickson22/t3code-thread-mcp/releases/download/v0.3.0/t3code-thread-mcp-0.3.0.tgz
t3code-thread-mcp --helpThis package is distributed through GitHub releases; it is not currently published to the npm registry. You can also clone this repository, run npm ci, and launch node src/cli.js.
Related MCP server: claude-session
Connect computers
Reuse the T3 desktop connection manager
On macOS or Linux, with a T3 desktop build that supports the connection bridge, run:
t3code-thread-mcpRegister that command with your MCP host. It uses the running desktop app's computer list and authenticated connections, including T3 Connect and SSH. Add or remove computers in T3's Settings → Connections; the MCP refreshes that list on each call. No parent ID, server URL, or access token is required.
Desktop discovery is the default when no direct connection is configured. It requires the companion T3 desktop change. Windows desktop mode is disabled until its named-pipe endpoint can be authenticated; use direct connection configuration on Windows. The MCP runs on the same computer as the desktop app. Agents on another computer need access to a bridge-enabled desktop there; this does not automatically install tools into remote provider sessions.
For a custom T3 home, use --desktop-state-dir /path/to/t3-home/userdata.
The app must remain open. Closing it rejects new operations; agent work already
accepted by a server may continue. Connection credentials stay inside T3. The
existing direct-connection and legacy scoped modes below are unchanged.
Configure direct connections
For one computer, supply T3_URL and T3_ACCESS_TOKEN to the MCP process through your host's environment or secret manager. Use HTTPS remotely; loopback HTTP is supported. Obtain the access token through T3's normal pairing/token-exchange flow. When it expires, refresh it and restart the MCP process.
For several computers, create ~/.config/t3code-thread-mcp/config.json:
{
"environments": [
{
"id": "desktop",
"label": "My desktop",
"url": "http://127.0.0.1:3773",
"tokenEnv": "T3_DESKTOP_TOKEN"
},
{
"id": "server",
"label": "Remote server",
"url": "https://your-t3-server.example",
"tokenEnv": "T3_SERVER_TOKEN"
}
]
}Use your actual server addresses and supply the named token variables to the MCP process. The file contains variable names, not secret values. Keep environment IDs consistent between agents that will reply to each other. This does not discover arbitrary computers or bypass T3 authentication. For T3 Connect, use a supported reachable server endpoint; a UI connection label is not an API URL.
Pass --config /absolute/path/config.json or set T3_MCP_CONFIG to use a different file. With multiple environments, calls select environmentId; an optional top-level defaultEnvironment supplies a default. A single configured environment is selected automatically. T3_URL takes precedence over the default file.
Upgrading from 0.1.x: remove T3_SOURCE_THREAD_ID from the MCP configuration to use global mode. An explicit source ID plus T3_URL retains legacy project scope, even when T3_MCP_CONFIG is inherited. An explicit --config selects the global configuration.
Register with your agents
Installing the executable and registering an MCP server are separate steps. Register once at user scope on each computer/provider home where agents should have these tools. Newly started T3 provider sessions can then load that registration. Existing sessions may need to restart.
Codex user configuration (~/.codex/config.toml):
[mcp_servers.t3_threads]
command = "/absolute/path/to/t3code-thread-mcp"Find the executable path with command -v t3code-thread-mcp. No arguments or token variables are needed for desktop discovery. For direct connections, add --config arguments and forward the required token variable names through env_vars.
Claude Code user registration:
claude mcp add --scope user t3_threads -- /absolute/path/to/t3code-thread-mcpFor direct connections, supply token variables in the environment that launches Claude/T3. If T3 uses a custom Codex or Claude home, register there. Alternatively, configure the MCP through T3's provider launch arguments. The live validation exercised both providers using per-environment launch settings.
For other MCP hosts, launch the same executable with stdio transport, optional --config arguments, and the required environment variables. The MCP does not print credentials or write logs to stdout.
Global tools
Tools | Behavior |
| Discover configured computer IDs. |
| Discover or create projects on a selected computer. Workspace paths belong to that computer. |
| Read the server's actual installed providers, authentication status, and model catalog. |
| Create a persistent thread in any project. Requires |
| List threads across projects with optional project filtering and pagination. |
| Read active conversation history and pending requests. Message text is capped at 8,000 characters with truncation indicated. Restore archived threads before reading their history. |
| Send or queue work and revive settled threads. Optional |
| Wait for up to eight threads across environments, using cursors to suppress repeated results. Unobserved/unavailable targets are reported separately. A zero wait allows one bounded network observation. |
| Interrupt work or stop its provider session while retaining conversation history. |
| Settle or reactivate threads. T3 rejects settlement while work or blocking requests remain. |
| Rename, pin/unpin, or snooze/unsnooze. Use |
| Archive/restore or permanently delete a thread. |
| Manage explicit pending requests by request ID. |
Start with list_environments, then list_projects and list_providers. For example:
{
"name": "create_thread",
"arguments": {
"environmentId": "server",
"projectId": "project-id-from-list-projects",
"title": "Investigate issue 123",
"commandId": "issue-123-create",
"modelSelection": {
"instanceId": "codex",
"model": "gpt-6-astra",
"options": [{ "id": "reasoningEffort", "value": "low" }]
}
}
}Send work using the returned thread ID and the same environment ID. Select a Claude model from that environment's provider catalog; the current Fable 5.1 canonical slug is claude-fable-5-1 with instance claudeAgent and option { "id": "effort", "value": "low" }.
Mutations accept an optional commandId. Persist it before dispatch and reuse it only for the identical operation and arguments. T3 stores receipts, including rejected commands. A receipt means accepted, not completed; use read/wait to inspect execution. Global retry identities include routing, operation, project/target, and optional source. Keep these stable across retries.
Legacy compatibility and parity limits
Setting T3_SOURCE_THREAD_ID retains the original seven project-scoped tools, schemas, defaults, sender attribution, and retry behavior. Agentdoc's existing scoped configuration continues to work. src/tools.json remains generated from the native T3 peer-tools PR; global mode adds routing and management tools beyond that PR's scoped contract.
This release does not claim full Codex app feature parity. T3's public API does not expose equivalent conversation forks or host-to-host session handoff. It also withholds archived message history until the thread is restored. The MCP reports that limitation instead of returning false empty history or silently unarchiving it. Creating a new thread does not copy history, clone a provider session, or create a worktree. Changing an existing thread's provider driver may be rejected by T3; threads owned by different providers can communicate across environments.
The HTTP and WebSocket routes are existing T3 application APIs, not a guaranteed stable third-party protocol. This integration is independent of Agentdoc or any task board.
Validation
npm test
npm run checkTests cover the real MCP stdio boundary, global installation/configuration, cross-project and cross-environment routing, legacy scope, retry identities, attention states, and unavailable hosts. Browser screenshots and real-provider evidence show Astra-low creating Fable-low on another environment, Fable replying through its own MCP tools, and settlement/archive/restoration/revival with retained context.
Available Tools
7 toolscreate_threadA
Create an empty persistent peer thread in this project, at its workspace root. Inherits this thread's model and permission mode unless modelSelection is supplied. Returns its ID; use send_message_to_thread to start work. Does not copy history or create a worktree.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| commandId | No | ||
| modelSelection | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-idempotent, non-destructive behavior, so the bar is lower. The description still adds meaningful traits beyond them: model and permission-mode inheritance (overridable via modelSelection), the fact nothing is copied, and no worktree is created, which counters a plausible agent assumption for a 'thread' 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?
Four short sentences, each carrying distinct information: what is created, what it inherits, what it returns/follows up, and what it deliberately omits. Front-loaded with the creation semantics and no 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?
With no output schema, the description correctly discloses the return value (the thread ID) and covers inheritance, empty-history, and no-worktree behavior. It is nearly complete for a 3-param mutation tool; the only real gap is the unexplained commandId parameter.
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% across 3 params including a nested modelSelection object, so the description must carry the load. It does explain the effect of modelSelection (overriding inherited model/permission mode), but says nothing about title beyond the required flag or commandId at all, leaving two parameters unexplained.
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 ('Create an empty persistent peer thread'), scopes it ('in this project, at its workspace root'), and explicitly distinguishes it from adjacent operations ('Does not copy history or create a worktree'). An agent can place it among list_threads/read_thread/send_message_to_thread without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the downstream step explicitly ('use send_message_to_thread to start work'), which tells the agent this tool only allocates a thread and a follow-up call is needed. It stops short of stating when NOT to create a thread or what prerequisites/context the project must be in.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
interrupt_threadBDestructive
Request interruption of a peer thread's current turn in this project. History remains available for a follow-up.
| Name | Required | Description | Default |
|---|---|---|---|
| threadId | Yes | ||
| commandId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and readOnlyHint=false, so safety is covered. The description adds genuinely new context: the word 'Request' signals the interrupt may be asynchronous rather than guaranteed, and 'History remains available for a follow-up' tells the agent the thread survives. It could say more about partial turn output, but this is solid added value.
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, zero waste, with the action and scope front-loaded ahead of the survival note.
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 mutation with no output schema, the safety profile is covered by annotations and the history-persistence behavior is covered by the description. Gaps remain around commandId, error behavior when the thread is idle, and what happens to the interrupted turn's partial output.
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% on two parameters. The description explains nothing about either: threadId is only obliquely inferable from 'peer thread's', and commandId is completely unexplained (likely an idempotency/correlation key, but the agent must guess). With zero schema coverage the description should have compensated and does not.
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+resource+scope: 'interrupt a peer thread's current turn in this project'. An agent can distinguish it from siblings like set_thread_settled or send_message_to_thread. It does not name those siblings explicitly, 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?
No when-to-use guidance and no alternatives named. The phrase 'current turn' implies the interrupt applies only to in-flight work, but nothing tells the agent when to prefer this over send_message_to_thread or set_thread_settled.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_threadsBRead-onlyIdempotent
List persistent peer threads in this project, including settled threads. Archived threads are excluded. Results sort by ID; pass nextBeforeThreadId to fetch the next page.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| beforeThreadId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavior: sort order by ID, archived exclusion, settled inclusion, and cursor-based pagination. The only flaw is the cursor parameter being misnamed (nextBeforeThreadId).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the resource and scope before the pagination detail. Minimal waste, though the settled/archived clauses slightly overlap in conveying filter behavior.
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 with full annotation coverage and no output schema, this is adequate, but the 0% schema coverage leaves 'limit' undocumented and the cursor parameter is named inconsistently, so an agent lacks the precise syntax needed to page correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameters, and it only partially does. It explains the cursor's role but calls it 'nextBeforeThreadId' while the actual parameter is 'beforeThreadId', which could mislead an agent, and it says nothing about the limit 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?
The description gives a clear verb ('List') and resource ('persistent peer threads in this project'), plus scope qualifiers (settled included, archived excluded). It is distinguishable from read_thread (single) and create_thread at a glance, though it doesn't explicitly name a sibling.
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 explicit when-to-use guidance or routing to alternatives such as read_thread or wait_threads. The inclusion/exclusion notes describe scope, not usage conditions, so an agent must still infer 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.
read_threadARead-onlyIdempotent
Read a peer thread's state and a page of conversation messages in this project. Tool output and attachments are omitted; message text is capped at 8000 characters. Use the returned page.beforeCursor for older turns.
| Name | Required | Description | Default |
|---|---|---|---|
| threadId | Yes | ||
| turnLimit | No | ||
| beforeCursor | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true, idempotent=true, non-destructive, closed-world. The description adds valuable behavioral detail beyond that: tool output and attachments are omitted, and message text is capped at 8000 characters. These are non-obvious constraints that affect how an agent interprets results.
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 purpose, then constraints, then pagination instruction. No wasted words.
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 three parameters, one required, no output schema, and no annotations about return shape, the description covers the essential behavioral constraints and pagination pattern. It could mention what 'state' includes or whether turnLimit controls the page size, but it is largely complete for the tool's complexity.
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; it does so by explaining the purpose of beforeCursor for pagination. However, it doesn't describe threadId or the turnLimit parameter (1-100), leaving those semantics implicit. Baseline with no schema descriptions would be low, so the partial compensation earns a 4.
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 (read) and resource (a peer thread's state plus a page of conversation messages), scoped to 'this project'. It is clearly distinguishable from siblings like create_thread, list_threads, and send_message_to_thread.
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 explains pagination usage ('Use the returned page.beforeCursor for older turns'), which gives a clear operational context. It doesn't describe when to prefer this over alternative reading tools, but the sibling set doesn't include an obvious competing read tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_message_to_threadA
Send a visible follow-up to a peer thread in this project, starting or queuing work and reviving settled threads. Includes your thread ID so the recipient can reply. Optional modelSelection changes the model. T3 can reject changing the provider of an already-bound thread.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | ||
| threadId | Yes | ||
| commandId | No | ||
| replyToSource | No | Include instructions to reply to your source thread. Defaults true. Set false when an external controller watches completion instead. | |
| modelSelection | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations declaring readOnlyHint=false and idempotentHint=false, the description adds meaningful behavioral detail beyond them: the message is visible to the recipient, the sender's thread ID is embedded so the recipient can reply, modelSelection alters the model, and a validation rule exists ('T3 can reject changing the provider of an already-bound thread'). Only the non-idempotent/retry implications are left unstated.
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 compact sentences, front-loaded with the core action and its state effects, then parameters, then the rejection rule. No filler, though the phrasing is dense enough that a sentence on commandId would have been a better use of space than some of the modelSelection detail.
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 5-parameter mutating tool with a nested object and no output schema, the description covers the main action and one failure mode, but leaves commandId unexplained and says nothing about what happens to a queued vs. started thread or how errors surface. Adequate but with clear gaps.
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 20%, so the description must compensate; it does explain modelSelection's effect and one provider constraint, but threadId, message, and commandId receive no semantic elaboration at all. 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?
The description states a specific verb and resource ('Send a visible follow-up to a peer thread in this project') and clarifies the effect on thread state (starting, queuing, reviving settled threads). It is clearly distinguishable from create_thread or read_thread, though it never names a 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?
It implies usage context by describing the scenarios that motivate a send (starting/queuing work, reviving settled threads), but it gives no explicit when-to-use vs. when-not guidance and no alternatives among the sibling tools (e.g., create_thread vs. send_message_to_thread).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_thread_settledADestructive
Settle or reactivate a peer thread in this project. Settling is rejected while work is running or queued, or blocking approvals are pending. Use interrupt_thread to stop a turn first.
| Name | Required | Description | Default |
|---|---|---|---|
| settled | Yes | ||
| threadId | Yes | ||
| commandId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false. The description goes beyond these by disclosing the precise rejection preconditions for settling, which is valuable operational context. It stops short of what 'settled' actually changes or how reactivation behaves, leaving some behavioral gaps.
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 tight sentences, each earning its place: what it does, the rejection conditions, and the alternative. The core action is front-loaded with zero 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 mutation tool with annotations covering the safety profile, the description supplies the preconditions and the fallback sibling, which is the main missing piece. Remaining gaps are the semantics of `commandId` and any return/state-change detail, which are secondary here.
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 carry parameter meaning. It implies the `settled` boolean via 'settle or reactivate' and `threadId` via 'peer thread', but `commandId` is completely undocumented in either the schema or the description. 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 set (settle/reactivate) and resource (peer thread in this project), which is clear and distinguishable from siblings like create_thread or read_thread. It does not explicitly contrast with other thread-mutation siblings, but the pairing of both directions through the `settled` flag is well conveyed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the blocking conditions for settling (work running/queued, or pending blocking approvals) and names the alternative (interrupt_thread) with the condition that selects it. This is exactly the when/when-not/alternative guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_threadsARead-onlyIdempotent
Wait for any peer thread to finish or need attention. Pass each last returned cursor to avoid repeated notifications. Returns current state on timeout; commentary does not wake this tool. Maximum wait is 60 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| targets | Yes | ||
| timeoutSeconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/non-open-world, and the description adds real behavioral detail beyond them: timeout returns current state, commentary does not wake the tool, and wait is capped at 60 seconds. These are exactly the traits an agent needs to avoid misuse.
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?
Four compact sentences, front-loaded with the core action and followed by the operational hints. Little wasted text, though the phrasing is slightly terse and telegraphic.
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?
No output schema exists, so the description should describe return values; it only covers the timeout return ('returns current state on timeout') and leaves the normal wake return shape unspecified. Adequate but incomplete for a blocking-wait tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It clarifies the cursor semantics ('each last returned cursor to avoid repeated notifications') and implies per-target thread ids, but never explains threadId itself or that targets is an array of up to 8 entries.
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 (wait) and resource (peer threads) plus the wake conditions (finish or need attention). It is clearly distinct from read_thread/list_threads, though it never explicitly names a sibling alternative.
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 implied usage via the cursor hint ('pass each last returned cursor to avoid repeated notifications'), which tells the agent how to call it repeatedly. It does not say when to prefer this over list_threads or read_thread, leaving the selection to inference.
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.
7 tool updates
v0.1.3- First observed
create_thread - First observed
interrupt_thread - First observed
list_threads - First observed
read_thread - First observed
send_message_to_thread - First observed
set_thread_settled - First observed
wait_threads
TDQS
Scored across 7 tools
Each tool maps to a distinct action on the thread resource (create/list/read/send/wait/settle/interrupt). Descriptions clarify boundaries, e.g. create_thread vs send_message_to_thread and set_thread_settled vs interrupt_thread.
All tools use snake_case with a verb-first pattern and 'thread(s)' as the resource noun. send_message_to_thread is slightly longer but still follows the same convention.
7 tools is well-scoped for peer thread management; each tool covers a necessary operation without redundancy.
Core thread lifecycle (create, list, read, message, wait, settle, interrupt) is covered, but there is no explicit archive or delete operation despite archived threads being referenced. This is a minor gap that agents can work around if archiving is handled elsewhere.
Maintenance
Related MCP Connectors
Agent-native collaboration network: orchestrate a team of long-running agents from any MCP client.
Hosted MCP memory and agent control plane for durable conversations, jobs, and operations.
Project management MCP for AI agents with safe task reads and writes.
Read and write shared BitsWeave context, projects, tasks, and work sessions through MCP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables MCP clients to spawn and control Codex CLI and Claude Code sessions on the host machine, with session management and filesystem access.4MIT
- FlicenseNot gradedqualityAmaintenanceMCP server for programmatic lifecycle management of Claude Code sessions, supporting list, create, read, send, fork, wait, and interrupt operations.1 npm1-
- FlicenseAqualityCmaintenanceMCP server for interacting with a running T3 Code instance. Enables viewing agent threads, sending messages, and approving permission requests from Claude Code or voice-controlled models.19-
- AlicenseNot gradedqualityBmaintenanceEnables coding agents to start, monitor, and control T3 Code / T3 Turbo threads locally via MCP.1MIT