Skip to main content
Glama

Edit a model

edit_model
Destructive

Edits an existing model with a list of changes, applied in order and all or nothing: add, update, or remove nodes, relationships, properties, and notes; rename or remove layers; or rename the model. Removing a node also removes its relationships. Removing a layer deletes its nodes and relationships, or moves them to the layer named in moveContentsTo; nodes that also belong to another layer stay there. Refer to existing items by their ids from get_model, and give new items a ref so that later changes in the same list can refer to them. New nodes are placed next to the nodes they connect to; set arrange to true to lay out the whole model again. Before your changes are applied, the model is saved as a version, so restore_version can undo them. Anyone who has the model open sees the changes right away, so when you're reviewing a model, propose your changes and make them only after the user agrees. Pass the guideCode from get_modeling_guide. Each model describes a Neo4j schema, not instance data. It holds nodes such as (:Customer), (:Order), or (:Router:Egress), and the relationships between them, such as (:Customer)-[:PLACED]->(:Order). No two nodes can have the same set of labels. Every relationship has a direction. Follow Neo4j's naming conventions: PascalCase for node labels, UPPER_SNAKE_CASE for relationship types, and camelCase for property keys. toro4n converts new names to these conventions. Labels and property keys keep runs of capitals, as in USB and IPAddress. Spaces, underscores, and hyphens always stay as written. Editing a node or relationship leaves its existing names unchanged. Each property has a key and can also have a property type, an example value, and uniqueness and existence constraints. On a node, the first property's example is shown as its caption, so put the most descriptive property first. Leave examples out unless you have realistic values.

Input Schema

