t3code-mcp
This server lets an MCP client discover and drive T3 coding machines through the signed-in account.
list_environments: list account-linked machines, optionally check availabilitylist_projects: list projects and model defaults on a chosen machinelist_threads: discover threads with IDs, titles, status, filters by project/statusstart_thread: create a thread and send instructions to a coding agent (may change files/incur usage)get_thread: read recent messages, status, provider errors, and requests for inputsend_message: send follow-up instructions to an existing threadinterrupt_thread: request interruption of a current or selected turnSupports retries via preserved
operationIdand original arguments for mutations
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@t3code-mcpList my T3 environments, then show the projects on the machine I choose."
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
Give an external agent access to your T3 Code machines through MCP. Sign in to T3 Connect once, browse existing threads and their status, or start a coding thread on a linked machine and project. Read its progress, send follow-ups, or interrupt its current turn.
Runs locally over stdio. Works with existing T3 installations—no fork or server changes required.
Experimental, independent integration. Account login, discovery, project reads, and a reply-only agent launch have been verified live. Upstream changes can affect compatibility. Verification details · Authentication design
Install
You need Node.js 22+ and pnpm on Linux or macOS, a T3 Connect account, and at least one linked, reachable T3 environment. Providers and projects must already be configured in T3. Windows is not supported in this release because credential storage uses POSIX file permissions; use Linux/WSL instead.
Install the latest stable release:
pnpm add --global https://github.com/emmsixx/t3code-mcp/releases/latest/download/t3code-mcp.tgz
t3code-mcp --version
t3code-mcp login
t3code-mcp environmentsReleases include compiled JavaScript; pnpm installs the runtime dependencies. For a specific version or its checksum, see GitHub Releases. The package is distributed through GitHub, not the npm registry.
Run login for interactive terminal prompts, or let your agent handle setup: it asks for your email, sends a verification code, and asks you to reply with it in chat. If your account uses an authenticator, it asks for that code next. The resulting account session stays local; the commands return login status without tokens. SSO-only, passkey-only, and interactive CAPTCHA flows are not implemented.
If pnpm reports that its global bin directory is missing, run pnpm setup and reopen your terminal. You can also use pnpm dlx without a global install.
For source installation and development, see Contributing.
Related MCP server: hermes-dsh-bridge
Connect your agent
After global installation, add this to your MCP client's configuration:
{
"mcpServers": {
"t3code": {
"command": "t3code-mcp",
"args": ["serve"]
}
}
}For Hermes, add an entry to ~/.hermes/config.yaml:
mcp_servers:
t3code:
command: t3code-mcp
args: [serve]Merge the entry into your existing configuration, then restart or reconnect the client. Use the absolute path printed by command -v t3code-mcp if your client does not inherit your shell's PATH. The client must use the same OS user and T3_MCP_STATE_DIR as the login commands. Hermes MCP reference
Try: “List my T3 environments, then show the projects on the machine I choose.”
Or: “Show me the threads on this machine that are working or need my input.”
Let an agent set it up
Paste this into your agent:
Install the latest stable release of https://github.com/emmsixx/t3code-mcp using docs/agent-setup.md. Guide me through login by asking for my email and verification code in chat, configure MCP while preserving existing settings, and verify the connection without launching a task.
The agent setup guide covers installation, the resumable login-start / login-verify / login-status commands, client configuration, and verification.
Available tools
Tool | What it does |
| Discover account-linked machines; optionally check availability. |
| List projects and their configured model defaults on a machine. |
| Discover existing thread IDs, titles, and status; filter by project or status. |
| Create a thread and give its coding agent instructions. |
| Read current status, bounded messages/activity, provider errors, and requests for input. |
| Send follow-up instructions to an existing thread. |
| Request interruption of a selected turn. |
Launches use the project's existing workspace and can change files or incur provider usage. New threads default to approval-required; answer approvals and input requests in T3's own clients. Worktree creation and setup scripts are not supported yet.
Thread statuses include working, awaiting_input, awaiting_approval, finished, and failed. Listing covers unarchived threads, including completed turns, with 20 results per page by default. finished means the latest turn completed; read its messages to assess the result. All statuses and filters.
Use the environment/project IDs returned by the tools. Mutation tools require an operationId: preserve it and the original arguments when retrying an ambiguous result. An accepted command is not a completed task—check get_thread. Tool inputs and retries
Credentials and configuration
The bridge stores its own account credential, proof key, and operation journal in ~/.t3code-mcp. These are unencrypted files, restricted to their owner (0700 directory, 0600 state file). The journal includes submitted instructions. Keep this directory private.
T3_MCP_STATE_DIR selects a different directory. The bridge does not read existing browser cookies or T3 credentials. t3code-mcp logout ends this bridge's Clerk session and removes its local credential/key. Configuration, expiry, and lock recovery
Upgrade or uninstall
To upgrade, run:
pnpm add --global https://github.com/emmsixx/t3code-mcp/releases/latest/download/t3code-mcp.tgzRestart your MCP client after upgrading. Installed releases do not auto-update. Review the changelog before upgrading. Use t3code-mcp --version to check the installed version.
To uninstall:
t3code-mcp logout
pnpm remove --global t3code-mcpRemove the MCP configuration entry too. The operation journal remains in the state directory; delete it yourself only when outstanding operations are resolved. Previously issued environment sessions follow T3's own expiry/revocation rules.
Contributing
See CONTRIBUTING.md for development, tests, and the release process. Report bugs through GitHub Issues; see SECURITY.md for vulnerability reports.
License
MIT. See NOTICE for upstream attribution. T3 Code MCP is not affiliated with or endorsed by T3 Tools Inc. or Clerk.
Available Tools
7 toolsget_threadARead-only
Read bounded recent messages, activity, current status, provider errors and requests for human attention. Discover thread IDs with list_threads. Older turns can be paginated using beforeCursor. Reply to approvals and input in T3.
| Name | Required | Description | Default |
|---|---|---|---|
| threadId | Yes | ||
| turnLimit | No | ||
| beforeCursor | No | ||
| environmentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, and the description aligns with them by saying 'Read...'. It adds useful behavioral context beyond annotations, including the bounded nature of messages, pagination via beforeCursor, and visibility into provider errors and requests for human attention. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four short sentences, front-loaded with the core read purpose and with no filler or redundant phrases. Each sentence earns its place by adding either scope, sibling routing, pagination, or input-response context.
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 simple read-only operation and the presence of readOnlyHint and openWorldHint annotations, the description covers the main purpose, pagination, and sibling routing. However, it lacks explanation of required parameters like environmentId and threadId, and its reference to 'T3' is unexplained, leaving some gaps for an agent unfamiliar with the domain.
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 the four parameters. It mentions beforeCursor and loosely implies a limit with 'bounded recent messages', but it does not describe threadId, environmentId, or turnLimit, leaving required identifiers and the limit parameter underspecified.
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: 'Read bounded recent messages, activity, current status, provider errors and requests for human attention.' This clearly defines what the tool returns and distinguishes it from list_threads, which is explicitly named for discovering thread IDs.
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 actionable guidance: 'Discover thread IDs with list_threads' names the alternative for a related task, and 'Older turns can be paginated using beforeCursor' explains how to handle pagination. It stops short of explicit exclusions for sibling tools like send_message or interrupt_thread, so it is clear but not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
interrupt_threadADestructive
Request interruption of the current or explicitly selected turn. The target turn is recorded so a retry cannot interrupt a later turn.
| Name | Required | Description | Default |
|---|---|---|---|
| turnId | No | ||
| threadId | Yes | ||
| operationId | Yes | Unique ID for this operation. Keep this ID and all arguments unchanged when retrying, including after a timeout. | |
| environmentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as destructive and non-idempotent, and the description adds valuable behavior beyond that: interruption is a 'request', and the target turn is recorded so a retry cannot accidentally interrupt a later turn. This is a useful, non-obvious behavioral guarantee.
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 concise sentences with no filler. The first sentence states the core action and target; the second adds a crucial retry-safety detail. Both sentences earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent operation with no output schema, the description covers the most important operational details: what is interrupted, how the target is selected, and how retries behave. It omits side effects or prerequisites, but the core calling context is sufficiently clear.
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 low at 25%, and the description only partially compensates. It clarifies that the turn can be 'current' or 'explicitly selected,' which maps to the optional turnId, and it reinforces the retry behavior tied to operationId. However, environmentId and threadId are not explained in the description.
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') and a clear resource ('the current or explicitly selected turn'). This makes the tool's purpose unambiguous and immediately distinguishes it from siblings like start_thread, get_thread, and send_message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: it targets either the currently running turn or an explicitly selected turn. It does not explicitly list alternatives or exclusions, but the selection guidance and the retry caveat convey the operational context well enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_environmentsARead-only
List machines linked to the signed-in T3 account. Availability probes are optional and bounded to this page.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| checkAvailability | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the description does not need to reiterate those. It adds value by explaining availability probes are optional and bounded to the current page, which is a behavioral detail not present in annotations. This complements the safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no redundancy. The main purpose is front-loaded, and the additional probe note is directly relevant. 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?
For a simple list tool with annotations covering safety, the description is adequate but not complete. It fails to mention that limit and offset are pagination controls, and with no output schema, an agent may be unsure about return structure. The page-bounded probe detail helps, but more could be said.
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 must compensate for all parameters. It only addresses checkAvailability indirectly via 'availability probes', leaving limit and offset completely unexplained. An agent would not know their purpose or how they control pagination from the description 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 uses the specific verb 'List' with a clear resource ('machines') and scope ('linked to the signed-in T3 account'), which distinguishes it from sibling list_projects. It also adds a clarifying note about availability probes, leaving no ambiguity about what the tool does.
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 for listing machines but does not explicitly state when to choose this over alternatives like list_projects. No exclusions or alternative guidance are provided, though the note about optional availability probes gives some usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsARead-only
List projects and their model defaults on one explicitly selected environment.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| environmentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, covering the safety profile. The description adds useful context that results include model defaults and that exactly one environment is selected, going beyond annotations. However, it does not mention pagination behavior, ordering, or error handling for invalid environments, so the added behavioral context is minimal.
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 front-loaded sentence with no filler. It states the verb, resource, and scoping condition directly, and every word contributes meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool, the description provides the essential call context: one environmentId, projects with model defaults, and no mutation. The lack of output schema and pagination guidance leaves some details to inference, but the tool's basic nature and optional parameters are adequately understood from schema defaults and the generic 'list' framing.
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 documenting parameters. It maps 'explicitly selected environment' to the required environmentId parameter, which is helpful. However, limit and offset are completely unmentioned, leaving their defaults, bounds, and purpose underspecified despite the schema having no descriptions either.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and names the resource ('projects and their model defaults'), with a clear scoping qualifier ('on one explicitly selected environment'). This differentiates it from sibling tools like list_environments, which targets environments rather than projects. No ambiguity remains about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'on one explicitly selected environment' clearly communicates that this tool should be used when an environment is already chosen, and that the caller must supply an environmentId. It does not explicitly name alternatives or when-not-to-use conditions, but the context is strong enough for a read-only list operation. A small gap is that it doesn't point users to list_environments as the way to discover valid environments.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_threadsARead-only
Discover unarchived threads on one environment with IDs, titles, current status, approval/input flags and recent turn timing. Optionally filter by project or status. Newest activity first; bounded pages. Use get_thread with a returned threadId to read messages. Finished means the latest turn completed, not verified task success.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| status | No | ||
| projectId | No | ||
| environmentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with readOnlyHint=true, the description adds meaningful behavioral context: only unarchived threads are returned, results are ordered newest-activity-first, pages are bounded, and 'finished' status means the latest turn completed, not verified task success. This goes well beyond the annotation's safety signal.
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, each earning its place: scope and output fields, optional filters, ordering/pagination, a pointer to get_thread, and a status clarification. 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 5-parameter tool with no output schema, it describes the returned fields, ordering, pagination, filtering, and sibling handoff. It does not discuss error/empty-result behavior or explicit parameter names, but the essentials for correct invocation and interpretation are present.
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 compensates by explaining environmentId (one environment), projectId and status as optional filters, and pagination via 'bounded pages' and 'Newest activity first.' It does not expand every status enum value or name limit/offset explicitly, but the main parameter semantics are covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Discover unarchived threads on one environment' with the returned fields (IDs, titles, status, flags, timing). It also distinguishes itself from siblings by framing this as the listing/discovery operation, with get_thread pointed to separately for reading 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?
Provides clear context for when to use the tool (discovering threads, with optional project/status filters) and explicitly routes the agent to the sibling get_thread for reading messages. It does not enumerate exclusions for other siblings like interrupt_thread or start_thread, but the primary alternatives are addressed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_messageADestructive
Send follow-up instructions using the thread's existing model and runtime modes. May change files or incur charges. Preserve operationId and arguments for retries.
| Name | Required | Description | Default |
|---|---|---|---|
| threadId | Yes | ||
| operationId | Yes | Unique ID for this operation. Keep this ID and all arguments unchanged when retrying, including after a timeout. | |
| instructions | Yes | ||
| environmentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate mutation and destructiveness, and the description usefully adds that it may change files, incur charges, and that operationId plus arguments must be preserved for retries. These are meaningful behavioral details beyond the annotations, though the description does not deep-dive into what files might change or the failure/return behavior.
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 distinct information: what the tool does, side effects, and retry guidance. There is no redundant phrasing and the core purpose is front-loaded.
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 tool's four required parameters and lack of output schema, the description covers side effects and retry requirements, which are the most critical operational concerns. It does not describe the return value or error/timeout behavior, but for a straightforward message-sending tool this is an acceptable minor gap.
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 documentation covers only operationId, and the description mostly reinforces that instead of adding meaning for the other three required parameters. instructions is implicitly mentioned via 'instructions,' but environmentId and threadId get no meaningful elaboration despite low schema coverage, so the description does not compensate for the missing 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 uses a specific verb and resource: 'Send follow-up instructions' in an existing thread. It is clearly distinguishable from sibling tools like start_thread or get_thread by emphasizing 'the thread's existing model and runtime modes.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'follow-up instructions' and 'existing model and runtime modes' establishes that this tool is for continuing work in an already-started thread, not for listing environments or projecting new threads. It does not explicitly name alternatives or state when not to use it, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_threadADestructive
Create a thread and send instructions to its agent in the existing project workspace. May change files and incur provider charges. Defaults to approval-required. Worktree creation is not supported. Reuse operationId and identical arguments after ambiguous failures.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| projectId | Yes | ||
| operationId | Yes | Unique ID for this operation. Keep this ID and all arguments unchanged when retrying, including after a timeout. | |
| runtimeMode | No | approval-required | |
| instructions | Yes | ||
| environmentId | Yes | ||
| modelSelection | No | ||
| interactionMode | No | default |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses concrete side effects: changing files, incurring provider charges, default approval requirement, lack of worktree support, and retry semantics for operationId. This goes well beyond the readOnly/destructive flags. 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?
Five short sentences each add distinct information, with the core purpose first. No filler or redundant restatement of the schema.
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 covers side effects, defaults, limitations, and retry behavior, but with 8 parameters, low schema coverage, and no output schema, an agent still lacks guidance on return values, model selection, interaction mode, and how the IDs relate. It is adequate but has clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 13% (only operationId is documented), and the description compensates minimally. It implies the instructions parameter and notes the approval-required runtimeMode default, but it doesn't explain environmentId, projectId, title, modelSelection, or interactionMode. With low schema coverage, the description should carry more of this burden.
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 the specific verb-resource pair, 'Create a thread and send instructions to its agent,' and situates it in the existing project workspace. This clearly differentiates it from sibling tools that list environments/projects or send messages to an existing thread, even though those siblings aren't named.
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 provides clear context: the thread is created in the existing project workspace, defaults to approval-required, and cannot create worktrees. It also gives retry guidance. However, it does not explicitly identify which sibling to use instead, so it stops short of the 5 level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.3.0- Added
list_threads
6 tool updates
v0.1.0- First observed
get_thread - First observed
interrupt_thread - First observed
list_environments - First observed
list_projects - First observed
send_message - First observed
start_thread
TDQS
Scored across 7 tools
Most tools are clearly distinct: list_threads/get_thread for reading, start_thread/send_message for creating and continuing threads, interrupt_thread for control, and list_environments/list_projects for discovery. The only mild overlap is between list_threads and get_thread, but their descriptions make the list-vs-detail relationship clear.
Tool names follow a consistent verb_noun pattern: list_threads, get_thread, interrupt_thread, list_environments, list_projects, send_message, start_thread. The pattern is predictable, though 'send_message' and 'start_thread' are slightly less uniform than the list/get/interrupt group.
Seven tools is well-scoped for a T3 coding-agent MCP server. Each tool covers a distinct operation: discovery, reading, starting, sending, and interrupting threads, plus environment and project listing. No tool feels redundant or unnecessary.
The surface covers the core thread lifecycle: list, get, start, send, and interrupt. Minor gaps exist, such as no explicit archive/unarchive or delete/cancel thread operation, and worktree creation is noted as unsupported, but agents can accomplish the main workflows.
Maintenance
Related MCP Connectors
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP-first control plane for ProAgentStore agents and private instances.
MCP server exposing the Backtest360 engine API as tools for AI agents.
Your org's AI agents, tasks, runs, search, and brain files as MCP tools and resources.
Related MCP Servers
- FlicenseAqualityCmaintenanceMCP server for interacting with a running T3 Code instance. Enables viewing agent threads, sending messages, and approving permission requests from Claude Code or voice-controlled models.19-
- AlicenseNot gradedqualityAmaintenanceEnables external MCP clients to drive DeepSeek Harness agents for real coding tasks, providing tools for task execution and queueing, session management, sandboxed file access, preset switching, and usage statistics.357 npm2GPL 3.0
- AlicenseNot gradedqualityAmaintenanceEnables controlling an autonomous multi-agent engineering swarm from MCP clients, including starting and managing tasks, spawning agents, triggering PR reviews, and checking swarm status.5 npmMIT
- FlicenseNot gradedqualityBmaintenanceEnables external clients to spawn, control, observe, and terminate isolated AI coding agent sessions over MCP via stdio or Streamable HTTP, with scoped chip datasheet knowledge-base retrieval.-