From dd6f5287ca3e87cca792a383b78412bbc394fb9d Mon Sep 17 00:00:00 2001 From: Santthosh Selvadurai Date: Wed, 30 Apr 2025 22:21:59 -0700 Subject: [PATCH 1/6] Fix to the Authorization header bug for Streamable-HTTP Reference issue [https://github.com/modelcontextprotocol/inspector/issues/369] --- client/src/lib/hooks/useConnection.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/lib/hooks/useConnection.ts b/client/src/lib/hooks/useConnection.ts index 27bc11a..f23f449 100644 --- a/client/src/lib/hooks/useConnection.ts +++ b/client/src/lib/hooks/useConnection.ts @@ -335,6 +335,7 @@ export function useConnection({ transportType === "streamable-http" ? new StreamableHTTPClientTransport(mcpProxyServerUrl as URL, { sessionId: undefined, + ...transportOptions, }) : new SSEClientTransport(mcpProxyServerUrl as URL, transportOptions); From b7ec3829d4bf8e8e148d817fbeb2c65435b7752a Mon Sep 17 00:00:00 2001 From: cliffhall Date: Fri, 2 May 2025 17:35:33 -0400 Subject: [PATCH 2/6] Use transport-specific options --- client/src/lib/hooks/useConnection.ts | 100 +++++++++++++++++--------- 1 file changed, 65 insertions(+), 35 deletions(-) diff --git a/client/src/lib/hooks/useConnection.ts b/client/src/lib/hooks/useConnection.ts index f23f449..5ae9f69 100644 --- a/client/src/lib/hooks/useConnection.ts +++ b/client/src/lib/hooks/useConnection.ts @@ -2,8 +2,12 @@ import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { SSEClientTransport, SseError, + SSEClientTransportOptions, } from "@modelcontextprotocol/sdk/client/sse.js"; -import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; +import { + StreamableHTTPClientTransport, + StreamableHTTPClientTransportOptions, +} from "@modelcontextprotocol/sdk/client/streamableHttp.js"; import { ClientNotification, ClientRequest, @@ -279,29 +283,6 @@ export function useConnection({ setConnectionStatus("error-connecting-to-proxy"); return; } - let mcpProxyServerUrl; - switch (transportType) { - case "stdio": - mcpProxyServerUrl = new URL(`${getMCPProxyAddress(config)}/stdio`); - mcpProxyServerUrl.searchParams.append("command", command); - mcpProxyServerUrl.searchParams.append("args", args); - mcpProxyServerUrl.searchParams.append("env", JSON.stringify(env)); - break; - - case "sse": - mcpProxyServerUrl = new URL(`${getMCPProxyAddress(config)}/sse`); - mcpProxyServerUrl.searchParams.append("url", sseUrl); - break; - - case "streamable-http": - mcpProxyServerUrl = new URL(`${getMCPProxyAddress(config)}/mcp`); - mcpProxyServerUrl.searchParams.append("url", sseUrl); - break; - } - (mcpProxyServerUrl as URL).searchParams.append( - "transportType", - transportType, - ); try { // Inject auth manually instead of using SSEClientTransport, because we're @@ -320,17 +301,66 @@ export function useConnection({ } // Create appropriate transport - const transportOptions = { - eventSourceInit: { - fetch: ( - url: string | URL | globalThis.Request, - init: RequestInit | undefined, - ) => fetch(url, { ...init, headers }), - }, - requestInit: { - headers, - }, - }; + let transportOptions: + | StreamableHTTPClientTransportOptions + | SSEClientTransportOptions; + + let mcpProxyServerUrl; + switch (transportType) { + case "stdio": + mcpProxyServerUrl = new URL(`${getMCPProxyAddress(config)}/stdio`); + mcpProxyServerUrl.searchParams.append("command", command); + mcpProxyServerUrl.searchParams.append("args", args); + mcpProxyServerUrl.searchParams.append("env", JSON.stringify(env)); + transportOptions = {}; + break; + + case "sse": + mcpProxyServerUrl = new URL(`${getMCPProxyAddress(config)}/sse`); + mcpProxyServerUrl.searchParams.append("url", sseUrl); + transportOptions = { + authProvider: serverAuthProvider, + eventSourceInit: { + fetch: ( + url: string | URL | globalThis.Request, + init: RequestInit | undefined, + ) => fetch(url, { ...init, headers }), + }, + requestInit: { + headers, + }, + }; + break; + + case "streamable-http": + mcpProxyServerUrl = new URL(`${getMCPProxyAddress(config)}/mcp`); + mcpProxyServerUrl.searchParams.append("url", sseUrl); + transportOptions = { + authProvider: serverAuthProvider, + eventSourceInit: { + fetch: ( + url: string | URL | globalThis.Request, + init: RequestInit | undefined, + ) => fetch(url, { ...init, headers }), + }, + requestInit: { + headers, + }, + // TODO these should be configurable... + reconnectionOptions: { + maxReconnectionDelay: 30000, + initialReconnectionDelay: 1000, + reconnectionDelayGrowFactor: 1.5, + maxRetries: 2, + }, + }; + break; + } + (mcpProxyServerUrl as URL).searchParams.append( + "transportType", + transportType, + ); + const clientTransport = transportType === "streamable-http" ? new StreamableHTTPClientTransport(mcpProxyServerUrl as URL, { From f9cbfbe8221397952a8baadafcaa908ebb91980b Mon Sep 17 00:00:00 2001 From: cliffhall Date: Fri, 2 May 2025 17:50:00 -0400 Subject: [PATCH 3/6] Create the appropriate TransportOptions object for the selected transport * In useConnection.ts - In the case for "stdio", let the transportOptions be the same as "sse" because it will use that transport to the proxy regardless --- client/src/lib/hooks/useConnection.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/client/src/lib/hooks/useConnection.ts b/client/src/lib/hooks/useConnection.ts index 5ae9f69..f7554f9 100644 --- a/client/src/lib/hooks/useConnection.ts +++ b/client/src/lib/hooks/useConnection.ts @@ -312,7 +312,18 @@ export function useConnection({ mcpProxyServerUrl.searchParams.append("command", command); mcpProxyServerUrl.searchParams.append("args", args); mcpProxyServerUrl.searchParams.append("env", JSON.stringify(env)); - transportOptions = {}; + transportOptions = { + authProvider: serverAuthProvider, + eventSourceInit: { + fetch: ( + url: string | URL | globalThis.Request, + init: RequestInit | undefined, + ) => fetch(url, { ...init, headers }), + }, + requestInit: { + headers, + }, + }; break; case "sse": From f7b936e1029e1b5388359991a427b57fd3d84569 Mon Sep 17 00:00:00 2001 From: Ola Hungerford Date: Wed, 7 May 2025 05:28:24 -0700 Subject: [PATCH 4/6] Bump version to 0.12.0 --- cli/package.json | 2 +- client/package.json | 2 +- package-lock.json | 20 ++++++++++---------- package.json | 8 ++++---- server/package.json | 2 +- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/cli/package.json b/cli/package.json index 841a023..53f2aa6 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@modelcontextprotocol/inspector-cli", - "version": "0.11.0", + "version": "0.12.0", "description": "CLI for the Model Context Protocol inspector", "license": "MIT", "author": "Anthropic, PBC (https://anthropic.com)", diff --git a/client/package.json b/client/package.json index 6ca90eb..2bcf2b0 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "@modelcontextprotocol/inspector-client", - "version": "0.11.0", + "version": "0.12.0", "description": "Client-side application for the Model Context Protocol inspector", "license": "MIT", "author": "Anthropic, PBC (https://anthropic.com)", diff --git a/package-lock.json b/package-lock.json index ed7f0aa..1cb173a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@modelcontextprotocol/inspector", - "version": "0.11.0", + "version": "0.12.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@modelcontextprotocol/inspector", - "version": "0.11.0", + "version": "0.12.0", "license": "MIT", "workspaces": [ "client", @@ -14,9 +14,9 @@ "cli" ], "dependencies": { - "@modelcontextprotocol/inspector-cli": "^0.11.0", - "@modelcontextprotocol/inspector-client": "^0.11.0", - "@modelcontextprotocol/inspector-server": "^0.11.0", + "@modelcontextprotocol/inspector-cli": "^0.12.0", + "@modelcontextprotocol/inspector-client": "^0.12.0", + "@modelcontextprotocol/inspector-server": "^0.12.0", "@modelcontextprotocol/sdk": "^1.11.0", "concurrently": "^9.0.1", "shell-quote": "^1.8.2", @@ -39,7 +39,7 @@ }, "cli": { "name": "@modelcontextprotocol/inspector-cli", - "version": "0.11.0", + "version": "0.12.0", "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.10.2", @@ -62,7 +62,7 @@ }, "client": { "name": "@modelcontextprotocol/inspector-client", - "version": "0.11.0", + "version": "0.12.0", "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.10.2", @@ -2059,8 +2059,8 @@ } }, "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.12.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "license": "MIT", "optional": true, @@ -10793,7 +10793,7 @@ }, "server": { "name": "@modelcontextprotocol/inspector-server", - "version": "0.11.0", + "version": "0.12.0", "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.10.2", diff --git a/package.json b/package.json index d67b199..5e92409 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@modelcontextprotocol/inspector", - "version": "0.11.0", + "version": "0.12.0", "description": "Model Context Protocol inspector", "license": "MIT", "author": "Anthropic, PBC (https://anthropic.com)", @@ -40,9 +40,9 @@ "publish-all": "npm publish --workspaces --access public && npm publish --access public" }, "dependencies": { - "@modelcontextprotocol/inspector-cli": "^0.11.0", - "@modelcontextprotocol/inspector-client": "^0.11.0", - "@modelcontextprotocol/inspector-server": "^0.11.0", + "@modelcontextprotocol/inspector-cli": "^0.12.0", + "@modelcontextprotocol/inspector-client": "^0.12.0", + "@modelcontextprotocol/inspector-server": "^0.12.0", "@modelcontextprotocol/sdk": "^1.11.0", "concurrently": "^9.0.1", "shell-quote": "^1.8.2", diff --git a/server/package.json b/server/package.json index 24162da..72723d3 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "@modelcontextprotocol/inspector-server", - "version": "0.11.0", + "version": "0.12.0", "description": "Server-side application for the Model Context Protocol inspector", "license": "MIT", "author": "Anthropic, PBC (https://anthropic.com)", From 7083c7c9f25a051e8a37e59fc44005d0eb005c92 Mon Sep 17 00:00:00 2001 From: Ola Hungerford Date: Thu, 8 May 2025 13:30:52 -0700 Subject: [PATCH 5/6] Update package-lock.json --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 1cb173a..cd5837c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2059,7 +2059,7 @@ } }, "node_modules/@pkgjs/parseargs": { - "version": "0.12.0", + "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.12.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "license": "MIT", From 2731b5f7fa67664542636a1efc97dee34b3b17d8 Mon Sep 17 00:00:00 2001 From: Ola Hungerford Date: Thu, 8 May 2025 13:31:20 -0700 Subject: [PATCH 6/6] Update package-lock.json --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index cd5837c..eb373c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2060,7 +2060,7 @@ }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.12.0.tgz", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "license": "MIT", "optional": true,