Skip to main content
Glama
index.ts7.03 kB
#!/usr/bin/env node import "dotenv/config"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { z } from "zod"; import { GroqWebsiteGenerator } from "./llm/groq.js"; import { GeminiWebsiteGenerator } from "./llm/gemini.js"; import { WebsiteGenerator } from "./types.js"; // Server configuration const server = new McpServer({ name: "website-generator-mcp-server", version: "1.0.0", capabilities: { tools: { listChanged: true } } }); // Initialize LLM providers const groqGenerator = new GroqWebsiteGenerator(); const geminiGenerator = new GeminiWebsiteGenerator(); // Get the appropriate generator based on provider preference function getGenerator(provider: string): WebsiteGenerator { switch (provider.toLowerCase()) { case "groq": return groqGenerator; case "gemini": return geminiGenerator; default: // Default to Groq return groqGenerator; } } // Tool: Generate HTML server.registerTool( "generate_html", { title: "Generate HTML", description: "Generate HTML content for a website using AI", inputSchema: { prompt: z.string().describe("Description of the website to generate"), provider: z.enum(["groq", "gemini"]).optional().describe("LLM provider to use (default: groq)"), model: z.string().optional().describe("Specific model to use (provider-dependent)") } }, async ({ prompt, provider = "groq", model }) => { try { const generator = getGenerator(provider); const html = await generator.generateHTML(prompt, model); return { content: [ { type: "text", text: `Generated HTML using ${provider}:\n\n${html}` } ] }; } catch (error) { return { content: [ { type: "text", text: `Error generating HTML: ${error instanceof Error ? error.message : String(error)}` } ], isError: true }; } } ); // Tool: Generate CSS server.registerTool( "generate_css", { title: "Generate CSS", description: "Generate CSS styles for a website using AI", inputSchema: { prompt: z.string().describe("Description of the styling requirements"), provider: z.enum(["groq", "gemini"]).optional().describe("LLM provider to use (default: groq)"), model: z.string().optional().describe("Specific model to use (provider-dependent)") } }, async ({ prompt, provider = "groq", model }) => { try { const generator = getGenerator(provider); const css = await generator.generateCSS(prompt, model); return { content: [ { type: "text", text: `Generated CSS using ${provider}:\n\n${css}` } ] }; } catch (error) { return { content: [ { type: "text", text: `Error generating CSS: ${error instanceof Error ? error.message : String(error)}` } ], isError: true }; } } ); // Tool: Generate JavaScript server.registerTool( "generate_js", { title: "Generate JavaScript", description: "Generate JavaScript code for a website using AI", inputSchema: { prompt: z.string().describe("Description of the JavaScript functionality needed"), provider: z.enum(["groq", "gemini"]).optional().describe("LLM provider to use (default: groq)"), model: z.string().optional().describe("Specific model to use (provider-dependent)") } }, async ({ prompt, provider = "groq", model }) => { try { const generator = getGenerator(provider); const js = await generator.generateJS(prompt, model); return { content: [ { type: "text", text: `Generated JavaScript using ${provider}:\n\n${js}` } ] }; } catch (error) { return { content: [ { type: "text", text: `Error generating JavaScript: ${error instanceof Error ? error.message : String(error)}` } ], isError: true }; } } ); // Tool: Generate Complete Website server.registerTool( "generate_website", { title: "Generate Complete Website", description: "Generate a complete, single-file website with HTML, CSS, and JavaScript using AI", inputSchema: { prompt: z.string().describe("Description of the website to generate"), provider: z.enum(["groq", "gemini"]).optional().describe("LLM provider to use (default: groq)"), model: z.string().optional().describe("Specific model to use (provider-dependent)"), includeJs: z.boolean().optional().describe("Include JavaScript generation (default: true)") } }, async ({ prompt, provider = "groq", model, includeJs = true }) => { try { const generator = getGenerator(provider); const websiteHtml = await generator.generateWebsite(prompt, includeJs, model); return { content: [ { type: "text", text: `Generated complete website using ${provider}. Copy and paste the code below into an HTML file:\n\n${websiteHtml}` } ] }; } catch (error) { return { content: [ { type: "text", text: `Error generating website: ${error instanceof Error ? error.message : String(error)}` } ], isError: true }; } } ); // Tool: Get Available Models server.registerTool( "get_available_models", { title: "Get Available Models", description: "Get list of available models for each provider", inputSchema: { provider: z.enum(["groq", "gemini"]).optional().describe("Provider to get models for (if not specified, returns all)") } }, async ({ provider }) => { try { let models: Record<string, string[]> = {}; if (!provider || provider === "groq") { models.groq = groqGenerator.getAvailableModels(); } if (!provider || provider === "gemini") { models.gemini = geminiGenerator.getAvailableModels(); } return { content: [ { type: "text", text: `Available models:\n\n${JSON.stringify(models, null, 2)}` } ] }; } catch (error) { return { content: [ { type: "text", text: `Error getting available models: ${error instanceof Error ? error.message : String(error)}` } ], isError: true }; } } ); // Start the server async function main() { const transport = new StdioServerTransport(); await server.connect(transport); console.error("Website Generator MCP Server running on stdio"); } main().catch((error) => { console.error("Fatal error in main():", error); process.exit(1); });

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/lasindu-themiya/mcpwebgenerator'

If you have feedback or need assistance with the MCP directory API, please join our Discord server