@todo-for-ai/mcp
Version:
Model Context Protocol server for Todo for AI task management system with Streamable HTTP transport. Provides AI assistants with access to task management, project information, and feedback submission capabilities through modern HTTP-based communication.
99 lines • 4.25 kB
JavaScript
import { StdioTransport } from './stdio.js';
import { logger } from '../logger.js';
/**
* Factory for creating transport instances based on configuration and environment
*/
export class TransportFactory {
/**
* Create a transport instance based on configuration and environment detection
*/
static create(config) {
// Currently always use stdio - HTTP transport code preserved for future use
logger.info('[TRANSPORT_FACTORY] Creating stdio transport', {
transport: 'stdio',
processId: process.pid,
reason: 'stdio-only mode (HTTP preserved for future)'
});
// Always return stdio transport for now
return new StdioTransport();
// HTTP transport code preserved for future use:
// const transportType = TransportFactory.detectTransportType(config);
// switch (transportType) {
// case 'stdio':
// return new StdioTransport();
// case 'http':
// const httpConfig: HttpTransportConfig = {
// port: config.httpPort,
// host: config.httpHost,
// sessionTimeout: config.sessionTimeout,
// enableDnsRebindingProtection: config.enableDnsRebindingProtection,
// allowedOrigins: config.allowedOrigins,
// maxConnections: config.maxConnections
// };
// return new HttpTransport(httpConfig);
// default:
// throw new Error(`Unsupported transport type: ${transportType}`);
// }
}
// HTTP transport detection methods (preserved for future use)
// Currently disabled - only stdio transport is used
/**
* Detect the appropriate transport type based on environment and configuration
* Currently always returns 'stdio' - HTTP detection preserved for future use
*/
static detectTransportType(config) {
// Future: uncomment to enable HTTP transport detection
// if (config.transport && config.transport !== 'auto') {
// return config.transport;
// }
// const environment = TransportFactory.analyzeEnvironment();
// if (environment.hasHttpFlags) {
// return 'http';
// }
// Always use stdio for now
return 'stdio';
}
/**
* Analyze the current environment to determine the best transport
* Preserved for future HTTP transport re-enablement
*/
static analyzeEnvironment() {
const argv = process.argv;
const env = process.env;
// Check for HTTP-specific flags
const httpFlags = [
'--http-port', '--http-host', '--transport=http',
'--session-timeout', '--dns-protection', '--allowed-origins', '--max-connections'
];
const hasHttpFlags = httpFlags.some(flag => {
const flagName = flag.split('=')[0];
return flagName && argv.some(arg => arg && arg.includes(flagName));
});
// Check environment variables for HTTP transport
const httpEnvVars = [
'TODO_HTTP_PORT', 'TODO_HTTP_HOST', 'TODO_SESSION_TIMEOUT',
'TODO_DNS_PROTECTION', 'TODO_ALLOWED_ORIGINS', 'TODO_MAX_CONNECTIONS'
];
const hasHttpEnvVars = httpEnvVars.some(envVar => env[envVar]);
const isInteractive = Boolean(process.stdin.isTTY);
const hasStdio = Boolean(process.stdin && process.stdout);
const isTTY = Boolean(process.stdin.isTTY && process.stdout.isTTY);
// Check if we're likely being called by an MCP client
const likelyMcpClient = !isInteractive && hasStdio && !hasHttpFlags && !hasHttpEnvVars;
return {
isInteractive,
hasStdio,
isTTY,
hasHttpFlags: hasHttpFlags || hasHttpEnvVars,
httpFlags: httpFlags.filter(flag => {
const flagName = flag.split('=')[0];
return flagName && argv.some(arg => arg && arg.includes(flagName));
}),
likelyMcpClient,
processId: process.pid,
argv: argv.slice(2), // Remove node and script path
parentPid: process.ppid
};
}
}
//# sourceMappingURL=factory.js.map