Skip to content

Commit 6ab7ac3

Browse files
authored
Merge pull request #294 from shivdeepak/main
add support for Streamable HTTP server
2 parents bbe4924 + 8213402 commit 6ab7ac3

File tree

4 files changed

+37
-6
lines changed

4 files changed

+37
-6
lines changed

client/src/App.tsx

+7-2
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,14 @@ const App = () => {
8181
const [sseUrl, setSseUrl] = useState<string>(() => {
8282
return localStorage.getItem("lastSseUrl") || "http://localhost:3001/sse";
8383
});
84-
const [transportType, setTransportType] = useState<"stdio" | "sse">(() => {
84+
const [transportType, setTransportType] = useState<
85+
"stdio" | "sse" | "streamable-http"
86+
>(() => {
8587
return (
86-
(localStorage.getItem("lastTransportType") as "stdio" | "sse") || "stdio"
88+
(localStorage.getItem("lastTransportType") as
89+
| "stdio"
90+
| "sse"
91+
| "streamable-http") || "stdio"
8792
);
8893
});
8994
const [logLevel, setLogLevel] = useState<LoggingLevel>("debug");

client/src/components/Sidebar.tsx

+4-3
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ import {
3939

4040
interface SidebarProps {
4141
connectionStatus: ConnectionStatus;
42-
transportType: "stdio" | "sse";
43-
setTransportType: (type: "stdio" | "sse") => void;
42+
transportType: "stdio" | "sse" | "streamable-http";
43+
setTransportType: (type: "stdio" | "sse" | "streamable-http") => void;
4444
command: string;
4545
setCommand: (command: string) => void;
4646
args: string;
@@ -117,7 +117,7 @@ const Sidebar = ({
117117
</label>
118118
<Select
119119
value={transportType}
120-
onValueChange={(value: "stdio" | "sse") =>
120+
onValueChange={(value: "stdio" | "sse" | "streamable-http") =>
121121
setTransportType(value)
122122
}
123123
>
@@ -127,6 +127,7 @@ const Sidebar = ({
127127
<SelectContent>
128128
<SelectItem value="stdio">STDIO</SelectItem>
129129
<SelectItem value="sse">SSE</SelectItem>
130+
<SelectItem value="streamable-http">Streamable HTTP</SelectItem>
130131
</SelectContent>
131132
</Select>
132133
</div>

client/src/lib/hooks/useConnection.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ import { getMCPServerRequestTimeout } from "@/utils/configUtils";
4242
import { InspectorConfig } from "../configurationTypes";
4343

4444
interface UseConnectionOptions {
45-
transportType: "stdio" | "sse";
45+
transportType: "stdio" | "sse" | "streamable-http";
4646
command: string;
4747
args: string;
4848
sseUrl: string;

server/src/index.ts

+25
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ import {
1414
} from "@modelcontextprotocol/sdk/client/stdio.js";
1515
import { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
1616
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
17+
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
1718
import express from "express";
1819
import { findActualExecutable } from "spawn-rx";
1920
import mcpProxy from "./mcpProxy.js";
2021

2122
const SSE_HEADERS_PASSTHROUGH = ["authorization"];
23+
const STREAMABLE_HTTP_HEADERS_PASSTHROUGH = ["authorization"];
2224

2325
const defaultEnvironment = {
2426
...getDefaultEnvironment(),
@@ -94,6 +96,29 @@ const createTransport = async (req: express.Request): Promise<Transport> => {
9496

9597
console.log("Connected to SSE transport");
9698
return transport;
99+
} else if (transportType === "streamable-http") {
100+
const headers: HeadersInit = {};
101+
102+
for (const key of STREAMABLE_HTTP_HEADERS_PASSTHROUGH) {
103+
if (req.headers[key] === undefined) {
104+
continue;
105+
}
106+
107+
const value = req.headers[key];
108+
headers[key] = Array.isArray(value) ? value[value.length - 1] : value;
109+
}
110+
111+
const transport = new StreamableHTTPClientTransport(
112+
new URL(query.url as string),
113+
{
114+
requestInit: {
115+
headers,
116+
},
117+
},
118+
);
119+
await transport.start();
120+
console.log("Connected to Streamable HTTP transport");
121+
return transport;
97122
} else {
98123
console.error(`Invalid transport type: ${transportType}`);
99124
throw new Error("Invalid transport type specified");

0 commit comments

Comments
 (0)