NameRequiredDescriptionDefault
arrangeNoSet to true to lay out the whole model again, the way the Arrange button does: as few crossing relationships as possible, with nodes, relationship types, and notes spaced so that nothing overlaps.
changesYes
modelIdYesThe model's id, from list_models or from a model link.
guideCodeNoThe guideCode that get_modeling_guide returns. Required: call get_modeling_guide and read the guide before you create or edit a model.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / changes / items / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "add_node",
      -        "type": "string"
      -      },
      -      "color": {
      -        "description": "Fill color as a hex code, such as #0a84ff. Omit it to use the model style.",
      -        "maxLength": 40,
      -        "type": "string"
      -      },
      -      "labels": {
      -        "description": "Node labels, such as [\"Customer\"] or [\"Router\", \"Egress\"]. No two nodes can have the same set of labels.",
      -        "items": {
      -          "maxLength": 200,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "type": "array"
      -      },
      -      "layers": {
      -        "description": "Names of the layers the node belongs to. Any layer that doesn't exist yet is created.",
      -        "items": {
      -          "maxLength": 200,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "type": "array"
      -      },
      -      "properties": {
      -        "description": "Properties in display order. On a node, the first property's example is shown as its caption.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "example": {
      -              "description": "An example value.",
      -              "maxLength": 20000,
      -              "type": "string"
      -            },
      -            "key": {
      -              "description": "Property key in camelCase, such as orderId. For an existing property, use the key exactly as get_model spells it.",
      -              "maxLength": 200,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "required": {
      -              "description": "Set to true to add a property existence constraint (IS NOT NULL), which needs Neo4j Enterprise Edition or Aura.",
      -              "type": "boolean"
      -            },
      -            "type": {
      -              "description": "The Neo4j property type, one of: STRING, INTEGER, FLOAT, BOOLEAN, DATE, ZONED DATETIME, LOCAL DATETIME, LIST<STRING>, POINT, DURATION, LIST<BOOLEAN>, LIST<DATE>, LIST<DURATION>, LIST<FLOAT>, LIST<INTEGER>, LIST<LOCAL DATETIME>, LIST<LOCAL TIME>, LIST<POINT>, LIST<UUID>, LIST<ZONED DATETIME>, LIST<ZONED TIME>, LOCAL TIME, UUID, VECTOR, ZONED TIME. Omit it if unknown.",
      -              "maxLength": 100,
      -              "type": "string"
      -            },
      -            "unique": {
      -              "description": "Set to true to add a property uniqueness constraint (IS UNIQUE).",
      -              "type": "boolean"
      -            }
      -          },
      -          "required": [
      -            "key"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 500,
      -        "type": "array"
      -      },
      -      "ref": {
      -        "description": "A short name of your choosing, used to refer to the node later in this list.",
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "labels"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "update_node",
      -        "type": "string"
      -      },
      -      "color": {
      -        "anyOf": [
      -          {
      -            "description": "Fill color as a hex code, such as #0a84ff.",
      -            "maxLength": 40,
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Fill color as a hex code, or null to use the model style."
      -      },
      -      "labels": {
      -        "description": "Node labels, such as [\"Customer\"] or [\"Router\", \"Egress\"]. No two nodes can have the same set of labels.",
      -        "items": {
      -          "maxLength": 200,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "type": "array"
      -      },
      -      "layers": {
      -        "description": "Names of the layers the node belongs to. Any layer that doesn't exist yet is created.",
      -        "items": {
      -          "maxLength": 200,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "type": "array"
      -      },
      -      "node": {
      -        "description": "The node's id, or the ref of a node added earlier in this list.",
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "node"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "remove_node",
      -        "type": "string"
      -      },
      -      "node": {
      -        "description": "The node's id, or the ref of a node added earlier in this list.",
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "node"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "add_relationship",
      -        "type": "string"
      -      },
      -      "from": {
      -        "description": "The node's id, or the ref of a node added earlier in this list.",
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "properties": {
      -        "description": "Properties in display order. On a node, the first property's example is shown as its caption.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "example": {
      -              "description": "An example value.",
      -              "maxLength": 20000,
      -              "type": "string"
      -            },
      -            "key": {
      -              "description": "Property key in camelCase, such as orderId. For an existing property, use the key exactly as get_model spells it.",
      -              "maxLength": 200,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "required": {
      -              "description": "Set to true to add a property existence constraint (IS NOT NULL), which needs Neo4j Enterprise Edition or Aura.",
      -              "type": "boolean"
      -            },
      -            "type": {
      -              "description": "The Neo4j property type, one of: STRING, INTEGER, FLOAT, BOOLEAN, DATE, ZONED DATETIME, LOCAL DATETIME, LIST<STRING>, POINT, DURATION, LIST<BOOLEAN>, LIST<DATE>, LIST<DURATION>, LIST<FLOAT>, LIST<INTEGER>, LIST<LOCAL DATETIME>, LIST<LOCAL TIME>, LIST<POINT>, LIST<UUID>, LIST<ZONED DATETIME>, LIST<ZONED TIME>, LOCAL TIME, UUID, VECTOR, ZONED TIME. Omit it if unknown.",
      -              "maxLength": 100,
      -              "type": "string"
      -            },
      -            "unique": {
      -              "description": "Set to true to add a property uniqueness constraint (IS UNIQUE).",
      -              "type": "boolean"
      -            }
      -          },
      -          "required": [
      -            "key"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 500,
      -        "type": "array"
      -      },
      -      "ref": {
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "to": {
      -        "description": "The node's id, or the ref of a node added earlier in this list.",
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "type": {
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "from",
      -      "to",
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "update_relationship",
      -        "type": "string"
      -      },
      -      "from": {
      -        "description": "The node's id, or the ref of a node added earlier in this list.",
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "relationship": {
      -        "description": "The relationship's id, or the ref of a relationship added earlier in this list.",
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "to": {
      -        "description": "The node's id, or the ref of a node added earlier in this list.",
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "type": {
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "relationship"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "remove_relationship",
      -        "type": "string"
      -      },
      -      "relationship": {
      -        "description": "The relationship's id, or the ref of a relationship added earlier in this list.",
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "relationship"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "set_property",
      -        "type": "string"
      -      },
      -      "example": {
      -        "description": "An example value, or \"\" to clear it.",
      -        "maxLength": 20000,
      -        "type": "string"
      -      },
      -      "key": {
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "on": {
      -        "description": "The id or ref of the node or relationship the property belongs to.",
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "position": {
      -        "description": "Move the property to the top or the bottom of the list. On a node, the top property's example is shown as its caption.",
      -        "enum": [
      -          "first",
      -          "last"
      -        ],
      -        "type": "string"
      -      },
      -      "required": {
      -        "type": "boolean"
      -      },
      -      "type": {
      -        "description": "A property type, or \"\" to clear it.",
      -        "maxLength": 100,
      -        "type": "string"
      -      },
      -      "unique": {
      -        "type": "boolean"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "on",
      -      "key"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "rename_property",
      -        "type": "string"
      -      },
      -      "key": {
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "newKey": {
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "on": {
      -        "description": "The id or ref of the node or relationship the property belongs to.",
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "on",
      -      "key",
      -      "newKey"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "remove_property",
      -        "type": "string"
      -      },
      -      "key": {
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "on": {
      -        "description": "The id or ref of the node or relationship the property belongs to.",
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "on",
      -      "key"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "add_note",
      -        "type": "string"
      -      },
      -      "attachTo": {
      -        "items": {
      -          "maxLength": 100,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "type": "array"
      -      },
      -      "color": {
      -        "description": "Fill color as a hex code, such as #0a84ff. Omit it for a white note.",
      -        "maxLength": 40,
      -        "type": "string"
      -      },
      -      "ref": {
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "text": {
      -        "maxLength": 20000,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "update_note",
      -        "type": "string"
      -      },
      -      "attachTo": {
      -        "description": "Ids or refs of the nodes and relationships to attach the note to, replacing its current attachments. Use [] to detach it from all of them.",
      -        "items": {
      -          "maxLength": 100,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "type": "array"
      -      },
      -      "color": {
      -        "description": "Fill color as a hex code, such as #0a84ff.",
      -        "maxLength": 40,
      -        "type": "string"
      -      },
      -      "note": {
      -        "description": "The note's id, or the ref of a note added earlier in this list.",
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "text": {
      -        "maxLength": 20000,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "note"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "remove_note",
      -        "type": "string"
      -      },
      -      "note": {
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "note"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "remove_layer",
      -        "type": "string"
      -      },
      -      "layer": {
      -        "description": "The layer's name, as listed by get_model.",
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "moveContentsTo": {
      -        "description": "The name of the layer to move this layer's nodes and relationships to. Omit it to delete them instead. Nodes that also belong to another layer stay in that layer.",
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "layer"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "rename_layer",
      -        "type": "string"
      -      },
      -      "layer": {
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "name": {
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "layer",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "rename_model",
      -        "type": "string"
      -      },
      -      "name": {
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "name"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "add_node",
      +        "type": "string"
      +      },
      +      "color": {
      +        "description": "Fill color as a hex code, such as #0a84ff. Omit it to use the model style.",
      +        "maxLength": 40,
      +        "type": "string"
      +      },
      +      "labels": {
      +        "description": "Node labels, such as [\"Customer\"] or [\"Router\", \"Egress\"]. No two nodes can have the same set of labels.",
      +        "items": {
      +          "maxLength": 200,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "type": "array"
      +      },
      +      "layers": {
      +        "description": "Names of the layers the node belongs to. Any layer that doesn't exist yet is created.",
      +        "items": {
      +          "maxLength": 200,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "properties": {
      +        "description": "Properties in display order. On a node, the first property's example is shown as its caption.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "example": {
      +              "description": "An example value.",
      +              "maxLength": 20000,
      +              "type": "string"
      +            },
      +            "key": {
      +              "description": "Property key in camelCase, such as orderId. For an existing property, use the key exactly as get_model spells it.",
      +              "maxLength": 200,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "partOfKey": {
      +              "description": "Set to true on every property that together identifies the node or relationship, such as orderId and lineNo on an order line. toro4n exports one key constraint over all of them, REQUIRE (n.orderId, n.lineNo) IS NODE KEY (IS RELATIONSHIP KEY on a relationship): each must be present and the combination unique. Needs Neo4j Enterprise Edition or Aura. An element has one key.",
      +              "type": "boolean"
      +            },
      +            "required": {
      +              "description": "Set to true to add a property existence constraint (IS NOT NULL), which needs Neo4j Enterprise Edition or Aura.",
      +              "type": "boolean"
      +            },
      +            "type": {
      +              "description": "The Neo4j property type, one of: STRING, INTEGER, FLOAT, BOOLEAN, DATE, ZONED DATETIME, LOCAL DATETIME, LIST<STRING>, POINT, DURATION, LIST<BOOLEAN>, LIST<DATE>, LIST<DURATION>, LIST<FLOAT>, LIST<INTEGER>, LIST<LOCAL DATETIME>, LIST<LOCAL TIME>, LIST<POINT>, LIST<UUID>, LIST<ZONED DATETIME>, LIST<ZONED TIME>, LOCAL TIME, UUID, VECTOR, ZONED TIME. Omit it if unknown.",
      +              "maxLength": 100,
      +              "type": "string"
      +            },
      +            "unique": {
      +              "description": "Set to true to add a property uniqueness constraint (IS UNIQUE).",
      +              "type": "boolean"
      +            }
      +          },
      +          "required": [
      +            "key"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 500,
      +        "type": "array"
      +      },
      +      "ref": {
      +        "description": "A short name of your choosing, used to refer to the node later in this list.",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "labels"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "update_node",
      +        "type": "string"
      +      },
      +      "color": {
      +        "anyOf": [
      +          {
      +            "description": "Fill color as a hex code, such as #0a84ff.",
      +            "maxLength": 40,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Fill color as a hex code, or null to use the model style."
      +      },
      +      "labels": {
      +        "description": "Node labels, such as [\"Customer\"] or [\"Router\", \"Egress\"]. No two nodes can have the same set of labels.",
      +        "items": {
      +          "maxLength": 200,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "type": "array"
      +      },
      +      "layers": {
      +        "description": "Names of the layers the node belongs to. Any layer that doesn't exist yet is created.",
      +        "items": {
      +          "maxLength": 200,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "node": {
      +        "description": "The node's id, or the ref of a node added earlier in this list.",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "node"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "remove_node",
      +        "type": "string"
      +      },
      +      "node": {
      +        "description": "The node's id, or the ref of a node added earlier in this list.",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "node"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "add_relationship",
      +        "type": "string"
      +      },
      +      "from": {
      +        "description": "The node's id, or the ref of a node added earlier in this list.",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "properties": {
      +        "description": "Properties in display order. On a node, the first property's example is shown as its caption.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "example": {
      +              "description": "An example value.",
      +              "maxLength": 20000,
      +              "type": "string"
      +            },
      +            "key": {
      +              "description": "Property key in camelCase, such as orderId. For an existing property, use the key exactly as get_model spells it.",
      +              "maxLength": 200,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "partOfKey": {
      +              "description": "Set to true on every property that together identifies the node or relationship, such as orderId and lineNo on an order line. toro4n exports one key constraint over all of them, REQUIRE (n.orderId, n.lineNo) IS NODE KEY (IS RELATIONSHIP KEY on a relationship): each must be present and the combination unique. Needs Neo4j Enterprise Edition or Aura. An element has one key.",
      +              "type": "boolean"
      +            },
      +            "required": {
      +              "description": "Set to true to add a property existence constraint (IS NOT NULL), which needs Neo4j Enterprise Edition or Aura.",
      +              "type": "boolean"
      +            },
      +            "type": {
      +              "description": "The Neo4j property type, one of: STRING, INTEGER, FLOAT, BOOLEAN, DATE, ZONED DATETIME, LOCAL DATETIME, LIST<STRING>, POINT, DURATION, LIST<BOOLEAN>, LIST<DATE>, LIST<DURATION>, LIST<FLOAT>, LIST<INTEGER>, LIST<LOCAL DATETIME>, LIST<LOCAL TIME>, LIST<POINT>, LIST<UUID>, LIST<ZONED DATETIME>, LIST<ZONED TIME>, LOCAL TIME, UUID, VECTOR, ZONED TIME. Omit it if unknown.",
      +              "maxLength": 100,
      +              "type": "string"
      +            },
      +            "unique": {
      +              "description": "Set to true to add a property uniqueness constraint (IS UNIQUE).",
      +              "type": "boolean"
      +            }
      +          },
      +          "required": [
      +            "key"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 500,
      +        "type": "array"
      +      },
      +      "ref": {
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "to": {
      +        "description": "The node's id, or the ref of a node added earlier in this list.",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "type": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "from",
      +      "to",
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "update_relationship",
      +        "type": "string"
      +      },
      +      "from": {
      +        "description": "The node's id, or the ref of a node added earlier in this list.",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "relationship": {
      +        "description": "The relationship's id, or the ref of a relationship added earlier in this list.",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "to": {
      +        "description": "The node's id, or the ref of a node added earlier in this list.",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "type": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "relationship"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "remove_relationship",
      +        "type": "string"
      +      },
      +      "relationship": {
      +        "description": "The relationship's id, or the ref of a relationship added earlier in this list.",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "relationship"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "set_property",
      +        "type": "string"
      +      },
      +      "example": {
      +        "description": "An example value, or \"\" to clear it.",
      +        "maxLength": 20000,
      +        "type": "string"
      +      },
      +      "key": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "on": {
      +        "description": "The id or ref of the node or relationship the property belongs to.",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "partOfKey": {
      +        "type": "boolean"
      +      },
      +      "position": {
      +        "description": "Move the property to the top or the bottom of the list. On a node, the top property's example is shown as its caption.",
      +        "enum": [
      +          "first",
      +          "last"
      +        ],
      +        "type": "string"
      +      },
      +      "required": {
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "description": "A property type, or \"\" to clear it.",
      +        "maxLength": 100,
      +        "type": "string"
      +      },
      +      "unique": {
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "on",
      +      "key"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "rename_property",
      +        "type": "string"
      +      },
      +      "key": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "newKey": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "on": {
      +        "description": "The id or ref of the node or relationship the property belongs to.",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "on",
      +      "key",
      +      "newKey"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "remove_property",
      +        "type": "string"
      +      },
      +      "key": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "on": {
      +        "description": "The id or ref of the node or relationship the property belongs to.",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "on",
      +      "key"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "add_note",
      +        "type": "string"
      +      },
      +      "attachTo": {
      +        "items": {
      +          "maxLength": 100,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "color": {
      +        "description": "Fill color as a hex code, such as #0a84ff. Omit it for a white note.",
      +        "maxLength": 40,
      +        "type": "string"
      +      },
      +      "ref": {
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "text": {
      +        "maxLength": 20000,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "update_note",
      +        "type": "string"
      +      },
      +      "attachTo": {
      +        "description": "Ids or refs of the nodes and relationships to attach the note to, replacing its current attachments. Use [] to detach it from all of them.",
      +        "items": {
      +          "maxLength": 100,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "color": {
      +        "description": "Fill color as a hex code, such as #0a84ff.",
      +        "maxLength": 40,
      +        "type": "string"
      +      },
      +      "note": {
      +        "description": "The note's id, or the ref of a note added earlier in this list.",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "text": {
      +        "maxLength": 20000,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "note"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "remove_note",
      +        "type": "string"
      +      },
      +      "note": {
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "note"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "remove_layer",
      +        "type": "string"
      +      },
      +      "layer": {
      +        "description": "The layer's name, as listed by get_model.",
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "moveContentsTo": {
      +        "description": "The name of the layer to move this layer's nodes and relationships to. Omit it to delete them instead. Nodes that also belong to another layer stay in that layer.",
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "layer"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "rename_layer",
      +        "type": "string"
      +      },
      +      "layer": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "name": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "layer",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "rename_model",
      +        "type": "string"
      +      },
      +      "name": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "name"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed1 schema field changed
    • addedInput schema / properties / guideCode
      Added value: +{
      +  "description": "The guideCode that get_modeling_guide returns. Required: call get_modeling_guide and read the guide before you create or edit a model.",
      +  "maxLength": 100,
      +  "type": "string"
      +}
  3. First observed

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already flag destructive/non-idempotent, but the description adds what they cannot: changes are all-or-nothing and applied in order, deletions cascade (removing a node removes its relationships; removing a layer deletes its contents unless moveContentsTo is set, and shared nodes stay in their other layer), a version is saved before application, and other users see changes live. That is exactly the mutation-risk context an agent needs before calling a destructive tool.

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?

Well front-loaded: the operation and its atomicity come first, then id/ref semantics, undo, and collaboration, then domain context. It is long for a description, and the Neo4j naming-convention and schema-explainer sentences partly duplicate what get_modeling_guide is explicitly said to contain, so a few sentences don't fully earn their place.

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

Completeness4/5

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

For a tool with 16 change variants and cascading deletes, the description covers atomicity, ordering, id/ref resolution, cascades, undo via versioning, and concurrency visibility. The main gap is that it never says what the call returns (e.g. ids of newly created nodes) and there is no output schema to fall back on.

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

Parameters4/5

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

With 75% schema coverage the schema already documents most fields, yet the description adds cross-parameter meaning the schema cannot express: a ref makes an item addressable by later changes in the same list, order of changes matters, arrange re-lays out the entire model, and the first node property becomes the caption so the most descriptive property should go first. Naming-convention rules (PascalCase/UPPER_SNAKE_CASE/camelCase, toro4n conversion) also guide value formatting beyond the schema's maxLength bounds.

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

Purpose5/5

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

States a specific verb and resource ("Edits an existing model") and then enumerates exactly what the change list can do: add, update, or remove nodes, relationships, properties, and notes; rename or remove layers; rename the model. "Existing" cleanly separates it from the create_model sibling, and an agent can pick between them without opening either schema.

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

Usage Guidelines5/5

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

Gives explicit prerequisites and alternatives: pass guideCode from get_modeling_guide, refer to existing items by ids from get_model, use restore_version to undo, and proposes a review workflow ("propose your changes and make them only after the user agrees"). It also states when not to apply changes unilaterally, which is a genuine usage constraint rather than a restatement.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources