Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion cli/scripts/cli-tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -680,7 +680,7 @@ async function runTests() {
// Test 26: HTTP transport with explicit --transport http flag
await runBasicTest(
"http_transport_with_explicit_flag",
"http://127.0.0.1:3001",
"http://127.0.0.1:3001/mcp",
"--transport",
"http",
"--cli",
Expand Down Expand Up @@ -710,6 +710,26 @@ async function runTests() {
"tools/list",
);

// Test 29: HTTP transport without URL (should fail)
await runErrorTest(
"http_transport_without_url",
"--transport",
"http",
"--cli",
"--method",
"tools/list",
);

// Test 30: SSE transport without URL (should fail)
await runErrorTest(
"sse_transport_without_url",
"--transport",
"sse",
"--cli",
"--method",
"tools/list",
);

// Kill HTTP server
try {
process.kill(-httpServer.pid);
Expand Down
28 changes: 8 additions & 20 deletions cli/src/transport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,24 +14,6 @@ export type TransportOptions = {
url?: string;
};

function createSSETransport(options: TransportOptions): Transport {
const baseUrl = new URL(options.url ?? "");
const sseUrl = baseUrl.pathname.endsWith("/sse")
? baseUrl
: new URL("/sse", baseUrl);

return new SSEClientTransport(sseUrl);
}

function createHTTPTransport(options: TransportOptions): Transport {
const baseUrl = new URL(options.url ?? "");
const mcpUrl = baseUrl.pathname.endsWith("/mcp")
? baseUrl
: new URL("/mcp", baseUrl);

return new StreamableHTTPClientTransport(mcpUrl);
}

function createStdioTransport(options: TransportOptions): Transport {
let args: string[] = [];

Expand Down Expand Up @@ -75,12 +57,18 @@ export function createTransport(options: TransportOptions): Transport {
return createStdioTransport(options);
}

// If not STDIO, then it must be either SSE or HTTP.
if (!options.url) {
throw new Error("URL must be provided for SSE or HTTP transport types.");
}
const url = new URL(options.url);

if (transportType === "sse") {
return createSSETransport(options);
return new SSEClientTransport(url);
}

if (transportType === "http") {
return createHTTPTransport(options);
return new StreamableHTTPClientTransport(url);
}

throw new Error(`Unsupported transport type: ${transportType}`);
Expand Down