Skip to main content
Glama

MIDAS CIVIL NX tools (MIDAS IT Europe)

Supports and loads in one call

civil_loads_supports
Destructive

The fast way to add supports, point springs, beam end releases, self-weight, nodal loads, beam UDLs, plate pressures and element temperatures: describe WHERE (structure group, id ranges, a line, a box, a coordinate, or the extreme nodes of a group) and WHAT, and the tool finds the nodes / elements and builds the CONS, CNLD, BMLD and PRES rows itself — no table lookup, no reading NODE / ELEM, no rows to write. Values are in kN and m by default (units: { force, length }) and converted to the model's units; signs follow the global axes (w: -10 with dir GZ = 10 kN/m downward). Missing load cases (STLD), load groups and boundary groups are created. Examples: supports [{ at: { group: "GIRDERS", pick: "xmin" }, type: "pinned" }, { at: { group: "GIRDERS", pick: "xmax" }, type: "roller-x" }]; udl [{ on: { group: "GIRDERS" }, case: "SIDL", w: -12.5 }]; udl with range { axis: "x", from: 10, to: 20 } loads only that stretch; nodalLoads [{ at: { nodes: "101to121by2" }, case: "Wheel", F: [0, 0, -50] }]; pressure [{ on: { group: "DECK" }, case: "Surfacing", p: -2.4 }]; springs [{ at: { group: "PIERS", pick: "zmin" }, k: [1e5, 1e5, 5e5] }]; releases [{ on: { group: "CROSS-BEAMS" }, free: "My Mz" }]; selfWeight [{ case: "SW" }]; temperature [{ on: { group: "DECK" }, case: "T+", uniform: 15, gradientZ: 10 }]. The preview is a summary — counts, ids, and total force per load case to check against the intended load. Apply with apply: true and confirmPlanHash; every row is read back. Undo with civil_write_tables_undo (same ledger). Rules kept for you: CIVIL NX keeps one nodal load per case per node, so loads landing on the same node and case are summed (also with an existing one, with a warning); an existing support on a node is replaced; existing beam loads and pressures are kept and the new ones added.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "civil_loads_supports"
  }
}

Input Schema

