Skip to content

Commit 272644a

Browse files
authored
fix: send error response headers and support application/json messages
2 parents 9260452 + 33f5a0a commit 272644a

File tree

1 file changed

+20
-1
lines changed

1 file changed

+20
-1
lines changed

src/startHTTPServer.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ const getBody = (request: http.IncomingMessage) => {
4242
const handleStreamRequest = async <T extends ServerLike>({
4343
activeTransports,
4444
createServer,
45+
enableJsonResponse,
4546
endpoint,
4647
eventStore,
4748
onClose,
@@ -54,6 +55,7 @@ const handleStreamRequest = async <T extends ServerLike>({
5455
{ server: T; transport: StreamableHTTPServerTransport }
5556
>;
5657
createServer: (request: http.IncomingMessage) => Promise<T>;
58+
enableJsonResponse?: boolean;
5759
endpoint: string;
5860
eventStore?: EventStore;
5961
onClose?: (server: T) => Promise<void>;
@@ -99,6 +101,7 @@ const handleStreamRequest = async <T extends ServerLike>({
99101
} else if (!sessionId && isInitializeRequest(body)) {
100102
// Create a new transport for the session
101103
transport = new StreamableHTTPServerTransport({
104+
enableJsonResponse,
102105
eventStore: eventStore || new InMemoryEventStore(),
103106
onsessioninitialized: (_sessionId) => {
104107
// add only when the id Sesison id is generated
@@ -132,7 +135,20 @@ const handleStreamRequest = async <T extends ServerLike>({
132135
server = await createServer(req);
133136
} catch (error) {
134137
if (error instanceof Response) {
135-
res.writeHead(error.status).end(error.statusText);
138+
const fixedHeaders: http.OutgoingHttpHeaders = {};
139+
error.headers.forEach((value, key) => {
140+
// If a header appears multiple times, combine them as an array
141+
if (fixedHeaders[key]) {
142+
if (Array.isArray(fixedHeaders[key])) {
143+
(fixedHeaders[key] as string[]).push(value);
144+
} else {
145+
fixedHeaders[key] = [fixedHeaders[key] as string, value];
146+
}
147+
} else {
148+
fixedHeaders[key] = value;
149+
}
150+
});
151+
res.writeHead(error.status, error.statusText, fixedHeaders).end(error.statusText);
136152

137153
return true;
138154
}
@@ -381,6 +397,7 @@ const handleSSERequest = async <T extends ServerLike>({
381397

382398
export const startHTTPServer = async <T extends ServerLike>({
383399
createServer,
400+
enableJsonResponse,
384401
eventStore,
385402
host = "::",
386403
onClose,
@@ -391,6 +408,7 @@ export const startHTTPServer = async <T extends ServerLike>({
391408
streamEndpoint = "/mcp",
392409
}: {
393410
createServer: (request: http.IncomingMessage) => Promise<T>;
411+
enableJsonResponse?: boolean;
394412
eventStore?: EventStore;
395413
host?: string;
396414
onClose?: (server: T) => Promise<void>;
@@ -462,6 +480,7 @@ export const startHTTPServer = async <T extends ServerLike>({
462480
(await handleStreamRequest({
463481
activeTransports: activeStreamTransports,
464482
createServer,
483+
enableJsonResponse,
465484
endpoint: streamEndpoint,
466485
eventStore,
467486
onClose,

0 commit comments

Comments
 (0)