threlte-mcp 1.4.0

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.
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Camera Preset System
3
+ *
4
+ * Manages saving and loading camera positions for quick scene navigation
5
+ * Presets are stored in-memory and can optionally be persisted to localStorage
6
+ */
7
+ /**
8
+ * In-memory preset storage
9
+ * Will be synced with browser-side storage via WebSocket
10
+ */
11
+ class CameraPresetManager {
12
+ presets = new Map();
13
+ /**
14
+ * Save a camera preset
15
+ */
16
+ savePreset(preset) {
17
+ preset.timestamp = Date.now();
18
+ this.presets.set(preset.name, preset);
19
+ }
20
+ /**
21
+ * Load a camera preset by name
22
+ */
23
+ loadPreset(name) {
24
+ return this.presets.get(name);
25
+ }
26
+ /**
27
+ * List all available presets
28
+ */
29
+ listPresets() {
30
+ return Array.from(this.presets.values()).sort((a, b) => (b.timestamp || 0) - (a.timestamp || 0));
31
+ }
32
+ /**
33
+ * Delete a preset
34
+ */
35
+ deletePreset(name) {
36
+ return this.presets.delete(name);
37
+ }
38
+ /**
39
+ * Import presets from JSON
40
+ */
41
+ importPresets(data) {
42
+ for (const [name, preset] of Object.entries(data.presets)) {
43
+ this.presets.set(name, preset);
44
+ }
45
+ }
46
+ /**
47
+ * Export presets to JSON
48
+ */
49
+ exportPresets() {
50
+ const presets = {};
51
+ for (const [name, preset] of this.presets) {
52
+ presets[name] = preset;
53
+ }
54
+ return {
55
+ presets,
56
+ lastModified: Date.now()
57
+ };
58
+ }
59
+ /**
60
+ * Clear all presets
61
+ */
62
+ clear() {
63
+ this.presets.clear();
64
+ }
65
+ }
66
+ // Singleton instance
67
+ export const cameraPresets = new CameraPresetManager();
68
+ /**
69
+ * Default presets for common viewpoints
70
+ */
71
+ export const DEFAULT_PRESETS = [
72
+ {
73
+ name: 'overhead',
74
+ position: [0, 50, 0],
75
+ lookAt: [0, 0, 0],
76
+ description: 'Top-down orthographic-style view'
77
+ },
78
+ {
79
+ name: 'front',
80
+ position: [0, 5, 20],
81
+ lookAt: [0, 0, 0],
82
+ description: 'Front view of scene origin'
83
+ },
84
+ {
85
+ name: 'side',
86
+ position: [20, 5, 0],
87
+ lookAt: [0, 0, 0],
88
+ description: 'Side view of scene origin'
89
+ },
90
+ {
91
+ name: 'perspective',
92
+ position: [15, 10, 15],
93
+ lookAt: [0, 0, 0],
94
+ fov: 50,
95
+ description: 'Diagonal perspective view'
96
+ },
97
+ {
98
+ name: 'closeup',
99
+ position: [3, 2, 3],
100
+ lookAt: [0, 0, 0],
101
+ fov: 35,
102
+ description: 'Close-up view for detail inspection'
103
+ },
104
+ {
105
+ name: 'wideangle',
106
+ position: [30, 15, 30],
107
+ lookAt: [0, 0, 0],
108
+ fov: 75,
109
+ description: 'Wide-angle scene overview'
110
+ }
111
+ ];
112
+ // Load default presets on initialization
113
+ DEFAULT_PRESETS.forEach(preset => cameraPresets.savePreset(preset));
114
+ //# sourceMappingURL=camera-presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camera-presets.js","sourceRoot":"","sources":["../src/camera-presets.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * threlte-mcp setup CLI
4
+ *
5
+ * Auto-generates MCP configuration for your IDE.
6
+ *
7
+ * Usage:
8
+ * npx threlte-mcp setup
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
package/dist/cli.js ADDED
@@ -0,0 +1,134 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * threlte-mcp setup CLI
4
+ *
5
+ * Auto-generates MCP configuration for your IDE.
6
+ *
7
+ * Usage:
8
+ * npx threlte-mcp setup
9
+ */
10
+ import { promises as fs } from 'node:fs';
11
+ import { homedir } from 'node:os';
12
+ import { dirname, join } from 'node:path';
13
+ const THRELTE_MCP_CONFIG = {
14
+ command: 'npx',
15
+ args: ['-y', 'threlte-mcp'],
16
+ };
17
+ async function exists(path) {
18
+ try {
19
+ await fs.access(path);
20
+ return true;
21
+ }
22
+ catch {
23
+ return false;
24
+ }
25
+ }
26
+ async function findConfigPath() {
27
+ const home = homedir();
28
+ // Antigravity (Gemini)
29
+ const antigravityDir = join(home, '.gemini', 'antigravity');
30
+ if (await exists(antigravityDir)) {
31
+ return { path: join(antigravityDir, 'mcp_config.json'), type: 'antigravity' };
32
+ }
33
+ // Cursor
34
+ const cursorDir = join(home, '.cursor');
35
+ if (await exists(cursorDir)) {
36
+ return { path: join(cursorDir, 'mcp.json'), type: 'cursor' };
37
+ }
38
+ // Claude Desktop
39
+ const claudeDirWin = join(home, 'AppData', 'Roaming', 'Claude');
40
+ if (await exists(claudeDirWin)) {
41
+ return { path: join(claudeDirWin, 'claude_desktop_config.json'), type: 'claude' };
42
+ }
43
+ const claudeDirMac = join(home, 'Library', 'Application Support', 'Claude');
44
+ if (await exists(claudeDirMac)) {
45
+ return { path: join(claudeDirMac, 'claude_desktop_config.json'), type: 'claude' };
46
+ }
47
+ // Fall back to project-level config
48
+ const projectPath = join(process.cwd(), 'mcp_config.json');
49
+ return { path: projectPath, type: 'generic' };
50
+ }
51
+ async function readConfig(path) {
52
+ try {
53
+ const content = await fs.readFile(path, 'utf-8');
54
+ const parsed = JSON.parse(content);
55
+ if (!parsed.mcpServers || typeof parsed.mcpServers !== 'object') {
56
+ parsed.mcpServers = {};
57
+ }
58
+ return parsed;
59
+ }
60
+ catch {
61
+ return { mcpServers: {} };
62
+ }
63
+ }
64
+ async function writeConfig(path, config) {
65
+ // Ensure directory exists
66
+ const dir = dirname(path);
67
+ await fs.mkdir(dir, { recursive: true });
68
+ await fs.writeFile(path, JSON.stringify(config, null, 2), 'utf-8');
69
+ }
70
+ async function setup() {
71
+ console.log('🎮 threlte-mcp Setup');
72
+ console.log('═══════════════════════════════════════');
73
+ console.log('');
74
+ const { path, type } = await findConfigPath();
75
+ console.log(`📍 Config location: ${path}`);
76
+ console.log(`📌 IDE type: ${type}`);
77
+ console.log('');
78
+ const config = await readConfig(path);
79
+ // Check if already configured
80
+ if (config.mcpServers['threlte-mcp'] || config.mcpServers['threlte']) {
81
+ console.log('✅ threlte-mcp is already configured!');
82
+ console.log('');
83
+ printNextSteps();
84
+ return;
85
+ }
86
+ // Add threlte-mcp config
87
+ config.mcpServers['threlte-mcp'] = THRELTE_MCP_CONFIG;
88
+ await writeConfig(path, config);
89
+ console.log('✅ Added threlte-mcp to your MCP configuration!');
90
+ console.log('');
91
+ printNextSteps();
92
+ }
93
+ function printNextSteps() {
94
+ console.log('═══════════════════════════════════════');
95
+ console.log('📋 Next Steps:');
96
+ console.log('');
97
+ console.log('1. Restart your IDE to load the new MCP server');
98
+ console.log('');
99
+ console.log('2. Add the MCPBridge component to your Threlte app:');
100
+ console.log('');
101
+ console.log(' ```svelte');
102
+ console.log(' <script>');
103
+ console.log(" import { MCPBridgeComponent } from 'threlte-mcp/client';");
104
+ console.log(' </script>');
105
+ console.log('');
106
+ console.log(' <MCPBridgeComponent />');
107
+ console.log(' ```');
108
+ console.log('');
109
+ console.log('3. Run your app in development mode (npm run dev)');
110
+ console.log('');
111
+ console.log('═══════════════════════════════════════');
112
+ console.log('🎮 The AI can now inspect and manipulate your scene!');
113
+ }
114
+ // Check if running as CLI
115
+ const args = process.argv.slice(2);
116
+ if (args[0] === 'setup') {
117
+ setup().catch((error) => {
118
+ console.error('❌ Setup failed:', error.message);
119
+ process.exit(1);
120
+ });
121
+ }
122
+ else if (args.length === 0 || args[0] === 'serve' || args[0] === 'start') {
123
+ // Default: run the MCP server
124
+ import('./index.js');
125
+ }
126
+ else {
127
+ console.log('threlte-mcp - MCP server for Three.js/Threlte scenes');
128
+ console.log('');
129
+ console.log('Commands:');
130
+ console.log(' npx threlte-mcp Start the MCP server');
131
+ console.log(' npx threlte-mcp setup Configure IDE for threlte-mcp');
132
+ console.log('');
133
+ }
134
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * MCPBridge - Client-side WebSocket bridge for threlte-mcp
3
+ *
4
+ * Enables real-time Three.js/Threlte scene manipulation via MCP commands.
5
+ * Auto-connects in development mode (import.meta.env.DEV).
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { MCPBridge } from 'threlte-mcp/client';
10
+ *
11
+ * // Create bridge (auto-connects in dev mode)
12
+ * const bridge = new MCPBridge(scene);
13
+ *
14
+ * // Call update() in your render loop for animations
15
+ * bridge.update();
16
+ * ```
17
+ */
18
+ import * as THREE from 'three';
19
+ export interface MCPBridgeOptions {
20
+ /** WebSocket URL (default: ws://127.0.0.1:8083) */
21
+ url?: string;
22
+ /** Auto-connect on creation (default: true in dev mode) */
23
+ autoConnect?: boolean;
24
+ /** Reconnect delay in ms (default: 60000) */
25
+ reconnectDelay?: number;
26
+ /** Max tree depth for scene state (default: 10) */
27
+ maxDepth?: number;
28
+ }
29
+ interface SceneObjectData {
30
+ name: string;
31
+ path: string;
32
+ type: string;
33
+ position: string;
34
+ children: number;
35
+ }
36
+ export declare class MCPBridge {
37
+ private ws;
38
+ private scene;
39
+ private reconnectTimeout;
40
+ private options;
41
+ private rotatingObjects;
42
+ private objects;
43
+ private cameraTween;
44
+ private cameraLookAt;
45
+ constructor(scene: THREE.Scene, options?: MCPBridgeOptions);
46
+ /**
47
+ * Connect to the MCP WebSocket server
48
+ */
49
+ connect(): void;
50
+ /**
51
+ * Disconnect from the MCP server
52
+ */
53
+ disconnect(): void;
54
+ /**
55
+ * Update loop - call this in your render/animation loop
56
+ */
57
+ update(): void;
58
+ /**
59
+ * Check if connected to MCP server
60
+ */
61
+ isConnected(): boolean;
62
+ private scheduleReconnect;
63
+ private sendSceneState;
64
+ private sendResponse;
65
+ private handleCommand;
66
+ getSceneState(maxDepth?: number): SceneObjectData[];
67
+ findObjects(filter: {
68
+ name?: string;
69
+ nameContains?: string;
70
+ type?: string;
71
+ }): SceneObjectData[];
72
+ private getObjectPath;
73
+ private findObject;
74
+ private moveObject;
75
+ private setTransform;
76
+ private setVisibility;
77
+ private lookAt;
78
+ private setOpacity;
79
+ private getActiveCamera;
80
+ private getCameraLookAt;
81
+ private getCameraState;
82
+ private setCameraPosition;
83
+ private addPrimitive;
84
+ private removeObject;
85
+ private duplicateObject;
86
+ private addLight;
87
+ }
88
+ /**
89
+ * Get or create the global MCPBridge instance
90
+ */
91
+ export declare function getMCPBridge(scene?: THREE.Scene): MCPBridge | null;
92
+ export {};
93
+ //# sourceMappingURL=MCPBridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MCPBridge.d.ts","sourceRoot":"","sources":["../../client/MCPBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,gBAAgB;IAC7B,mDAAmD;IACnD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAQD,UAAU,eAAe;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAiBD,qBAAa,SAAS;IAClB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,eAAe,CAA6C;IACpE,OAAO,CAAC,OAAO,CAA0C;IACzD,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,YAAY,CAA8B;gBAEtC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,GAAE,gBAAqB;IA2B9D;;OAEG;IACH,OAAO,IAAI,IAAI;IA+Bf;;OAEG;IACH,UAAU,IAAI,IAAI;IAWlB;;OAEG;IACH,MAAM,IAAI,IAAI;IA0Dd;;OAEG;IACH,WAAW,IAAI,OAAO;IAQtB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,aAAa;IA8FrB,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,eAAe,EAAE;IA8BnD,WAAW,CAAC,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,eAAe,EAAE;IAyB/F,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,cAAc;IAqBtB,OAAO,CAAC,iBAAiB;IAkFzB,OAAO,CAAC,YAAY;IAuCpB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,eAAe;IAuBvB,OAAO,CAAC,QAAQ;CAiCnB;AAYD;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,SAAS,GAAG,IAAI,CAOlE"}