From 0a0bac2bf25d96df0962b87b4a82999147fc1854 Mon Sep 17 00:00:00 2001 From: jyviko <2501648+jyviko@users.noreply.github.com> Date: Thu, 15 Oct 2026 11:52:43 -0400 Subject: [PATCH] mcp: the solve tool runs nonlinear and buckling steps too, and its docs list heat Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01UhhZMBTviDQxZvwnyP89fo --- crates/mcp/src/server.rs | 2 +- crates/mcp/src/tools.rs | 11 +++++++++-- docs/mcp.md | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/crates/mcp/src/server.rs b/crates/mcp/src/server.rs index 4aba277..1289016 100644 --- a/crates/mcp/src/server.rs +++ b/crates/mcp/src/server.rs @@ -29,7 +29,7 @@ forces in N); Z is up. A typical analysis: `open` a .solidcraft design (or a .fi .3mf); `inspect_model` for its bodies and their persistent face names; `mesh` (method tet: {body, tolerance}); \ then `execute` the model definition commands (model.set.create {name, geometry: [{body, face}]}, \ model.material.create, model.section.create, model.boundary_condition.create, model.load.create, model.step.create \ -— list_commands shows each one's parameters); `check_model`; `solve` (static, frequency, explicit, fluid); \ +— list_commands shows each one's parameters); `check_model`; `solve` (static, nonlinear, frequency, buckle, explicit, fluid, heat); \ `show_results` (field: displacement, von_mises…; its reply has the field's range) and `probe` / `reactions` for \ numbers; `screenshot` to look; `save` or `write_deck` (abaqus, nastran, lsdyna). Partitions: geometry.datum makes a \ datum plane, geometry.partition cuts the design's bodies into cells by it (cut faces partition::a|b; kept in \ diff --git a/crates/mcp/src/tools.rs b/crates/mcp/src/tools.rs index 996e7ae..09d1e23 100644 --- a/crates/mcp/src/tools.rs +++ b/crates/mcp/src/tools.rs @@ -30,8 +30,15 @@ const MESHERS: &[(&str, &str, &str)] = &[ ]; /// The analyses the `solve` tool runs; one whose command this build lacks is left out. -const ANALYSES: &[(&str, &str)] = - &[("static", "solve.static"), ("frequency", "solve.frequency"), ("explicit", "solve.explicit"), ("fluid", "solve.fluid"), ("heat", "solve.heat")]; +const ANALYSES: &[(&str, &str)] = &[ + ("static", "solve.static"), + ("nonlinear", "solve.nonlinear"), + ("frequency", "solve.frequency"), + ("buckle", "solve.buckle"), + ("explicit", "solve.explicit"), + ("fluid", "solve.fluid"), + ("heat", "solve.heat"), +]; const VIEWS: &[&str] = &["iso", "home", "fit", "front", "back", "top", "bottom", "left", "right"]; diff --git a/docs/mcp.md b/docs/mcp.md index d684b37..dc969ff 100644 --- a/docs/mcp.md +++ b/docs/mcp.md @@ -100,7 +100,7 @@ software on the computer. | `save` | `path?` | `file.save`: to `path` or the model's own file. | | `write_deck` | `format` (abaqus, nastran, lsdyna), `path`, `steps?` | `deck.write`. | | `mesh` | `method`, `params?` | Runs the mesher (`tet`: `mesh.tet.generate`; `hex`, `hex_sweep`, `hex_mapped`, `hex_blocks`: the structured hex meshers; `cells`: `mesh.cells`, a partitioned part cell by cell; `mirror`: `mesh.mirror`, a meshed half reflected across a plane; `block`: `mesh.block`; `planar`: `mesh.planar`) and replies with its result, `model.info` and `mesh.quality`. | -| `solve` | `analysis` (static, frequency, explicit, fluid; heat as it lands), `step?`, `options?` | `solve.` with the step and the solver's caps and settings. | +| `solve` | `analysis` (static, nonlinear, frequency, buckle, explicit, fluid, heat), `step?`, `options?` | `solve.` with the step and the solver's caps and settings. | | `show_results` | `step?`, `field?`, `bands?`, `range?`, `deformed?`, `scale?`, `mode?`, `frame?`, `time?` | The `results.*` commands its arguments ask for (`deformed: false` draws the undeformed mesh; `scale` is a factor, 0 for the undeformed shape so a sequence from 0 swings the deformation out, or `"auto"`; `range: {min?, max?}` clamps the legend, values above `max` drawn in the over colour); the reply has the contour range (smallest and largest value and their nodes: `field: "displacement"` gives the largest displacement), modes or frames. | | `probe` | `step?`, `nodes?`, `at?`, `elements?`, `points?`, `forces?`, `mode?`, `frame?` | `solve.probe`: stored results at nodes, at the nodes nearest to points `at` (structural steps), elements (explicit) or points (fluid). | | `reactions` | `step?`, `sets?`, `about?` | `results.reactions`: reaction force and moment per node set and in total. |