Skip to main content
Glama
glyphs-mcp

glyphs-mcp

by nmassi

MCP bridge for AI-assisted type design in GlyphsApp.

Lets Claude, Cursor, or any MCP client read and write font data directly in GlyphsApp — bidirectional, real-time, live in the editor.

MCP Client  ←(stdio/MCP)→  MCP Server  ←(HTTP/localhost)→  GlyphsApp Plugin

Requirements

  • Glyphs 3 or 4

  • An MCP client

  • Python 3.10+ with uv (recommended) or pip

  • glyphsets and shaperglot (installed automatically with the MCP package)

Related MCP server: FontLab MCP Server

Installation

1. Install the GlyphsApp plugin

From Plugin Manager (recommended): Open GlyphsApp, go to Window > Plugin Manager, search for MCP, and click Install.

Manual install: Download GlyphsMCP.glyphsPlugin.zip from the latest release, unzip, and double-click to install.

Restart GlyphsApp. You should see GlyphsMCP under the Window menu.

2. Connect your MCP client

Open Window > GlyphsMCP > Connect and choose your client:

  • Claude Code — registers a user-scoped stdio server with the official claude CLI.

  • Codex / ChatGPT Desktop — registers the server with codex; both apps share this configuration.

  • OpenCode — adds the server to OpenCode's global configuration; restart OpenCode afterward.

  • Visual Studio Code — adds the server to your active user profile with code --add-mcp.

  • Cursor — safely merges the server into ~/.cursor/mcp.json and backs up an existing file first.

  • Other MCP Client — copies a portable mcpServers JSON block to the clipboard.

Glyphs 4 registers as glyphs-mcp and Glyphs 3 as glyphs-mcp-3, each using the port configured in that app, so both can stay registered without collision. If a client CLI is not available to GlyphsApp, the equivalent Terminal command is copied to the clipboard instead.

For manual setup, use the endpoint shown when starting the GlyphsMCP server. For example:

{
  "mcpServers": {
    "glyphs-mcp": {
      "command": "uvx",
      "args": ["glyphs-mcp"],
      "env": {
        "GLYPHS_URL": "http://127.0.0.1:7746"
      }
    }
  }
}

Claude Desktop now recommends Desktop Extensions (.mcpb) for local MCP servers. A GlyphsMCP Desktop Extension is planned separately and is not installed by this menu yet.

3. Use it

Open a font in GlyphsApp, then ask your AI assistant:

"Run a full color audit on my font and tell me which glyphs are inconsistent"

"Compare the stems across all my lowercase letters"

"Check if my figures are consistent with my letters"

"Make the R 20% wider and harmonize the curves"

"Analize metrics on lowercases"

Tools

Read

Tool

Description

get_font_info

Font family name, UPM, glyph count, masters, axes, metrics, instances

list_glyphs

Glyph metadata, optionally filtered by category and capped by limit

get_glyph

Full glyph data: paths, components, anchors, sidebearings for all layers

get_glyph_svg

Glyph rendered as SVG markup

get_selection

Current editor selection: active glyph, layer, selected paths/nodes

get_masters

All masters with metrics and axis positions

get_kerning

Kerning pairs filtered by master_id/left, optionally capped by limit

get_features

OpenType feature code

Write

Tool

Description

create_glyph

Create a new glyph with optional width, unicode, and initial paths

set_glyph_paths

Replace all paths on a glyph's layer

set_glyph_width

Set advance width

set_glyph_color

Set color label (0-11)

set_glyph_unicode

Assign or clear a unicode value

rename_glyph

Rename a glyph

duplicate_glyph

Copy a glyph with all layers to a new name

delete_glyph

Delete a glyph

set_kerning_pair

Add or modify a kerning pair

delete_kerning_pair

Remove a kerning pair

set_feature_code

Create or update an OpenType feature

generate_box_drawing

Generate U+2500–U+259F outlines across masters; can overwrite drawings

export_font

Export OTF, TTF, WOFF, WOFF2, and variable TTF beside the saved source

Analysis

Tool

Description

measure_stems

Measure stem thicknesses via perpendicular ray-casting

compare_stems

Compare stems across glyphs using industry patterns

get_stem_targets

Designer's intended stem values from Dimensions palette

measure_color

Measure ink density for a single glyph

compare_color

Compare ink density across glyphs

audit_font_color

Full font color audit across all letters

check_overshoots

Overshoot consistency at baseline, x-height, cap-height

compare_proportions

Width ratios, related-form groups, ordering constraints

check_diagonal_weights

Diagonal stem thickness vs straight reference

check_junctions

Stem thinning at arch/bowl junctions

check_related_forms

Cross-validate figures and letters (0/O, 6/9, 8/S, 3/B)

check_punctuation

Mirrored pair widths, dash ratios, related punctuation

check_compatibility

Master compatibility: paths, nodes, components, anchors

analyze_kerning

Kerning quality: cross-master gaps, orphans, outliers

analyze_spacing

Spacing quality: sidebearing groups, symmetry, drift

analyze_kerning_groups

Analyze or assign kerning groups, with dry-run/overwrite control

auto_kern

Preview or apply optical-area kerning to critical, automatic, or explicit pairs

check_glyphset_coverage

Check Google Fonts glyphsets and optionally add missing empty glyphs

check_language_support

Export a temporary instance and evaluate language support with Shaperglot

review_production

Run a 44-item production-readiness review

check_font_name

Screen a proposed family name against Fontdata; not legal clearance

Analysis tools never change glyph colors by default. Pass mark_glyphs=True only when you explicitly want verdict labels in GlyphsApp: red = inconsistent, orange = unreliable, yellow = warning/optical compensation, green = pass. analyze_kerning, analyze_spacing, check_compatibility, and compare_stems also point to matching workflow recipes for broader checks.

RMX Tools

Requires RMX Tools for full functionality. rmx_scale now uses real RMX processing, accepts one value or a per-master list for scale parameters, and defaults allow_fallback=False; native affine fallback must be explicitly enabled. rmx_tune delegates to the loaded RMX Tuner and supports blend and all_masters.

Tool

Description

rmx_harmonize

Optimize bezier curves

rmx_scale

Scale by percentage with stroke weight compensation

