mcpField
C
cadloop Slicer

cadloop Slicer

ローカル
github.comメディア・デザイン112 週間前に更新

cadloop Slicer について

cadloop Slicerは、プリンタープロファイルの選択、ベッド適合の確認、モデルのスライス、G-codeの抽出を行うMCPサーバーです。CADモデルを印刷準備に進める人向けに、部品や完成した押出移動が印刷可能領域内にあるか検査します。

主な機能

  1. 01プリンタープロファイルの検出と設定
  2. 02モデルのベッド適合を確認
  3. 03部品の配置とモデルのスライス
  4. 04生成したG-codeの抽出と確認
  5. 05古くなった機器設定の記録を報告

活用シーン

  1. 01スライス前に部品がベッドに収まるか確認
  2. 02複数部品のモデルを複数プレートに配置
  3. 03G-codeの押出移動がベッド範囲内か確認

MCP 対応

MCPクライアントに、プリンター設定、プロファイル一覧、ベッド適合検査、スライス、概要、G-code抽出を提供します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"richardofortune-cadloop-slicer": {
"command": "uvx",
"args": [
"cadloop"
],
"env": {
"SLICER_WORKSPACE": "<SLICER_WORKSPACE>",
"SLICER_BIN": "<SLICER_BIN>",
"SLICER_PROFILE_DIRS": "<SLICER_PROFILE_DIRS>",
"SLICER_TIMEOUT": "<SLICER_TIMEOUT>"
}
}
}
}
起動コマンドuvx cadloop
設定が必要な環境変数
SLICER_WORKSPACEThe only directory this server reads and writes. Defaults to ~/cad.
SLICER_BINPath to the slicer binary. Auto-detected if unset. Creality Print's CLI does not work headless on macOS; prefer OrcaSlicer, Bambu Studio or ElegooSlicer there.
SLICER_PROFILE_DIRSExtra profile roots, os.pathsep separated. Added to the auto-detected roots rather than replacing them.
SLICER_TIMEOUTSeconds before a slice is killed. Defaults to 600.

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypicadloop0.1.0

ツール

9

掲載時のツール一覧 · 2 週間前に更新

このツールにパラメーターはありません。

詳細

cadloop

パラメトリックなソースから G-code までをつなぐクローズドループです。その中間には、CAD ツールにもスライサーにもできない検証ステップがあります。

2 つの MCP サーバーを使います。モデルが OpenSCAD を記述してコンパイルし、計算値を読み取り、レンダリングを確認し、ベッドに収まることをチェックして、スライスし、G-code を取り出します。すべてのプレートが印刷可能領域に収まることも証明されます。どの段階でも GUI は使いません。

中間の検証ステップは、あなた自身で記述します。cadloop は、その周辺のあらゆる作業を十分に低コストにするため、頻繁に実行できます。ただし、部品が実際に機能するかどうかは判断できません。

ホイールが詰まることを検証ステップが検出して終わる、ループの手順

この手順に登場する数値はすべて実際の出力です。失敗したホイールも、説明用の図ではなく実際の測定結果です。構築方法と各数値の出所については、 docs/walkthroughをご覧ください。

 setup_printer   once, no arguments: which printer is this for
      |
  write .scad
      |
   check          syntax and references, about a second
      |
   echo           read computed values without rendering
      |
   preview        look at it
      |
   verify         does it actually work  <- yours; nothing here does it for you
      |
   measure        bounding box and volume
      |
 check_bed_fit    against the printer you set up
      |
  slice_model     -> .gcode.3mf
      |
 extract_gcode    -> .gcode

順序が重要です。check と echo はジオメトリ評価を完全にスキップするため、完全なレンダリングに数分かかるモデルでも、実行にかかるのは数秒です。低コストのステップを通過してから、コストの高いステップを一度だけ実行します。

ベッドのチェック以降の処理はすべて、make_printable という 1 回の呼び出しでも実行できます。レンダリング、配置、スライスを行い、ベッド上で結果を検証したうえで、処理内容をテキスト 1 画面分で報告します。実例をご覧ください。

インストール

pip install cadloop

