import { z } from "zod"; import { formatErrorForMcp } from "../utils/errors.js"; export function registerProjectTools(server, godot) { server.tool("get_project_info", "Get Godot project metadata including name, version, viewport settings, renderer, and autoloads", {}, async () => { try { const result = await godot.sendCommand("get_project_info"); return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] }; } catch (e) { return { content: [{ type: "text", text: formatErrorForMcp(e) }], isError: true }; } }); server.tool("get_filesystem_tree", "Get the project's file/directory tree with optional filtering by extension (e.g. *.gd, *.tscn)", { path: z.string().optional().describe("Root path to scan (default: res://)"), filter: z.string().optional().describe("Glob filter pattern (e.g. '*.gd', '*.tscn')"), max_depth: z.number().optional().describe("Maximum directory depth to scan (default: 10)"), }, async (params) => { try { const result = await godot.sendCommand("get_filesystem_tree", params); return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] }; } catch (e) { return { content: [{ type: "text", text: formatErrorForMcp(e) }], isError: true }; } }); server.tool("search_files", "Search for files by name using fuzzy matching or glob patterns", { query: z.string().describe("Search query (fuzzy match or glob pattern)"), path: z.string().optional().describe("Root path to search (default: res://)"), file_type: z.string().optional().describe("Filter by file extension (e.g. 'gd', 'tscn')"), max_results: z.number().optional().describe("Maximum results to return (default: 50)"), }, async (params) => { try { const result = await godot.sendCommand("search_files", params); return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] }; } catch (e) { return { content: [{ type: "text", text: formatErrorForMcp(e) }], isError: true }; } }); server.tool("search_in_files", "Search for text content inside project files (grep-like). Searches through GDScript, scenes, resources, shaders, and other text files. Skips addons/ and .godot/ directories.", { query: z.string().describe("Text to search for (plain text or regex pattern)"), path: z.string().optional().describe("Root path to search (default: res://)"), regex: z.boolean().optional().describe("Use regex matching (default: false)"), file_type: z.string().optional().describe("Filter by file extension (e.g. 'gd', 'tscn'). Default: all text files"), max_results: z.number().optional().describe("Maximum results to return (default: 50)"), }, async (params) => { try { const result = await godot.sendCommand("search_in_files", params); return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] }; } catch (e) { return { content: [{ type: "text", text: formatErrorForMcp(e) }], isError: true }; } }); server.tool("get_project_settings", "Read project.godot settings by section or specific key", { section: z.string().optional().describe("Settings section prefix (e.g. 'display/window')"), key: z.string().optional().describe("Specific setting key (e.g. 'display/window/size/viewport_width')"), }, async (params) => { try { const result = await godot.sendCommand("get_project_settings", params); return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] }; } catch (e) { return { content: [{ type: "text", text: formatErrorForMcp(e) }], isError: true }; } }); server.tool("set_project_setting", "Set a project setting value (e.g. viewport size, main scene). Saves to project.godot via the editor API.", { key: z.string().describe("Setting key (e.g. 'display/window/size/viewport_width', 'application/run/main_scene')"), value: z.union([z.string(), z.number(), z.boolean()]).describe("Value to set. Strings are auto-parsed for Vector2, bool, int, float."), }, async (params) => { try { const result = await godot.sendCommand("set_project_setting", params); return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] }; } catch (e) { return { content: [{ type: "text", text: formatErrorForMcp(e) }], isError: true }; } }); server.tool("uid_to_project_path", "Convert a Godot UID (uid://...) to a project resource path (res://...)", { uid: z.string().describe("The UID string (e.g. 'uid://abc123')"), }, async (params) => { try { const result = await godot.sendCommand("uid_to_project_path", params); return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] }; } catch (e) { return { content: [{ type: "text", text: formatErrorForMcp(e) }], isError: true }; } }); server.tool("project_path_to_uid", "Convert a project resource path (res://...) to its UID (uid://...)", { path: z.string().describe("The resource path (e.g. 'res://scenes/player.tscn')"), }, async (params) => { try { const result = await godot.sendCommand("project_path_to_uid", params); return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] }; } catch (e) { return { content: [{ type: "text", text: formatErrorForMcp(e) }], isError: true }; } }); server.tool("add_autoload", "Add an autoload (singleton) to the project. The script/scene will be auto-loaded when the project starts.", { name: z.string().describe("Autoload name (e.g. 'GameManager', 'AudioManager')"), path: z.string().describe("Path to the script or scene file (e.g. 'res://scripts/autoload/game_manager.gd')"), }, async (params) => { try { const result = await godot.sendCommand("add_autoload", params); return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] }; } catch (e) { return { content: [{ type: "text", text: formatErrorForMcp(e) }], isError: true }; } }); server.tool("remove_autoload", "Remove an autoload (singleton) from the project settings", { name: z.string().describe("Autoload name to remove (e.g. 'GameManager')"), }, async (params) => { try { const result = await godot.sendCommand("remove_autoload", params); return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] }; } catch (e) { return { content: [{ type: "text", text: formatErrorForMcp(e) }], isError: true }; } }); } //# sourceMappingURL=project-tools.js.map