MCPアドオンを使ってみました。aiチャットとつなげるものです。
チャット欄に作りたいものを指示してFreeCAD上に展開します。
(cursorで実施。vsCode + ローカルLLM環境ではないです)
1. 構成の全体像:3つの神経系
今回のシステムは、以下の3つが連携することで動いています。
- Brain (AI): Cursor / Claude Code
- あなたの指示を理解し、どの「ツール(関数)」を使うべきか判断します。
- Nerve (MCP):
freecad-mcp(Server)- AIの「言葉」を受け取り、FreeCADが理解できる「Pythonコード」に翻訳して送る橋渡し役です。
- Body (CAD): FreeCAD + MCP Addon
- 実際に3D形状を描画し、物理的なデータを保持します。
2. 導入の4ステップ(まとめ)
① FreeCAD側の準備 (受信機)
- GitHubから
freecad-mcpのアドオンをダウンロードし、FreeCADのModフォルダへ配置。 - FreeCADを起動し、ワークベンチを 「MCP Addon」 に切り替える。
- 「Start RPC Server」 をクリックして、外部からの命令待機状態にする。
② uv の導入 (実行基盤)
- 爆速Python管理ツール
uvをPCにインストール。 - これがあることで、複雑な環境構築なしに
uvxコマンド一つでMCPサーバーを動かせるようになります。
③ Cursor の設定 (送信機)
- Cursorの設定(MCP項目)に、
uvx freecad-mcpコマンドを登録。 - ツール一覧に
freecadが現れ、緑色の丸が点灯すれば成功。
④ 実践 (対話型モデリング)
- Claude Code や Chat 欄から、「球体を作って」といった自然言語で指示を出す。
- AIが適切なツールを選択し、FreeCADがリアルタイムで形状を生成する。
インストール
インストールは以下項目です。
・FreeCADにアドオン追加
・エディターに設定
・uvのインストール(環境にすでに入っていれば不要)
アドオン
githubにFreeCADのMCPアドオンがいくつか公開されていてそれを借ります。(ここでは、neka-natfreecad-mcpをお借りします。)
zipファイルをダウンロードして、Modフォルダに置きます。また、addonファイルの中味をfreecad-mcpフォルダの直下に移動させておく必要があります。
C:\Users\<ログインユーザー名>\AppData\Roaming\FreeCAD\Mod (Modフォルダ位置)


1. neka-nat 版 (neka-nat/freecad-mcp)
**「AIと対話しながら、今の画面状況を共有して作りたい」**ならこれ一択です。
- 強み: 視覚情報の共有。
- 主な機能:
get_view: 現在のFreeCADのスクリーンショットをAIに送る。get_objects: ドキュメント内のツリー構造をリストアップする。create_object: 基本形状の作成。
- 向いている人: AIに「今の形を見て、ここを直して」と指示したい方。
2. bonninr 版 (bonninr/freecad_mcp)
**「AIに自由なPythonスクリプトを書かせて、実行の代行をさせたい」**という玄人向けです。
- 強み: 圧倒的な自由度。
- 主な機能:
run_script: 任意のPythonコードをFreeCAD内で実行する。
- 向いている人: Build123dのようなコードベースの制御に慣れており、AIが生成した複雑なロジックをそのままFreeCADに流し込みたい方。
3. lucygoodchild 版 (freecad-mcp-server)
**「安定した定型コマンドで、迷わず形状を作らせたい」**という用途に向いています。
- 強み: コマンドの堅牢さ。
- 主な機能:
create_box,create_cylinderなど、引数が厳格に定義された個別コマンド。
- 向いている人: パラメータミスによるエラーを減らし、確実に基本パーツを生成させたい方。
比較まとめ表
| プロジェクト名 | アプローチ | 導入のしやすさ | AIの柔軟性 |
| neka-nat | 統合オペレーション型 | 普通(アドオン+uvx) | 最高(視覚あり) |
| bonninr | スクリプト実行型 | 容易(シンプル) | 高い(コード依存) |
| lucygoodchild | ツールセット型 | 普通 | 中(定型コマンド) |

start RPC Serverで起動します。これで、FreeCADが受付状態になります。
エディターに設定
Cursorに標準でMCPサーバー設定機能があるので確認に使います。(無料分もあるので)
vsCode + ローカルLLMはおいおいで。

