From 82e7db1f8ab44dbd52457095bfc5af0e27754507 Mon Sep 17 00:00:00 2001 From: Andriy Yevtushyn <129842532+Avionic23@users.noreply.github.com> Date: Thu, 18 Sep 2025 21:01:48 +0300 Subject: [PATCH] feat: support SSE server initialization --- perplexity-ask/index.ts | 9 +++++---- perplexity-ask/package.json | 6 ++++-- perplexity-ask/sse-server.ts | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 perplexity-ask/sse-server.ts diff --git a/perplexity-ask/index.ts b/perplexity-ask/index.ts index f5e5d6d..3ec13c9 100644 --- a/perplexity-ask/index.ts +++ b/perplexity-ask/index.ts @@ -1,12 +1,12 @@ #!/usr/bin/env node import { Server } from "@modelcontextprotocol/sdk/server/index.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { CallToolRequestSchema, ListToolsRequestSchema, Tool, } from "@modelcontextprotocol/sdk/types.js"; +import {createSSEServer} from "./sse-server.js"; /** * Definition of the Perplexity Ask Tool. @@ -294,9 +294,10 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { */ async function runServer() { try { - const transport = new StdioServerTransport(); - await server.connect(transport); - console.error("Perplexity MCP Server running on stdio with Ask, Research, and Reason tools"); + const PORT = process.env.PORT || 3001 + const sseServer = createSSEServer(server) + sseServer.listen(PORT) + console.error(`Perplexity MCP Server running on SSE and listening on port ${PORT} with Ask, Research, and Reason tools`); } catch (error) { console.error("Fatal error running server:", error); process.exit(1); diff --git a/perplexity-ask/package.json b/perplexity-ask/package.json index 489e647..a66c45d 100644 --- a/perplexity-ask/package.json +++ b/perplexity-ask/package.json @@ -34,12 +34,14 @@ "dependencies": { "@modelcontextprotocol/sdk": "^1.0.1", "axios": "^1.6.2", - "dotenv": "^16.3.1" + "dotenv": "^16.3.1", + "express": "^4.21.2" }, "devDependencies": { "@types/node": "^20", "shx": "^0.3.4", - "typescript": "^5.6.2" + "typescript": "^5.6.2", + "@types/express": "^5.0.3" }, "engines": { "node": ">=18" diff --git a/perplexity-ask/sse-server.ts b/perplexity-ask/sse-server.ts new file mode 100644 index 0000000..a8ab8bc --- /dev/null +++ b/perplexity-ask/sse-server.ts @@ -0,0 +1,32 @@ +import { Server } from "@modelcontextprotocol/sdk/server/index.js"; +import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js"; +import express from "express"; + +export function createSSEServer(mcpServer: Server) { + const app = express(); + + const transportMap = new Map(); + + app.get("/sse", async (req, res) => { + const transport = new SSEServerTransport("/messages", res); + transportMap.set(transport.sessionId, transport); + await mcpServer.connect(transport); + }); + + app.post("/messages", (req, res) => { + const sessionId = req.query.sessionId as string; + if (!sessionId) { + console.error('Message received without sessionId'); + res.status(400).json({ error: 'sessionId is required' }); + return; + } + + const transport = transportMap.get(sessionId); + + if (transport) { + transport.handlePostMessage(req, res); + } + }); + + return app; +}