Inventor Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Inventor Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
An MCP server that bridges Claude (or any MCP-compatible client) to Autodesk Inventor via COM automation. It exposes Inventor's part modeling, assembly, drawing, and document tools as callable MCP tools, so an AI assistant can sketch, extrude, fillet, place assembly components, generate drawing views, and more — directly inside a running Inventor session.
Platform note: Autodesk Inventor's COM API is Windows-only. This server must run on Windows with Inventor installed, using a Python environment with pywin32.inventor_check_model health report (bodies, volume, size, failed features, open sketches); inventor_finish_sketch reports closed-region count.inventor_run_script runs a Python snippet against the Inventor COM API in a single call (see the security note below).Tool implementations live under inventor/tools/, organized by domain (sketch_tools.py, feature_tools.py, assembly_tools.py, joint_tools.py, drawing_tools.py, geometry_tools.py, parameter_tools.py, property_tools.py, appearance_tools.py, export_tools.py, view_tools.py, app_tools.py, sketch3d_tools.py, extra_tools.py, script_tools.py).
requirements.txt, notably:mcp (FastMCP server framework)pywin32 (COM automation)# from the repository root
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txtThe server communicates over stdio, as expected by MCP clients such as Claude Desktop:
.venv\Scripts\python.exe inventor_mcp.pyStarting the server does not start Inventor. On the first tool call it attaches to an already running Inventor (including one you opened yourself); only if none is running does it launch a single instance, guarded by a machine-wide lock so that several server processes or threads never open duplicate copies.
| Variable | Effect |
|---|---|
INVENTOR_MCP_DISABLE_SCRIPT=1 | Do not register inventor_run_script. |
INVENTOR_MCP_TRACE=<path.jsonl> | Append every tool call (arguments, result, duration) to a JSONL file. Long string arguments and results are truncated. |
INVENTOR_MCP_SESSION=<tag> | Optional session label written into each trace record. |
Security note:inventor_run_scriptexecutes arbitrary Python with the server's permissions, i.e. full access to your machine, not just Inventor. Only connect this server to clients you trust, or setINVENTOR_MCP_DISABLE_SCRIPT=1.
Add an entry to your MCP client's configuration pointing at the venv interpreter and inventor_mcp.py, for example:
{
"mcpServers": {
"inventor": {
"command": "C:\\path\\to\\repo\\.venv\\Scripts\\python.exe",
"args": ["C:\\path\\to\\repo\\inventor_mcp.py"]
}
}
}A ready-to-customize Claude Desktop Extension (.mcpb) manifest template is provided at inventor-mcp-ext/manifest.example.json — copy it to inventor-mcp-ext/manifest.json, replace the <ABSOLUTE_PATH_TO_REPO> placeholders with your local checkout path, then package or load it.
Joints connect a face or edge on one occurrence to a face or edge on another. Get entity_ids from inventor_assembly_list_occurrence_faces / inventor_assembly_list_occurrence_edges. Inventor moves the occurrence of entity_one onto entity_two, so pass the moving part first and the grounded part second.
inventor_assembly_list_occurrence_edges(occurrence="pin:1")
inventor_assembly_list_occurrence_edges(occurrence="plate:1")
inventor_assembly_add_joint(
joint_type="rotational",
entity_one="Assembly1:_asm_pin:1_edges:edge0", # circular edge of the pin
entity_two="Assembly1:_asm_plate:1_edges:edge4", # circular edge of the hole
angle_limits_deg=[0, 90],
)
inventor_assembly_drive_joint(name="Rotational:1", angle_deg=45)point_one/point_two (start, mid, end, center) pick the joint origin: a point on an edge, a point on the axis of a cylindrical/conical face, or the center of a planar face (center only). Angular limits and angle_deg apply to rotational and cylindrical joints; linear limits and linear_mm apply to slider and cylindrical joints. A joint driven outside its limits reports health: "invalid_limits".
By default (preserve_position=True) inventor_assembly_add_joint keeps already-placed parts where they are. If a rigid joint would move the part, it tries the other flip_alignment/flip_origin combinations. If only an in-plane rotation remains (common with circular edges), it creates a rotational joint locked at that angle instead, named <name>_locked. The result's preserve_position field reports the final joint type, the flips used and the residual error in mm/deg. Pass preserve_position=False to apply the requested flips as-is.
To joint fasteners in bulk, preview first, then apply:
inventor_assembly_auto_joint_fasteners() # dry run: fastener, partner, edge ids, radius, seat
inventor_assembly_auto_joint_fasteners(skip=["pin:3"], dry_run=False)Occurrences whose names match name_filter (regex, default screw|pin|washer) are matched to a coaxial, coplanar circular edge on another occurrence. A head-underside-on-seat contact is preferred. Fasteners that already have joints or constraints are skipped, and duplicates (same file, identical position) are reported.
Run both tests against a real Inventor before every push (or before opening a pull request):
.venv\Scripts\python.exe tests\functional_test.py # end-to-end tool test, prints PASS/FAIL per check
.venv\Scripts\python.exe tests\check_single_instance.py # 2 processes x 2 threads must share ONE Inventorfunctional_test.py calls every one of the server's tools (it fails if any tool is never called) in a temporary folder (%TEMP%\inv_mcp_test): all sketch tools (each closed shape must be exactly one closed region), every feature (with volumes checked against the expected values), work geometry, parameters and units, iProperties, appearances, all export formats, assemblies (constraints, joints, patterns, BOM) and drawings (views, dimensions, parts lists, sheets, PDF/DWG). It closes its documents without saving, quits Inventor if it started it, and exits with code 0 only if every check passes. A full run takes about 3 minutes; pass section names to run only some, e.g. functional_test.py build_parts drawing_test.
inventor/connection.py manages the connection to Inventor.Application, re-initializing COM per call to stay safe across the multi-threaded calls an MCP server can receive. Inventor's COM server is single-use: every CreateObject/Dispatch("Inventor.Application") starts a new Inventor process. The connection layer therefore always attaches through the Running Object Table first (GetActiveObject) and creates an instance only when none exists, under a named mutex. At import time it only loads the type library so win32com.client.constants is populated, without starting Inventor.inventor/registry.py tracks sketch entities and other COM object references by an opaque entity_id string, so tool calls can refer back to objects created in earlier calls without re-querying geometry.inventor/helpers.py and inventor/units.py provide shared geometry helpers and millimeter/centimeter unit conversions (Inventor's API is internally in centimeters).win32com.client.dynamic.Dispatch rather than the early-bound gencache proxy, working around a gen_py cache staleness issue observed with certain collections (e.g. CoilFeatures, SweepFeatures, LoftFeatures, CombineFeatures).AddCoincident on independent points — this avoids a COM error Inventor raises when merging two line-endpoint SketchPoints directly.joint_tools.py) with position-preserving joints and fastener auto-jointing, inventor_assembly_get_occurrence, robust face/edge listing for threaded and imported parts, re-resolving occurrence entity IDs after a server restart, and registry-based type library lookup (PR #2).affected_bodies for extrude/revolve in multi-body parts, metric document templates, and list_bodies without SurfaceBody.MassProperties (PR #1).See CHANGELOG.md for the history of changes.
Free for non-commercial use. Commercial use requires prior written permission from the author — see LICENSE.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.