Jake Shore f3c4cd817b Add all MCP servers + factory infra to MCPEngine — 2026-02-06
=== NEW SERVERS ADDED (7) ===
- servers/closebot — 119 tools, 14 modules, 4,656 lines TS (Stage 7)
- servers/google-console — Google Search Console MCP (Stage 7)
- servers/meta-ads — Meta/Facebook Ads MCP (Stage 8)
- servers/twilio — Twilio communications MCP (Stage 8)
- servers/competitor-research — Competitive intel MCP (Stage 6)
- servers/n8n-apps — n8n workflow MCP apps (Stage 6)
- servers/reonomy — Commercial real estate MCP (Stage 1)

=== FACTORY INFRASTRUCTURE ADDED ===
- infra/factory-tools — mcp-jest, mcp-validator, mcp-add, MCP Inspector
  - 60 test configs, 702 auto-generated test cases
  - All 30 servers score 100/100 protocol compliance
- infra/command-center — Pipeline state, operator playbook, dashboard config
- infra/factory-reviews — Automated eval reports

=== DOCS ADDED ===
- docs/MCP-FACTORY.md — Factory overview
- docs/reports/ — 5 pipeline evaluation reports
- docs/research/ — Browser MCP research

=== RULES ESTABLISHED ===
- CONTRIBUTING.md — All MCP work MUST go in this repo
- README.md — Full inventory of 37 servers + infra docs
- .gitignore — Updated for Python venvs

TOTAL: 37 MCP servers + full factory pipeline in one repo.
This is now the single source of truth for all MCP work.
2026-02-06 06:32:29 -05:00

71 lines
1.9 KiB
JavaScript

#!/usr/bin/env node
/**
* Build script — compiles each app in src/apps/* into a single HTML file at dist/app-ui/{name}.html
* Uses Vite + vite-plugin-singlefile to inline all JS/CSS/assets.
*/
import { build } from 'vite';
import { viteSingleFile } from 'vite-plugin-singlefile';
import { readdirSync, existsSync, mkdirSync } from 'fs';
import { resolve, join } from 'path';
const appsDir = resolve('src/apps');
const distDir = resolve('dist/app-ui');
if (!existsSync(distDir)) mkdirSync(distDir, { recursive: true });
const apps = readdirSync(appsDir).filter(d => {
const indexHtml = join(appsDir, d, 'index.html');
return existsSync(indexHtml);
});
console.log(`Building ${apps.length} MCP Apps...\n`);
for (const app of apps) {
const appDir = join(appsDir, app);
const outDir = join(distDir);
console.log(` Building: ${app}...`);
try {
await build({
root: appDir,
plugins: [viteSingleFile()],
build: {
outDir,
emptyOutDir: false,
rollupOptions: {
input: join(appDir, 'index.html'),
output: {
entryFileNames: `${app}.js`,
assetFileNames: `${app}.[ext]`,
}
},
minify: 'esbuild',
},
resolve: {
alias: {
'@components': resolve('src/components'),
'@hooks': resolve('src/hooks'),
'@styles': resolve('src/styles'),
'@utils': resolve('src/utils'),
}
},
logLevel: 'warn',
});
// Rename index.html to {app-name}.html
const { renameSync } = await import('fs');
const srcPath = join(outDir, 'index.html');
const destPath = join(outDir, `${app}.html`);
if (existsSync(srcPath) && srcPath !== destPath) {
renameSync(srcPath, destPath);
}
console.log(`${app} → dist/app-ui/${app}.html`);
} catch (err) {
console.error(`${app} failed:`, err.message);
}
}
console.log(`\nDone! ${apps.length} apps built.`);