rmx_tune

Adjust weight, width, height, or slant

rmx_monospace

Adjust a glyph to a fixed advance width

rmx_batch

Apply any RMX filter to multiple glyphs

smart_scale

Scale multiple glyphs with measured stem compensation, optional backups

Recipes

Bundled markdown recipes provide ordered workflows for consistency audits, spacing, kerning, master compatibility, proportional scaling, dated-layer cleanup, and Glyphs plugin or script creation.

Tool

Description

list_recipes

List bundled and user-created recipes

get_recipe

Read a complete recipe

get_recipe_step

Read one numbered step with its next-step directive

create_recipe

Write a recipe markdown file; overwrite is opt-in

delete_recipe

Permanently delete a recipe markdown file

Recipe creation and deletion modify files in the installed plugin's Resources/recipes directory.

Recipes are also exposed as MCP prompts, so clients that surface prompts as commands get a one-command entry point. The prompt name is the recipe name. With the server registered as glyphs-mcp, a recipe runs as /glyphs-mcp:<recipe> or /mcp__glyphs-mcp__<recipe>:

Recipe

Command (Claude Code)

What it does

audit_consistency

/glyphs-mcp:audit_consistency

Full font consistency audit: stems, color, proportions, spacing

spacing_workflow

/glyphs-mcp:spacing_workflow

Systematic spacing pass following Cheng/Briem/Ruder

kerning_from_scratch

/glyphs-mcp:kerning_from_scratch

Kerning from scratch: groups, critical pairs, verification

scale_proportions

/glyphs-mcp:scale_proportions

Scale glyphs with automatic stem-weight compensation

master_compatibility

/glyphs-mcp:master_compatibility

Pre-export master compatibility and metrics check

cleanup_dated_layers

/glyphs-mcp:cleanup_dated_layers

Safely remove timestamped backup layers

create_glyphs_plugin

/glyphs-mcp:create_glyphs_plugin

Create a GlyphsApp plugin bundle

create_glyphs_script

/glyphs-mcp:create_glyphs_script

Create a GlyphsApp Script-menu script

recipes

/glyphs-mcp:recipes

List the available recipes, or start one by name

These forms are what Claude Code uses. On Glyphs 3 the server prefix is glyphs-mcp-3 (for example /glyphs-mcp-3:audit_consistency), so both apps can be registered side by side. MCP-prompt support varies by client: if yours does not surface prompts as commands, ask for the recipe by name or use list_recipes / get_recipe / get_recipe_step. In opencode you can add a custom command under .opencode/commands/ (or ~/.config/opencode/commands/) that calls get_recipe_step to get a literal /create-plugin.

Advanced

Tool

Description

execute_in_glyphs

Run arbitrary Python inside GlyphsApp (disabled by default)

Multi-master support

All tools accept an optional master_id parameter. When omitted, read/write tools use the first master. Analysis tools analyze all masters and return per-master results.

Tools with side effects are explicit: kerning-group analysis can assign groups, while audit color labels require mark_glyphs=True; auto-kern can write kerning; glyphset coverage can add empty blue-labelled glyphs; box drawing creates or replaces outlines; smart scale modifies outlines and can create backup layers; recipe CRUD writes or deletes markdown files. export_font writes a new timestamped directory under export/ beside the saved source and never removes previous exports. Use dry-run/preview options where available and save the font before bulk operations.

Font export

Ask the agent to export the open font, or run the bundled CLI directly:

uvx --from glyphs-mcp export-glyphs /path/to/MyFont.glyphs

Both paths use the official glyphs-cli, installed automatically with the GlyphsMCP server package on macOS. Glyphs Plugin Manager installs only the app plugin; uvx glyphs-mcp provisions the server and export CLI on first use. Each run creates export/YYYY-MM-DD_HH-MM-SS/ beside the source, with separate otf, ttf, woff, woff2, and variable directories as applicable, plus export-report.jsonl. The MCP tool refuses to export unsaved changes unless save_before_export=True is explicitly requested. Every result includes portable exportLog and ANSI-colored exportLogAnsi variants; the calling agent must show the colored variant when its client supports terminal colors and fall back to the portable log elsewhere.

Menu

The plugin adds a GlyphsMCP submenu under Window in the menu bar:

  • Start/Stop Server — toggle the HTTP server

  • Connect — register GlyphsMCP with Claude Code, Codex/ChatGPT Desktop, OpenCode, VS Code, Cursor, or copy a generic configuration

  • Documentation — open this page in your browser

  • Allow Execute Endpoint — enable execute_in_glyphs (off by default for security)

Preferences

Key

Default

Description

com.nico.glyphs-mcp.port

7745

HTTP server port

com.nico.glyphs-mcp.autostart

true

Start server on GlyphsApp launch

com.nico.glyphs-mcp.allowExecute

false

Enable the execute endpoint

How it works

The GlyphsApp plugin runs an HTTP server on 127.0.0.1 using the configured port (7745 by default). All GlyphsApp API calls run on the main thread via a queue + NSTimer bridge for thread safety.

The MCP server is a thin translation layer — it receives MCP tool calls via stdio and forwards them to the plugin URL supplied through GLYPHS_URL.

Bundled agent skill

Python distributions include the complete skills/type-designer/ skill: a concise runtime contract plus references for general type-design workflows, typeface DNA, Glyphs 4 and scripting, safe GlyphsMCP operation, the audit contract, and curve-continuity evidence. GlyphsMCP is one execution environment within the skill, not its only subject.

The skill is not installed automatically or served live through SEP-2640 because the current Python MCP SDK does not expose that extension. Install the directory through your client's normal skill workflow. To keep this checkout as the single source of truth, link rather than copy it into each client's discovery directory:

ln -s "/path/to/glyphs-mcp/skills/type-designer" "$HOME/.codex/skills/type-designer"
ln -s "/path/to/glyphs-mcp/skills/type-designer" "$HOME/.claude/skills/type-designer"
ln -s "/path/to/glyphs-mcp/skills/type-designer" "$HOME/.config/opencode/skills/type-designer"

Every client then discovers the same physical skill through SKILL.md; no separate copies diverge.

