freeform-modeling-mcp 1.0.34 → 1.0.35

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/.cursor/mcp.json CHANGED
@@ -3,8 +3,8 @@
3
3
  "freeform-modeling-mcp": {
4
4
  "command": "npx",
5
5
  "args": [
6
- "tsx",
7
- "src/cli.ts",
6
+ "-y",
7
+ "freeform-modeling-mcp@latest",
8
8
  "start",
9
9
  "--stdio"
10
10
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "freeform-modeling-mcp",
3
- "version": "1.0.34",
3
+ "version": "1.0.35",
4
4
  "description": "KooMaster MCP Server with WebSocket Bridge",
5
5
  "main": "index.cjs",
6
6
  "type": "module",
@@ -73,7 +73,7 @@ export const batchSearchKjlAssetsTool = {
73
73
  `=== Search Results for "${item.searchTerm}" ===\n${item.results}\n`
74
74
  ).join('\n');
75
75
 
76
- const note = `Note about dimensions: The dimensions (x, y, z) show the model's default orientation. For example, a cabinet with larger x than y typically has its front facing the y direction and is wider along x. Consider these proportions when rotating models for proper placement. Use place_kjl_asset with the model ID to add items to your scene.`;
76
+ const note = `Note about dimensions: The dimensions (x, y, z) show the model's default orientation. For example, a cabinet with larger x than y typically has its front facing the y direction and is wider along x. Consider these proportions when rotating models for proper placement. Use place_kjl_asset with the obsBrandGoodId to add items to your scene.`;
77
77
 
78
78
  // context.reportProgress({
79
79
  // progress: 100,
@@ -231,7 +231,7 @@ export const placeKjlAssetTool = {
231
231
  name: 'place_kjl_asset',
232
232
  description: 'Places a 3D model from the KJL(酷家乐) asset library into the current scene with specified position, rotation, and scale. Before placing, analyze the model\'s bounding box dimensions to determine proper orientation - elongated objects like wall panels may require 90° rotation based on intended function. Ensure bottoms align with the ground plane (z=0) by setting z-value to half the model\'s height. After placement, verify no clipping with existing objects and confirm dimensions match real-world proportions.',
233
233
  parameters: z.object({
234
- modelId: z.string().describe('The unique ID of the model to place. This ID can be obtained from the batch_search_kjl_assets function results. Use the exact ID value returned by the search.'),
234
+ obsBrandGoodId: z.string().describe('The unique obsBrandGoodId of the model to place. Obtain it from batch_search_kjl_assets results, or from Lux3D / other kjl modeling tool output when placing a generated model. Use the exact ID value returned by the source.'),
235
235
  name: z.string().describe('Specify a name for the placed model. This name will be used for subsequent identification and reference to the model, such as when applying materials or performing transformation operations. Use descriptive names for easy identification, such as "dining_table", "office_chair", etc.'),
236
236
  originalDimensions: z.array(z.number()).describe('The original [width, height, depth] dimensions of the model as provided in the batch_search_kjl_assets results. These values must be obtained from the asset search results.'),
237
237
 
@@ -282,7 +282,7 @@ export const replaceKjlAssetTool = {
282
282
  description: 'Replaces an existing object in the scene with a new 3D model from the KJL(酷家乐) asset library. The replacement maintains the position, rotation, aligning the centers of both models. After replacement, review the scene to ensure no intersections or clipping with other objects.',
283
283
  parameters: z.object({
284
284
  targetName: z.string().describe('The name of the existing object in the scene that will be replaced. This must exactly match the name of a placed object.'),
285
- newModelId: z.string().describe('The unique ID of the new model that will replace the existing object. This ID should be obtained from the batch_search_kjl_assets function results.'),
285
+ newBrandGoodId: z.string().describe('The unique obsBrandGoodId of the new model that will replace the existing object. Obtain it from batch_search_kjl_assets results, or from Lux3D / other kjl modeling tool output when replacing with a generated model. Use the exact ID value returned by the source.'),
286
286
  newName: z.string().describe('Specify a name for the replacement model. This name will be used for subsequent identification and reference, such as when applying materials or performing transformation operations. Use descriptive names for easy identification.'),
287
287
  originalDimensions: z.array(z.number()).describe('The original [width, height, depth] dimensions of the new model as provided in the batch_search_kjl_assets results. These values must be obtained from the asset search results.'),
288
288
  targetDimensions: z.array(z.number()).optional().describe('The target [width, height, depth] dimensions for the model after importing. These values specify the absolute size the model should be scaled to in the scene.'),
@@ -40,7 +40,7 @@ function isUnsupportedModelUrl(url: string): boolean {
40
40
 
41
41
  export const importGeneratedAssetTool = {
42
42
  name: 'import_generated_asset',
43
- description: 'Import a generated GLB/GLTF 3D model into the Koomaster scene from any source that provides a publicly reachable model URL. Converts GLB/GLTF to OBJ and places it asynchronously; poll with poll_import_status. Use place_kjl_asset (new import) or replace_kjl_asset (swap existing object) with modelId + assetUrl ONLY when the model is Lux3D-generated AND a modelId is available; if there is no modelId, still use this tool.',
43
+ description: 'Import a generated GLB/GLTF 3D model into the Koomaster scene from any source that provides a publicly reachable model URL. Converts GLB/GLTF to OBJ and places it asynchronously; poll with poll_import_status. Use place_kjl_asset (new import) with obsBrandGoodId + assetUrl, or replace_kjl_asset (swap existing object) with newBrandGoodId + assetUrl, ONLY when the model is Lux3D-generated AND an ID is available; if there is no ID, still use this tool.',
44
44
  parameters: z.object({
45
45
  name: z.string().describe('The name to give to the imported object in the scene'),
46
46
  model_url: z.string().describe('Public HTTP(S) URL of a completed GLB/GLTF model. Do not pass archive or other mesh formats such as .zip/.obj/.fbx.'),
@@ -50,7 +50,7 @@ export const getToolsInfoTool = {
50
50
  "batch_get_methods_full - Fetch full method signatures + dependency types for { interface, methods } items. Call before writing run_kds_script.",
51
51
  ],
52
52
  generated: [
53
- "import_generated_asset - Import a generated GLB/GLTF model from any source that provides a public model URL. Requires model_url plus name/location/dimensions.",
53
+ "import_generated_asset - Import a generated GLB/GLTF 3D model into the Koomaster scene from any source that provides a publicly reachable model URL. Converts GLB/GLTF to OBJ and places it asynchronously; poll with poll_import_status. Use place_kjl_asset (new import) with obsBrandGoodId + assetUrl, or replace_kjl_asset (swap existing object) with newBrandGoodId + assetUrl, ONLY when the model is Lux3D-generated AND an ID is available; if there is no ID, still use this tool.",
54
54
  "poll_import_status - Query GLB-to-scene import progress using the import_uuid returned by import_generated_asset."
55
55
  ],
56
56
  assets: [