Skip to main content
Glama
Kydaix

Font Design MCP

by Kydaix

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.

CI Python: 3.11–3.13 License: MIT

English · Français

Get started · Connect a client · Documentation · Report an issue


Get started

  1. Clone the repository and install the dependencies with the commands below.

  2. Run the diagnostic and demo to generate your first font specimen.

  3. 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. Install from source; this version is not published to PyPI.

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 ./workspace

doctor checks the installed dependencies and rasterizes a PNG. 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

specimen.html

Read-only previews and links to the generated fonts; no web server needed

demo-calls.json

The MCP calls and their structured results

demo-report.json

Project, revision, source, build, and validation references

revisions/ and artifacts/

UFO snapshots, PNGs, TTF/WOFF2, parameters, and hashes

Generated workspaces stay local and are ignored by Git.

Related MCP server: FontLab MCP Server

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.

Miette, an original rounded typeface created with Font Design MCP

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 = 180

The 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.

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.

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

project_create

Create a project with metadata, metrics, and an optional brief

project_open

Reopen a server-created project and verify its integrity

project_inspect

Read metadata, metrics, kerning, and a paginated glyph inventory

project_update

Update the brief, supported metadata, vertical metrics, or decision journal

glyph_get

Inspect contours, IDs, components, anchors, advance, bounds, and bearings

glyph_edit

Apply a typed, atomic vector-editing batch to a glyph

spacing_edit

Set advances, side bearings, kerning pairs, and kerning groups

render_glyph

Render a glyph with optional guides, handles, and revision comparison

render_text

Compile, shape, and render text at multiple sizes

font_validate

Check geometry, Unicode coverage, compilation, and OpenType tables

font_build

Export TTF and/or WOFF2 from a frozen revision

history_list

Browse committed revisions and change summaries

history_restore

Restore an earlier state by creating a new revision

Exact JSON schemas · Detailed tool reference, in French

Save and restore your work

UFO 3 is the authoritative typography source. Fonts and images are derived artifacts tied to a revision:

workspace/<project_id>/
├── HEAD.json
├── revisions/<revision>/
│   ├── source.ufo/
│   └── manifest.json
└── artifacts/<artifact_id>/
    ├── font.ttf / font.woff2 / image.png
    └── artifact.json

Edits 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. See the architecture and recovery notes, in French for details.

Supported formats and limits

Current scope: static fonts with one master, 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.

Not supported in this version: OTF, variable fonts, multiple masters, 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. General combining-mark positioning (mark/mkmk) and complex-script coverage are not advertised. 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 build

Output: dist/. Dependency versions are pinned in pyproject.toml and uv.lock; requirements.lock provides a hashed export for pip installations.

Checks

uv run --frozen pytest -q
uv run --frozen ruff check src tests scripts examples
uv run --frozen python tests/test_acceptance.py

The 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

21 local tests passed, including real STDIO calls, builds, rendering, recovery, and embedding defaults

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

The CI result covers its runner environments, not every OS version or CPU architecture. The original delivery report, in French records the local tests before CI was first run.

Documentation

English is the default README language; a French README is also maintained. The detailed guides currently remain in French, except the dependency inventory and machine-readable schemas.

Reference

Contents

Tool reference

Input conventions, vector operations, spacing, results, and error codes

JSON schemas

Schemas exported from a live tools/list call

Architecture

Domain, persistence, rendering, compilation, limits, and recovery

Test report

Original acceptance evidence, captures, and remaining visual review

Dependency licenses

Locked dependencies and native-library notices

Initial audit

Development environment, technical choices, and official sources

Credits and license

Built with the official MCP Python SDK, UFO sources, HarfBuzz, and FreeType/Pillow. See dependency licenses for third-party notices.

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

13 tools
font_buildA

Build real TTF and/or WOFF2 from a frozen revision. Returns persistent relative paths and hashes. Does not alter UFO sources.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatsNo
revisionNo
project_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
dataNo
errorNo
changedNo
summaryYes
revisionNo
warningsNo
project_idNo

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds useful behavioral context by stating it does not alter UFO sources and returns persistent paths/hashes. Does not contradict the annotations, though it could mention whether existing build artifacts are overwritten.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences with no fluff; each sentence adds relevant information about behavior, output, and side effects.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Provides output and side-effect context but lacks essential parameter explanations and prerequisites such as requiring an existing project or how revision null is interpreted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has three parameters with zero descriptions, and the description does not explain project_id, formats, or revision. 'From a frozen revision' only vaguely hints at the revision parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool builds TTF/WOFF2 binaries from a frozen revision and returns persistent paths/hashes. This distinguishes it from sibling tools like font_validate and render_glyph.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies use when compiled font binaries are needed from a frozen revision, but does not explicitly compare with sibling tools or state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

