Staticbot MCP server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| STATICBOT_API_KEY | Yes | Authenticates requests to Staticbot | |
| STATICBOT_API_URL | No | Override only for a self-hosted or local API | https://app.staticbot.dev |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_account_statusA | START HERE. The first call of any Staticbot conversation, and the cheapest: it answers in one request who the credential belongs to, which integrations are connected, what the plan allows, and what is actually outstanding — so you never propose work whose prerequisites are missing. Read |
| list_templatesA | List available templates (slim response: id, name, category, repoLink). Use get_template to see full details including config variables. Templates feed both hosting and migration. Reuse an exact repository match when one exists; otherwise create a new template from the repository resolved through list_source_repositories. Ask the user to choose only when multiple existing templates or repositories are plausible — and when two repositories share a name, show which account each is hosted in (sourceLabel) so the choice is meaningful. |
| get_templateA | Get details of a template including its backend-classified configuration variables. Each entry has |
| create_templateA | Create a new template by scanning a source repository (GitHub or GitLab). Auto-detects platforms, env vars, and builders. Both public and private repositories are supported through the organization's connected Staticbot source-control integration. Before asking the user for a URL, call list_source_repositories and use an unambiguous repository match from the current client/project context, passing that repository's integrationInstanceId as sourceControlIntegrationInstanceId — with several accounts connected, only that one's token can read the repo, and omitting it makes a private repository look missing. If no source-control integration is connected, direct the user to https://app.staticbot.dev/integrations and retry after they connect it. Never claim the repository must be public. Staticbot also classifies the repository's hosting workload; inspect the returned |
| list_stacksA | List all infrastructure stacks. A stack groups one or more templates with a domain assignment. Each stack can have multiple deployments. |
| get_stackA | Get details of a stack including its templates and config overrides. Every override key is listed; values are returned for location-shaped keys (URLs, regions, names, branches) and "[REDACTED]" for credential-shaped ones. |
| create_stackA | Create a new infrastructure stack from a template. A stack ties a template to a domain and becomes deployable. Call list_templates first to find the right templateId. Staticbot analyzes the template's repository and owns the hosting decision: static sites route to the supported AWS static target, SSR/full-stack apps route to the supported Cloudflare Workers target. Report the returned Never invent a provider or an account. Cloudflare alone accepts an account-placement default during stack creation because a customer Worker stack pins its connected integration and resolved zone. If the user wants that, call list_cloudflare_hosting_targets, let them choose, then preflight_cloudflare_hosting and pass the preflighted For templates that use Supabase, pass supabaseIntegrationInstanceId + supabaseProjectRef. Staticbot fills and refreshes the declared Supabase configuration from the connected account; never ask the user for Supabase API keys. |
| list_deploymentsA | List all deployments. Optionally filter by stackId. Each deployment represents one execution of a stack's infrastructure. |
| create_deploymentA | Create a new deployment for a stack. This prepares the deployment but does NOT start it — call start_deployment next. Default type is APPLY (creates real resources). Use PLAN for a dry-run preview. For an AWS-hosted stack, call list_aws_hosting_targets with the stackId first and pass the selected option's exact Do not set cloudflareChoice or cloudflareHostname unless the user has chosen to host a Cloudflare Workers app in their OWN Cloudflare account: call list_cloudflare_hosting_targets, let the user pick, then preflight_cloudflare_hosting, and pass that choice plus the hostname. Omit both to use the stack's existing hosting, which is the normal case — Staticbot hosts it. |
| start_deploymentA | Start a deployment that was created with create_deployment. The deployment must be in CREATED status. Once started, Staticbot provisions the repository-derived target stored on the stack. Poll get_deployment to track progress. |
| get_deploymentA | Get the status of a deployment and the per-domain DNS state. Poll this for progress. Statuses: CREATED → PENDING → IN_PROGRESS → WAITING → COMPLETED (or FAILED). Response fields you should always read:
For each entry in
Other fields per domain:
The response also includes |
| push_dns_to_cloudflareA | Push a deployment's certificate-validation and website-routing DNS records into the customer's linked Cloudflare zone. This is an external DNS write, although it is idempotent and never changes nameservers or mail records. First call get_deployment and select the exact dns item whose action is OFFER_CLOUDFLARE_PUSH; pass the deployment response's id as deploymentId and that DNS item's domainId as domainId. Present the intended action and obtain the user's authorization before calling. Do not infer a domain ID, use this for MANUAL_RECORDS_AT_REGISTRAR, or describe it as DNS delegation. Present the returned message and every per-record error. Manual records at the current provider remain the fallback. |
| recheck_dns_verificationA | Ask Cloudflare to retry custom-hostname domain-control validation for a Cloudflare Workers deployment, then return refreshed certificate and hostname-routing status. Call this after DNS records were published or when the user explicitly asks to recheck verification. This action does not write DNS records or change nameservers. A null result means the deployment has no applicable Cloudflare custom hostname. Surface verificationErrors and do not report the domain live unless both customHostnameStatus and hostnameStatus are active. |
| list_aws_hosting_targetsA | Use this when an existing stack's deploymentTarget is AWS_STATIC and you need to choose which AWS account will own its next deployment. Call it with that stack's stackId before create_deployment because managed-account eligibility and the current selection are stack-specific. Render the response; do not derive or repair it:
If one usable option exists, use it without asking. If several exist, present them and let the user decide. If none exist, show the notices and do not create a deployment. Pass only a returned option's exact |
| list_cloudflare_hosting_targetsA | List the Cloudflare accounts this app can be hosted in: Staticbot's managed account (the default) plus any Cloudflare account the user has connected. Call this before create_stack or create_deployment for a Cloudflare Workers / SSR app whenever the user has a connected Cloudflare account and might want the Worker deployed into it rather than hosted by Staticbot. Read the response, do not compute from it:
Do not decide for the user. If Before creating anything with a customer choice, call preflight_cloudflare_hosting — it reports collisions that would otherwise fail the deployment. |
| preflight_cloudflare_hostingA | Check that a hosting choice and hostname can actually be deployed, before create_stack or create_deployment. Read-only: it never creates, deletes or takes over anything. It answers for the managed choice too, so call it the same way whichever option the user picked. How to use the result:
For a customer choice, |
| get_auto_deploy_settingsB | Get the automatic-update flags for a deployment. |
| update_auto_deploy_settingsA | Update automatic-update flags for a deployment. Omitted fields keep their current values. IMPORTANT: Confirm the requested settings with the user before calling this tool. |
| get_auto_deploy_infoA | Check whether Automatic Updates are available for a deployment and inspect its GitHub webhook state. Returns fields including |
| list_rollback_versionsA | List the recent commit-pinned website template versions that are valid rollback targets for a deployment, newest first. Use only a returned |
| rollback_websiteA | Roll a static website back to a specific commit-pinned template version. Call list_rollback_versions first. IMPORTANT: Present the exact returned target version and commit to the user and get explicit confirmation before calling this tool. Never supply an inferred or unverified template ID. Returns the worker job ID; poll get_deployment to track progress. |
| redeploy_websiteA | Rebuild and redeploy the static website component. By default it redeploys the currently pinned template version; set |
| list_migrationsA | List all migrations. Optionally filter by status. Migrations orchestrate moving a full project (database, auth, storage, edge functions) from a source platform (Lovable, Bolt, Firebase, Base44) to target Supabase infrastructure. |
| get_migrationA | Get the current status and phase breakdown of a migration. The response includes all migration phases (Discovery, DB Migration, Data Import, Edge Functions, Storage Buckets, Auth Config, Backend Switchover, Preview & Verify, Continuous Sync, Download, Follow-ups) with their individual statuses, plus sourceType (LOVABLE_SUPABASE / BOLT_SUPABASE / FIREBASE / BASE44_SUPABASE / BASE44_NATIVE), targetType (SUPABASE_CLOUD / SUPABASE_SELF_HOSTED), and packageAvailable (true once the downloadable zip is ready — fetch via download_package). Self-navigating: the response includes a The response exposes The response also includes The Polling Phase 7 (Backend Switchover): the response also includes |
| confirm_migrationA | Approve a migration after discovery, or resolve a pre-flight migration-strategy gate. Before calling, get the migration and present the discovery inventory. If |
| get_clean_target_planA | Inspect a destructive target cleanup BEFORE asking the user to authorize it. Always call this immediately before presenting cleanup, and never rely on the targetConflictReport from an earlier get_migration: that is a snapshot taken at discovery, while this is the current state of the target. Returns |
| clean_migration_targetA | Destructively clean conflicting objects from a Supabase Cloud migration target before execution starts. Call get_clean_target_plan first and take confirmProjectRef from its response — it reports the live state and whether cleanup is even available. DATABASE deletes user-created database objects, Supabase migration history, and existing authentication users/sessions while preserving Storage. STORAGE empties and deletes every Storage bucket and file while preserving database/auth data. PROJECT performs both cleanups. This cannot be undone. Before calling, get the migration, present the exact scope consequences and targetConflictReport.confirmationProjectRef, and obtain explicit user confirmation for that exact project and scope. Copy the returned confirmationProjectRef into confirmProjectRef; never guess it. The migration remains paused after cleanup. |
| resume_migrationA | Resume a migration that is PAUSED_BY_USER or PAUSED_FOR_USER_ACTION. Use this after the user has completed the required manual step (e.g. DNS configuration, backend switchover review). |
| pause_migrationA | Pause a running migration. The current in-progress job will finish, but no new jobs will be started. Use resume_migration to continue later. |
| get_migration_jobsA | Get all jobs for a migration. Jobs are the individual work units within each phase (e.g. 'migrate_schema', 'import_data', 'deploy_edge_function_X'). Use this to understand what's happening at a granular level, diagnose failures, or find a jobId for retry/skip. For IN_PROGRESS long-running jobs (e.g. CALL_EXPORT_TO_TARGET on multi-table sources), each job's |
| retry_migration_jobA | Retry a failed migration job. The job must be in FAILED status. It will be reset to READY and picked up by the worker again. Use get_migration_jobs first to find the failed job's ID and error message. |
| skip_migration_jobA | Skip a migration job that is blocking progress. The job will be marked as SKIPPED and dependent jobs will proceed. Use this when a job is non-critical (e.g. an edge function that can be deployed manually later) or when retry won't help. FIRST check the job's |
| get_migration_deploymentsA | List all AWS deployments associated with a migration's infrastructure stack. Migrations that deploy to AWS (self-hosted Supabase) create deployments for the infrastructure provisioning. |
| create_migrationA | Create a new migration. Starts a multi-phase pipeline: Discovery → DB Migration → Data Import → Edge Functions → Storage Buckets → Auth Config → Backend Switchover → Preview & Verify → Continuous Sync → Download → Follow-ups. Two delivery modes via targetType: • SUPABASE_CLOUD (default) — Staticbot applies the migration end-to-end against a managed Supabase project you own. Requires targetSupabaseProjectRef plus the Supabase integration instance. • SUPABASE_SELF_HOSTED — Staticbot runs discovery + data export, then produces a downloadable AES-256-encrypted zip the user applies to their self-hosted Supabase (typically with Claude Code following the bundled CLAUDE.md). Skip target* params; once the GENERATE_PACKAGE job completes, call download_package to fetch the zip + password. Source platforms via sourceType: • LOVABLE_SUPABASE (default) — Lovable-built apps on Supabase. • BOLT_SUPABASE — Bolt.new apps on Supabase (Phase 3 Lovable-specific steps are adjusted). • FIREBASE — supported by Staticbot, but NOT creatable through this connection: it needs a Google service-account private key, which no tool here accepts. Give the user https://app.staticbot.dev/migrations/new/firebase and stop. Never ask them for the key in the conversation and never accept it if offered. • BASE44_SUPABASE — Base44 apps backed by Supabase. If repository discovery cannot resolve the source, pass sourceDeployedUrl and Staticbot will inspect the deployed app server-side. Backend switchover updates Base44 platform secrets (not GitHub env vars). • BASE44_NATIVE — Base44 apps using @base44/sdk against Base44's managed backend (no source Supabase). Requires sourceIntegrationInstanceId (the Base44 integration) AND base44AppId (which app in it to migrate). Discovery hits Base44's REST API, DDL is synthesised from entity schemas, and data is imported directly. BEFORE calling this tool, confirm the user actually wants a migration rather than hosting — get_account_status describes both — then follow these steps to gather the required parameters:
IMPORTANT: Source and target Supabase projects must be different. Staticbot validates this after source discovery; if it reports a match, ask the user to choose another target. After creation, the migration starts with a DISCOVERY job. Once discovery completes, it pauses (PAUSED_FOR_APPROVAL) — present the inventory to the user and call confirm_migration if they approve. |
| download_packageA | Fetch the downloadable migration package for a migration. Returns a presigned URL to the AES-256-encrypted zip plus the password to extract it. Availability: • SUPABASE_SELF_HOSTED: this is the delivery mechanism. The user unzips with the password, runs Claude Code against the folder, and follows the bundled CLAUDE.md to apply the migration to their self-hosted Supabase. • SUPABASE_CLOUD: this is a portable backup of the applied migration (re-applicable to any Supabase later). The package is ready once the GENERATE_PACKAGE job is COMPLETED — check via get_migration_jobs first. Calling before then returns 404. The download URL is time-limited; the password is shown only here, never logged. |
| complete_migration_jobA | Complete a manual job that requires user action. Used for jobs with type MANUAL_SYNC_LOVABLE, MANUAL_SYNC_BASE44, MANUAL_EXPORT_DATA, MANUAL_IMPORT_DATA, etc. The job must be in READY status. For MANUAL_SYNC_LOVABLE / MANUAL_SYNC_BASE44 you normally do NOT need this tool: ask the user to open their Lovable project and paste 'deploy staticbot edge function' into the Lovable AI chat (Base44: sync the project from GitHub). Staticbot detects the deployed function and completes the step by itself within about 15 seconds — poll get_migration, or call validate_function_url to check immediately (a reachable function completes the step in that same call). Use this tool for a sync step only when the function URL differs from the one in the job's inputData; calling it on a sync step that already completed returns ok. Format: https://{projectRef}.supabase.co/functions/v1/{functionName}. For MANUAL_REVIEW_SCHEMA (Firebase migrations): show the proposed DDL from the job's inputData, have the user review it, then pass their approved DDL as approvedSql — it is injected into the dependent APPLY_SQL job. Completing without approvedSql leaves APPLY_SQL with no schema to apply. |
| choose_data_import_methodA | Choose how to import data in Phase 3. Call this when a MANUAL_CHOOSE_DATA_IMPORT_METHOD job is READY. IMPORTANT: You MUST present these options to the user and ask them to choose before calling this tool:
When the source check (PROBE_SOURCE) already deployed and verified the export function, Staticbot selects 'automated' by itself and get_migration never offers this gate as a pendingAction — only call this tool when pendingAction.type is CHOOSE_DATA_IMPORT_METHOD. If the gate was closed in the meantime, the call returns ok when your method matches the recorded one and HTTP 409 when it differs; the choice cannot be changed, so re-fetch the migration and follow its pendingAction instead of retrying. |
| choose_backend_switchoverA | Choose how to handle backend switchover in Phase 7. Call when MANUAL_CHOOSE_BACKEND_SWITCHOVER is READY. IMPORTANT: You MUST present these options to the user and ask them to choose before calling this tool. Four
Historical aliases: the old Platform-specific job creation under method='auto': • BASE44_SUPABASE — creates MANUAL_SWITCH_BASE44_SECRETS jobs (Base44 manages env vars on its platform, not in GitHub). The user updates secrets in Base44's UI. • BASE44_NATIVE — Phase 7 is fully automated (installs @bitfiction/base44-supabase-shim into the repo). No manual CHOOSE gate. • All other source types — rewrites env vars in the GitHub repo directly. Do NOT pick an option without asking the user first. |
| choose_frontend_deployA | Choose how to handle frontend deployment in Phase 8 (Next Steps). Call when MANUAL_CHOOSE_FRONTEND_DEPLOY is READY. IMPORTANT: You MUST present these options to the user and ask them to choose before calling this tool:
|
| validate_function_urlA | Check that the Staticbot export edge function is reachable, and COMPLETE its sync step when it is. Use after the user pasted 'deploy staticbot edge function' into the Lovable AI chat (Base44: synced from GitHub). The function URL is in the MANUAL_SYNC_LOVABLE / MANUAL_SYNC_BASE44 job's inputData (function_url), or derive it as https://{sourceProjectRef}.supabase.co/functions/v1/{functionName}. Returns {status: 'ok'|'error', message, completed}. completed=true means the step is done — by this call or because Staticbot already detected the deployment — so do NOT call complete_migration_job afterwards; re-fetch get_migration and follow its pendingAction. On status 'error' the function is not live yet: Staticbot keeps checking by itself, so waiting and polling get_migration every 15-30 seconds is enough. |
| list_integration_instancesA | List all connected integrations for the organization. Each instance has a 'type' field identifying whether it is 'supabase', 'github', 'base44', etc. Use the instance with type='supabase' as supabaseIntegrationInstanceId, type='github' as githubIntegrationInstanceId, and type='base44' as sourceIntegrationInstanceId (for BASE44_NATIVE migrations) when calling create_migration. To resolve a repository, call list_source_repositories instead — it covers every connected source-control account in one call and reports which account each repository is hosted in. Use this tool for the supabase/base44 instance IDs, and to check whether any source-control account is connected at all. |
| list_source_repositoriesA | List all public and private repositories accessible through the organization's connected Staticbot source-control integrations — GitHub and GitLab. Call this whenever a workflow needs a repository, with NO arguments: it covers every connected account in one call. An organization can connect several accounts on the same provider, and passing one instance ID narrows the listing to that account, which hides the others' repositories — only do that when the user has already chosen an account. The response is { sources[], repositories[] }. Each repository has |
| list_github_repositoriesA | Deprecated — use list_source_repositories, which serves GitHub and GitLab through one tool. Lists the public and private GitHub repositories accessible through a connected Staticbot GitHub integration: call list_integration_instances first, then pass the selected GitHub instance ID here. Returns a flat array whose repository URL field is |
| list_supabase_projectsA | List all Supabase projects accessible through a connected Supabase integration instance. Returns project name, reference ID, region, and status. Use the project's id field as targetSupabaseProjectRef when creating a migration. Only ACTIVE_HEALTHY projects can be used as targets. Present the list and let the user choose an existing target, or offer to create a customer-owned project with create_supabase_project. |
| list_supabase_organizationsA | List the Supabase organizations accessible through a connected Supabase integration instance. Call this before create_supabase_project and present the organization names to the user. Use the selected organization's id unchanged as organizationId. Do not guess an organization when more than one is available. |
| list_supabase_regionsA | List the regions Staticbot supports when creating a customer-owned Supabase project. Call this before create_supabase_project and use the user's selected region id unchanged. When the user has not expressed a location preference, explain the available choices rather than silently choosing one. |
| create_supabase_projectA | Create a new project directly inside the customer's selected Supabase organization. This changes an external account, consumes a project slot, and may affect the customer's Supabase billing. Before calling, use list_supabase_organizations and list_supabase_regions, present the exact project name, organization, and region, and obtain the user's explicit confirmation. Staticbot generates and encrypts the database password; it is intentionally never returned through MCP. Provisioning is asynchronous: after creation, call get_supabase_project_status with the returned id until healthy=true. Do not call create_supabase_project again because provisioning is slow or a poll fails. |
| get_supabase_project_statusA | Read the lifecycle state of a Supabase project created or selected through Staticbot. After create_supabase_project, poll this tool until healthy=true before using the project as a migration target. A transitioning state means wait; it is not permission to create another project. Stop and report the returned state if unavailable=true. |
| list_base44_appsA | List the Base44 apps a connected Base44 integration can migrate. Call this before create_migration for any BASE44_NATIVE migration: a Base44 personal access token is scoped to a WORKSPACE and reaches every app in it, so the integration alone does not identify which app to migrate. Pass the chosen app's |
| list_connected_projectsA | List all connected projects. Connected projects sync changes from a GitHub repo to a target Supabase instance and optional Staticbot deployment. After a migration completes, enable continuous sync to keep the target up-to-date with Lovable, Bolt, Base44, or Firebase changes. |
| get_connected_projectA | Get details of a connected project including sync mode, webhook status, linked migration, and deployment. |
| list_connected_project_previewsA | List every tracked branch preview for a connected project, including the preview deployment ID, raw deployment status, preview URL, and dashboard status URL. Always use deploymentStatus to distinguish builds in progress from FAILED, ABORTED, or COMPLETED previews; hasPreview only means preview resources exist. |
| trigger_syncA | Trigger a manual sync for a connected project. Detects changes since the last sync (new database migrations, edge function updates, frontend changes) and applies them to the target Supabase instance and the project's Staticbot-selected deployment target. |
| list_sync_runsA | List sync run history for a connected project. Each sync run represents one execution of the sync pipeline — applying migrations, deploying edge functions, and rebuilding the frontend. |
| get_sync_runA | Get details of a specific sync run including status, source and target repository versions, summary of changes, and error information. Use the returned version fields when explaining or reviewing the diff; do not infer them. Statuses: PENDING → IN_PROGRESS → COMPLETED/FAILED. Destructive migrations cause PAUSED_FOR_REVIEW. |
| get_sync_run_jobsA | Get all jobs for a sync run. Jobs are the individual work units (e.g. apply_migration, deploy_edge_function, frontend_deploy). Use this to diagnose sync failures at the job level. |
| confirm_sync_runA | Confirm a sync run that is PAUSED_FOR_REVIEW. Destructive database migrations (DROP TABLE, ALTER COLUMN) pause the sync for review before applying. Optionally skip the destructive migrations instead of applying them. WARNING: skipDestructive is PERMANENT, not a deferral. The run still completes, so the next sync diffs from this run's commit and the skipped migrations are never re-applied — they stay in the repo, absent from the live database, and nothing reports the divergence. Later migrations that assume the change will fail with errors that look unrelated. The API returns 400 unless acknowledged is true; show the user the returned consequence and get explicit approval, then re-send. Never set acknowledged just to clear the error. |
| retry_sync_runA | Retry a connected-project sync run in FAILED status. Resets its failed jobs to PENDING and reopens the run. Use get_sync_run and get_sync_run_jobs first to explain the failure to the user. |
| skip_sync_runA | Skip all failed jobs in a connected-project sync run, marking them completed with |
| get_sync_schema_gapsA | List SQL migrations that continuous sync was asked to apply to this project's live database and never applied — a run failed and was never retried, or the work was skipped — where the diff window has since moved past them, so no future sync will re-offer them. Each entry means the file exists in the repo and is missing from the database. An empty list is the healthy case. Report these to the user; do NOT try to re-apply them automatically — replaying months-old DDL against a live database is the user's decision. |
| set_connected_project_sync_modeA | Change a connected project's continuous-sync mode. AUTOMATIC syncs every push (and requires a Supabase backend), MANUAL syncs only when trigger_sync is called, PAUSED ignores pushes, and ARCHIVED stops syncing. IMPORTANT: Confirm the new mode with the user before calling this tool. |
| create_migration_previewA | Trigger (or retrieve) a preview deployment for a migration. The preview builds the migrated app on Staticbot's infrastructure so the customer can verify it works before finalising backend switchover. Optional mode: 'light' (fast, single SOFTWARE job) or 'full'. |
| resolve_schema_gapA | Resolve a MANUAL_REVIEW_SCHEMA_GAP gate. IMPORTANT: You MUST present these options to the user and ask them to choose before calling:
|
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 63 tools
Almost every tool targets a distinct resource and action, and the descriptions are detailed enough to separate similar workflows. A few pairs could still be confused, though: get_deployment vs get_migration_deployments, get_auto_deploy_settings vs get_auto_deploy_info, and the deprecated list_github_repositories duplicating list_source_repositories.
All tool names follow a consistent snake_case verb_noun pattern, such as list_migrations, create_deployment, retry_sync_run, and choose_frontend_deploy. Even the multi-word actions like push_dns_to_cloudflare and preflight_cloudflare_hosting fit the same predictable style, with no mixed casing or random verb choices.
63 tools is far above the 25+ threshold and would overwhelm an agent even with good organization. The breadth is partly justified by the platform's dual hosting/migration scope, but this surface would be more appropriate split into separate servers for hosting, migrations, sync, and infrastructure management.
The core migration, deployment, and sync workflows are deeply covered with create/get/confirm/retry/skip/preview/download operations. However, there are notable lifecycle gaps: no delete or cancel tools for stacks, deployments, templates, migrations, or connected projects, and update operations are limited to auto-deploy settings and sync mode.