@vcad/mcp 0.10.0-main.119 → 0.10.0-main.120

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 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 bb4fe034ac7b14f59781a361a3469bd6d65752b9 at 2026-10-21T01:28:16.657Z. Source: https://github.com/ecto/vcad
9
+ Built from 7eeafc841dd77faeaa0447b6f46a515ea28d1007 at 2026-10-21T01:59:00.007Z. Source: https://github.com/ecto/vcad
package/index.mjs CHANGED
@@ -41824,6 +41824,19 @@ var init_CHANGELOG = __esm({
41824
41824
  CHANGELOG_default = {
41825
41825
  $schema: "./changelog.schema.json",
41826
41826
  entries: [
41827
+ {
41828
+ id: "2026-10-21-desktop-agent",
41829
+ version: "0.10.0",
41830
+ date: "2026-10-21",
41831
+ category: "feat",
41832
+ title: "Built-in Agent edits documents in the Mac app",
41833
+ summary: "A chat panel in the native Mac app where an agent edits the open document through engine tools: edits show live, each turn is one undo step, and tool errors go back to the model.",
41834
+ features: [
41835
+ "desktop",
41836
+ "agent",
41837
+ "ai"
41838
+ ]
41839
+ },
41827
41840
  {
41828
41841
  id: "2026-10-20-vendor-verified-power-imu-footprints",
41829
41842
  version: "0.10.0",
@@ -41855,6 +41868,19 @@ var init_CHANGELOG = __esm({
41855
41868
  "update"
41856
41869
  ]
41857
41870
  },
41871
+ {
41872
+ id: "2026-10-20-stale-photoreal-renderer",
41873
+ version: "0.10.0",
41874
+ date: "2026-10-20",
41875
+ category: "fix",
41876
+ title: "Photoreal refuses a stale vcad-render that facets lofts",
41877
+ summary: "The Mac app's photoreal button now detects a pre-mesh-mode vcad-render (which traced polyline lofts as flat strips) and asks for a rebuild instead of rendering jagged rounds.",
41878
+ features: [
41879
+ "photoreal",
41880
+ "render",
41881
+ "loft"
41882
+ ]
41883
+ },
41858
41884
  {
41859
41885
  id: "2026-10-20-schematic-power-flags",
41860
41886
  version: "0.10.0",
@@ -41932,6 +41958,23 @@ var init_CHANGELOG = __esm({
41932
41958
  "native"
41933
41959
  ]
41934
41960
  },
41961
+ {
41962
+ id: "2026-10-20-mcp-tube-tools-engine",
41963
+ version: "0.10.0",
41964
+ date: "2026-10-20",
41965
+ category: "feat",
41966
+ title: "MCP tube and polyline_tube tools on the engine",
41967
+ summary: "tube and polyline_tube are now available over MCP, lowered by the Rust document engine; place_part also inserts through the engine.",
41968
+ features: [
41969
+ "mcp",
41970
+ "engine"
41971
+ ],
41972
+ mcpTools: [
41973
+ "tube",
41974
+ "polyline_tube",
41975
+ "place_part"
41976
+ ]
41977
+ },
41935
41978
  {
41936
41979
  id: "2026-10-20-mcp-stable-part-ids",
41937
41980
  version: "0.10.0",
@@ -55970,13 +56013,8 @@ var init_registry_dispatch = __esm({
55970
56013
  "screenshot_viewport"
55971
56014
  ]);
55972
56015
  DEFERRED_TOOLS = /* @__PURE__ */ new Set([
55973
- "tube",
55974
- "polyline_tube",
55975
- "linear_pattern",
55976
- "circular_pattern",
55977
- "mirror",
55978
- // search_parts / place_part are implemented separately in parts.ts —
55979
- // they take a Document directly and don't need the planner round-trip.
56016
+ // search_parts / place_part are served by parts.ts (place_part still
56017
+ // mutates through the engine, via runMutation).
55980
56018
  "search_parts",
55981
56019
  "place_part"
55982
56020
  ]);
@@ -56033,7 +56071,9 @@ var init_registry_dispatch = __esm({
56033
56071
  "shell",
56034
56072
  "tube",
56035
56073
  "polyline_tube",
56036
- "place"
56074
+ "place",
56075
+ // Reached via parts.ts (place_part handler), not registry dispatch.
56076
+ "place_part"
56037
56077
  ]);
56038
56078
  }
56039
56079
  });
@@ -57729,6 +57769,8 @@ var init_tool_metadata = __esm({
57729
57769
  delete: { title: "Delete Node", annotations: DESTRUCTIVE },
57730
57770
  set_material: { title: "Set Material", annotations: RW },
57731
57771
  place: { title: "Place Part by Anchor", annotations: RW },
57772
+ tube: { title: "Create Tube", annotations: RW },
57773
+ polyline_tube: { title: "Create Polyline Tube", annotations: RW },
57732
57774
  inspect_part: { title: "Inspect Part", annotations: RO },
57733
57775
  describe_scene: { title: "Describe Scene", annotations: RO },
57734
57776
  // ── MCP Apps: app-only preview fetchers ────────────────────────────────
@@ -62616,42 +62658,21 @@ function placePartTool(args, engine) {
62616
62658
  ...defaultParamsFor(entry),
62617
62659
  ...userParams
62618
62660
  };
62619
- const existingIds = Object.keys(doc.nodes).map(Number);
62620
- const partNodeId = (existingIds.length ? Math.max(...existingIds) : 0) + 1;
62621
- const partNode = {
62622
- id: partNodeId,
62623
- name: typeof args.name === "string" ? args.name : entry.name,
62624
- op: {
62625
- type: "PartInstance",
62626
- path,
62627
- version: entry.version,
62628
- params
62629
- }
62630
- };
62631
- doc.nodes[String(partNodeId)] = partNode;
62632
- let rootId = partNodeId;
62661
+ const name = typeof args.name === "string" ? args.name : entry.name;
62662
+ const placed = JSON.parse(
62663
+ runMutation("place_part", { path, version: entry.version, params, name }, doc, documentId).content[0].text
62664
+ );
62665
+ const partId = placed.part_id;
62666
+ if (!partId) throw new Error("place_part: engine created no part");
62633
62667
  const position = args.position;
62634
62668
  if (position && (Number.isFinite(position.x) || Number.isFinite(position.y) || Number.isFinite(position.z))) {
62635
- const translateId = partNodeId + 1;
62636
- doc.nodes[String(translateId)] = {
62637
- id: translateId,
62638
- name: null,
62639
- op: {
62640
- type: "Translate",
62641
- child: partNodeId,
62642
- offset: {
62643
- x: typeof position.x === "number" ? position.x : 0,
62644
- y: typeof position.y === "number" ? position.y : 0,
62645
- z: typeof position.z === "number" ? position.z : 0
62646
- }
62647
- }
62669
+ const offset = {
62670
+ x: typeof position.x === "number" ? position.x : 0,
62671
+ y: typeof position.y === "number" ? position.y : 0,
62672
+ z: typeof position.z === "number" ? position.z : 0
62648
62673
  };
62649
- rootId = translateId;
62674
+ runMutation("translate", { child: partId, offset }, doc, documentId);
62650
62675
  }
62651
- doc.roots.push({
62652
- root: rootId,
62653
- material: "default"
62654
- });
62655
62676
  return {
62656
62677
  content: [
62657
62678
  {
@@ -62659,12 +62680,12 @@ function placePartTool(args, engine) {
62659
62680
  text: JSON.stringify(
62660
62681
  {
62661
62682
  document_id: documentId,
62662
- part_id: partIdForNode(doc, rootId),
62683
+ part_id: partId,
62663
62684
  placed: {
62664
62685
  path,
62665
62686
  version: entry.version,
62666
62687
  params,
62667
- node_id: partNodeId
62688
+ node_id: placed.node_id
62668
62689
  }
62669
62690
  },
62670
62691
  null,
@@ -62680,7 +62701,7 @@ var init_parts2 = __esm({
62680
62701
  "use strict";
62681
62702
  init_dist();
62682
62703
  init_session2();
62683
- init_part_ids2();
62704
+ init_registry_dispatch();
62684
62705
  init_tool_def();
62685
62706
  searchPartsSchema = {
62686
62707
  type: "object",
@@ -87291,8 +87312,8 @@ var init_server3 = __esm({
87291
87312
  init_order_feed();
87292
87313
  init_animate();
87293
87314
  PKG_VERSION = (() => {
87294
- if ("0.10.0-main.119") {
87295
- return "0.10.0-main.119";
87315
+ if ("0.10.0-main.120") {
87316
+ return "0.10.0-main.120";
87296
87317
  }
87297
87318
  try {
87298
87319
  const req = createRequire2(import.meta.url);
@@ -87301,8 +87322,8 @@ var init_server3 = __esm({
87301
87322
  return "0.0.0";
87302
87323
  }
87303
87324
  })();
87304
- BUILD_SHA = "bb4fe034ac7b14f59781a361a3469bd6d65752b9";
87305
- BUILD_TIME = "2026-10-21T01:28:16.657Z";
87325
+ BUILD_SHA = "7eeafc841dd77faeaa0447b6f46a515ea28d1007";
87326
+ BUILD_TIME = "2026-10-21T01:59:00.007Z";
87306
87327
  SHORT_SHA = BUILD_SHA === "unknown" ? "unknown" : BUILD_SHA.slice(0, 7);
87307
87328
  VERSION_WITH_BUILD = SHORT_SHA === "unknown" ? PKG_VERSION : `${PKG_VERSION}+${SHORT_SHA}`;
87308
87329
  INSTANCE_ID = randomUUID7().slice(0, 8);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vcad/mcp",
3
- "version": "0.10.0-main.119",
3
+ "version": "0.10.0-main.120",
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": "bb4fe034ac7b14f59781a361a3469bd6d65752b9",
23
- "builtAt": "2026-10-21T01:28:16.657Z"
22
+ "sha": "7eeafc841dd77faeaa0447b6f46a515ea28d1007",
23
+ "builtAt": "2026-10-21T01:59:00.007Z"
24
24
  }
25
25
  }
@@ -1,4 +1,4 @@
1
1
  [diffend] Oversized file quarantined before diffing.
2
2
  name: package/vcad_kernel_wasm_bg.wasm
3
- size: 35332501 bytes
4
- sha256: db55b9e42bbd1d2b43f985c8fdc7e75b9514bd2159a92c64bd5b6014dfe17274
3
+ size: 35320568 bytes
4
+ sha256: 4ee12afb81436d1e31b2a0e2dbd01c596a7b5ae4282bbc8f9006158f922cab70