tools pin records the definitions you reviewed, and the bundled adapter enforces them.
Pin a tool manifest
pin hashes each tool’s full definition and the current .attesso/tools.json, writes both the snapshot and a lock, and prints the tools digest plus whichever extra surfaces it found (server, prompts, resources, resource_templates). verify compares the lock with the manifest and names what changed: a changed tool, an added one, a removed one, a changed surface.
A caller that knows the definition can send tool_definition_hash with the call:
A pin is only as good as what it covers. If the caller never sends a hash, the pin records definitions but does not refuse a drifted server on its own; the adapter below is what closes that.
The stdio adapter
2026-07-28 stateless discovery shape and the older initialize handshake. --era auto (the default) discovers, --era modern and --era legacy force one; --era legacy is what you need when a dual-era server would otherwise be discovered as modern.
It refuses, before the client sees the answer:
- a changed server identity, instructions, tool, prompt, resource or resource template;
- a changed or unpinned tool, before the call reaches the server;
- a server-initiated sampling, elicitation or roots request.
export carries the pinned manifest and the tool lock, so verify-bundle can check the evidence in an empty directory.
Control the ledger over MCP
attesso-control-mcp is a second, smaller server: it lets an agent inspect and narrow the local configuration without granting it the ability to widen it.
Three things it cannot do, by design: enable enforcement (
enforce is a human CLI action), widen a root or exclusion, and reach the network. It has no HTTP listener. shell_scope is a human CLI setting, written with attesso paths --set.
attesso-mcp remains the upstream tool proxy; attesso-control-mcp is the control surface.

