Skip to content

Commit 413db00

Browse files
authored
Merge branch 'main' into dev/eh/tool-meta-support
2 parents 444c6b5 + 1ea8e9a commit 413db00

File tree

6 files changed

+75
-24
lines changed

6 files changed

+75
-24
lines changed

.github/workflows/cli_tests.yml

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
name: CLI Tests
2+
3+
on:
4+
push:
5+
paths:
6+
- "cli/**"
7+
pull_request:
8+
paths:
9+
- "cli/**"
10+
11+
jobs:
12+
test:
13+
runs-on: ubuntu-latest
14+
defaults:
15+
run:
16+
working-directory: ./cli
17+
steps:
18+
- uses: actions/checkout@v4
19+
20+
- name: Set up Node.js
21+
uses: actions/setup-node@v4
22+
with:
23+
node-version-file: package.json
24+
cache: npm
25+
26+
- name: Install dependencies
27+
run: |
28+
cd ..
29+
npm ci --ignore-scripts
30+
31+
- name: Build CLI
32+
run: npm run build
33+
34+
- name: Explicitly pre-install test dependencies
35+
run: npx -y @modelcontextprotocol/server-everything --help || true
36+
37+
- name: Run tests
38+
run: npm test
39+
env:
40+
NPM_CONFIG_YES: true
41+
CI: true

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ npx @modelcontextprotocol/inspector --cli node build/index.js --method prompts/l
315315
npx @modelcontextprotocol/inspector --cli https://my-mcp-server.example.com
316316

317317
# Connect to a remote MCP server (with Streamable HTTP transport)
318-
npx @modelcontextprotocol/inspector --cli https://my-mcp-server.example.com --transport http
318+
npx @modelcontextprotocol/inspector --cli https://my-mcp-server.example.com --transport http --method tools/list
319319

320320
# Call a tool on a remote server
321321
npx @modelcontextprotocol/inspector --cli https://my-mcp-server.example.com --method tools/call --tool-name remotetool --tool-arg param=value

cli/scripts/cli-tests.js

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const colors = {
1212

1313
import fs from "fs";
1414
import path from "path";
15-
import { execSync, spawn } from "child_process";
15+
import { spawn } from "child_process";
1616
import os from "os";
1717
import { fileURLToPath } from "url";
1818

@@ -680,7 +680,7 @@ async function runTests() {
680680
// Test 26: HTTP transport with explicit --transport http flag
681681
await runBasicTest(
682682
"http_transport_with_explicit_flag",
683-
"http://127.0.0.1:3001",
683+
"http://127.0.0.1:3001/mcp",
684684
"--transport",
685685
"http",
686686
"--cli",
@@ -710,6 +710,26 @@ async function runTests() {
710710
"tools/list",
711711
);
712712

713+
// Test 29: HTTP transport without URL (should fail)
714+
await runErrorTest(
715+
"http_transport_without_url",
716+
"--transport",
717+
"http",
718+
"--cli",
719+
"--method",
720+
"tools/list",
721+
);
722+
723+
// Test 30: SSE transport without URL (should fail)
724+
await runErrorTest(
725+
"sse_transport_without_url",
726+
"--transport",
727+
"sse",
728+
"--cli",
729+
"--method",
730+
"tools/list",
731+
);
732+
713733
// Kill HTTP server
714734
try {
715735
process.kill(-httpServer.pid);

cli/src/cli.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ async function main(): Promise<void> {
233233
const args = parseArgs();
234234

235235
if (args.cli) {
236-
runCli(args);
236+
await runCli(args);
237237
} else {
238238
await runWebClient(args);
239239
}

cli/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,8 @@ async function main(): Promise<void> {
287287
try {
288288
const args = parseArgs();
289289
await callMethod(args);
290+
// Explicitly exit to ensure process terminates in CI
291+
process.exit(0);
290292
} catch (error) {
291293
handleError(error);
292294
}

cli/src/transport.ts

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,6 @@ export type TransportOptions = {
1414
url?: string;
1515
};
1616

17-
function createSSETransport(options: TransportOptions): Transport {
18-
const baseUrl = new URL(options.url ?? "");
19-
const sseUrl = baseUrl.pathname.endsWith("/sse")
20-
? baseUrl
21-
: new URL("/sse", baseUrl);
22-
23-
return new SSEClientTransport(sseUrl);
24-
}
25-
26-
function createHTTPTransport(options: TransportOptions): Transport {
27-
const baseUrl = new URL(options.url ?? "");
28-
const mcpUrl = baseUrl.pathname.endsWith("/mcp")
29-
? baseUrl
30-
: new URL("/mcp", baseUrl);
31-
32-
return new StreamableHTTPClientTransport(mcpUrl);
33-
}
34-
3517
function createStdioTransport(options: TransportOptions): Transport {
3618
let args: string[] = [];
3719

@@ -75,12 +57,18 @@ export function createTransport(options: TransportOptions): Transport {
7557
return createStdioTransport(options);
7658
}
7759

60+
// If not STDIO, then it must be either SSE or HTTP.
61+
if (!options.url) {
62+
throw new Error("URL must be provided for SSE or HTTP transport types.");
63+
}
64+
const url = new URL(options.url);
65+
7866
if (transportType === "sse") {
79-
return createSSETransport(options);
67+
return new SSEClientTransport(url);
8068
}
8169

8270
if (transportType === "http") {
83-
return createHTTPTransport(options);
71+
return new StreamableHTTPClientTransport(url);
8472
}
8573

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

0 commit comments

Comments
 (0)