Mmcp.market

AnkusDrive MCP server

by gchen19·io.github.gchen19/ankusdrive·v0.5.5

Drive FreeCAD from an agent: CAD modeling, drawings, FEM, CFD, EM, and multiphysics simulation.

A85/100grade A
What users say
No reviews yet
Be the first
Safety scan
A85/100

full report

Adoption
Growing

5 stars

Reviews

Write one

Nobody has reviewed AnkusDrive yet.

If you have run it, two minutes of your experience saves the next person an afternoon.

AnkusDrive tools (100, 9 write)

write = sends, deletes, buys or posts

Read from the package source without running it. The installed server may list more.

  • add_bearing

    Add a deep-groove ball bearing as an assembly *envelope* solid: an annular ring (outer-diameter cylinder minus bore cylinder) of the given width, axis along +Z. Balls/races are not modeled — this is the fit envelope a coordinator needs to size the shaft, the housing bore, and the shoulder spacing.

  • add_fastener

    Add a standard ISO metric fastener (screw / bolt / nut / washer) as a solid.

  • add_gear

    Add an involute spur gear (FreeCAD's core involute generator), extruded to a solid.

  • add_part

    Add a part to an assembly via App::Link.

  • add_primitive

    Add a primitive to the active document.

  • add_pulley

    Add a timing-belt (or V) pulley as a static solid. Axis is +Z; toothed belt face spans z in [0, width].

  • add_rack

    Add a linear gear rack (a spur gear's straight counterpart) as a solid.

  • add_rib

    Add a reinforcing rib/web inside a PartDesign Body by thickening an OPEN sketch profile into a wall that fuses with the body's surrounding material.

  • add_sketch_constraint

    Add a constraint to a sketch.

  • add_sketch_external

    Project an external edge/face/vertex into a sketch as construction geometry.

  • add_sketch_geometry

    Append geometric primitives to a sketch.

  • add_spring

    Add a helical compression spring: a round wire swept along a cylindrical helix.

  • add_sprocket

    Add a roller-chain sprocket (ISO 606 / ANSI), built as a static solid plate.

  • add_thread

    Generate a REAL helical ISO-style 60-degree thread as a static solid.

  • annotate_face

    Declare the semantic ROLE of a face — what it is FOR — so later edits can be checked against intent instead of re-derived from raw geometry. The role binds to the face's stable f_* tag and persists in the .FCStd as a JSON property bag (same mechanism as publish_interface); it survives save/reopen. Once declared, check_airtight_path accepts the role/name directly (e.g. inlet="inlet").

  • assembly_lockwrite action

    Write a lockfile recording each component's content hash, published- interface hash, and mate dependencies — the provenance baseline a coordinator uses to detect drift across a team. Call after a clean merge. lockfile defaults to <manifest>.lock.json. Returns {lockfile, components}.

  • bom_extract

    Walk an assembly and return [{part, count, total_volume_mm3, total_mass_kg?}, ...] grouped by source (component file + object), NOT the bare object name, so two distinct components both named "Box" don't collapse into one row. density (kg/mm³) is optional.

  • boolean_op

    Boolean operation on two existing objects, referenced by their handles.

  • bounding_box
  • catalog_check

    Is this exact part something you can buy off the shelf?

  • catalog_nearest

    Snap a desired standard part to the nearest one that actually exists.

  • catalog_search

    Browse the off-the-shelf catalog: which standard components actually EXIST, in which sizes, in which stocked lengths. Call it while designing, before you commit geometry to a number — it is the difference between a design somebody can build and one that needs a special.

  • chamfer_edges

    Chamfer (bevel) specific edges of a shaped Part object — the direct-shape counterpart to fillet_edges.

  • check_airtight_path

    Functional check for an enclosed-flow part (a vacuum adapter, manifold, duct): is there a single connected void joining the inlet to the outlet, bounded by solid everywhere else? This catches what `check_shape` cannot — a watertight solid can still have a blocked flow path or a hidden leak. Inspection only: measures, returns no handle, mutates nothing.

  • check_shape

    Check a shaped object's geometry validity and topology before you build on it. Inspection only — measures, returns no handle, mutates nothing, and does NOT auto-repair. Use it as a guard after booleans/sweeps/imports to confirm you have one clean watertight solid.

  • classify_face_sides

    Inside-vs-outside topology: for every face, decide whether its outward side opens into an enclosed cavity (wetted) or ambient (exterior). Answers the "which faces are inside the airflow path" question from issue #19 and suggests a role per face. Inspection only; returns no handle, mutates nothing.

  • close_document

    Close a document by name (or 'active' for the currently active one). Frees its objects and invalidates any handles into the closed doc. Returns {closed, invalidated_handles}.

  • close_sketch

    Recompute and report DOF status. Returns {geometry_count, constraint_count, open_vertices, fully_constrained}.

  • close_workspace

    Shut down a workspace's worker and free its pool slot. All of that workspace's documents, unsaved changes, and handles are lost. Closing the workspace you are currently in returns you to the "default" workspace. The default workspace can be closed too (its worker respawns clean on next use). Returns {closed: <bool>, workspace: <name>, current: <name>}.

  • component_contract_check

    Builder-side contract gate for one component (issue #169) — the local half of the gate merge_assembly re-runs at fan-in. Any MCP host builds a component with the full AnkusDrive tool surface, then calls this on its part BEFORE saving, against its `builder brief` (a ankusdrive.builder_brief/1 slice), and repairs any failing check. Catching a violation here turns the expensive loop (build → merge →

  • copy_shape

    Duplicate a shaped object as an INDEPENDENT static solid.

  • declare_intent

    Record the functional invariants a part must keep satisfying, so they can be re-checked after every edit (see verify_intent). Persists in the .FCStd as a JSON property bag (AD_Intent); one contract per part — re-declaring replaces.

  • designation_check

    Gate: every purchased part on this assembly must be orderable.

  • draft

    Apply a draft angle to faces (for moldability).

  • engrave_text

    Engrave (cut) or emboss (add) extruded text onto a planar face of a solid.

  • envelope_check

    Keep-out gate: assert each named part's world bounding box stays inside its declared envelope. envelopes maps a part's link name (or label) to {"min": [x,y,z], "max": [x,y,z]} in the assembly frame. Returns violations [{part, axis, got, allowed}, ...]; empty means everything is within its box.

  • export_shape

    Export a shape to STEP/IGES/BREP/STL. Format inferred from path extension.

  • fillet_edges

    Fillet edges of a shaped Part object. `edges` accepts tags (e_... from list_edges, preferred), 'EdgeN' strings, or bare 1-based ints. `radius` is the blend radius in mm (> 0).

  • get_object

    Dump a handle's properties + shape stats. Useful when no dedicated tool exposes what you need.

  • helix

    Generate a Part::Helix curve. radius, pitch, height in mm. angle (deg) is the cone angle (0 = cylindrical helix, >0 = conical).

  • hole

    Drill a parametric Hole from a sketch (one or more circles).

  • interface_align_check

    Gate: verify declared interface pairs coincide in world space — the "do the OTHER interfaces line up?" check for multi-interface mates. After the primary mate seats a part, this confirms its secondary interfaces (a second bolt pattern, a bore axis) actually meet the parent's.

  • interference_check

    Pairwise interference: compute volume of intersection between every pair of parts. Returns [{a, b, interference_mm3}, ...] descending by volume. Empty list = no interference.

  • linear_pattern

    Repeat a PartDesign feature linearly along a direction.

  • list_assembly_parts

    List parts of an assembly: name, type, linked-target name, position, volume.

  • list_documents

    List all open documents: [{name, label, file_path, dirty, active, object_count}, ...].

  • list_edges

    List all edges of a shaped object with stable tags + descriptors.

  • list_face_roles

    Read back the semantic face roles declared on a part (see annotate_face).

  • list_faces

    List all faces of a shaped object with stable tags + geometric descriptors.

  • list_objects

    List objects in the active document. Returns [{name, type, label}, ...].

  • list_thread_options

    Discover the COUPLED ThreadType / ThreadSize enums on the hole tool.

  • list_workspaces

    List the live workspaces (freecadcmd processes) and the pool limits. Each entry is {name, alive, idle_s, current}. Use to see who is holding a slot before claiming or closing one. Returns {current, max, idle_reap_s, workspaces: [...]}.

  • loft

    Loft (additively) between two or more sketches.

  • make_assemblywrite action

    Create an App::Part container to hold linked parts. Returns {handle, name}.

  • make_bodywrite action

    Create a PartDesign Body. Subsequent sketches/features go inside it.

  • make_datum_planewrite action

    Create a Datum Plane in a Body.

  • make_sketchwrite action

    Create a sketch in a Body, attached to a plane.

  • mass_properties

    Mass properties of a shaped object: volume (mm³), surface area (mm²), centroid, bounding box, inertia tensor. If density (kg/mm³) is given, also returns mass (kg). Steel = 7.9e-6, aluminum = 2.7e-6, ABS = 1.05e-6.

  • measure_angle

    Angle (degrees) between two planar faces or two straight edges.

  • measure_distance

    Minimum distance between two entities, in mm. The workhorse measurement tool: lets a blind agent verify gaps, clearances, and contact.

  • merge_assembly

    Construct-up an assembly from a manifest JSON (the coordinator's one call): create the doc, link each component by file path, place it, recompute, and run the gates. Component files resolve relative to the manifest's directory; links auto-reload, so re-running picks up updated components (deterministic, idempotent).

  • min_clearance

    Closest approach between two solids — the measured gap, richer than the binary interference_check. `a` and `b` are object handles. All lengths mm, volumes mm³.

  • mirrored

    Mirror a PartDesign feature across a plane.

  • new_documentwrite action

    Create a new FreeCAD document and make it active. Returns {doc: <name>}.

  • open_document

    Open an existing .FCStd file, make it active. Returns doc name and object list.

  • oring_groove

    Compute a static O-ring gland (groove) and optionally cut it into a face.

  • pad

    Pad a sketch by `length` mm. symmetric=True extrudes both directions.

  • partdesign_chamfer

    PartDesign Chamfer on edges of a feature in a Body. `edges` accepts e_* tags or 'EdgeN' index strings; `size` is the chamfer leg in mm (> 0).

  • partdesign_fillet

    PartDesign Fillet on edges of a feature in a Body. `edges` accepts e_* tags or 'EdgeN' index strings; `radius` in mm (> 0).

  • ping

    Check that the FreeCAD worker is alive. Returns 'pong' on success.

  • pocket

    Subtract a pad of `length` mm from the body. through_all ignores length.

  • polar_pattern

    Repeat a PartDesign feature around an axis.

  • publish_interfacewrite action

    Record a named interface frame on a component so other parts can mate to it — the published "here is where you bolt to me, and how it's oriented".

  • query_faces

    Filter faces by a structured predicate. Returns matching descriptors.

  • register_handle

    Register an existing FreeCAD object into the AnkusDrive handle table. Use after run_script (when auto_register=False) or after open_document to bring objects into the handle ecosystem so subsequent tool calls accept them via handle.

  • resolve_edge

    Resolve an edge tag to the current EdgeN index. Errors on miss or ambiguity.

  • resolve_face

    Resolve a face tag to the current FaceN index. Errors on miss or ambiguity.

  • restart_workerwrite action

    Kill the current workspace's FreeCAD worker process and spawn a fresh one. Use when the worker is wedged (e.g. App.ActiveDocument desynced from internal state). All open documents, unsaved changes, and handles in THIS workspace are lost — save first if needed. Other workspaces are untouched. Returns {restarted: True, workspace: <name>, freecad: [...]}.

  • revolve

    Revolve a sketch around a body origin axis ('X'|'Y'|'Z') by `angle` deg.

  • run_scriptwrite action

    Escape hatch: execute Python in the worker with App/Part/ObjectsFem in scope.

  • save_document

    Save the active document to the given .FCStd path.

  • scale_shape

    Scale a shape uniformly or per-axis, baking a fresh static solid.

  • section_view

    Cut a solid with a plane and return the cross-section it exposes. This is the best way to "see inside" a part blind: it measures the cut area and its extent, and can optionally emit the section outline as a new object for rendering/export. Units: mm (lengths), mm^2 (areas).

  • set_active_document

    Switch the active document by name (the value returned from new_document/open_document).

  • set_property

    Set a single property by name on an object. Coerces lists → Vector for Vector properties; other values pass through.

  • set_visibility

    Override an object's persistent Visibility flag. By default save_document auto-hides producer-inputs (the Base/Tool of a Cut, features inside a Body) so the re-opened doc shows just the final composition. Use this to override — e.g. to keep a reference primitive visible next to a derived part. Note that the next save_document with visibility_hygiene=True (the default) may re-hide it; pass visibili

  • shell_solid

    Hollow a raw Part solid into a thin-walled shell (the direct-shape counterpart to `thickness`, which only works on PartDesign bodies).

  • standard_part_designate

    The canonical, orderable designation of a purchased standard part — the string a buyer can actually quote against: "ISO 4762 M4×12 A2", "608-2RS", "AS568-214 NBR70". A BOM row that reads "SocketHeadCapScrew" is not a buyable line; this is what turns it into one.

  • sweep

    Sweep a profile sketch along a spine sketch (additive pipe).

  • thickness

    Hollow out a solid into a shell.

  • transaction_abort

    Roll back the most recent open transaction. Implementation note: FreeCAD 1.1 headless `abortTransaction` is unreliable, so the worker commits then undoes — net effect is a clean rollback.

  • transaction_commit

    Commit the most recent open transaction; changes are kept.

  • transaction_open

    Begin an undoable transaction on the active document. Pair with transaction_commit (keep the changes) or transaction_abort (roll back). Transactions nest — the most-recent open is committed/aborted first.

  • transform

    Move and/or rotate an existing object in place — first-class replacement for hand-poking an object's Placement via set_property.

  • use_workspace

    Claim (creating if needed) an isolated workspace and make it the target of subsequent tool calls. Each workspace is its own freecadcmd process with its own ActiveDocument and handle registry — handles do NOT cross workspaces. This is how concurrent agents share one MCP server without clobbering each other's documents: each agent calls use_workspace with a unique name once, up front.

  • validate_manifest

    Validate a manifest WITHOUT building it (the cheap front door, RFC §11.7). Structural + cross-reference checks a JSON shape can't enforce: every component has exactly one of file/manifest/library; a library carries a tool; every instance references a known component; every mate/check references a known instance; a present `schema` is the known version ("ankusdrive.manifest/1").

  • verify_contract

    Build-time self-check of a component against its manifest slice (RFC §11.3): a builder calls this on its OWN part before save, so a contract violation is caught locally and cheaply instead of after a fan-in merge (build → merge → gate-fail → rebuild becomes build → self-check → fix). Never raises on a failing check (a failure is a passed=False row), so it is safe to call in a loop. Inspection only

  • verify_feature

    Compare a feature's actual volume change against an expected signed delta. Run after each subtractive/additive operation to catch silent failures — Pocket on a curved surface that under-cut, Hole that drilled outside the body, Cut whose Tool didn't intersect the Base.

  • verify_intent

    Re-run every invariant declared with declare_intent — the regression gate to run after each edit. Composes check_shape / check_airtight_path / face-role resolution; never raises on a failing invariant (a failure is a passed=False row), so it is safe to call in a loop. Inspection only; mutates nothing.

  • version

    Return FreeCAD and bundled Python versions from the worker.

Public scan report

scanner v0.1.5 · 2026-09-19 · same rubric, same numbers if you re-run it

1 medium
  • Code scan104 source files scanned20/25
  • Live reliabilityno gateway calls yet and no remote to proben/a
  • Tool poisoningtools not inspected (local package is not executed); not countedn/a
  • Auth qualitylocal package, no credentials required12/15
  • Maintenancelast push 0 days ago15/15
  • Maintainer identityregistry namespace matches repository owner; GitHub account older than a year8/10

Findings (1)

  • mediumeval / new Function usedexec.eval
    ankusdrive-0.5.5/ankusdrive/experiment.py: …led agent round on it? The multi-agent eval (tests/test_multiagent_m2.py) bills real …
Overall 85/100. Components that don't apply are left out of the denominator. Any critical finding is an F.RubricAppeal a findingJSON

Install directly

claude mcp add ankusdrive -- uvx ankusdrive
Add to Cursor

AnkusDrive: common questions

Is AnkusDrive MCP server safe?
Yes, by our scan: it is graded A (85/100). Read the AnkusDrive safety report
How do I install AnkusDrive?
It runs on your machine. Copy the Claude Code, Claude Desktop or Cursor config from the install section.
Does AnkusDrive need an API key?
No secret keys are declared. It reads 1 setting from the environment.
Is AnkusDrive maintained?
The last commit was in the last day (2026-09-19). The latest release is v0.5.5.
What can I use instead of AnkusDrive?
Servers from other publishers that do the same job: ITASCA MCP Server, Hunch MCP server and gflow-cli MCP server. Compare all AnkusDrive alternatives.

Alternatives to AnkusDrive

Same job from other publishers: the closest match first, then the best rated.

All AnkusDrive alternatives →
  • ITASCA MCP Server
    Give AI agents full access to ITASCA PFC, FLAC3D, 3DEC, MPoint, MassFlow: docs, simulation, plots.
    A
  • Hunch
    Focus-free macOS control for AI agents: drive your real Mac apps in the background, no stolen focus.
    A
  • gflow-cli
    Drive Google Flow from an agent: Veo video and Imagen image generation
    A
  • Google Drive MCP
    Secure access to Google Drive, Docs, Sheets, Slides, and Calendar through MCP.
    B
  • SimMirror
    Mirror and drive the iOS Simulator: token-efficient UI snapshots, gestures and a live viewer.
    C

More from gchen19