touchdesigner-mcp-server
Version:
MCP server for TouchDesigner
93 lines (92 loc) • 3.23 kB
TypeScript
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
import type { JSONRPCMessage } from "@modelcontextprotocol/sdk/types.js";
import type { ILogger } from "../core/logger.js";
import type { Result } from "../core/result.js";
import type { StreamableHttpTransportConfig } from "./config.js";
import type { ISessionManager } from "./sessionManager.js";
/**
* Transport Registry
*
* Manages per-session transport and server instances for Streamable HTTP transport.
* Each session gets its own isolated transport and server to maintain independent MCP protocol state.
*
* Key Responsibilities:
* - Create new transport + server instances for new sessions
* - Reuse existing transport for requests with valid session IDs
* - Clean up sessions on close or expiration
* - Track active session count for health checks
*
* @example
* ```typescript
* const registry = new TransportRegistry(config, sessionManager, logger);
*
* // In HTTP request handler
* const transport = await registry.getOrCreate(
* sessionId,
* requestBody,
* () => createTouchDesignerServer()
* );
*
* if (transport) {
* await transport.handleRequest(req, res, requestBody);
* }
*
* // On shutdown
* await registry.cleanup();
* ```
*/
export declare class TransportRegistry {
private readonly sessions;
private readonly config;
private readonly sessionManager;
private readonly logger;
constructor(config: StreamableHttpTransportConfig, sessionManager: ISessionManager | null, logger: ILogger);
/**
* Get or create transport for a session
*
* Logic:
* 1. If sessionId exists and valid → return existing transport
* 2. If no sessionId and request is initialize → create new transport + server
* 3. Otherwise → return null (invalid session)
*
* @param sessionId - Session ID from mcp-session-id header (undefined for new sessions)
* @param requestBody - JSON-RPC request body
* @param serverFactory - Factory function to create new Server instances
* @returns Transport instance or null if session is invalid
*/
getOrCreate(sessionId: string | undefined, requestBody: JSONRPCMessage, serverFactory: () => McpServer): Promise<StreamableHTTPServerTransport | null>;
/**
* Create a new session with transport and server instances
*
* @param serverFactory - Factory function to create new Server instances
* @returns Transport instance for the new session
*/
private createSession;
/**
* Remove session from registry
*
* @param sessionId - Session ID to remove
*/
remove(sessionId: string): void;
/**
* Get number of active sessions
*
* @returns Active session count
*/
getCount(): number;
/**
* Get all session IDs
*
* @returns Array of session IDs
*/
getSessionIds(): string[];
/**
* Cleanup all sessions
*
* Called during graceful shutdown to close all active sessions
*
* @returns Result indicating success or failure
*/
cleanup(): Promise<Result<void, Error>>;
}