MCP server for parametric 3D modeling in Autodesk Inventor
Mixed quality across 18 tools. Strengths: all tools have descriptions (10-500+ chars), most parameters are typed and documented, good composition (each tool has single responsibility). Weaknesses: output schemas are undocumented (tools return strings with JSON embedded, not structured tool outputs), no enum constraints on string parameters, error handling is basic (no recovery guidance), no tool annotations (readOnlyHint/destructiveHint/idempotentHint) despite clear risk levels. Tool naming is verb-first and clear (execute_python, create_part, draw_rectangle), which is A+ practice. Parameters generally follow conventions (plane, face_index, distance, direction all typed with descriptions). However, direction parameter values (positive, negative, symmetric) and format parameter (STEP, STL, SAT, IGES) lack enum declarations, LLM may hallucinate invalid values. execute_python is a powerful but risky catch-all that somewhat masks missing domain-specific tools.
Connect to Autodesk Inventor. Starts Inventor if not running. Args: visible: Show Inventor window (default True).
Create a new empty part document. Args: name: Display name for the part (optional). template: Template type — "metric" (mm, default), "english" (inches), or full path to .ipt file.
Create a new sketch on a work plane, a body face, or an offset work plane. Args: plane: Work plane — XY, XZ, or YZ. Ignored if face_index > 0. face_index: Index of body face to sketch on (1-based). 0 = use work plane. Use list_faces() to locate. offset: mm — sketch on a hidden work plane parallel to 'plane' at this distance (positive = along plane normal: XY→+Z, XZ→+Y, YZ→+X). For ribs/bosses at a height.
Draw a circle in a sketch with an automatic diameter dimension. Dimensions in mm. Args: x: Center X coordinate in mm. y: Center Y coordinate in mm. diameter: Diameter in mm. A diameter constraint is added automatically. sketch_index: Sketch number (0 = latest sketch). construction: If True, draws a reference (construction) circle — not part of profile. Useful for showing bolt PCD (pitch circle diameter) without cutting.
Draw a closed profile (polygon) from connected points. All coordinates in mm. Lines share endpoints so Inventor recognizes the closed loop for extrude/revolve. Args: points: JSON array of [x,y] pairs in mm. Example: "[[0,0],[50,0],[25,40]]" for a triangle. sketch_index: Sketch number (0 = latest sketch).
No enum constraints on string parameters. 'direction' can be 'positive', 'negative', or 'symmetric'; 'format' can be 'STEP', 'STL', 'SAT', 'IGES'; 'plane' can be 'XY', 'XZ', 'YZ'; 'action' can be 'begin', 'commit', 'abort'; 'template' can be 'metric', 'english', or a path. These are hardcoded in the tool logic but not declared as enums in the schema, so LLMs may hallucinate invalid values like 'direction: both' or 'format: PDF'.
Output schemas are undocumented. All tools return strings (captured stdout, JSON embedded as text, or error messages). LLMs cannot parse the structure of 'inspect' output (returned as json.dumps but not declared as a schema), 'list_edges'/'list_faces' (compact line-based text format), or 'execute_python' (stdout with potential tracebacks). A structured output schema (e.g. 'inspect returns {volume: float, bbox: {xmin, xmax, ymin, ymax, zmin, zmax}, faces_count: int, edges_count: int, ...}') would let LLMs confidently extract fields.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
Draw a line in a sketch. Coordinates in mm. Args: x1: Start X in mm. y1: Start Y in mm. x2: End X in mm. y2: End Y in mm. sketch_index: Sketch number (0 = latest sketch). construction: If True, line becomes a construction line (used as revolve axis, not part of profile).
Draw a regular polygon in a sketch. Dimensions in mm. Args: x: Center X in mm. y: Center Y in mm. radius: Circumscribed radius in mm. sides: Number of sides (e.g. 6 for hexagon). sketch_index: Sketch number (0 = latest sketch).
Draw a centered rectangle in a sketch. Dimensions in mm. Args: x: Center X coordinate in mm. y: Center Y coordinate in mm. width: Width in mm. height: Height in mm. sketch_index: Sketch number (0 = latest sketch).
Execute Python code against the live Inventor connection. Pre-bound objects (re-resolved fresh on every call): inv — InventorConnection wrapper (all high-level methods, mm units) app — Inventor.Application COM object doc — active document comp — its ComponentDefinition body — comp.SurfaceBodies.Item(1) (or None) tg — TransientGeometry math — math module Variables you assign persist between calls (one shared namespace). Internal COM units are CENTIMETERS — divide mm by 10. Returns captured stdout (print your results!) or the traceback on error.
Export active document to another format. Args: path: Output file path (e.g. "D:/export/part.step"). format: Export format — STEP, STL, SAT, or IGES.
Extrude a sketch profile into a 3D feature. Creates the main geometry of the part.
Compact snapshot of the active part: volume, bbox, faces/edges count, feature tree with names, sketches, sheet metal thickness. One call instead of several diagnostic queries.
Compact edge table of body 1: '[i] L=200.0 mid=(0.0,-225.0,0.8)' per line. Use to locate edges for flange/fillet/chamfer. min_length filters small edges (mm).
Compact face table of body 1: '[i] Plane A=90000 c=(0.0,225.0,12.5)' per line. Use to locate faces for sketching/cuts. min_area filters small faces (mm²).
Hot-reload inventor_api.py from disk. Use after editing the wrapper — no Claude Code restart needed. Keeps the existing COM connection.
Save the active document. Args: path: Full file path to save as (e.g. "D:/parts/flange.ipt"). If empty, saves in place.
Check connection status and active document info.
Wrap multiple operations in one undo unit with rollback. Args: action: "begin" before a risky multi-step build, then "commit" on success or "abort" to roll back EVERYTHING since begin in one step. name: label shown in Inventor's undo list.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools are marked with Risk levels (READ_ONLY, WRITE, REVERSIBLE) in the evaluation data, but the source code has no @mcp.tool() decorators with annotation parameters. This means the LLM cannot see which tools are safe to retry, which require confirmation, or which are read-only, forcing it to reason about risk from descriptions alone.
execute_python description lacks guidance on when to use it vs. domain-specific tools. The docstring is long (~400 chars) but doesn't say 'Use this only when no dedicated tool exists' or 'Prefer draw_rectangle over writing COM code to create rectangles.' This may lead LLMs to use execute_python for routine sketching instead of cleaner, safer draw_* tools.
extrude description is extremely terse (50 chars: 'Extrude a sketch profile into a 3D feature. Creates the main geometry of the part.'). It omits critical details: what happens if no sketch is active? What does each operation mode (join/cut/intersect/new_body) do geometrically? What is extent_type='through_all'? How does direction='symmetric' distribute the extrusion?
No error recovery guidance. If execute_python hits a COM error or a sketch operation fails, tools return a traceback or status string. There's no guidance like 'If the sketch is invalid, call inspect() to debug the model' or 'If extrude fails, ensure a sketch is active and closed.' LLMs see the error but don't know the next step.
Pagination and result limits not documented. list_edges and list_faces accept max_count (default 60) but the description doesn't explicitly state this is a hard limit. inspect may return very large feature trees for complex parts. No next_cursor or pagination token to fetch subsequent results if the model exceeds the cap.
No dry-run or confirmation step for irreversible operations. save_document, export_document, create_part, and extrude can permanently modify or create files, but there's no 'confirm before executing' pattern. An LLM mistake could overwrite a user's part file.