freeform-modeling-mcp 1.0.26

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.
Files changed (81) hide show
  1. package/README.md +61 -0
  2. package/index.cjs +21 -0
  3. package/package.json +48 -0
  4. package/src/cli.ts +47 -0
  5. package/src/commands/start.ts +88 -0
  6. package/src/commands/status.ts +81 -0
  7. package/src/dev.ts +24 -0
  8. package/src/lib/fileproxy/index.ts +505 -0
  9. package/src/lib/fileproxy/proxy-server.js +347 -0
  10. package/src/lib/gltf2obj/compress.js +33 -0
  11. package/src/lib/gltf2obj/engine/core/core.js +34 -0
  12. package/src/lib/gltf2obj/engine/core/eventnotifier.js +39 -0
  13. package/src/lib/gltf2obj/engine/core/taskrunner.js +88 -0
  14. package/src/lib/gltf2obj/engine/export/exporter.js +38 -0
  15. package/src/lib/gltf2obj/engine/export/exporterbase.js +86 -0
  16. package/src/lib/gltf2obj/engine/export/exportermodel.js +117 -0
  17. package/src/lib/gltf2obj/engine/export/exporterobj.js +147 -0
  18. package/src/lib/gltf2obj/engine/geometry/box3d.js +60 -0
  19. package/src/lib/gltf2obj/engine/geometry/coord2d.js +35 -0
  20. package/src/lib/gltf2obj/engine/geometry/coord3d.js +126 -0
  21. package/src/lib/gltf2obj/engine/geometry/coord4d.js +15 -0
  22. package/src/lib/gltf2obj/engine/geometry/geometry.js +56 -0
  23. package/src/lib/gltf2obj/engine/geometry/matrix.js +440 -0
  24. package/src/lib/gltf2obj/engine/geometry/octree.js +160 -0
  25. package/src/lib/gltf2obj/engine/geometry/quaternion.js +83 -0
  26. package/src/lib/gltf2obj/engine/geometry/transformation.js +63 -0
  27. package/src/lib/gltf2obj/engine/geometry/tween.js +31 -0
  28. package/src/lib/gltf2obj/engine/import/importer.js +270 -0
  29. package/src/lib/gltf2obj/engine/import/importerbase.js +115 -0
  30. package/src/lib/gltf2obj/engine/import/importerfiles.js +139 -0
  31. package/src/lib/gltf2obj/engine/import/importergltf.js +1045 -0
  32. package/src/lib/gltf2obj/engine/import/importerutils.js +102 -0
  33. package/src/lib/gltf2obj/engine/io/binaryreader.js +93 -0
  34. package/src/lib/gltf2obj/engine/io/binarywriter.js +92 -0
  35. package/src/lib/gltf2obj/engine/io/bufferutils.js +85 -0
  36. package/src/lib/gltf2obj/engine/io/externallibs.js +42 -0
  37. package/src/lib/gltf2obj/engine/io/fileutils.js +120 -0
  38. package/src/lib/gltf2obj/engine/io/textwriter.js +41 -0
  39. package/src/lib/gltf2obj/engine/main.js +19 -0
  40. package/src/lib/gltf2obj/engine/model/color.js +130 -0
  41. package/src/lib/gltf2obj/engine/model/generator.js +433 -0
  42. package/src/lib/gltf2obj/engine/model/material.js +243 -0
  43. package/src/lib/gltf2obj/engine/model/mesh.js +173 -0
  44. package/src/lib/gltf2obj/engine/model/meshbuffer.js +233 -0
  45. package/src/lib/gltf2obj/engine/model/meshinstance.js +128 -0
  46. package/src/lib/gltf2obj/engine/model/meshutils.js +64 -0
  47. package/src/lib/gltf2obj/engine/model/model.js +195 -0
  48. package/src/lib/gltf2obj/engine/model/modelfinalization.js +377 -0
  49. package/src/lib/gltf2obj/engine/model/modelutils.js +117 -0
  50. package/src/lib/gltf2obj/engine/model/node.js +178 -0
  51. package/src/lib/gltf2obj/engine/model/object.js +90 -0
  52. package/src/lib/gltf2obj/engine/model/property.js +86 -0
  53. package/src/lib/gltf2obj/engine/model/quantities.js +46 -0
  54. package/src/lib/gltf2obj/engine/model/topology.js +139 -0
  55. package/src/lib/gltf2obj/engine/model/triangle.js +99 -0
  56. package/src/lib/gltf2obj/engine/threejs/threemodelloader.js +85 -0
  57. package/src/lib/gltf2obj/handler.js +63 -0
  58. package/src/lib/gltf2obj/index.js +47 -0
  59. package/src/lib/logger.ts +304 -0
  60. package/src/lib/print.ts +37 -0
  61. package/src/lib/utils.ts +34 -0
  62. package/src/lib/wsbridge/bridge.ts +639 -0
  63. package/src/lib/wsbridge/lock.ts +258 -0
  64. package/src/llmClient.ts +245 -0
  65. package/src/prompt.ts +187 -0
  66. package/src/server.ts +125 -0
  67. package/src/tools/assets-tool.ts +314 -0
  68. package/src/tools/basic-tools.ts +531 -0
  69. package/src/tools/index.ts +2 -0
  70. package/src/tools/material-tools.ts +88 -0
  71. package/src/tools/modeling/auxiliary-curve-tool.ts +44 -0
  72. package/src/tools/modeling/find-face.ts +38 -0
  73. package/src/tools/modeling/sweep-tool.ts +60 -0
  74. package/src/tools/modeling/utils.ts +181 -0
  75. package/src/tools/modeling-tools.ts +135 -0
  76. package/src/tools/screenshot-tools.ts +107 -0
  77. package/src/tools/tools-info.ts +107 -0
  78. package/src/tools/tripo3d-tools.ts +496 -0
  79. package/src/types/index.ts +25 -0
  80. package/src/types/tripo3d.ts +38 -0
  81. package/tsconfig.json +22 -0