NameRequiredDescriptionDefault
udlNo
applyNoWrite to CIVIL NX. Only after the user approved the preview.
casesNoOptional types for load cases this call creates: [{ name, type: D | DC | DW | L | W | T | USER … }].
unitsNoUnits of the values AND of the selection coordinates. Default kN and m.
springsNoLinear point springs (bearings, piles): one per node, replacing a spring already there.
pressureNo
releasesNoBeam end releases (pins in cross-beams, hinges): replaces a release already on the element.
supportsNo
nodalLoadsNo
selfWeightNoSelf-weight of the whole model in a load case (from the materials' density).
temperatureNoElement temperatures in °C, converted if the model works in °F. For EN 1991-1-5 / CS 454 bridge temperatures computed for you, use bridge_thermal_apply.
confirmPlanHashNoplanHash from the approved preview; refused if the model or the inputs changed.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • addedInput schema / properties / releases
      Added value: +{
      +  "description": "Beam end releases (pins in cross-beams, hinges): replaces a release already on the element.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "boundaryGroup": {
      +        "type": "string"
      +      },
      +      "ends": {
      +        "default": "both",
      +        "enum": [
      +          "i",
      +          "j",
      +          "both"
      +        ]
      +      },
      +      "free": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Released components: \"My Mz\" for a pin; any of Fx Fy Fz Mx My Mz Mb (local axes)."
      +      },
      +      "on": {
      +        "additionalProperties": false,
      +        "description": "Which elements. Start set: group (structure group name), nodes, elements — given together they intersect; none = the whole model. Then filters (coordinates in the input length unit): line { from, to } (on that segment), box { min, max }, where { x: 0 } or { z: [0, 2] }, type (BEAM, TRUSS, PLATE…). An element passes a geometric filter when all its nodes do. tol default 0.001.",
      +        "properties": {
      +          "box": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "max": {
      +                "items": {
      +                  "type": "number"
      +                },
      +                "maxItems": 3,
      +                "minItems": 3,
      +                "type": "array"
      +              },
      +              "min": {
      +                "items": {
      +                  "type": "number"
      +                },
      +                "maxItems": 3,
      +                "minItems": 3,
      +                "type": "array"
      +              }
      +            },
      +            "required": [
      +              "min",
      +              "max"
      +            ],
      +            "type": "object"
      +          },
      +          "elements": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "type": [
      +                    "integer",
      +                    "string"
      +                  ]
      +                },
      +                "type": "array"
      +              }
      +            ],
      +            "description": "Ids or ranges: \"1to50by2, 60\" or [1, 2, \"5to9\"]."
      +          },
      +          "group": {
      +            "type": "string"
      +          },
      +          "line": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "from": {
      +                "items": {
      +                  "type": "number"
      +                },
      +                "maxItems": 3,
      +                "minItems": 3,
      +                "type": "array"
      +              },
      +              "to": {
      +                "items": {
      +                  "type": "number"
      +                },
      +                "maxItems": 3,
      +                "minItems": 3,
      +                "type": "array"
      +              }
      +            },
      +            "required": [
      +              "from",
      +              "to"
      +            ],
      +            "type": "object"
      +          },
      +          "nodes": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "type": [
      +                    "integer",
      +                    "string"
      +                  ]
      +                },
      +                "type": "array"
      +              }
      +            ],
      +            "description": "Ids or ranges: \"1to50by2, 60\" or [1, 2, \"5to9\"]."
      +          },
      +          "tol": {
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "type": {
      +            "type": "string"
      +          },
      +          "where": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "x": {},
      +              "y": {},
      +              "z": {}
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "on",
      +      "free"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / selfWeight
      Added value: +{
      +  "description": "Self-weight of the whole model in a load case (from the materials' density).",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "case": {
      +        "description": "Static load case name (≤ 40 characters); created if missing (type from cases[], default USER).",
      +        "type": "string"
      +      },
      +      "factors": {
      +        "default": [
      +          0,
      +          0,
      +          -1
      +        ],
      +        "description": "Gravity factors [x, y, z]; [0, 0, -1] = self-weight downward.",
      +        "items": {
      +          "type": "number"
      +        },
      +        "maxItems": 3,
      +        "minItems": 3,
      +        "type": "array"
      +      },
      +      "loadGroup": {
      +        "description": "Optional load group name; created if missing.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "case"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / springs
      Added value: +{
      +  "description": "Linear point springs (bearings, piles): one per node, replacing a spring already there.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "at": {
      +        "additionalProperties": false,
      +        "description": "Which nodes. Start set: group (structure group name), nodes, elements — given together they intersect; none = the whole model. Then filters (coordinates in the input length unit): line { from, to } (on that segment), box { min, max }, where { x: 0 } or { z: [0, 2] }, type (BEAM, TRUSS, PLATE…), pick xmin|xmax|ymin|ymax|zmin|zmax (the extreme nodes, e.g. the ends of a girder group). An element passes a geometric filter when all its nodes do. tol default 0.001.",
      +        "properties": {
      +          "box": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "max": {
      +                "items": {
      +                  "type": "number"
      +                },
      +                "maxItems": 3,
      +                "minItems": 3,
      +                "type": "array"
      +              },
      +              "min": {
      +                "items": {
      +                  "type": "number"
      +                },
      +                "maxItems": 3,
      +                "minItems": 3,
      +                "type": "array"
      +              }
      +            },
      +            "required": [
      +              "min",
      +              "max"
      +            ],
      +            "type": "object"
      +          },
      +          "elements": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "type": [
      +                    "integer",
      +                    "string"
      +                  ]
      +                },
      +                "type": "array"
      +              }
      +            ],
      +            "description": "Ids or ranges: \"1to50by2, 60\" or [1, 2, \"5to9\"]."
      +          },
      +          "group": {
      +            "type": "string"
      +          },
      +          "line": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "from": {
      +                "items": {
      +                  "type": "number"
      +                },
      +                "maxItems": 3,
      +                "minItems": 3,
      +                "type": "array"
      +              },
      +              "to": {
      +                "items": {
      +                  "type": "number"
      +                },
      +                "maxItems": 3,
      +                "minItems": 3,
      +                "type": "array"
      +              }
      +            },
      +            "required": [
      +              "from",
      +              "to"
      +            ],
      +            "type": "object"
      +          },
      +          "nodes": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "type": [
      +                    "integer",
      +                    "string"
      +                  ]
      +                },
      +                "type": "array"
      +              }
      +            ],
      +            "description": "Ids or ranges: \"1to50by2, 60\" or [1, 2, \"5to9\"]."
      +          },
      +          "pick": {
      +            "enum": [
      +              "xmin",
      +              "xmax",
      +              "ymin",
      +              "ymax",
      +              "zmin",
      +              "zmax"
      +            ]
      +          },
      +          "tol": {
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "type": {
      +            "type": "string"
      +          },
      +          "where": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "x": {},
      +              "y": {},
      +              "z": {}
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "boundaryGroup": {
      +        "type": "string"
      +      },
      +      "k": {
      +        "description": "[kx, ky, kz, krx, kry, krz]: force/length, then force×length/rad (default kN/m, kN·m/rad).",
      +        "items": {
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "maxItems": 6,
      +        "minItems": 1,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "at",
      +      "k"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / temperature
      Added value: +{
      +  "description": "Element temperatures in °C, converted if the model works in °F. For EN 1991-1-5 / CS 454 bridge temperatures computed for you, use bridge_thermal_apply.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "case": {
      +        "description": "Static load case name (≤ 40 characters); created if missing (type from cases[], default USER).",
      +        "type": "string"
      +      },
      +      "gradientY": {
      +        "description": "Difference across the section width, °C (+ = +y side warmer); beams only.",
      +        "type": "number"
      +      },
      +      "gradientZ": {
      +        "description": "Difference across the section depth, °C (+ = top warmer); beams only.",
      +        "type": "number"
      +      },
      +      "loadGroup": {
      +        "description": "Optional load group name; created if missing.",
      +        "type": "string"
      +      },
      +      "on": {
      +        "additionalProperties": false,
      +        "description": "Which elements. Start set: group (structure group name), nodes, elements — given together they intersect; none = the whole model. Then filters (coordinates in the input length unit): line { from, to } (on that segment), box { min, max }, where { x: 0 } or { z: [0, 2] }, type (BEAM, TRUSS, PLATE…). An element passes a geometric filter when all its nodes do. tol default 0.001.",
      +        "properties": {
      +          "box": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "max": {
      +                "items": {
      +                  "type": "number"
      +                },
      +                "maxItems": 3,
      +                "minItems": 3,
      +                "type": "array"
      +              },
      +              "min": {
      +                "items": {
      +                  "type": "number"
      +                },
      +                "maxItems": 3,
      +                "minItems": 3,
      +                "type": "array"
      +              }
      +            },
      +            "required": [
      +              "min",
      +              "max"
      +            ],
      +            "type": "object"
      +          },
      +          "elements": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "type": [
      +                    "integer",
      +                    "string"
      +                  ]
      +                },
      +                "type": "array"
      +              }
      +            ],
      +            "description": "Ids or ranges: \"1to50by2, 60\" or [1, 2, \"5to9\"]."
      +          },
      +          "group": {
      +            "type": "string"
      +          },
      +          "line": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "from": {
      +                "items": {
      +                  "type": "number"
      +                },
      +                "maxItems": 3,
      +                "minItems": 3,
      +                "type": "array"
      +              },
      +              "to": {
      +                "items": {
      +                  "type": "number"
      +                },
      +                "maxItems": 3,
      +                "minItems": 3,
      +                "type": "array"
      +              }
      +            },
      +            "required": [
      +              "from",
      +              "to"
      +            ],
      +            "type": "object"
      +          },
      +          "nodes": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "type": [
      +                    "integer",
      +                    "string"
      +                  ]
      +                },
      +                "type": "array"
      +              }
      +            ],
      +            "description": "Ids or ranges: \"1to50by2, 60\" or [1, 2, \"5to9\"]."
      +          },
      +          "tol": {
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "type": {
      +            "type": "string"
      +          },
      +          "where": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "x": {},
      +              "y": {},
      +              "z": {}
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "uniform": {
      +        "description": "Uniform temperature change, °C (+ = warmer).",
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "on",
      +      "case"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  2. Added

TDQS

A4.6/5.0
Behavior5/5

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

The annotations already flag a destructive write, and the description adds important behavior beyond them: the preview is a summary with counts/ids/total force, apply requires confirmPlanHash, every row is read back, and undo uses the same ledger. It also discloses mutation semantics such as summing nodal loads, replacing existing supports, keeping existing beam loads/pressures while adding new ones, and auto-creating missing load cases and groups.

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?

The purpose and WHERE/WHAT model are front-loaded, and the many examples earn their place by showing how to express each load type. However, it is a single dense paragraph with a large example block and rules at the end, which is harder to scan than it could be.

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

Completeness5/5

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

There is no output schema, but the description explains what the preview returns (counts, ids, total force per load case) and what apply does (read-back of every row), plus undo. For a complex destructive 12-parameter tool, this covers selection, units, mutation semantics, confirmation, and recovery sufficiently.

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?

Schema coverage is 67% and the nested schema already documents many fields, but the description adds valuable examples for at/on selectors, group pick extremes, partial UDL ranges, string node ranges like '101to121by2', units conversion, and sign conventions. Some parameters, including dof, ends, projected, factors, and case types, are left to the schema, so it falls short of full compensation.

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?

The description states a specific verb and resource set: 'add supports, point springs, beam end releases, self-weight, nodal loads, beam UDLs, plate pressures and element temperatures', and explains the WHERE/WHAT selection model. It also contrasts itself with table lookup and reading NODE/ELEM, and names civil_write_tables_undo as the undo sibling, so an agent can distinguish it from manual table tools.

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

Usage Guidelines4/5

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

It gives clear usage context: use this as 'the fast way' to add these entities, preview first, apply with apply:true and confirmPlanHash after approval, and undo with civil_write_tables_undo. It does not explicitly state when not to use it or name all alternatives, such as civil_remove_loads for deletion, but the intended workflow is clear.

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