When an LLM writes an infinite loop, Trytet traps it in microseconds instead of your process hanging until a timeout fires. Every instruction is metered. Every memory allocation is capped. The sandbox dies — your agent doesn't.
# macOS (Apple Silicon)
curl -sL https://github.com/bneb/trytet/releases/latest/download/tet-darwin-arm64.tar.gz | tar xz
./tet doctor
./tet mcp --list-tools
# Docker
docker pull ghcr.io/bneb/trytet:latest
# npm / PyPI
npm install trytet-client
pip install trytet-client
Add to claude_desktop_config.json to use with Claude Desktop or Cursor:
{
"mcpServers": {
"trytet": {
"command": "tet",
"args": ["mcp"]
}
}
}
An LLM generates code. Trytet executes it in a WebAssembly sandbox where every CPU instruction deducts from a fuel budget. When fuel hits zero, execution stops — deterministically, in microseconds. The agent receives a structured error it can reason about and try again.
Single-purpose WebAssembly components. Each runs in its own sandbox with independent fuel and memory budgets.
| trytet_js_evaluator | Execute JavaScript with fuel and memory limits | shipped |
| trytet_regex_evaluator | Run regex patterns (ReDoS-protected) | shipped |
| trytet_jmespath_evaluator | Query JSON with JMESPath expressions | shipped |
| trytet_scraper | Parse HTML with CSS selectors | experimental |
| trytet_structured_data | SQLite queries over JSON arrays | experimental |
// TypeScript
import { TrytetClient } from 'trytet-client';
const client = new TrytetClient({ baseUrl: 'http://localhost:3000' });
const tools = await client.listTools();
# Python
from trytet_client import TrytetClient
async with TrytetClient("http://localhost:3000") as client:
tools = await client.list_tools()