Business Central MCP Server

/** * Enhanced Azure deployment helper with better error handling */ const fs = require('fs'); const path = require('path'); const { execSync } = require('child_process'); console.log('Preparing Business Central MCP server for Azure deployment...'); // Create enhanced web.config file const webConfig = `<?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <webSocket enabled="false" /> <handlers> <add name="iisnode" path="mcp-server.js" verb="*" modules="iisnode"/> </handlers> <rewrite> <rules> <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true"> <match url="^mcp-server.js\\/debug[\\/]?" /> </rule> <rule name="StaticContent"> <action type="Rewrite" url="public{REQUEST_URI}"/> </rule> <rule name="DynamicContent"> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/> </conditions> <action type="Rewrite" url="mcp-server.js"/> </rule> </rules> </rewrite> <security> <requestFiltering> <hiddenSegments> <remove segment="bin"/> </hiddenSegments> </requestFiltering> </security> <httpErrors existingResponse="PassThrough" /> <!-- Add iisnode specific settings --> <iisnode nodeProcessCommandLine="node" loggingEnabled="true" logDirectory="iisnode" watchedFiles="*.js;node_modules\*;*.json" node_env="%node_env%" /> </system.webServer> <!-- Fix for environment variables --> <system.webServer> <httpProtocol> <customHeaders> <remove name="X-Powered-By"/> </customHeaders> </httpProtocol> </system.webServer> </configuration>`; fs.writeFileSync(path.join(__dirname, 'web.config'), webConfig); console.log('✅ Created enhanced web.config for Azure App Service'); // Create improved deploy.sh script const deployScript = `#!/bin/bash # ---------------------- # Enhanced Azure Deployment Script # ---------------------- # Print current directory and files for debugging echo "Current directory: $(pwd)" echo "Files in directory:" ls -la # Install dependencies with detailed logging echo "Installing dependencies..." npm install --production --loglevel verbose || { echo "npm install failed"; exit 1; } # Create necessary directories mkdir -p ./public mkdir -p ./logs mkdir -p ./iisnode # Ensure file permissions are correct chmod 755 ./mcp-server.js chmod -R 755 ./public # Verify Node.js version echo "Node.js version: $(node -v)" echo "NPM version: $(npm -v)" echo "Deployment script completed successfully"`; fs.writeFileSync(path.join(__dirname, 'deploy.sh'), deployScript); execSync('chmod +x deploy.sh', { stdio: 'inherit' }); console.log('✅ Created and made enhanced deploy.sh executable'); // Update package.json for Azure try { const packageJson = JSON.parse(fs.readFileSync('./package.json')); // Ensure engines is specified for Node.js version packageJson.engines = packageJson.engines || {}; packageJson.engines.node = packageJson.engines.node || ">=14.0.0"; // Add important Azure-specific scripts packageJson.scripts = packageJson.scripts || {}; packageJson.scripts.start = "node mcp-server.js"; packageJson.scripts["azure-postdeploy"] = "echo Deployment to Azure completed successfully"; fs.writeFileSync('./package.json', JSON.stringify(packageJson, null, 2)); console.log('✅ Updated package.json with Azure-optimized configuration'); } catch (error) { console.error('Error updating package.json:', error); } // Create .env.example if it doesn't exist if (!fs.existsSync('./.env.example')) { const envExample = `# Business Central MCP Server Configuration MCP_SERVER_PORT=8080 MCP_SERVER_HOST=0.0.0.0 JWT_SECRET=your_jwt_secret_key_here `; fs.writeFileSync('./.env.example', envExample); console.log('✅ Created .env.example file for reference'); } console.log('\n✅ Enhanced preparation for Azure deployment completed!');