aict

Unix coreutils with XML/JSON output — built for AI agents, not humans.

CI

Go 1.25

Release

Go Report Card

License: MIT

Stars

Install · Quick start · All tools · MCP server · Claude Code · Token cost · Benchmarks · Contributing

Install

Quick start

All tools

MCP server

Claude Code

Token cost

Benchmarks

Contributing

aict demo: classic ls output vs structured aict output

The problem

AI agents run ls, grep, and cat and get back human-readable plaintext. Then they spend tokens parsing column positions, guessing field widths, and handling inconsistent formats. This is fragile and wasteful.

The solution

aict reimplements 33 Unix tools with structured output the agent can read directly — no parsing required.

Every field is labeled. Paths are always absolute. Timestamps are Unix integers. Language and MIME type are detected automatically — zero parsing needed.

Install

Homebrew (macOS)

This installs aict plus shell completions for bash and zsh. The MCP server is built in: aict mcp.

Go Install

Build from Source

Verify install: aict --help should list all available tools.

Quick start

Tools

33 tools across 6 categories. Every tool supports --xml (default), --json, and --plain.

Additional: git (status, diff, log, ls-files, blame) · completions (bash/zsh/fish) · doctor (self-diagnostic)

Output format

All tools follow the same conventions:

MCP server

aict mcp exposes all tools as callable MCP functions via stdio transport. AI assistants call them natively — no shell wrapping needed. The MCP server is a subcommand of the main binary.

Configure Claude Desktop (~/.config/claude/claude_desktop_config.json):

If aict is not in PATH, use its full path:

Claude Code integration

Add to ~/.claude.json:

Once connected, Claude Code can call ls, grep, diff, and all other tools as native functions with typed arguments and structured JSON results.

Token cost

Honest numbers first: aict output costs 1.1–7.8× more tokens per task than terse GNU output (measured with tiktoken o200k_base). What those tokens buy: fewer round-trips and zero parsing ambiguity. Where plaintext needs 2–4 chained calls (ls then file for languages, find then stat per hit), aict answers in one.

Every extra plaintext call is a full agent turn — model inference, tool-call overhead, and intermediate output all land in the context window anyway, none of which the token counts above include. And in this very benchmark, file(1) misidentified a Go source file as "C source"; aict labeled it go.

In a live agent eval (opencode, same task 3× per toolchain), the aict-equipped agent generated ~46% fewer output tokens (median 265 vs 487) and was correct 3/3 — the GNU-equipped agent shipped a flawed report in the run where it trusted file(1)'s language detection. See benchmarks/TOKENS.md for both methodologies; reproduce with go run ./cmd/tokenbench.

benchmarks/TOKENS.md

Use --plain when you only need raw content.

Benchmarks

aict trades some speed for semantic richness (language detection, MIME typing, absolute paths). The overhead is intentional. Startup cost is ~3.6 ms per invocation.

Medians from 5 runs on Linux/amd64. See benchmarks/ for methodology and make bench to reproduce.

benchmarks/

Use --plain to skip enrichment when you only need raw content.

FAQ

Why XML and not JSON by default?

XML attributes are denser in a context window. <file size="1024" lang="go"/> is shorter than {"size":1024,"lang":"go"}. Use --json if you prefer JSON — the structure is identical.

Why not pipe GNU tools to jq?

ls, cat, stat, find, diff, and wc don't output JSON. jq can't help with them. aict provides structured output for the entire toolchain, not just grep. (aict also ships its own jq for querying JSON files with path expressions.)

How does this compare to ripgrep?

ripgrep is much faster for pure search. aict grep adds language detection, MIME type, and a consistent output format shared with every other tool. Use ripgrep for speed-critical search; use aict when the agent needs structured context.

How does this compare to eza / lsd?

eza and lsd are better ls for humans — great colors and formatting. aict outputs data structures, not formatted tables. They're solving different problems.

Does it work on Windows?

ls, cat, stat, wc, find, diff, grep, head, tail, sort, uniq, cut, tr, sed, awk, jq, tar, checksums, df, and path utilities work on Windows. system is Linux/macOS; ps is Linux-only (it reads /proc). Unsupported platforms get a structured <error> element, never a crash.

Is this safe to run in a sandboxed environment?

Yes. aict is strictly read-only. No network requests (MIME detection uses the Go stdlib, not HTTP). No telemetry. No data collection. It only reads paths you explicitly pass to it.

How many dependencies does it have?

One: the official MCP Go SDK, used only by the aict mcp subcommand. All 33 tools and every internal package are pure Go standard library — enforced as a hard constraint in AGENTS.md.

MCP Go SDK

AGENTS.md

Contributing

Bug reports, feature requests, and PRs are welcome. See CONTRIBUTING.md for guidelines, code style, and the tool implementation pattern.

CONTRIBUTING.md

Issues tagged good first issue are a good place to start.

good first issue

License

MIT — built entirely by AI tools, for AI tools.

MIT