import "dotenv/config";
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
import express from "express";
import { createMcpServer } from "./create-mcp-server.js";
declare const __PACKAGE_VERSION__: string; // available in the built version.
const app = express();
app.use(express.json());
app.post("/mcp", async (req, res) => {
try {
const server = createMcpServer();
const transport: StreamableHTTPServerTransport =
new StreamableHTTPServerTransport({
sessionIdGenerator: undefined,
});
res.on("close", () => {
transport.close();
server.close();
});
await server.connect(transport);
await transport.handleRequest(req, res, req.body);
} catch (error) {
console.error("Error handling MCP request:", error);
if (!res.headersSent) {
res.status(500).json({
jsonrpc: "2.0",
error: {
code: -32603,
message: "Internal server error",
},
id: null,
});
}
}
});
app.get("/mcp", async (req: express.Request, res: express.Response) => {
res.writeHead(405).end(
JSON.stringify({
jsonrpc: "2.0",
error: {
code: -32000,
message: "Method not allowed.",
},
id: null,
}),
);
});
app.delete("/mcp", async (req, res) => {
res.writeHead(405).end(
JSON.stringify({
jsonrpc: "2.0",
error: {
code: -32000,
message: "Method not allowed.",
},
id: null,
}),
);
});
app.get("/health", (req, res) => {
res.json({
status: "ok",
service: "searchcraft-mcp-server",
version: __PACKAGE_VERSION__,
});
});
const PORT = process.env.PORT || 3000;
const server = app.listen(PORT, () => {
console.log(`Searchcraft MCP Server listening on port ${PORT}`);
console.log(`Health check available at http://localhost:${PORT}/health`);
console.log(`MCP endpoint available at http://localhost:${PORT}/mcp`);
});
// Graceful shutdown handling
process.on("SIGINT", () => {
console.log("\nReceived SIGINT, shutting down gracefully...");
server.close(() => {
console.log("Server closed");
process.exit(0);
});
});
process.on("SIGTERM", () => {
console.log("\nReceived SIGTERM, shutting down gracefully...");
server.close(() => {
console.log("Server closed");
process.exit(0);
});
});