Roadmap

  • Font proofing — Generate proof strings for spacing/kerning evaluation

  • Auto-update — Check for updates directly from the GlyphsMCP menu

  • Analytics — Optional usage telemetry to guide development priorities

License

MIT — Nicolas Massi www.nico.works

Available Tools

55 tools
analyze_kerningA

Analyze kerning quality across all masters.

RECIPE: For kerning from scratch, call get_recipe("kerning_from_scratch") first — it covers group assignment, critical pairs, and verification.

Checks for:

  • Cross-master missing pairs (pair in some masters but not all — causes interpolation jumps)

  • Cross-master sign changes (positive in one master, negative in another)

  • Outlier values (extreme kerning > 40% of UPM)

  • Redundant exceptions (glyph-level overrides that match group value — can be removed)

  • Group orphans (Letter glyphs missing kerning group assignments)

Returns a formatted markdown report without modifying glyph colors. When mark_glyphs=True, marks cross-master issues red and warnings yellow.

Args: master_id: Optional master ID (cross-master checks always run across all masters) mark_glyphs: Color glyphs by verdict only when explicitly requested

Inputs: master_id, mark_glyphs. Returns: result

analyze_kerning_groupsA

Analyze and assign kerning groups to all glyphs.

RECIPE: For a complete kerning workflow (groups → pairs → verification), call get_recipe("kerning_from_scratch") first.

Assigns correct groups to all glyphs, overwriting any existing values. Uses a five-tier resolution strategy:

  1. Dictionary lookup for ~80 base glyphs (A-Z, a-z, figures, punctuation)

  2. Dot-suffix stripping (a.ss01 → a)

  3. Component inheritance for accented/composite glyphs (Aacute → A)

  4. Unicode decomposition fallback

  5. Contour analysis fallback (ray-casting edge detection)

Group names follow professional conventions (key glyph = group name):

  • UC left: H (straight stem), O (round), A (diagonal), V, T, S, etc.

  • UC right: H (straight), O (round), D (half-round), E (horizontal), etc.

  • LC left: h (straight), o (round), v (diagonal), f, etc.

  • LC right: h (straight), n (arch), o (round), etc.

  • Figures: each gets its own group (shapes too varied)

Does not modify glyph colors by default. Set mark_glyphs=True only when the user explicitly asks to mark applied or proposed group changes.

Args: glyph_names: Optional list of glyph names (default: all Letter/Number/Punctuation glyphs) apply: If True (default), assign groups. If False, dry run only. overwrite: If True (default), overwrite existing groups. If False, only assign to empty slots. mark_glyphs: Color affected glyphs only when explicitly requested.

Inputs: apply, overwrite, glyph_names, mark_glyphs. Returns: result

analyze_spacingA

Analyze spacing quality across all masters.

RECIPE: For systematic spacing work, call get_recipe("spacing_workflow") first — it follows Cheng/Briem/Ruder methodology step by step.

Measures sidebearings and white space margins using scanline ray-casting, then checks for consistency issues:

  • Sidebearing group consistency (n-group: h,i,k,l,m,n,p,r should match; o-group: c,d,e,g,o,q)

  • Tracy/Smith per-glyph sidebearing rules (from "Designing Type" by Karen Cheng)

  • Side-type ordering (straight SB > round SB > diagonal SB)

  • Symmetric glyph check (o, O, H, I should have LSB ≈ RSB)

  • Reference ratios (n LSB / o LSB — optimal ~1.5x, acceptable 1.2–2.0)

  • Counter-based validation (n LSB should be 25–50% of n counter width)

  • Word space check (space width ≈ ¼ em ≈ width of i)

  • Cross-master spacing drift (spacing ratios should be maintained)

Does not modify glyph colors by default. When mark_glyphs=True, marks significant inconsistencies red, minor deviations yellow, and passes green.

Args: master_id: Optional master ID (empty = all masters) glyph_names: Optional list of glyphs (empty = all Letter glyphs) mark_glyphs: Color glyphs by verdict only when explicitly requested

Inputs: master_id, glyph_names, mark_glyphs. Returns: result

audit_font_colorA

Full font color audit — analyzes ALL letter glyphs grouped by category.

RECIPE: For a full consistency audit, follow get_recipe("audit_consistency").

Groups glyphs into uppercase, lowercase, and figures, then evaluates each against expected density ratios from industry patterns.

If master_id is omitted, analyzes ALL masters with worst-verdict-wins for glyph colors in GlyphsApp.

Does not modify glyph colors by default. Set mark_glyphs=True only when the user explicitly asks to mark results in GlyphsApp.

The lowercase-to-uppercase density ratio is typically 1.10-1.16 in professional fonts.

This is the comprehensive "is my font's color even?" check. Use this before final production to catch any weight inconsistencies.

Args: master_id: Optional master ID (empty = all masters) mark_glyphs: Color glyphs by verdict only when explicitly requested

Inputs: master_id, mark_glyphs. Returns: result

auto_kernA

Auto-kern glyph pairs using optical gap analysis (MB LetterKerner algorithm).

Measures the optical white area between each glyph pair using horizontal ray-casting, weighted by a trapezoidal function (full weight at baseline–xHeight, tapered in descender/ascender zones), then solves for the kern value that makes each pair's gap area match a calibration reference.

Auto-calibrates from nn (lowercase) and HH (uppercase) if no area is given.

