t3-code-mcp
Click on "Install 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-mcpWhat threads are open in that project?"
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-mcp
Use GPTVoice tool calls to work with T3 Code hands-free while on the go, especially from a phone. The goal is to ask what an agent is doing, give it a task, hear the result, and respond when it needs input without opening the T3 interface.
This repository provides the MCP gateway for that workflow. GPTVoice handles listening, conversation, tool calls, and spoken responses. The gateway connects those tool calls to one configured T3 Code environment, where projects, threads, agent sessions, workspaces, and execution live.
flowchart LR
User[You on your phone] <-->|Voice| Voice[GPTVoice]
Voice <-->|MCP tool calls through a reachable endpoint or tunnel| Gateway[t3-code-mcp]
Gateway <-->|Authenticated HTTP| T3[T3 Code and its coding agents]The intended voice workflow
What you say | Tools the voice client uses |
“Find my website project.” |
|
“What threads are open in that project?” |
|
“Show snoozed / settled threads.” |
|
“How is the login fix going?” |
|
“Start a thread in that project and investigate the failing tests.” |
|
“Any update?” |
|
“What does it need from me?” |
|
“Approve that request.” |
|
“Stop that thread.” |
|
“Follow up and ask it to run the tests.” |
|
“Archive that thread.” |
|
The client should resolve project and thread names to IDs, keep those IDs and returned run handles in conversation context, and speak short summaries. It should ask for clarification when a name or action is ambiguous. These are client responsibilities; the gateway returns structured results and does not generate speech or manage conversation context.
A task can keep running in T3 after the phone disconnects. To check it later, the client calls the same gateway with the saved runId. If that handle is unavailable, it can still find the thread and read its latest state and messages. The gateway has no run-list tool.
Related MCP server: MCP Project Management Server
Find and check on existing work
t3_projects_list accepts an optional query matching a case-insensitive substring of the project title, workspace path, or ID. t3_threads_list accepts projectId, a query matching title, branch, or ID, and a status. Filters combine and apply before cursor pagination.
Thread status | Meaning in this gateway |
| Unarchived work that is neither effectively snoozed nor explicitly settled. Includes pinned threads, running work, and idle threads. |
| A future snooze time, with no pending approval/input, new failure, or completion since snoozing that would wake it early. Snoozing does not stop execution. |
| T3's explicit settled override, subject to activity blockers and pin/snooze precedence. A completed turn alone does not settle a thread. |
| Threads with an archive timestamp. This explicit filter includes archives even when |
| No lifecycle filter; archives remain hidden unless |
The gateway uses the lifecycle fields exposed by T3. The T3 UI also derives settlement from client preferences, inactivity, and linked PR state; those inputs are not available to these tools, so the settled/open lists can differ from the UI's automatic classification. Older servers with no lifecycle fields show unarchived threads as open. This behavior follows the server-backed portion of T3's threadSettled.ts and sidebar partitioning, inspected at source revision 4b8388773.
Thread summaries include status, the raw settlement override, snooze time, pin timestamp, session status, latest turn, pending flags, actionable-plan flag, and background liveness (working or monitoring when T3 provides it). t3_thread_get combines the full thread with these shell fields and its latest response. Use t3_thread_messages for more history.
To start work, create a thread if needed and send a message. To continue existing work, send another message to that thread once it is idle. Creating a thread does not itself start a turn. Runtime mode follows the existing tool defaults; request approval-required explicitly when creating a thread if that is the intended T3 permission mode.
t3_thread_interrupt works on threads started in T3's UI or by another client, without requiring a gateway runId. Read the thread and supply threadId, expectedTurnId (the observed latestTurn.turnId), and an idempotencyKey. The gateway rejects a changed or finished turn before dispatch and never automatically replays an uncertain interruption. T3 currently interrupts by provider session, so a turn change after the gateway's check remains a race; the expected turn ID is not an atomic upstream condition. Poll t3_thread_get to verify the outcome. Interruption does not archive or delete the conversation.
Thread deletion, workspace deletion, checkpoint rollback, and arbitrary terminal commands are not exposed. Filtering snoozed/settled work is read-only; changing snooze or settlement is not implemented by this gateway.
What is implemented
The gateway uses T3’s authenticated HTTP orchestration API. The recorded integration target is T3 v0.0.41-nightly.20260910.1507; pin and test the version used by your deployment.
Project search and registration, thread search and lifecycle filters, thread creation, compact check-ins, and paginated messages with bounded text.
Starting agent turns, inspecting runs, polling for changes, requesting interruption by gateway run handle or observed thread turn, responding to approval or user-input requests, and archiving threads.
Connection status with environment identity, scopes, capabilities, and freshness information. Run results also report connection and freshness; other tool results include the environment ID.
A local operation journal for idempotency and reconciliation after uncertain dispatches.
Stateless Streamable HTTP at
/mcp, plus stdio for clients that launch a local process.User systemd units and a launcher for the configured OpenAI Secure MCP Tunnel deployment.
The automated tests exercise the gateway and MCP boundary. They do not establish that the complete GPTVoice phone experience works. That acceptance check still needs to be performed with the intended voice client and its tool connection.
Connect GPTVoice
Run the gateway on an always-available machine that can reach T3. Configure the voice client's MCP connection, or its tool backend, to reach the gateway. A localhost URL on the gateway machine is not reachable from a phone or a hosted tool runner; use the tunnel deployment below or another authenticated, reachable route.
For a direct Streamable HTTP connection, use /mcp and the header Authorization: Bearer <MCP_BEARER_TOKEN>. The included tunnel launcher supplies this header on the local gateway connection. Client-side connection setup depends on GPTVoice's supported tool integration; this repository does not contain a GPTVoice app, client adapter, or setup UI. Tool-call support alone does not establish compatibility with this MCP transport and authentication scheme.
For the first end-to-end check:
Start the gateway with
MCP_READ_ONLY=trueand connect the voice client.Ask it to report connection status, list projects, and summarize an existing thread. Confirm that it uses tool results from the intended environment.
Set
MCP_READ_ONLY=falseand restart when ready to exercise control tools. The T3 token also needsorchestration:operate.Ask it to create a disposable thread, start a small task, report progress, and read back the result.
Disconnect and reconnect the voice client, then inspect the same thread or saved run handle. Check interruption and pending-action responses when applicable.
Success means completing that loop by voice on the phone, with clear spoken feedback about accepted work, completion, requests for input, and connection failures.
Official OpenAI documentation
Realtime with tools: function tools, remote MCP configuration, approvals, and the event flow needed to continue a voice response after tools finish.
Getting started with the Realtime API: building speech-to-speech clients and choosing a connection transport.
MCP and Connectors: connecting remote MCP servers through the Responses API, including tool filtering and authorization.
Secure MCP Tunnel: tunnel setup, runtime credentials, workspace associations, and connecting supported OpenAI products to a private MCP server.
These describe the OpenAI integration options. The gateway itself does not call the Realtime or Responses API. GPTVoice's use of those options and the complete phone workflow must be verified in the target client.
Run the gateway
Install Node.js 20 or newer and pnpm, then build:
pnpm install
pnpm build
cp .env.example .env
chmod 600 .envEdit .env and set T3_ACCESS_TOKEN and a separate random MCP_BEARER_TOKEN. For the remote voice workflow, set MCP_TRANSPORT=http; use MCP_READ_ONLY=true for the initial connection check. Start with:
node --env-file=.env dist/cli.js serveThe CLI reads process environment variables; it does not load .env automatically. The command above uses Node's --env-file support, available in Node 20.6 and later. On earlier Node 20 releases, export the variables before starting the CLI.
The default HTTP address is http://127.0.0.1:8787/mcp. /healthz reports that the gateway HTTP server is alive; use t3_connection_status to check T3 connectivity. For a local MCP host that launches a process, leave MCP_TRANSPORT unset or set it to stdio.
Variable | Purpose and default |
| T3 HTTP address; |
| Required T3 credential, kept on the gateway server |
|
|
| Required to serve authenticated |
| Reject mutations when |
| HTTP listener; |
| Optional expected environment ID for identity checks |
| Optional fallback label when discovery is unavailable |
| Operation journal directory; |
| Freshness threshold; |
Run and retry behavior
Mutation tools require an idempotencyKey. Generate a new key for each intended action, and reuse the same key and input when retrying that action. Reusing a key with different input fails. The journal stores the key, payload hash, command ID, operation handle, and reconciliation fields. It does not store the original prompt or credential fields.
A mutation can return accepted, rejected, or uncertain. Accepted means T3 accepted command intent, not that the task finished. An uncertain result must not trigger a new turn with a fresh key: the original may already be running. The gateway reconciles available T3 state and does not automatically replay mutations.
Preserve T3_MCP_DATA_DIR across gateway restarts. Run one gateway process per journal directory; the JSON journal is not a shared database for multiple active gateway processes. Reconnecting MCP clients use that same gateway and journal.
t3_run_wait polls for a relevant change, with a tool timeout parameter of 1–30 seconds. It can return before completion, and a T3 request can extend the elapsed wait. Timing out or losing the client connection does not cancel the T3 run. The client must call again for further updates; there are no push notifications or background spoken alerts.
Current limits
Busy threads reject new turns; queueing and steering are not implemented. Pending-action details are inferred from T3 activity records and may include historical entries; the pending flags and available request IDs need to be considered together. The gateway does not provide a separate human-confirmation mechanism for approval responses.
Run inspection relies on the journaled message/turn IDs and T3's latest-turn projection. Status for older runs or runs whose turn ID is not yet known can be incomplete. A provider-owned turn ID is not currently exposed.
There are no terminal tools, managed command jobs, direct file/Git inspection tools, MCP OAuth server, or multi-environment routing. The HTTP endpoint uses a static bearer token; use a trusted network, tunnel, or HTTPS reverse proxy for remote access. The gateway does not read T3's database, manipulate project files locally, or create provider sessions outside T3.
Auto-start on Linux
The included user systemd units start the gateway and OpenAI Secure MCP Tunnel, restart after unexpected exits, and bind local listeners to loopback. These are deployment-specific files: review the absolute paths in both services and the launcher, the T3 environment ID in the environment example, and the tunnel ID in deploy/systemd/t3-code-mcp-tunnel.sh before using them on another host. The tunnel client must already be installed at the launcher's configured path.
The launcher derives the Bearer header from MCP_BEARER_TOKEN and waits for gateway health before starting tunnel discovery. Credentials are read from ~/.config/t3-code-mcp.env.
After building, install the units:
install -d -m 700 "$HOME/.config/systemd/user"
test -e "$HOME/.config/t3-code-mcp.env" || install -m 600 deploy/systemd/t3-code-mcp.env.example "$HOME/.config/t3-code-mcp.env"
install -m 644 deploy/systemd/t3-code-mcp.service "$HOME/.config/systemd/user/t3-code-mcp.service"
install -m 644 deploy/systemd/t3-code-mcp-tunnel.service "$HOME/.config/systemd/user/t3-code-mcp-tunnel.service"
systemctl --user daemon-reload
systemctl --user enable t3-code-mcp.service t3-code-mcp-tunnel.serviceSet T3_ACCESS_TOKEN, MCP_BEARER_TOKEN, and the tunnel runtime CONTROL_PLANE_API_KEY in the environment file, then start and verify:
systemctl --user start t3-code-mcp.service t3-code-mcp-tunnel.service
systemctl --user status t3-code-mcp.service t3-code-mcp-tunnel.service
curl -fsS http://127.0.0.1:8787/healthz
curl -fsS http://127.0.0.1:8080/readyzThe deployment example starts read-only. Restart the gateway after changing that setting. For user services to remain available after logout and start at boot without a login, the host also needs user lingering enabled.
Development and verification
pnpm build
pnpm test
pnpm typecheck:testThe default suite uses disposable local T3 fakes and no real credentials. It covers the HTTP boundary, gateway operations, journal recovery and idempotency, MCP schemas and errors, HTTP authentication, stateless clients, body limits, message truncation, stale state, and uncertain dispatch reconciliation.
For a read-only connection diagnostic:
node --env-file=.env dist/cli.js status
node --env-file=.env dist/cli.js spikespike also lists up to five projects. Its optional mutation path requires T3_SPIKE_ENABLE_MUTATIONS=true, T3_SPIKE_CONFIRM=I_UNDERSTAND, T3_SPIKE_PROJECT_ID, and T3_SPIKE_PROMPT. Optional T3_SPIKE_THREAD_TITLE and T3_SPIKE_IDEMPOTENCY_KEY customize the thread title and retry-key prefix. This path creates a thread and submits a prompt; it does not archive the thread afterward.
The opt-in live test creates a disposable thread, asks the configured provider to run a small check without editing files, reads the journal through a second gateway instance, observes the run, and attempts to archive the thread. It currently selects instanceId=codex_openai and model=gpt-5.3-codex-spark, which must exist in the target T3 environment:
T3_LIVE_ACCESS_TOKEN='server-side-t3-token' \
T3_LIVE_PROJECT_ID='remote-project-id' \
pnpm test:liveSet T3_LIVE_HTTP_BASE_URL and T3_LIVE_ENVIRONMENT_ID for another environment. If no project ID is supplied, the test uses the first listed project. test:live sets T3_LIVE_TESTS=1; the test still skips without a token. This verifies the T3 integration, while the phone acceptance workflow above verifies the product goal.
Available Tools
15 toolst3_connection_statusT3 connection statusARead-only
Inspect the configured T3 environment, connection health, freshness, capabilities, and scopes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| t3Scopes | Yes | |
| environment | Yes | |
| lastObservedAt | Yes | |
| stateFreshness | Yes | |
| connectionStatus | Yes | |
| gatewayOperations | Yes | |
| permittedOperations | Yes | |
| supportedCapabilities | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description aligns with 'Inspect'. It adds value beyond the annotations by specifying what is inspected (health, freshness, capabilities, scopes), which is useful operational context. It doesn't discuss failure modes or authorization, but for a zero-parameter read-only check this is adequate.
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, well-structured sentence that front-loads the action ('Inspect') and then enumerates the scope. Every word contributes meaning, with 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?
Given that the tool has zero parameters, readOnly annotations, and an output schema, the description sufficiently covers what the agent needs to know. It doesn't need to explain return values because the output schema handles that. For a simple health-check tool, the description is complete enough to invoke 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?
The tool has no parameters, so there is no schema semantics to elaborate. Per the rubric, a zero-parameter tool receives a baseline score of 4. The description naturally has nothing to add about 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?
The description uses the specific verb 'Inspect' and clearly enumerates the target (configured T3 environment) and the specific aspects (connection health, freshness, capabilities, scopes). This distinguishes it from the sibling tools, none of which focus on connection health or environment inspection.
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 verb 'Inspect' implies a read-only status-checking use case, but the description does not explicitly state when to use this tool versus others, nor does it provide exclusions or alternatives. Since no sibling tool serves the same status-inspection purpose, the guidance is minimal and left largely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
t3_pending_action_respondRespond to a T3 pending actionA
Respond to a T3 approval or user-input request using its stable requestId. The gateway forwards the supplied response and does not independently verify human confirmation.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| answers | No | ||
| decision | No | ||
| threadId | Yes | ||
| requestId | Yes | ||
| idempotencyKey | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| status | Yes | |
| commandId | Yes | |
| t3Sequence | No | |
| operationId | Yes | |
| environmentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The sentence 'The gateway forwards the supplied response and does not independently verify human confirmation' adds meaningful behavioral context beyond the annotations, warning agents that the tool is an unchecked forwarding mechanism. Annotations already indicate mutation (readOnlyHint=false) and non-destructiveness, and the description complements them without contradiction.
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, with the core purpose front-loaded and the behavioral caveat kept separate and brief. There is no filler or redundant restatement of the tool name.
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 6-parameter tool with nested objects and an idempotencyKey, the description omits necessary invocation details, particularly how kind selects between decision and answers. The presence of an output schema helps but does not compensate for the missing request-payload semantics.
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 undocumented parameters, but it only clarifies requestId and kind in broad terms. The important relationship between 'kind' and the payload (decision for approval vs answers for user_input) is not addressed, and idempotencyKey/threadId receive no explanation.
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?
Description clearly states the verb 'Respond' and the resource ('T3 approval or user-input request'), and identifies the stable requestId as the addressing mechanism. This is specific enough to distinguish it from sibling tools like t3_pending_actions_list or t3_run_interrupt.
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 conveys clear context: use this tool to respond to pending approval or user-input requests, not for other thread operations. It does not explicitly name alternatives or when-not-to-use cases, but the purpose is clear enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
t3_pending_actions_listList pending T3 actionsBRead-only
Surface pending approval and user-input flags, plus stable action details when the T3 projection exposes them.
| Name | Required | Description | Default |
|---|---|---|---|
| threadId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| actions | Yes | |
| threadId | Yes | |
| environmentId | Yes | |
| detailsAvailable | Yes | |
| hasPendingApprovals | Yes | |
| hasPendingUserInput | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds context by specifying what is surfaced: pending approval and user-input flags, plus stable action details when the projection exposes them. This goes beyond the annotation by clarifying the nature of the data returned. It does not contradict annotations and provides useful behavioral context.
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 sentence with no fluff. It front-loads the core action and then elaborates with specific details. Every word earns its place, making it concise and well-structured.
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 the low complexity (one parameter, read-only) and the presence of an output schema, the description covers the essential purpose. However, it lacks contextual details such as when to use this tool in a workflow, what the response format looks like (though output schema partially covers this), or any edge cases. It is minimally adequate but leaves some 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?
The schema has zero description coverage for threadId, and the tool description does not explain the parameter's meaning or how it is used. The agent must infer that threadId identifies the thread whose pending actions are listed. This is a significant gap since the description fails to compensate for the missing schema documentation.
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 the resource ('pending approval and user-input flags') and the action ('surface'), which clearly conveys listing pending actions for a thread. It distinguishes from siblings like t3_pending_action_respond by implying a read-only listing rather than an action. The verb 'surface' is slightly less direct than 'list', but the intent is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives. It does not mention that it complements t3_pending_action_respond or when it should be called (e.g., before responding). The context is only implicit from the name and description; no explicit exclusions or alternative routing is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
t3_project_createRegister a T3 projectA
Register a remote workspace as a T3 project. Set createWorkspaceRootIfMissing to request creation of a missing directory. This does not clone a repository. Requires orchestration control scope and an idempotencyKey.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| workspaceRoot | Yes | ||
| idempotencyKey | Yes | ||
| defaultModelSelection | No | ||
| createWorkspaceRootIfMissing | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| status | Yes | |
| commandId | Yes | |
| projectId | Yes | |
| t3Sequence | No | |
| operationId | Yes | |
| environmentId | Yes | |
| workspaceRoot | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a mutating, non-destructive operation, so the description does not need to restate those. It adds useful behavioral context: a remote workspace is registered rather than cloned, missing directories can be created on request, and an idempotency key is required. There is no contradiction with the 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?
Three sentences, each earning its place: the core action, an optional behavior, and a concise caveat plus prerequisites. Information is front-loaded and there is no filler or repetition of schema content.
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 presence of an output schema reduces the need to describe return values, and key caveats like non-cloning and required scope are included. However, with five parameters and zero schema-level descriptions, leaving the semantics of title, workspaceRoot, and defaultModelSelection implicit makes the definition merely adequate rather than complete.
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 carries the full burden for parameter meaning. It only explains createWorkspaceRootIfMissing and mentions idempotencyKey as a requirement; title, workspaceRoot, and defaultModelSelection are left undocumented, leaving required parameters largely inferred from their names.
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 opens with a specific verb and resource: 'Register a remote workspace as a T3 project.' It clearly distinguishes this registration action from sibling read/list tools such as t3_projects_list, and the explicit 'does not clone a repository' caveat removes ambiguity about what the tool does not do.
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 states prerequisites (orchestration control scope, idempotencyKey) and explains the behavior of createWorkspaceRootIfMissing, but it does not explicitly say when to choose this tool over an alternative. The 'does not clone a repository' note is helpful exclusionary guidance but is not a full usage policy.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
t3_projects_listList T3 projectsARead-only
Find projects by case-insensitive title, workspace path, or ID substring. Filtering happens before pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| cursor | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| environmentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false), and the description adds behavioral detail beyond them: matching is case-insensitive, and filtering happens before pagination. The filter-before-pagination note is genuinely useful because it tells the agent that limit and cursor operate on the filtered result set rather than the raw project collection. No contradiction with 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?
Two sentences with zero filler. The core search semantics are front-loaded in the first sentence, and the behavioral note about filter-before-pagination stands as a distinct second sentence. Every word 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?
With an output schema present and annotations covering the read-only safety profile, the description covers the main decision-relevant facts: search criteria, case sensitivity, and the filter/pagination ordering. Minor gaps remain: the behavior when 'query' is omitted (returns all projects versus error) is unspecified, and the exact meaning of the 'cursor' parameter is left to its numeric regex pattern. These are small but not fully resolved.
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 carries the burden for parameter meaning. It compensates well for the 'query' parameter by defining what it matches (title, workspace path, or ID substring, case-insensitive), which the bare string type in the schema leaves completely unspecified. However, 'limit' and 'cursor' receive no direct explanation; their semantics must be inferred from the default/maximum/minimum constraints, the regex pattern, and the indirect pagination hint.
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 ('Find') and resource ('projects'), and goes well beyond the title by specifying the matching semantics: case-insensitive query against title, workspace path, or ID substring. This active search criteria distinguishes the tool from sibling t3_threads_list (threads, not projects) and t3_project_create (mutation, not enumeration), so an agent can tell them apart without inspecting schemas.
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 usage context is implied rather than stated: an agent can infer this tool is for locating projects by a partial title, path, or ID. However, there is no explicit when-to-use guidance, no mention of alternatives or exclusions, and no routing to siblings such as t3_project_create for creating projects or t3_threads_list for thread-related queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
t3_run_getGet T3 run statusBRead-only
Reconcile a gateway run handle against T3 state. A disconnected result is not evidence that the run failed.
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| runId | Yes | |
| t3TurnId | Yes | |
| threadId | Yes | |
| timedOut | No | |
| projectId | Yes | |
| runStatus | Yes | |
| operationId | Yes | |
| environmentId | Yes | |
| lastObservedAt | Yes | |
| latestResponse | Yes | |
| pendingActions | Yes | |
| providerTurnId | Yes | |
| stateFreshness | Yes | |
| connectionStatus | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the tool as read-only, so the description's key contribution is the non-obvious caveat: 'A disconnected result is not evidence that the run failed.' This adds useful interpretive context beyond the structured metadata.
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 very short and both sentences carry distinct information: what the tool does and a critical interpretation warning. The use of jargon like 'gateway run handle' and 'T3 state' slightly reduces clarity but not conciseness.
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 read-only annotation, output schema, and disconnected-result caveat cover safety and return interpretation reasonably well. What is missing is guidance on how runId relates to a gateway run handle and how this tool differs from t3_run_wait, which an agent would need for confident tool selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage alert the only parameter is runId, the phrase 'gateway run handle' adds some semantic color, implying that runId is such a handle. However, the description never explicitly maps runId to that handle or explains how to obtain it, so it only partially compensates for the absent parameter docs.
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 title states the resource ('T3 run status') and the first sentence gives a specific action: reconciling a gateway run handle against T3 state. It is clear enough to identify this as a status-lookup tool, though it does not explicitly distinguish itself from sibling tools like t3_run_wait.
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 explicit guidance is given for when to use this tool versus alternatives such as t3_run_wait or t3_run_interrupt. The disconnected-result caveat is behavioral guidance, not usage routing; the agent is left to infer when this status check is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
t3_run_interruptInterrupt a T3 runA
Request interruption of one accepted T3 run. The interruption itself is journaled and is never replayed automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | ||
| idempotencyKey | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| status | Yes | |
| commandId | Yes | |
| t3Sequence | No | |
| operationId | Yes | |
| environmentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable non-obvious behavior: the interruption is 'journaled' and 'never replayed automatically', which is not captured by the annotations. This helps an agent understand side effects and retry semantics beyond the basic readOnlyHint/destructiveHint flags.
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 two short sentences with no filler. The core action is front-loaded, and the additional journaling/replay detail earns its place by communicating an important behavioral nuance.
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 has only two simple parameters and an output schema, so the description does not need to explain return values. However, it leaves parameter semantics and tool-selection guidance underspecified, which an agent needs when deciding between t3_run_interrupt and t3_thread_interrupt.
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%, and the description does not explain runId or idempotencyKey. The phrase 'one accepted T3 run' hints that runId identifies the target, but the idempotencyKey's role, uniqueness, or replay protection is not addressed.
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 action ('Request interruption') on a specific resource ('one accepted T3 run'), making the tool's purpose immediately clear. The term 'T3 run' distinguishes it from sibling tools like t3_thread_interrupt, and 'accepted' adds a meaningful scoping constraint.
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 no explicit guidance on when to use this tool instead of alternatives such as t3_thread_interrupt. It implies the target must be an accepted run, but does not explain what to do for non-accepted runs or when a different interrupt/wait tool would be appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
t3_run_waitWait for a T3 run changeARead-only
Poll for a relevant run change for a bounded interval. A timeout only means no change was observed; it does not cancel the run.
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | ||
| timeoutSeconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| runId | Yes | |
| t3TurnId | Yes | |
| threadId | Yes | |
| timedOut | No | |
| projectId | Yes | |
| runStatus | Yes | |
| operationId | Yes | |
| environmentId | Yes | |
| lastObservedAt | Yes | |
| latestResponse | Yes | |
| pendingActions | Yes | |
| providerTurnId | Yes | |
| stateFreshness | Yes | |
| connectionStatus | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations say readOnlyHint=true, and the description clarifies that the tool is a non-mutating poll. It adds important context: a timeout is not an error and does not cancel the run. This aligns with annotations. Only minor gap is that it doesn't specify what happens on run completion vs. no change, but the timeout clarification is valuable.
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 two sentences, concise and front-loaded with the primary action. It adds the key behavioral nuance about timeout without redundancy. Could include parameter hints but the brevity is a strength.
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?
There is an output schema (though not shown in detail) which might document return values, so description doesn't need to. The tool is relatively simple with two parameters. The description covers the main purpose and timeout behavior, but misses parameter meanings (since schema coverage is 0%) and doesn't explain 'relevant run change' or how to interpret polling results. Adequate but with 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 0%, so the description must explain the parameters, but it does not. The runId is only type string with minLength, and timeoutSeconds has defaults and bounds, but the description doesn't define semantics like 'timeoutSeconds' meaning maximum wait time or what 'runId' refers to. The schema provides structural constraints but not meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear purpose: 'Poll for a relevant run change for a bounded interval.' It identifies the resource (run) and action (wait/poll), which is specific enough. However, it does not clarify what constitutes a 'relevant' run change or how it differs from related tools like t3_run_get, which might be used to check status instead of waiting.
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 usage: when you need to wait for a run change with a timeout. It does not explicitly state when NOT to use it, nor does it mention alternatives like t3_run_get for immediate status checks. The timeout semantics are partially explained (does not cancel run), but there is no guidance on choosing between this and polling manually.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
t3_thread_archiveArchive a T3 threadB
Archive a thread without deleting its remote workspace files.
| Name | Required | Description | Default |
|---|---|---|---|
| threadId | Yes | ||
| idempotencyKey | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| status | Yes | |
| commandId | Yes | |
| t3Sequence | No | |
| operationId | Yes | |
| environmentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation as non-read-only and non-destructive; the description adds the specific non-destructive detail about remote workspace files. However, it does not disclose what archiving does to the thread overall (e.g., whether it becomes unmodifiable or hidden) or the role of the idempotencyKey.
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 sentence with the main action front-loaded and a concise, relevant qualifier. There is no redundancy or unnecessary 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?
An output schema exists, so return values do not need to be described. However, the description lacks key contextual details such as the meaning of 'archive' in this system and the required idempotencyKey behavior, making the definition serviceable but not fully complete for a mutating operation.
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%, and the description does not explain either parameter. While threadId is inferable from its name and the tool's purpose, idempotencyKey is a required parameter whose semantics are entirely unexplained, leaving an agent without enough information to supply it correctly.
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 'Archive' with a clear resource 'thread' and adds a useful qualifier about preserving remote workspace files. It does not explicitly distinguish from sibling tools, but 'archive' is distinct from interrupt/get/send operations, making the purpose clear.
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 a usage scenario—'archive without deleting files'—but gives no explicit guidance on when to choose this tool over alternatives like t3_thread_interrupt or t3_thread_get. There is no mention of exclusions or prerequisite conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
t3_thread_createCreate a T3 threadA
Create a thread in an existing T3 project. Supply modelSelection when the project has no default. The returned branch and worktree reflect the request; check the mutation status for acceptance.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| branch | No | ||
| projectId | Yes | ||
| runtimeMode | No | ||
| worktreePath | No | ||
| idempotencyKey | Yes | ||
| modelSelection | No | ||
| interactionMode | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| status | Yes | |
| threadId | Yes | |
| commandId | Yes | |
| projectId | Yes | |
| workspace | Yes | |
| t3Sequence | No | |
| operationId | Yes | |
| environmentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (readOnlyHint false, destructiveHint false), so the description carries the burden. It discloses that the operation may not be immediately accepted ('check the mutation status for acceptance') and that the returned branch and worktree reflect the request, indicating asynchronous behavior. This adds value beyond annotations, though it doesn't detail failure modes or retry logic.
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, each adding value. The purpose is front-loaded, the conditional for modelSelection is precise, and the behavioral note about mutation status is concise. No filler or redundancy. Excellent structure.
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?
Despite having an output schema, the description omits explanations for most parameters, prerequisites (e.g., project must exist), and the meaning of runtimeMode and interactionMode. With 8 parameters, nested objects, and low schema coverage, the description is not complete enough for an agent to use it correctly without additional context.
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 all 8 parameters. It only explains when to supply modelSelection (when the project has no default). It does not clarify title, projectId, idempotencyKey, branch, worktreePath, runtimeMode, or interactionMode. The hint about branch/worktree is vague. This is insufficient given the parameter count and complexity.
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 clearly states the verb 'create', the resource 'thread', and the context 'in an existing T3 project'. This distinguishes it from sibling tools like t3_thread_get or t3_thread_send, which operate on existing threads. The mention of modelSelection also hints at a specific condition, adding clarity.
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 when to use this tool (to create a thread) and provides a parameter condition ('Supply modelSelection when the project has no default'), but it does not explicitly name alternatives or state exclusions. It doesn't say 'use this instead of X' or when not to use it. The context is clear but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
t3_thread_getGet a T3 threadBRead-only
Return a compact thread summary, latest response, active run, pending flags, and workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| threadId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| thread | Yes | |
| environmentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already indicates the operation is safe and non-mutating. The description adds the useful behavioral detail that the result is a 'compact' summary rather than a full thread with all messages, but it does not disclose potential null states, pagination, or other edge behaviors.
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 tightly packed sentence, starts with the action verb 'Return', and lists exactly what the caller gets. There is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only getter with an output schema present, the description is largely sufficient: it identifies the input indirectly and enumerates the returned data. However, it lacks any pointer on how this summary tool relates to the message/run/pending-action siblings, which would improve completeness.
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 single threadId parameter has no schema description and schema coverage is 0%. The description does not mention threadId or clarify its meaning/format beyond what the tool name implies, so it fails to compensate for the lack of parameter documentation.
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 names a specific verb and resource: it returns a compact thread summary plus specific components (latest response, active run, pending flags, workspace). This clearly communicates what the tool does, though it does not explicitly contrast itself with siblings like t3_thread_messages or t3_run_get.
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 about when to use this tool versus alternatives such as t3_thread_messages, t3_run_get, or t3_pending_actions_list. The intended context is only implicit from the listed return fields.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
t3_thread_interruptInterrupt work in an existing T3 threadA
Request stopping the active turn in a thread, including one started outside this gateway. Read the thread first and supply latestTurn.turnId as expectedTurnId. Stale observations are rejected before dispatch, but T3 interrupts by session and cannot guarantee atomic turn targeting. This does not archive or delete the thread; poll thread_get to confirm it stopped.
| Name | Required | Description | Default |
|---|---|---|---|
| threadId | Yes | ||
| expectedTurnId | Yes | ||
| idempotencyKey | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| status | Yes | |
| commandId | Yes | |
| t3Sequence | No | |
| operationId | Yes | |
| environmentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing stale observation rejection, the lack of atomic turn targeting due to session-based interrupts, and the fact that the action does not archive or delete the thread. It also tells the agent how to confirm the result.
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 sentences cover purpose, prerequisite, failure behavior, guarantee caveat, and confirmation step without filler. The essential instruction is front-loaded and every sentence adds value.
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 an output schema available)Skip? Need complete. Let's finish.The description covers prerequisites, stale rejection, atomicity limitations, non-destructive scope, and confirmation method. An agent has enough context to decide whether to call this tool and how to invoke it correctly. The only small gap is semantic detail for idempotencyKey, but the overall definition is highly complete for this operation type.Need final answer JSON. Need avoid cutting off. Let's produce final complete JSON. But before final, let's revisit all dimensions and ensure robust justification. We can include full
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?
With 0% schema description coverage, the description compensates for expectedTurnId by tying it to 'latestTurn.turnId' from a prior thread read. threadId is reasonably inferable from the name, but idempotencyKey is left with only its name and schema constraints.
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 action on a specific resource: 'Request stopping the active turn in a thread.' It adds scope by covering turns 'started outside this gateway' and explicitly disambiguates from archive/delete behavior, so an agent can distinguish it from closely related sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear precondition and procedure: 'Read the thread first and supply latestTurn.turnId as expectedTurnId,' plus a follow-up check through thread_get. It does not explicitly name alternative tools or state when not to use it, but the operational guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
t3_thread_messagesRead T3 thread messagesBRead-only
Read paginated thread history. Message text is bounded by maxChars and reports truncation explicitly.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| maxChars | No | ||
| threadId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| environmentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds valuable behavioral context: message text is bounded by maxChars and truncation is explicitly reported. This goes beyond the annotations and schema.
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 concise and front-loaded, with the core action 'Read paginated thread history' first. The second sentence adds a relevant behavioral detail without fluff, though it is quite brief given the number of parameters involved.
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 output schema covers return values and the readOnlyHint covers safety, so the description does not need to repeat those. However, missing guidance on pagination semantics (limit/cursor) and differentiation from sibling tools leaves the description only minimally complete for correct invocation.
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 should compensate, but it only meaningfully addresses maxChars. Parameters like limit, cursor, and threadId are left undocumented; their semantics must be inferred from names and schema constraints alone.
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: 'Read paginated thread history.' This is clear and distinct from simply 'get thread,' though it does not explicitly name sibling tools like t3_thread_get or t3_threads_list. The pagination qualifier adds useful scope.
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 or when-not-to-use guidance is provided. The description does not say how this relates to sibling tools such as t3_thread_get or t3_threads_list, so an agent must infer when paginated history is the appropriate choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
t3_thread_sendSend a T3 thread messageA
Send a new or follow-up message to an idle existing thread, start one T3 agent turn, and return after command intent is accepted. Busy threads are rejected; queueing and steering are not enabled. Never reuse an idempotencyKey for different input.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | ||
| threadId | Yes | ||
| titleSeed | No | ||
| runtimeMode | No | ||
| idempotencyKey | Yes | ||
| modelSelection | No | ||
| interactionMode | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| runId | Yes | |
| reason | No | |
| status | Yes | |
| t3TurnId | Yes | |
| threadId | Yes | |
| commandId | Yes | |
| messageId | Yes | |
| projectId | Yes | |
| nextAction | Yes | |
| t3Sequence | No | |
| operationId | Yes | |
| environmentId | Yes | |
| providerTurnId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate readOnly=false and destructive=false. The description adds substantial behavioral context: the call triggers exactly one agent turn, returns after command intent is accepted rather than after completion, rejects busy threads, and has no queueing or steering. The idempotencyKey guidance is also behaviorally relevant. No contradiction with 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?
Three sentences, no filler. The core action and return behavior are front-loaded, followed by the busy-thread constraint and the idempotency warning. Every sentence adds value.
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 required invocation parameters (threadId, message, idempotencyKey) are adequately covered, and an output schema exists so return values need not be described. However, with 7 parameters including nested objects and enums, the optional configuration parameters (runtimeMode, modelSelection, interactionMode, titleSeed) are undocumented, leaving an agent to guess their effect on agent behavior.
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. It only clarifies idempotencyKey ('Never reuse an idempotencyKey for different input') and leaves threadId/message to be inferred from context. The optional parameters runtimeMode, interactionMode, modelSelection, and titleSeed receive no semantic explanation, relying solely on names and enums.
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: 'Send a new or follow-up message to an idle existing thread'. It also states what the tool does beyond sending — 'start one T3 agent turn, and return after command intent is accepted' — which separates it from sibling tools like t3_thread_create or t3_thread_messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear when-to-use context (idle existing threads) and an explicit when-not condition ('Busy threads are rejected'). It also warns against reusing idempotencyKey. However, it does not name any sibling alternatives, such as using t3_thread_create for new threads or t3_run_wait for completion, 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.
t3_threads_listList T3 threadsARead-only
Find threads by project and case-insensitive title, branch, or ID substring. status filters server-backed open, snoozed, settled, or archived state; UI-local inactivity/PR auto-settle rules are unavailable. Open includes pinned work and is not synonymous with running. Without a specific status, includeArchived controls archive visibility.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| cursor | No | ||
| status | No | ||
| projectId | No | ||
| includeArchived | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| environmentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description reveals important behavioral nuances: status values are server-backed, UI-local auto-settle rules are unavailable, open is not synonymous with running, and archive visibility depends on includeArchived. This materially changes how results should be interpreted.
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 dense sentences with no filler. The core search behavior is front-loaded, followed by the most decision-relevant status nuances and the archive-visibility rule. 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?
The description is highly complete for a read-only list tool, covering search semantics, status behavior, and archive visibility. It omits pagination behavior involving limit and cursor, but the output schema and parameter defaults reduce the risk of incorrect invocation.
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?
With 0% schema description coverage, the description explains the meaning of query (case-insensitive substring), status (server-backed enum values), includeArchived (visibility control), and projectId (filtering by project). It does not explain limit or cursor, though these are conventional pagination fields inferable from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Find') and resource ('threads') and specifies the search dimensions: project and case-insensitive title, branch, or ID substring. It clearly differentiates the list operation from sibling tools like t3_thread_get or t3_thread_archive.
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 practical guidance for when to rely on status filters and how includeArchived behaves when no status is supplied. It does not explicitly compare against alternatives, but the semantics are specific enough that an agent can use the tool correctly.
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.
15 tool updates
v0.1.0- First observed
t3_connection_status - First observed
t3_pending_action_respond - First observed
t3_pending_actions_list - First observed
t3_project_create - First observed
t3_projects_list - First observed
t3_run_get - First observed
t3_run_interrupt - First observed
t3_run_wait - First observed
t3_thread_archive - First observed
t3_thread_create - First observed
t3_thread_get - First observed
t3_thread_interrupt - First observed
t3_thread_messages - First observed
t3_thread_send - First observed
t3_threads_list
TDQS
Scored across 15 tools
Most tools target a distinct resource and action, and the t3_run_* and t3_thread_* groups are largely well separated. The closest ambiguities are t3_run_interrupt vs t3_thread_interrupt and t3_thread_get vs t3_thread_messages, but the descriptions establish clear boundaries.
All tools share the t3_ prefix and snake_case, with a mostly predictable resource_action pattern. Minor inconsistencies exist: plural forms like projects_list and pending_actions_list mix with singular forms, and connection_status and thread_messages are noun-like names rather than clear verb-first operations.
At 15 tools, the surface is at the high end but still justifiable given projects, threads, runs, pending actions, and connection inspection each have separate workflows. A few operations could arguably be consolidated, but the set is not bloated enough to be a real usability problem.
The main workflow is covered end-to-end: project creation, thread creation and messaging, run waiting and interruption, and pending-action response are all present. Gaps remain around explicit project/thread updates or deletion, though thread archive and thread send act as partial lifecycle operations.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Operate hilos project rooms, Docs, Tasks, messages, memory, and coding-agent review workflows.
Manage projects, tasks, time tracking, and team collaboration through natural language.
Project registry, behavioral specs, and engineering threads for AI coding agent workflows.
- TaskfolkOAuthai.taskfolk
Project management for teams and their AI agents.
Related MCP Servers
- AlicenseAqualityDmaintenanceManage voice AI agents from Claude Code, Cursor, VS Code, or any MCP-compatible assistant.3103MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage project analysis, code metrics, documentation, Git operations, code quality, and file organization through natural language commands.42MIT
- AlicenseCqualityCmaintenanceEnables Claude and Claude Code to manage AACWorkflow tasks, agents, projects, squads, autopilots, and analytics through natural language.69MIT
- FlicenseNot gradedqualityBmaintenanceEnables voice control of local Claude Code sessions running in tmux, allowing users to list, read, send messages to, and manage sessions via nine MCP tools.-