SSE requests timing out

I am building an express app for MCP Server. I was able to follow guides on building and deploying express app to vercel.

However, I can not seem to get the /sse endpoint working as the returns the stream response. The API handler is executed to the last line, but the browser never receives the response, not even response headers.

const app = express();
app.use(cors())

app.get("/", (req: Request, res: Response) => {
  res.send("Hello World");
})

app.get(
  '/sse',
  async (req: Request, res: Response) => {
      const transport = new SSEServerTransport('/messages', res);
      const server = createMcpServer();
      server.connect(transport);
  })

export default app

The SSEServerTransport sets all required headers for streams - Content-Type: text/event-stream and Connection: keep-alive

vercel.json

{
  "version": 2,
  "outputDirectory": "dist",
  "builds": [
    {
      "src": "dist/**/*.js",
      "use": "@vercel/node",
      "config": {  "maxDuration": 300 }
    }
  ],
  "rewrites": [ { "source": "/(.*)", "destination": "/dist/index.js" }  ]
}

The app works fine when I run it on the standard node, but running on @vercel/node never returns a byte for the /see calls, eventually it leads to timeout

After debugging a lot I noticed @vercel/node updates the Connection request header to close while the browser sends keep-alive. Is there a way I can configure Connection header to pass-through?

If you’re having trouble deploying an Express app, this guide can help.

You can also ask v0 for suggestions tailored to your own project setup.