依存関係は mcp だけです。実例やテストを実行する場合は、チェックアウトからインストールしてください。verify エクストラは shapely です。これは cadloop 自体ではなく、実例で使用する独自のチェッカーに必要です。

git clone https://github.com/richardofortune/cadloop
cd cadloop
pip install -e ".[verify]"

PATH 上、または OPENSCAD_BIN で指定した場所に OpenSCAD が必要です。スライスには OrcaSlicer、Bambu Studio、ElegooSlicer、または Creality Print が必要です。これらは共通の CLI を備えているため、どれでも動作します。また、付属のプロファイルを含め、4 つすべてが自動検出されます。

ここでは、どのスライサーも優先していません。setup_printer は検出した各スライサーを調べた後、あなたのプロファイルを使って 20mm のキューブをスライスし、最適なものを検証します。そのため、どれが選ばれるかは、このリポジトリ内のリスト順ではなく、あなたのマシンで動作するかどうかで決まります。Creality Print の CLI は、現時点では macOS のヘッドレス環境で動作しません。これは断定ではなく、この処理で検出される問題です。そのため、上流で修正が公開されれば自動的に解消されます。詳しくは、以下のテスト状況をご覧ください。SLICER_BIN で選択を上書きできます。

設定

mcp.json をクライアントの設定にコピーし、パスを修正してください。両方のサーバーが同じワークスペースディレクトリを参照するようにします。どちらのサーバーも、読み書きする場所はそこだけです。

変数デフォルト説明
OPENSCAD_BIN、SLICER_BIN自動検出バイナリのパス
OPENSCAD_WORKSPACE、SLICER_WORKSPACE~/cadサンドボックス
SLICER_PROFILE_DIRS自動検出追加のプロファイルルート
CADLOOP_MACHINE$XDG_CONFIG_HOME/cadloop/machine.jsonマシン情報を保存する場所
OPENSCAD_TIMEOUT、SLICER_TIMEOUT300、600プロセスを強制終了するまでの秒数

サーバー

openscad は check、echo、render、measure、preview と、ワークスペースのファイルアクセス機能を提供します。preview は PNG を MCP 画像として返すため、モデルは数値から推測するのではなく、構築したものを確認できます。render は、境界ボックスと体積に加えて、OpenSCAD のマニフォールドレポートを返します。simple: yes で、体積の値も妥当であることが、メッシュを印刷できる目安になります。

この 2 つは、画像の扱いが異なります。preview は画像を返すだけで保存しません。一方、出力先が .png で終わる場合、render は同じカメラ、imgsize、projection、full_render オプションを使って画像をワークスペースに書き込みます。画像が結果そのものではなく成果物である場合は、render を使ってください。render はパスではなくテキストとして source も受け取るため、比較の前半には git show <rev>:model.scad をそのままパイプで渡せます。チェックアウトも一時ファイルも不要です。 slicer は setup_printer、machine_info、make_printable、 slicer_info、list_profiles、check_bed_fit、slice_model、 slice_summary、extract_gcode を公開します。

make_printable は一連の処理を1回の呼び出しで実行します。.scad と 取り出したいパーツを渡すと、それぞれをレンダリングして計測し、できるだけ少ない プレートに収まるように配置してスライスし、完成した G-code を読み戻して、押し出しを伴う すべての移動がベッド上で行われることを検証します。モデルを編集することはありません。 設計どおりに印刷できないパーツは報告され、こっそり縮小したり分割したりすることは ありません。変更するのは、パーツをどのプレートに配置するかと、正方形の向きでは 収まらないときにパーツを90度回転させることだけで、どちらもレポートに記載します。 確認できたすべての事実と、それらをまとめた画面1つ分のテキストを summary で返し、 最後に次に行うべきことを示します。

引数なしで setup_printer() を1回呼び出します。スライサーにすでに設定されている内容を 読み取り、それを同じインストールのマシン、プロセス、フィラメントの各プロファイルに 解決し、20mm のキューブをスライスして組み合わせを検証したうえで記憶します。 使用するプリンター、品質、フィラメントを報告し、テストスライスに失敗した場合は 何も保存しません。printer、filament、process を渡すのは、それぞれの項目を 上書きするときだけです。残りは引き続きスライサー独自の設定から取得します。 指定したプロファイルは、その名前のものを使用するか、その名前を挙げて拒否します。 別のプロファイルにこっそり差し替えることはありません。

