freecad-mcp
This MCP server lets an AI agent drive FreeCAD to create, inspect, validate, save, and export parametric 3D models.
Report server diagnostics, Python environment details, and FreeCAD bridge status.
Check whether FreeCAD is reachable and report its version, embedded Python, and Part workbench availability.
Create and atomically save controlled workspace documents.
Add primitives such as boxes and cylinders.
Create a rectangular tank or a tubular helix/pipe coil.
Modify whitelisted dimensions on supported objects.
Recompute document geometry after changes.
List and inspect document objects with type, dimensions, volume, and shape information.
Validate object geometry and overall document validity.
Export selected or all Part objects to STEP files within the controlled workspace.
Drives a local FreeCAD instance to create, inspect, validate, and modify parametric 3D models, including box, cylinder, tank, and tubular coil geometry, document validation, saving, and STEP export.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@freecad-mcpCreate a 50x30x20 mm box, validate the document, and export it as STEP"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
freecad-mcp
Drive FreeCAD parametric 3D modeling from an AI coding agent (for example OpenCode) through the Model Context Protocol (MCP).
The agent talks to a local MCP server, which talks to a real FreeCAD instance through a small, explicit bridge. The goal is to let an agent create, inspect, validate, and modify parametric models — not to run arbitrary generated Python inside FreeCAD.
Two execution strategies
This project is structured so that two independent approaches can be built and fairly compared:
Method A — Direct MCP (primary). The agent uses this project's MCP tools to drive FreeCAD directly. This path must work on its own and never depends on the optional integration.
Method B — Taiga-assisted MCP (optional). An isolated adapter for Taiga-S1, wired in behind a clearly defined interface. Taiga's real capabilities and interfaces must be verified before any adapter code exists, and the project must keep working when Taiga is absent, disabled, or incompatible.
Related MCP server: FreeCAD MCP Server
Status
Incremental development. Current progress:
Milestone | Description | Status |
0 | Environment inspection and project initialization | Done |
1 | Minimal MCP server with a diagnostic tool | Done |
2 | FreeCAD bridge (connection + version diagnostics) | Done |
3 | Direct modeling tools (box, cylinder, validate, export STEP) | Done |
4 | Configurable tank and tubular coil | Done |
5 | Taiga-S1 investigation and optional adapter contract | Done |
6 | Comparison framework (Method A vs Method B) | Planned |
7 | Documentation and release preparation | Planned |
The MCP server, its diagnostic tool, and the local FreeCAD bridge (connection and version diagnostics) are implemented and tested. Milestone 3 adds direct modeling tools (create_box, create_cylinder, set_parameter, recompute, list_objects, inspect_object, validate_document, save_document, export_step), and Milestone 4 adds tank and tubular coil geometry creation using Part::Box, Part::Cylinder, Part::Helix and Part::Pipe primitives through the persistent parametric modeling system.
Milestone 5 records the verified Taiga-S1 investigation and adds an optional,
import-safe adapter contract. The adapter can report availability and score
candidate commands against a supplied state, but it does not generate plans or
execute model-produced commands; Taiga-driven geometry remains deferred. See
docs/taiga-s1.md.
Requirements
Python 3.10+ (development uses a uv-managed CPython 3.14)
uv for dependency management
Git
FreeCAD (developed against FreeCAD 1.1.x) — required only for the bridge and modeling milestones, not for the MCP server skeleton
Quick start (development)
# Install uv if missing: https://docs.astral.sh/uv/getting-started/installation/
uv sync # create the environment and install (locked) dependencies
uv run pytest # run the test suite
uv run freecad-mcp # run the MCP server over stdioSee docs/development.md for environment setup, FreeCAD
discovery, and the development workflow, and
docs/architecture.md for the module layout and design
principles.
Repository layout
src/freecad_mcp/ # the Python package
__init__.py # version
server.py # MCP server construction + stdio entry point
config.py # environment-based settings
tools/ # MCP tool definitions (diagnostics + freecad_status)
freecad_bridge/ # local child-process bridge to FreeCAD
runner.py # runs *inside* FreeCAD; fixed, explicit operations
integrations/ # optional backend contract + Taiga-S1 adapter
docs/ # architecture and development notes
tests/ # FreeCAD-independent tests + FreeCAD-gated integration testsThe optional integrations/ package exists as of Milestone 5; validation/
will be added when the milestone that needs it lands.
AI-Assisted Development
OpenCode and ChatGPT were used as AI-assisted development tools throughout this project.
OpenCode assisted with code exploration, implementation, debugging, and testing, while ChatGPT was used for technical discussions, architectural decisions, troubleshooting, documentation, and development guidance.
AI-generated suggestions and code were reviewed and tested as part of the development workflow. The project maintainer remains responsible for the project's code, technical decisions, and releases.
License
Copyright (C) 2026 Mohammad Reza Asadi
This project is licensed under the GNU General Public License v3.0 only (GPL-3.0-only).
You are free to use, study, modify, and redistribute this software under the terms of the license. If you distribute this software or modified versions of it, you must comply with the applicable requirements of the GPL-3.0 license.
See the LICENSE file for the full license text.
This project is an independent open-source project and is not affiliated with, endorsed by, or sponsored by the FreeCAD project.
Available Tools
14 toolscreate_boxCreate boxA
Add a Part::Box to an existing document. The document is locked exclusively during the operation; other processes cannot modify it concurrently. Parameters length, width, height must be positive numbers (millimetres).
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | Object name inside FreeCAD. |
| type | Yes | FreeCAD TypeId, e.g. 'Part::Box'. |
| width | No | Width in mm. |
| height | No | Height in mm. |
| length | No | Length in mm. |
| radius | No | Radius in mm (cylinders). |
| volume | No | Shape.Volume if available. |
| shape_type | No | Shape.ShapeType if available (e.g. 'Solid'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses that the document is locked exclusively during the operation and that length/width/height must be positive, but it does not cover permissions, error behavior, or whether changes are reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action, followed by the concurrency constraint and parameter constraints. There is no repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema means return values need not be explained, and the nested schema covers individual parameter meanings. The description adds the important locking behavior and numeric constraints; it could be stronger on error cases or permissions, but is largely complete for this local mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The nested schema already documents each property with descriptions and defaults, though the top-level 'params' object lacks a schema description. The tool description adds meaningful constraints — positivity and millimetres — for length, width, and height, but says nothing about document_id, object_name, or workspace.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Add a Part::Box to an existing document.' The resource name 'Part::Box' clearly differentiates it from sibling tools such as create_cylinder and create_document.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'existing document' implies a prerequisite, but there is no explicit guidance on when to use this tool versus create_cylinder or create_document, nor any exclusions or alternative-selection advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_cylinderCreate cylinderA
Add a Part::Cylinder to an existing document. The document is locked exclusively during the operation. Parameters radius and height must be positive numbers (millimetres).
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | Object name inside FreeCAD. |
| type | Yes | FreeCAD TypeId, e.g. 'Part::Box'. |
| width | No | Width in mm. |
| height | No | Height in mm. |
| length | No | Length in mm. |
| radius | No | Radius in mm (cylinders). |
| volume | No | Shape.Volume if available. |
| shape_type | No | Shape.ShapeType if available (e.g. 'Solid'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and usefully discloses the exclusive document lock and positive-value constraints. However, it does not explain failure behavior, permissions, or side effects such as object-name collisions, so transparency is only adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences with the operation and key preconditions front-loaded. Every sentence contributes useful information without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a create tool with a rich input schema and an output schema, the description supplies the essential context: existing document requirement, exclusive lock, and positive radius/height. Remaining gaps around permissions and error conditions are minor but present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents document_id, workspace, object_name, units, and defaults; the description adds the important positivity constraint for radius and height. It still omits behavioral meaning for workspace and object_name, so it adds some value but does not fully compensate for the remaining gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: adding a Part::Cylinder to an existing document. This clearly distinguishes it from sibling tools such as create_document, create_box, and other shape/object tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'to an existing document' establishes the key precondition and implicitly routes new-document scenarios to create_document. It does not explicitly discuss alternatives among shape-creation tools, but the resource-specific name makes the distinction clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_documentCreate documentA
Create a new empty FreeCAD document and save it atomically to the controlled workspace. The document_id is validated to be a safe filename (letters, digits, '.', '_', '-', max 64 chars). The document is stored under <workspace>/<document_id>.fcstd and its metadata revision is set to 1. Use create_box or create_cylinder to add geometry.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| objects | Yes | List of objects with basic info. |
| all_valid | No | True if validate_document reports all OK. |
| document_id | Yes | Validated document identifier. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it discloses atomic persistence, filename validation rules, the exact storage path, and that the metadata revision is initialized to 1. It omits write-conflict semantics — whether an existing document_id is overwritten or rejected — which is the main remaining behavioral gap for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action, followed by the validation/path contract and the sibling hand-off. Nothing is redundant or buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is correctly omitted, and the description supplies the write semantics an agent needs before invoking. The missing piece is collision/overwrite behavior for an already-existing document_id, which matters for a creation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is reported as low, so the description usefully compensates: document_id must be safe-filename characters (letters, digits, '.', '_', '-') capped at 64 chars, and its effect on the storage path is spelled out. The optional workspace parameter is left to the schema, keeping this just short of full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new empty FreeCAD document') along with scope (atomic save to the controlled workspace). The word 'empty' plus the pointer to create_box/create_cylinder makes it unmistakably distinct from the geometry-creating siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing sentence routes the agent: use create_box or create_cylinder to add geometry, implying this tool is the prerequisite container-creating step. It gives clear context but never states an explicit exclusion (e.g., what to do if the document already exists).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_stepExport STEPA
Export selected objects from a document to STEP format. If "object_names" are provided, only those objects are exported; otherwise all Part objects in the document are exported. The default output path is <workspace>/<document_id>.step, but a custom path may be supplied (must remain within the controlled workspace).
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | Yes | Whether the export completed without error. |
| step_path | Yes | Absolute path to the exported STEP file. |
| document_id | Yes | Validated document identifier. |
| exported_count | Yes | Number of objects exported. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose useful behavior: default selection is all Part objects, the default path is <workspace>/<document_id>.step, and custom paths are constrained to the controlled workspace. It does not state whether an existing file at step_path is overwritten, what permissions are needed, or whether the source document must be saved first.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the core action and immediately followed by the selection rule and the path rule. Some content restates the schema defaults, but nothing is wasted or buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Return values are covered by the output schema and the path/selection behavior is spelled out, so the essentials are present. For an unannotated mutation-style tool, the description should also address overwrite semantics and failure conditions, which it omits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The prose explains each parameter's role (object_names narrowing the export set, step_path vs the default, workspace as the containment boundary) and adds the constraint that custom paths must remain within the controlled workspace, which the schema does not state. This compensates for the reported low schema coverage and adds semantics beyond the raw field definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (export) and resource (document objects) plus the target format (STEP), which clearly separates it from siblings like save_document or validate_document. It stops short of explicitly naming the nearest sibling as the alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives conditional guidance for the object_names parameter (only those objects vs all Part objects) and for the output path, which implies when to use each mode. It offers no explicit guidance on when to choose this tool over save_document or other export-related workflows, leaving tool selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
freecad_statusFreeCAD statusA
Report whether a usable FreeCAD installation is reachable and, if so, its version, embedded Python version, and whether the Part workbench is available. Returns available=false with guidance when FreeCAD is missing or fails to start. Safe to call at any time.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | Suggested next step when FreeCAD was not found. |
| error | No | Failure detail when FreeCAD could not be reached. |
| version | No | FreeCAD version, e.g. '1.1.4'. |
| revision | No | Source revision, when reported. |
| available | Yes | Whether a usable FreeCAD was reached and answered. |
| build_date | No | FreeCAD build date, when reported. |
| executable | No | Resolved FreeCAD console executable path. |
| full_version | No | Raw FreeCAD version fields. |
| part_available | No | Whether FreeCAD's Part workbench module imported successfully. |
| python_version | No | Python version embedded in FreeCAD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does add real value: it declares the call non-mutating and safe at any time, discloses the failure path (available=false plus guidance), and sketches the success payload. It doesn't mention cost, latency, or whether repeated calls re-probe the installation, but for a trivial read-only check the disclosure is adequate rather than rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core purpose, then the return shape, then the failure mode and safety note. Every sentence adds distinct information with no repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool takes no parameters, is a simple read-only probe, and has an output schema for the returned fields. The description covers the one thing the schema cannot: what happens when FreeCAD is absent, and that calling it is always safe.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly implies a no-argument invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb ('Report') against a specific resource (a usable FreeCAD installation) and enumerates what is returned: version, embedded Python version, Part workbench availability. It implicitly separates itself from sibling tools like server_info and the create_* tools by being purely a reachability check, though it never names that sibling to sharpen the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Safe to call at any time' clearly signals it is a non-destructive preflight/health check, and 'Returns available=false with guidance when FreeCAD is missing or fails to start' tells the agent what to expect on failure. It stops short of explicitly routing the agent here before calling create_document or other FreeCAD-dependent siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_objectInspect objectC
Return detailed information about a single object by name, including its type, shape type, volume, and dimensional parameters (Length/Width/Height/Radius).
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | Object name inside FreeCAD. |
| type | Yes | FreeCAD TypeId, e.g. 'Part::Box'. |
| width | No | Width in mm. |
| height | No | Height in mm. |
| length | No | Length in mm. |
| radius | No | Radius in mm (cylinders). |
| volume | No | Shape.Volume if available. |
| shape_type | No | Shape.ShapeType if available (e.g. 'Solid'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it implies a read-only lookup but says nothing about failure behavior when the object name is unknown, whether the document must be loaded, or how workspace scoping affects the lookup. The only real disclosure is the field list, which is arguably return-value territory already covered by the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It loses a point because most of its payload enumerates return fields (type, shape, volume, dimensions) that the output schema already defines.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no annotations and an output schema that already documents returns, the description should spend its words on inputs and failure modes; instead it duplicates the return surface and leaves parameters and error conditions unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description mentions only 'by name', giving no meaning for document_id or the optional workspace parameter, so it does not compensate for the reported 0% schema description coverage. An agent learns which inputs matter purely from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return detailed information about a single object by name'), which clearly separates it from the enumeration sibling list_objects. It stops short of naming any sibling explicitly, so it lands just below the top band.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'by name' phrasing implies it operates on one already-known object, but there is no explicit when-to-use, no prerequisite about the document being open, and no pointer to list_objects for discovery or to create_* tools for other purposes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_objectsList objectsB
List all objects in a document, returning their names, types, and basic geometry information (shape type, volume, dimensions).
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| objects | Yes | List of objects with basic info. |
| all_valid | No | True if validate_document reports all OK. |
| document_id | Yes | Validated document identifier. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It communicates that objects are listed and describes returned fields, but it does not state read-only behavior, permission requirements, error behavior, or whether listing has any side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. It communicates the core action and the return information efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema already covers return values, so the description needn't explain them in detail. For a simple read-style listing tool this is minimally adequate, but missing parameter guidance and behavioral details leaves clear gaps given the absence of annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description does not mention the required `document_id` parameter or the optional `workspace` parameter and its default. With the provided context signaling 0% schema description coverage, the description should compensate but does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ("List all objects in a document") and specifies the returned fields, so the operation is understandable without the schema. It does not explicitly distinguish itself from the sibling `inspect_object`, which is the main clarity gap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase "List all objects in a document" implies when to use the tool: when an inventory of all objects is needed. However, it does not state when not to use it or direct the agent to alternatives such as `inspect_object` for a single object.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recomputeRecompute documentA
Recompute the active document geometry. Useful after modifying parameters to update the model. The document is locked during the operation.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description usefully discloses that the document is locked during the operation. However, it does not cover permissions, whether the recompute is reversible, error behavior, or other operational constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action and followed by the relevant usage trigger and locking behavior. No wasted wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. But with no annotations and weak parameter coverage, the description should do more to explain document selection, workspace handling, and operational side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description refers only to the 'active document' and never explains the document_id parameter or workspace parameter. Given the reported 0% schema description coverage, the description does not compensate for the missing parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: recomputing the active document geometry. It is clear what the tool does, though it does not explicitly differentiate itself from validation or save siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear usage trigger: useful after modifying parameters to update the model. It does not name alternatives or exclusions, so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_documentSave documentA
Explicitly save the current document atomically. This is equivalent to the auto-save that happens after create_box/create_cylinder/set_parameter, but can be called independently. After a successful save the document's metadata revision is incremented.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | Yes | Whether the export completed without error. |
| step_path | Yes | Absolute path to the exported STEP file. |
| document_id | Yes | Validated document identifier. |
| exported_count | Yes | Number of objects exported. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does well by disclosing atomicity, equivalence to auto-save, and that a successful save increments the document metadata revision. It omits failure behavior, permission requirements, and whether it overwrites unsaved changes, leaving some mutation semantics unclear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action and followed by useful behavioral context. There is no wasted text and the key equivalence to auto-save is easy to extract.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema is present, so return values need not be described. The description covers the important save behavior and revision increment, though it could say more about error cases and the workspace parameter for a mutation tool with no annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description refers only to the 'current document' and does not explain the document_id or workspace parameters. With the context signal indicating low schema description coverage, the description should compensate but does not add meaningful parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: explicitly saving the current document atomically. It also distinguishes this from the automatic saves triggered by create_box/create_cylinder/set_parameter, so an agent can tell it apart from sibling mutation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly explains that this is equivalent to auto-save but can be called independently, giving a usable context for when to invoke it. It does not explicitly say when not to call it or name an alternative explicit-save path, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_infoServer informationA
Return diagnostic information about this freecad-mcp server: its name, version, the installed MCP SDK version, and the FreeCAD bridge status. Set include_environment=true to also report the host Python environment. This tool does not contact FreeCAD and is safe to call at any time.
| Name | Required | Description | Default |
|---|---|---|---|
| include_environment | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | Server name advertised over MCP. |
| version | Yes | freecad-mcp package version. |
| environment | No | Host Python environment details, present only when include_environment is true. |
| mcp_sdk_version | Yes | Installed Model Context Protocol Python SDK version. |
| freecad_bridge_status | Yes | State of the FreeCAD bridge; 'not_implemented' until Milestone 2. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavior burden well: it discloses that no FreeCAD connection is made and that the call is always safe, plus the exact information returned. It doesn't mention side effects beyond that (e.g., whether environment reporting is expensive), but the safety profile is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, each earning its place: what is returned, the parameter's effect, and the safety/no-FreeCAD constraint. The key scoping claim is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation isn't required, yet the description still summarizes the payload and covers the safety constraint and the parameter. Nothing an agent needs in order to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain the single parameter — and it does: include_environment=true additionally reports the host Python environment. The default-false behavior is only implied ('also'), not stated outright, keeping it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return diagnostic information about this freecad-mcp server') and enumerates exactly what is reported: name, version, MCP SDK version, and FreeCAD bridge status. It also implicitly distinguishes itself from freecad_status by declaring it does not contact FreeCAD.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear call context ('safe to call at any time', 'does not contact FreeCAD') and a conditional usage rule for include_environment=true. It never explicitly names a sibling alternative to use instead, so it falls just short of the top mark.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_parameterSet parameterA
Change a whitelisted parameter on an existing object. Currently whitelisted properties are:
Box: Length, Width, Height
Cylinder: Radius, Height The value must be a positive number (millimetres). The document is locked exclusively during the operation.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | Object name inside FreeCAD. |
| type | Yes | FreeCAD TypeId, e.g. 'Part::Box'. |
| width | No | Width in mm. |
| height | No | Height in mm. |
| length | No | Length in mm. |
| radius | No | Radius in mm (cylinders). |
| volume | No | Shape.Volume if available. |
| shape_type | No | Shape.ShapeType if available (e.g. 'Solid'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden well: it discloses that only whitelisted properties are allowed, values must be positive millimetres, and the document is exclusively locked during the operation. It still omits permission requirements and error behavior, but the mutation and locking behavior are clearly surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded, appropriately short, and structured around the core operation, whitelist, value constraint, and locking behavior. Every sentence contributes useful invocation context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, it covers the critical preconditions: existing document/object, whitelisted property, positive millimetre value, and exclusive locking. An output schema exists, so return values need not be explained, and the main remaining gap is the optional workspace parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds useful meaning for property_name via the Box/Cylinder whitelist and for value via the positive-millimetres constraint. However, with reported schema coverage at 0%, it does not compensate for all parameters because the optional workspace parameter is not explained in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: changing a whitelisted parameter on an existing object. It clearly distinguishes modification from sibling creation tools by specifying an existing object, though it does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies when to use it by saying it changes whitelisted parameters on existing objects and lists the eligible Box/Cylinder properties. However, it gives no explicit when-not guidance or direct routing versus siblings like inspect_object, validate_document, or create_box.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tankCreate tankA
Add a rectangular Part::Box (tank) to an existing document. Parameters length, width, height must be positive numbers (millimetres). The document is locked exclusively during the operation.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | Object name inside FreeCAD. |
| type | Yes | FreeCAD TypeId, e.g. 'Part::Box'. |
| width | No | Width in mm. |
| height | No | Height in mm. |
| length | No | Length in mm. |
| radius | No | Radius in mm (cylinders). |
| volume | No | Shape.Volume if available. |
| shape_type | No | Shape.ShapeType if available (e.g. 'Solid'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses that the document is locked exclusively during the operation and that dimensions must be positive, but it does not state what happens if the document is missing, already locked, or how failures are surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences with the action and target front-loaded, followed by the positivity constraint and the locking behavior. There is no redundant or filler text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description need not explain return values. For a mutation tool with no annotations, however, it should ideally mention permission requirements or failure behavior around the exclusive document lock; it currently only states that the lock occurs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description reinforces that length, width, and height are positive millimetre values, which is useful. The nested schema already describes all six parameters, including document_id, workspace, and object_name, so the description adds only marginal meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: add a rectangular Part::Box (tank) to an existing document. It is clear enough to distinguish this from document creation, but it does not explicitly differentiate itself from the sibling create_box or create_cylinder tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'to an existing document' implies the tool is for adding geometry after a document exists, rather than creating one. However, it gives no explicit guidance on when to use this versus create_box, create_cylinder, or other creation tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tubular_coilCreate tubular coilA
Add a tubular helix coil to an existing document using a Part::Helix and pipe. Parameters coil_radius, tube_radius, num_turns, pitch must be positive numbers (millimetres). The document is locked exclusively during the operation.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | Object name inside FreeCAD. |
| type | Yes | FreeCAD TypeId, e.g. 'Part::Box'. |
| width | No | Width in mm. |
| height | No | Height in mm. |
| length | No | Length in mm. |
| radius | No | Radius in mm (cylinders). |
| volume | No | Shape.Volume if available. |
| shape_type | No | Shape.ShapeType if available (e.g. 'Solid'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose a genuinely non-obvious behavioral trait: 'The document is locked exclusively during the operation', which tells the agent about concurrency/blocking. It also states validity constraints (positive millimetre values). What's missing is failure behavior (does the document remain locked on error?) and whether the result needs saving/recomputing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the action and target lead, followed by constraints and the locking caveat. There is no filler, and the most important behavioral note is placed last as a warning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the nested schema fully documents each field. The description supplies the prerequisite (existing document) and the exclusive-lock behavior, leaving only error/recovery and post-creation steps (save, recompute) unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description names the four geometric parameters (coil_radius, tube_radius, num_turns, pitch) and repeats their positive-number/millimetre semantics, which the nested schema already documents in detail, while saying nothing about document_id, object_name, or workspace. Since the reported top-level schema coverage is 0% (the 'params' wrapper is undescribed), the description partially compensates but adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Add') and a precise resource ('a tubular helix coil to an existing document'), plus the implementation approach (Part::Helix and pipe). This is clearly distinguishable from siblings like create_box, create_cylinder, or tank, which produce different geometry in presumably new objects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'to an existing document' implies the prerequisite that a document must already exist, which usefully narrows the call context. However, it never names an alternative (e.g., create_document first, or a plain helix tool if one exists) or states when not to use it, leaving usage to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_documentValidate documentA
Validate the geometry of all objects in a document. Returns per-object results indicating whether each object is a valid Solid with positive volume, plus an overall all_valid flag. Use after modifying parameters or before exporting STEP.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| objects | Yes | Per-object validity results. |
| all_valid | Yes | True if every object passes geometry checks. |
| document_id | Yes | Validated document identifier. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the result shape (per-object results plus an all_valid flag) but says nothing about whether the call mutates the document, cost on large documents, or what happens when geometry is invalid (throw vs. report).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: purpose and validation semantics first, usage timing second. Zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema means the return values needn't be explained, and the description adds them anyway. But with no annotations and unclear mutation/safety semantics, an agent still lacks enough behavioral context to call this confidently in a destructive-adjacent workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One required parameter (document_id) with low schema description coverage; the description implies document scoping only through 'in a document' and never addresses the workspace default, which is documented only in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (validate) and resource (document geometry), and defines what 'valid' means: a Solid with positive volume. Scope ('all objects') separates it from per-object siblings like inspect_object and from recompute.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit timing guidance ('after modifying parameters or before exporting STEP') and implicitly routes the agent relative to export_step. No explicit exclusion or statement about when not to call it, and no mention of recompute as a prerequisite alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
14 tool updates
v0.1.0- First observed
create_box - First observed
create_cylinder - First observed
create_document - First observed
export_step - First observed
freecad_status - First observed
inspect_object - First observed
list_objects - First observed
recompute - First observed
save_document - First observed
server_info - First observed
set_parameter - First observed
tank - First observed
tubular_coil - First observed
validate_document
TDQS
Scored across 14 tools
Most tools target distinct resources+actions (create_document, set_parameter, list_objects, inspect_object, export_step), but create_box and tank both 'add a rectangular Part::Box' with identical parameters, making them nearly indistinguishable. Additionally, freecad_status and server_info both report FreeCAD/bridge status, creating partial overlap.
There is a solid core of consistent verb_noun names (create_document, create_box, set_parameter, list_objects, validate_document, save_document, export_step), but several tools break the pattern with bare nouns (tank, tubular_coil, server_info, freecad_status) and a lone verb (recompute). Readable, but conventions are mixed.
14 tools sit comfortably in the appropriate range for a CAD workflow server. The count is reasonable, though the redundant tank tool arguably doesn't earn its separate place alongside create_box.
The surface covers creation, parameter editing, listing, inspection, validation, saving, and STEP export, which is a coherent core. However, notable gaps exist: no delete/remove object or document, no list_documents or open/load existing document, so agents cannot manage the full document lifecycle.
Maintenance
Related MCP Connectors
214 tools for AI agents over one MCP endpoint: image, video, audio, 3D, data, storage, mail, GPUs.
Persistent memory, knowledge graph, task management and more for AI agents via MCP.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with FreeCAD for 3D modeling, macros, and debugging via MCP.MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI to directly call FreeCAD for 3D modeling via the MCP protocol, providing 39 modeling tools including primitive creation, boolean operations, transformations, and export.3-
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to programmatically build, analyze, and export 3D CAD geometry using FreeCAD through REST or MCP tools.MIT
- AlicenseNot gradedqualityDmaintenanceEnables engineering agents to perform parametric CAD operations through a controlled MCP gateway built on FreeCAD, with transactions, diagnostics, and reproducible verification.3GNU Lesser General Public v2.1 only