From 8bb53087975f3c18c302e19c6dc3ee30c55f2911 Mon Sep 17 00:00:00 2001 From: Justin Spahr-Summers Date: Fri, 24 Jan 2025 11:04:44 +0000 Subject: [PATCH] Report SSE 401 errors to the client --- server/src/errors.ts | 11 +++++++++++ server/src/index.ts | 14 +++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 server/src/errors.ts diff --git a/server/src/errors.ts b/server/src/errors.ts new file mode 100644 index 0000000..eba1d40 --- /dev/null +++ b/server/src/errors.ts @@ -0,0 +1,11 @@ +export interface SseError extends Error { + code: number; +} + +export function isSseError(error: unknown): error is SseError { + if (!(error instanceof Error)) { + return false; + } + + return "code" in error && typeof error.code === "number"; +} diff --git a/server/src/index.ts b/server/src/index.ts index 538509e..1eaa7ae 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -12,6 +12,7 @@ import { import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js"; import express from "express"; import { findActualExecutable } from "spawn-rx"; +import { isSseError } from "./errors.js"; import mcpProxy from "./mcpProxy.js"; const SSE_HEADERS_PASSTHROUGH = ['Authorization']; @@ -98,7 +99,18 @@ app.get("/sse", async (req, res) => { try { console.log("New SSE connection"); - const backingServerTransport = await createTransport(req); + let backingServerTransport; + try { + backingServerTransport = await createTransport(req); + } catch (error) { + if (isSseError(error) && error.code === 401) { + console.error("Received 401 Unauthorized from MCP server:", error.message); + res.status(401).json(error); + return; + } + + throw error; + } console.log("Connected MCP client to backing server transport");