Skip to main content
Glama
Kydaix

Font Design MCP

by Kydaix

project_update

Atomically update font project metadata, design brief, or decision journal while enforcing expected revision checks.

Instructions

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

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
briefNo
metricsNo
summaryNo
decisionNo
metadataNo
project_idYes
design_specNo
expected_revisionYes
remove_reference_idsNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
okYes
dataNo
errorNo
changedNo
summaryYes
revisionNo
warningsNo
project_idNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed15 schema fields changedv0.6.0
    • addedInput schema / $defs / DesignRegion
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "A declared area in normalized visible bounds; useful for non-Latin and alternate anatomy.",
      +  "properties": {
      +    "bounds": {
      +      "maxItems": 4,
      +      "minItems": 4,
      +      "prefixItems": [
      +        {
      +          "maximum": 1,
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        {
      +          "maximum": 1,
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        {
      +          "maximum": 1,
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        {
      +          "maximum": 1,
      +          "minimum": 0,
      +          "type": "number"
      +        }
      +      ],
      +      "type": "array"
      +    },
      +    "glyph_id": {
      +      "pattern": "^(?:\\.notdef|[a-zA-Z_][a-zA-Z0-9_.]{0,62})$",
      +      "type": "string"
      +    },
      +    "id": {
      +      "pattern": "^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,63}$",
      +      "type": "string"
      +    },
      +    "location": {
      +      "anyOf": [
      +        {
      +          "maxProperties": 4,
      +          "patternProperties": {
      +            "^[A-Za-z][A-Za-z0-9]{3}$": {
      +              "maximum": 32767,
      +              "minimum": -32768,
      +              "type": "number"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null
      +    },
      +    "master_id": {
      +      "anyOf": [
      +        {
      +          "pattern": "^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,63}$",
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null
      +    },
      +    "minimum_samples": {
      +      "default": 2,
      +      "maximum": 17,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    "role": {
      +      "enum": [
      +        "stem",
      +        "branch",
      +        "junction",
      +        "counter",
      +        "curve",
      +        "terminal"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "id",
      +    "glyph_id",
      +    "bounds",
      +    "role"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / $defs / DesignSpec / properties / glyph_origins
      Added value: +{
      +  "items": {
      +    "$ref": "#/$defs/GlyphOrigin"
      +  },
      +  "maxItems": 512,
      +  "type": "array"
      +}
    • addedInput schema / $defs / DesignSpec / properties / regions
      Added value: +{
      +  "items": {
      +    "$ref": "#/$defs/DesignRegion"
      +  },
      +  "maxItems": 512,
      +  "type": "array"
      +}
    • addedInput schema / $defs / DesignSpec / properties / stroke_profiles
      Added value: +{
      +  "items": {
      +    "$ref": "#/$defs/StrokeProfile"
      +  },
      +  "maxItems": 512,
      +  "type": "array"
      +}
    • addedInput schema / $defs / DesignSpec / properties / usage_texts
      Added value: +{
      +  "items": {
      +    "maxLength": 80,
      +    "minLength": 2,
      +    "type": "string"
      +  },
      +  "maxItems": 64,
      +  "type": "array"
      +}
    • addedInput schema / $defs / DesignSpec / properties / variation_probes
      Added value: +{
      +  "items": {
      +    "$ref": "#/$defs/VariationProbe"
      +  },
      +  "maxItems": 32,
      +  "type": "array"
      +}
    • addedInput schema / $defs / DesignSpec / properties / variation_profiles
      Added value: +{
      +  "items": {
      +    "$ref": "#/$defs/VariationProfile"
      +  },
      +  "maxItems": 128,
      +  "type": "array"
      +}
    • addedInput schema / $defs / GlyphOrigin
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "glyph_id": {
      +      "pattern": "^(?:\\.notdef|[a-zA-Z_][a-zA-Z0-9_.]{0,62})$",
      +      "type": "string"
      +    },
      +    "observation": {
      +      "maxLength": 1000,
      +      "minLength": 20,
      +      "type": "string"
      +    },
      +    "reference_ids": {
      +      "items": {
      +        "pattern": "^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,63}$",
      +        "type": "string"
      +      },
      +      "maxItems": 16,
      +      "type": "array"
      +    },
      +    "status": {
      +      "enum": [
      +        "observed",
      +        "extrapolated",
      +        "original"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "glyph_id",
      +    "status",
      +    "observation"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / $defs / MetricRule / properties / location
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maxProperties": 4,
      +      "patternProperties": {
      +        "^[A-Za-z][A-Za-z0-9]{3}$": {
      +          "maximum": 32767,
      +          "minimum": -32768,
      +          "type": "number"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • addedInput schema / $defs / MetricRule / properties / master_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "pattern": "^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,63}$",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • addedInput schema / $defs / StrokeProbe / properties / location
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maxProperties": 4,
      +      "patternProperties": {
      +        "^[A-Za-z][A-Za-z0-9]{3}$": {
      +          "maximum": 32767,
      +          "minimum": -32768,
      +          "type": "number"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • addedInput schema / $defs / StrokeProbe / properties / master_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "pattern": "^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,63}$",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • addedInput schema / $defs / StrokeProfile
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Sample perpendicular to a centerline; measure ink or a bounded counter, in font units.",
      +  "properties": {
      +    "end": {
      +      "maxItems": 2,
      +      "minItems": 2,
      +      "prefixItems": [
      +        {
      +          "maximum": 16000,
      +          "minimum": -16000,
      +          "type": "number"
      +        },
      +        {
      +          "maximum": 16000,
      +          "minimum": -16000,
      +          "type": "number"
      +        }
      +      ],
      +      "type": "array"
      +    },
      +    "glyph_id": {
      +      "pattern": "^(?:\\.notdef|[a-zA-Z_][a-zA-Z0-9_.]{0,62})$",
      +      "type": "string"
      +    },
      +    "id": {
      +      "pattern": "^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,63}$",
      +      "type": "string"
      +    },
      +    "location": {
      +      "anyOf": [
      +        {
      +          "maxProperties": 4,
      +          "patternProperties": {
      +            "^[A-Za-z][A-Za-z0-9]{3}$": {
      +              "maximum": 32767,
      +              "minimum": -32768,
      +              "type": "number"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null
      +    },
      +    "master_id": {
      +      "anyOf": [
      +        {
      +          "pattern": "^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,63}$",
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null
      +    },
      +    "max_ratio": {
      +      "anyOf": [
      +        {
      +          "maximum": 100,
      +          "minimum": 1,
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null
      +    },
      +    "maximum": {
      +      "exclusiveMinimum": 0,
      +      "maximum": 4000,
      +      "type": "number"
      +    },
      +    "minimum": {
      +      "exclusiveMinimum": 0,
      +      "maximum": 4000,
      +      "type": "number"
      +    },
      +    "region": {
      +      "default": "ink",
      +      "enum": [
      +        "ink",
      +        "counter"
      +      ],
      +      "type": "string"
      +    },
      +    "samples": {
      +      "default": 5,
      +      "maximum": 17,
      +      "minimum": 2,
      +      "type": "integer"
      +    },
      +    "start": {
      +      "maxItems": 2,
      +      "minItems": 2,
      +      "prefixItems": [
      +        {
      +          "maximum": 16000,
      +          "minimum": -16000,
      +          "type": "number"
      +        },
      +        {
      +          "maximum": 16000,
      +          "minimum": -16000,
      +          "type": "number"
      +        }
      +      ],
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "id",
      +    "glyph_id",
      +    "start",
      +    "end",
      +    "minimum",
      +    "maximum"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / $defs / VariationProbe
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Sample a declared stroke across an axis; this is not an optical weight estimate.",
      +  "properties": {
      +    "axis": {
      +      "default": "horizontal",
      +      "enum": [
      +        "horizontal",
      +        "vertical"
      +      ],
      +      "type": "string"
      +    },
      +    "axis_tag": {
      +      "pattern": "^[A-Za-z][A-Za-z0-9]{3}$",
      +      "type": "string"
      +    },
      +    "direction": {
      +      "default": "nondecreasing",
      +      "enum": [
      +        "nondecreasing",
      +        "nonincreasing"
      +      ],
      +      "type": "string"
      +    },
      +    "glyph_id": {
      +      "pattern": "^(?:\\.notdef|[a-zA-Z_][a-zA-Z0-9_.]{0,62})$",
      +      "type": "string"
      +    },
      +    "id": {
      +      "pattern": "^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,63}$",
      +      "type": "string"
      +    },
      +    "location": {
      +      "maxProperties": 4,
      +      "patternProperties": {
      +        "^[A-Za-z][A-Za-z0-9]{3}$": {
      +          "maximum": 32767,
      +          "minimum": -32768,
      +          "type": "number"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "minimum_change": {
      +      "default": 0,
      +      "maximum": 4000,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "position": {
      +      "maximum": 16000,
      +      "minimum": -16000,
      +      "type": "number"
      +    },
      +    "span_index": {
      +      "default": 0,
      +      "maximum": 63,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "tolerance": {
      +      "default": 2,
      +      "maximum": 1000,
      +      "minimum": 0.5,
      +      "type": "number"
      +    },
      +    "values": {
      +      "items": {
      +        "maximum": 32767,
      +        "minimum": -32768,
      +        "type": "number"
      +      },
      +      "maxItems": 9,
      +      "minItems": 2,
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "id",
      +    "glyph_id",
      +    "position",
      +    "axis_tag",
      +    "values"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / $defs / VariationProfile
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "axis_tag": {
      +      "pattern": "^[A-Za-z][A-Za-z0-9]{3}$",
      +      "type": "string"
      +    },
      +    "direction": {
      +      "default": "nondecreasing",
      +      "enum": [
      +        "nondecreasing",
      +        "nonincreasing"
      +      ],
      +      "type": "string"
      +    },
      +    "end": {
      +      "maxItems": 2,
      +      "minItems": 2,
      +      "prefixItems": [
      +        {
      +          "maximum": 16000,
      +          "minimum": -16000,
      +          "type": "number"
      +        },
      +        {
      +          "maximum": 16000,
      +          "minimum": -16000,
      +          "type": "number"
      +        }
      +      ],
      +      "type": "array"
      +    },
      +    "glyph_id": {
      +      "pattern": "^(?:\\.notdef|[a-zA-Z_][a-zA-Z0-9_.]{0,62})$",
      +      "type": "string"
      +    },
      +    "id": {
      +      "pattern": "^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,63}$",
      +      "type": "string"
      +    },
      +    "location": {
      +      "maxProperties": 4,
      +      "patternProperties": {
      +        "^[A-Za-z][A-Za-z0-9]{3}$": {
      +          "maximum": 32767,
      +          "minimum": -32768,
      +          "type": "number"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "master_id": {
      +      "anyOf": [
      +        {
      +          "pattern": "^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,63}$",
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null
      +    },
      +    "max_ratio": {
      +      "anyOf": [
      +        {
      +          "maximum": 100,
      +          "minimum": 1,
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null
      +    },
      +    "maximum": {
      +      "exclusiveMinimum": 0,
      +      "maximum": 4000,
      +      "type": "number"
      +    },
      +    "minimum": {
      +      "exclusiveMinimum": 0,
      +      "maximum": 4000,
      +      "type": "number"
      +    },
      +    "minimum_change": {
      +      "default": 0,
      +      "maximum": 4000,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "region": {
      +      "default": "ink",
      +      "enum": [
      +        "ink",
      +        "counter"
      +      ],
      +      "type": "string"
      +    },
      +    "samples": {
      +      "default": 5,
      +      "maximum": 17,
      +      "minimum": 2,
      +      "type": "integer"
      +    },
      +    "start": {
      +      "maxItems": 2,
      +      "minItems": 2,
      +      "prefixItems": [
      +        {
      +          "maximum": 16000,
      +          "minimum": -16000,
      +          "type": "number"
      +        },
      +        {
      +          "maximum": 16000,
      +          "minimum": -16000,
      +          "type": "number"
      +        }
      +      ],
      +      "type": "array"
      +    },
      +    "tolerance": {
      +      "default": 2,
      +      "maximum": 1000,
      +      "minimum": 0.5,
      +      "type": "number"
      +    },
      +    "values": {
      +      "items": {
      +        "maximum": 32767,
      +        "minimum": -32768,
      +        "type": "number"
      +      },
      +      "maxItems": 9,
      +      "minItems": 2,
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "id",
      +    "glyph_id",
      +    "start",
      +    "end",
      +    "minimum",
      +    "maximum",
      +    "axis_tag",
      +    "values"
      +  ],
      +  "type": "object"
      +}
  2. Changed5 schema fields changedv0.5.0
    • addedInput schema / $defs / DesignSpec
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "digit_spacing": {
      +      "default": "unspecified",
      +      "enum": [
      +        "unspecified",
      +        "proportional",
      +        "tabular"
      +      ],
      +      "type": "string"
      +    },
      +    "digit_tolerance": {
      +      "default": 0.5,
      +      "maximum": 100,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "metric_rules": {
      +      "items": {
      +        "$ref": "#/$defs/MetricRule"
      +      },
      +      "maxItems": 64,
      +      "type": "array"
      +    },
      +    "notes": {
      +      "default": "",
      +      "maxLength": 4000,
      +      "type": "string"
      +    },
      +    "protected_features": {
      +      "default": "",
      +      "maxLength": 4000,
      +      "type": "string"
      +    },
      +    "reference_glyphs": {
      +      "items": {
      +        "pattern": "^(?:\\.notdef|[a-zA-Z_][a-zA-Z0-9_.]{0,62})$",
      +        "type": "string"
      +      },
      +      "maxItems": 64,
      +      "type": "array"
      +    },
      +    "required_characters": {
      +      "default": "",
      +      "maxLength": 4000,
      +      "type": "string"
      +    },
      +    "stroke_probes": {
      +      "items": {
      +        "$ref": "#/$defs/StrokeProbe"
      +      },
      +      "maxItems": 128,
      +      "type": "array"
      +    },
      +    "tangent_tolerance_degrees": {
      +      "default": 3,
      +      "exclusiveMinimum": 0,
      +      "maximum": 30,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / $defs / MetricRule
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Explicit equality targets, not inferred rules of beauty. All values are font units.",
      +  "properties": {
      +    "glyphs": {
      +      "items": {
      +        "pattern": "^(?:\\.notdef|[a-zA-Z_][a-zA-Z0-9_.]{0,62})$",
      +        "type": "string"
      +      },
      +      "maxItems": 64,
      +      "minItems": 1,
      +      "type": "array"
      +    },
      +    "id": {
      +      "pattern": "^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,63}$",
      +      "type": "string"
      +    },
      +    "metric": {
      +      "enum": [
      +        "advance",
      +        "visible_width",
      +        "height",
      +        "left_bearing",
      +        "right_bearing"
      +      ],
      +      "type": "string"
      +    },
      +    "target": {
      +      "maximum": 16000,
      +      "minimum": -16000,
      +      "type": "number"
      +    },
      +    "tolerance": {
      +      "default": 1,
      +      "maximum": 1000,
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "id",
      +    "glyphs",
      +    "metric",
      +    "target"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / $defs / StrokeProbe
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Measure a filled interval on a declared scanline; choose away from junctions.",
      +  "properties": {
      +    "axis": {
      +      "default": "horizontal",
      +      "enum": [
      +        "horizontal",
      +        "vertical"
      +      ],
      +      "type": "string"
      +    },
      +    "glyph_id": {
      +      "pattern": "^(?:\\.notdef|[a-zA-Z_][a-zA-Z0-9_.]{0,62})$",
      +      "type": "string"
      +    },
      +    "id": {
      +      "pattern": "^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,63}$",
      +      "type": "string"
      +    },
      +    "position": {
      +      "maximum": 16000,
      +      "minimum": -16000,
      +      "type": "number"
      +    },
      +    "span_index": {
      +      "default": 0,
      +      "maximum": 63,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "target": {
      +      "exclusiveMinimum": 0,
      +      "maximum": 4000,
      +      "type": "number"
      +    },
      +    "tolerance": {
      +      "default": 2,
      +      "maximum": 1000,
      +      "minimum": 0.5,
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "id",
      +    "glyph_id",
      +    "position",
      +    "target"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / design_spec
      Added value: +{
      +  "anyOf": [
      +    {
      +      "$ref": "#/$defs/DesignSpec"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • addedInput schema / properties / remove_reference_ids
      Added value: +{
      +  "items": {
      +    "pattern": "^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,63}$",
      +    "type": "string"
      +  },
      +  "maxItems": 64,
      +  "type": "array"
      +}
  3. Changed30 schema fields changedv0.4.3
    • removedInput schema / $defs / Decision / properties / hypothesis / title
      Removed value: -"Hypothesis"
    • removedInput schema / $defs / Decision / properties / observation / title
      Removed value: -"Observation"
    • removedInput schema / $defs / Decision / properties / review / title
      Removed value: -"Review"
    • removedInput schema / $defs / Decision / properties / variant / title
      Removed value: -"Variant"
    • removedInput schema / $defs / Decision / title
      Removed value: -"Decision"
    • removedInput schema / $defs / Metadata / properties / copyright / title
      Removed value: -"Copyright"
    • removedInput schema / $defs / Metadata / properties / family / title
      Removed value: -"Family"
    • removedInput schema / $defs / Metadata / properties / license_text / title
      Removed value: -"License Text"
    • removedInput schema / $defs / Metadata / properties / style / title
      Removed value: -"Style"
    • removedInput schema / $defs / Metadata / title
      Removed value: -"Metadata"
    • removedInput schema / $defs / Metrics / properties / ascender / title
      Removed value: -"Ascender"
    • removedInput schema / $defs / Metrics / properties / cap_height / title
      Removed value: -"Cap Height"
    • removedInput schema / $defs / Metrics / properties / descender / title
      Removed value: -"Descender"
    • removedInput schema / $defs / Metrics / properties / units_per_em / title
      Removed value: -"Units Per Em"
    • removedInput schema / $defs / Metrics / properties / x_height / title
      Removed value: -"X Height"
    • removedInput schema / $defs / Metrics / title
      Removed value: -"Metrics"
    • removedInput schema / properties / brief / title
      Removed value: -"Brief"
    • removedInput schema / properties / expected_revision / title
      Removed value: -"Expected Revision"
    • removedInput schema / properties / project_id / title
      Removed value: -"Project Id"
    • removedInput schema / properties / summary / title
      Removed value: -"Summary"
    • removedInput schema / title
      Removed value: -"ProjectUpdate"
    • removedOutput schema / properties / changed / title
      Removed value: -"Changed"
    • removedOutput schema / properties / data / title
      Removed value: -"Data"
    • removedOutput schema / properties / error / title
      Removed value: -"Error"
    • removedOutput schema / properties / ok / title
      Removed value: -"Ok"
    • removedOutput schema / properties / project_id / title
      Removed value: -"Project Id"
    • removedOutput schema / properties / revision / title
      Removed value: -"Revision"
    • removedOutput schema / properties / summary / title
      Removed value: -"Summary"
    • removedOutput schema / properties / warnings / title
      Removed value: -"Warnings"
    • removedOutput schema / title
      Removed value: -"Result"
  4. First observedv0.1.0

TDQS

B3.1/5.0
Behavior4/5

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

Annotations already declare the safety profile (not read-only, not idempotent, not destructive), so the bar is lower. The description adds real context beyond them: atomicity of the operation, the optimistic-concurrency requirement of expected_revision, and a concrete failure condition ('UPM changes on nonempty fonts fail'). It stops short of saying what happens on revision mismatch or whether omitted fields are cleared.

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?

Three short sentences, front-loaded with the core action, then the precondition, then the failure caveat. Zero padding. Slight deduction because 'UPM' is used as undefined jargon that an agent cannot map to units_per_em without schema inspection.

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?

This is a complex 9-parameter mutation tool with 0% schema coverage, and the description covers only a fraction of the input surface. The presence of an output schema removes the need to explain return values, but the missing guidance on the remaining update domains, revision-mismatch behavior, and field-clearing semantics leaves the definition under-specified for its complexity.

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 9 parameters, several of them deeply nested objects, so the description must carry the burden. It names only three of the update domains (metadata, brief, decision) and leaves design_spec, metrics, summary, remove_reference_ids, project_id, and expected_revision format/semantics unexplained. Partial compensation at best.

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 and resource with scope: 'Atomically update metadata, brief or decision journal.' An agent can tell this is the mutation counterpart to project_create/project_open/project_inspect without opening a schema. It does not, however, enumerate the full set of updatable surfaces (metrics, design_spec, summary, remove_reference_ids) or name a sibling explicitly.

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 only usage guidance is the precondition 'Requires expected_revision.' There is no statement of when to prefer this over project_inspect, project_open, or history_restore, and no guidance on partial vs full updates. The agent is left to infer the workflow context.

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