PostScript MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PSMCP_DATA_DIR | No | Location of operators.json and pslib_index.json. | ./data |
| PSMCP_CORPUS_DIR | No | Location of the search corpus. | ./corpus |
| PSMCP_OUTPUT_DIR | No | Where rendered files are written. | temp dir |
| PSMCP_GHOSTSCRIPT | No | Path to the gs binary. | auto-detected |
| PSMCP_LIBRARY_DIR | No | Where your reference PDFs / PSlib sources live (for ingest). | ./library |
| PSMCP_RENDER_TIMEOUT | No | Ghostscript wall-clock limit (seconds). | 30 |
| PSMCP_MAX_SOURCE_BYTES | No | Max program size accepted. | 4194304 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| validate_postscriptA | Interpret a PostScript/EPS program WITHOUT rasterising and report errors. This is the fast self-check to run before presenting any PostScript. It uses Ghostscript's bbox device, so it catches real interpreter errors (undefined names, stack underflow, type errors, unbalanced save/restore) and returns the computed bounding box — useful for setting an EPS %%BoundingBox. Provide EITHER Returns: {ok, diagnostics[{error, offending_command, message, is_postscript_error}], bbox, hires_bbox, hint, ghostscript_stderr}. |
| render_postscriptA | Render a PostScript/EPS program to a PDF, PNG or SVG file.
Provide EITHER |
| lookup_operatorA | Return the exact PLRM definition of a PostScript operator. Gives the stack signature (operands operator results), a summary, the LanguageLevel it requires, and the errors it can raise. Use this to get operand order and types right instead of guessing. Example: lookup_operator("arc") → signature "x y r ang1 ang2 arc -", category "path", level 1. |
| search_operatorsA | Search PostScript operators by keyword or browse a category. Pass a |
| get_pslib_fragmentA | Return a PSlib procedure by name, with its stack signature and source. PSlib is Kees van der Laan's library (colours, geometry such as circle
inversion and Apollonius, Lauwerier fractals, Blue-Book text/graphics
helpers). Reuse these vetted procedures instead of reinventing them.
The |
| search_pslibA | Search or browse PSlib procedures. Pass a |
| search_referenceA | Search the PostScript reference corpus and return cited passages. Covers whatever was ingested: the PLRM, the Blue and Green books, the
DSC and EPS specifications, and the tutorials. Optionally restrict to one
document with |
| postscript_capabilitiesA | Report what this server can currently do (for setup/debugging). Tells you whether Ghostscript is available for rendering, how many operators are loaded, whether the PSlib index and reference corpus have been built, and how to build them if not. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 8 tools
Each tool targets a distinct job: exact operator definitions vs operator search, validation vs rendering, PSlib retrieval vs searching, and reference/capability lookups. Even the paired search/get tools are clearly separated by role.
Most tools follow a consistent verb_noun pattern (lookup_operator, validate_postscript, search_operators). The only deviation is postscript_capabilities, which lacks a verb; otherwise the naming is uniform and predictable.
Eight tools is an appropriate size for a PostScript assistant: each one covers a necessary stage of authoring, checking, rendering, and reference lookup without redundancy. The count feels intentional rather than padded.
The surface covers a full workflow: discover operators, validate code, render output, reuse library procedures, and consult authoritative references. There are no dead ends or obvious missing operations for the stated domain.