138 lines
6.3 KiB
JavaScript
138 lines
6.3 KiB
JavaScript
#!/usr/bin/env node
|
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
import { createServer } from "node:http";
|
|
import { randomUUID } from "node:crypto";
|
|
import { GodotConnection } from "./godot-connection.js";
|
|
import { registerProjectTools } from "./tools/project-tools.js";
|
|
import { registerSceneTools } from "./tools/scene-tools.js";
|
|
import { registerNodeTools } from "./tools/node-tools.js";
|
|
import { registerScriptTools } from "./tools/script-tools.js";
|
|
import { registerEditorTools } from "./tools/editor-tools.js";
|
|
import { registerInputTools } from "./tools/input-tools.js";
|
|
import { registerRuntimeTools } from "./tools/runtime-tools.js";
|
|
import { registerAnimationTools } from "./tools/animation-tools.js";
|
|
import { registerTilemapTools } from "./tools/tilemap-tools.js";
|
|
import { registerThemeTools } from "./tools/theme-tools.js";
|
|
import { registerProfilingTools } from "./tools/profiling-tools.js";
|
|
import { registerBatchTools } from "./tools/batch-tools.js";
|
|
import { registerShaderTools } from "./tools/shader-tools.js";
|
|
import { registerExportTools } from "./tools/export-tools.js";
|
|
import { registerResourceTools } from "./tools/resource-tools.js";
|
|
import { registerAnimationTreeTools } from "./tools/animation-tree-tools.js";
|
|
import { registerPhysicsTools } from "./tools/physics-tools.js";
|
|
import { registerScene3DTools } from "./tools/scene-3d-tools.js";
|
|
import { registerParticleTools } from "./tools/particle-tools.js";
|
|
import { registerNavigationTools } from "./tools/navigation-tools.js";
|
|
import { registerAudioTools } from "./tools/audio-tools.js";
|
|
import { registerTestTools } from "./tools/test-tools.js";
|
|
import { registerAnalysisTools } from "./tools/analysis-tools.js";
|
|
import { registerInputMapTools } from "./tools/input-map-tools.js";
|
|
import { registerAndroidTools } from "./tools/android-tools.js";
|
|
import { MINIMAL_TOOLS, createFilteredServer } from "./utils/tool-filter.js";
|
|
import { loadInstructions } from "./utils/load-instructions.js";
|
|
const MINIMAL_MODE = process.argv.includes("--minimal");
|
|
const THREED_MODE = process.argv.includes("--3d");
|
|
const LITE_MODE = process.argv.includes("--lite") || MINIMAL_MODE || THREED_MODE;
|
|
const HTTP_MODE = process.argv.includes("--http");
|
|
const HTTP_PORT = parseInt(process.argv.find((_, i, a) => a[i - 1] === "--http-port") ||
|
|
process.env.GODOT_MCP_HTTP_PORT ||
|
|
"8001");
|
|
const explicitPort = process.env.GODOT_MCP_PORT;
|
|
const godot = new GodotConnection(parseInt(explicitPort || "6505"), !!explicitPort);
|
|
const serverName = MINIMAL_MODE
|
|
? "godot-mcp-pro-minimal"
|
|
: THREED_MODE
|
|
? "godot-mcp-pro-3d"
|
|
: LITE_MODE
|
|
? "godot-mcp-pro-lite"
|
|
: "godot-mcp-pro";
|
|
const server = new McpServer({
|
|
name: serverName,
|
|
version: "1.14.1",
|
|
}, {
|
|
instructions: loadInstructions(),
|
|
});
|
|
// In minimal mode, wrap the server to filter tool registrations
|
|
const toolServer = MINIMAL_MODE ? createFilteredServer(server, MINIMAL_TOOLS) : server;
|
|
// Core tools (always registered)
|
|
registerProjectTools(toolServer, godot);
|
|
registerSceneTools(toolServer, godot);
|
|
registerNodeTools(toolServer, godot);
|
|
registerScriptTools(toolServer, godot);
|
|
registerEditorTools(toolServer, godot);
|
|
registerInputTools(toolServer, godot);
|
|
registerRuntimeTools(toolServer, godot);
|
|
registerInputMapTools(toolServer, godot);
|
|
// 3D-critical tools (registered in FULL and --3d modes)
|
|
// Core (81) + Physics (6) + AnimationTree (8) + Navigation (5) = exactly 100 tools
|
|
if (!LITE_MODE || THREED_MODE) {
|
|
registerPhysicsTools(server, godot);
|
|
registerAnimationTreeTools(server, godot);
|
|
registerNavigationTools(server, godot);
|
|
}
|
|
// Extended tools (Full mode only)
|
|
if (!LITE_MODE) {
|
|
registerAnimationTools(server, godot);
|
|
registerAudioTools(server, godot);
|
|
registerBatchTools(server, godot);
|
|
registerExportTools(server, godot);
|
|
registerParticleTools(server, godot);
|
|
registerProfilingTools(server, godot);
|
|
registerResourceTools(server, godot);
|
|
registerScene3DTools(server, godot);
|
|
registerShaderTools(server, godot);
|
|
registerTestTools(server, godot);
|
|
registerThemeTools(server, godot);
|
|
registerTilemapTools(server, godot);
|
|
registerAnalysisTools(server, godot);
|
|
registerAndroidTools(server, godot);
|
|
}
|
|
// Start server
|
|
async function main() {
|
|
// Attempt initial connection to Godot (non-blocking).
|
|
// If this fails (all ports occupied, etc.), tool calls will fail with a
|
|
// clear error message from sendCommand until the user restarts the server.
|
|
godot.connect().catch((err) => {
|
|
console.error(`[MCP] Failed to start WebSocket server: ${err.message}`);
|
|
});
|
|
if (HTTP_MODE) {
|
|
// Streamable HTTP transport — clients connect via http://host:port/mcp
|
|
const transport = new StreamableHTTPServerTransport({
|
|
sessionIdGenerator: () => randomUUID(),
|
|
});
|
|
await server.connect(transport);
|
|
const httpServer = createServer(async (req, res) => {
|
|
const url = new URL(req.url || "/", `http://${req.headers.host}`);
|
|
if (url.pathname === "/mcp") {
|
|
await transport.handleRequest(req, res);
|
|
}
|
|
else {
|
|
res.writeHead(404).end("Not Found");
|
|
}
|
|
});
|
|
httpServer.listen(HTTP_PORT, () => {
|
|
const mode = MINIMAL_MODE ? "MINIMAL " : THREED_MODE ? "3D " : LITE_MODE ? "LITE " : "";
|
|
console.error(`[MCP] Godot MCP Pro ${mode}started (HTTP transport on http://127.0.0.1:${HTTP_PORT}/mcp)`);
|
|
});
|
|
}
|
|
else {
|
|
// Default stdio transport
|
|
const transport = new StdioServerTransport();
|
|
await server.connect(transport);
|
|
const modeLabel = MINIMAL_MODE
|
|
? "[MCP] Godot MCP Pro MINIMAL started (35 tools, stdio transport)"
|
|
: THREED_MODE
|
|
? "[MCP] Godot MCP Pro 3D started (100 tools, stdio transport)"
|
|
: LITE_MODE
|
|
? "[MCP] Godot MCP Pro LITE started (81 tools, stdio transport)"
|
|
: "[MCP] Godot MCP Pro started (stdio transport)";
|
|
console.error(modeLabel);
|
|
}
|
|
}
|
|
main().catch((err) => {
|
|
console.error("[MCP] Fatal error:", err);
|
|
process.exit(1);
|
|
});
|
|
//# sourceMappingURL=index.js.map
|