Skip to main content
Glama

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 --help

This 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-mcp

Register 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-mcp

For 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

list_environments

Discover configured computer IDs.

list_projects, create_project

Discover or create projects on a selected computer. Workspace paths belong to that computer.

list_providers

Read the server's actual installed providers, authentication status, and model catalog.

create_thread

Create a persistent thread in any project. Requires projectId, title, and model selection. Defaults to approval-required permissions; no parent is needed.

list_threads, list_archived_threads

List threads across projects with optional project filtering and pagination.

read_thread

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_message_to_thread

Send or queue work and revive settled threads. Optional source: { environmentId, threadId } adds a sender reference and reply routing after checking that the source thread exists. Without it, the message has no invented sender.

wait_threads

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_thread, stop_thread_session

Interrupt work or stop its provider session while retaining conversation history.

set_thread_settled

Settle or reactivate threads. T3 rejects settlement while work or blocking requests remain.

set_thread_title, set_thread_pinned, set_thread_snoozed

Rename, pin/unpin, or snooze/unsnooze. Use snoozedUntil: null to clear a snooze.

set_thread_archived, delete_thread

Archive/restore or permanently delete a thread.

respond_to_approval, respond_to_user_input, dismiss_user_input

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 check

Tests 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 tools
create_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
commandIdNo
modelSelectionNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_threadB
Destructive

Request interruption of a peer thread's current turn in this project. History remains available for a follow-up.

ParametersJSON Schema
NameRequiredDescriptionDefault
threadIdYes
commandIdNo

TDQS

B3.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_threadsB
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
beforeThreadIdNo

TDQS

B3.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_threadA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
threadIdYes
turnLimitNo
beforeCursorNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYes
threadIdYes
commandIdNo
replyToSourceNoInclude instructions to reply to your source thread. Defaults true. Set false when an external controller watches completion instead.
modelSelectionNo

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_settledA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
settledYes
threadIdYes
commandIdNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines5/5

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_threadsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetsYes
timeoutSecondsNo

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 7 tool updatesv0.1.3
    • First observedcreate_thread
    • First observedinterrupt_thread
    • First observedlist_threads
    • First observedread_thread
    • First observedsend_message_to_thread
    • First observedset_thread_settled
    • First observedwait_threads

TDQS

A4/5.0

Scored across 7 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

7 tools is well-scoped for peer thread management; each tool covers a necessary operation without redundancy.

Completeness4/5

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

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers