Skip to content

Commit 7df0ac4

Browse files
authored
Merge pull request #470 from cliffhall/send-delete-on-streamable-http-disconnect
Send HTTP DELETE on streamable transport disconnect
2 parents bf85ceb + e55cd75 commit 7df0ac4

File tree

2 files changed

+50
-9
lines changed

2 files changed

+50
-9
lines changed

client/src/lib/hooks/useConnection.ts

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import {
4545
} from "@/utils/configUtils";
4646
import { getMCPServerRequestTimeout } from "@/utils/configUtils";
4747
import { InspectorConfig } from "../configurationTypes";
48+
import { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
4849

4950
interface UseConnectionOptions {
5051
transportType: "stdio" | "sse" | "streamable-http";
@@ -83,6 +84,9 @@ export function useConnection({
8384
const [serverCapabilities, setServerCapabilities] =
8485
useState<ServerCapabilities | null>(null);
8586
const [mcpClient, setMcpClient] = useState<Client | null>(null);
87+
const [clientTransport, setClientTransport] = useState<Transport | null>(
88+
null,
89+
);
8690
const [requestHistory, setRequestHistory] = useState<
8791
{ request: string; response?: string }[]
8892
>([]);
@@ -384,14 +388,6 @@ export function useConnection({
384388
transportType,
385389
);
386390

387-
const clientTransport =
388-
transportType === "streamable-http"
389-
? new StreamableHTTPClientTransport(mcpProxyServerUrl as URL, {
390-
sessionId: undefined,
391-
...transportOptions,
392-
})
393-
: new SSEClientTransport(mcpProxyServerUrl as URL, transportOptions);
394-
395391
if (onNotification) {
396392
[
397393
CancelledNotificationSchema,
@@ -421,7 +417,20 @@ export function useConnection({
421417

422418
let capabilities;
423419
try {
424-
await client.connect(clientTransport);
420+
const transport =
421+
transportType === "streamable-http"
422+
? new StreamableHTTPClientTransport(mcpProxyServerUrl as URL, {
423+
sessionId: undefined,
424+
...transportOptions,
425+
})
426+
: new SSEClientTransport(
427+
mcpProxyServerUrl as URL,
428+
transportOptions,
429+
);
430+
431+
await client.connect(transport as Transport);
432+
433+
setClientTransport(transport);
425434

426435
capabilities = client.getServerCapabilities();
427436
const initializeRequest = {
@@ -475,10 +484,15 @@ export function useConnection({
475484
};
476485

477486
const disconnect = async () => {
487+
if (transportType === "streamable-http")
488+
await (
489+
clientTransport as StreamableHTTPClientTransport
490+
).terminateSession();
478491
await mcpClient?.close();
479492
const authProvider = new InspectorOAuthClientProvider(sseUrl);
480493
authProvider.clear();
481494
setMcpClient(null);
495+
setClientTransport(null);
482496
setConnectionStatus("disconnected");
483497
setCompletionsSupported(false);
484498
setServerCapabilities(null);

server/src/index.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,33 @@ app.post("/mcp", async (req, res) => {
243243
}
244244
});
245245

246+
app.delete("/mcp", async (req, res) => {
247+
const sessionId = req.headers["mcp-session-id"] as string | undefined;
248+
console.log(`Received DELETE message for sessionId ${sessionId}`);
249+
let serverTransport: Transport | undefined;
250+
if (sessionId) {
251+
try {
252+
serverTransport = serverTransports.get(
253+
sessionId,
254+
) as StreamableHTTPClientTransport;
255+
if (!serverTransport) {
256+
res.status(404).end("Transport not found for sessionId " + sessionId);
257+
} else {
258+
await (
259+
serverTransport as StreamableHTTPClientTransport
260+
).terminateSession();
261+
webAppTransports.delete(sessionId);
262+
serverTransports.delete(sessionId);
263+
console.log(`Transports removed for sessionId ${sessionId}`);
264+
}
265+
res.status(200).end();
266+
} catch (error) {
267+
console.error("Error in /mcp route:", error);
268+
res.status(500).json(error);
269+
}
270+
}
271+
});
272+
246273
app.get("/stdio", async (req, res) => {
247274
try {
248275
console.log("New connection");

0 commit comments

Comments
 (0)