@vcad/mcp 0.9.4-main.71 → 0.9.4-main.72
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/index.mjs +55 -7
- package/package.json +3 -3
- package/vcad_kernel_wasm_bg.wasm +0 -0
package/README.md
CHANGED
|
@@ -6,4 +6,4 @@ vcad's MCP server as a self-contained bundle (server + BRep kernel WASM).
|
|
|
6
6
|
{ "mcpServers": { "vcad": { "command": "npx", "args": ["-y", "@vcad/mcp"] } } }
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
Built from
|
|
9
|
+
Built from 150875476b916d4e772bdeb33726c543ccf2756d at 2026-08-17T03:05:59.733Z. Source: https://github.com/ecto/vcad
|
package/index.mjs
CHANGED
|
@@ -41559,6 +41559,25 @@ var init_CHANGELOG = __esm({
|
|
|
41559
41559
|
"rendering"
|
|
41560
41560
|
]
|
|
41561
41561
|
},
|
|
41562
|
+
{
|
|
41563
|
+
id: "2026-08-16-loon-sheet-metal-bindings",
|
|
41564
|
+
version: "0.9.4",
|
|
41565
|
+
date: "2026-08-16",
|
|
41566
|
+
category: "feat",
|
|
41567
|
+
title: "Loon can author sheet metal, faceting and imports",
|
|
41568
|
+
summary: "Sheet-metal chains, pinned segment counts and vendor STEP/STL imports are now expressible in loon, so a bent part carries its bends and unfolds exactly instead of having them inferred back out of the solid.",
|
|
41569
|
+
features: [
|
|
41570
|
+
"loon",
|
|
41571
|
+
"sheet-metal",
|
|
41572
|
+
"import",
|
|
41573
|
+
"tessellation"
|
|
41574
|
+
],
|
|
41575
|
+
mcpTools: [
|
|
41576
|
+
"create_cad_loon",
|
|
41577
|
+
"sheet_metal_unfold",
|
|
41578
|
+
"flat_pattern_from_solid"
|
|
41579
|
+
]
|
|
41580
|
+
},
|
|
41562
41581
|
{
|
|
41563
41582
|
id: "2026-08-16-cli-loon-input-everywhere",
|
|
41564
41583
|
version: "0.9.4",
|
|
@@ -49705,7 +49724,21 @@ var init_loon_macros = __esm({
|
|
|
49705
49724
|
"type",
|
|
49706
49725
|
"assembly",
|
|
49707
49726
|
"part",
|
|
49708
|
-
"instance"
|
|
49727
|
+
"instance",
|
|
49728
|
+
"cylinder-n",
|
|
49729
|
+
"sphere-n",
|
|
49730
|
+
"cone-n",
|
|
49731
|
+
"torus-n",
|
|
49732
|
+
"import-step",
|
|
49733
|
+
"import-step-body",
|
|
49734
|
+
"import-mesh",
|
|
49735
|
+
"import-mesh-scaled",
|
|
49736
|
+
"sheet-base-flange-rect",
|
|
49737
|
+
"sheet-base-flange",
|
|
49738
|
+
"sheet-edge-flange",
|
|
49739
|
+
"sheet-jog",
|
|
49740
|
+
"sheet-hem",
|
|
49741
|
+
"sheet-bend-relief"
|
|
49709
49742
|
]);
|
|
49710
49743
|
registry2 = /* @__PURE__ */ new Map();
|
|
49711
49744
|
hydrated = false;
|
|
@@ -50088,12 +50121,27 @@ function createCadLoon(input, engine) {
|
|
|
50088
50121
|
const text2 = Object.keys(modules).length ? "Error: this kernel build cannot resolve loon modules ([use ...]) \u2014 update the kernel, or inline the modules into `source`" : "Error: Loon evaluation not supported by this engine build";
|
|
50089
50122
|
return { content: [{ type: "text", text: text2 }] };
|
|
50090
50123
|
}
|
|
50091
|
-
const text
|
|
50124
|
+
const { text, fellBack } = serializeDocument2(doc, format);
|
|
50092
50125
|
const content = [{ type: "text", text }];
|
|
50126
|
+
if (fellBack) {
|
|
50127
|
+
content.push({
|
|
50128
|
+
type: "text",
|
|
50129
|
+
text: `Note: returned the JSON IR instead of VCode \u2014 this document uses ops VCode cannot express (${fellBack}). The document itself is complete and every downstream tool works on it; only the compact text form is unavailable.`
|
|
50130
|
+
});
|
|
50131
|
+
}
|
|
50093
50132
|
const note = parametricNote(source, modules, engine, doc);
|
|
50094
50133
|
if (note) content.push({ type: "text", text: note });
|
|
50095
50134
|
return { content };
|
|
50096
50135
|
}
|
|
50136
|
+
function serializeDocument2(doc, format) {
|
|
50137
|
+
if (format === "json") return { text: JSON.stringify(doc, null, 2), fellBack: null };
|
|
50138
|
+
try {
|
|
50139
|
+
return { text: toVCode2(doc), fellBack: null };
|
|
50140
|
+
} catch (e) {
|
|
50141
|
+
const why = e instanceof Error ? e.message : String(e);
|
|
50142
|
+
return { text: JSON.stringify(doc, null, 2), fellBack: why };
|
|
50143
|
+
}
|
|
50144
|
+
}
|
|
50097
50145
|
function parametricNote(source, modules, engine, doc) {
|
|
50098
50146
|
const names = Object.keys(doc.parameters ?? {}).sort();
|
|
50099
50147
|
if (!names.length) return null;
|
|
@@ -50189,7 +50237,7 @@ var init_loon = __esm({
|
|
|
50189
50237
|
{
|
|
50190
50238
|
name: "create_cad_loon",
|
|
50191
50239
|
pack: null,
|
|
50192
|
-
description: 'The preferred authoring tool for whole parts and multi-feature models \u2014 one call, full vocabulary. Create a CAD document from loon source code. Loon is a Lisp-like language for parametric CAD \u2014 the FULL modeling vocabulary (patterns, sketches, extrude/revolve/sweep/loft, assemblies) is available here even where no dedicated MCP tool exists. For incremental single-node edits to an open session, use create/update/delete instead.\n\nPrimitives: [cube x y z], [cylinder r h], [sphere r], [cone r-bottom r-top h], [torus major-r minor-r], [wedge x y z], [prism sides radius height]\nBooleans (subject-last): [difference tool subject], [union other subject], [intersection other subject]\nTransforms (subject-last): [translate x y z s], [rotate rx ry rz s], [scale sx sy sz s], [mirror ox oy oz nx ny nz s] (plane through the origin point with that normal) \u2014 plus the axis sugar [mirror-x s] / [mirror-y s] / [mirror-z s], which mirror through the origin, negating that one coordinate. NEVER hand-mirror by negating coordinates; use these.\nFeatures: [fillet r s], [chamfer d s], [shell t s]\nPatterns (subject-last): [linear-pattern dx dy dz count spacing s], [circular-pattern ox oy oz ax ay az count angle s] \u2014 e.g. a bolt circle is [circular-pattern 0 0 0 0 0 1 6 360 bolt-hole]\nSymmetric patterns (subject-last): [mirror-pattern nx ny nz s] and its sugar [mirror-pattern-x s] / -y / -z union a solid with its mirror image (a left/right pair in one expression, so the halves can\'t drift apart); [quad-pattern s] is the 4-fold X-and-Y version \u2014 a quadruped\'s legs, a 4-post frame, a vehicle chassis\nSketches: [sketch ox oy oz xx xy xz yx yy yz #[segments]] with [line x1 y1 x2 y2] and [arc x1 y1 x2 y2 cx cy ccw]\nSketch ops (sketch-last): [extrude dx dy dz sk], [revolve aox aoy aoz adx ady adz angle sk], [sweep-line sx sy sz ex ey ez sk], [sweep-helix radius pitch height turns sk], [loft #[sk1 sk2 \u2026]], [loft-closed #[sk1 sk2 \u2026]]\nAssemblies: [assembly #[parts] #[instances] #[joints] ground-id] with [part name solid "material"], [instance name part-name x y z], [revolute-joint \u2026], [prismatic-joint \u2026], [fixed-joint \u2026], [ball-joint \u2026]\nAssembly symmetry: author ONE side as an assembly, then [mirror-group-x "-r" side] (or -y / -z) returns it plus a mirrored, suffixed copy \u2014 parts reflected, placements and joint anchors mirrored, and joint axes flipped by the correct rule (a hinge across its own mirror normal keeps its axis; the other two flip), so the same joint state drives both sides symmetrically. Splice it back with [assembly-join chassis mirrored]. NEVER hand-mirror an assembly.\nPipe: [pipe [cube 50 30 5] [difference [cylinder 3 10]] [fillet 1.0]]\nLet bindings: [let body [cube 50 30 5]] \u2014 note these are inlined and do NOT survive into the document; use [defparam ...] for a value you want to change later\nParameters (survive into the document and are settable afterwards with set_parameters, and differentiable with parameter_gradient): [defparam pitch_axis_x 310.0], [defparam wall "bore * 0.2"] for derived values, plus optional :unit/:min/:max/:description. Names must be identifier-safe (underscores, not dashes)\nDatums \u2014 named reference geometry, so two parts cannot each hold their own copy of a shared plane: [datum-plane "femur_inner" y 131.0], [datum-axis "pitch" x 0 0 310], [datum-point "hip" 0 0 310], read back with [datum "femur_inner"], [datum+ "femur_inner" 3.0] (3 mm outboard), [datum-x/-y/-z "pitch"]\nStacks \u2014 declarative packing, where each running clearance is a named value instead of an arbitrary number: [stack y "leg" 131.0 [lane "femur_inner" 5.0] [gap "idler_run" 1.0] [lane "idler_boss" 3.0]] declares datum planes leg_femur_inner_lo/_hi, leg_idler_boss_lo/_hi and leg_end; widening leg_idler_run slides everything outboard of it\nScene: [root solid "material-name"], with [material name r g b metallic roughness] to define one\nModules: [use bracket] then [bracket.plate] \u2014 multi-file projects work here, with sources passed in `modules` (or read from `base_dir`); [use bracket :as b] aliases, [use bracket [plate]] imports selectively, and `pub` in a module picks what it exports',
|
|
50240
|
+
description: 'The preferred authoring tool for whole parts and multi-feature models \u2014 one call, full vocabulary. Create a CAD document from loon source code. Loon is a Lisp-like language for parametric CAD \u2014 the FULL modeling vocabulary (patterns, sketches, extrude/revolve/sweep/loft, assemblies) is available here even where no dedicated MCP tool exists. For incremental single-node edits to an open session, use create/update/delete instead.\n\nPrimitives: [cube x y z], [cylinder r h], [sphere r], [cone r-bottom r-top h], [torus major-r minor-r], [wedge x y z], [prism sides radius height]. Segment count is the kernel default (32); pin it with [cylinder-n r h n] / [sphere-n r n] / [cone-n rb rt h n] / [torus-n R r n] where the facets are load-bearing (a bore that must accept a real shaft)\nImports \u2014 place a purchased part instead of approximating it, so fit checks test the real envelope and not one you invented: [import-step "vendor/x6-60.step"], [import-step-body path index] for a multi-body file, [import-mesh "part.stl"], [import-mesh-scaled sx sy sz path]. Relative paths resolve against base_dir / the module source\nSheet metal (subject-last, so it threads through pipe) \u2014 author a cut-and-bent part as a bend chain and it KEEPS its bends, so sheet_metal_unfold is exact instead of inferred back out of a solid by flat_pattern_from_solid: [sheet-base-flange-rect width depth thickness "al-soft"] (or [sheet-base-flange #[x0 y0 \u2026] #[holes] t material] for an arbitrary outline) then [sheet-edge-flange edge length angle-deg s], [sheet-jog edge offset length s], [sheet-hem edge length s], [sheet-bend-relief s]. `edge` is an outline index, or "south"/"east"/"north"/"west" on a rectangular base flange (edge 0 is the -Y edge, CCW from there). Each has an -at form taking panel id, radius, direction ("up"/"down") and K-factor, where 0.0 means the default; -shop variants resolve every bend through a shop table. Sheet nodes are a bend graph, NOT solids \u2014 never union, transform or fillet them\nBooleans (subject-last): [difference tool subject], [union other subject], [intersection other subject]\nTransforms (subject-last): [translate x y z s], [rotate rx ry rz s], [scale sx sy sz s], [mirror ox oy oz nx ny nz s] (plane through the origin point with that normal) \u2014 plus the axis sugar [mirror-x s] / [mirror-y s] / [mirror-z s], which mirror through the origin, negating that one coordinate. NEVER hand-mirror by negating coordinates; use these.\nFeatures: [fillet r s], [chamfer d s], [shell t s]\nPatterns (subject-last): [linear-pattern dx dy dz count spacing s], [circular-pattern ox oy oz ax ay az count angle s] \u2014 e.g. a bolt circle is [circular-pattern 0 0 0 0 0 1 6 360 bolt-hole]\nSymmetric patterns (subject-last): [mirror-pattern nx ny nz s] and its sugar [mirror-pattern-x s] / -y / -z union a solid with its mirror image (a left/right pair in one expression, so the halves can\'t drift apart); [quad-pattern s] is the 4-fold X-and-Y version \u2014 a quadruped\'s legs, a 4-post frame, a vehicle chassis\nSketches: [sketch ox oy oz xx xy xz yx yy yz #[segments]] with [line x1 y1 x2 y2] and [arc x1 y1 x2 y2 cx cy ccw]\nSketch ops (sketch-last): [extrude dx dy dz sk], [revolve aox aoy aoz adx ady adz angle sk], [sweep-line sx sy sz ex ey ez sk], [sweep-helix radius pitch height turns sk], [loft #[sk1 sk2 \u2026]], [loft-closed #[sk1 sk2 \u2026]]\nAssemblies: [assembly #[parts] #[instances] #[joints] ground-id] with [part name solid "material"], [instance name part-name x y z], [revolute-joint \u2026], [prismatic-joint \u2026], [fixed-joint \u2026], [ball-joint \u2026]\nAssembly symmetry: author ONE side as an assembly, then [mirror-group-x "-r" side] (or -y / -z) returns it plus a mirrored, suffixed copy \u2014 parts reflected, placements and joint anchors mirrored, and joint axes flipped by the correct rule (a hinge across its own mirror normal keeps its axis; the other two flip), so the same joint state drives both sides symmetrically. Splice it back with [assembly-join chassis mirrored]. NEVER hand-mirror an assembly.\nPipe: [pipe [cube 50 30 5] [difference [cylinder 3 10]] [fillet 1.0]]\nLet bindings: [let body [cube 50 30 5]] \u2014 note these are inlined and do NOT survive into the document; use [defparam ...] for a value you want to change later\nParameters (survive into the document and are settable afterwards with set_parameters, and differentiable with parameter_gradient): [defparam pitch_axis_x 310.0], [defparam wall "bore * 0.2"] for derived values, plus optional :unit/:min/:max/:description. Names must be identifier-safe (underscores, not dashes)\nDatums \u2014 named reference geometry, so two parts cannot each hold their own copy of a shared plane: [datum-plane "femur_inner" y 131.0], [datum-axis "pitch" x 0 0 310], [datum-point "hip" 0 0 310], read back with [datum "femur_inner"], [datum+ "femur_inner" 3.0] (3 mm outboard), [datum-x/-y/-z "pitch"]\nStacks \u2014 declarative packing, where each running clearance is a named value instead of an arbitrary number: [stack y "leg" 131.0 [lane "femur_inner" 5.0] [gap "idler_run" 1.0] [lane "idler_boss" 3.0]] declares datum planes leg_femur_inner_lo/_hi, leg_idler_boss_lo/_hi and leg_end; widening leg_idler_run slides everything outboard of it\nScene: [root solid "material-name"], with [material name r g b metallic roughness] to define one\nModules: [use bracket] then [bracket.plate] \u2014 multi-file projects work here, with sources passed in `modules` (or read from `base_dir`); [use bracket :as b] aliases, [use bracket [plate]] imports selectively, and `pub` in a module picks what it exports',
|
|
50193
50241
|
inputSchema: createCadLoonSchema,
|
|
50194
50242
|
handler: async (args, ctx) => {
|
|
50195
50243
|
const useLoons = Array.isArray(args.use_loons) ? args.use_loons : void 0;
|
|
@@ -83601,8 +83649,8 @@ var init_server3 = __esm({
|
|
|
83601
83649
|
init_order_feed();
|
|
83602
83650
|
init_animate();
|
|
83603
83651
|
PKG_VERSION = (() => {
|
|
83604
|
-
if ("0.9.4-main.
|
|
83605
|
-
return "0.9.4-main.
|
|
83652
|
+
if ("0.9.4-main.72") {
|
|
83653
|
+
return "0.9.4-main.72";
|
|
83606
83654
|
}
|
|
83607
83655
|
try {
|
|
83608
83656
|
const req = createRequire2(import.meta.url);
|
|
@@ -83611,8 +83659,8 @@ var init_server3 = __esm({
|
|
|
83611
83659
|
return "0.0.0";
|
|
83612
83660
|
}
|
|
83613
83661
|
})();
|
|
83614
|
-
BUILD_SHA = "
|
|
83615
|
-
BUILD_TIME = "2026-08-
|
|
83662
|
+
BUILD_SHA = "150875476b916d4e772bdeb33726c543ccf2756d";
|
|
83663
|
+
BUILD_TIME = "2026-08-17T03:05:59.733Z";
|
|
83616
83664
|
SHORT_SHA = BUILD_SHA === "unknown" ? "unknown" : BUILD_SHA.slice(0, 7);
|
|
83617
83665
|
VERSION_WITH_BUILD = SHORT_SHA === "unknown" ? PKG_VERSION : `${PKG_VERSION}+${SHORT_SHA}`;
|
|
83618
83666
|
INSTANCE_ID = randomUUID7().slice(0, 8);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vcad/mcp",
|
|
3
|
-
"version": "0.9.4-main.
|
|
3
|
+
"version": "0.9.4-main.72",
|
|
4
4
|
"description": "vcad MCP server — parametric CAD + PCB design tools for AI agents (self-contained: bundled server + kernel WASM)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
},
|
|
20
20
|
"homepage": "https://vcad.io",
|
|
21
21
|
"vcadBuild": {
|
|
22
|
-
"sha": "
|
|
23
|
-
"builtAt": "2026-08-
|
|
22
|
+
"sha": "150875476b916d4e772bdeb33726c543ccf2756d",
|
|
23
|
+
"builtAt": "2026-08-17T03:05:59.733Z"
|
|
24
24
|
}
|
|
25
25
|
}
|
package/vcad_kernel_wasm_bg.wasm
CHANGED
|
Binary file
|