import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
import type {
ServerConfig,
StdioServerConfig,
SseServerConfig,
StreamableHttpServerConfig,
} from "../config/schema.js";
import { TransportError } from "../utils/errors.js";
import logger from "../utils/logger.js";
export function createTransport(serverId: string, config: ServerConfig): Transport {
logger.debug(`Creating ${config.transport} transport for ${serverId}`);
switch (config.transport) {
case "stdio":
return createStdioTransport(config);
case "sse":
return createSseTransport(config);
case "streamable-http":
return createStreamableHttpTransport(config);
default:
throw new TransportError(
(config as { transport: string }).transport,
`Unknown transport type: ${(config as { transport: string }).transport}`
);
}
}
function createStdioTransport(config: StdioServerConfig): StdioClientTransport {
return new StdioClientTransport({
command: config.command,
args: config.args ?? [],
env: config.env
? { ...process.env as Record<string, string>, ...config.env }
: undefined,
});
}
function createSseTransport(config: SseServerConfig): SSEClientTransport {
return new SSEClientTransport(
new URL(config.url),
{
requestInit: config.headers
? { headers: config.headers }
: undefined,
}
);
}
function createStreamableHttpTransport(config: StreamableHttpServerConfig): StreamableHTTPClientTransport {
return new StreamableHTTPClientTransport(
new URL(config.url),
{
requestInit: config.headers
? { headers: config.headers }
: undefined,
}
);
}