Reubencf's picture
Add Flutter tools to Node.js MCP server and remove Python MCP server
33d698c
import { NextRequest, NextResponse } from 'next/server'
import fs from 'fs'
import path from 'path'
const DATA_DIR = process.env.NODE_ENV === 'production' && fs.existsSync('/data')
? '/data'
: path.join(process.cwd(), 'data')
const FLUTTER_APPS_DIR = path.join(DATA_DIR, 'documents', 'flutter_apps')
// Ensure directory exists
if (!fs.existsSync(FLUTTER_APPS_DIR)) {
fs.mkdirSync(FLUTTER_APPS_DIR, { recursive: true })
}
export async function POST(request: NextRequest) {
try {
const body = await request.json()
const { name, dartCode, dependencies = [], pubspecYaml } = body
if (!name || !dartCode) {
return NextResponse.json(
{ success: false, error: 'Name and dartCode are required' },
{ status: 400 }
)
}
// Sanitize name
const safeName = name.replace(/[^a-zA-Z0-9_-]/g, '_').toLowerCase()
if (!safeName) {
return NextResponse.json(
{ success: false, error: 'Invalid app name' },
{ status: 400 }
)
}
// Generate default pubspec.yaml if not provided
let finalPubspecYaml = pubspecYaml
if (!finalPubspecYaml) {
const depLines = dependencies.map((dep: string) => ` ${dep}`).join('\n')
finalPubspecYaml = `name: ${safeName}
description: A Flutter application created via Reuben OS
version: 1.0.0
environment:
sdk: '>=3.0.0 <4.0.0'
dependencies:
flutter:
sdk: flutter
${depLines}
flutter:
uses-material-design: true
`
}
// Create Flutter app object
const flutterApp = {
type: 'flutter_app',
name: safeName,
dartCode,
dependencies,
pubspecYaml: finalPubspecYaml,
metadata: {
created: new Date().toISOString(),
modified: new Date().toISOString(),
author: 'claude'
}
}
// Save to file
const fileName = `${safeName}.flutter.json`
const filePath = path.join(FLUTTER_APPS_DIR, fileName)
// Check if file exists
if (fs.existsSync(filePath)) {
return NextResponse.json(
{ success: false, error: `Flutter app '${safeName}' already exists. Use update instead.` },
{ status: 400 }
)
}
fs.writeFileSync(filePath, JSON.stringify(flutterApp, null, 2), 'utf-8')
return NextResponse.json({
success: true,
appName: safeName,
fileName,
filePath: `flutter_apps/${fileName}`,
dependencies,
message: 'Flutter app created successfully'
})
} catch (error) {
console.error('Error creating Flutter app:', error)
return NextResponse.json(
{ success: false, error: 'Failed to create Flutter app' },
{ status: 500 }
)
}
}