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