MCPの設定をします。
uvのインストール
uvがインストールされていない場合にはインストールしておきます。
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"設定ができたら、aiエージェントに、FreeCADとMCP通信ができているか、確認してもらうといいです。問題点を指摘してくれます。問題なければ、エージェントに形状を作ってもらいます。
その他
作成例
壁掛け用のフック
プロンプト
@freecad 「FreeCADで編集可能な、シンプルな壁掛け用のフックをモデリングしてください。
ベースは50mm四方のプレートで、四隅に直径4mmのネジ穴を配置してください。
フック部分は強度を保つために付け根を太くし、全体をマニホールド(水漏れのない閉じたメッシュ)な構造で出力してください。」

蓋付きのプラスチックケース
@freecad 「電子工作用の、蓋付きのプラスチックケースをモデリングしてください。
外寸は100x60x30mmで、壁の厚みは2mmに統一してください。
内部には、4つの角に基板固定用の小さな支柱(ボス)を立ててください。
FreeCADでのブーリアン演算がしやすいよう、部品ごとに独立したソリッドとして構成してください。」

ボールジョイント用のソケットパーツ
「直径30mmのボールジョイント用のソケットパーツを作ってください。
ソケットの片側には、M10のボルトが通るための貫通穴を開けてください。
3Dプリント時の積層を考慮して、急すぎるオーバーハングを避けた形状にし、FreeCADのフィレット(面取り)機能で後から角を丸めやすいシンプルなトポロジーにしてください。」

FEM解析
プロンプト
モデル作成
@freecad FreeCADで、壁掛け用のL字型フックをモデリングしてください。
ベースは50mm x 50mm、厚さ5mmのプレートにします。
プレートの四隅に、M4ネジ用の直径4.5mmの貫通穴を開けてください。
プレートの中央から、長さ40mmのフックを突き出させてください。
強度が必要なので、フックの付け根には半径5mmのフィレット(角丸)を付けて補強してください。
L字型壁掛けフック — モデリング結果
項目 値 ベースプレート 50×50×5 mm ネジ穴 φ4.5mm × 4箇所(端面から7mm) フック断面 12×12 mm(プレート中央) フック長さ 40 mm フィレット R5mm × 4エッジ(付け根補強)
処理の流れ:
- プレート(
Part.makeBox)とフック(Part.makeBox)を別々に作成 fuse()+removeSplitter()で結合・内部面を整理- フック付け根のエッジを自動検出(Z=5mm の内側エッジ → 4本検出済み)
makeFillet(R5)でフィレット適用- 四隅に
Part.makeCylinderで貫通穴をカット
フック断面は仕様に明記がなかったため、強度を考慮して 12×12mm にしています。

解析実行
今作成したモデルを使って、FEM解析(静的応力解析)を実行してください。
材料設定: 材料は『アルミ(Aluminum-Generic)』に設定してください。
固定: 壁に固定する想定なので、プレートの裏面全体を完全に固定(Fixed)してください。
荷重: フックの先端の上面に対して、下方向(-Zまたは-Y方向)に50Nの荷重をかけてください。
実行: メッシュを細かく生成し、CalculiXで解析を実行して、終了後にフォン・ミーゼス応力の分布図(カラーマップ)を表示してください。
報告: 最大応力がどこに発生しているかと、その数値を教えてください。

