local-only server
The server can only run on the client’s local machine because it depends on local resources.
Integrations
Enables interaction with FreeCAD CAD software through a standardized interface, offering tools for 3D model creation, manipulation, measurement, and export. Includes specialized smithery tools for blacksmithing designs, primitive shape generation, boolean operations, and model transformation capabilities.
🛠️ MCP-FreeCAD 集成
**注意:**此仓库正在大力开发中。预计每天都会有提交,并且可能会有重大变更。
该项目使用**模型上下文协议 (MCP)**实现了 AI 助手与 FreeCAD CAD 软件之间的强大集成。它允许外部应用程序通过标准化接口与 FreeCAD 交互,并提供多种连接方法和专用工具。
快速启动(推荐:AppImage + Launcher)
为了获得最可靠的设置,请按照以下步骤操作:
- 设置环境(一次性) :运行安装脚本。这会将存储库克隆到
~/.mcp-freecad
,创建一个 Python 虚拟环境,下载最新稳定的 FreeCAD AppImage,将其解压,并配置服务器以使用它。或者,克隆 repo 并手动运行Copy./scripts/bin/setup_freecad_env.sh
。 - 运行 MCP 服务器:使用安装程序脚本(现在仅确保 venv 处于活动状态并运行服务器)或全局命令(如果已安装)。Copy
这将使用推荐的launcher
方法以及下载并提取的 AppImage 来启动 MCP 服务器。
Docker 支持
您还可以在 Docker 容器中运行 MCP-FreeCAD,以便更轻松地部署和隔离。
使用 Docker Compose 运行
- 启动容器:Copy
- 从头开始构建(如果您进行了更改):Copy
Docker 容器公开以下端口:
- 8080:MCP 服务器
- 12345:FreeCAD 服务器
Docker 配置
Docker 设置包括:
Dockerfile
:使用 Python 3.12 定义容器,安装依赖项并设置环境docker-compose.yml
:配置服务、端口、卷和重启策略.dockerignore
:从容器中排除不必要的文件
此方法对于 CI/CD 管道或需要将 MCP-FreeCAD 环境与系统隔离时特别有用。
🔄 MCP 流程图
此流程图展示了主要组件,以及freecad_connection_manager.py
选择的不同连接方法如何导致在 FreeCAD 中执行各种命令。为了确保可靠性,建议使用launcher
方法,该方法通常与通过AppRun
提取的 AppImage 一起使用。
有关更详细的流程图,请参阅FLOWCHART.md 。
🔄 核心组件
1. FreeCAD MCP 服务器( freecad_mcp_server.py
)
- 描述:实现模型上下文协议 (MCP) 的主服务器。它充当 AI 助手或其他客户端通过 MCP 与 FreeCAD 通信的中央枢纽。
- 特征:
- 处理标准 MCP 请求(
mcp/listTools
、mcp/executeTool
)。 - 利用
FreeCADConnection
使用配置的方法与 FreeCAD 进行交互。 - 根据配置公开各种工具集(原语、操作、导出等)。
- 可通过
config.json
配置。
- 处理标准 MCP 请求(
- 用法:Copy
2. FreeCAD 连接( freecad_connection_manager.py
)
- 描述:一个统一的 Python 接口,封装了连接 FreeCAD 的逻辑。由 MCP 服务器内部使用,可直接用于脚本编写。
- 特征:
- 根据配置和可用性智能地选择最佳连接方法。
- 方法:
- 启动器:(推荐)使用
freecad_connection_launcher.py
和AppRun
。 - 包装器:使用
freecad_connection_wrapper.py
和freecad_subprocess.py
。 - 服务器:通过套接字连接到正在运行的
freecad_socket_server.py
。 - Bridge :通过
freecad_connection_bridge.py
使用 FreeCAD CLI。 - 模拟:模拟 FreeCAD 进行测试。
- 自动:按推荐的顺序尝试方法(启动器 > 包装器 > 服务器 > 桥接器 > 模拟)。
- 启动器:(推荐)使用
- 用法(直接脚本示例) :Copy
3. FreeCAD 启动器( freecad_connection_launcher.py
)
- 描述:处理 FreeCAD 环境的启动,通常使用从提取的 AppImage 中获取的
AppRun
。它在启动的环境中执行freecad_launcher_script.py
。 - 特征:
- 管理 FreeCAD/AppRun 的子进程执行。
- 将命令和参数传递给内部 FreeCAD 脚本。
- 从脚本的输出中解析 JSON 结果。
- 用途:主要在选择
launcher
方法(在config.json
中配置)时由FreeCADConnection
内部使用。通常不由用户直接运行。
4. FreeCAD 包装器( freecad_connection_wrapper.py
)和子进程( freecad_subprocess.py
)
- 描述:
freecad_connection_wrapper.py
在单独的 Python 进程中启动freecad_subprocess.py
导入 FreeCAD 模块并通过 stdio 管道与包装freecad_subprocess.py
通信。 - 特征:
- 将 FreeCAD 模块导入隔离到专用进程中。
- 如果直接模块导入可行但 AppRun/launcher 有问题,则提供替代连接方法。
- 用法:当选择
wrapper
方法(在config.json
中配置)时,由FreeCADConnection
内部使用。需要子进程可以成功import FreeCAD
Python 环境。
5. FreeCAD 服务器( freecad_socket_server.py
)
- 描述:一个独立的套接字服务器,设计用于在 FreeCAD 实例内运行。监听来自
FreeCADConnection
的连接。 - 特征:
- 允许连接到可能持久的 FreeCAD 实例。
- 如果在
--connect
模式下运行,则可以与 GUI 交互。
- 使用方法(在 FreeCAD 中手动启动) :需要在Copy
config.json
中配置connection_method: server
才能连接 MCP 服务器。 (请参阅docs/FREECAD_SERVER_SETUP.md
)
6.FreeCAD 桥( freecad_connection_bridge.py
)
- 描述:启用与 FreeCAD 可执行文件的命令行交互。绕过直接模块导入问题,但速度可能较慢。
- 特征:
- 通过对
freecad
可执行文件的子进程调用来执行 FreeCAD 命令。
- 通过对
- 用法:当选择
bridge
方法(在config.json
中配置)时,由FreeCADConnection
内部使用。要求freecad
位于系统 PATH 中或在配置中正确设置的path
。
7. FreeCAD 客户端( freecad_client.py
)
- 描述:用于直接与
FreeCADConnection
接口交互的命令行实用程序(用于测试/调试连接方法,而不是 MCP 服务器)。 - 特征:
- 允许从终端测试特定的
FreeCADConnection
命令(例如,创建原语、获取版本)。 - 使用
config.json
来确定连接设置。
- 允许从终端测试特定的
- 使用示例:Copy
🔄 项目结构
MCP-FreeCAD 项目的目录结构如下:
有关脚本的更多详细信息,请参阅scripts/README.md 。
⚙️ 安装和设置详情
本节提供有关不同安装和设置选项的更多详细信息。
推荐设置:AppImage + Launcher(详细步骤)
这涉及两个主要脚本:
scripts/bin/setup_freecad_env.sh
:准备环境。- 将存储库克隆或更新至
~/.mcp-freecad
。 - 创建/更新 Python 虚拟环境(
.venv
)并安装要求。 - 运行
download_appimage.py
将最新稳定的 FreeCAD Linux AppImage 获取到~/.mcp-freecad
中。 - 运行
extract_appimage.py
:- 将下载的 AppImage 提取到
~/.mcp-freecad/squashfs-root
。 - 更新
~/.mcp-freecad/config.json
以使用connection_method: launcher
和use_apprun: true
以及正确的绝对路径。
- 将下载的 AppImage 提取到
- 如何运行:
curl -sSL <URL>/setup_freecad_env.sh | bash
或./scripts/bin/setup_freecad_env.sh
- 将存储库克隆或更新至
scripts/bin/mcp-freecad-installer.sh
:运行服务器。- 注意:尽管名称如此,此脚本不再执行完整安装。它主要确保存储库是最新的,激活虚拟环境,并启动
freecad_mcp_server.py
。 - 它假定环境(AppImage 下载/提取)已通过
setup_freecad_env.sh
或手动准备好。 - 如何运行:
~/.mcp-freecad/scripts/bin/mcp-freecad-installer.sh
或mcp-freecad
(全局命令)。
- 注意:尽管名称如此,此脚本不再执行完整安装。它主要确保存储库是最新的,激活虚拟环境,并启动
其他安装方法
全局安装( install-global.sh
)
- 在
/usr/local/bin
中创建一个符号链接mcp-freecad
指向 repo 中的mcp-freecad-installer.sh
。 - 允许从任何地方运行
mcp-freecad
。 - 如果您想使用推荐的启动器方法,则需要首先使用
setup_freecad_env.sh
设置环境。
手动安装
- 克隆 repo。
- 创建 venv,安装要求。
- 手动下载并提取 AppImage :自行运行
python download_appimage.py
和python extract_appimage.py /path/to/downloaded.AppImage
。 - 运行服务器:
python freecad_mcp_server.py
。
🚀 使用 MCP 服务器
这是使用 Claude 等 AI 助手与 FreeCAD 交互的主要方式。
启动 MCP 服务器
服务器将运行并监听来自 MCP 客户端的连接。
连接 MCP 客户端
使用任何兼容 MCP 的客户端。以下是使用参考mcp client
示例:
或者如果您有一个客户端脚本(如 MCP 文档中的脚本),则使用uv
:
替代方案:使用集成服务器启动 FreeCAD
您还可以使用集成服务器启动 FreeCAD:
这将启动 FreeCAD 并自动启动其中的服务器。
MCP 服务器配置( config.json
)
config.json
文件控制服务器的各个方面。以下示例反映了运行extract_appimage.py
后推荐的启动器设置:
注意:用实际的绝对路径替换示例路径。
有关集成选项的更多详细信息,请参阅FREECAD_INTEGRATION.md 。
🛠️ 可用的 MCP 工具
MCP 服务器提供了各种工具组。以下是所有可用的工具:
📐 基本 FreeCAD 工具( freecad.*
)
freecad.create_document
:创建一个新文档freecad.export_stl
:将模型或特定对象导出为 STLfreecad.import_stl
:将 STL 文件导入当前文档freecad.save_document
:保存当前文档freecad.load_document
:加载现有文档
🔧 模型操作工具( model_manipulation.*
)
model_manipulation.rotate
:围绕指定轴旋转物体model_manipulation.translate
:在 3D 空间中移动物体model_manipulation.scale
:均匀或非均匀缩放对象model_manipulation.mirror
:跨指定平面镜像对象model_manipulation.union
:使用布尔联合组合多个对象model_manipulation.cut
:使用布尔差异剪切对象model_manipulation.intersect
:创建多个对象的交集
📏 测量工具( measurement.*
)
measurement.distance
:测量两点之间的距离measurement.angle
:测量三点之间的角度measurement.area
:计算物体的表面积measurement.volume
:计算固体物体的体积measurement.mass
:计算物体的质量(需要材料特性)
📦 基元工具( primitives.*
)
primitives.create_box
:创建一个矩形框primitives.create_cylinder
:创建圆柱体primitives.create_sphere
:创建一个球体primitives.create_cone
:创建一个圆锥体primitives.create_torus
:创建圆环primitives.create_polygon
:创建一个正多边形primitives.create_ellipse
:创建椭圆
🔄 导出/导入工具( export_import.*
)
export_import.export_step
:导出为 STEP 格式export_import.import_step
:从 STEP 格式导入export_import.export_iges
:导出为 IGES 格式export_import.import_iges
:从 IGES 格式导入export_import.export_dxf
:导出为 DXF 格式export_import.import_dxf
:从 DXF 格式导入
💻 代码生成工具( code_generator.*
)
code_generator.generate_python
:为当前模型生成 Python 代码code_generator.generate_openscad
:为当前模型生成 OpenSCAD 代码code_generator.generate_gcode
:生成用于 CNC 加工的 G 代码code_generator.generate_3d_print
:生成优化的 3D 打印设置
📝 MCP 交互示例
以下是将 MCP 服务器与 AI 助手结合使用的概念示例:
创建并导出盒子
🔍 故障排除
- MCP 服务器连接问题:
- 确保
python src/mcp_freecad/server/freecad_mcp_server.py
可以正常运行,不会立即出现错误。检查终端输出。 - 检查防火墙设置是否相关(对于
stdio
来说不太可能)。 - 验证
config.json
是否为有效的 JSON。
- 确保
- FreeCAD 连接问题(尤其是
launcher
方法) :- 运行
extract_appimage.py
:确保正确提取了 AppImage 并且更新了config.json
。 - 检查
config.json
路径:验证freecad
部分中的所有绝对路径是否适合您的系统。 - 检查权限:确保
squashfs-root/AppRun
具有执行权限(chmod +x
)。 - 检查日志:检查
mcp_freecad.log
(如果开始日志记录,则在项目根目录中创建)、freecad_server_stdout.log
和freecad_server_stderr.log
是否存在来自freecad_connection_launcher.py
、AppRun
或 FreeCAD 进程本身的错误。 - 环境变量:如果
AppRun
无法找到库,请确保正确设置LD_LIBRARY_PATH
和PYTHONPATH
。如果使用 Cursor,则可能在.cursor/mcp.json
中设置;如果在终端中测试,则需要extract_appimage.py
导出。extract_appimage.py 脚本旨在减少这方面的必要性,但它也可能是一个影响因素。 - 无头问题:FreeCAD 有时会在完全无头运行时出现问题(
QT_QPA_PLATFORM=offscreen
)。请检查日志中是否存在与 GUI 相关的错误。
- 运行
server
方法:确保freecad_socket_server.py
在活动的 FreeCAD 实例中运行,并监听config.json
中配置的正确主机/端口。bridge
方法:验证 FreeCAD 是否已在系统范围内安装,以及freecad
命令是否在终端中正常运行。检查config.json
中的freecad_path
。- 缺少 MCP SDK :通过
pip install modelcontextprotocol
安装。 - Python 路径问题:如果在不使用推荐的 AppImage 设置时找不到 FreeCAD 模块,请参阅PYTHON_INTERPRETER_SETUP.md 。
📄 许可证
该项目根据 MIT 许可证获得许可 - 有关详细信息,请参阅 LICENSE 文件。
🖥️ 光标集成
MCP 服务器设计用于与 Cursor IDE 等工具集成。
- 配置 Cursor :在 Cursor 的设置中添加 MCP 服务器(设置 > 功能 > MCP 服务器 > 添加新 MCP 服务器)。将其配置为直接运行 Python 脚本,并设置必要的环境变量和工作目录。.cursor
.cursor/mcp.json
中的示例配置如下:将Copy/path/to/mcp-freecad
替换为项目的实际绝对路径。 如有需要,请确保LD_LIBRARY_PATH
和PYTHONPATH
与您的 AppImage 结构匹配。 - 重新启动 Cursor :完全重新启动 Cursor 以使配置更改生效。
- 服务器通信:服务器默认使用
stdio
传输(在config.json
的server.mcp.transport
下配置),该协议与 Cursor 的通信协议兼容。错误应通过 MCP 错误响应报告给 Cursor。
游标特定注意事项
freecad_mcp_server.py
脚本默认加载config.json
。请确保此文件包含正确的设置,尤其是由extract_appimage.py
更新的freecad
部分。.cursor/mcp.json
中设置的环境变量对于launcher
方法在 Cursor 提供的环境中正常工作至关重要。
📋 可用选项和用例
🔧 连接方法
- 启动器连接(推荐)
- 使用从提取的 AppImage 中获取的
AppRun
。非常可靠。 - 由
extract_appimage.py
自动配置。 - 配置(
config.json
):GXP19
- 使用从提取的 AppImage 中获取的
- 包装器连接
- 在单独的 Python 子进程中运行 FreeCAD 逻辑。如果 AppImage/AppRun 出现问题,这是一个不错的替代方案。
- 配置(
config.json
):GXP20
- 套接字服务器连接
- 需要在 FreeCAD 中运行
freecad_socket_server.py
。 - 当运行 FreeCAD 作为持久后台服务器时使用。
- 配置(
config.json
):GXP21
- 需要在 FreeCAD 中运行
- CLI 桥接连接
- 使用
freecad
命令行工具。速度可能较慢/可靠性较低。 - 配置(
config.json
):GXP22
- 使用
- 模拟连接
- 无需 FreeCAD 即可进行测试。
- 配置(
config.json
):GXP23
- 自动连接
- 自动选择最佳可用方法(启动器 > 包装器 > 服务器 > 桥接器 > 模拟)。
- 如果
connection_method
缺失或设置为"auto"
则为默认值。
🛠️ 工具类别和用例
- 基本 FreeCAD 操作
- 基本文件管理
- 使用案例:
- 创建新文档
- 保存和加载项目
- 导出为各种格式
- 管理文档结构
- 模型操作
- 变换和修改对象
- 使用案例:
- 精确旋转物体
- 在 3D 空间中移动物体
- 缩放模型
- 创建镜像和副本
- 布尔运算(并集、切集、交集)
- 测量工具
- 分析与验证
- 使用案例:
- 距离测量
- 角度计算
- 表面积分析
- 体积计算
- 质量特性
- 原始创造
- 基本形状生成
- 使用案例:
- 创建盒子和圆柱体
- 生成球体
- 制作圆锥体和圆环体
- 创建正多边形
- 绘制椭圆
- 出口/进口操作
- 文件格式转换
- 使用案例:
- STEP 文件导出/导入
- IGES 格式处理
- DXF文件处理
- STL 导出用于 3D 打印
- 代码生成
- 自动代码创建
- 用例:
- Python 脚本生成
- OpenSCAD 代码导出
- CNC 的 G 代码生成
- 3D打印机设置优化
💻 集成场景
- Cursor IDE 集成
- 开发环境集成
- 使用案例:
- 从 IDE 直接操作模型
- 实时反馈
- 调试日志记录
- 错误追踪
- AI助手集成
- 人工智能设计自动化
- 使用案例:
- 自然语言模型创建
- 自动化设计修改
- 参数优化
- 设计验证
- 命令行用法
- 脚本和自动化
- 使用案例:
- 批处理
- 自动化测试
- CI/CD 集成
- 命令行工具
🎯 常见用例示例
- 快速成型
- 自动化处理
⚙️ 配置选项
- 服务器配置
- 工具启用
- 调试配置
特征
- 通过 MCP 协议将 AI 助手连接到 FreeCAD
- 以编程方式创建和操作 3D 模型
- 支持原始形状(盒子、圆柱体、球体、圆锥体)
- 布尔运算(并集、交集、切集)
- 对象变换(移动、旋转)
- 将模型导出为 STL 格式
- 文档和对象管理
先决条件
- Python 3.8 或更高版本
- MCP SDK(
pip install modelcontextprotocol
) - 推荐:FreeCAD AppImage(使用
extract_appimage.py
下载并提取)用于可靠的launcher
连接方法。 - 或者:FreeCAD 0.20+ 的系统安装(用于
bridge
或server
方法,可能不太可靠)。
可用工具
文档管理
- freecad.create_document - 创建一个新的 FreeCAD 文档
- freecad.list_documents - 列出所有打开的文档
- freecad.list_objects - 列出文档中的所有对象
3D基元
- freecad.create_box - 创建一个盒子原语
- freecad.create_cylinder - 创建圆柱体图元
- freecad.create_sphere - 创建一个球体图元
- freecad.create_cone - 创建一个圆锥体图元
布尔运算
- freecad.boolean_union - 创建两个对象的并集(添加)
- freecad.boolean_cut - 从第一个对象中剪切第二个对象(减去)
- freecad.boolean_intersection - 创建两个对象的交集(公共体积)
变换
- freecad.move_object - 将对象移动到新位置
- freecad.rotate_object - 旋转对象
出口
- freecad.export_stl - 将模型导出为 STL 文件
测试
该项目包括单元测试和端到端(E2E)测试,以确保质量和可靠性。
单元测试
运行基本单元测试:
端到端测试
端到端测试从客户端的角度验证整个系统是否正常运行。它们测试真实场景以及不同组件之间的交互。
要运行所有 E2E 测试:
E2E 测试按功能组织:
test_primitives.py
- 测试基本形状的创建和操作test_smithery.py
- 锻造工具操作测试
编写新的 E2E 测试
要添加新的 E2E 测试:
- 在
tests/e2e/
目录中创建一个新的测试文件 - 扩展适当的基测试类(
MCPClientTestBase
) - 添加使用 MCP 客户端与工具交互的测试方法
- 使用测试运行器运行测试
请参阅现有的测试文件以获取示例。
文档
该项目包括针对不同方面的几个文档文件:
- PYTHON_INTERPRETER_SETUP.md - 如何配置 Python 解释器
- FREECAD_SERVER_SETUP.md - 服务器设置指南
- FREECAD_INTEGRATION.md - FreeCAD 集成方法
- FLOWCHART.md - 详细流程图
- OPTIMIZATION_FEATURES.md - 性能优化指南
- scripts/README.md - 脚本文档
对于AI助手,请参阅AI_ASSISTANT_GUIDE.md以获取详细的使用说明和示例。
贡献
欢迎贡献代码!欢迎提交 Pull 请求。
致谢
- FreeCAD 开发团队打造了出色的 CAD 软件
- Anthropic 和 Claude 用于模型上下文协议 (MCP) SDK
This server cannot be installed
该项目使用模型上下文协议 (MCP),实现了 AI 助手与 FreeCAD CAD 软件之间的强大集成。它允许外部应用程序通过标准化接口与 FreeCAD 交互,并提供多种连接方法和专用工具。
- Quick Start (Recommended: AppImage + Launcher)
- Docker Support
- 🔄 MCP Flow Chart
- 🔄 Core Components
- 1. FreeCAD MCP Server (freecad_mcp_server.py)
- 2. FreeCAD Connection (freecad_connection_manager.py)
- 3. FreeCAD Launcher (freecad_connection_launcher.py)
- 4. FreeCAD Wrapper (freecad_connection_wrapper.py) & Subprocess (freecad_subprocess.py)
- 5. FreeCAD Server (freecad_socket_server.py)
- 6. FreeCAD Bridge (freecad_connection_bridge.py)
- 7. FreeCAD Client (freecad_client.py)
- 🔄 Project Structure
- ⚙️ Installation & Setup Details
- 🚀 Using the MCP Server
- 🛠️ Available MCP Tools
- 📝 Example MCP Interactions
- 🔍 Troubleshooting
- 📄 License
- 🖥️ Cursor Integration
- 📋 Available Options and Use Cases
- Features
- Prerequisites
- Available Tools
- Testing
- Documentation
- Contributing
- Acknowledgments