touchdesigner-mcp-server
Version:
MCP server for TouchDesigner
84 lines (83 loc) • 2.83 kB
JavaScript
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);
}
}
}