font_validateB

Run technical checks, compile a TTF, inspect tables and corpus coverage. Reports errors, warnings and observations; does not assess artistic merit.

ParametersJSON Schema
NameRequiredDescriptionDefault
corpusNo
revisionNo
project_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
dataNo
errorNo
changedNo
summaryYes
revisionNo
warningsNo
project_idNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that it reports errors, warnings, and observations, but does not clarify side effects such as whether a compiled TTF artifact is persisted; annotations are all false and add no clarity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no redundant phrasing; the structure is clear and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema is present so return values need not be described, but the lack of parameter semantics and explicit usage guidance leaves the tool partially under-specified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameter descriptions are provided; corpus and revision semantics are unexplained, and the schema has 0% description coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action ('Run technical checks, compile a TTF, inspect tables and corpus coverage') and clearly distinguishes the tool by noting it does not assess artistic merit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies a validation-focused use case and explicitly excludes artistic assessment, but does not clearly indicate when to use this over sibling tools like font_build or project_inspect.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

glyph_editA

Apply an atomic typed vector batch to a named glyph. Offcurve points are handles. Replacements must be explicit; removed IDs are returned.

ParametersJSON Schema
NameRequiredDescriptionDefault
createNo
summaryNo
glyph_idYes
operationsYes
project_idYes
expected_revisionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
dataNo
errorNo
changedNo
summaryYes
revisionNo
warningsNo
project_idNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses atomicity, that offcurve points are handles, that replacements must be explicit, and that removed IDs are returned. These details go beyond the annotations (which only indicate read-only and destructive hints) and give an agent useful behavioral context about how the tool operates.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short sentences with no redundant phrasing. It front-loads the core action and includes only essential behavioral notes, making it highly efficient for an agent to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is complex with many operation types, yet the description omits critical context such as the need for expected_revision for optimistic concurrency, the meaning of 'typed' operations, and error scenarios. It does mention removal returns, and the output schema exists, but overall the description leaves gaps for such a complex tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description should compensate, but it only offers a few hints (explicit replacements, removed IDs) that relate to a subset of operations. It does not explain required parameters like project_id, expected_revision, or the operations structure, leaving most parameters semantically opaque.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Apply an atomic typed vector batch') and the resource ('a named glyph'), and it implies modification, distinguishing it from read-only tools like glyph_get. The mention of 'removed IDs' and 'replacements' further clarifies it as an editing operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies that this tool is used for editing glyphs, but it does not explicitly state when to use it versus siblings like glyph_get or spacing_edit, nor does it mention any prerequisites such as an open project. It provides no exclusionary guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

glyph_getA
Read-onlyIdempotent

Read stable contour/point/component/anchor IDs and advance, bounds and bearings in font units, Y upwards.

ParametersJSON Schema
NameRequiredDescriptionDefault
glyph_idYes
revisionNo
project_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
dataNo
errorNo
changedNo
summaryYes
revisionNo
warningsNo
project_idNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds useful context about the stability of IDs and the coordinate system (Y upwards), which goes beyond annotations. No contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the action and lists the data items. It is concise, with every element contributing meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers what is read and the coordinate system, and the output schema presumably details the return structure. It omits explanation of the optional revision parameter and error behavior, but these are minor gaps given the annotations and output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain any of the parameters (project_id, glyph_id, revision). The agent must infer meaning solely from names, which is inadequate given the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Read' and enumerates the exact data elements (contour/point/component/anchor IDs, advance, bounds, bearings) and clarifies the coordinate system (Y upwards). This clearly distinguishes it from siblings like glyph_edit and render_glyph.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for reading glyph data but does not explicitly state when to use it vs alternatives such as glyph_edit or render_glyph. There are no conditions, exclusions, or alternative tool references.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

history_listA
Read-onlyIdempotent