Recommended workflow:

  1. Finalize spacing first (kerning can't fix bad spacing)

  2. Assign kerning groups: analyze_kerning_groups(apply=True)

  3. Preview: auto_kern(pairs="critical", dry_run=True)

  4. Apply critical: auto_kern(pairs="critical")

  5. Expand: auto_kern(pairs="auto") — all group combinations

  6. Verify: analyze_kerning()

Args: pairs: Pair selection mode: "critical" — ~75 essential pairs (AV, AT, To, Va, etc.) "auto" — generate representative pairs per kerning group combination "explicit" — use pairs_list pairs_list: Explicit pairs when pairs="explicit", e.g. [["A","V"],["T","o"]] area: Target gap area in units². None = auto-calibrate from nn/HH. step: Vertical sampling interval (default 5u, smaller = more precise) depth: Max probe depth per side (default 200u) factor: Optical correction factor (default 1.25, matches HT LetterSpacer) rounding: Round kern values to multiples of this (default 5) threshold: Skip kern values with abs < threshold (default 3) use_groups: Use group kerning keys (default True, strongly recommended) overwrite: Overwrite existing kerning (default False) dry_run: Preview only, don't apply (default False) master_id: Process only this master (empty = all masters)

Inputs: area, step, depth, pairs, +8 more. Returns: result

check_compatibilityA

Check master compatibility across all glyphs in the font.

RECIPE: For a complete pre-export check, call get_recipe("master_compatibility") first — it includes metrics interpolation and alignment zone verification.

Compares layers across masters for each glyph, checking:

  • Path count, node count, node types, path directions

  • Path order (spatial position must match across masters)

  • Starting node positions

  • Component count and names

  • Anchor names

Does not modify glyph colors by default. When mark_glyphs=True, marks:

  • Red (0) = incompatible (structural mismatch between masters)

  • Orange (1) = empty or missing drawing in one or more masters

  • Green (4) = fully compatible

Args: glyph_names: Optional list of glyphs to check (default: all glyphs) mark_glyphs: Color glyphs by verdict only when explicitly requested

Inputs: glyph_names, mark_glyphs. Returns: result

check_diagonal_weightsA

Check diagonal stroke weight consistency and ratio to vertical stems.

Measures perpendicular thickness of diagonal strokes (V, A, W, X, Y, Z, v, w, x, y, z, k, M, N) and checks:

  1. Related diagonal groups are consistent (V≈A≈W, v≈w≈y, etc.)

  2. Diagonal/straight ratio within professional range (typically 85-100%)

If no glyph_names provided, checks all diagonal glyphs. If master_id is omitted, analyzes ALL masters.

Does not modify glyph colors by default. When mark_glyphs=True, marks inconsistencies red, ratio warnings yellow, and passing glyphs green.

Args: glyph_names: Optional list of glyphs to check master_id: Optional master ID (empty = all masters) mark_glyphs: Color glyphs by verdict only when explicitly requested

Inputs: master_id, glyph_names, mark_glyphs. Returns: result

check_font_nameA

Screen one proposed typeface family name for known collisions.

Queries the public Fontdata Namecheck API and returns exact, close, and partial match counts, trademark information, a review status, timestamp, and a link to the full result. This is collision screening, not legal clearance: a name that is not found is not guaranteed to be available.

Args: name: Proposed typeface family name to check.

Inputs: name (required).

check_glyphset_coverageA

Check font coverage against Google Fonts glyphset definitions.

With no arguments, lists all available glyphsets. With a glyphset name, reports which glyphs are present and which are missing.

Use add_missing=True to create empty glyphs for all missing characters, ready for the designer to draw.

Args: glyphset: Glyphset name or shortcut. Examples: "GF_Latin_Core" — required for Google Fonts onboarding (324 glyphs) "GF_Latin_Plus" — extended Latin (141 additional glyphs) "latin_core" — shortcut for GF_Latin_Core "latin_plus" — shortcut for GF_Latin_Core + GF_Latin_Plus (465 total) "latin_all" — shortcut for Core + Plus + Beyond (598 total) "cyrillic_core", "greek_core", "arabic_core" — other scripts Empty string — list all available glyphsets and shortcuts add_missing: If True, create empty glyphs for all missing characters in the font. New glyphs are marked with blue color label.

Inputs: glyphset, add_missing. Returns: result

check_junctionsA

Check junction thinning consistency across related glyphs.

Measures how stems thin at arch/bowl junctions (n, m, b, d, p, q, etc.) by sweeping horizontal rays at multiple heights. Reports thinning % (100% = no thinning, 80% = stem thins to 80% at junction).

Checks consistency within groups (n≈m, b≈p, d≈q). Does NOT flag based on absolute values — thinning is design-specific. Only flags inconsistencies between related forms.

If master_id is omitted, analyzes ALL masters.

Does not modify glyph colors by default. When mark_glyphs=True, marks inconsistencies red and passing glyphs green.

Args: glyph_names: Optional list of glyphs to check (default: n,h,m,u,a,b,d,p,q) master_id: Optional master ID (empty = all masters) mark_glyphs: Color glyphs by verdict only when explicitly requested

Inputs: master_id, glyph_names, mark_glyphs. Returns: result

check_language_supportA

Check the open font's language support with Shaperglot.

Exports a temporary binary from the active Glyphs font, then runs Shaperglot against it. With no languages provided, returns the languages whose score meets support_threshold. With languages, returns per-language scores plus warnings/failures.

Args: languages: Optional language IDs or names, e.g. ["en_Latn", "Turkish", "Navajo"] instance_name: Optional Glyphs instance name to export. Empty = first exportable instance. export_format: "otf" (default) or "ttf" support_threshold: Minimum score to count a language as supported in report mode max_results: Max languages to show in report mode

Inputs: languages, max_results, export_format, instance_name, +1 more. Returns: result

check_overshootsA

Check overshoot values for round and pointed forms.

RECIPE: For a pre-export check, follow get_recipe("master_compatibility").

Round forms (O, o, C, S, etc.) should overshoot baseline and zone top by ~1-2% of zone height. Pointed forms (A, V, W) need MORE overshoot than rounds to appear optically aligned.

If no glyph_names provided, checks all known overshoot-sensitive glyphs in the font (O,C,D,G,Q,S,U,A,V,W,M,N,o,c,e,s,b,d,p,q,g,a,u,v,w,y + figures).

If master_id is omitted, analyzes ALL masters.

Does not modify glyph colors by default. When mark_glyphs=True, marks missing/excessive overshoots red and passing glyphs green.

Args: glyph_names: Optional list of glyphs to check (default: all overshoot glyphs) master_id: Optional master ID (empty = all masters) mark_glyphs: Color glyphs by verdict only when explicitly requested

Inputs: master_id, glyph_names, mark_glyphs. Returns: result

check_punctuationA

Check punctuation consistency: mirrored pairs, width matches, and ratio checks.

Based on industry patterns across professional fonts. Checks:

Width matches (should be identical/similar):

  • Mirrored pairs: parenleft/parenright, bracketleft/bracketright, braceleft/braceright, guillemotleft/guillemotright (high severity — must match)

  • Related pairs: period/comma, colon/semicolon, quotedblleft/quotedblright (medium)

Width ratios (expected relationships):

  • endash wider than hyphen (traditionally 2x)

  • emdash wider than endash (traditionally 2x)

  • quoteright similar width to comma

  • exclam narrower than question

Skips any pairs where glyphs are missing. If master_id is omitted, analyzes ALL masters.

Does not modify glyph colors by default. When mark_glyphs=True, marks mismatches red, width warnings yellow, and passing glyphs green.

Args: master_id: Optional master ID (empty = all masters) mark_glyphs: Color glyphs by verdict only when explicitly requested

Inputs: master_id, mark_glyphs. Returns: result

compare_colorA

Compare typographic color (ink density) across multiple glyphs.

RECIPE: For a full consistency audit, follow get_recipe("audit_consistency").

Finds glyphs that are visually too dark or too light compared to the group. Uses per-glyph expected density ratios from industry patterns — each glyph gets a verdict: pass, compensation, inconsistent, or unreliable.

Reference glyphs: n (lowercase), H (uppercase).

If master_id is omitted, analyzes ALL masters and returns per-master results. Glyph color in GlyphsApp = worst verdict across all masters.

Does not modify glyph colors by default. When mark_glyphs=True, marks:

  • Red (0) = inconsistent density

  • Orange (1) = unreliable measurement

  • Yellow (3) = optical compensation (expected)

  • Green (4) = pass

Args: glyph_names: Glyphs to compare master_id: Optional master ID (empty = all masters) mark_glyphs: Color glyphs by verdict only when explicitly requested

Examples: "Is the color consistent across uppercase?" -> compare_color(["H","I","M","N","O","B","D","E","F","K","L","P","R"])

Inputs: glyph_names (required), master_id, mark_glyphs. Returns: result

compare_proportionsA

Compare width proportions across glyphs within a font.

RECIPE: For a full consistency audit, follow get_recipe("audit_consistency").

Checks three things:

  1. Related-form groups: b≈d≈p≈q (mirrored), h≈n≈u (arch), O≈Q, etc.

  2. Width ordering: m>n>r, W>H>I — flags violations

  3. Industry ranges from 18 professional fonts — flags outliers

References: n for lowercase, H for uppercase/figures.

If no glyph_names provided, checks all LC + UC + figures. If master_id is omitted, analyzes ALL masters.

Does not modify glyph colors by default. When mark_glyphs=True, marks inconsistencies red, range warnings yellow, and passing glyphs green.

Args: glyph_names: Optional list of glyphs to check master_id: Optional master ID (empty = all masters) mark_glyphs: Color glyphs by verdict only when explicitly requested

Inputs: master_id, glyph_names, mark_glyphs. Returns: result

compare_stemsA

Compare stem thicknesses across multiple glyphs to find inconsistencies.

RECIPE: For a full font audit (stems + color + proportions + spacing), call get_recipe("audit_consistency") — it runs checks in dependency order.

Evaluates each glyph against industry stem patterns for optical compensation. Per-glyph verdicts:

  • pass: stem within expected tolerance (green in GlyphsApp)

  • compensation: known optical compensation like round stems, bowl mass (yellow) — only flagged if OUTSIDE the expected range

  • inconsistent: real issue, deviation exceeds industry norms (red)

  • unreliable: glyph shape can't be reliably measured (orange)

Each glyph is classified into one of 5 groups:

  • straight: pure stems (n,h,m,u,i,j,l,r / H,I,L,T,U,F,E,K,J)

  • round: pure round forms (o,c / O,C,Q)

  • mixed: stem + bowl (b,d,p,q,g,a,e,s / D,B,P,R,G)

  • diagonal: diagonal strokes (v,w,x,y,z,k / V,W,X,Y,Z,A,M,N)

  • optical/figure: special cases (t,f) and numbers (0-9)

Supports uppercase (ref: H), lowercase (ref: n), and figures (ref: H).

If master_id is omitted, analyzes ALL masters and returns per-master results. Glyph color = worst verdict across all masters. If master_id is provided, analyzes that single master only.

Does not modify glyph colors by default. When mark_glyphs=True, marks: Red=inconsistent, Orange=unreliable, Yellow=compensation, Green=pass

Args: glyph_names: List of glyphs to compare master_id: Optional master ID (empty = all masters) mark_glyphs: Color glyphs by verdict only when explicitly requested

Inputs: glyph_names (required), master_id, mark_glyphs. Returns: result

create_glyphA

Create a new glyph in the open font.

Args: glyph_name: Name for the new glyph (e.g., "a.ss01", "uni0041") width: Advance width in font units unicode_value: Optional unicode value (e.g., "0061" for 'a') paths: Optional initial paths (same format as set_glyph_paths)

Inputs: glyph_name (required), paths, width, unicode_value.

create_recipeA

Create a new workflow recipe.

Recipes are markdown files with numbered steps. Follow this format:

Recipe: My Recipe Title

Description of what this recipe does.

Steps

1. First step title

  • tool_name — what it does

  • another_tool — with parameters

2. Second step title

  • tool_name — instructions

Args: name: Snake_case identifier (e.g. 'fix_spacing_issues') content: Full markdown content of the recipe overwrite: If true, replace existing recipe with same name

Inputs: name (required), content (required), overwrite. Returns: result

delete_glyphA

Delete a glyph from the font. This cannot be undone via MCP.

Inputs: glyph_name (required).

delete_kerning_pairB

Delete a kerning pair.

Args: left: Left glyph name or group (@MMK_L_...) right: Right glyph name or group (@MMK_R_...) master_id: Optional master ID (uses first master if empty)

Inputs: left (required), right (required), master_id.

delete_recipeC

Delete a workflow recipe.

Args: name: Recipe name to delete (e.g. 'old_workflow')

Inputs: name (required). Returns: result

duplicate_glyphB

Duplicate a glyph (all layers and paths) under a new name.

Useful for creating alternates or backups before editing.

Inputs: new_name (required), glyph_name (required).

execute_in_glyphsA

Execute arbitrary Python code inside GlyphsApp.

The code runs with access to the Glyphs object and all GlyphsApp API. stdout is captured and returned. This is powerful but must be used carefully.

NOTE: This endpoint is disabled by default. The user must enable it in GlyphsApp preferences (com.nico.glyphs-mcp.allowExecute = True).

RECIPE: Do not improvise multi-step work here. To create a Glyphs plugin or script, follow get_recipe("create_glyphs_plugin") or get_recipe("create_glyphs_script"). For bulk layer cleanup, follow get_recipe("cleanup_dated_layers").

Example: execute_in_glyphs("print(Glyphs.font.familyName)")

Inputs: code (required).

export_fontA

Export the open font beside its saved source with glyphs-cli.

Creates export/YYYY-MM-DD_HH-MM-SS next to the open .glyphs or .glyphspackage source. Static instances are exported as OTF, TTF, WOFF, and WOFF2. Variable instances are exported as variable TTF files. Previous export directories are never removed or overwritten.

The response always contains portable exportLog and colored exportLogAnsi variants. The calling agent MUST show the ANSI variant when its client supports terminal colors, otherwise the portable log, after every export attempt including failures.

Args: save_before_export: Save pending changes before exporting. Defaults to False; if the document is edited, the tool asks for confirmation instead of silently saving it. timeout: Maximum seconds for each of the three export runs.

Inputs: timeout, save_before_export.

generate_box_drawingA

Generate Unicode box drawing and block element glyphs in the open font.

By default, processes U+2500–U+259F. Existing drawn glyphs are skipped unless overwrite=True. The tool draws directly in the .glyphs source across all masters, using auto-detected stem values when stroke params are left at 0.

Args: glyph_names: Optional subset to generate. Accepts glyph names, single characters, or codepoints like "U+2500". overwrite: Replace existing drawings if True. width: Force advance width for generated glyphs. 0 = auto. stroke: Light/single stroke thickness. 0 = auto. heavy_stroke: Heavy stroke thickness. 0 = auto. double_gap: Gap between double-line strokes. 0 = auto. color: Optional glyph color label for newly created glyphs.

Inputs: color, width, stroke, overwrite, +3 more.

get_featuresB

Get OpenType feature code from the font.

Inputs: no named parameters.

get_font_infoA

Get information about the currently open font in GlyphsApp.

Returns font family name, units per em, glyph count, masters, axes, metrics (ascender, descender, x-height, cap height), and instances.

Inputs: no named parameters.

get_glyphA

Get complete data for a specific glyph including all paths and metrics.

Returns all layers with: paths (nodes with x,y coordinates, type, smooth), components, anchors, width, sidebearings.

Node types: "line" (straight on-curve), "curve" (smooth on-curve), "offcurve" (cubic bezier control point). Path direction: -1 = counter-clockwise (outer contours), 1 = clockwise (inner contours/counters).

Inputs: glyph_name (required).

get_glyph_svgC

Get a glyph rendered as SVG markup.

Returns SVG with viewBox matching the glyph's metrics. Useful for seeing the glyph shape as a vector image.

Inputs: glyph_name (required), master_id.

get_kerningA

Get kerning pairs for a specific master (or first master if not specified).

Args: master_id: Master ID. Empty = first master. left: Filter by left glyph/group name. Empty = all. limit: Max pairs to return. 0 = all. Use limit=50 for large fonts.

Inputs: left, limit, master_id.

get_mastersA

Get all font masters with their metrics and axis positions.

Returns master ID, name, ascender, descender, x-height, cap-height, and axis values for each master.

Inputs: no named parameters.

get_recipeA

Get a specific workflow recipe by name.

Returns the full recipe with step-by-step instructions, plus totalSteps count. Use get_recipe_step() to read and execute one step at a time.

Args: name: Recipe name (from list_recipes, e.g. 'scale_proportions')

Inputs: name (required). Returns: result

get_recipe_stepA

Get a single step from a recipe for sequential execution.

Returns step title, content, and a MANDATORY directive field. You MUST follow the directive — it tells you exactly what to do next.

The response includes:

  • step: current step number

  • totalSteps: total steps in recipe

  • title: step title

  • content: tools to call and instructions

  • directive: MANDATORY instruction for what to do after this step

IMPORTANT: Execute ALL tools listed in the step content before proceeding. Do NOT skip steps. Do NOT combine steps. Follow the directive field.

Args: name: Recipe name (e.g. 'audit_consistency') step: Step number (1-based)

Inputs: name (required), step (required). Returns: result

get_selectionA

Get the user's current selection in GlyphsApp's editor.

Returns the active glyph name, layer, and any selected paths or nodes. Returns null selection if no tab or layer is active.

Inputs: no named parameters.

get_spacing_stringsA

Get spacing test strings for visually evaluating a glyph's spacing.

RECIPE: For systematic spacing work, follow get_recipe("spacing_workflow").

Generates canonical test strings based on industry-standard methods:

  • Three-at-a-time (OH no Type Co): glyph sandwiched between n/o or H/O

  • Systematic pairs (Jamra): glyph paired with every letter in its case

  • Cross-case integration: glyph in mixed UC/LC context

  • Ruder test: hard vs easy word columns for overall color evaluation

  • Single-stem stress test: words like "millennial", "minimum" (for i, l, r, t)

Use these strings in GlyphsApp's Edit view to visually assess spacing quality.

Args: glyph_name: Name of the glyph to generate test strings for

Inputs: glyph_name (required). Returns: result

get_stem_targetsA

Get the designer's intended stem values from the Dimensions palette.

Returns stem snap values from custom parameters AND measured values from reference glyphs (H, O, n, o). These are the TARGET values that other glyphs should match.

Use this as baseline for compare_stems — to check if glyphs hit the designer's intended values, not just if they're consistent with each other.

Inputs: master_id.

list_glyphsA

List glyphs in the open font with basic metadata.

Returns glyph names, unicodes, category, subCategory. Does NOT include path data — use get_glyph() for full details.

Args: category: Filter by category — "Letter", "Number", "Punctuation", "Symbol", "Separator", "Mark", "Other". Empty = all. limit: Max glyphs to return. 0 = all.

Inputs: limit, category.

list_recipesA

List available workflow recipes.

Recipes are step-by-step guides for complex type design tasks. They tell you which tools to call, in what order, and what to check.

IMPORTANT: You MUST call this before starting any multi-step type design task (scaling, auditing, spacing, kerning, compatibility checks, etc.). If a recipe matches the task, call get_recipe(name) and follow its steps in order — they encode expert type design knowledge and dependency ordering.

Inputs: no named parameters. Returns: result

measure_colorA

Measure the ink density (typographic color) of a single glyph.

Ink density = ratio of filled area to total bounding box. Normalizes by the appropriate zone height (x-height for lowercase, cap-height for uppercase) so values are comparable across glyphs.

Returns a value between 0.0 and 1.0 (typically 0.15-0.50 for text fonts).

Higher = darker/heavier glyph. Lower = lighter.

Inputs: glyph_name (required), master_id.

measure_stemsA

Measure stem thicknesses in a glyph using ray-casting.

Casts horizontal and vertical rays through the glyph outlines to measure vertical stems (like the main strokes of n, m, h) and horizontal stems (like crossbars of e, A, H).

Returns: - Dominant (most common) vertical and horizontal stem values - Min/max range showing consistency within the glyph - Detailed per-ray measurements with positions

Use this BEFORE and AFTER applying RMX filters to verify the effect.

Examples: "How thick are the stems of R?" -> measure_stems("R") "What's the crossbar thickness of H?" -> measure_stems("H")

Inputs: glyph_name (required), samples, master_id.

rename_glyphA

Rename a glyph. Fails if new_name already exists.

Inputs: new_name (required), glyph_name (required).

review_productionA

Run a comprehensive production readiness review on the open font.

Checks 44 items across critical/warning/info severities:

Critical (must fix): family name, .notdef, space glyph, duplicate unicodes/names, master compatibility, vertical metrics, open paths, valid glyph names, missing components, alignment zones.

Warning (should fix): metadata, version, essential glyphs, .notdef outlines, zone overshoots, Use Typo Metrics, typo/hhea match, win metrics coverage, kerning groups, cross-master kerning, critical kern pairs, OT features, weight classes, style linking, nbspace width, zero-width letters, PANOSE, stems defined, short segments, near-miss alignments, presentation forms decomposition (fi/fl/ff), German sharp S, Dutch IJ localization, smallcap completeness, salt feature, languagesystems prefix, Remove Overlap.

Info: glyph count by category, font metrics, fsType, VF readiness, unreachable glyphs.

Returns a formatted markdown report with pass/fail status and details for failures.

Inputs: no named parameters. Returns: result

rmx_batchA

Apply an RMX filter to multiple glyphs at once.

RECIPE: For multi-glyph scaling, call get_recipe("scale_proportions") first.

Args: filter_name: One of "harmonize", "tune", "scale", "monospace" glyph_names: List of glyph names to process params: Filter-specific parameters (same as individual tool params) master_id: Optional master ID

Examples: "Harmonize all lowercase" → rmx_batch("harmonize", ["a","b",...,"z"], params={"mode": "harmonize"})

"Make all caps 20% wider" →
rmx_batch("scale", ["A","B",...,"Z"], params={"width": 120})

Inputs: filter_name (required), glyph_names (required), params, master_id.

rmx_harmonizeB

Optimize bezier curves on a glyph using RMX Harmonizer.

Modes:

  • "harmonize": Full curve optimization (recommended default)

  • "dekink": Only fix kinks at smooth connections

  • "extract handles": Reset handles to default positions

  • "supersmooth diagonals": Extra smoothing on diagonal segments

  • "supersmooth all": Maximum smoothing everywhere

Use after drawing or modifying paths to ensure clean curves. Works on any glyph — no multi-master requirement.

Inputs: glyph_name (required), mode, master_id.

rmx_monospaceA

Adjust a glyph to a fixed width using RMX Monospacer.

Intelligently distributes width change between outline scaling and spacing adjustment to maintain visual quality.

Args: glyph_name: Name of the glyph mono_width: Target advance width (0 = keep current width) keep_stroke: How much to preserve stroke weight, 0-100% use_spacing: How much width change goes to spacing vs outline, 0-100% master_id: Optional master ID

Example: "Make all uppercase letters 600 units wide" → rmx_batch("monospace", ["A","B",...,"Z"], params={"monoWidth": 600})

Requires 2+ masters.

Inputs: glyph_name (required), master_id, mono_width, keep_stroke, +1 more.

rmx_scaleA

Scale a glyph by percentage in width and/or height.

USE THIS for percentage-based scaling requests like "make 30% wider".

RECIPE: For a multi-glyph scaling task, call get_recipe("scale_proportions") first and follow it step by step.

Uses RMX Scaler with stroke-weight compensation via master interpolation. Native affine fallback is opt-in because it cannot preserve stem weight. Response includes a "method" field: "rmx" = RMX Scaler was used, "native_transform" = affine transform fallback.

Args: glyph_name: Name of the glyph to scale width: Width scale as percentage. 100 = no change, 130 = 30% wider, 70 = 30% narrower height: Height scale as percentage. 100 = no change weight: Stroke weight delta (RMX only, ignored in native fallback) adjust_space: Sidebearing adjustment delta vertical_shift: Vertical position offset master_id: Optional active master ID. RMX still processes all masters. allow_fallback: Permit native affine scaling if RMX fails. Default False.

RMX parameters accept either one value for every master or a list in
font master order for independent per-master control.

Examples: "Make R 30% wider" → rmx_scale("R", width=130) "Make R 20% narrower" → rmx_scale("R", width=80) "Scale R to 90% height, keep width" → rmx_scale("R", height=90)

Inputs: glyph_name (required), width, height, weight, +4 more.

rmx_tuneA

Adjust a glyph by delegating directly to the installed RMX Tuner.

This tool calls the real RMXTuner instance loaded in GlyphsApp (Glyphs.filters) and passes the values to Tuner's own controls. It does NOT approximate Tuner with native interpolation.

IMPORTANT: Width/height/weight/slant are RMX Tuner deltas, not percentages. Typical useful range is roughly -100 to +100, depending on the font/RMX setup. Blend is normalized: 0 = no blend-in layer, 1 = full blend-in layer. Values above 1 extrapolate and can produce extreme outlines.

Args: glyph_name: Name of the glyph to tune. weight: RMX Tuner Weight value (+ = heavier, - = lighter). width: RMX Tuner Width value (+ = wider, - = narrower). height: RMX Tuner Height value (+ = taller, - = shorter). slant: RMX Tuner Slant value. blend: RMX Tuner Blend value. Use 0.0–1.0 for interpolation. fixed_width: Keep advance width fixed via RMX Tuner's checkbox. master_id: Optional master/layer ID. Empty = first master. all_masters: If True, pass all master layers of the glyph to RMX Tuner.

Example: rmx_tune("R.001", height=88, weight=88)

Inputs: glyph_name (required), blend, slant, width, +5 more.

set_feature_codeB

Create or update an OpenType feature.

Args: feature_name: Feature tag e.g. "liga", "kern", "ss01" code: OpenType feature code (AFDKO syntax) active: Whether the feature is enabled (default True)

Inputs: code (required), feature_name (required), active.

set_glyph_colorA

Set the color label of a glyph in the font view.

Color index (0–11): 0=red, 1=orange, 2=brown, 3=yellow, 4=light green, 5=dark green, 6=teal, 7=blue, 8=purple, 9=pink, 10=light gray, 11=charcoal

Use None/no color by setting any value outside this range.

Inputs: color (required), glyph_name (required).

set_glyph_pathsA

Replace ALL paths on a glyph's layer in GlyphsApp.

This OVERWRITES existing paths. The glyph must already exist.

Each path is: {"closed": true, "nodes": [{"x": 100, "y": 0, "type": "line", "smooth": false}, ...]}

Node types:

  • "line": on-curve point with straight connection to previous

  • "curve": on-curve point with smooth cubic bezier connection

  • "offcurve": cubic bezier control handle (always in pairs before a "curve")

  • Curve segments: offcurve, offcurve, curve (3 nodes per segment)

Path direction: outer contours counter-clockwise, counters/holes clockwise. correctPathDirection() is called automatically after setting paths.

If master_id is empty, uses the first master.

Inputs: paths (required), glyph_name (required), master_id.

set_glyph_unicodeB

Set the unicode value of a glyph.

Args: glyph_name: Name of the glyph to update unicode_value: Hex unicode string e.g. "0061" for 'a'. Pass "" to clear.

Inputs: glyph_name (required), unicode_value (required).

set_glyph_widthC

Set the advance width of a glyph.

Inputs: width (required), glyph_name (required), master_id.

set_kerning_pairA

Set a kerning pair value between two glyphs.

Args: left: Left glyph name or group (@MMK_L_...) right: Right glyph name or group (@MMK_R_...) value: Kerning value (negative = tighter) master_id: Optional master ID (uses first master if empty)

Inputs: left (required), right (required), value (required), master_id.

smart_scaleA

Scale glyphs with automatic stem weight compensation.

RECIPE: For multi-glyph scaling tasks, call get_recipe("scale_proportions") first — it includes pre/post stem verification and visual comparison steps.

Unlike simple affine transforms which distort stem weights, this tool:

  1. Measures reference stems (H for UC, n for LC) before scaling

  2. Applies the width/height transform

  3. Uses GlyphsFilterOffsetCurve to compensate stem thickness changes

  4. Reports before/after stem measurements for verification

All values are scale factors where 1.0 = no change.

Args: width: Horizontal scale factor. 0.97 = 3% narrower, 1.1 = 10% wider height: Vertical scale factor. 1.15 = 15% taller, 0.9 = 10% shorter weight: Target stem weight factor. 1.0 = maintain original stem thickness after scaling (compensate). 0.9 = make stems 10% thinner. 1.1 = 10% thicker. proportional: If true, height follows width (uniform scale with compensation) glyph_names: List of glyph names to process (empty = all exporting glyphs) master_id: Process only this master (empty = all masters) backup: Create backup layers before modifying (default true)

Examples: Condense 3% keeping weight: smart_scale(width=0.97, weight=1.0) Increase x-height 15% keeping weight: smart_scale(height=1.15, weight=1.0) Scale uniformly 90% with weight compensation: smart_scale(width=0.9, proportional=True) Make all stems 10% thicker: smart_scale(weight=1.1) Condense UC only: smart_scale(width=0.95, glyph_names=["A","B","C",...])

Inputs: width, backup, height, weight, +3 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.4/5.0

    Scored across 55 tools

    Disambiguation3/5

    Most tools target a distinct resource, but there is real overlap among scaling/transformation tools such as rmx_scale, smart_scale, rmx_tune, and rmx_batch when used with the "scale" filter. The detailed descriptions help, but an agent could still easily pick the wrong entry point for a similar-looking operation.

    Naming Consistency4/5

    The vast majority of tools follow a readable snake_case verb_noun pattern like get_glyph, set_kerning_pair, and analyze_spacing. The rmx_*, smart_*, and auto_* prefixed tools break the pure pattern slightly, but the conventions are internally consistent enough to stay predictable.

    Tool Count1/5

    With 55 tools, this clearly exceeds the 50+ threshold for an extreme tool count. Many audit, comparison, transformation, and recipe tools could be consolidated, and the recipe meta-tools add a large amount of surface area that could be folded into a smaller set.

    Completeness4/5

    The toolset provides strong coverage across glyph CRUD, paths, widths, unicode, colors, kerning, features, masters, exports, and a wide range of design audits. Minor gaps exist, such as no direct component/anchor editing, no sidebearing setter, and no feature deletion, but most workflows can still be completed.

    Maintenance

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Write-side MCP server for Figma — build, edit, and search Figma designs from Claude Code, Cursor, Cline, or any MCP client. Complements Figma's official read-only MCP with 41 tools for tree creation, variables, components, and visual verification.
      41
      3
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables AI assistants to interact with FontLab for font design and manipulation, including querying font metadata, creating/modifying glyphs, applying transformations, and exporting fonts.
      8
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI tools to create and edit Font Proof documents for type designers, supporting PDF font proofs and live-reload from Glyphs.app.
      27 npm
      MIT
    • A
      license
      Not graded
      quality
      A
      maintenance
      A Model Context Protocol server for Glyphs that exposes font‑specific tools to AI/LLM agents.
      60
      Apache 2.0