Skip to content

pscatlabs/pscat

v0.6.1MIT OR Apache-2.0

PostScript rendering, generative art and paper-ready charts with the pscat interpreter: three skills plus the pscat-mcp server. Requires pscat installed separately.

pscat plugin for Claude Code and Codex

Render, preview and debug PostScript, make generative art, and draw paper-ready charts from Claude Code or Codex, with the pscat PostScript interpreter. The plugin bundles:

  • Three skills: pscat (the tool reference: render to PNG/SVG/PDF, debug, lint, seed sweeps, handwritten notes, typed letters and memos, photo-to-engraving), psart (the render-look-refine loop for generative art, painting, dry media, chalkboard maths and style packs) and psviz (function plots and bar/line/area/scatter/pie charts for papers).
  • The pscat-mcp server, which gives the agent four tools: render_postscript (pages come back as images the agent can look at), eval_postscript, handwrite and describe_art_capabilities.

Requirements: install pscat first

The plugin does not ship binaries. It runs the pscat and pscat-mcp you have installed, found on your PATH. Either:

cargo install pscat

or download a release archive from https://github.com/PSCatLabs/pscat/releases and put pscat and pscat-mcp on your PATH. Check with pscat --help.

If they are missing, the plugin still installs and the skills still load, but the MCP server cannot start. A SessionStart hook (hooks/hooks.json, read by both Claude Code and Codex) then starts each session with a message saying pscat/pscat-mcp was not found and how to install it. In Claude Code, /mcp lists plugin:pscat:pscat as failed. Install pscat and restart your agent.

Install in Claude Code

In Claude Code:

/plugin marketplace add PSCatLabs/pscat
/plugin install pscat@pscat

On Claude Code 2.1.275 or later, one line does both:

/plugin install pscat --marketplace PSCatLabs/pscat

From a shell, the same thing is claude plugin marketplace add PSCatLabs/pscat and then claude plugin install pscat@pscat. Restart Claude Code (or run /reload-plugins) to load it.

Adding the marketplace clones the repository (about 250 MB on disk, fonts and gallery included); only the plugin itself (under 100 KB) is copied into the plugin cache. A sparse clone fetches just the two directories the plugin needs (under 1 MB): claude plugin marketplace add PSCatLabs/pscat --sparse .claude-plugin plugin.

From a checkout, claude plugin marketplace add /path/to/pscat works the same way.

Already registered pscat-mcp by hand? If you ran claude mcp add pscat -- pscat-mcp before, remove it (claude mcp remove pscat) so the tools are not listed twice.

Install in Codex

From a shell (Codex CLI 0.163 or later):

codex plugin marketplace add PSCatLabs/pscat
codex plugin add pscat@pscat

The first command reads the Codex marketplace in .agents/plugins/marketplace.json; the second copies plugin/ (under 100 KB) into ~/.codex/plugins/cache/pscat/pscat/<version>/. Start a new Codex session and the skills appear as pscat:pscat, pscat:psart and pscat:psviz, with the pscat MCP server's four tools. Adding the marketplace clones the whole repository (about 360 MB on disk); a sparse clone of the two directories the plugin needs is under 2 MB: codex plugin marketplace add PSCatLabs/pscat --sparse .agents --sparse plugin. For a new release, codex plugin marketplace upgrade pscat refreshes the marketplace and codex plugin add pscat@pscat installs the new version (untested until the next release ships).

Depending on your approval settings, Codex asks before it calls an MCP tool (a non-interactive codex exec with approvals off refuses the call). Codex runs a plugin's hooks only after you trust them, so the missing-pscat message needs one review in /hooks; without it a missing pscat-mcp shows up only as the server's tools being absent.

Already registered pscat-mcp by hand? If you ran codex mcp add pscat -- pscat-mcp, remove it (codex mcp remove pscat).

Platforms

macOS and Linux are tested; Windows is not. The plugin directory has no symbolic links, so a Windows checkout no longer loses the skills, but the missing-pscat hook is a POSIX sh command and needs a POSIX shell to run (#633).

Try it

  • "Render a PostScript poster of a spiral galaxy and show me the result."
  • "Write me a handwritten thank-you note to Sam, on lined paper."
  • "Make a bar chart of these quarterly numbers for my paper, as a PDF: Q1 12, Q2 18, Q3 15, Q4 22."
  • "This .ps file draws a blank page. Why?"
  • "Paint an autumn landscape in oil with a palette knife."
  • "Type this memo on a typewriter and make it look like a declassified document."
  • "What fonts and palettes does pscat have?"

Privacy

Everything runs on your machine. The skills are text; the MCP server runs your local pscat, which reads and writes only local files and makes no network requests. The one exception is pscat fonts install, which you run yourself to download optional font packs from this project's GitHub releases. The plugin collects nothing and sends nothing anywhere.

The MCP tools run arbitrary PostScript as you, so a program can read any file you can read; writes are confined to the project directory. See SECURITY.md and the agents guide for the server's limits and options.

Versions

The plugin's version is pscat's version: plugin/.claude-plugin/plugin.json (Claude Code) and plugin/plugin.json (Codex) carry the crate version, and the release pipeline bumps them together (scripts/plugin_check.py fails CI if any differ). Use the plugin with a pscat of the same version; pscat-mcp --version prints yours. /plugin update pscat@pscat picks up a new release in Claude Code; for Codex, see above.

Layout

One directory, plugin/, is the plugin for both agents. It holds the skills as real files in skills/ (the repository's top-level skills is a symlink to plugin/skills, so there is one copy of the text), the shared hooks/hooks.json, Claude Code's .claude-plugin/plugin.json (which declares the MCP server inline), and Codex's portable plugin.json and mcp.json. Each agent ignores the other's files.