List committed revisions and summaries with pagination; interrupted uncommitted stages are excluded.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
revisionNo
project_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
dataNo
errorNo
changedNo
summaryYes
revisionNo
warningsNo
project_idNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds useful context by specifying only committed revisions are listed and uncommitted stages are excluded, reinforcing the safe read-only behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, well-structured, and front-loaded with the primary action. It avoids redundancy and communicates the key exclusions in a single sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete enough for a simple listing operation, especially with an output schema present. It conveys scope and exclusions, though it leaves parameter details unspecified, which is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has no parameter descriptions and the tool description only mentions pagination generically. It does not explain the meaning of project_id, limit, offset, or revision, leaving agents to infer their roles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists committed revisions and summaries with pagination, and explicitly excludes interrupted uncommitted stages. This distinguishes it from related history operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It communicates when to use the tool — for committed revision history — and what is excluded. It does not explicitly name alternative tools like history_restore, but the scope is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

history_restoreA

Restore a committed revision by creating a NEW revision; requires the current expected_revision and preserves history.

ParametersJSON Schema
NameRequiredDescriptionDefault
summaryNo
project_idYes
target_revisionYes
expected_revisionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
dataNo
errorNo
changedNo
summaryYes
revisionNo
warningsNo
project_idNo

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnlyHint false, destructiveHint false), the description adds that it creates a new revision and preserves history, clarifying the additive nature. It also implies a concurrency check via expected_revision. However, it does not mention failure modes or side effects on the current working revision.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence with no irrelevant information. It efficiently covers the core action, key requirements, and a critical behavioral guarantee (preserves history).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While the purpose is clear and the output schema is present (so return values are not needed), the description lacks details on when to use the tool, what happens to the current state, and potential error conditions. The requirement of expected_revision is a critical precondition, but other context is sparse.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has zero description coverage for parameters. The description mentions 'expected_revision' but does not explain 'target_revision', 'project_id', or 'summary'. It fails to map each parameter to its role, leaving the agent to infer that 'target_revision' is the revision to restore and 'summary' is likely a commit message.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: restoring a committed revision by creating a new revision. It distinguishes itself from siblings by emphasizing the non-destructive, additive nature (preserves history) and the requirement for expected_revision, making the action unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a precondition (requires expected_revision) but offers no guidance on when to use this tool versus alternatives like history_list or project_update. It lacks contextual cues for selecting this tool over others.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_createA

Create a project in the launch workspace with Unicode UFO sources and technical glyphs.

ParametersJSON Schema
NameRequiredDescriptionDefault
briefNo
metricsNo
metadataYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
dataNo
errorNo
changedNo
summaryYes
revisionNo
warningsNo
project_idNo

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explicitly states the create action, which is consistent with the annotation readOnlyHint=false. It adds context about the workspace and initial content, but does not disclose potential side effects such as overwriting or behavior on name conflicts. Since annotations already cover mutability, the added context earns a slightly above baseline score.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that starts with the action verb and includes essential context. There is no redundant or extraneous information, making it well-structured and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While the description provides some context about the workspace and initial content, it does not explain the meaning of the required 'metadata' field or the optional 'metrics' and 'brief'. Given the schema's complexity and the creation context, the description is insufficient for an agent to fully understand what information to provide.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 0%, and the description provides no information about the parameters 'brief', 'metrics', or 'metadata'. Since the schema is not self-explanatory for these parameters and the description completely omits them, it fails to compensate for the lack of schema-level descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Create' and the resource 'project', while specifying the workspace and initial content ('Unicode UFO sources and technical glyphs'). This distinguishes it from sibling tools like project_open and project_update.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for project creation but does not explicitly explain when to use this tool versus alternatives. There is no mention of exclusions or specific scenarios, leaving the usage guidance to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_inspectA
Read-onlyIdempotent

Inspect a specified revision, metadata, metrics, kerning and a paginated glyph inventory.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
revisionNo
project_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
dataNo
errorNo
changedNo
summaryYes
revisionNo
warningsNo
project_idNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description states an inspection action, and annotations confirm read-only, idempotent, non-destructive behavior. No contradictions. It could further note that no modifications will occur, but annotations already cover the main safety profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise, front-loaded sentence with no redundant or extraneous content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main purpose and parameter implications, and an output schema is present, so return values need not be described. It lacks explicit note on null revision semantics, but the context is otherwise adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description partially explains parameters: 'specified revision' clarifies revision, and 'paginated glyph inventory' implies limit/offset. However, project_id is not explained, and there are no schema-level descriptions. The meaning of a null revision is also left implicit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Inspect') and the resource/scope: revision, metadata, metrics, kerning, and paginated glyph inventory. This is specific enough to distinguish it from similar project and glyph tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no explicit guidance on when to use this tool versus alternatives such as project_open, glyph_get, or history_list. Usage must be inferred from the tool name and read-only annotations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_openA
Read-onlyIdempotent

