UNPKG

touchdesigner-mcp-server

Version:
84 lines (83 loc) 2.83 kB
import { createErrorResult, createSuccessResult } from "../core/result.js"; /** * Manages the connection between TouchDesignerServer and MCP transport */ export class ConnectionManager { server; logger; tdClient; transport = null; constructor(server, logger, tdClient) { this.server = server; this.logger = logger; this.tdClient = tdClient; } /** * Connect to MCP transport */ async connect(transport) { if (this.isConnected()) { this.logger.log("MCP server already connected"); return createSuccessResult(undefined); } this.transport = transport; try { await this.server.connect(transport); this.logger.log(`Server connected and ready to process requests: ${process.env.TD_WEB_SERVER_HOST}:${process.env.TD_WEB_SERVER_PORT}`); const connectionResult = await this.checkTDConnection(); if (!connectionResult.success) { throw new Error(`Failed to connect to TouchDesigner: ${connectionResult.error.message}`); } return createSuccessResult(undefined); } catch (error) { this.transport = null; const err = error instanceof Error ? error : new Error(String(error)); console.error("Fatal error starting server! Check TouchDesigner setup and starting webserver.", err); return createErrorResult(err); } } /** * Disconnect from MCP transport */ async disconnect() { if (!this.isConnected()) { console.log("MCP server not connected"); return createSuccessResult(undefined); } try { await this.server.close(); console.log("MCP server disconnected from MCP"); this.transport = null; return createSuccessResult(undefined); } catch (error) { const err = error instanceof Error ? error : new Error(String(error)); console.error("Error disconnecting from server", err); return createErrorResult(err); } } /** * Check if connected to MCP transport */ isConnected() { return this.transport !== null; } /** * Check connection to TouchDesigner */ async checkTDConnection() { this.logger.log("Testing connection to TouchDesigner server..."); try { const result = await this.tdClient.getTdInfo(); if (!result.success) { throw result.error; } return createSuccessResult(result.data); } catch (error) { const err = error instanceof Error ? error : new Error(String(error)); return createErrorResult(err); } } }