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.
- package/LICENSE +21 -0
- package/README.md +306 -0
- package/dist/bridge-server.d.ts +101 -0
- package/dist/bridge-server.d.ts.map +1 -0
- package/dist/bridge-server.js +155 -0
- package/dist/bridge-server.js.map +1 -0
- package/dist/camera-presets.d.ts +62 -0
- package/dist/camera-presets.d.ts.map +1 -0
- package/dist/camera-presets.js +114 -0
- package/dist/camera-presets.js.map +1 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +134 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/MCPBridge.d.ts +93 -0
- package/dist/client/MCPBridge.d.ts.map +1 -0
- package/dist/client/MCPBridge.js +580 -0
- package/dist/client/MCPBridge.js.map +1 -0
- package/dist/client/MCPBridge.svelte +59 -0
- package/dist/client/index.d.ts +18 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +18 -0
- package/dist/client/index.js.map +1 -0
- package/dist/gltf-io.d.ts +11 -0
- package/dist/gltf-io.d.ts.map +1 -0
- package/dist/gltf-io.js +64 -0
- package/dist/gltf-io.js.map +1 -0
- package/dist/gltf-tools.d.ts +120 -0
- package/dist/gltf-tools.d.ts.map +1 -0
- package/dist/gltf-tools.js +360 -0
- package/dist/gltf-tools.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +808 -0
- package/dist/index.js.map +1 -0
- package/dist/svelte-generator.d.ts +17 -0
- package/dist/svelte-generator.d.ts.map +1 -0
- package/dist/svelte-generator.js +154 -0
- package/dist/svelte-generator.js.map +1 -0
- package/package.json +86 -0
|
@@ -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 @@
|
|
|
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
|
package/dist/cli.js.map
ADDED
|
@@ -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"}
|