Reopen a server-created project by ID; verifies committed sources and returns its revision.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
dataNo
errorNo
changedNo
summaryYes
revisionNo
warningsNo
project_idNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, establishing safety and idempotency. The description adds behavioral context by mentioning that it verifies committed sources and returns a revision, which are useful traits beyond the annotation coverage. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the primary action and resource, with no redundant words. Every clause adds information, making it highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and an existing output schema, the description covers the essential purpose and key behaviors. It does not need to explain return values since the output schema handles that. However, it could have provided a brief note on when to use it relative to siblings, but overall it is sufficiently complete for a low-complexity operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at 0%, the description should compensate for missing parameter details. The only parameter, project_id, is mentioned generically as 'by ID' but not elaborated on (format, pattern, constraints). The schema provides the pattern, but the description adds no semantic value beyond what is already inferable from the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Reopen'), the resource ('server-created project'), the method (by ID), and additional details (verifies committed sources, returns revision). It distinguishes itself from siblings like project_create and project_inspect by specifying the reopen operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide any guidance on when to use this tool versus alternatives. It implies usage for reopening an existing project but does not mention conditions, exclusions, or alternative tools, leaving the agent to infer the appropriate context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_updateA

Atomically update metadata, brief or decision journal. Requires expected_revision. UPM changes on nonempty fonts fail.

ParametersJSON Schema
NameRequiredDescriptionDefault
briefNo
metricsNo
summaryNo
decisionNo
metadataNo
project_idYes
expected_revisionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
dataNo
errorNo
changedNo
summaryYes
revisionNo
warningsNo
project_idNo

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are all false (readOnlyHint=false, destructiveHint=false), so the description carries the behavioral burden. It adds three genuinely useful traits: atomicity of the update, the optimistic-concurrency requirement (expected_revision), and a specific failure mode (UPM changes on nonempty fonts fail). This goes well beyond the bare annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: the first front-loads purpose and atomicity, the second adds the revision requirement and a failure caveat. No filler, though 'nonempty fonts' is slightly cryptic without definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema covers return values, and the description addresses the key gotchas (revision, UPM failure). But it leaves gaps: how to obtain expected_revision, what happens on mismatch, and whether multiple sub-resources can be updated in one call (atomicity hints yes but is unstated). Adequate but not comprehensive for a 7-parameter mutator.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description must compensate for the 7 parameters. It covers expected_revision, metadata, brief, decision, and UPM (units_per_em) conceptually, but it omits summary, project_id, and any detail about the nested Metrics/Decision/Metadata structures. Partial compensation, not full.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('update') with a clear resource ('metadata, brief or decision journal'), which distinguishes it from siblings like project_create and project_inspect. It doesn't explicitly name a differentiating sibling, but the scoping to project-level sub-resources makes the purpose unambiguous and non-tautological.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context through 'Requires expected_revision,' which signals a concurrency-control workflow (obtain revision, then update), and the UPM caveat warns against a failure condition. However, it never explicitly states when to prefer this over project_create/project_inspect or what to do when the revision mismatches — the workflow is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_glyphC

Persist and return PNG image content from the selected UFO revision, with optional guides/handles. Comparison uses the same frame.

ParametersJSON Schema
NameRequiredDescriptionDefault
widthNo
guidesNo
heightNo
pointsNo
glyph_idYes
revisionNo
project_idYes
compare_revisionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
dataNo
errorNo
changedNo
summaryYes
revisionNo
warningsNo
project_idNo

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are all false, so the description must carry behavioral transparency. It mentions 'Persist' implying a side effect, but does not explain what persists or whether it modifies state. It lacks details on side effects, idempotency, or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief and front-loaded with the primary action. It avoids excessive detail, though the word 'Persist' adds mild ambiguity without much benefit.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With eight parameters and no schema descriptions, the description leaves too much unspecified. It does not mention output format specifics, parameter constraints, or any context about revisions and comparison, making it incomplete for reliable invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the description only vaguely references 'UFO revision', 'guides/handles', and 'comparison'. It fails to map parameters like width, height, guides, points, revision, and compare_revision to their meanings or relationships.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource (glyph) and the action (render and return PNG content), and it distinguishes from text rendering by referencing a 'UFO revision'. The phrase 'Persist and return' is somewhat ambiguous about whether it saves or simply produces, but the core purpose is clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit guidance on when to use this tool versus alternatives like render_text or glyph_get. It mentions 'Comparison uses the same frame' which hints at compare_revision, but does not clarify scenarios or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_textC