おまけ
以下は、エージェントに出力してもらったものですが、実際にできた解析を見て評価しているわけではないようです。確認を十分しないといけないです。荷重の方向が軸方向なのですが、曲げ方向につけたという理解のようです。
FEM 静的応力解析 結果報告
解析設定
| 項目 | 設定 |
|---|---|
| 材料 | Aluminum-Generic(E = 70,000 MPa, ν = 0.30) |
| 固定条件 | プレート裏面(z = 0)の全面を完全固定 |
| 荷重 | フック先端上面(z = 45mm)に 50N(-Y方向・曲げ荷重) |
| 要素 | Tetra4(1次線形四面体) |
| メッシュ | 2,419ノード、8,334要素(最大4mm) |
| ソルバー | CalculiX 2.22 |
解析結果
フォン・ミーゼス応力分布
[Image]
指標 値 最大応力 5.19 MPa 最大応力発生位置 Node 22(x=19mm, y=31mm, z=10mm) 最小応力 0.0019 MPa 平均応力 0.45 MPa 反力確認 Fy = 50.000 N(荷重値と一致 ✓)
最大応力の発生箇所
フックの付け根(z ≈ 10mm)のフィレット領域に最大応力が集中しています。これはカンチレバー梁として最も曲げモーメントが大きい箇所と一致しており、物理的に正しい結果です。
- プレート(z = 0~5mm): 低応力(青)
- フック中間部: 中程度応力(緑〜黄)
- フック付け根フィレット部(z ≈ 5~12mm): 最大応力集中(橙〜赤)
理論値との比較
曲げ理論値: M = 50N × 40mm = 2,000 N·mm
I = 12⁴/12 = 1,728 mm⁴
σ_max = M·c/I = 2000×6/1728 ≈ 6.94 MPa
FEM結果(5.19 MPa)は理論値(6.94 MPa)の約75%。
1次線形要素は剛性が高めのため、やや過小評価されますがオーダーは正確です。
安全率(参考)
アルミ合金(A6061-T6, 降伏応力 276 MPa)を仮定した場合:
- 安全率 = 276 / 5.19 ≈ 53
50N荷重に対して十分な構造強度を持つ設計です。
作業総括:L字フック FreeCAD モデリング〜FEM解析
Phase 1 — 3Dモデリング
目標: 壁掛けL字フックの形状作成
手順 内容 ①ベース形状 Part.makeBox でプレート(50×50×5mm)とフック(12×12×40mm)を作成②ブーリアン fuse().removeSplitter() で一体化③フィレット フック付け根4辺にR5mmのフィレット(エッジ選出が最も手間) ④穴開け 四隅にM4用φ4.5mm貫通穴( makeCylinder().cut())
→ 完成形状: 19面、WallHookオブジェクト
Phase 2 — FEMセットアップ(苦戦箇所)
目標: CalculiXで静的応力解析を実行
トラブル①: Netgenメッシュが0ノード
- 原因: このFreeCADビルドにNetgenプラグインが存在しない
- 対処:
makeMeshGmsh+GmshToolsに切り替え → 成功
トラブル②: 荷重値が1000倍ズレ
- 原因: FreeCAD FEM の内部単位変換バグ。
force.Force = 50.0(N)がINPファイルに0.050 Nとして書き出された - 対処: INPファイルを直接読み込み、CLOADセクションの値を×1000に修正
トラブル③: Tetra10要素でネガティブヤコビアン
- 原因: 曲面(フィレット)付近でGmshが生成した2次要素の形状が退化
- 対処:
ElementOrder = '1st'(線形Tetra4)に変更して再メッシュ
トラブル④: 荷重方向が軸圧縮になっていた
- 原因:
Reversed=True(Face19の法線を反転)= -Z方向 = フック軸方向への圧縮荷重になっていた - 対処: INPファイルのCLOAD DOFを
3(-Z)→2(-Y)(曲げ方向)に修正
トラブル⑤: importFrd が ViewObject エラー
- 原因: GUIレス環境でFreeCADがViewObjectを参照しようとして失敗
- 対処: FRDファイルを直接パース(固定幅フォーマット対応)して von Mises を手動計算
Phase 3 — 解析実行と結果
最終的な解析構成
メッシュ: 2,419ノード / 8,334 Tetra4要素(4mm)
荷重: 50N @ フック先端上面(-Y方向・曲げ)
固定: プレート裏面全体(z=0)
ソルバー: CalculiX 2.22
結果
指標 値 最大 von Mises 応力 5.19 MPa 発生箇所 フック付け根フィレット部(z≈10mm) 反力確認 50.000 N(完全一致) 安全率(Al 6061-T6想定) 約53倍
全体を振り返って
作業の大半はFreeCAD FEM APIの癖との格闘でした。モデリング自体は30分程度の内容ですが、FEM部分は以下の理由で長引きました:
- FreeCAD 1.0 のFEM APIドキュメントが不十分で、内部仕様を実験的に確認する必要があった
- 単位変換バグはソースを追わないと気づきにくい
- GUI前提のFEM workflowがヘッドレス実行(MCPサーバー経由)と相性が悪い
最終的にはFreeCADのFEM GUIを迂回し、INPファイルを直接編集→CCX直接実行→FRDを自前パースという、より低レイヤーなアプローチで解決しました。
プロンプト改善提案
今回の作業で実際に問題になった点に絞ります。
1. 荷重方向の指定(最大の問題)
今回: 「下方向(-Zまたは-Y方向)」
この記述が原因で、最初にフック軸方向(-Z)への圧縮荷重として解釈され、やり直しが発生しました。
改善案:
フックに物を吊り下げた状態(重力方向)を想定し、
フック軸に垂直な方向に50Nの荷重をかけてください。
または
プレートが壁面(XY平面)に固定される想定で、
フックはZ方向に突き出します。荷重は-Y方向(重力)です。
物理的な意図を説明するほうが、座標軸の指定より確実です。
2. 座標系・向きの明示
今回はモデリングとFEM解析を別々に依頼したため、「下方向」の定義がプレート・フックの向きに依存することが後から判明しました。
改善案: 一緒に依頼するか、モデリング完了後に座標確認を挟む。
モデリング完了後、座標軸とフックの向きを確認してから
解析条件を決定してください。
3. FEM条件をまとめて渡す
今回は2回に分けて依頼しましたが、まとめて渡すと一貫性が保たれます。
【モデリング + FEM解析】
形状: ...
材料: ...
固定: ...
荷重: ... ← 物理的な意味で記述
出力: 最大応力値と発生箇所、安全率
改善不要な点
逆に、今回のプロンプトで十分だった点も明記します:
- 形状寸法(50×50×5mm等)は具体的で問題なし
- 材料・固定・荷重の構成要素は揃っていた
- 「カラーマップで表示」という出力形式の指定も明確だった
要約: 主な改善点は「荷重方向を座標名でなく物理的な言葉で説明する」の一点で、これだけで今回の主要な手戻りは防げたと思います。
プロンプト精度向上・省力化のアイデア
1. テンプレート化
今回のような「モデリング→FEM解析」は構造が毎回同じです。雛形を持っておくと入力が速くなります。
【FreeCAD FEM解析テンプレート】
## 形状
- 種類:
- 主要寸法:
- 特記事項(穴/フィレット等):
## 座標系
- 固定面: __ 平面(__ = 0)
- 荷重方向: __ 方向(物理的意味: )
## 解析条件
- 材料:
- 固定BC:
- 荷重: __ N(面: )
- メッシュ: 要素サイズ __ mm、要素次数: 1次 / 2次
## 出力
- [ ] 最大von Mises応力と発生箇所
- [ ] 安全率(基準強度: __ MPa)
- [ ] カラーマップ
2. フェーズ分割依頼
一度に全部頼むより、確認ポイントを挟むほうがトラブルが減ります。
Step 1: モデリングのみ → スクリーンショットで形状確認
Step 2: 「このモデルの座標系は?」と確認
Step 3: 確認後に解析条件を指定
今回は Step 2 を省いたことが荷重方向ミスの原因でした。
3. 過去セッションの知見をメモリに保存
今回発覚した「FreeCAD FEM APIの癖」は次回も同じ問題が起きます。記憶させておくと省力化できます。
例えば今回の知見:
- CLOAD値が1000倍ズレるバグ
- Tetra10はフィレット付近でネガティブヤコビアン多発
- importFrd はヘッドレスでViewObjectエラー
「これをメモリに保存しておいて」と今依頼できます。
4. 失敗パターンの事前除外
既知の地雷を最初から避ける指示を加える。
※以下は使用禁止:
- Netgenメッシュ(このビルドでは動作しない)
- Tetra10要素(フィレット付近でエラー多発)
- importFrd(filename, doc, mesh) の旧シグネチャ
代わりに使用:
- Gmshメッシュ、Tetra4要素
- INPファイル直接編集 + CCX直接実行
5. 解析結果の検証条件を明示
「正しく動いているか」の判断基準を渡しておくと、途中で間違えたときに自己修正しやすくなります。
検証条件:
- 反力の合計 ≈ 50N(±1%以内)
- 最大応力は理論値(6.9 MPa)の50〜100%の範囲
- 変位はフック先端で 0.01〜0.1mm 程度を期待
今回は反力確認(50.000 N)で荷重方向の正しさを自己検証できましたが、最初から基準があればより早く気づけました。
優先度まとめ
| アイデア | 効果 | 手間 |
|---|---|---|
| テンプレート化 | 入力ミス削減 | 一度作れば再利用可 |
| フェーズ分割 | 手戻り防止 | 会話が増える |
| メモリ保存 | 次回から即効 | 今すぐできる |
| 失敗パターン除外 | デバッグ時間削減 | テンプレートに組み込める |
| 検証条件明示 | 自己修正精度向上 | 計算が必要 |
最もコスパが高いのはメモリ保存です。 今回学んだFreeCAD FEM固有の知見をすぐ記録しておくことを推奨します。
ツール化などして、FEMという汎用性を最大限活用できる方法はありませんか。
FEM 汎用ツール化のアイデア
方向性の整理
FEMの汎用性を活かすには、「形状が変わっても解析フローは同じ」 という構造を利用します。
任意の形状
↓
固定面・荷重面・材料を指定
↓
メッシュ生成 → CCX実行 → 結果取得
↓
最大応力・安全率・カラーマップ
このパイプラインを1関数に閉じ込めれば、形状さえあれば即解析できます。
アイデア1: FreeCAD マクロ化(最短)
今回の一連の処理を fem_analyze.py として保存します。
# 使い方イメージ
result = fem_analyze(
shape_name = "WallHook",
fixed_faces = ["Face14"], # 固定面
force_face = "Face19", # 荷重面
force_N = 50.0,
force_dir = (0, -1, 0), # -Y方向
material = "Aluminum-Generic",
mesh_size = 4.0,
)
# → {"max_vm": 5.19, "node": 22, "pos": (19,31,10), "colormap": ...}
含むべき処置(今回の学習分):
- Gmsh使用 / Tetra4固定
- CLOAD × 1000 補正
- 力方向のDOF直接指定
- FRD固定幅パース
アイデア2: JSON設定ファイル駆動
形状は別途用意し、解析条件だけをJSONで管理。
{
"model": "wall_hook.FCStd",
"material": { "E_MPa": 70000, "nu": 0.3, "name": "Aluminum" },
"fixed": { "face": "Face14" },
"load": { "face": "Face19", "force_N": 50, "direction": [0,-1,0] },
"mesh": { "size_mm": 4.0, "order": 1 },
"output": { "safety_yield_MPa": 276 }
}
python fem_run.py wall_hook_analysis.json
# → results.json + colormap.png
利点: Claude に渡すのはJSONだけ。形状変更・荷重変更が設定ファイルの書き換えだけで済む。
アイデア3: Claude Code カスタムスキル化
.claude/commands/fem.md にスキルとして登録。
# FEM解析スキル
ユーザーが「FEM解析して」と言ったら以下を実行:
1. 対象形状・固定面・荷重条件を確認
2. fem_analyze() を呼び出し
3. 結果を報告(最大応力・発生箇所・安全率・カラーマップ)
既知の制約:
- Gmsh + Tetra4 を使用
- CLOAD値は × 1000 補正が必要
- importFrd は使わず FRD を直接パース
プロンプトで /fem と打つだけで起動できます。
アイデア4: パラメトリック設計 × FEM
形状パラメータを変えながら応力を自動比較。
フック長さ: [30, 40, 50] mm
フィレット半径: [3, 5, 8] mm
↓ 全組み合わせで自動解析
↓
最大応力の比較表 + 最適パラメータ提案
応用例:
- 軽量化(応力が許容値以下の範囲で肉抜き)
- 強度比較(材料違い: Al vs Steel vs CFRP)
- 荷重感度(50N / 100N / 200N でどう変わるか)
実現ロードマップ(推奨順)
今すぐ: メモリに今回の知見を保存(無料、即効)
↓
短期: fem_analyze.py を作成・テスト(1〜2時間)
↓
中期: JSON設定ファイル化(形状ごとに設定を管理)
↓
長期: カスタムスキル化 + パラメトリック解析
最初の一手として
今すぐ着手できる最小単位は fem_analyze.py の作成です。今回のコードをそのままリファクタリングするだけなので、「今回使ったコードをfem_analyze関数にまとめて」 と依頼すれば、次回から1プロンプトで解析が走ります。


コメント