unity-mcp
Version:
Model Context Protocol server for Unity.
54 lines (53 loc) • 2.56 kB
JavaScript
import fs from 'fs/promises';
import { homedir } from 'os';
import { join, resolve } from 'path';
export class ProjectService {
async listFilesInProject(projectTitle) {
const projectList = await this.listProjects();
const project = projectList.find((p) => p.title === projectTitle);
if (!project) {
throw new Error(`Project with title ${projectTitle} not found`);
}
const files = await this.listFilesInDirectoryRecursively(project.path);
return files;
}
async listProjects() {
const projectListFilePath = this.getUnityProjectsFilePath();
const json = await fs.readFile(projectListFilePath, 'utf-8');
const projectList = JSON.parse(json);
return Object.values(projectList.data).filter((project) => project.title && project.path);
}
getUnityProjectsFilePath() {
const unityHubDirectoryPath = this.getUnityHubDirectoryPath();
return join(unityHubDirectoryPath, 'projects-v1.json');
}
getUnityHubDirectoryPath() {
if (process.platform === 'win32') {
return resolve(homedir(), 'AppData', 'Roaming', 'UnityHub');
}
if (process.platform === 'darwin') {
return resolve(homedir(), 'Library', 'Application Support', 'Unity', 'Hub');
}
return resolve(homedir(), '.config', 'UnityHub');
}
async listFilesInDirectoryRecursively(directoryPath) {
const files = await fs.readdir(directoryPath);
const filesWithStats = await Promise.all(files.map(async (file) => {
const fullPath = join(directoryPath, file);
const stats = await fs.stat(fullPath);
return { fileName: file, fullPath, stats };
}));
const filesInDirectory = filesWithStats.filter((file) => file.stats.isFile() &&
!file.fileName.startsWith('.') &&
!file.fileName.endsWith('.meta') &&
!file.fileName.startsWith('Lightmap'));
const directories = filesWithStats.filter((file) => file.stats.isDirectory());
const ignoredDirectories = ['Library', 'Temp', 'obj', 'bin', '.git'];
const filteredDirectories = directories.filter((directory) => !ignoredDirectories.includes(directory.fileName));
const filesInSubdirectories = await Promise.all(filteredDirectories.map((directory) => this.listFilesInDirectoryRecursively(directory.fullPath)));
return [
...filesInDirectory.map((file) => file.fullPath),
...filesInSubdirectories.flat()
];
}
}