Query your traces from Claude Code, Codex, and other agents
simpletel mcp is a stdio Model Context Protocol server built into
the CLI. Register it once and your coding agent can list traces, open one, run the onboarding
check, and read account usage through its own tool channel — without shelling out.
What you get: five read-only tools
The server advertises five tools. Every tool returns text — the JSON document the matching
CLI command produces — and tool-side failures come back as a normal result with
isError: true, so a bad call never breaks the session.
| Tool | Arguments | What it returns |
|---|---|---|
get_traces | since (default 1h), service, errors_only, min_duration, limit | This team's traces newest-first — the JSON document simpletel get traces --format json prints. Use it to find a failing or slow request. |
get_trace | trace_id (required) | One trace in full: spans, span events, and correlated log records. |
get_signals | since (default 1h), service | This team's Golden Signals over a window — throughput, error rate, latency percentiles, per-service breakdown, and saturation — the JSON document GET /api/v1/signals prints. |
verify | service (required), timeout (default 60s) | The simpletel verify rung report plus the exit status the CLI would use (0 verified, 1 deadline miss). |
usage | none | The account's plan, month-to-date records, allowance, and spend cap. |
get_traces, get_trace, get_signals, and verify are team-scoped;
usage is account-scoped and needs a logged-in user token.
Install and register
The subcommand is simpletel mcp. Install the CLI, sign in, create a team, then
register the server with your client:
curl -fsSL https://simpletel.dev/install | sh
simpletel login # GitHub device flow
simpletel team create --name my-app
claude mcp add simpletel -- simpletel mcp
It takes the connection flags --endpoint, --team,
--admin-token, and --config, with the same precedence as every other
read command (flag > environment variable > config file > default). Logged in locally,
it reads ~/.simpletel/config.toml; to pin it to a 20-hex team id instead:
claude mcp add simpletel -- simpletel mcp --team <20-hex-team-id>. Any
JSON-configured client (Claude Desktop, Cursor, Cline, Windsurf) works the same way:
{"mcpServers":{"simpletel":{
"command":"/Users/you/.simpletel/bin/simpletel",
"args":["mcp"],
"env":{"SIMPLETEL_ENDPOINT":"https://simpletel.dev","SIMPLETEL_TEAM":"<20-hex-team-id>"}
}}}
Or run the container
The published image bundles the CLI and runs simpletel mcp for
linux/amd64 and linux/arm64:
docker run -i --rm ghcr.io/willnewby/simpletel-mcp
The transport is stdio, so -i is required and -t must not be
added. The image runs as the distroless nonroot user (uid/gid 65532) with
HOME=/home/nonroot. Pass credentials through the environment (recommended —
nothing is written to the image), or mount a config file read-only and run the container as the
file's owner so a mode-0600 file stays readable:
--user "$(id -u):$(id -g)".
What the handshake advertises
The server speaks newline-delimited JSON-RPC 2.0 on stdin/stdout.
initialize reports protocol revision 2025-06-18,
capabilities.tools, and serverInfo named simpletel;
tools/list returns the five tools above. stdout carries protocol messages only —
every diagnostic goes to stderr — so a client that pipes the two streams can never mistake a
log line for a response.
Why stdio, not a URL
A stdio MCP server is launched by the client as a subprocess and speaks over pipes. There
is no port to expose, no public endpoint to secure, and no bearer token to pass around: the
connection — endpoint, team, and the stk_… user token — stays in your local
~/.simpletel/config.toml (mode 0600, written by
simpletel login). That is also the tradeoff, stated plainly: a stdio server only
serves the process that spawned it, which is why the registry lists it as an OCI package with
a stdio transport rather than a remote endpoint.
A worked example
Ask your agent "what just happened?" and it calls get_traces over the default
1-hour window, picks out the failing or slow request, then passes that trace_id to
get_trace for the full span tree. verify is the same exit-code gate
the CLI uses: it polls until service has a fresh, library-instrumented trace and
returns the pipe/identity/richness rung report with an exit status — a deadline miss is a
completed check (status 1), not a tool error. usage answers with the account's
plan and month-to-date records, so the agent can name the ceiling before hitting it. Because
each tool returns the document the CLI's --format json prints, what an agent
reads over MCP is the same text you would see running simpletel get traces --format
json in a terminal — one read path, not a second implementation to keep in sync.
Finding it without the CLI
As of October 2026 the server is published in three places. The official MCP registry entry
is io.github.willnewby/simpletel — an OCI package with a stdio transport (the
registry hosts metadata and points at the image, it does not host the server). The public MIT
repository is github.com/willnewby/simpletel-mcp, and the public multi-arch image
is ghcr.io/willnewby/simpletel-mcp. The CLI path remains the shortest: the same
server is built into the binary, so there is nothing else to install.
Honest limits
stdio only. simpletel mcp is launched as a subprocess by the
client; it is not an HTTP or SSE endpoint.
Read-only. The tools query traces, usage, and onboarding state. They never ingest data or change account settings.
A team is required for trace tools. With no resolvable team, every
team-scoped call returns isError: true with "team is required (--team,
SIMPLETEL_TEAM, or `simpletel login` + `team create`)". That is not a
crash: initialize and tools/list still answer, so the agent always
sees the tool catalog and can report the real problem.
usage needs a user token. It is account-scoped, so it needs a
logged-in stk_… token (from simpletel login or
SIMPLETEL_TOKEN) — the team-scoped tools do not.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
initialize and tools/list answer, but every call is isError "team is required" | No team was resolved for the session. | Run simpletel login then simpletel team create --name <app>, or pass --team <20-hex-team-id> / SIMPLETEL_TEAM. |
| Every call errors with a connection error | Endpoint wrong or unreachable. | Check --endpoint / SIMPLETEL_ENDPOINT — the base URL with no /v1/traces suffix — and confirm the server answers /healthz. |
usage asks for a user token while team tools work | usage is account-scoped. | Run simpletel login, or set SIMPLETEL_TOKEN to an stk_… token. |
| Calls succeed but return no traces for a fresh team | Nothing has been ingested yet, or the window is too narrow. | Run the smoke test simpletel run -- echo hi, then call get_traces; widen since if the request is older. |
| A mounted container config is unreadable | The image runs as nonroot (uid/gid 65532) and a host-owned 0600 file is not readable by it. | Pass -e SIMPLETEL_ENDPOINT / -e SIMPLETEL_TEAM, or run with --user "$(id -u):$(id -g)". |