feat: add tool index and server entry point with stdio + HTTP transport
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* Novu MCP Server
|
||||
*
|
||||
* An MCP server providing full coverage of the Novu notification
|
||||
* infrastructure API. Supports stdio and Streamable HTTP transports.
|
||||
*/
|
||||
|
||||
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
||||
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
||||
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
||||
import express from "express";
|
||||
import { getApiKey } from "./constants.js";
|
||||
import {
|
||||
registerEventsTools,
|
||||
registerSubscribersTools,
|
||||
registerTopicsTools,
|
||||
registerWorkflowsTools,
|
||||
registerNotificationsTools,
|
||||
registerMessagesTools,
|
||||
registerIntegrationsTools,
|
||||
registerEnvironmentsTools,
|
||||
registerTranslationsTools,
|
||||
registerContextsTools,
|
||||
registerChannelsTools,
|
||||
} from "./tools/index.js";
|
||||
|
||||
// Validate API key early so we fail fast with a clear message
|
||||
getApiKey();
|
||||
|
||||
const server = new McpServer({
|
||||
name: "novu-mcp-server",
|
||||
version: "1.0.0",
|
||||
});
|
||||
|
||||
// Register all tool domains
|
||||
registerEventsTools(server);
|
||||
registerSubscribersTools(server);
|
||||
registerTopicsTools(server);
|
||||
registerWorkflowsTools(server);
|
||||
registerNotificationsTools(server);
|
||||
registerMessagesTools(server);
|
||||
registerIntegrationsTools(server);
|
||||
registerEnvironmentsTools(server);
|
||||
registerTranslationsTools(server);
|
||||
registerContextsTools(server);
|
||||
registerChannelsTools(server);
|
||||
|
||||
async function runStdio(): Promise<void> {
|
||||
const transport = new StdioServerTransport();
|
||||
await server.connect(transport);
|
||||
console.error("novu-mcp-server running via stdio");
|
||||
}
|
||||
|
||||
async function runHttp(): Promise<void> {
|
||||
const app = express();
|
||||
app.use(express.json());
|
||||
|
||||
app.post("/mcp", async (req, res) => {
|
||||
const transport = new StreamableHTTPServerTransport({
|
||||
sessionIdGenerator: undefined,
|
||||
enableJsonResponse: true,
|
||||
});
|
||||
res.on("close", () => {
|
||||
transport.close();
|
||||
});
|
||||
await server.connect(transport);
|
||||
await transport.handleRequest(req, res, req.body);
|
||||
});
|
||||
|
||||
const port = parseInt(process.env.PORT || "3000", 10);
|
||||
app.listen(port, () => {
|
||||
console.error(`novu-mcp-server running on http://localhost:${port}/mcp`);
|
||||
});
|
||||
}
|
||||
|
||||
const transport = process.env.TRANSPORT || "stdio";
|
||||
if (transport === "http") {
|
||||
runHttp().catch((err) => {
|
||||
console.error("Fatal:", err);
|
||||
process.exit(1);
|
||||
});
|
||||
} else {
|
||||
runStdio().catch((err) => {
|
||||
console.error("Fatal:", err);
|
||||
process.exit(1);
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
export { registerEventsTools } from "./events.js";
|
||||
export { registerSubscribersTools } from "./subscribers.js";
|
||||
export { registerTopicsTools } from "./topics.js";
|
||||
export { registerWorkflowsTools } from "./workflows.js";
|
||||
export { registerNotificationsTools } from "./notifications.js";
|
||||
export { registerMessagesTools } from "./messages.js";
|
||||
export { registerIntegrationsTools } from "./integrations.js";
|
||||
export { registerEnvironmentsTools } from "./environments.js";
|
||||
export { registerTranslationsTools } from "./translations.js";
|
||||
export { registerContextsTools } from "./contexts.js";
|
||||
export { registerChannelsTools } from "./channels.js";
|
||||
Reference in New Issue
Block a user