Mixed quality across 21 tools. Strengths: descriptive tool docstrings (most 100 - 250 chars), clear verb-noun naming (get_, list_, create_, set_, delete_), and comprehensive input schemas with type definitions and per-parameter descriptions. Weaknesses: output schemas not documented in source; error handling generic (relies on HTTP errors returned by plugin); no validation examples or range constraints for numeric parameters; destructive tools (delete_glyph, execute_in_glyphs, export_glyphs) lack confirmation/dry-run patterns; tool annotations (readOnlyHint, destructiveHint) absent from all 21 tools, though risk metadata provided in this evaluation.
Audit glyphs for design quality issues.
Check one proposed typeface family name against Fontdata collision database.
Create a new glyph in the open font.
Delete a glyph from the font. This cannot be undone.
Execute Python code in GlyphsApp's environment.
Export all supported formats for one saved Glyphs source.
Get OpenType feature code from the font.
Missing output schema documentation. No tool in the source defines or documents its response structure (fields, types, pagination, error format). LLMs cannot plan downstream operations or extract required data without seeing what fields to expect.
Destructive tools lack confirmation/dry-run patterns. delete_glyph, execute_in_glyphs, and export_glyphs can permanently modify or delete data, but offer no dry-run mode or confirmation step. Agents will execute irreversible operations without safeguards.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 62 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 23 | - | v1 |
Get information about the currently open font in GlyphsApp. Returns font family name, units per em, glyph count, masters, axes, metrics (ascender, descender, x-height, cap height), and instances.
Get complete data for a specific glyph including all paths and metrics. Returns all layers with: paths (nodes with x,y coordinates, type, smooth), components, anchors, width, sidebearings. Node types: "line" (straight on-curve), "curve" (smooth on-curve), "offcurve" (cubic bezier control point). Path direction: -1 = counter-clockwise (outer contours), 1 = clockwise (inner contours/counters).
Get a glyph rendered as SVG markup. Returns SVG with viewBox matching the glyph's metrics. Useful for seeing the glyph shape as a vector image.
Get kerning pairs for a specific master (or first master if not specified).
Get all font masters with their metrics and axis positions. Returns master ID, name, ascender, descender, x-height, cap-height, and axis values for each master.
Get the full text of a recipe by name.
Get a specific step from a recipe.
Get the user's current selection in GlyphsApp's editor. Returns the active glyph name, layer, and any selected paths or nodes. Returns null selection if no tab or layer is active.
List glyphs in the open font with basic metadata. Returns glyph names, unicodes, category, subCategory. Does NOT include path data — use get_glyph() for full details.
List available recipes for multi-step workflows.
Set the color label of a glyph in the font view. Color index (0–11): 0=red, 1=orange, 2=brown, 3=yellow, 4=light green, 5=dark green, 6=teal, 7=blue, 8=purple, 9=pink, 10=light gray, 11=charcoal Use None/no color by setting any value outside this range.
Replace ALL paths on a glyph's layer in GlyphsApp. This OVERWRITES existing paths. The glyph must already exist. Each path is: {"closed": true, "nodes": [{"x": 100, "y": 0, "type": "line", "smooth": false}, ...]} Node types: - "line": on-curve point with straight connection to previous - "curve": on-curve point with smooth cubic bezier connection - "offcurve": cubic bezier control handle (always in pairs before a "curve") - Curve segments: offcurve, offcurve, curve (3 nodes per segment) Path direction: outer contours counter-clockwise, counters/holes clockwise. correctPathDirection() is called automatically after setting paths. If master_id is empty, uses the first master.
Set the advance width of a glyph.
Set a kerning pair value between two glyphs.
Missing tool annotations in FastMCP definitions. None of the 21 tools declare readOnlyHint, destructiveHint, or idempotentHint. The protocol supports these hints in tool definitions; they are essential for agents to understand side effects and plan safety.
Generic error handling. HTTP errors are relayed from the plugin without actionable recovery guidance. E.g., 'Cannot connect to GlyphsApp plugin' tells LLMs nothing about whether to retry, how long to wait, or what to check.
Incomplete parameter constraints. Numeric parameters (limit in list_glyphs, timeout in export_glyphs, color in set_glyph_color) lack min/max bounds. LLMs can pass nonsensical values (limit=999999, timeout=1000000, color=999) without validation hints in descriptions.
Sparse parameter descriptions on utility tools. get_features, list_recipes, get_recipe, and execute_in_glyphs have minimal or absent parameter guidance. E.g., execute_in_glyphs accepts arbitrary Python code with no hint about what libraries are available, what GlyphsApp objects are in scope, or what will fail.
No documented pagination for list_glyphs and get_kerning. Both accept limit but response structure and how to fetch subsequent pages are not described. Large fonts may return truncated results, and LLMs won't know how to retrieve the rest.
Vague error message for missing GlyphsApp plugin. The error 'Cannot connect to GlyphsApp plugin' does not tell LLMs whether this is a transient network issue, a missing dependency, or a misconfigured server. Agents cannot decide whether to retry.