その後は check_bed_fit と slice_model にプロファイル引数は不要です。引数を 指定しなければ、呼び出し元が互いに一致しない3つのプロファイルを渡すことはできない、 というのがその狙いです。明示的な引数を渡した場合は、引き続きそれが優先されます。

machine_info は、このワークスペースで設定されているプリンターと、その設定が現在も 有効かどうかを示します。この記録はキャッシュであり、信頼できる唯一の情報源では ありません。スライサーの場所が変わった場合、プロファイルが編集された場合、または スライサーのバージョンが変わった場合、その設定を使うツールはすべて、理由を示して 代わりに処理を拒否します。つまり、再度 setup_printer を実行するまでは ok: null となり、 何も書き込まれません。実際の状態と一致しなくなった設定を使って G-code を生成することは ありません。

通常と異なる操作を行う前に slicer_info を呼び出してください。Orca 系の CLI は ドキュメント化されておらず、リリースごとに変更され、Creality のフォークは独自の変更が 加わっています。そのため、インストール環境から読み取ったフラグ一覧のほうが、推測に 基づく情報より信頼できます。slice_model には extra_args による回避手段と dry_run モードがあります。

2つをつなぐのが check_bed_fit です。スライサーは範囲外の G-code を警告なしで出力するため、 このツールは STL を計測し、マシンプロファイルから printable_area を読み取って比較します。 斜め45度の場合も確認します。真正面の向きでは収まらないパーツも、回転させれば収まることが よくあるからです。

printable_area の読み取りは、見た目以上に厄介です。標準プロファイルでは "XxY" 形式の 文字列のリストと、カンマ区切りの1つの文字列の両方で指定されています。また、多くの Bambu マシンには独自のベッド情報がなく、共通のベースから inherits を通じて継承します。 そのため、この検索処理では両方の形式を解析し、継承チェーンをたどります。Creality Print 7.1.1 に同梱されている473件の具体的なマシンプロファイルのうち、469件では 解決できます。残りの4件は継承チェーンのどこにもベッドが定義されていないため、推測は せず、理由とともに ok: null を返します。

検証ステップ

これは cadloop が代わりに行ってくれない部分であり、これが機能ではなく実例として示している理由です。models/verify_spirograph.py はモデルのそばに同梱されており、パッケージ内には含まれていません。「実際に動くか」の基準はプロジェクトごとに異なり、どれも一般化できないためです。あなたのものは、これとはまったく違うものになるでしょう。

このスクリプトは 2 つのチェックを実行します。スパイログラフの場合、1 つ目は各ホイールのピッチ曲線をリングのピッチ円に重ね、全周にわたって動かし、各位置で 2 つのソリッド間の重なりを測定します。かみ合う位相のどこかで、全周にわたって重なりがゼロであることが合格条件です。2 つ目は、シート上でパーツ同士が重なっていないことを確認します。

$ python models/verify_spirograph.py
part     teeth  overlap mm2  result
24T         24     0.000000  pass
...
trefoil     23     0.000000  pass

14/14 parts mesh cleanly

group        volume mm3
ring            23939.8
outer_ring      25652.8
wheels         197113.5
shapes          10078.7
sum            256784.8
sheet          256784.8

no parts overlap on the sheet

2 つ目のチェックは、同じ考え方を 1 段階上のレベルで適用します。2 つのパーツを重ねて配置したシートでも、マニホールドとしてきれいにレンダリングされ、ベッドに収まり、何も警告されずにスライスできますが、印刷すると 1 つの融合した物体になります。そこでシート全体と各グループをレンダリングし、その結合部分と各部分の合計を比較します。衝突が現れるのはそこだけです。このチェックには OpenSCAD が必要で、インストールされていない場合はスキップされます。--skip-layout と --skip-mesh を使うと、片方だけを実行できます。

歯数によって決まること

r 個の歯を持つホイールが R 個の歯を持つリングの中で転がるとき、ペンは R / gcd(R, r) 個のローブを持つ図形を描き、r / gcd(R, r) 周して閉じます。パターンはジオメトリが作られる前に歯数で決まるため、チェッカーの --patterns モードでは、セットから直接読み取ります。

