FreeCAD

T201 MCPアドオン FreeCAD

この記事は約20分で読めます。

MCPアドオンを使ってみました。aiチャットとつなげるものです。
チャット欄に作りたいものを指示してFreeCAD上に展開します。
(cursorで実施。vsCode + ローカルLLM環境ではないです)

  1. 1. 構成の全体像:3つの神経系
  2. 2. 導入の4ステップ(まとめ)
    1. ① FreeCAD側の準備 (受信機)
    2. ② uv の導入 (実行基盤)
    3. ③ Cursor の設定 (送信機)
    4. ④ 実践 (対話型モデリング)
  3. インストール
    1. アドオン
  4. 1. neka-nat 版 (neka-nat/freecad-mcp)
  5. 2. bonninr 版 (bonninr/freecad_mcp)
  6. 3. lucygoodchild 版 (freecad-mcp-server)
    1. 比較まとめ表
    2. エディターに設定
    3. uvのインストール
  7. その他
  8. 作成例
    1. 壁掛け用のフック
    2. 蓋付きのプラスチックケース
    3. ボールジョイント用のソケットパーツ
    4. FEM解析
      1. おまけ
  9. FEM 静的応力解析 結果報告
    1. 解析設定
    2. 解析結果
      1. フォン・ミーゼス応力分布
      2. 最大応力の発生箇所
    3. 理論値との比較
    4. 安全率(参考)
  10. 作業総括:L字フック FreeCAD モデリング〜FEM解析
    1. Phase 1 — 3Dモデリング
    2. Phase 2 — FEMセットアップ(苦戦箇所)
      1. トラブル①: Netgenメッシュが0ノード
      2. トラブル②: 荷重値が1000倍ズレ
      3. トラブル③: Tetra10要素でネガティブヤコビアン
      4. トラブル④: 荷重方向が軸圧縮になっていた
      5. トラブル⑤: importFrd が ViewObject エラー
    3. Phase 3 — 解析実行と結果
    4. 全体を振り返って
  11. プロンプト改善提案
    1. 1. 荷重方向の指定(最大の問題)
    2. 2. 座標系・向きの明示
    3. 3. FEM条件をまとめて渡す
    4. 改善不要な点
  12. プロンプト精度向上・省力化のアイデア
    1. 1. テンプレート化
    2. 2. フェーズ分割依頼
    3. 3. 過去セッションの知見をメモリに保存
    4. 4. 失敗パターンの事前除外
    5. 5. 解析結果の検証条件を明示
    6. 優先度まとめ
  13. FEM 汎用ツール化のアイデア
    1. 方向性の整理
    2. アイデア1: FreeCAD マクロ化(最短)
    3. アイデア2: JSON設定ファイル駆動
    4. アイデア3: Claude Code カスタムスキル化
    5. アイデア4: パラメトリック設計 × FEM
    6. 実現ロードマップ(推奨順)
    7. 最初の一手として

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フォルダ位置)

Modフォルダに設置します。
addonの中味をコピーして持ってきておきます。

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はおいおいで。

Cursorの画面

MCPの設定をします。

{
  "mcpServers": {
    "freecad": {
      "command": "uvx",
      "args": [
        "freecad-mcp"
      ]
    }
  }
}

uvのインストール

uvがインストールされていない場合にはインストールしておきます。

powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

設定ができたら、aiエージェントに、FreeCADとMCP通信ができているか、確認してもらうといいです。問題点を指摘してくれます。問題なければ、エージェントに形状を作ってもらいます。

その他

blenderの場合

作成例

壁掛け用のフック

プロンプト

@freecad 「FreeCADで編集可能な、シンプルな壁掛け用のフックをモデリングしてください。
ベースは50mm四方のプレートで、四隅に直径4mmのネジ穴を配置してください。
フック部分は強度を保つために付け根を太くし、全体をマニホールド(水漏れのない閉じたメッシュ)な構造で出力してください。」
claudeで実施
Interactive 3D

ドラッグで回転・スクロールで拡大縮小できます

※スマートフォンはピンチ操作に対応

蓋付きのプラスチックケース

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

ボールジョイント用のソケットパーツ

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

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エッジ(付け根補強)

処理の流れ:

  1. プレート(Part.makeBox)とフック(Part.makeBox)を別々に作成
  2. fuse() + removeSplitter() で結合・内部面を整理
  3. フック付け根のエッジを自動検出(Z=5mm の内側エッジ → 4本検出済み)
  4. makeFillet(R5) でフィレット適用
  5. 四隅に 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部分は以下の理由で長引きました:

  1. FreeCAD 1.0 のFEM APIドキュメントが不十分で、内部仕様を実験的に確認する必要があった
  2. 単位変換バグはソースを追わないと気づきにくい
  3. 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プロンプトで解析が走ります。

コメント

Translate »
タイトルとURLをコピーしました