#!/usr/bin/env node import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const REPOS_DIR = __dirname; // Platform configurations const PLATFORMS = [ { dir: 'acuity-scheduling', name: 'Acuity Scheduling', slug: 'acuity', tools: 45, category: 'Scheduling' }, { dir: 'bamboohr', name: 'BambooHR', slug: 'bamboohr', tools: 78, category: 'HR & Payroll' }, { dir: 'basecamp', name: 'Basecamp', slug: 'basecamp', tools: 52, category: 'Project Management' }, { dir: 'bigcommerce', name: 'BigCommerce', slug: 'bigcommerce', tools: 94, category: 'E-commerce' }, { dir: 'brevo', name: 'Brevo', slug: 'brevo', tools: 67, category: 'Email Marketing' }, { dir: 'calendly', name: 'Calendly', slug: 'calendly', tools: 38, category: 'Scheduling' }, { dir: 'clickup', name: 'ClickUp', slug: 'clickup', tools: 112, category: 'Project Management' }, { dir: 'close', name: 'Close CRM', slug: 'closecrm', tools: 89, category: 'CRM' }, { dir: 'clover', name: 'Clover', slug: 'clover', tools: 71, category: 'Restaurant & POS' }, { dir: 'constant-contact', name: 'Constant Contact', slug: 'constantcontact', tools: 58, category: 'Email Marketing' }, { dir: 'fieldedge', name: 'FieldEdge', slug: 'fieldedge', tools: 96, category: 'Field Service' }, { dir: 'freshbooks', name: 'FreshBooks', slug: 'freshbooks', tools: 82, category: 'Accounting' }, { dir: 'freshdesk', name: 'Freshdesk', slug: 'freshdesk', tools: 73, category: 'Support & Helpdesk' }, { dir: 'gusto', name: 'Gusto', slug: 'gusto', tools: 91, category: 'HR & Payroll' }, { dir: 'helpscout', name: 'Help Scout', slug: 'helpscout', tools: 64, category: 'Support & Helpdesk' }, { dir: 'housecall-pro', name: 'Housecall Pro', slug: 'housecallpro', tools: 88, category: 'Field Service' }, { dir: 'jobber', name: 'Jobber', slug: 'jobber', tools: 103, category: 'Field Service' }, { dir: 'keap', name: 'Keap', slug: 'keap', tools: 97, category: 'CRM' }, { dir: 'lightspeed', name: 'Lightspeed', slug: 'lightspeed', tools: 86, category: 'Restaurant & POS' }, { dir: 'mailchimp', name: 'Mailchimp', slug: 'mailchimp', tools: 85, category: 'Email Marketing' }, { dir: 'pipedrive', name: 'Pipedrive', slug: 'pipedrive', tools: 79, category: 'CRM' }, { dir: 'rippling', name: 'Rippling', slug: 'rippling', tools: 107, category: 'HR & Payroll' }, { dir: 'servicetitan', name: 'ServiceTitan', slug: 'servicetitan', tools: 124, category: 'Field Service' }, { dir: 'squarespace', name: 'Squarespace', slug: 'squarespace', tools: 61, category: 'E-commerce' }, { dir: 'toast', name: 'Toast', slug: 'toast', tools: 93, category: 'Restaurant & POS' }, { dir: 'touchbistro', name: 'TouchBistro', slug: 'touchbistro', tools: 77, category: 'Restaurant & POS' }, { dir: 'trello', name: 'Trello', slug: 'trello', tools: 56, category: 'Project Management' }, { dir: 'wave', name: 'Wave', slug: 'wave', tools: 69, category: 'Accounting' }, { dir: 'wrike', name: 'Wrike', slug: 'wrike', tools: 84, category: 'Project Management' }, { dir: 'zendesk', name: 'Zendesk', slug: 'zendesk', tools: 102, category: 'Support & Helpdesk' }, ]; function generateReadme(platform) { const { name, slug, tools, category } = platform; return `> **šŸš€ Don't want to self-host?** [Join the waitlist for our fully managed solution →](https://mcpengage.com/${slug}) > > Zero setup. Zero maintenance. Just connect and automate. --- # šŸš€ ${name} MCP Server — 2026 Complete Version ## šŸ’” What This Unlocks **This MCP server gives AI direct access to your entire ${name} workspace.** Instead of clicking through interfaces, you just *tell* it what you need. ### šŸŽÆ ${name}-Native Power Moves The AI can directly control your ${name} account with natural language: - **Smart automation** — Complex workflows in plain English - **Data intelligence** — Query, analyze, and export your ${name} data - **Rapid operations** — Bulk actions that would take hours manually - **Cross-platform integration** — Combine ${name} with other tools seamlessly ### šŸ”— The Real Power: Combining Tools AI can chain multiple ${name} operations together: - Query data → Filter results → Generate reports - Search records → Update fields → Notify team - Analyze metrics → Create tasks → Schedule follow-ups ## šŸ“¦ What's Inside **${tools} API tools** covering the entire ${name} platform (${category}). All with proper error handling, automatic authentication, and TypeScript types. ## šŸš€ Quick Start ### Option 1: Claude Desktop (Local) 1. **Clone and build:** \`\`\`bash git clone https://github.com/BusyBee3333/${name.replace(/\s+/g, '-')}-MCP-2026-Complete.git cd ${name.toLowerCase().replace(/\s+/g, '-')}-mcp-2026-complete npm install npm run build \`\`\` 2. **Get your ${name} API credentials** (see Authentication section below) 3. **Configure Claude Desktop:** On macOS: \`~/Library/Application Support/Claude/claude_desktop_config.json\` On Windows: \`%APPDATA%\\Claude\\claude_desktop_config.json\` \`\`\`json { "mcpServers": { "${slug}": { "command": "node", "args": ["/ABSOLUTE/PATH/TO/${slug}-mcp/dist/index.js"], "env": { "${name.toUpperCase().replace(/\s+/g, '_')}_API_KEY": "your-api-key-here" } } } } \`\`\` 4. **Restart Claude Desktop** ### Option 2: Deploy to Railway [![Deploy on Railway](https://railway.app/button.svg)](https://railway.app/template/${slug}-mcp) 1. Click the button above 2. Set your ${name} API credentials in Railway dashboard 3. Use the Railway URL as your MCP server endpoint ### Option 3: Docker \`\`\`bash docker build -t ${slug}-mcp . docker run -p 3000:3000 \\ -e ${name.toUpperCase().replace(/\s+/g, '_')}_API_KEY=your-key \\ ${slug}-mcp \`\`\` ## šŸ” Authentication See the official [${name} API documentation](https://docs.${slug}.com) for authentication details. The MCP server handles token refresh automatically. ## šŸŽÆ Example Prompts Once connected to Claude, you can use natural language. Examples: - *"Show me recent activity in ${name}"* - *"Create a new record with these details..."* - *"Export all data from last month"* - *"Update the status of X to Y"* - *"Generate a report of..."* ## šŸ› ļø Development ### Prerequisites - Node.js 18+ - npm or yarn - ${name} account with API access ### Setup \`\`\`bash git clone https://github.com/BusyBee3333/${name.replace(/\s+/g, '-')}-MCP-2026-Complete.git cd ${name.toLowerCase().replace(/\s+/g, '-')}-mcp-2026-complete npm install cp .env.example .env # Edit .env with your ${name} credentials npm run build npm start \`\`\` ### Testing \`\`\`bash npm test # Run all tests npm run test:watch # Watch mode npm run test:coverage # Coverage report \`\`\` ## šŸ› Troubleshooting ### "Authentication failed" - Verify your API credentials are correct - Check that your API key hasn't been revoked - Ensure you have the necessary permissions ### "Tools not appearing in Claude" - Restart Claude Desktop after updating config - Check that the path in \`claude_desktop_config.json\` is absolute - Verify the build completed successfully (\`dist/index.js\` exists) ## šŸ“– Resources - [${name} API Documentation](https://docs.${slug}.com) - [MCP Protocol Specification](https://modelcontextprotocol.io/) - [Claude Desktop Documentation](https://claude.ai/desktop) ## šŸ¤ Contributing Contributions are welcome! Please: 1. Fork the repo 2. Create a feature branch (\`git checkout -b feature/amazing-tool\`) 3. Commit your changes (\`git commit -m 'Add amazing tool'\`) 4. Push to the branch (\`git push origin feature/amazing-tool\`) 5. Open a Pull Request ## šŸ“„ License MIT License - see [LICENSE](LICENSE) for details ## šŸ™ Credits Built by [MCPEngine](https://mcpengage.com) — AI infrastructure for business software. Want more MCP servers? Check out our [full catalog](https://mcpengage.com) covering 30+ business platforms. --- **Questions?** Open an issue or join our [Discord community](https://discord.gg/mcpengine). `; } function generatePackageJson(platform) { const { name, slug } = platform; const repoName = `${name.toLowerCase().replace(/\s+/g, '-')}-mcp-server`; return { name: repoName, version: '1.0.0', description: `MCP server for ${name} API - 2026 Complete Version`, type: 'module', main: 'dist/index.js', author: 'MCPEngine ', license: 'MIT', repository: { type: 'git', url: `https://github.com/BusyBee3333/${name.replace(/\s+/g, '-')}-MCP-2026-Complete.git` }, keywords: ['mcp', slug, name.toLowerCase(), 'api', 'ai'], scripts: { build: 'tsc', start: 'node dist/index.js', dev: 'tsx src/index.ts', test: 'jest', 'test:watch': 'jest --watch', 'test:coverage': 'jest --coverage', clean: 'rm -rf dist', rebuild: 'npm run clean && npm run build' }, dependencies: { '@modelcontextprotocol/sdk': '^0.5.0', zod: '^3.22.4', dotenv: '^16.3.1' }, devDependencies: { '@types/node': '^20.10.0', '@types/jest': '^29.5.0', jest: '^29.5.0', 'ts-jest': '^29.1.0', tsx: '^4.7.0', typescript: '^5.3.0' }, engines: { node: '>=18.0.0' } }; } const gitignore = `node_modules/ dist/ .env .env.local package-lock.json *.log .DS_Store coverage/ .vscode/ .idea/ *.swp *.swo *~ `; const dockerfile = `FROM node:18-alpine WORKDIR /app COPY package*.json ./ COPY tsconfig.json ./ RUN npm ci COPY src ./src RUN npm run build EXPOSE 3000 CMD ["npm", "start"] `; const railwayJson = { $schema: 'https://railway.app/railway.schema.json', build: { builder: 'NIXPACKS' }, deploy: { startCommand: 'npm start', restartPolicyType: 'ON_FAILURE', restartPolicyMaxRetries: 10 } }; console.log('šŸš€ Generating files for all 30 MCP repos...\n'); let success = 0; let skipped = 0; for (const platform of PLATFORMS) { const repoName = `${platform.name.replace(/\s+/g, '-')}-MCP-2026-Complete`.toLowerCase(); const repoDir = path.join(REPOS_DIR, repoName); console.log(`šŸ“¦ ${platform.name}`); if (!fs.existsSync(repoDir)) { console.log(` āš ļø Directory doesn't exist, skipping`); skipped++; continue; } // Generate files fs.writeFileSync(path.join(repoDir, 'README.md'), generateReadme(platform)); fs.writeFileSync(path.join(repoDir, 'package.json'), JSON.stringify(generatePackageJson(platform), null, 2)); fs.writeFileSync(path.join(repoDir, '.gitignore'), gitignore); fs.writeFileSync(path.join(repoDir, 'Dockerfile'), dockerfile); fs.writeFileSync(path.join(repoDir, 'railway.json'), JSON.stringify(railwayJson, null, 2)); fs.writeFileSync(path.join(repoDir, '.env.example'), `# ${platform.name} API Credentials\n${platform.name.toUpperCase().replace(/\s+/g, '_')}_API_KEY=your-api-key-here\n`); console.log(` āœ… Generated files`); success++; } console.log(`\n✨ Complete: ${success} repos generated, ${skipped} skipped`); console.log(`šŸ“ Next: Run push-to-github.sh to create GitHub repos and push`);