$ python models/verify_spirograph.py --patterns

main ring, 96 teeth
      part  teeth  lobes  circuits
       32T     32      3         1  plain
       24T     24      4         1  plain
       72T     72      4         3  plain
...
   trefoil     23     96        23

96 は 2^5 x 3 なので、偶数のホイールセットの大半と約半数のホイールが因数を共有しており、これらのホイールの多くは 8 個以下のローブを描きます。この理由から、セットに 48 はありません。48 は 96 のちょうど半分であり、ペンが楕円だけを描く退化した比率のため、採用されませんでした。外側のリングは 105 = 3 x 5 x 7 で、ずっと良好に機能します。また、23 歯の三つ葉形はどちらのリングとも互いに素であり、そのためこのセットで最も豊かな図形を描くホイールになっています。

歯数を選ぶ際には、印刷した後ではなく、事前にこれを実行しておく価値があります。

これは本質的にモデル固有のものであり、そこが率直な教訓です。ベッドに収まり、きれいにスライスできるマニホールドメッシュでも、実際には機能しないパーツである可能性があります。「実際に転がるか」に相当するものが何であれ、それはプレビューと測定の間のループに含める必要があり、自分で書かなければなりません。

実例

models/spirograph.scad は、このループのベースとなったモデルです。フランジ付きボディに、96 歯の内歯リング、外リング、11 個の円形ホイール、そして非円形ホイールが 3 個(楕円、卵形、三つ葉形)組み込まれています。すべてモジュール 1.5 のインボリュート歯車で、黄金角の螺旋上にペン用の穴が開いています。

検証ツールが存在する理由は、非円形ホイールにあります。最初の試みでは、接線で構成したカプセル形と涙滴形の輪郭を使いました。見た目は正しく、マニフォールドとしてきれいにレンダリングされ、問題なくスライスできるはずでしたが、転がりチェックではリングの歯に 30~80 mm² 食い込むことがわかりました。ピッチ曲線の平坦な部分は、ある一点でリングに接し、それ以外の場所ではすべてリングより外側に出っ張ります。CAD の後工程では、これを検出できませんでした。最終的に採用した形状は、滑らかな凸曲線で、曲率半径がどこでもリングの内側に収まっています。

ソースから造形プレートまで一式を処理するには 2 回の呼び出しが必要で、最初の呼び出しは一度だけ実行すれば十分です。

setup_printer()
make_printable("spirograph.scad",
               ["ring", "outer_ring", 24, 30, 32, 36, 40, 45, 52, 56, 63, 72,
                80, "ellipse", "egg", "trefoil"])

OrcaSlicer 2.4.2 と汎用 PLA を使った Ender-3 V3 SE では、16 回のレンダリング、5 枚のプレート、5 回のスライスを行い、ベッドに収まるかを読み戻して確認した 5 個の G-code ファイルを、約 30 秒で生成します。

ok      16 parts on 5 plates, every plate proven on the bed

  machine ...... Creality Ender-3 V3 SE 0.4 nozzle, 220 x 220 mm bed, PLA
  parts ........ 16 of 16 fit this bed
  plates ....... 16 parts packed onto 5
  sliced ....... 5 of 5, every extruding move on the bed
  ready ........ ~/cad/plates/spirograph, 13h09m, 63.17 m PLA

  worth a look:
    plate_2 sits 2.2 mm from the bed edge, consider a brim

  next: print the plates in ~/cad/plates/spirograph. Nothing above stops the
        print — the notes are advisories — so read them and go.

ここに示した数値はすべて、その実行で得られたものです。ブリムに関する注意は推奨事項であり、不具合ではありません。プレート 2 はベッド上で 2.2 mm の余裕を残しており、反りのある初層が問題になりかねないほど端に近い状態です。実行で証明できなかったことは、いずれもその内容を明示します。結果が得られた項目は ok、試行したものの失敗した項目は FAILED、判断できなかった項目は UNKNOWN です。そして最後の行には、次に実行すべき呼び出しが必ず示されます。

