UNPKG

touchdesigner-mcp-server

Version:
81 lines (80 loc) 2.58 kB
import { McpServer } from "@modelcontextprotocol/server"; import { ConsoleLogger } from "../core/logger.js"; import { MCP_SERVER_VERSION } from "../core/version.js"; import { registerPrompts } from "../features/prompts/index.js"; import { registerTools } from "../features/tools/index.js"; import { createTouchDesignerClient } from "../tdClient/index.js"; import { ConnectionManager } from "./connectionManager.js"; /** * TouchDesigner MCP Server implementation */ export class TouchDesignerServer { server; logger; tdClient; connectionManager; /** * Initialize TouchDesignerServer with proper dependency injection */ constructor(params = {}) { this.server = new McpServer({ name: "TouchDesigner", version: MCP_SERVER_VERSION, }, { capabilities: { prompts: {}, tools: {}, }, }); this.logger = new ConsoleLogger(); this.tdClient = params.tdClient ?? createTouchDesignerClient({ logger: this.logger }); this.connectionManager = new ConnectionManager(this.server, this.logger); this.registerAllFeatures(); } /** * Create a new TouchDesignerServer instance * * Factory method for creating server instances in multi-session scenarios. * Each session should have its own server instance to maintain independent MCP protocol state. * * @returns McpServer instance ready for connection to a transport * * @example * ```typescript * // In TransportRegistry * const serverFactory = () => TouchDesignerServer.create(); * const transport = await registry.getOrCreate(sessionId, body, serverFactory); * ``` */ static create(params = {}) { const instance = new TouchDesignerServer(params); return instance.server; } /** * Connect to MCP transport */ async connect(transport) { return this.connectionManager.connect(transport); } /** * Disconnect from MCP transport */ async disconnect() { return this.connectionManager.disconnect(); } /** * Check if connected to MCP transport */ isConnectedToMCP() { return this.connectionManager.isConnected(); } /** * Register all features with the server * Only called after all dependencies are initialized */ registerAllFeatures() { registerPrompts(this.server, this.logger); registerTools(this.server, this.logger, this.tdClient); } }