#!/usr/bin/env node
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { connectToRelay, disconnectFromRelay } from "./communication";
import { logger } from "./logger";
import { createMcpServer } from "./server";
const RELAY_URL = process.env.RELAY_URL || "ws://localhost:3055";
const CHANNEL_NAME = process.env.CHANNEL_NAME || "figma";
async function main() {
logger.info("Starting Figma MCP Server (stdio transport)");
// Create MCP server (tools are registered in createMcpServer)
const server = createMcpServer();
// Connect to relay server
logger.info(`Connecting to relay at ${RELAY_URL}`);
try {
await connectToRelay(RELAY_URL, CHANNEL_NAME);
logger.info(`Connected to relay and joined channel: ${CHANNEL_NAME}`);
} catch (error) {
logger.error("Failed to connect to relay server", error);
logger.warn(
"MCP server will start but Figma commands will fail until relay is available",
);
}
// Create stdio transport for MCP communication
const transport = new StdioServerTransport();
// Handle graceful shutdown
process.on("SIGINT", async () => {
logger.info("Received SIGINT, shutting down...");
await disconnectFromRelay();
await server.close();
process.exit(0);
});
process.on("SIGTERM", async () => {
logger.info("Received SIGTERM, shutting down...");
await disconnectFromRelay();
await server.close();
process.exit(0);
});
// Connect MCP server to stdio transport
await server.connect(transport);
logger.info("MCP server connected via stdio transport");
}
main().catch((error) => {
logger.error("Fatal error starting MCP server", error);
process.exit(1);
});