@getalby/mcp
Version:
MCP server for controlling a Lightning wallet using Nostr Wallet Connect
51 lines (50 loc) • 1.96 kB
JavaScript
import { nwc } from "@getalby/sdk";
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
import { createMCPServer } from "./mcp_server.js";
import { getConnectionSecret } from "./auth.js";
export function addSSEEndpoints(app) {
// Store transports for each session type
// SSE is deprecated so we do not put much effort in here (e.g. cleaning up unused sessions)
const sessions = {};
app.get("/sse", async (req, res) => {
const nostrWalletConnectUrl = getConnectionSecret(req.header("Authorization"), req.query.nwc);
if (!nostrWalletConnectUrl) {
res
.status(400)
.send("Bearer auth with NWC connection secret or nwc query parameter not provided");
return;
}
const client = new nwc.NWCClient({
nostrWalletConnectUrl,
});
const transport = new SSEServerTransport("/messages", res);
const server = createMCPServer(client);
sessions[transport.sessionId] = {
server,
transport,
};
console.info("Created new SSE session", transport.sessionId);
if (req.query.sessionId) {
console.info("Request provided its own session ID: " + req.query.sessionId);
sessions[req.query.sessionId] = {
server,
transport,
};
}
server.connect(transport);
});
app.post("/messages", (req, res) => {
const sessionId = req.query.sessionId;
console.info("SSE messages request", sessionId);
const session = sessions[sessionId];
if (session) {
console.info("Found session for messages request", sessionId);
session.transport.handlePostMessage(req, res);
}
else {
res
.status(400)
.send("No transport found for sessionId: " + req.query.sessionId);
}
});
}