make verify              # rolling interference and layout, all 14 parts
make render PART=ring    # one part to an .stl, no printer set up needed
make smoke               # both servers, end to end

以前の手順の中で手作業で残す価値があるのは、make render だけです。OpenSCAD 以外は必要ないため、モデルをまだ変更している段階で個々の部品を確認する最も手早い方法です。その後の処理はすべて make_printable で行います。

テスト状況

make smoke は、実際の MCP stdio セッションを通じて両方のサーバーを動かし、45 項目の動作を検証します。検証対象は、ツールの一覧、スクリプトに定義が渡されること、意図的な構文エラーが検出されること、測定した形状が既知の寸法と一致すること、プレビューから画像が返ること、プロファイルの分類、引数の順序、アーカイブの解析、G-code の抽出、ベッドへの適合判定の成功と失敗、printable_area の両方の表記と継承されたベッド、そしてワークスペースガードによるパストラバーサルの拒否です。

また、実行時専用に構築したスライサーのインストールを使って、引数なしの経路をエンドツーエンドで動かします。引数なしで setup_printer() を実行すると、選択したプリンター、品質、フィラメントが示され、単一のインストールから得た 3 つの値が保存される必要があります。その後、check_bed_fit と slice_model はプロファイル引数なしで動作しなければなりません。さらに、後からプロファイルを編集すると、両方とも処理を拒否し、何も書き込まない必要があります。

make_printable も同じセッションで同様に実行します。2 パーツの .scad は少なくとも 1 枚のプレートとして返され、各プレートがベッド上にあることを、推測ではなく G-code を読み取って証明する必要があります。また、次のステップを示す 30 行以内のレポートも必要です。これは、1 回の呼び出し経路に対する唯一の自動エンドツーエンドテストです。

OpenSCAD 側のテストは実際の OpenSCAD を使い、インストールされていない場合はスキップします。スライサー側のテストは、Orca 形式のヘルプテキストと代表的な .gcode.3mf を出力するモックバイナリを使うため、実際のスライサー自体の動作以外はすべてカバーされます。

実際のインストール環境では、OpenSCAD 側のテストと check_bed_fit のエンドツーエンド動作を確認済みです。spirograph.scad からレンダリングした 24 歯のホイールは 38.99 mm と測定され、K1 の 220 mm ベッドに収まります。slice_model が生成するすべてのフラグは、Creality Print 7.1.1 の --help に記載されています。

macOS 上の OrcaSlicer 2.4.2 でも、ループ全体のエンドツーエンド動作を確認済みです。96 歯のリングは、35 層にわたる 113,808 行の G-code にスライスされます。印刷時間は 51 分、PLA の使用量は 7.27 m で、すべての座標がベッドの範囲内に収まっています。

Creality Print の CLI は macOS でヘッドレス動作しません。 macOS 26 上の 7.1.1.4472 では、プロファイルを何も読み込んでいない場合の --info を含め、--help 以外のすべての操作でセグメンテーションフォルトが発生します。原因は、ヘッドレス経路では初期化されない GUI のベッド設定でのヌルポインター参照です。Slic3r::CLI::run から呼び出された Slic3r::GUI::PartPlate::set_shape 内で異常終了し、--datadir、--outputdir、プロファイル引数をどのように組み合わせても回避できません。SLICER_BIN を OrcaSlicer、Bambu Studio、または ElegooSlicer に設定するか、Linux 上で Creality Print の CLI を実行してください。--datadir を指定する場合は、書き込み可能でなければなりません。書き込みできないディレクトリを指定すると、セグメンテーションフォルトではなく set_data_dir で中断しますが、結果は同じです。

ワークスペースガードが対象とするのはツールの引数であり、スクリプトそのものではありません。OpenSCAD の include、use、import からは、プロセスが読み取れる任意のファイルにアクセスできるため、信頼できない .scad を実行することは、信頼できないコードを実行することになります。

ライセンス

MIT です。LICENSE を参照してください。

Creality、Bambu Lab、Elegoo、OrcaSlicer プロジェクト、または OpenSCAD プロジェクトとは提携していません。ここでは、これらの名前をこのツールが制御する対象を説明する目的でのみ使用しています。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。