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; +}