Font Design MCP
Click on "Install 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 MCPCreate 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 · Documentation · Report an issue
Get started
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. 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 ./workspacedoctor 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 |
| 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: 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.

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.
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 |
| 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 |
| 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 |
| Check geometry, Unicode coverage, compilation, and OpenType tables |
| Export TTF and/or WOFF2 from a frozen revision |
| Browse committed revisions and change summaries |
| 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.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. 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 buildOutput: 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.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 | 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 |
Input conventions, vector operations, spacing, results, and error codes | |
Schemas exported from a live | |
Domain, persistence, rendering, compilation, limits, and recovery | |
Original acceptance evidence, captures, and remaining visual review | |
Locked dependencies and native-library notices | |
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 toolsfont_buildA
Build real TTF and/or WOFF2 from a frozen revision. Returns persistent relative paths and hashes. Does not alter UFO sources.
| Name | Required | Description | Default |
|---|---|---|---|
| formats | No | ||
| revision | No | ||
| project_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| changed | No | |
| summary | Yes | |
| revision | No | |
| warnings | No | |
| project_id | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| corpus | No | ||
| revision | No | ||
| project_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| changed | No | |
| summary | Yes | |
| revision | No | |
| warnings | No | |
| project_id | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| create | No | ||
| summary | No | ||
| glyph_id | Yes | ||
| operations | Yes | ||
| project_id | Yes | ||
| expected_revision | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| changed | No | |
| summary | Yes | |
| revision | No | |
| warnings | No | |
| project_id | No |
TDQS
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.
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.
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.
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.
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.
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_getARead-onlyIdempotent
Read stable contour/point/component/anchor IDs and advance, bounds and bearings in font units, Y upwards.
| Name | Required | Description | Default |
|---|---|---|---|
| glyph_id | Yes | ||
| revision | No | ||
| project_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| changed | No | |
| summary | Yes | |
| revision | No | |
| warnings | No | |
| project_id | No |
TDQS
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.
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.
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.
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.
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.
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_listARead-onlyIdempotent
List committed revisions and summaries with pagination; interrupted uncommitted stages are excluded.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| revision | No | ||
| project_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| changed | No | |
| summary | Yes | |
| revision | No | |
| warnings | No | |
| project_id | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| summary | No | ||
| project_id | Yes | ||
| target_revision | Yes | ||
| expected_revision | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| changed | No | |
| summary | Yes | |
| revision | No | |
| warnings | No | |
| project_id | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| brief | No | ||
| metrics | No | ||
| metadata | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| changed | No | |
| summary | Yes | |
| revision | No | |
| warnings | No | |
| project_id | No |
TDQS
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.
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.
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.
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.
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.
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_inspectARead-onlyIdempotent
Inspect a specified revision, metadata, metrics, kerning and a paginated glyph inventory.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| revision | No | ||
| project_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| changed | No | |
| summary | Yes | |
| revision | No | |
| warnings | No | |
| project_id | No |
TDQS
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.
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.
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.
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.
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.
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_openARead-onlyIdempotent
Reopen a server-created project by ID; verifies committed sources and returns its revision.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| changed | No | |
| summary | Yes | |
| revision | No | |
| warnings | No | |
| project_id | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| brief | No | ||
| metrics | No | ||
| summary | No | ||
| decision | No | ||
| metadata | No | ||
| project_id | Yes | ||
| expected_revision | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| changed | No | |
| summary | Yes | |
| revision | No | |
| warnings | No | |
| project_id | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| width | No | ||
| guides | No | ||
| height | No | ||
| points | No | ||
| glyph_id | Yes | ||
| revision | No | ||
| project_id | Yes | ||
| compare_revision | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| changed | No | |
| summary | Yes | |
| revision | No | |
| warnings | No | |
| project_id | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| dark | No | ||
| kern | No | ||
| text | Yes | ||
| sizes | No | ||
| width | No | ||
| revision | No | ||
| project_id | Yes | ||
| compare_revision | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| changed | No | |
| summary | Yes | |
| revision | No | |
| warnings | No | |
| project_id | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| summary | No | ||
| operations | Yes | ||
| project_id | Yes | ||
| expected_revision | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| changed | No | |
| summary | Yes | |
| revision | No | |
| warnings | No | |
| project_id | No |
TDQS
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.
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.
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.
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.
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.
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.
13 tool updates
v0.1.0- First observed
font_build - First observed
font_validate - First observed
glyph_edit - First observed
glyph_get - First observed
history_list - First observed
history_restore - First observed
project_create - First observed
project_inspect - First observed
project_open - First observed
project_update - First observed
render_glyph - First observed
render_text - First observed
spacing_edit
TDQS
Each tool has a clear, distinct purpose across project lifecycle, glyph editing, spacing, rendering, validation/build, and history. No two tools overlap ambiguously.
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.
13 tools is well-scoped for a font design server, covering projects, glyphs, spacing, rendering, building, validation, and history without bloat.
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
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
AI-agent design tools: fonts, font recognition, palettes, color naming, contrast, code, SVG, CSS.
Cross-agent artifact workspace with provenance across Claude Code, Codex, Cursor, LangGraph.
Git-backed platform for skills, tools, and context for AI agents
Private projects, preflight, decisions, and handoffs that keep work continuous across AI tools.
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.-
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with FontLab for font design and manipulation, including querying font metadata, creating/modifying glyphs, applying transformations, and exporting fonts.8MIT
- AlicenseNot gradedqualityCmaintenanceMCP 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.7MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI tools to create and edit Font Proof documents for type designers, supporting PDF font proofs and live-reload from Glyphs.app.26MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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