shush
Compresses Git command output: summarizes git status by section, condenses git log to one line per commit, and filters git diff/git show while preserving added and removed lines and dropping metadata and excess context.
Filters Jest output by hiding passing and skipped test lines while keeping failures, stack traces, and the test summary.
Filters Mocha output by hiding passing and skipped test lines while keeping failures, stack traces, and the test summary.
Compresses npm install and npm ci output by hiding download progress, cache logs, and funding notices; folds deprecation warnings; and preserves errors and the audit summary.
Compresses pnpm install output by removing download and progress noise while preserving errors and relevant summaries.
Compresses pytest verbose output by hiding passing and skipped test lines while preserving failures, tracebacks, and the test summary.
Filters Vitest output by hiding passing and skipped test lines while keeping failures, stack traces, diffs, and the test summary.
Compresses yarn install output by removing download and progress noise while preserving errors and relevant summaries.
shush 🤫
Cut the noise from command output before it reaches your AI agent. Passing tests, progress bars, download logs, git chatter and repeated lines go; every error, failure and summary stays. Anything hidden is one call away.
Works with any agent: as an MCP server (Claude Code, Cursor, VS Code, Codex, Gemini CLI, Kiro, Junie, Zed…) or as a plain CLI prefix (shush npm test). MIT, no daemon, no proxy, no model download, no API keys.
$ shush go test -v ./...
calc_test.go:26: Slug("Çay Saati") = "çay-saati", want "cay-saati"
--- FAIL: TestSlugTurkish (0.00s)
FAIL
FAIL example.com/calc 0.002s
FAIL
[shush] exit 1 · 880 → 57 tokens (-94%) · hidden: 65 passing test lines · full output: shush show 20261026-140034-0d6e5bWhy
Agents read every line a command prints. A green vitest --reporter=verbose run is 1,655 tokens of check marks; a verbose npm ci is 5,670 tokens of HTTP cache hits. That burns context, money and attention, and the one line that matters gets buried.
Tools like rtk and headroom proved how much this matters. shush is a smaller, stricter take on the same idea, built around three promises:
Never hide a failure. Lines that look like errors, failures, panics, assertions or warnings are protected from every filter. A test suite checks this against real failing outputs from vitest, pytest, go test, cargo test and tsc.
Never a dead end. When anything is hidden, the footer says exactly what (
hidden: 65 passing test lines) and the raw output is saved. Agents callread_full(with paging and grep) or you runshush show <id>.Never touch your command. shush runs exactly what you typed and only filters what comes back. It does not rewrite
npm run lintinto something else.
Related MCP server: logslim-mcp
Benchmarks
Real outputs captured from real tools (in tests/fixtures), counted with the o200k_base tokenizer (not bytes / 4). Reproduce with npm run build && npm run bench.
Output | Before | After | Saved |
git status | 137 | 59 | 57% |
git log (60 commits) | 4,611 | 1,730 | 62% |
git diff | 3,270 | 2,215 | 32% |
vitest, verbose, all passing | 1,655 | 85 | 95% |
vitest, 3 failures | 1,010 | 1,009 | 0% |
pytest -v, 2 failures | 1,228 | 428 | 65% |
go test -v, 1 failure | 880 | 57 | 94% |
cargo test (fresh build), 1 failure | 631 | 194 | 69% |
npm install (deprecated deps) | 306 | 104 | 66% |
npm ci --loglevel=verbose | 5,670 | 76 | 99% |
pip install requests rich | 749 | 106 | 86% |
tsc, 5 errors | 152 | 152 | 0% |
Total | 20,299 | 6,215 | 69% |
The two 0% rows are on purpose: a failing vitest run and a list of tsc errors are already almost all signal, so shush leaves them alone.
Install
Requires Node.js 20+. Not on npm yet, so npx installs from GitHub (github:celaldrg/shush). Once it is published this becomes npx -y shush-mcp.
As an MCP server (recommended for agents)
The server exposes four tools: run (run a command, get compact output), compress (compress text you already have), read_full (page/grep the full output) and gain (savings so far).
Claude Code
claude mcp add shush -- npx -y github:celaldrg/shush mcpCursor (~/.cursor/mcp.json), Claude Desktop (claude_desktop_config.json), Kiro (.kiro/settings/mcp.json), Gemini CLI (~/.gemini/settings.json) and most other clients:
{
"mcpServers": {
"shush": { "command": "npx", "args": ["-y", "github:celaldrg/shush", "mcp"] }
}
}VS Code
code --add-mcp '{"name":"shush","command":"npx","args":["-y","github:celaldrg/shush","mcp"]}'Codex CLI (~/.codex/config.toml)
[mcp_servers.shush]
command = "npx"
args = ["-y", "github:celaldrg/shush", "mcp"]Then tell the agent to use it. Add this to AGENTS.md / CLAUDE.md:
For commands with long output (tests, builds, installs, linters, git log/diff/status),
use the shush `run` tool instead of the shell. If the footer says something was hidden
and you need it, call `read_full` with the id it prints.As a CLI (any agent, any shell, CI logs)
npm install -g github:celaldrg/shush # or use npx -y github:celaldrg/shush ...
shush npm test # run, compact output, same exit code
shush "npm ci && npm run build" # one quoted argument runs through your shell
some-command 2>&1 | shush --cmd "pytest -v" # compress piped output
shush show 20261026-140034-0d6e5b --grep TestSlug # read what was hidden
shush gain # tokens saved on this machineAn agent that only has a shell can use shush too: tell it to prefix noisy commands with shush.
What it does
Output | What shush does |
Test runners (vitest, jest, mocha, pytest, go test, cargo test, TAP) | Hides passing and skipped test lines; keeps failures, stack traces, diffs and the summary |
Installs (npm, pnpm, yarn, pip, cargo, go) | Hides download/compile progress, HTTP cache logs and funding notices; folds deprecation warnings into one line; keeps errors and the audit summary |
| One line per section: |
| One line per commit: hash, date, author, subject (bodies are counted in the footer) |
| Every |
Everything else | Strips ANSI colors, resolves |
Exit codes are always preserved and printed. If compression would not save anything, the output passes through unchanged.
shush vs rtk vs headroom
Credit where due: shush is inspired by rtk (Apache-2.0; its full edition ships a BUSL-1.1 engine) and headroom (Apache-2.0). It is an original implementation; no code was copied. Pick the one that fits:
shush | rtk | headroom | |
How it reaches the agent | MCP tool or CLI prefix | Per-agent hooks that rewrite shell commands | Proxy, |
New agent support | Anything that speaks MCP or runs a shell | ||
Rewrites your command | Never | Yes, transparently (e.g. #1489) | No (works on content) |
Automatic for every command | No: the agent must choose | Yes, for Bash tool calls | Yes, when wrapped/proxied |
Getting the hidden part back |
| See rtk docs |
|
Token counts reported | Real tokenizer (o200k) |
| Provider tokenizer in its benchmarks |
Install |
| Single Rust binary (brew/winget/curl) | Python package + optional ML model |
Breadth | ~12 output families (v0.1) | 100+ commands | Logs, JSON, code, prose, chat history |
License | MIT | Apache-2.0 (+ BUSL-1.1 engine in full edition) | Apache-2.0 |
If you want maximum coverage and automatic interception in a supported agent, use rtk or headroom. If you want something small, MIT, auditable in one sitting, that works the same in every MCP client and never changes what you ran, use shush.
Demo
Real transcript of an MCP client calling run on real projects: docs/demo-transcript.md. Excerpt:
> run "npx vitest run --reporter=verbose" (cwd /workspace/turkiye-mcp)
RUN v4.1.12 /workspace/turkiye-mcp
Test Files 5 passed | 1 skipped (6)
Tests 69 passed | 6 skipped (75)
Start at 14:00:34
Duration 326ms (transform 401ms, setup 0ms, import 573ms, tests 83ms, environment 1ms)
[shush] exit 0 · 1,655 → 85 tokens (-95%) · hidden: 69 passing test lines, 6 skipped test lines · full output: shush show 20261026-140034-3242a4
> run "git log -6" (cwd /tmp/fx/ky)
35418888 2026-10-09 Sindre Sorhus: 2.2.0
242c3272 2026-10-08 Sindre Sorhus: Let a `beforeRetry` hook change per-attempt options
d9ddb03b 2026-10-08 Sindre Sorhus: Fix CI
d93adf85 2026-10-08 Sindre Sorhus: Run the browser tests and static checks once in CI
a5ed57b1 2026-10-07 Sindre Sorhus: Refactor
7f0137dc 2026-09-29 Sindre Sorhus: Report the sent request for a hook's response, and finish the cross-realm and `null` checks
[shush] exit 0 · 445 → 158 tokens (-64%) · hidden: 2 commit message bodies · full output: shush show 20261026-140040-845279Privacy and safety
Everything runs locally. Nothing is sent anywhere.
Full outputs are saved to
<tmp>/shush(mode 0600, newest 200 kept); change withSHUSH_LOG_DIR. They can contain whatever your commands print, secrets included, so treat that folder like your terminal scrollback.A local ledger of token counts (no output content) goes to
~/.shush/stats.jsonl; disable withSHUSH_NO_STATS=1.The MCP
runtool executes shell commands, exactly like your agent's own shell tool. It is annotated as destructive, so clients that honor MCP tool annotations ask before running it.
Limitations (v0.1)
Not automatic: agents use it when told to (see the
AGENTS.mdsnippet).Fewer specialized rules than rtk. Unknown tools still get the generic filters.
Tested on Linux and macOS. Windows should work (commands run through
cmd.exe) but is not in CI yet.git logkeeps only the subject line. Use--formator--onelineyourself if you need more; shush leaves explicitly formatted output alone.
Development
npm install # also builds
npm test # unit tests on real captured outputs + CLI + MCP over stdio
npm run bench # the table above
node scripts/demo.mjs '[{"command":"git log -5"}]'New rules are welcome. Please add a real captured output to tests/fixtures with every rule.
License
MIT © Celalettin Durğaç
This server cannot be deployed
Maintenance
Related MCP Connectors
Free deterministic PDF, Markdown, citation, invisible-character, and formatting cleanup for agents.
Find and redact leaked secrets, wallet keys and PII before an AI agent sends text.
Verified AI-agent outcomes: secret scanning, JSON cleanup, dedupe, anomaly and schema checks.
Strips 85-97% of HTML bloat into clean Markdown, <200-token skeletons, or BM25 excerpts via MCP.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceFilters verbose terminal output from commands like npm install, pip install, docker build, and pytest, reducing context token consumption for AI agents by condensing logs, removing progress bars, and grouping repeated warnings.-
- AlicenseAqualityDmaintenanceCompacts noisy test, build, and cloud-log output before an AI agent reads it — dedupes repeats, collapses stack frames, folds Playwright retries, and renders CloudWatch/GCP JSON logs down to the signal. Typically 80–95% fewer tokens on failures. Tool: compact_output. Run: npx -y logslim logslim-mcp18 npm5MIT
- AlicenseNot gradedqualityCmaintenanceCompresses, deduplicates, and filters tool outputs to optimize token usage and context window for AI agents.MIT

Log Reducerofficial
AlicenseNot gradedqualityDmaintenanceReduces log files to remove noise and duplicate information, cutting tokens by 70-90% for AI agents, preserving only errors, warnings, and unique events.22 npmMIT