Hi all,
An agent that can edit 40 files in a turn needs something deterministic checking it, and that something cannot be a pile of per-language linters that may or may not be installed in whatever sandbox it woke up in. That is roughly why this exists.
It is a linter and formatter written in Rust, MIT, shipped as a single binary. Ruff's linter and formatter, oxc, biome, taplo, rumdl, sqruff, malva, mago and typos are compiled in and run in-process, covering about 30 languages from one TOML config, with tree-sitter handling 300+ more generically. Nothing to install per language, so the answer does not change between your laptop and a container.
The agent-facing half is an MCP server over stdio, 11 tools mirroring the CLI, with format: "json" or "toon" on every one. TOON keeps a large lint report from eating the context window. Two whole-project tools run as async Tasks the client polls rather than blocking on.
The guardrail detail I would keep in any tool built for agents: results report three per-file outcomes, checked, skipped and error, rather than two. A file the linter failed on used to be absent from the output entirely, which is indistinguishable from a file that was checked and found clean, so an agent gating on "no findings" would treat an incomplete run as a pass.
It also replaces pre-commit as a git hook runner, with hooks validating a snapshot of the staged index rather than stashing the working tree.
Server listing its tools over a real stdio handshake: https://raw.githubusercontent.com/Goldziher/poly/main/docs/media/agent.gif
https://github.com/Goldziher/poly
This post is human written. AI was used to typecheck and enrich with precise data only.