Reports what your test suite is structurally unable to see and proves each gap with a real failing test, across six languages.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Reveals what your tests are not telling you.
Umbra is an apophatic[^definition] code auditor. Every other tool reports what it found: coverage says which lines ran, a linter says which lines smell, a green suite says all the tests pass everything they can see. None of them report what the tests are structurally unable to see. That blind region, the umbra, is where agent-written code fails.
Umbra names the shadow and proves it. For a Python, TypeScript, JavaScript, Java, Rust, or Go module and its test file(s). Umbra maps what the tests actually exercise, finds the reachable and meaningful cases nothing asserts, and reports a Silence index: the honest complement to coverage. Higher means more blind spots. Not what ran. What nothing could see. It then writes failing tests that will close the gap, and examines your functions for purity.
Built with Codex, using GPT-5.6. Track: Developer Tools. GPT-5.6 runs only where structure runs out and only meaning remains.
Umbra is the newest instrument in the Slop Audit (Open Honest Foundation), the same catch-what-metrics-miss-by-construction discipline taken from an enterprise codebase down to a single module and its test suite. Both rest on one premise: name what the instrument cannot see. Umbra's page: slopaudit.org/umbra.html.
Umbra runs two ways: as a Codex plugin, its home, auditing code the moment the agent writes it (see "Use from Codex" below); and as a standalone CLI. Either way it audits six languages (Python, TypeScript, JavaScript, Java, Rust, Go).
The CLI is a Python package, run with uv. From a clone:
Umbra runs two ways. Its home is the Codex plugin; the CLI is the standalone path. Both are shown here.
Once the plugin is registered (see "Use from Codex" below for the one-time setup and the full tool reference), you drive it in plain language. The surface is four tools, and here is what you can ask for:
umbra_audit, reports coverage beside the Silence index, and names every blind spot. Deterministic, and needs no API key.umbra_verify_proposal; Umbra's execution gate keeps only a test that genuinely fails or makes the function error, and rejects a malformed one with the exact field to fix. Umbra never writes into your test file, so adopting a surviving proof is your choice.umbra_write_report and presents the self-contained HTML alongside the portable Markdown. Local and deterministic; sends nothing anywhere.umbra_glossary and relays Umbra's own fixed definition instead of improvising one. Omit the term to list every defined term.model_backend: off) and makes zero API calls. Only proof generation can use a model, and only the host sampler unless you opt in: the OpenAI backend stays off until you set confirm_openai (or the disclosed UMBRA_OPENAI_FALLBACK).Point Umbra at a source module and its test file, in any supported language:
Umbra prints the Coverage-versus-Silence report and writes the generated failing test using the audited language's file extension. It reads each test file to identify its framework and runs the matching one: pytest for Python; Vitest or Node's built-in node:test for TypeScript and JavaScript; JUnit or a throw-on-failure main harness for Java; the #[test] suite for Rust, whether inline in the module or in a separate file; and go test for Go, including named and external test packages. Coverage comes from each language's own tool: coverage.py, Vitest or Node V8, JaCoCo, cargo-llvm-cov, and the Go cover profile. A framework Umbra does not recognize, or a run it cannot complete, is reported as not measured with the reason attached, never a guessed number.
umbra audit [MODULE] β audit a single source file (with --tests), a Python project directory, or a Git diff (--since).
| Flag | Default | Effect |
|---|---|---|
MODULE (positional) | β | A Python, TypeScript, JavaScript, Java, Rust, or Go source file, or a Python project directory. Omit when using --since. |
--tests PATH | β | Test file for a single audited source. Project and diff modes discover the suite themselves. |
--since REF | β | Audit only the module and test pairs changed since this Git ref; writes umbra-diff-report.md. |
--fail-on-silence-increase N | β | Diff mode only: exit non-zero when the aggregate Silence index rises by more than N points. |
--no-model, --deterministic | off | Run fully offline, with zero API calls. |
--json | off | Emit one machine-readable audit JSON object to stdout; the human report goes to stderr. |
--json-out PATH | β | Also write that JSON object to a file. |
--harden | off | Turn the audit into a convergence loop (see below). |
--harden-call-budget N | 12 | Maximum model calls across the whole harden run. |
--harden-iteration-budget N | 4 | Maximum re-audit passes. |
--harden-calls-per-iteration N | 1 | Model calls before each re-audit. |
umbra benchmark β run the reproducible proof-cycle benchmark on the fixed Python gap set.
| Flag | Default | Effect |
|---|---|---|
--runs N | 3 | Independent trials per fixed gap. |
--attempt-cap N | 4 | Maximum proposal attempts per gap trial. |
--output PATH | umbra-proof-cycle-scorecard.md | Markdown scorecard path. |
Environment variables (CLI and plugin)
| Variable | Effect |
|---|---|
OPENAI_API_KEY | Enables the model layer for proof generation (CLI), or the disclosed OpenAI backend (plugin). |
UMBRA_OPENAI_FALLBACK | Set to 1 to authorize the plugin's disclosed OpenAI fallback, and only after host sampling is unavailable. |
UMBRA_TIMEOUT_SECONDS | Per-subprocess time limit for audited and generated code (default 10). |
UMBRA_JAVA_TOOLS | Directory holding the JDK, JaCoCo agent, and JUnit console launcher for Java audits; falls back to the repository tools/ directory. |
Add --harden to turn the audit into a loop. Umbra generates the tests that close each open facet, keeps the passing ones as regression guards and the failing ones as bug proofs, re-audits, and repeats until no closeable silence remains. The Silence index is the loop's convergence target, so "done" is definable, unlike coverage-chasing.
Harden generates tests, so it uses the model layer (or Codex). The call, iteration, and per-iteration budgets are bounded by --harden-call-budget, --harden-iteration-budget, and --harden-calls-per-iteration. Run without --harden for a fully deterministic audit.
Give audit a repository directory to audit every real Python source module against the entire discovered pytest suite. Umbra runs that suite once under branch coverage, attributes resolvable calls from every test file to their source module, and writes umbra-project-report.md with per-module results plus the repository aggregate. Re-export-only __init__.py files are skipped. A module that cannot be parsed, or whose suite does not complete, is listed as unaudited and is excluded from the aggregate.
Project mode is deterministic and sends no data to any API. It currently supports Python repositories with flat or src/ layouts and conventional tests/ or test/ filenames. A suite with failing tests remains measurable when coverage exists: the report names the pass count, fail count, and exit status. A run that produces no coverage is explicitly unmeasured and excluded from the index.
Umbra gives each subprocess that runs audited or generated code a 10-second limit. It stops the whole process group, so a timed-out test or replay cannot leave child processes behind. Set UMBRA_TIMEOUT_SECONDS to a positive number of seconds to adjust that limit:
A timed-out replay becomes an honesty_unverified result with the timeout reason. A timed-out coverage run is explicitly unmeasured and does not receive a Silence index.
Reports made for humans. Not the usual wall of text a test report buries you in: a short, readable account of what your suite cannot see, with the one failing test that proves it.
For scripts and CI, add --json. Standard output is one JSON object only; the human report is sent to standard error, while the Markdown and HTML reports are still written as usual.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/openhonest-umbra)<a href="https://allmcps.com/mcp/openhonest-umbra"><img src="https://allmcps.com/api/badge/openhonest-umbra?style=directory" alt="Umbra on AllMCPs" /></a>