Why are requests failing? Here are the logs:
Without Mizpah
The agent reads the whole dump. Most of the context is noise; the bill isn’t.
mizpah
tail -f is a slog. Pipe
JSON into mzp for a live
UI you can actually search, and agents that query the buffer instead of
burning tokens on paste and re-runs.
One Homebrew install. Hub opens locally in under a second. No account, nothing in the cloud. You get a fast filterable stream; Cursor, Claude, Codex, and Grok pull small CEL slices over MCP when they need context.
$ brew install ethira-dev/tap/mizpah
$ my-app 2>&1 | mzp --service api
$ npx skills add ethira-dev/mizpah A calmer log UX for you, and a cheaper way for agents to see the same buffer.
First process binds :3149, serves a readable stream UI, and keeps a 1 GiB ring buffer in
memory. Click a row, expand JSON, move on without drowning in a
terminal scrollback.
Shell, browser DevTools, Cursor and Claude hooks all land in the
same hub via mzp attach. One capture you can keep browsing and agents can keep querying.
Prefer JSON lines, but syslog, access logs, Bunyan/Pino, CloudTrail,
Suricata, and scores of other format-v1 packs normalize into
structured rows. Browse them on
Supported Formats, or see
Log formats. Ingest files with mzp ingest.
Real queries in the search bar, with autocomplete for fields you've actually logged. You find the needle fast; agents get a tiny result set instead of a fat paste. For rollups, use aggregations or read-only SQL over the buffer.
MCP tools for Cursor, Claude, Codex, and Grok call search_logs against the live buffer. Better answers for them, thinner prompts
and a lower bill for you.
The Mizpah skill trains the agent to stop stuffing chat with log dumps and pretty-printed stdout. Prefer a JSON flag when the tool supports it, pipe into the hub, then filter with CEL so only the rows that matter enter context.
Why are requests failing? Here are the logs:
The agent reads the whole dump. Most of the context is noise; the bill isn’t.
Why are requests failing?
level == "error" · service=api · limit=5 entries[3]:
- id: a1f3
service: api
data:
level: error
msg: "timeout calling redis"
- id: b8c2
service: api
data:
level: error
msg: "redis: connection refused"
- id: c0e9
service: api
data:
level: warn
msg: "retry exhausted after 3 attempts"
hasMore: false The skill teaches the agent to query CEL filters over MCP — small slices, not pasted transcripts.
Which tests failed?
The agent runs the command, then reads a multi-line human dump. Failures are buried in chrome the model has to re-parse every time.
Which tests failed?
level == "error" · service=tests · limit=5 entries[2]:
- id: e91a
service: tests
data:
level: error
msg: "redis › reconnects on timeout"
- id: f2b0
service: tests
data:
level: error
msg: "Expected true, Received false"
hasMore: false
When the tool can emit JSON, the skill prefers that, pipes into
mzp, then filters — so
the agent gets fields, not a pretty-printed wall of text.
$ npx skills add ethira-dev/mizpah
$ mzp mcp install Full walkthrough in MCP & agents.
Sources ingest into one hub. You watch it in the web UI; agents read the same buffer over MCP without another full command run.
01 sources
mzp attach browser console.* + network mzp attach cursor ~/.cursor/hooks.json mzp attach claude ~/.claude/settings.json mzp attach shell stdout/stderr -> ingest app 2>&1 | mzp JSON / NDJSON / _raw 02 hub
axum · ring buffer · :3149 03 expose
GET / · WS /ws 127.0.0.1:3149 mzp mcp search_logs · get_logs_around
With mzp mcp install,
Claude Code, Codex, and Grok call search_logs for a few matching rows. Feels like the agent can see your terminal;
costs like a small tool call instead of a dumped transcript.
count: 18420
approxBytes: 134217728
maxBytes: 1073741824
services[4]{name,count}:
api,9120
worker,4102
chrome,3188
cursor,2010entries[4]:
- id: 1837
service: api
data:
level: error
msg: "timeout waiting for redis"
- id: 1760
service: worker
data:
level: warn
msg: "job lease timeout after 30s"
- id: 1694
service: api
data:
level: error
msg: "upstream timeout GET /billing"
- id: 1512
service: chrome
data:
level: error
msg: "Fetch timeout https://cdn.example/app.js"
hasMore: falseTurn completed in 4.1s.
Tests, lint, and debug get messy when every question means another run or another paste. Pipe once into mizpah. Browse the stream yourself; let agents search the same output without starting over.
Run the suite into mzp. Jump straight to failures in the UI, or have the agent pull them
with search_logs
instead of waiting on another full run.
One lint pass fills the hub. Skim warnings in a filterable list, or let agents read them from the buffer without re-invoking the linter and stuffing stdout into context.
Keep the app streaming. Open a row for JSON context, or call get_logs_around for a tight slice. No more hunting a stack frame inside a 10k-line
paste.
Clearer workflow for you, fewer tool rounds and thinner context for agents. Same idea in Claude Code, Codex, Grok, or Cursor.
Homebrew, pipe a service, then install the agent skill so Cursor and friends query the hub instead of pasting dumps.
# install mizpah
brew install ethira-dev/tap/mizpah
# pipe a service
api-server 2>&1 | mzp --service api
# agent skill (token-saving workflow)
npx skills add ethira-dev/mizpah
# MCP tools (Cursor / Claude / Codex)
mzp mcp install
# or attach
mzp attach # shell
mzp attach browser --launch
mzp attach cursor
mzp open