# FlutterFlow AI MCP Server — Windows Setup Script # ================================================== # Run this in PowerShell as Administrator for system-wide Dart install, # or as your normal user for local workspace setup. # # Prerequisites: Git # Optional: Cursor IDE, VS Code, Ollama (for local LLM) param( [string]$ProjectId = "org-smart-zhy03j", [string]$WorkspaceDir = "", [string]$FlutterFlowApiKey = "", [switch]$InstallDart, [switch]$InstallCursorExtensions, [switch]$InstallVSCodeExtensions, [switch]$SetupOllama, [switch]$Help ) $ErrorActionPreference = "Stop" if ($Help) { Write-Host @" FlutterFlow AI MCP Server — Windows Setup Usage: .\setup-flutterflow-ai-windows.ps1 [options] Options: -ProjectId FlutterFlow project ID (default: org-smart-zhy03j) -WorkspaceDir Target workspace directory (default: C:\Dev\orgsmart) -FlutterFlowApiKey Your FlutterFlow API key (prompts if not provided) -InstallDart Install Dart SDK via Chocolatey if not found -InstallCursorExtensions Install MCP config + extensions for Cursor -InstallVSCodeExtensions Install MCP config + extensions for VS Code -SetupOllama Install and configure Ollama with GLM-5.1 -Help Show this help message Examples: # Full setup (Dart + Cursor + VS Code + Ollama): .\setup-flutterflow-ai-windows.ps1 -InstallDart -InstallCursorExtensions -InstallVSCodeExtensions -SetupOllama # Minimal setup (just workspace + MCP config): .\setup-flutterflow-ai-windows.ps1 -FlutterFlowApiKey "YOUR_API_KEY" "@ exit 0 } # ── Colours ──────────────────────────────────────────────────────────────── function Write-Step($msg) { Write-Host "`n>>> $msg" -ForegroundColor Cyan } function Write-Ok($msg) { Write-Host " OK $msg" -ForegroundColor Green } function Write-Warn($msg) { Write-Host " WARN $msg" -ForegroundColor Yellow } function Write-Fail($msg) { Write-Host " FAIL $msg" -ForegroundColor Red } # ── 1. Check / Install Dart SDK ─────────────────────────────────────────── Write-Step "Checking Dart SDK..." $dartExe = Get-Command dart -ErrorAction SilentlyContinue if (-not $dartExe) { if ($InstallDart) { Write-Host "Dart not found. Installing via Chocolatey..." if (-not (Get-Command choco -ErrorAction SilentlyContinue)) { Write-Fail "Chocolatey not found. Install it from https://chocolatey.org or run this script with admin rights." exit 1 } choco install dart-sdk -y refreshenv 2>$null $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") $dartExe = Get-Command dart -ErrorAction SilentlyContinue } else { Write-Fail "Dart SDK not found. Re-run with -InstallDart or install from https://dart.dev/get-dart" exit 1 } } $dartVersion = & dart --version 2>&1 | Select-Object -First 1 Write-Ok "Dart found: $dartVersion" # ── 2. Install FlutterFlow CLI ──────────────────────────────────────────── Write-Step "Installing FlutterFlow CLI..." & dart pub global activate flutterflow_cli 2>$null if ($LASTEXITCODE -ne 0) { Write-Fail "Failed to install flutterflow_cli" exit 1 } $ffBin = Join-Path $env:LOCALAPPDATA "Pub\Cache\bin\flutterflow.exe" $env:Path = "$env:Path;$($env:LOCALAPPDATA)\Pub\Cache\bin" Write-Ok "FlutterFlow CLI installed" # ── 3. Prompt for API key if not provided ───────────────────────────────── if (-not $FlutterFlowApiKey) { $FlutterFlowApiKey = Read-Host "Enter your FlutterFlow API key (from https://app.flutterflow.io/account-settings)" if (-not $FlutterFlowApiKey) { Write-Fail "API key is required" exit 1 } } # ── 4. Create workspace directory ───────────────────────────────────────── if (-not $WorkspaceDir) { $WorkspaceDir = "C:\Dev\orgsmart" } Write-Step "Setting up workspace at $WorkspaceDir..." if (-not (Test-Path $WorkspaceDir)) { New-Item -ItemType Directory -Path $WorkspaceDir -Force | Out-Null } # ── 5. Initialize FlutterFlow AI workspace ───────────────────────────────── Write-Step "Initializing FlutterFlow AI workspace..." Push-Location $WorkspaceDir try { & flutterflow ai init orgsmart --project $ProjectId --api-key $FlutterFlowApiKey --yes if ($LASTEXITCODE -ne 0) { Write-Fail "Workspace init failed" exit 1 } Write-Ok "Workspace initialized" } finally { Pop-Location } $workspacePath = Join-Path $WorkspaceDir "orgsmart" $mcpServerPath = Join-Path $workspacePath ".flutterflow\sdk\flutterflow_ai\mcp\server.dart" if (-not (Test-Path $mcpServerPath)) { # Try alternate path (may be in different location) $mcpServerPath = Get-ChildItem -Path $workspacePath -Recurse -Filter "server.dart" | Where-Object { $_.FullName -match "flutterflow_ai.mcp" } | Select-Object -First 1 -ExpandProperty FullName } if (-not $mcpServerPath) { Write-Fail "MCP server.dart not found in workspace. Run 'flutterflow ai init' manually." exit 1 } Write-Ok "MCP server path: $mcpServerPath" # ── 6. Save credentials ────────────────────────────────────────────────── Write-Step "Saving FlutterFlow credentials..." $credDir = Join-Path $env:USERPROFILE ".flutterflow" if (-not (Test-Path $credDir)) { New-Item -ItemType Directory -Path $credDir -Force | Out-Null } $credFile = Join-Path $credDir "credentials.json" $savedAt = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ") $credJson = @" { "version": 1, "credentials": [ { "baseUrl": "https://api.flutterflow.io/v2", "apiKey": "$FlutterFlowApiKey", "savedAt": "$savedAt" } ] } "@ Set-Content -Path $credFile -Value $credJson -Encoding UTF8 Write-Ok "Credentials saved to $credFile" # ── 7. Cursor MCP config ────────────────────────────────────────────────── if ($InstallCursorExtensions) { Write-Step "Configuring Cursor IDE..." $cursorDir = Join-Path $env:USERPROFILE ".cursor" if (-not (Test-Path $cursorDir)) { New-Item -ItemType Directory -Path $cursorDir -Force | Out-Null } $cursorMcp = Join-Path $cursorDir "mcp.json" $mcpConfig = @" { "mcpServers": { "flutterflow_ai": { "command": "dart", "args": [ "run", "$($mcpServerPath -replace '\\','\\')", "--dir", "$($workspacePath -replace '\\','\\')" ] }, "ollama": { "url": "http://localhost:11434" } } } "@ Set-Content -Path $cursorMcp -Value $mcpConfig -Encoding UTF8 Write-Ok "Cursor MCP config written to $cursorMcp" # Install Cline extension in Cursor Write-Host " Installing Cline extension in Cursor..." & cursor --install-extension saoudrizwan.claude-dev --force 2>$null Write-Ok "Cline extension installed in Cursor" # Cline MCP config for Cursor $clineDir = Join-Path $cursorDir "User\globalStorage\saoudrizwan.claude-dev\settings" if (-not (Test-Path $clineDir)) { New-Item -ItemType Directory -Path $clineDir -Force | Out-Null } $clineMcp = Join-Path $clineDir "cline_mcp_settings.json" $clineConfig = @" { "mcpServers": { "flutterflow_ai": { "command": "dart", "args": [ "run", "$($mcpServerPath -replace '\\','\\')", "--dir", "$($workspacePath -replace '\\','\\')" ] }, "ollama": { "url": "http://localhost:11434" } } } "@ Set-Content -Path $clineMcp -Value $clineConfig -Encoding UTF8 Write-Ok "Cline MCP config written" } # ── 8. VS Code MCP config ──────────────────────────────────────────────── if ($InstallVSCodeExtensions) { Write-Step "Configuring VS Code..." $vscodeSettingsDir = Join-Path $env:APPDATA "Code\User" if (-not (Test-Path $vscodeSettingsDir)) { New-Item -ItemType Directory -Path $vscodeSettingsDir -Force | Out-Null } $vscodeSettings = Join-Path $vscodeSettingsDir "settings.json" # Merge with existing settings $existingSettings = @{} if (Test-Path $vscodeSettings) { try { $existingSettings = Get-Content $vscodeSettings -Raw | ConvertFrom-Json -AsHashtable } catch { Write-Warn "Could not parse existing VS Code settings, will overwrite" } } # Add MCP servers $existingSettings["mcp"] = @{ "servers" = @{ "flutterflow_ai" = @{ "command" = "dart" "args" = @( "run", $mcpServerPath, "--dir", $workspacePath ) } "ollama" = @{ "url" = "http://localhost:11434" } } } $existingSettings["flutterflow.userApiToken"] = $FlutterFlowApiKey $settingsJson = $existingSettings | ConvertTo-Json -Depth 10 Set-Content -Path $vscodeSettings -Value $settingsJson -Encoding UTF8 Write-Ok "VS Code settings written to $vscodeSettings" # Install extensions Write-Host " Installing extensions in VS Code..." & code --install-extension saoudrizwan.claude-dev --force 2>$null & code --install-extension Continue.continue --force 2>$null Write-Ok "VS Code extensions installed (Cline, Continue)" # Cline MCP config for VS Code $vscodeClineDir = Join-Path $vscodeSettingsDir "globalStorage\saoudrizwan.claude-dev\settings" if (-not (Test-Path $vscodeClineDir)) { New-Item -ItemType Directory -Path $vscodeClineDir -Force | Out-Null } $vscodeClineMcp = Join-Path $vscodeClineDir "cline_mcp_settings.json" Set-Content -Path $vscodeClineMcp -Value $clineConfig -Encoding UTF8 Write-Ok "Cline MCP config written for VS Code" # Continue config $continueDir = Join-Path $env:USERPROFILE ".continue" if (-not (Test-Path $continueDir)) { New-Item -ItemType Directory -Path $continueDir -Force | Out-Null } $continueConfig = @" name: OrgSmart Config version: 1.0.0 schema: v1 models: - name: GLM 5.1 (Cloud via Ollama) provider: ollama model: glm-5.1:cloud apiBase: http://localhost:11434 mcpServers: - name: flutterflow_ai command: dart args: - run - $($mcpServerPath -replace '\\','/') - --dir - $($workspacePath -replace '\\','/') "@ Set-Content -Path (Join-Path $continueDir "config.yaml") -Value $continueConfig -Encoding UTF8 Write-Ok "Continue config written" } # ── 9. Ollama + GLM-5.1 ────────────────────────────────────────────────── if ($SetupOllama) { Write-Step "Setting up Ollama with GLM-5.1..." $ollamaExe = Get-Command ollama -ErrorAction SilentlyContinue if (-not $ollamaExe) { Write-Host "Ollama not found. Installing..." winget install Ollama.Ollama --accept-package-agreements --accept-source-agreements 2>$null if ($LASTEXITCODE -ne 0) { Write-Warn "winget install failed. Download from https://ollama.com/download/windows" } else { # Refresh PATH $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") } } # Wait for Ollama to start Write-Host " Starting Ollama service..." Start-Process "ollama" -ArgumentList "serve" -WindowStyle Hidden 2>$null Start-Sleep -Seconds 5 Write-Host " Pulling GLM-5.1 cloud model..." & ollama pull glm-5.1:cloud Write-Ok "GLM-5.1:cloud model available" } # ── 10. Summary ─────────────────────────────────────────────────────────── Write-Host "" Write-Host "========================================" -ForegroundColor Green Write-Host " FlutterFlow AI Setup Complete!" -ForegroundColor Green Write-Host "========================================" -ForegroundColor Green Write-Host "" Write-Host " Workspace: $workspacePath" Write-Host " Project ID: $ProjectId" Write-Host " MCP Server: $mcpServerPath" Write-Host "" if ($InstallCursorExtensions) { Write-Host " Cursor: MCP configured (~/.cursor/mcp.json)" -ForegroundColor Green } if ($InstallVSCodeExtensions) { Write-Host " VS Code: MCP configured (settings.json)" -ForegroundColor Green } if ($SetupOllama) { Write-Host " Ollama: GLM-5.1:cloud available" -ForegroundColor Green } Write-Host "" Write-Host " Next steps:" -ForegroundColor Yellow Write-Host " 1. Restart your IDE(s) to load MCP servers" Write-Host " 2. Open the workspace folder: $workspacePath" Write-Host " 3. In Cursor/VS Code, select GLM-5.1:cloud as your AI model" Write-Host " 4. Use FlutterFlow tools: init, run, validate, inspect, resources" Write-Host "" Write-Host " Quick commands:" -ForegroundColor Yellow Write-Host " flutterflow ai inspect $ProjectId" Write-Host " flutterflow ai validate dsl\edit.dart --project-id $ProjectId" Write-Host " flutterflow ai run dsl\edit.dart --project-id $ProjectId --commit-message `"My change`"" Write-Host ""