index.ts•7.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);
});