Compile the revision, shape with HarfBuzz and return monochrome FreeType PNGs. Missing Unicode is reported; no fallback font. Optional same-conditions revision comparison.

ParametersJSON Schema
NameRequiredDescriptionDefault
darkNo
kernNo
textYes
sizesNo
widthNo
revisionNo
project_idYes
compare_revisionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
dataNo
errorNo
changedNo
summaryYes
revisionNo
warningsNo
project_idNo

TDQS

C2.2/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description does not disclose side effects, permissions, authentication requirements, or potential limitations. Annotations indicate readOnlyHint false but provide no additional context, leaving behavioral impact unclear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, consisting of two sentences with no redundant or extraneous content. It efficiently communicates the primary action and an optional feature.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (8 parameters, output schema, optional comparison logic), the description is far too minimal. It omits critical details about parameter semantics, output format, revision handling, and error behavior (e.g., 'missing Unicode is reported'). The description does not adequately prepare an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 8 parameters with zero description coverage. The text vaguely references 'revision' and 'compare_revision' but does not explain the meaning or expected values of parameters like width, dark, kern, sizes, or project_id. No parameter-level detail is provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool compiles a revision, shapes with HarfBuzz, and returns monochrome FreeType PNGs, also mentioning an optional comparison feature. It is specific enough to understand the core function, though it does not explicitly differentiate from sibling tools such as render_glyph.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like render_glyph or font_build. The mention of 'optional same-conditions revision comparison' describes a feature, not a usage context or decision criterion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

spacing_editB

Atomically set advances, both side bearings, kerning groups or pairs. Bearings move outlines; advances do not.

ParametersJSON Schema
NameRequiredDescriptionDefault
summaryNo
operationsYes
project_idYes
expected_revisionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
dataNo
errorNo
changedNo
summaryYes
revisionNo
warningsNo
project_idNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses key behavioral details: operations are applied atomically, and adjusting bearings can move outlines while advances do not. However, it does not mention revision checks, validation failures, or other side effects like potential destructive changes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, using two short sentences to convey core purpose and a key behavioral nuance without unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description names the supported operation types and a key side effect, which is helpful. However, it lacks guidance on parameter usage and expected revision handling, making it only partially complete for a tool with a complex operations union.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description provides no explanation of the parameters, including project_id, expected_revision, operations, or the operation discriminators. With 0% schema description coverage, the description leaves all parameter semantics to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: atomically setting advances, side bearings, kerning groups, or pairs. It names the specific spacing resources and adds a useful distinction between bearings and advances.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explain when to use this tool versus alternatives like glyph_edit or font_update, and it does not mention concurrency controls such as expected_revision. The atomicity hint is useful but not sufficient as usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 13 tool updatesv0.1.0
    • First observedfont_build
    • First observedfont_validate
    • First observedglyph_edit
    • First observedglyph_get
    • First observedhistory_list
    • First observedhistory_restore
    • First observedproject_create
    • First observedproject_inspect
    • First observedproject_open
    • First observedproject_update
    • First observedrender_glyph
    • First observedrender_text
    • First observedspacing_edit

TDQS

B3.4/5.0
Disambiguation5/5

Each tool has a clear, distinct purpose across project lifecycle, glyph editing, spacing, rendering, validation/build, and history. No two tools overlap ambiguously.

Naming Consistency4/5

Most tools follow a resource_action pattern (project_create, glyph_get, history_list), but render_glyph and render_text use action_resource, creating a minor inconsistency.

Tool Count5/5

13 tools is well-scoped for a font design server, covering projects, glyphs, spacing, rendering, building, validation, and history without bloat.

Completeness4/5

Core workflows are covered, including project lifecycle, glyph editing, spacing, validation, build, and history. However, explicit glyph create/delete and project delete operations are absent, leaving minor lifecycle gaps.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to diagnose, modify, and validate OTF/TTF fonts interactively through a set of read-only, write, and validation tools.
    -
  • A
    license
    Not graded
    quality
    D
    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
    C
    maintenance
    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.
    7
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI tools to create and edit Font Proof documents for type designers, supporting PDF font proofs and live-reload from Glyphs.app.
    26
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Kydaix/Font-Design-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server