package/README.md ADDED
@@ -0,0 +1,61 @@
1
+ # 酷大师 MCP Server
2
+
3
+ ## 核心功能
4
+ - 🔌 WebSocket桥接服务(详见`src/llmClient.ts`)
5
+ - 🧰 丰富工具集(`src/tools/`包含50+建模工具)
6
+ - 基础建模工具(立方体/球体/圆环创建)
7
+ - KJL资源库集成(资产搜索/置入/替换)
8
+ - Tripo3D AI生成
9
+ - 材质替换
10
+
11
+ ## 快速开始
12
+
13
+ ### 运行环境准备
14
+ 1. 安装Node.js(**v18+**):
15
+ - 官方下载:[Node.js 18+](https://nodejs.org/zh-cn/download)
16
+ 2. 打开系统终端:
17
+ - Mac系统:[终端使用指南](https://support.apple.com/zh-cn/guide/terminal/apd5265185d-f365-44cb-8b09-71a064a42125/mac)
18
+ - Windows系统:[CMD打开方式](https://blog.csdn.net/B11050729/article/details/131494056)
19
+
20
+ ### 启动服务
21
+ ```bash
22
+ npx -y freeform-modeling-mcp
23
+ ```
24
+ 当终端显示`MCP Server Endpoint: `即表示启动成功
25
+
26
+
27
+ ### 故障排除
28
+ 若启动失败,可尝试安装指定版本:
29
+ ```bash
30
+ npm i -g freeform-modeling-mcp@1.0.26 --registry=https://registry.npmjs.org
31
+ ```
32
+
33
+ ## 核心模块
34
+ ### 1. 工具系统 (`src/tools/`)
35
+ - **建模工具**:面操作/辅助曲线/扫描建模
36
+ - **资产工具**:KJL资源搜索/批量置入
37
+ - **反馈工具**:场景截图/对象快照
38
+ - **交互工具**:对象选择/移动/旋转/缩放
39
+
40
+ ### 2. 客户端连接 (`src/llmClient.ts`)
41
+ - WebSocket长连接管理
42
+ - 命令队列与超时控制
43
+ - 客户端状态监测
44
+
45
+ ### 3. 提示策略 (`src/prompt.ts`)
46
+ ```
47
+ 包含300+条建模规范:
48
+ - 坐标系标准 (Z-up右手系)
49
+ - 单位系统 (毫米级精度)
50
+ - 碰撞检测规则
51
+ - KJL资产优先策略
52
+ ```
53
+
54
+
55
+ ## 开发指南
56
+ 1. 工具扩展:在`src/tools/`创建新工具类
57
+ 2. API集成:参考`tripo3d-tools.ts`接入第三方服务
58
+ 3. 客户端协议:遵循`llmClient.ts`定义的消息格式
59
+
60
+ ## 贡献者协议
61
+ 请遵循`src/prompt.ts`中定义的建模规范提交代码
package/index.cjs ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+
3
+ // 使用 npx tsx 运行 TypeScript 源文件
4
+ /* eslint-disable @typescript-eslint/no-var-requires */
5
+ const { sync: spawnSync } = require('cross-spawn');
6
+ const path = require('path');
7
+
8
+ // 找到项目根目录的 src/cli.ts 文件
9
+ const cliPath = path.resolve(__dirname, './src/cli.ts');
10
+
11
+ const args = process.argv.slice(2);
12
+
13
+ const result = spawnSync('npx', ['tsx', cliPath, ...args], {
14
+ stdio: 'inherit',
15
+ env: {
16
+ ...process.env,
17
+ },
18
+ });
19
+
20
+ // 使用相同的退出码
21
+ process.exit(result.status || 0);
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "freeform-modeling-mcp",
3
+ "version": "1.0.26",
4
+ "description": "KooMaster MCP Server with WebSocket Bridge",
5
+ "main": "index.cjs",
6
+ "type": "module",
7
+ "bin": {
8
+ "freeform-modeling-mcp": "index.cjs"
9
+ },
10
+ "publishConfig": {
11
+ "registry": "https://registry.npmjs.org/",
12
+ "access": "public"
13
+ },
14
+ "author": "cadevsh",
15
+ "scripts": {
16
+ "inspect": "npx fastmcp inspect src/dev.ts",
17
+ "dev": "npx fastmcp dev src/dev.ts",
18
+ "status": "npx tsx src/cli.ts status",
19
+ "port": "npx tsx src/cli.ts port"
20
+ },
21
+ "license": "ISC",
22
+ "dependencies": {
23
+ "@types/cors": "^2.8.17",
24
+ "@types/express": "^5.0.1",
25
+ "@types/node": "22.13.5",
26
+ "@types/uuid": "^10.0.0",
27
+ "axios": "1.3.4",
28
+ "chalk": "^5.4.1",
29
+ "commander": "^13.1.0",
30
+ "cors": "^2.8.5",
31
+ "cross-spawn": "^7.0.6",
32
+ "draco3d": "^1.5.6",
33
+ "express": "^4.17.1",
34
+ "fastmcp": "^4.0.0",
35
+ "fflate": "^0.7.4",
36
+ "figures": "^6.1.0",
37
+ "jszip": "^3.10.1",
38
+ "multer": "^1.4.5-lts.1",
39
+ "node-fetch": "^3.3.2",
40
+ "nodemon": "^3.1.9",
41
+ "ts-node": "^10.9.2",
42
+ "tsx": "^4.19.3",
43
+ "typescript": "^5.8.2",
44
+ "uuid": "^11.1.0",
45
+ "ws": "^8.18.1",
46
+ "zod": "^3.25.63"
47
+ }
48
+ }
package/src/cli.ts ADDED
@@ -0,0 +1,47 @@
1
+ import { Command } from 'commander';
2
+ import { startMCPServer } from './commands/start';
3
+ import { getServerStatus } from './commands/status';
4
+
5
+ const program = new Command();
6
+
7
+ program
8
+ .name('freeform-modeling-mcp')
9
+ .description('KooMaster MCP Server with WebSocket Bridge')
10
+
11
+ // 启动服务命令
12
+ program
13
+ .command('start')
14
+ .description('Start the MCP server and WebSocket bridge')
15
+ .option('--stdio', 'Output results via standard input/output')
16
+ .action(async (options) => {
17
+ await startMCPServer({
18
+ stdio: options.stdio
19
+ });
20
+ });
21
+
22
+ // 查询服务状态命令
23
+ program
24
+ .command('status')
25
+ .description('Show the status of all running servers')
26
+ .action(async () => {
27
+ await getServerStatus();
28
+ });
29
+
30
+ // 获取端口号命令
31
+ program
32
+ .command('port')
33
+ .description('Get the port of the running WebSocket bridge')
34
+ .option('--url', 'Output as WebSocket URL instead of just port number')
35
+ .action(async (options) => {
36
+ await getServerStatus({
37
+ portOnly: true,
38
+ asUrl: options.url
39
+ });
40
+ });
41
+
42
+ // 默认命令(如果没有指定命令则启动服务器)
43
+ if (process.argv.length <= 2) {
44
+ process.argv.push('start');
45
+ }
46
+
47
+ program.parse();
@@ -0,0 +1,88 @@
1
+ import { createServer, shutdownServer } from '../server';
2
+ // import { ProxyServiceManager } from '../lib/fileproxy';
3
+ import { WebSocketBridge } from '../lib/wsbridge/bridge';
4
+ import { llmClient } from '../llmClient';
5
+ import logger from '../lib/logger';
6
+ import { findAvailablePort } from '../lib/utils';
7
+ import { printServerInfo } from '../lib/print';
8
+
9
+ // 启动服务器
10
+ export async function startMCPServer(options: { dev?: boolean, stdio?: boolean } = {}) {
11
+ try {
12
+ const isDevMode = options.dev || false;
13
+ const stdioMode = options.stdio || false;
14
+
15
+ // 初始化 WebSocket 服务器
16
+ logger.info('Initializing WebSocket server...');
17
+
18
+ const wsBridge = new WebSocketBridge();
19
+ await wsBridge.initialize();
20
+ const wsPort = wsBridge.getPort();
21
+ const wsUrl = `ws://localhost:${wsPort}`;
22
+
23
+ await llmClient.connect(wsUrl);
24
+
25
+ // // 启动文件下载代理服务
26
+ // const manager = new ProxyServiceManager();
27
+ // await manager.start();
28
+
29
+ // 创建 MCP 服务器
30
+ logger.info('Creating MCP server...');
31
+ const server = createServer();
32
+
33
+ // 处理进程终止信号
34
+ process.on('SIGINT', async () => {
35
+ logger.info('Caught SIGINT, shutting down...');
36
+ await shutdownServer();
37
+ process.exit(0);
38
+ });
39
+
40
+ process.on('SIGTERM', async () => {
41
+ logger.info('Caught SIGTERM, shutting down...');
42
+ await shutdownServer();
43
+ process.exit(0);
44
+ });
45
+
46
+ if (!isDevMode && !stdioMode) {
47
+ const port = await findAvailablePort(7764); // 尝试从7764开始,找到第一个可用端口
48
+
49
+ await server.start({
50
+ transportType: "sse",
51
+ sse: {
52
+ endpoint: `/sse`,
53
+ port: port,
54
+ }
55
+ });
56
+
57
+ // Print server information in a visually appealing way
58
+ const sseUrl = `http://localhost:${port}/sse`;
59
+
60
+ printServerInfo(
61
+ 'SERVER STARTED SUCCESSFULLY',
62
+ [
63
+ { label: 'MCP Server Endpoint:', value: sseUrl },
64
+ { label: 'KooMaster Bridge Server Address:', value: wsUrl }
65
+ ],
66
+ {
67
+ icon: '📱',
68
+ text: 'Enter Bridge Server Address "VALUE" in the KooMaster app to connect',
69
+ value: wsUrl
70
+ }
71
+ );
72
+
73
+ // Also log to file with simpler format
74
+ logger.info(`MCP server started with SSE endpoint: ${sseUrl}`);
75
+ logger.info(`WebSocket Bridge running on port: ${wsPort}`);
76
+ } else {
77
+ await server.start({
78
+ transportType: "stdio",
79
+ });
80
+ logger.error('Computer control MCP server running on stdio');
81
+ }
82
+
83
+ } catch (error) {
84
+ logger.error('Failed to start servers:', error);
85
+ await shutdownServer().catch(err => logger.error('Error during shutdown:', err));
86
+ process.exit(1);
87
+ }
88
+ }
@@ -0,0 +1,81 @@
1
+ import { getActiveBridges } from '../lib/wsbridge/lock';
2
+ import * as http from 'http';
3
+
4
+ interface StatusOptions {
5
+ portOnly?: boolean;
6
+ asUrl?: boolean;
7
+ }
8
+
9
+ export async function getServerStatus(options: StatusOptions = {}): Promise<void> {
10
+ const activeBridges = getActiveBridges();
11
+
12
+ if (activeBridges.length === 0) {
13
+ if (!options.portOnly) {
14
+ console.log('No KooMaster MCP servers are currently running.');
15
+ }
16
+ process.exit(0);
17
+ return;
18
+ }
19
+
20
+ // 如果只需要输出端口信息
21
+ if (options.portOnly) {
22
+ const port = activeBridges[0].port;
23
+ if (options.asUrl) {
24
+ console.log(`ws://localhost:${port}`);
25
+ } else {
26
+ console.log(port);
27
+ }
28
+ return;
29
+ }
30
+
31
+ // 输出详细状态信息
32
+ console.log('Active KooMaster MCP servers:');
33
+
34
+ for (const bridge of activeBridges) {
35
+ console.log(`\nPID: ${bridge.pid}, Port: ${bridge.port}`);
36
+ console.log(`WebSocket URL: ws://localhost:${bridge.port}`);
37
+
38
+ // 尝试获取更多状态信息
39
+ try {
40
+ const status = await fetchBridgeStatus(bridge.port);
41
+ if (status) {
42
+ console.log('Status:', status.status);
43
+ console.log('Connected clients:');
44
+ console.log(` Total: ${status.clients.total}`);
45
+ console.log(` MCP: ${status.clients.mcp}`);
46
+ console.log(` Koomaster: ${status.clients.koomaster}`);
47
+ }
48
+ } catch (error) {
49
+ console.log('Status: Unable to fetch detailed status');
50
+ }
51
+ }
52
+ }
53
+
54
+ // 从桥接服务器获取状态信息
55
+ async function fetchBridgeStatus(port: number): Promise<any> {
56
+ return new Promise((resolve, reject) => {
57
+ const req = http.get(`http://localhost:${port}/bridge-status`, (res) => {
58
+ let data = '';
59
+
60
+ res.on('data', (chunk) => {
61
+ data += chunk;
62
+ });
63
+
64
+ res.on('end', () => {
65
+ try {
66
+ const status = JSON.parse(data);
67
+ resolve(status);
68
+ } catch (error) {
69
+ reject(new Error('Invalid status response'));
70
+ }
71
+ });
72
+ });
73
+
74
+ req.on('error', reject);
75
+
76
+ req.setTimeout(2000, () => {
77
+ req.destroy();
78
+ reject(new Error('Status request timeout'));
79
+ });
80
+ });
81
+ }
package/src/dev.ts ADDED
@@ -0,0 +1,24 @@
1
+ import { Command } from 'commander';
2
+ import { startMCPServer } from './commands/start';
3
+ import { getServerStatus } from './commands/status';
4
+
5
+ const program = new Command();
6
+
7
+ program
8
+ .name('freeform-modeling-mcp')
9
+ .description('KooMaster MCP Server with WebSocket Bridge')
10
+
11
+ // 启动服务命令
12
+ program
13
+ .command('start')
14
+ .description('Start the MCP server and WebSocket bridge')
15
+ .action(async () => {
16
+ await startMCPServer({ dev: true });
17
+ });
18
+
19
+ // 默认命令(如果没有指定命令则启动服务器)
20
+ if (process.argv.length <= 2) {
21
+ process.argv.push('start');
22
+ }
23
+
24
+ program.parse();