Skip to content

Commit 2dae17d

Browse files
committed
add support for SSE
1 parent 68503db commit 2dae17d

File tree

4 files changed

+219
-164
lines changed

4 files changed

+219
-164
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ The Elasticsearch MCP Server supports configuration options to connect to your E
7070

7171
| Environment Variable | Description | Required |
7272
|---------------------|-------------|----------|
73+
| `SSE_ADDR` | Enable SSE and set the ADDR | No |
74+
| `ES_URL` | Your Elasticsearch instance URL | Yes |
7375
| `ES_URL` | Your Elasticsearch instance URL | Yes |
7476
| `ES_API_KEY` | Elasticsearch API key for authentication | No |
7577
| `ES_USERNAME` | Elasticsearch username for basic authentication | No |

index.ts

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,23 @@
55
* SPDX-License-Identifier: Apache-2.0
66
*/
77

8+
import express, { Request, Response } from "express";
89
import { z } from "zod";
910
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
11+
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
1012
import { Client, estypes, ClientOptions } from "@elastic/elasticsearch";
1113
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
1214
import fs from "fs";
1315

1416
// Configuration schema with auth options
1517
const ConfigSchema = z
1618
.object({
19+
sse_addr: z
20+
.string()
21+
.trim()
22+
.optional()
23+
.describe("Address for SSE server (optional)"),
24+
1725
url: z
1826
.string()
1927
.trim()
@@ -403,23 +411,57 @@ export async function createElasticsearchMcpServer(
403411
}
404412

405413
const config: ElasticsearchConfig = {
414+
sse_addr: process.env.SSE_ADDR || "",
406415
url: process.env.ES_URL || "",
407416
apiKey: process.env.ES_API_KEY || "",
408417
username: process.env.ES_USERNAME || "",
409418
password: process.env.ES_PASSWORD || "",
410419
caCert: process.env.ES_CA_CERT || "",
411420
};
412421

422+
async function create_sse_server(server: any) {
423+
const app = express();
424+
425+
const transports: {[sessionId: string]: SSEServerTransport} = {};
426+
427+
app.get("/sse", async (_: Request, res: Response) => {
428+
const transport = new SSEServerTransport('/messages', res);
429+
transports[transport.sessionId] = transport;
430+
res.on("close", () => {
431+
delete transports[transport.sessionId];
432+
});
433+
await server.connect(transport);
434+
});
435+
436+
app.post("/messages", async (req: Request, res: Response) => {
437+
const sessionId = req.query.sessionId as string;
438+
const transport = transports[sessionId];
439+
if (transport) {
440+
await transport.handlePostMessage(req, res);
441+
} else {
442+
res.status(400).send('No transport found for sessionId');
443+
}
444+
});
445+
446+
console.info("SSE server started on: ", process.env.SSE_ADDR);
447+
app.listen(process.env.SSE_ADDR);
448+
}
449+
413450
async function main() {
414-
const transport = new StdioServerTransport();
451+
console.info("Starting Elasticsearch MCP server...");
415452
const server = await createElasticsearchMcpServer(config);
416453

417-
await server.connect(transport);
454+
if (process.env.SSE_ADDR) {
455+
await create_sse_server(server);
456+
} else {
457+
const transport = new StdioServerTransport();
458+
await server.connect(transport);
418459

419-
process.on("SIGINT", async () => {
420-
await server.close();
421-
process.exit(0);
422-
});
460+
process.on("SIGINT", async () => {
461+
await server.close();
462+
process.exit(0);
463+
});
464+
}
423465
}
424466

425467
main().catch((error) => {

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@
3838
},
3939
"dependencies": {
4040
"@elastic/elasticsearch": "^8.17.1",
41-
"@modelcontextprotocol/sdk": "1.9.0"
41+
"@modelcontextprotocol/sdk": "1.9.0",
42+
"@types/express": "^5.0.1",
43+
"express": "^5.1.0"
4244
},
4345
"engines": {
4446
"node": ">=18"

0 commit comments

Comments
 (0)