Printing Press - Agent-Native CLIs from a Single Prompt

One prompt prints a token-efficient Go CLI + a Claude Code skill + an OpenClaw skill + an MCP server for any API, app, or site - even ones with no public API. It bakes Peter Steinberger's discrawl/gogcli playbook (local SQLite mirror, compound commands, agent-native flags) into every binary. By Matt Van Horn, the same author as Security and Review Skills.

What it does

Printing Press (mvanhorn/cli-printing-press, MIT, ~3.9K GitHub stars) is a generator that reads an API's official docs, studies every popular community CLI/MCP server for it, and sniffs the web for unpublished APIs (Google Flights, Dominos). It fuses all of that and prints: a Cobra Go CLI (<api>-pp-cli), an MCP server (<api>-pp-mcp), a Claude Code skill, and an OpenClaw skill - from one spec, one HAR file, or just a URL. No OpenAPI spec required. Source: github.com/mvanhorn/cli-printing-press README, 2026-07-04

Current source snapshot on 2026-07-04: main HEAD 4a2b02329e71e64cc7ffe14ff9af569d0dfa3495, latest repo tag v4.9.0, MIT license, 3,855 stars, 413 forks. The npm package @mvanhorn/printing-press exists at 0.1.5, but the documented install path remains the Go module / Claude skill route. Source: GitHub API; git ls-remote; npm registry, 2026-07-04

The driver is the /printing-press <app> slash command inside Claude Code; it runs the printing-press Go binary behind the scenes (research → generate → score → shipcheck). "Other harnesses like Codex may work but aren't tested. Use Claude Code for the best experience." Source: README Install, 2026-06-01

Why these CLIs win (the playbook)

  • Local-first data layer. High-gravity resources get domain-specific SQLite tables (not JSON blobs), FTS5 full-text search, and incremental sync with cursor tracking. sync pulls data down; search finds it in ~ms; sql queries it directly. All offline. Source: README, 2026-06-01
  • Compound commands no wrapper can do. Once data lives in SQLite, stale, health, bottleneck, reconcile join across resources and analyze history - a stateless API wrapper literally cannot. (linear-pp-cli: "every blocked issue whose blocker has been stuck a week," 50ms.) Source: printingpress.dev, 2026-06-01
  • Agent-native by default. Auto-JSON when piped (no --json flag), --compact drops to high-gravity fields (id/name/status/timestamps) for 60-80% fewer tokens, typed exit codes (0 ok, 2 usage, 3 not found, 4 auth, 5 API, 7 rate-limited) let agents self-correct in one retry without parsing error text, --dry-run for safe exploration. "Every flag exists because an AI agent will call it thousands of times a day." Source: README, 2026-06-01
  • Dual interface from one spec. Same internal/client, internal/store, and auth power both the CLI (shell agents) and the MCP server (IDE agents). Zero code duplication. See MCP as the Integration Standard for the CLI-vs-MCP tradeoff. Source: README, 2026-06-01
  • Verified, not vibes. Four mechanical gates before ship: two-tier scorecard (infrastructure + domain correctness, Grade A = 85+), structural dogfood, proof-of-behavior (path/flag/pipeline/auth proofs), and a read-only live API smoke test.

The Non-Obvious Insight (NOI)

The creative DNA of every generated CLI: a one-sentence reframe of what an API actually is. "Discord isn't a chat app - it's a searchable knowledge base." "Linear isn't an issue tracker - it's a team behavior observatory." "Stripe isn't a payment processor - it's a business health monitor." Phase 0 cannot complete without an NOI; if the LLM can't write one, the research wasn't deep enough. Source: README "The non-obvious insight," 2026-06-01

The Library

Published CLIs live in the Printing Press Library (17 categories, browsable at printingpress.dev, most with full MCP servers): espn-pp-cli, flightgoat-pp-cli, linear-pp-cli, kalshi-pp-cli, recipe-goat-pp-cli, and dozens more across Commerce (21), Developer Tools (23), Cloud, Devices, Travel, Media, CRM. Browse and install community CLIs without printing your own. Source: printingpress.dev, README Library, 2026-06-01

Install

# 1. Binary (needs Go 1.26.3+)
go install github.com/mvanhorn/cli-printing-press/v4/cmd/printing-press@latest
# 2. Skills (recommended: clone for bleeding edge; git pull = update)
git clone https://github.com/mvanhorn/cli-printing-press.git
claude --plugin-dir .            # load skills; -w for an isolated worktree
# ...or skills-only via Vercel's open-agent-skills:
npx skills add mvanhorn/cli-printing-press/skills -g -a claude-code -y

Then: /printing-press Notion (by name), /printing-press https://postman.com/explore (sniff a site), /printing-press HubSpot codex (offload Phase 3 to Codex CLI, ~60% fewer Opus tokens). printing-press auth doctor reports which printed-CLI env vars are set/missing. Source: README Install + Codex mode, 2026-06-01

Why this is enforced for Kevin's agents

PrintingPress is the agent-native service-access layer: when an agent needs to touch an API/app/site that Kevin hits repeatedly, a printed -pp-cli beats raw HTTP and beats a generic OpenAPI→MCP wrapper (100x fewer tokens than MCP tool defs, offline SQLite, compound queries). Printing one when none exists is the No One-Off Work rule applied to integrations. Routing lives in Agent-Native CLIs and config/cursor/rules/agent-native-cli.mdc. Auth for printed CLIs on a headless/second Mac is handled by Agent Cookie - Session State Sync for the Agent's Second Mac (the secrets bus reads <cli> tokens). Source: User directive, 2026-06-01

Limitations

Requires Go 1.26.3+ and Claude Code (no standalone distribution). Generated CLIs are domain-shaped power-user surfaces, not full vendor-CLI replacements. Browser-sniff needs a manual capture (point a browser or import a HAR; it doesn't crawl autonomously). Live verify is read-only (GET only, never mutates). Source: README Limitations, 2026-06-01


Timeline