Taut MCP
taut-mcp is the optional stdio MCP adapter for Taut. One client launches one
protocol-clean process. That process can keep up to eight local workspaces
resident, but it is not a daemon and stores no durable MCP session state.
Taut databases remain authoritative.
One application surface supports both MCP wire eras:
- legacy clients using protocol
2025-11-25andinitialize; - modern sessionless clients using
2026-07-28andserver/discover.
Both receive the same 20 tools, input schemas, tool results, instructions, and
Taut behavior. The MCP SDK owns the different wire envelopes. The complete
contract is docs/specs/05-taut-mcp.md [MCP-1]–[MCP-12].
Workspaces and Identity
Every identity-using call carries:
workspace: an absolute local directory containing an existing Taut project; andtoken: an existing Taut continuity token for the intended member.
The token selects identity continuity. It is not authentication, authorization, or a bearer capability. Treat it as sensitive input: do not invent it, place it in chat, or log it.
attach_workspace(workspace, token) eagerly resolves the project, validates
the member, starts notification observation, and retains one configured
client. Attach is useful when setup cost should be paid before a domain
operation, but it is not a correctness prerequisite.
Each of the 17 CLI-shaped tools also requires workspace and token. If its
workspace is not resident, that first call performs the same setup lazily and
retains the same client/reactor. Reuse the canonical workspace returned by a
successful call or list_workspaces for the fast path.
detach_workspace is different: it accepts only the exact canonical
workspace and no token because it removes process-local cached state rather
than performing a Taut identity operation. list_workspaces takes no
arguments and reports only state resident in the current process.
After process restart, an ordinary CLI-shaped call can reconstruct its
workspace/member binding from workspace plus token; prior attach state is
never required.
Notifications
The fixed read-only resource is:
taut://notifications/current
It reports pending notification pointers for resident workspaces. Reading it
does not claim notifications, advance chat cursors, touch member activity, or
return every unread message. Use inbox(workspace, token, ...) to consume
notification pointers and act only on the records returned by that consuming
call.
The resource is the level-triggered source of truth. Delivery mechanisms are redundant hints:
- legacy clients use
resources/subscribeandresources/unsubscribe; - modern clients open a long-lived
subscriptions/listenrequest whosenotifications.resourceSubscriptionsincludestaut://notifications/current.
Modern listen filters, acknowledgments, subscription ids, fanout, cancellation, and graceful close are owned by the MCP SDK. A dropped, duplicated, or delayed hint does not lose Taut data; reread the resource.
--claude-channel adds Claude's experimental channel wake only for legacy
clients. It sends a fixed cue to reread the resource and includes no Taut
content. Modern discovery does not advertise a corresponding Claude
capability. The Claude path is host-specific and best-effort; it never
replaces standard tools, resource reads, or subscriptions.
Tool Notes
message_show(workspace, token, msg_id) accepts an exact 19-digit message id
and advances the selected member's seen cursor through that message. Use
log(workspace, token, ...) for cursor-neutral inspection.
message_delete(workspace, token, msg_id) physically and irreversibly deletes
an ordinary message authored by that member. It does not cascade to
notifications, memberships, cursors, DM state, or sub-threads.
message_react(workspace, token, msg_id, reaction) validates the reaction
against the resident workspace configuration, advances the actor's cursor,
and attempts one atomic best-effort broadcast to the current non-actor
audience. A warning means the commit result may be uncertain, so do not
blind-retry.
Use channel_show(workspace, token, channel) to read top-level channel
metadata without activity or cursor effects. Use
channel_topic(workspace, token, channel, topic) to set one single-line topic
or clear it with JSON null; current channel membership is required.
Keep returned 19-digit integer timestamps as decimal text before JavaScript reuse because they can exceed JavaScript's exact-number range.
MCP cancellation is not transaction evidence. A canceled stdio request gets no JSON-RPC response in either era, but synchronous Taut work that already started may still commit. Inspect current Taut state before retrying a consuming or mutating call.
Install and Run
The extension distribution remains taut-mcp; its core dependency is the
taut-chat distribution, which still provides import taut and the taut
command. The repository's coordinated PyPI and immutable GitHub Release path
is configured, but configuring it does not publish a release. Once the first
coordinated PyPI version is published:
pipx install taut-chat
pipx inject --include-apps taut-chat taut-mcp
taut-mcp
The tag gate reuses the exact wheel and sdist built by canonical Test. It
stages them in a draft GitHub Release, publishes them through the taut-mcp
top-level PyPI Trusted Publisher, verifies filenames and SHA-256 digests, and
only then publishes the GitHub Release as immutable.
From this checkout:
uv sync --directory extensions/taut_mcp --extra dev
uv run --directory extensions/taut_mcp taut-mcp
Stdout is reserved for MCP messages. Diagnostics are content-free and go to stderr.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file taut_mcp-0.8.1.tar.gz.
File metadata
- Download URL: taut_mcp-0.8.1.tar.gz
- Upload date:
- Size: 30.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3551337acd1f74b96dc03e0ef536d6d3ed0041ecbbea8b131f6c17fe282d24b2
|
|
| MD5 |
e96619e7aa585ec0d0dc800bac549b2f
|
|
| BLAKE2b-256 |
8821d12d1288776dfcf89ed847426a665dabccd254837a5ef49970ce8081d033
|
Provenance
The following attestation bundles were made for taut_mcp-0.8.1.tar.gz:
Publisher:
release-gate-mcp.yml on VanL/taut
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
taut_mcp-0.8.1.tar.gz -
Subject digest:
3551337acd1f74b96dc03e0ef536d6d3ed0041ecbbea8b131f6c17fe282d24b2 - Sigstore transparency entry: 2349633676
- Sigstore integration time:
-
Permalink:
VanL/taut@33a3d73fb14191459cfd22961f43a0f8fcf3440e -
Branch / Tag:
refs/tags/taut_mcp/v0.8.1 - Owner: https://github.com/VanL
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-gate-mcp.yml@33a3d73fb14191459cfd22961f43a0f8fcf3440e -
Trigger Event:
push
-
Statement type:
File details
Details for the file taut_mcp-0.8.1-py3-none-any.whl.
File metadata
- Download URL: taut_mcp-0.8.1-py3-none-any.whl
- Upload date:
- Size: 37.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e8ee98731d5ffb7726e9729b3a8fd3a48082234aba62c3e963a997aefc3b2f49
|
|
| MD5 |
aaee46b343a18cbf635c3fb826332b34
|
|
| BLAKE2b-256 |
b58185de6745385b9272761f329eec2fc0df11575a8718d2c2b5c4f997e9670b
|
Provenance
The following attestation bundles were made for taut_mcp-0.8.1-py3-none-any.whl:
Publisher:
release-gate-mcp.yml on VanL/taut
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
taut_mcp-0.8.1-py3-none-any.whl -
Subject digest:
e8ee98731d5ffb7726e9729b3a8fd3a48082234aba62c3e963a997aefc3b2f49 - Sigstore transparency entry: 2349633977
- Sigstore integration time:
-
Permalink:
VanL/taut@33a3d73fb14191459cfd22961f43a0f8fcf3440e -
Branch / Tag:
refs/tags/taut_mcp/v0.8.1 - Owner: https://github.com/VanL
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-gate-mcp.yml@33a3d73fb14191459cfd22961f43a0f8fcf3440e -
Trigger Event:
push
-
Statement type: