Font Design MCP
Font Design MCP is a local MCP server for AI-assisted type design that manages UFO-based font projects, enables atomic, validated edits, and builds real font files.
Create, open, inspect, and restore UFO font projects with metadata, metrics, revision history, and integrity checks.
Read and edit glyph outlines, components, anchors, advances, bounds, and bearings in font units using typed vector operations and drawing primitives.
Adjust spacing and kerning groups/values; outlines move with bearings.
Edit font-level metadata such as naming, copyright, license text, and other technical properties.
Configure variable-font axes, clone masters within the same project, and select locations for rendering or building.
Render glyphs or text to PNG images via HarfBuzz shaping and FreeType/Pillow rasterization, with no system-font fallback.
Validate fonts: run technical checks, compile a TTF, inspect tables, and report corpus coverage and warnings.
Build real TTF and/or WOFF2 files from a frozen revision; variable fonts are exported automatically when axes are configured.
Work locally with the official MCP Python SDK, supporting Python 3.11/3.13, and demonstrate end-to-end workflows with the included example client.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Font Design MCP Create a new font project, draw a bold rounded 'A' glyph, preview it, then export as TTF."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Font Design MCP
Draw, inspect, refine, and build fonts through MCP.
A local MCP server for AI-assisted type design, from vector outlines to TTF and WOFF2.
English · Français
Get started · Connect a client · Report an issue
Get started
Version 0.6.0 adds regional stroke checks, interpolation diagnostics, persistent stroke constructions, and revision-bound visual release evidence. See the release notes and quality and release guide. Installation runs directly from GitHub, with automatic client detection. With Node.js 20+ and Git, run:
npx --yes github:Kydaix/Font-Design-MCPThe installer prepares uv and Python 3.13 if needed, installs the MCP in a persistent environment, detects Codex, Claude Code and Cursor, and asks which clients to configure. Restart those clients after installation. MCP tools belong to the client application and are available to its compatible models.
npx --yes github:Kydaix/Font-Design-MCP --clients codex cursor
npx --yes github:Kydaix/Font-Design-MCP --yes
npx --yes github:Kydaix/Font-Design-MCP --clients codex --dry-run--yes selects all detected clients; --clients explicitly selects one or more, including claude-code.
--workspace /absolute/path chooses where fonts are saved. --dry-run prepares the runtime but only
previews client changes. Existing configuration files receive a .font-design-<id>.bak backup before
atomic replacement. Other servers and existing per-server settings are preserved. Invalid configuration
files are refused. Re-running the command updates the installation without duplicating server entries.
An existing workspace is retained unless --workspace or FONT_DESIGN_MCP_WORKSPACE explicitly changes it.
Each install creates a separate runtime, so active servers do not block Windows updates.
Previous runtimes are retained for running clients and configuration backups.
The installed runtime survives removal of the npm cache. Remove its MCP entry in a client to disconnect it;
font projects remain in the workspace.
The MCP is distributed through GitHub, without publishing to PyPI or npm. Python dependencies still
download from their package index on first installation. Pin a checkout with github:Kydaix/Font-Design-MCP#v0.6.0.
For manual setup, font-design-mcp config prints JSON using the versioned GitHub release wheel;
config --from /absolute/path/package.whl uses a downloaded wheel. Neither command edits client files.
--workspace overrides FONT_DESIGN_MCP_WORKSPACE, which overrides the dedicated user-data default:
%LOCALAPPDATA%/font-design-mcp/workspace on Windows, ~/Library/Application Support/font-design-mcp/workspace
on macOS, $XDG_DATA_HOME/font-design-mcp/workspace (or ~/.local/share/...) on Linux.
The workspace stays outside UV's cache and survives upgrades or extension removal.
The MCPB extension targets hosts supporting the UV runtime in manifest 0.4.
Development from source
Clone the repository and install the dependencies with the commands below.
Run the diagnostic and demo to generate your first font specimen.
Connect your MCP client to start designing with an agent.
Requirements: Python 3.11–3.13, uv, and a GitHub account with access to this repository. Commands work in PowerShell and POSIX shells.
git clone https://github.com/Kydaix/font-design-mcp.git
cd font-design-mcp
uv sync --frozen --python 3.11
uv run --frozen font-design-mcp doctor
uv run --frozen python examples/demo.py --workspace ./workspacedoctor checks dependencies and rasterizes a PNG; doctor --build also compiles TTF and WOFF2. Font operations run locally after installation;
the server needs no model API key or proprietary editor. The client agent may use a remote model.
The demo launches a real STDIO server through the official MCP Python SDK. It draws A, V, O, Q, acute, and Á,
sets AV kerning to −80 units, moves A's apex, compares revisions, validates, and builds both export formats.
Each run creates a new project and prints the path to specimen.html. Open it directly in a browser.
Demo output | Contents |
| Read-only previews and links to the generated fonts; no web server needed |
| The MCP calls and their structured results |
| Project, revision, source, build, and validation references |
| UFO snapshots, PNGs, TTF/WOFF2, parameters, and hashes |
Generated workspaces stay local and are ignored by Git.
Related MCP server: glyphs-mcp
Miette: a rounded typeface example
Miette Regular is an original, soft rounded font with 84 letters: uppercase and lowercase Latin, French accents, and æ/œ/Æ/Œ. Basic punctuation and spaces bring the total to 107 encoded characters. Its drawings, accent components, optical kerning, and complete MCP build recipe are included.

Download TTF · Download WOFF2 · Specimen and reproduction
Open examples/miette/specimen.html locally to type your own text, adjust its size, and compare kerning.
This first Regular style focuses on French letters; digits and additional styles are not included.
Connect a client
The MCP client launches the server process. Set an absolute interpreter path and an absolute workspace path in the client's configuration:
{
"mcpServers": {
"font-design": {
"command": "/absolute/path/font-design-mcp/.venv/bin/python",
"args": ["-m", "font_design_mcp", "serve", "--workspace", "/absolute/path/font-workspace"]
}
}
}On Windows, use C:/path/font-design-mcp/.venv/Scripts/python.exe for command and a Windows absolute path
for the workspace. The user sets this directory at launch; a tool call cannot expand it.
Add a block like this to your Codex configuration, adapting both paths:
[mcp_servers.font_design]
command = "/absolute/path/font-design-mcp/.venv/bin/python"
args = ["-m", "font_design_mcp", "serve", "--workspace", "/absolute/path/font-workspace"]
startup_timeout_sec = 20
tool_timeout_sec = 180The format follows the official Codex MCP documentation. The Windows example needs its installation-specific paths adjusted. The SDK client is tested end to end. Miette also exercised a live Codex MCP connection on Windows, including project creation, inspection, image previews, and font exports.
Windows / PowerShell:
.\.venv\Scripts\font-design-mcp.exe serve --workspace "$PWD\workspace"macOS / Linux:
.venv/bin/font-design-mcp serve --workspace "$PWD/workspace"The process waits for MCP messages on stdin. Stdout is reserved for JSON-RPC, so there is no startup banner. Logs go to stderr or captured compiler logs. Using the installed executable avoids dependency resolution at server startup. Normally, let the client start the process itself.
Image visibility depends on the client. Render tools return actual MCP image blocks, plus persistent paths, dimensions, hashes, and revisions. The client must forward those images to a model that can use them.
Design a font
The client agent makes the creative decisions; the server applies validated operations and keeps a revision history.
Step | What you can do |
Draw | Start with a brief and a few structural glyphs. Create lines, cubic and quadratic curves, counters, components, and anchors. |
Preview and refine | Inspect PNG previews with guides and handles. Move points by stable ID and compare revisions at the same sizes. |
Space and kern | Stabilize proportions, set side bearings, then adjust kerning. Test words with kerning on and off before extending the alphabet. |
Validate and export | Check geometry, coverage, and compilation. Build TTF and WOFF2 from a frozen revision. |
Record hypotheses and observed corrections in the project's decision journal.
The development version adds default outline diagnostics, perpendicular stroke/counter profiles and
revision-bound visual reviews. font_build defaults to a proof export; purpose="release" requires an
explicit review contract. See the quality and release workflow.
Every call names its project. Source edits require expected_revision; stale requests fail instead of
overwriting another edit. Points and handles have stable IDs, so a correction can be as small as:
{
"op": "move_point",
"point_id": "Aouter_1",
"x": 340,
"y": 720
}Pass this operation in glyph_edit.operations with the project ID, glyph ID, and current expected revision.
A successful edit returns the new revision and changed IDs. compare_revision on either render tool shows
two revisions under the same viewing conditions.
Technical validation and the agent's judgement are distinct from human approval. The server does not assign an artistic score or accept an agent-supplied claim of authenticated human approval.
Work from your own drawings
Import explicitly calibrated PNG references with reference_import, preserve their distinctive features,
and compare reconstructed outlines with render_glyph(reference_id=...). Use design_spec to retain
coverage and measurable style targets, font_analyze to find localized issues, and render_proof to compare
letters and digits at a common scale. Handle-preserving edits and optionally linked accents prevent
some local corrections from breaking related geometry.
This is controlled reconstruction and review, not automatic tracing or a guarantee of professional quality. See the reference-driven design workflow for calibration, examples, limits, optional export checks and schema-3 compatibility.
Available tools
The official MCP SDK publishes input and output schemas through tools/list. Responses include structured
data, readable summaries, revisions, warnings, and identifiable errors.
Tool | Purpose |
| Create a project with metadata, metrics, and an optional brief |
| Reopen a server-created project and verify its integrity |
| Read metadata, metrics, kerning, and a paginated glyph inventory |
| Update the brief, supported metadata, vertical metrics, or decision journal |
| Inspect contours, IDs, components, anchors, advance, bounds, and bearings |
| Apply a typed, atomic vector-editing batch to a glyph |
| Edit up to 128 glyphs and their spacing atomically in one revision |
| Set advances, side bearings, kerning pairs, and kerning groups |
| Render a glyph with optional guides, handles, and revision comparison |
| Compile, shape, and render text at multiple sizes |
| Import a calibrated PNG from workspace/inbox as an immutable drawing reference |
| Check visible ink, matching outlines, crossings, design coverage and declared metrics/profiles |
| Record an agent assessment of immutable proofs and intentional localized findings |
| Report missing measurements, glyph/text reviews and unresolved findings across masters |
| Compare multiple glyphs at a shared scale, optionally across revisions |
| Check geometry, Unicode coverage, compilation, and OpenType tables |
| Export static or variable TTF and/or WOFF2 from a frozen revision |
| Define continuous axes and clone/edit the project's master configuration |
| Browse committed revisions and change summaries |
| Restore an earlier state by creating a new revision |
Exact input and output schemas are available through MCP tools/list.
Inspection, glyph reads/edits, batch edits, validation, and renders default to
detail="summary". Use detail="full" for complete data, including point IDs before editing them;
render_text also accepts detail="positions". Rendered images remain inline by default;
image_mode="resource" returns references for retrieval through MCP resources.
Save and restore your work
UFO 3 is authoritative for outlines. Design contracts and links are revisioned in the manifest.
Compiled fonts and preview images are derived artifacts; imported drawing references are project inputs
and their referenced artifacts/ entries must be retained and backed up with the project:
workspace/<project_id>/
├── HEAD.json
├── revisions/<revision>/
│ ├── source.ufo/
│ └── manifest.json
└── artifacts/<artifact_id>/
├── font.ttf / font.woff2 / image.png
└── artifact.jsonEdits validate the whole project, write a complete new UFO snapshot, then atomically update the revision pointer under an OS lock. Invalid batches leave the committed state intact. Hashes detect external changes; restoration preserves existing history. Back up the entire project directory, preferably with the server stopped.
Use a private local workspace and edit snapshots through the tools. The server checks paths and UFO references, rejects symlinks/junctions and unsafe XML, and exposes no arbitrary code, shell, download, or package-installation tool. Inputs, images, geometry, compiler time, and logs are bounded. These checks are not an OS sandbox against a hostile process with the same user privileges, and snapshots are not a substitute for an external backup. Disk usage has no automatic global quota or history purge.
Coordinates use font units, baseline y=0, with Y pointing up. Advance, visible width, and side bearings are
different measurements. UPM is fixed at creation. Closed contours use non-zero filling; counters need the
opposite winding.
Supported formats and limits
Current scope: static and variable TTF/WOFF2 fonts, freeform closed contours, components, anchors, and kerning. Text is shaped with HarfBuzz from a compiled TTF and rasterized with FreeType/Pillow, without system-font fallback.
For variable fonts, variable_configure defines axes and clones masters within the same project.
Editing tools accept master_id, render_text accepts location: {"wght": 500}, and font_build
automatically exports a variable font. Up to 4 continuous axes and 8 masters, subject to source size limits.
Not supported in this version: OTF, arbitrary UFO/SVG import, image tracing, editor adapters, collaborative networking, and a full graphical editor. No hinting or arbitrary OpenType feature code is exposed. Text previews are single-line specimens, not paragraph layout.
Precomposed Á built from components is tested. Latin combining marks with matching base/mark anchors
are checked for reachable mark positioning in TTF and WOFF2, including variable exports and cached builds.
Stacked marks (mkmk) and complex-script coverage are not certified. Source previews can differ slightly from compiled contours
after curve conversion, and unhinted FreeType output need not match native OS rendering.
Build from source
After completing Get started, build the source archive and wheel:
uv buildOutput: dist/. Dependency versions are pinned in pyproject.toml and uv.lock;
requirements.lock provides hashed dependencies for pip installations. Install them with
pip install --require-hashes -r requirements.lock, then install the built wheel with pip install --no-deps /path/to/package.whl.
Checks
uv run --frozen pytest -q
uv run --frozen ruff check src tests scripts examples
uv run --frozen python tests/test_acceptance.pyThe standalone acceptance client retains its captures and JSON-RPC transcript under test-output/acceptance-*.
It checks actual compiled kerning, edit isolation, revision conflicts, failed atomic batches, unsafe paths,
compiler failure, restart, and interrupted writes.
Verification | Evidence |
Windows 11 x64, Python 3.11 | 53 local tests passed, including client installation, variable interpolation, real STDIO calls, atomic edits, rendering, and recovery |
Windows, macOS, Linux runners | CI results, covering Python 3.11 and 3.13 |
Installed wheel | Entry point and full MCP demo tested in a separate environment |
MCPB extension | Installed outside the repository; diagnostic, STDIO calls, and TTF/WOFF2 exports tested |
The CI result covers its runner environments, not every OS version or CPU architecture.
Credits and license
Built with the official MCP Python SDK, UFO sources, HarfBuzz, and FreeType/Pillow. Third-party notices are included in the installed dependency packages.
The server code and original examples are MIT licensed. This does not automatically license fonts you create with the server. Font license metadata is empty by default and remains under the creator's control. No third-party font outlines or font files are included.
Available Tools
20 toolsfont_analyzeC
Check visible ink, matching outlines and self crossings by default; measure declared design rules, normal stroke/counter profiles, smooth joins, digit spacing and required coverage. Rules accept master_id or a variable location; variation_profiles measure normal-width progression. interpolation=true adds timed source correspondence and compiled axis-grid checks. Returns regional coverage and localized candidates, not artistic approval. Full reports include measurements and evidence_plan.
Inputs: project_id (required), detail, revision, master_id, +1 more. Returns: ok, data, error, changed, +4 more
font_buildB
Build real TTF and/or WOFF2 from a frozen revision, automatically variable when axes/masters are configured. Returns persistent relative paths and hashes. Does not alter sources.
Inputs: project_id (required), formats, purpose, revision, +2 more. Returns: ok, data, error, changed, +4 more
font_editB
Edit up to 128 glyphs atomically in master_id (default: 'default'), then apply spacing. Forward component references resolve at final validation; any failure rolls back the batch.
Inputs: glyphs (required), project_id (required), expected_revision (required), detail, +3 more. Returns: ok, data, error, changed, +4 more
font_release_checkB
Evaluate all masters, structural measurements, glyph review coverage, localized findings, reference comparisons and shaped text reviews before release. Supply proof_review report_uris. Returns actionable missing requirements; never certifies aesthetic perfection.
Inputs: project_id (required), revision, review_uris. Returns: ok, data, error, changed, +4 more
font_validateB
Run technical checks, compile a TTF, inspect tables and corpus coverage. Reports errors, warnings and observations; does not assess artistic merit.
Inputs: project_id (required), corpus, detail, revision. Returns: ok, data, error, changed, +4 more
glyph_editC
Apply typed vector operations or drawing primitives atomically to one glyph in master_id (default: 'default'). Use detail=full for added/removed/touched IDs. Replacements are explicit.
Inputs: glyph_id (required), operations (required), project_id (required), expected_revision (required), +4 more. Returns: ok, data, error, changed, +4 more
glyph_getARead-onlyIdempotent
Read a master's glyph metrics in font units, Y upwards. master_id defaults to 'default'. Use detail=full for contour/point/component/anchor IDs and geometry.
Inputs: glyph_id (required), project_id (required), detail, revision, +1 more. Returns: ok, data, error, changed, +4 more
history_listBRead-onlyIdempotent
List committed revisions and summaries with pagination; interrupted uncommitted stages are excluded.
Inputs: project_id (required), limit, detail, offset, +2 more. Returns: ok, data, error, changed, +4 more
history_restoreA
Restore a committed revision by creating a NEW revision; requires the current expected_revision and preserves history.
Inputs: project_id (required), target_revision (required), expected_revision (required), summary. Returns: ok, data, error, changed, +4 more
project_createC
Create a project in the launch workspace with Unicode UFO sources and technical glyphs.
Inputs: metadata (required), brief, metrics, design_spec. Returns: ok, data, error, changed, +4 more
project_inspectBRead-onlyIdempotent
Inspect a master with optional sections and glyph_ids focus. Full collections are paginated; pagination lists each continuation. Use sections=['design'] for the complete design contract without spacing/compositions.
Inputs: project_id (required), limit, detail, offset, +5 more. Returns: ok, data, error, changed, +4 more
project_openARead-onlyIdempotent
Reopen a server-created project by ID; verifies committed sources and returns its revision.
Inputs: project_id (required). Returns: ok, data, error, changed, +4 more
project_updateB
Atomically update metadata, brief or decision journal. Requires expected_revision. UPM changes on nonempty fonts fail.
Inputs: project_id (required), expected_revision (required), brief, metrics, +5 more. Returns: ok, data, error, changed, +4 more
proof_reviewA
Record an agent's visual review of immutable render report_uris from an exact revision. Use verdict=revise for defects; accepted intentional findings require their finding_id and a reason. Does not alter font sources or assert human approval. Inspect actual images before calling.
Inputs: verdict (required), revision (required), project_id (required), proof_uris (required), +2 more. Returns: ok, data, error, changed, +4 more
reference_importA
Import a bounded single-frame PNG from workspace/inbox as an immutable drawing reference. image_to_font maps image pixels (top-left, Y down) to font units (baseline, Y up). Requires expected_revision. No tracing or automatic rescaling; use reference_id with render_glyph.
Inputs: glyph_id (required), project_id (required), source_path (required), reference_id (required), +7 more. Returns: ok, data, error, changed, +4 more
render_glyphC
Persist and return PNG image content from the selected UFO revision, with optional guides/handles. Comparison uses the same frame.
Inputs: glyph_id (required), project_id (required), width, detail, +10 more. Returns: ok, data, error, changed, +4 more
render_proofA
Render up to 32 glyphs at one common scale, optionally comparing revisions. Missing glyphs are explicit placeholders; use render_text separately for shaped words.
Inputs: glyph_ids (required), project_id (required), detail, guides, +8 more. Returns: ok, data, error, changed, +4 more
render_textB
Compile the revision, shape with HarfBuzz and return FreeType PNGs. For variable fonts, location maps axis tags to values; omitted axes use defaults. Missing Unicode is reported. Optional same-conditions revision comparison.
Inputs: text (required), project_id (required), dark, kern, +7 more. Returns: ok, data, error, changed, +4 more
spacing_editA
Atomically set advances, side bearings, kerning groups or pairs in master_id (default: 'default'). Bearings move outlines; advances do not.
Inputs: operations (required), project_id (required), expected_revision (required), summary, +1 more. Returns: ok, data, error, changed, +4 more
variable_configureC
Configure continuous axes and masters in this project. Master 'default' is the existing source at the default location. New IDs clone it; existing IDs keep their drawings; omitted IDs are removed in a new revision. Edit masters with master_id. Compatibility is checked at build/validation time.
Inputs: variation (required), project_id (required), expected_revision (required), summary. Returns: ok, data, error, changed, +4 more
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 20 tools
Most tools target distinct font-design resources and phases, such as project setup, glyph editing, rendering, validation, and history. Some boundaries blur between glyph_edit and font_edit, and among render_text, render_glyph, and render_proof, but descriptions and parameters clarify their scopes. Validation-related tools are also distinct enough across validate, analyze, and release_check phases.
The set mostly follows a consistent snake_case resource_action pattern, e.g. project_create, glyph_edit, font_validate, and history_restore. Minor deviations appear in render_text, render_glyph, and render_proof, which use verb-first ordering, and in the longer font_release_check. The convention is still predictable overall.
At 20 tools, the set is slightly above the ideal 3-15 range, but the domain is genuinely complex and spans project setup, variable configuration, editing, rendering, validation, proofing, release checks, import, build, and history. The tools do not appear redundantly padded, so the count is reasonable though heavy.
The surface covers the core font-design lifecycle: project create/open/update/inspect, variable configuration, glyph and font editing, spacing, rendering, validation/analysis, proof review, release checking, reference import, build, and history restore. Minor gaps exist, such as no explicit project listing/deletion or dedicated glyph deletion/export operation, but agents have workarounds and the critical paths are present.
Maintenance
Related MCP Connectors
AI-agent design tools: fonts, font recognition, palettes, color naming, contrast, code, SVG, CSS.
Git-backed platform for skills, tools, and context for AI agents
Agent-Native design tool - create and edit visual designs with agent assistance
Let your AI agent build, preview and update web apps, download source and publish when you allow it.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables AI agents to diagnose, modify, and validate OTF/TTF fonts interactively through a set of read-only, write, and validation tools.-
- AlicenseBqualityBmaintenanceMCP 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.5527 PyPI13MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI tools to create and edit Font Proof documents for type designers, supporting PDF font proofs and live-reload from Glyphs.app.27 npmMIT
- AlicenseNot gradedqualityAmaintenanceA Model Context Protocol server for Glyphs that exposes font‑specific tools to AI/LLM agents.60Apache 2.0