index.ts•2.69 kB
/**
* @fileoverview Figma MCP Server - Model Context Protocol implementation for Figma API integration
*
* Provides capabilities for:
* - Extracting file keys and node IDs from Figma URLs
* - Fetching images of Figma frames/nodes
* - Converting Figma designs to JSX/CSS pseudo-code
* - Processing Figma components with semantic inference
*/
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import "dotenv/config";
import { logger } from "./utils/error-handling.js";
import { FigmaApiClient } from "./api/figma-client.js";
import { validateApiToken } from "./utils/validation.js";
import { createMcpServer } from "./server/mcp-server-setup.js";
/**
* Initializes and starts the Figma MCP Server
* @returns {Promise<void>} Promise that resolves when server setup is complete
*/
const main = async (): Promise<void> => {
const appStartTime = Date.now();
logger.info("Starting Figma MCP Server");
// Get Figma API token from CLI argument or environment variable
const args = process.argv.slice(2);
const figmaApiKeyArg = args.find(arg => arg.startsWith('--figma_api_key='));
const TOKEN = figmaApiKeyArg
? figmaApiKeyArg.split('=')[1]
: process.env.FIGMA_API_TOKEN;
if (!TOKEN) {
logger.error("Figma API token not provided. Please set FIGMA_API_TOKEN environment variable or use --figma_api_key=<token> CLI argument.");
process.exit(1);
}
// Validate API token format
const tokenValidation = validateApiToken(TOKEN);
if (!tokenValidation.isValid) {
logger.error("Invalid API token:", { error: tokenValidation.error });
process.exit(1);
}
logger.info("API token validation successful");
// Initialize Figma API client
const figmaClient = new FigmaApiClient({
apiToken: TOKEN,
timeout: 30000,
});
logger.info("Figma API client initialized");
const server = createMcpServer(figmaClient);
const transport = new StdioServerTransport();
await server.connect(transport);
// server.server.sendLoggingMessage({
// level: "info",
// message: "Figma MCP Server started successfully"});
const appStartupTime = Date.now() - appStartTime;
logger.performance("server-startup", appStartupTime);
logger.memory("server-startup");
logger.info("Figma MCP Server running on stdio", {
serverName: "figma-mcp-server",
version: "1.0.0",
startupTime: `${appStartupTime}ms`,
logLevel: logger.getLevel(),
});
};
/**
* Error handler for uncaught exceptions
*/
main().catch((error) => {
logger.error("Fatal error in main():", {
message: error.message,
stack: error.stack,
timestamp: new Date().toISOString(),
});
process.exit(1);
});