FreeCAD MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| FREECAD_MCP_HOST | No | Host the XML-RPC bridge listens on. | 127.0.0.1 |
| FREECAD_MCP_PORT | No | Port the XML-RPC bridge listens on. | 9875 |
| FREECAD_MCP_TIMEOUT | No | Timeout in seconds for the MCP server. | 300 |
| FREECAD_MCP_AUTOSTART | No | Whether the addon autostarts in FreeCAD. | 1 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| freecad_statusA | Check the bridge connection and list open documents. Call this before anything else. It reports the FreeCAD version, which document is active, and how many objects each open document holds. |
| list_documentsA | List every open FreeCAD document with its file path and modified state. |
| create_documentA | Create a new document and make it active. Args: name: internal name; FreeCAD may append digits to keep it unique. label: optional display name shown in the tree. |
| open_documentA | Open an existing .FCStd file and make it active. |
| save_documentA | Save a document. Args: document: document name; defaults to the active one. path: save to this path instead (required the first time a document is saved). |
| close_documentB | Close a document, optionally saving it first. Unsaved changes are lost. |
| recomputeA | Recompute a document and report objects left in an error/invalid state. Use this after |
| list_objectsA | List objects in a document (name, label, TypeId, state). Args: document: defaults to the active document. type_filter: case-insensitive substring match on TypeId, e.g. "Part::" or "Sketch". |
| get_objectA | Inspect one object: all properties, plus shape volume/area/bounding box. Args: name: object Name or Label. include_properties: set False for a lighter response on complex objects. include_shape: set False to skip geometry measurement. |
| create_objectA | Create an object in a document. Frequently used TypeIds: Primitives Part::Box (Length,Width,Height) | Part::Cylinder (Radius,Height,Angle) Part::Sphere (Radius) | Part::Cone (Radius1,Radius2,Height) Part::Torus (Radius1,Radius2) | Part::Plane (Length,Width) Part::Wedge | Part::Ellipsoid | Part::Prism (Polygon,Circumradius,Height) Booleans Part::Cut / Part::Fuse / Part::Common (properties: Base, Tool) Part::MultiFuse / Part::MultiCommon (property: Shapes = [names]) Transforms Part::Mirroring (Source,Normal,Base) | Part::Extrusion | Part::Revolution Structure App::Part | App::DocumentObjectGroup | App::Link (LinkedObject) Modelling PartDesign::Body | Sketcher::SketchObject (build these with run_python) Value formats accepted by Example: a 20mm cube offset on X, coloured orange type_id="Part::Box" properties={"Length": 20, "Width": 20, "Height": 20, "Placement": {"Base": [30, 0, 0]}} view_properties={"ShapeColor": "#ff8800"} Example: cut a cylinder out of a box (both must already exist) type_id="Part::Cut", properties={"Base": "Box", "Tool": "Cylinder"} |
| edit_objectA | Change properties of an existing object. Only the properties you pass are touched; everything else is left alone.
Call Value formats accepted by |
| move_objectA | Reposition an object without touching its other properties. Args: name: object Name or Label. position: absolute [x, y, z] in mm. Omit to keep the current position. rotation: degrees about Z, or {"Axis": [x,y,z], "Angle": deg}, or {"Yaw":.., "Pitch":.., "Roll":..}. Omit to keep the current rotation. |
| delete_objectA | Delete an object. Args: recursive: also delete the object's children (e.g. the operands consumed by a boolean). Deleting a boolean without this leaves its operands behind. |
| get_selectionA | Read what the user currently has selected in the FreeCAD GUI. Useful when the user says "this part" or "the selected face". |
| run_pythonA | Execute Python inside FreeCAD. The escape hatch for anything the typed tools cannot do. Preloaded names: Returns stdout, stderr, the value, and a full traceback on failure. Example -- a sketch-based pad: body = doc.addObject("PartDesign::Body", "Body") sketch = body.newObject("Sketcher::SketchObject", "Sketch") import Part sketch.addGeometry(Part.Circle(App.Vector(0,0,0), App.Vector(0,0,1), 10), False) pad = body.newObject("PartDesign::Pad", "Pad") pad.Profile = sketch pad.Length = 25 result = pad.Name |
| reset_pythonA | Clear variables accumulated by previous |
| capture_viewA | Screenshot the 3D view and return it as an image. Always look at the model after building geometry instead of assuming it is correct. Args: document: defaults to the active document. view: axonometric, isometric, front, rear, left, right, top or bottom. width, height: pixel size of the render. fit: zoom to fit all visible geometry first. |
| export_objectsB | Export geometry to a file; the format comes from the extension. Supported: .step/.stp, .iges/.igs, .stl, .obj, .ply, .3mf, .amf, .off, .brep and .fcstd. Args: path: destination file path. objects: object names to export; omit to export every shaped object. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ahelja/FreeCAD-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server