Skip to main content
Glama

Worksona MCP Server

Official
by worksona
generate-site-data.js•4.63 kB
#!/usr/bin/env node /** * Generate agent data for the microsite * This script reads all agents from the agents directory and generates a JSON file */ const fs = require('fs-extra'); const path = require('path'); const glob = require('glob'); const AGENTS_DIR = path.join(__dirname, 'agents'); const OUTPUT_FILE = path.join(__dirname, 'site/data/agents.json'); async function generateAgentData() { console.log('šŸ” Scanning agents directory...'); // Find all metadata.json files const metadataFiles = glob.sync('**/metadata.json', { cwd: AGENTS_DIR, absolute: true, ignore: ['**/node_modules/**', '**/dist/**'] }); console.log(`šŸ“ Found ${metadataFiles.length} agent definitions`); const agents = []; const categories = new Set(); for (const metadataPath of metadataFiles) { try { const metadata = await fs.readJSON(metadataPath); const agentDir = path.dirname(metadataPath); const agentMdPath = path.join(agentDir, 'agent.md'); // Extract category from path const relativePath = path.relative(AGENTS_DIR, agentDir); const category = relativePath.split(path.sep)[0]; categories.add(category); // Read agent prompt (optional, for display) let prompt = ''; if (await fs.pathExists(agentMdPath)) { prompt = await fs.readFile(agentMdPath, 'utf-8'); // Extract just first few paragraphs for preview const lines = prompt.split('\n'); const contentStart = lines.findIndex(line => line.trim() && !line.startsWith('---')); const previewLines = lines.slice(contentStart, contentStart + 10); prompt = previewLines.join('\n').substring(0, 500) + '...'; } // Normalize capabilities let capabilities; if (Array.isArray(metadata.capabilities)) { capabilities = { primary: metadata.capabilities, secondary: [] }; } else if (metadata.capabilities && typeof metadata.capabilities === 'object') { capabilities = { primary: metadata.capabilities.primary || [], secondary: metadata.capabilities.secondary || [], frameworks: metadata.capabilities.frameworks || [] }; } else { capabilities = { primary: [], secondary: [] }; } // Create agent data object const agent = { name: metadata.name, version: metadata.version || '1.0.0', description: metadata.description || 'No description available', category, subcategory: metadata.subcategory, capabilities, tags: metadata.tags || [], quality: metadata.quality || {}, coordination: metadata.coordination || {}, preview: prompt }; agents.push(agent); } catch (error) { console.error(`āš ļø Failed to load agent from ${metadataPath}:`, error.message); } } // Sort agents by name agents.sort((a, b) => a.name.localeCompare(b.name)); // Create output data structure const outputData = { agents, categories: Array.from(categories).sort(), metadata: { totalAgents: agents.length, totalCategories: categories.size, generatedAt: new Date().toISOString() } }; // Ensure output directory exists await fs.ensureDir(path.dirname(OUTPUT_FILE)); // Write to file await fs.writeJSON(OUTPUT_FILE, outputData, { spaces: 2 }); console.log(`āœ… Generated agent data: ${agents.length} agents across ${categories.size} categories`); console.log(`šŸ“„ Output: ${OUTPUT_FILE}`); // Print category summary const categoryCounts = {}; agents.forEach(agent => { categoryCounts[agent.category] = (categoryCounts[agent.category] || 0) + 1; }); console.log('\nšŸ“Š Category breakdown:'); Object.entries(categoryCounts) .sort((a, b) => b[1] - a[1]) .forEach(([category, count]) => { console.log(` ${category}: ${count} agents`); }); } // Run the generator generateAgentData().catch(error => { console.error('āŒ Failed to generate agent data:', error); process.exit(1); });

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/worksona/-worksona-mcp-server'

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