Skip to main content
Glama
mcp-build.mjs4.37 kB
#!/usr/bin/env node /** * Custom MCP Build Script * * This script ensures the MCP server can discover tools correctly. * TypeScript compiler already compiles everything to dist/, so we * just need to clean up .ts files and ensure proper structure. */ import { execSync } from 'child_process'; import { mkdirSync, readdirSync, existsSync, rmSync, readFileSync, writeFileSync, chmodSync } from 'fs'; import { join, dirname } from 'path'; import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); console.log('MCP Build Script Starting...'); // Find project root const projectRoot = __dirname; console.log('Project root:', projectRoot); // Helper function to remove .ts files recursively function removeTsFiles(dir) { if (!existsSync(dir)) return; const entries = readdirSync(dir, { withFileTypes: true }); for (const entry of entries) { const entryPath = join(dir, entry.name); if (entry.isFile() && entry.name.endsWith('.ts')) { console.log(` Removing ${entryPath.replace(projectRoot + '/', '')}`); rmSync(entryPath); } else if (entry.isDirectory()) { removeTsFiles(entryPath); } } } // Step 1: Clean dist/tools - remove .ts files (keep only .js) const distToolsPath = join(projectRoot, 'dist', 'tools'); if (existsSync(distToolsPath)) { console.log('Cleaning .ts files from dist/tools...'); removeTsFiles(distToolsPath); } // Step 2: Clean dist/prompts - remove .ts files (keep only .js) const distPromptsPath = join(projectRoot, 'dist', 'prompts'); if (existsSync(distPromptsPath)) { console.log('Cleaning .ts files from dist/prompts...'); removeTsFiles(distPromptsPath); } // Step 3: Compile TypeScript console.log('Running tsc...'); try { execSync('cd ' + projectRoot + ' && tsc', { stdio: 'inherit' }); } catch (error) { console.error('TypeScript compilation failed'); process.exit(1); } // Step 4: Clean dist/lib - remove .ts files (keep only .js) const distLibPath = join(projectRoot, 'dist', 'lib'); if (existsSync(distLibPath)) { console.log('Cleaning .ts files from dist/lib...'); removeTsFiles(distLibPath); } // Step 5: Ensure dist/index.js has shebang and execute permissions const indexPath = join(projectRoot, 'dist', 'index.js'); if (existsSync(indexPath)) { let content = readFileSync(indexPath, 'utf8'); if (!content.startsWith('#!/usr/bin/env node')) { console.log('Adding shebang to index.js...'); content = '#!/usr/bin/env node\n' + content; writeFileSync(indexPath, content); } // Ensure execute permissions console.log('Setting execute permissions on index.js...'); chmodSync(indexPath, 0o755); // rwxr-xr-x } // Step 6: Validate tools console.log('\nValidating tools...'); if (existsSync(distToolsPath)) { const entries = readdirSync(distToolsPath, { withFileTypes: true }); const jsFiles = entries.filter(e => e.isFile() && e.name.endsWith('.js')); const tsFiles = entries.filter(e => e.isFile() && e.name.endsWith('.ts')); console.log(`Found ${jsFiles.length} .js files in dist/tools`); if (tsFiles.length > 0) { console.log(`⚠️ Warning: Found ${tsFiles.length} .ts files (should be removed)`); } else { console.log('✅ No .ts files in dist/tools'); } // Check for DesignselectionTool.js if (jsFiles.some(f => f.name === 'DesignselectionTool.js')) { console.log('✅ Found DesignselectionTool.js'); } else { console.log('❌ DesignselectionTool.js not found'); } // Check for prompts directory (should NOT be in tools) if (entries.some(e => e.isDirectory() && e.name === 'prompts')) { console.log('❌ prompts directory incorrectly in tools'); } else { console.log('✅ prompts directory correctly excluded from tools'); } } // Step 7: Validate prompts console.log('\nValidating prompts...'); if (existsSync(distPromptsPath)) { const entries = readdirSync(distPromptsPath, { withFileTypes: true }); const jsFiles = entries.filter(e => e.isFile() && e.name.endsWith('.js')); if (jsFiles.some(f => f.name === 'designPrompts.js')) { console.log('✅ Found dist/prompts/designPrompts.js'); } else { console.log('❌ dist/prompts/designPrompts.js not found'); } } else { console.log('⚠️ dist/prompts directory not found'); } console.log('\nBuild completed successfully!');

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/madebyaris/rakitui-ai'

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