Skip to main content
Glama
Kydaix

Font Design MCP

by Kydaix

font_edit

Edit up to 128 glyphs atomically in a font master and apply spacing; validation failures roll back the entire batch to keep outlines consistent.

Instructions

Edit up to 128 glyphs atomically in master_id (default: 'default'), then apply spacing. Forward component references resolve at final validation; any failure rolls back the batch.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
detailNosummary
glyphsYes
spacingNo
summaryNo
master_idNodefault
project_idYes
expected_revisionYes

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
okYes
dataNo
errorNo
changedNo
summaryYes
revisionNo
warningsNo
project_idNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed9 schema fields changedv0.6.0
    • addedInput schema / $defs / DetachStrokeNetwork
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "op": {
      +      "const": "detach_stroke_network",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "op"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / $defs / GlyphChange / properties / operations / items / discriminator / mapping / detach_stroke_network
      Added value: +"#/$defs/DetachStrokeNetwork"
    • addedInput schema / $defs / GlyphChange / properties / operations / items / discriminator / mapping / stroke_network
      Added value: +"#/$defs/SetStrokeNetwork"
    • addedInput schema / $defs / GlyphChange / properties / operations / items / discriminator / mapping / update_stroke_network
      Added value: +"#/$defs/UpdateStrokeNetwork"
    • changedInput schema / $defs / GlyphChange / properties / operations / items / oneOf
      Previous value: -[
      -  {
      -    "$ref": "#/$defs/PutContour"
      -  },
      -  {
      -    "$ref": "#/$defs/MovePoint"
      -  },
      -  {
      -    "$ref": "#/$defs/MoveHandle"
      -  },
      -  {
      -    "$ref": "#/$defs/SetSmooth"
      -  },
      -  {
      -    "$ref": "#/$defs/DetachComposition"
      -  },
      -  {
      -    "$ref": "#/$defs/Transform"
      -  },
      -  {
      -    "$ref": "#/$defs/PutComponent"
      -  },
      -  {
      -    "$ref": "#/$defs/PutAnchor"
      -  },
      -  {
      -    "$ref": "#/$defs/Remove"
      -  },
      -  {
      -    "$ref": "#/$defs/SetUnicodes"
      -  },
      -  {
      -    "$ref": "#/$defs/ReplaceGlyph"
      -  },
      -  {
      -    "$ref": "#/$defs/FilledPath"
      -  },
      -  {
      -    "$ref": "#/$defs/StrokePath"
      -  },
      -  {
      -    "$ref": "#/$defs/Primitive"
      -  },
      -  {
      -    "$ref": "#/$defs/Duplicate"
      -  },
      -  {
      -    "$ref": "#/$defs/ComposeAccent"
      -  }
      -]New value: +[
      +  {
      +    "$ref": "#/$defs/PutContour"
      +  },
      +  {
      +    "$ref": "#/$defs/MovePoint"
      +  },
      +  {
      +    "$ref": "#/$defs/MoveHandle"
      +  },
      +  {
      +    "$ref": "#/$defs/SetSmooth"
      +  },
      +  {
      +    "$ref": "#/$defs/DetachComposition"
      +  },
      +  {
      +    "$ref": "#/$defs/Transform"
      +  },
      +  {
      +    "$ref": "#/$defs/PutComponent"
      +  },
      +  {
      +    "$ref": "#/$defs/PutAnchor"
      +  },
      +  {
      +    "$ref": "#/$defs/Remove"
      +  },
      +  {
      +    "$ref": "#/$defs/SetUnicodes"
      +  },
      +  {
      +    "$ref": "#/$defs/ReplaceGlyph"
      +  },
      +  {
      +    "$ref": "#/$defs/FilledPath"
      +  },
      +  {
      +    "$ref": "#/$defs/StrokePath"
      +  },
      +  {
      +    "$ref": "#/$defs/SetStrokeNetwork"
      +  },
      +  {
      +    "$ref": "#/$defs/UpdateStrokeNetwork"
      +  },
      +  {
      +    "$ref": "#/$defs/DetachStrokeNetwork"
      +  },
      +  {
      +    "$ref": "#/$defs/Primitive"
      +  },
      +  {
      +    "$ref": "#/$defs/Duplicate"
      +  },
      +  {
      +    "$ref": "#/$defs/ComposeAccent"
      +  }
      +]
    • addedInput schema / $defs / NetworkStroke
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "cap": {
      +      "default": "butt",
      +      "enum": [
      +        "round",
      +        "butt",
      +        "square"
      +      ],
      +      "type": "string"
      +    },
      +    "id": {
      +      "pattern": "^[a-zA-Z_][a-zA-Z0-9_]{0,15}$",
      +      "type": "string"
      +    },
      +    "join": {
      +      "default": "miter",
      +      "enum": [
      +        "round",
      +        "bevel",
      +        "miter"
      +      ],
      +      "type": "string"
      +    },
      +    "path": {
      +      "maxLength": 16000,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "width_parameter": {
      +      "pattern": "^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,63}$",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "id",
      +    "path",
      +    "width_parameter"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / $defs / SetStrokeNetwork
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "network": {
      +      "$ref": "#/$defs/StrokeNetwork"
      +    },
      +    "op": {
      +      "const": "stroke_network",
      +      "type": "string"
      +    },
      +    "replace": {
      +      "default": false,
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "op",
      +    "network"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / $defs / StrokeNetwork
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "advance": {
      +      "default": 600,
      +      "maximum": 16000,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "horizontal_scale": {
      +      "default": 1,
      +      "exclusiveMinimum": 0,
      +      "maximum": 4,
      +      "type": "number"
      +    },
      +    "origin_x": {
      +      "default": 0,
      +      "maximum": 16000,
      +      "minimum": -16000,
      +      "type": "number"
      +    },
      +    "parameters": {
      +      "maxProperties": 16,
      +      "minProperties": 1,
      +      "patternProperties": {
      +        "^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,63}$": {
      +          "exclusiveMinimum": 0,
      +          "maximum": 2000,
      +          "type": "number"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "strokes": {
      +      "items": {
      +        "$ref": "#/$defs/NetworkStroke"
      +      },
      +      "maxItems": 16,
      +      "minItems": 1,
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "parameters",
      +    "strokes"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / $defs / UpdateStrokeNetwork
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "advance": {
      +      "anyOf": [
      +        {
      +          "maximum": 16000,
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null
      +    },
      +    "horizontal_scale": {
      +      "anyOf": [
      +        {
      +          "exclusiveMinimum": 0,
      +          "maximum": 4,
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null
      +    },
      +    "op": {
      +      "const": "update_stroke_network",
      +      "type": "string"
      +    },
      +    "parameters": {
      +      "maxProperties": 16,
      +      "patternProperties": {
      +        "^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,63}$": {
      +          "exclusiveMinimum": 0,
      +          "maximum": 2000,
      +          "type": "number"
      +        }
      +      },
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "op"
      +  ],
      +  "type": "object"
      +}
  2. Changed9 schema fields changedv0.5.0
    • addedInput schema / $defs / ComposeAccent / properties / auto_align
      Added value: +{
      +  "default": false,
      +  "type": "boolean"
      +}
    • addedInput schema / $defs / DetachComposition
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "op": {
      +      "const": "detach_composition",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "op"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / $defs / GlyphChange / properties / operations / items / discriminator / mapping / detach_composition
      Added value: +"#/$defs/DetachComposition"
    • addedInput schema / $defs / GlyphChange / properties / operations / items / discriminator / mapping / move_handle
      Added value: +"#/$defs/MoveHandle"
    • addedInput schema / $defs / GlyphChange / properties / operations / items / discriminator / mapping / set_smooth
      Added value: +"#/$defs/SetSmooth"
    • changedInput schema / $defs / GlyphChange / properties / operations / items / oneOf
      Previous value: -[
      -  {
      -    "$ref": "#/$defs/PutContour"
      -  },
      -  {
      -    "$ref": "#/$defs/MovePoint"
      -  },
      -  {
      -    "$ref": "#/$defs/Transform"
      -  },
      -  {
      -    "$ref": "#/$defs/PutComponent"
      -  },
      -  {
      -    "$ref": "#/$defs/PutAnchor"
      -  },
      -  {
      -    "$ref": "#/$defs/Remove"
      -  },
      -  {
      -    "$ref": "#/$defs/SetUnicodes"
      -  },
      -  {
      -    "$ref": "#/$defs/ReplaceGlyph"
      -  },
      -  {
      -    "$ref": "#/$defs/FilledPath"
      -  },
      -  {
      -    "$ref": "#/$defs/StrokePath"
      -  },
      -  {
      -    "$ref": "#/$defs/Primitive"
      -  },
      -  {
      -    "$ref": "#/$defs/Duplicate"
      -  },
      -  {
      -    "$ref": "#/$defs/ComposeAccent"
      -  }
      -]New value: +[
      +  {
      +    "$ref": "#/$defs/PutContour"
      +  },
      +  {
      +    "$ref": "#/$defs/MovePoint"
      +  },
      +  {
      +    "$ref": "#/$defs/MoveHandle"
      +  },
      +  {
      +    "$ref": "#/$defs/SetSmooth"
      +  },
      +  {
      +    "$ref": "#/$defs/DetachComposition"
      +  },
      +  {
      +    "$ref": "#/$defs/Transform"
      +  },
      +  {
      +    "$ref": "#/$defs/PutComponent"
      +  },
      +  {
      +    "$ref": "#/$defs/PutAnchor"
      +  },
      +  {
      +    "$ref": "#/$defs/Remove"
      +  },
      +  {
      +    "$ref": "#/$defs/SetUnicodes"
      +  },
      +  {
      +    "$ref": "#/$defs/ReplaceGlyph"
      +  },
      +  {
      +    "$ref": "#/$defs/FilledPath"
      +  },
      +  {
      +    "$ref": "#/$defs/StrokePath"
      +  },
      +  {
      +    "$ref": "#/$defs/Primitive"
      +  },
      +  {
      +    "$ref": "#/$defs/Duplicate"
      +  },
      +  {
      +    "$ref": "#/$defs/ComposeAccent"
      +  }
      +]
    • addedInput schema / $defs / MoveHandle
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "mode": {
      +      "default": "aligned",
      +      "enum": [
      +        "aligned",
      +        "symmetric"
      +      ],
      +      "type": "string"
      +    },
      +    "op": {
      +      "const": "move_handle",
      +      "type": "string"
      +    },
      +    "point_id": {
      +      "pattern": "^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,63}$",
      +      "type": "string"
      +    },
      +    "x": {
      +      "maximum": 16000,
      +      "minimum": -16000,
      +      "type": "number"
      +    },
      +    "y": {
      +      "maximum": 16000,
      +      "minimum": -16000,
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "op",
      +    "point_id",
      +    "x",
      +    "y"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / $defs / MovePoint / properties / preserve_handles
      Added value: +{
      +  "default": false,
      +  "type": "boolean"
      +}
    • addedInput schema / $defs / SetSmooth
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "op": {
      +      "const": "set_smooth",
      +      "type": "string"
      +    },
      +    "point_id": {
      +      "pattern": "^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,63}$",
      +      "type": "string"
      +    },
      +    "smooth": {
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "op",
      +    "point_id",
      +    "smooth"
      +  ],
      +  "type": "object"
      +}
  3. Addedv0.4.3

TDQS

B3.4/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnly=false, idempotent=false, destructive=false), and the description adds real behavior beyond them: atomicity, rollback on any failure, and deferred resolution of forward component references at final validation. That last point materially affects how a caller sequences dependent operations.

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 tightly packed sentences, front-loaded with the action and scope, then the correctness guarantees. No filler and no repetition of structured data beyond the master_id default.

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?

For a mutation tool with a very large nested schema and no output-value burden (an output schema exists), the description is too thin: it omits expected_revision semantics, the create flag on GlyphChange, and any sense of what the glyphs/spacing operation payloads do. Adequate for safety, inadequate for 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 description coverage is 0% across 7 parameters, and the description explains only master_id (including its default). The heavyweight inputs the agent must construct – glyphs with its 19-way operation union, spacing, project_id, expected_revision, summary, detail – are left entirely to the schema, and expected_revision's optimistic-concurrency role is never stated.

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?

States a specific verb (edit), resource (glyphs), and scope (up to 128, atomically in master_id, plus spacing). This distinguishes it from glyph_edit and spacing_edit implicitly via the batch/atomic/covers-both framing, but it never names a sibling to route the agent.

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?

No explicit when-to-use or when-not-to-use statement. The atomic 128-glyph batch with a trailing spacing pass implies the use case is bulk edits, but an agent must infer this and has no guidance on choosing between font_edit, glyph_edit, and spacing_edit.

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