mcp-print
Professional print & color workflow tools for AI assistants
CMYK/RGB conversion • Ink & cost estimation • ICC profiles • Spot color separation • Barcode coverage • Delta E • Paper weights • Preflight checks • Substrate simulation • Imposition • Booklet & spine calculation • Lab conversion • CIEDE2000 • TAC/GCR • Dot gain compensation • PDF preflight • Job quoting • Your own local color palette
Works 100% offline — no API keys needed — no bundled color library
Install • Configure • Local palette • Tools • Examples • Contributing
Backed by optiraj.com — SaaS for print professionals
Who is this for?
| Role | Use case |
|---|---|
| Print designers | Convert between CMYK, RGB, HEX, and Lab without leaving your editor |
| Prepress engineers | Estimate ink costs, verify color accuracy (Delta E), analyze ICC profiles, run preflight checks |
| Packaging teams | Convert paper weights, separate spot vs process colors, cost entire print runs, simulate substrate shifts |
| Brand managers | Find the closest entry in your own color palette to any HEX or CMYK value |
Install
pip install mcp-print
Requires Python 3.10+. Zero external dependencies beyond the MCP SDK.
Configure with Claude Code
Add to your Claude Code MCP config (~/.claude/settings.json or project .mcp.json):
{
"mcpServers": {
"print": {
"command": "python",
"args": ["-m", "mcp_print"]
}
}
}
Restart Claude Code — all twenty tools will be available immediately. Palette tools additionally need a local palette file; without one they return an error and every other tool keeps working.
Local color palette
mcp-print does not ship or download any color library. palette_lookup_tool, palette_search_tool, and spot_color_separator_tool work on a JSON file that you provide and point to explicitly:
{
"mcpServers": {
"print": {
"command": "python",
"args": ["-m", "mcp_print"],
"env": { "MCP_PRINT_PALETTE_PATH": "/home/me/.config/mcp-print/studio.palette.json" }
}
}
}
Use an absolute path (relative paths resolve against the server's working directory; ~ is expanded). The file is re-read automatically when it changes.
Schema
{
"palette": "Example synthetic palette",
"colors": [
{ "name": "Harbor Blue", "c": 88, "m": 42, "y": 8, "k": 4 },
{ "name": "Moss Green", "c": 55, "m": 15, "y": 85, "k": 20 },
{ "name": "Clay Orange", "c": 5, "m": 60, "y": 85, "k": 5 }
]
}
| Field | Rules |
|---|---|
palette |
Optional label, echoed in results |
colors |
Required, non-empty list |
colors[].name |
Required, non-empty string (max 200 chars), unique ignoring case and repeated whitespace |
colors[].c/m/y/k |
Required JSON numbers from 0 to 100. Booleans, strings, NaN, Infinity, and out-of-range values are rejected |
Other fields are rejected rather than silently ignored. The file must be UTF-8 (a BOM is accepted) and at most 10 MB. A synthetic sample lives in examples/example-palette.json.
Behavior and limits
- No palette configured, missing file, invalid JSON, empty list, or invalid entry → the palette tools return an
errorexplaining what to fix (entry index and field, without echoing your values). The server still starts and all other tools work. - Names are used exactly as you wrote them. Lookup ignores case and extra whitespace only; no brand prefixes or finish suffixes are added or guessed. Close names are returned as
suggestions, never as a match. - Distances are approximate. CMYK is converted to sRGB and Lab with simple formulas and no ICC profile, then compared with CIEDE2000. Results indicate similarity within your palette — they are not official catalog values, not a measure of print accuracy, and not a guarantee of how a color will print.
- Your palette stays local. It is read only from the path you configure, never logged, bundled, uploaded, or exposed as an MCP resource.
*.palette.jsonfiles andpalettes/directories are git-ignored in this repo; keep palette files outside the project anyway. - Rights are yours to check. Palette files are subject to their own terms of use. Pointing mcp-print at a file does not make its use licensed or appropriate; make sure you are entitled to use the data you load.
Tools
Color & Palette
| Tool | Description |
|---|---|
palette_lookup_tool |
Look up a color by name in your local palette (case/whitespace-insensitive, names kept as written) |
palette_search_tool |
Find the closest entries in your local palette to a HEX or CMYK value (approximate CIEDE2000) |
cmyk_to_rgb_tool |
Convert CMYK values (0-100) to RGB (0-255) + HEX |
rgb_to_cmyk_tool |
Convert RGB (0-255) or HEX to CMYK values (0-100) |
color_delta_e_tool |
Calculate Delta E (CIEDE2000 or CIE76) between two CMYK colors with quality interpretation |
lab_convert_tool |
Convert between CIELAB (spectrophotometer readings), CMYK, RGB, and HEX |
spot_color_separator_tool |
Report how close each design color is to your local palette (within/beyond a Delta E threshold) — a similarity report, not a spot-vs-process decision |
Print Production
| Tool | Description |
|---|---|
ink_consumption_tool |
Estimate ink grams/kg and cost for a print run (offset, flexo, gravure, screen, digital) |
print_cost_estimator_tool |
Full job cost breakdown: ink + plates + makeready + run cost |
barcode_ink_coverage_tool |
Ink coverage % for Code 128, EAN-13, QR, and Data Matrix barcodes |
preflight_check_tool |
Pre-press file validation — checks color mode, resolution, bleed, fonts, ink coverage, and transparency |
substrate_simulator_tool |
Simulate CMYK color shifts on different paper substrates (dot gain, absorption, tint) |
imposition_calculator_tool |
N-up imposition — how many pieces fit on a press sheet, sheets needed, utilization % |
booklet_calculator_tool |
Signature count, page rounding, and spine thickness for saddle-stitch or perfect-bound booklets |
dot_gain_compensation_tool |
File CMYK values that hit target tints on press — inverse of substrate simulation |
ink_limit_check_tool |
Total ink coverage (TAC) check with automatic GCR reduction |
full_job_quote_tool |
Imposition + sheet-based costing in one call, with local prices in any currency |
pdf_preflight_tool |
Preflight a real PDF file: trim/bleed boxes, font embedding, image color spaces (pip install mcp-print[pdf]) |
Utilities
| Tool | Description |
|---|---|
icc_profile_info_tool |
Parse ICC/ICM profile metadata (color space, device class, version, PCS) from any .icc file |
paper_weight_converter_tool |
Convert between GSM, lb text, and lb cover |
Usage Examples
Once configured, just ask Claude naturally:
Palette Lookup
"What are the CMYK values of Harbor Blue in my palette?"
With examples/example-palette.json configured:
{
"color": { "name": "Harbor Blue", "c": 88, "m": 42, "y": 8, "k": 4, "hex": "#1D8EE1" },
"source": "user_palette",
"palette": "Example synthetic palette",
"note": "Values come from your local palette file. ..."
}
Without a configured palette the tool returns {"error": "No color palette configured. Set MCP_PRINT_PALETTE_PATH ..."}.
Palette Search
"Which of my palette colors are closest to #2A8FD8?"
{
"matches": [
{ "name": "Harbor Blue", "c": 88, "m": 42, "y": 8, "k": 4, "hex": "#1D8EE1", "delta_e": 1.12 },
{ "name": "Charcoal", "c": 60, "m": 50, "y": 45, "k": 75, "hex": "#1A2023", "delta_e": 41.77 }
],
"search_type": "hex #2A8FD8",
"delta_e_method": "ciede2000",
"source": "user_palette",
"palette": "Example synthetic palette"
}
Color Conversion
"Convert CMYK 100/44/0/0 to RGB"
{ "r": 0, "g": 143, "b": 255, "hex": "#008FFF" }
Ink Estimation
"How much ink for 10,000 A4 flyers at 35% coverage on offset?"
{ "ink_grams": 327.44, "ink_kg": 0.3274, "cost_estimate_usd": 8.19 }
Full Print Job Costing
"Cost estimate: 5,000 A4 flyers, 4-color offset, 120gsm, double-sided"
{
"total_cost": 628.14,
"cost_per_unit": 0.1256,
"currency": "USD",
"breakdown": {
"ink": 11.34,
"plates": 280.00,
"makeready": 200.00,
"run_cost": 136.80,
"paper": 0.0
}
}
Prices default to USD industry averages — pass your own ink/plate/makeready/run/paper prices in any currency for a localized quote.
Color Matching QC
"Compare brand blue (100/72/0/18) vs proof (98/70/2/20) — is the Delta E acceptable?"
{ "delta_e": 3.41, "interpretation": "fair — noticeable difference" }
| Delta E | Quality |
|---|---|
| < 1 | Excellent — imperceptible |
| 1 - 3 | Good — barely perceptible |
| 3 - 6 | Fair — noticeable |
| > 6 | Poor — obvious difference |
Palette Proximity (spot color separator)
"How close are these design colors to my palette?"
{
"within_threshold": [
{ "color": { "c": 86, "m": 40, "y": 10, "k": 5 }, "hex": "#2291DA",
"nearest_palette_color": "Harbor Blue", "nearest_palette_cmyk": { "c": 88, "m": 42, "y": 8, "k": 4 }, "delta_e": 1.79 }
],
"beyond_threshold": [
{ "color": { "c": 0, "m": 100, "y": 0, "k": 0 }, "hex": "#FF00FF",
"nearest_palette_color": "Charcoal", "nearest_palette_cmyk": { "c": 60, "m": 50, "y": 45, "k": 75 }, "delta_e": 44.4 }
],
"threshold": 5.0,
"delta_e_method": "ciede2000",
"summary": "Compared 2 colors with 5 palette entries (Delta E ciede2000, threshold 5.0): 1 within threshold, 1 beyond."
}
Being close to a palette color does not by itself mean a spot ink would be more accurate or more suitable — that depends on ink availability, press setup, substrate, cost, brand requirements, and measured proofs.
ICC Profile Inspection
"What color space does this ICC profile use?"
{
"profile_name": "ISOcoated_v2",
"color_space": "CMYK",
"device_class": "Output (Printer)",
"version": "2.4.0",
"pcs": "XYZ"
}
Barcode Ink Coverage
"Ink coverage for an EAN-13 barcode at 37mm x 26mm?"
{
"coverage_percent": 52.0,
"recommended_ink": "Process Black (K: 100)",
"print_method_suggestion": "offset — good resolution for medium modules"
}
Paper Weight Conversion
"What's 80 lb text in GSM?"
{ "value": 118.42, "from_unit": "lb_text", "to_unit": "gsm" }
Preflight Check
"Validate my file for offset printing: CMYK, 300 DPI, 3mm bleed, fonts embedded"
{
"status": "pass",
"checks": [
{ "name": "color_mode", "status": "pass", "message": "CMYK is correct for offset." },
{ "name": "resolution", "status": "pass", "message": "300 DPI meets the minimum of 300 DPI for offset." },
{ "name": "bleed", "status": "pass", "message": "3.0 mm bleed meets the 3.0 mm minimum for offset." },
{ "name": "fonts", "status": "pass", "message": "All fonts are embedded." },
{ "name": "ink_coverage", "status": "pass", "message": "Total ink coverage 280% is within safe limits." },
{ "name": "transparency", "status": "pass", "message": "No transparency detected." }
],
"summary": "6 passed, 0 warnings, 0 failed out of 6 checks.",
"recommendation": "File is ready for production."
}
Checks color mode, resolution, bleed, font embedding, total ink coverage, and transparency against the target print method (offset, digital, flexo, gravure, screen).
| Check | Fail | Warning |
|---|---|---|
| Color mode | RGB/spot for offset/flexo/gravure/screen | RGB for digital |
| Resolution | Below 75% of method minimum | Below method minimum |
| Bleed | No bleed | Below method minimum |
| Fonts | Not embedded | — |
| Ink coverage | > 340% | > 300% |
| Transparency | — | Present (needs flattening) |
Substrate Simulation
"How will CMYK 50/30/20/10 look on newsprint vs glossy coated?"
{
"original": { "c": 50, "m": 30, "y": 20, "k": 10, "hex": "#73A1B8" },
"simulated": { "c": 57.5, "m": 38.3, "y": 29.8, "k": 31.9, "hex": "#4A6B7A" },
"substrate": "newsprint",
"print_method": "offset",
"adjustments": { "dot_gain_applied": 30, "absorption_k_added": 16.2 },
"delta_e_from_original": 21.11,
"warning": "Severe color shift — this substrate may not be suitable for color-critical work."
}
Six substrate profiles with different dot gain, absorption, and paper tint characteristics:
| Substrate | Dot gain (offset) | Tint | Typical use |
|---|---|---|---|
glossy_coated |
12% | None | Magazines, brochures |
matte_coated |
18% | Slight warm | Art books, reports |
uncoated |
22% | Warm | Letterheads, books |
newsprint |
30% | Yellow/gray | Newspapers, flyers |
kraft |
25% | Strong brown | Packaging, bags |
recycled |
25% | Slight gray | Eco-friendly prints |
Imposition (N-up)
"How many A4 flyers fit on a 70x100 sheet, and how many sheets for 10,000?"
{
"ups_per_sheet": 9,
"layout": "3 x 3",
"orientation": "normal",
"sheets_needed": 1112,
"sheets_with_waste": 1168,
"sheet_utilization_percent": 84.1
}
Accounts for bleed, cutting gaps, and the gripper margin; tries both piece orientations and picks the best.
Booklet & Spine Calculation
"48-page booklet on 90gsm uncoated with a 300gsm cover — signatures and spine?"
{
"total_pages": 48,
"signatures": 3,
"total_sheets": 12,
"spine_thickness_mm": 3.24,
"binding": "saddle_stitch",
"binding_note": "Suitable for saddle stitching."
}
Rounds pages to a multiple of 4, warns when the page count doesn't suit the chosen binding (saddle stitch > 64 pages, perfect bound < 3 mm spine).
Migrating from 0.5.x
The bundled Pantone table and its generator script were removed because their source and redistribution rights could not be verified. This is a breaking change:
| Before (≤ 0.5.x) | Now |
|---|---|
pantone_to_cmyk_tool(pantone_name) |
palette_lookup_tool(name) — exact (case/whitespace-insensitive) name from your palette; no Pantone prefix or C/U/M variants are generated |
pantone_search_tool(...) |
palette_search_tool(...) — same inputs, ranked by CIEDE2000, adds delta_e per match |
spot_color_separator_tool → spot_colors / process_colors |
within_threshold / beyond_threshold |
nearest_pantone |
nearest_palette_color (+ nearest_palette_cmyk) |
reason / reasoning |
summary + note; no spot/process recommendation is made |
Resource mcp-print://pantone-database |
Removed, with no replacement (palettes are never exposed in bulk) |
Python: colors.pantone_to_cmyk, colors.pantone_search |
palette.palette_lookup, palette.palette_search |
All palette features now require MCP_PRINT_PALETTE_PATH. The distance metric changed from CIE76 to CIEDE2000, so the same threshold groups colors differently than before. No deprecated aliases are kept.
Development
git clone https://github.com/kcgdz/mcp-print.git
cd mcp-print
pip install -e .
pip install pytest
pytest tests/ -v
235 passed
Acknowledgements
Development is supported by Optiraj — a SaaS platform for print professionals. Optiraj sponsors open-source tooling that makes professional print knowledge freely accessible to the community.
License
mcp-print's code is released under the MIT License. Color palettes you load are not part of mcp-print and remain subject to their own terms of use.
Metadata
Release files for mcp-print 0.6.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mcp_print-0.6.0.tar.gz | 54.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mcp_print-0.6.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 104.1 kB
Release files / mcp_print-0.6.0.tar.gz
| Download URL | mcp_print-0.6.0.tar.gz |
|---|---|
| Size | 54.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d7eb62ff05b90fb2d3925108aea45531f694e556923b841050c10645a259a289
|
|
BLAKE2b-256 checksum How to use checksums |
db295221aa81964755f161b902cdd7f7fcf260c4b5a1a72921f05f19a4979497
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.
Transparency logRelease files / mcp_print-0.6.0-py3-none-any.whl
| Download URL | mcp_print-0.6.0-py3-none-any.whl |
|---|---|
| Size | 49.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
740cfd17f93ee7040416aa1ee99532cfe210ab6123cb30679592db79b8aa49bb
|
|
BLAKE2b-256 checksum How to use checksums |
8e82bce8cdfb6a26781392ba2678161843f8dd245113cb7de920c4e17072e613
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.
Transparency log