{"ok":true,"name":"publish_app","description":"Publish the app to production — call for the first publish, to publish again after changes the user wants live, and to set up a custom domain. Omit domain and the user gets the publish form instead (nothing is published until they press Publish on it; to publish a live app again without the form, pass domain_type 'floot_subdomain' and its current subdomain). Pass mobile: true whenever the user mentions iOS, Android, TestFlight, App Store, Google Play, or a mobile/native app — with no store accou","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["projectId"],"properties":{"domain":{"type":"string","maxLength":255,"minLength":1,"description":"floot_subdomain only: subdomain label (lowercase, digits, hyphens, max 40). Omit to show the user the publish form instead; on a published app a different subdomain is refused (unpublish_app first, confirming with the user). Ignored for custom_domain — the wizard collects the domain."},"mobile":{"type":"boolean","description":"Set true whenever the request mentions iOS, Android, TestFlight, App Store, Google Play, Play Store, a native or mobile app, or a phone build — they all mean a mobile build. No store account connected → returns a Connect card (nothing published). Connected → publishes the web app with the store builds attached; the job completes when the web build is live. Omitted on a live app follows the project's saved setting: on plans with unlimited app builds that setting decides (mobile switched off stays web-only); on metered plans omitted always means web-only, and true spends one of a small monthly allowance (the remaining count comes back in the result) — read get_publish_status for the plan and allowance first. Passing true or false also updates the saved setting; omitting leaves it alone."},"projectId":{"type":"string"},"add_another":{"type":"boolean","description":"custom_domain only: the project ALREADY has a custom domain and the user has explicitly asked for an ADDITIONAL one. Without it, a custom_domain call on a project that already has domains returns those domains instead of opening the wizard — so a user whose domain is already connected is told so rather than sent to add it again."},"domain_type":{"enum":["floot_subdomain","custom_domain"],"type":"string","description":"Omit for the floot subdomain (shows the publish form in the editor when domain is omitted). 'custom_domain' for domain setup — a paid-plan feature (get_publish_status reports `paid`); it fails for free accounts."},"include_made_with_floot":{"type":"boolean","description":"false removes the 'Made with Floot' badge (paid plans only — fails for free accounts). Omit to keep the current setting."}},"additionalProperties":false},"serverUrl":"https://mcp.floot.com/mcp","transport":"http","handshake":"ok","host":"floot.com","score":38,"grade":"D","auth":"oauth","lastScannedAt":"2026-10-30T13:09:37.977Z","stale":false,"permalink":"https://agentboardai.app/mcp/floot.com/publish_app","page":"https://agentboardai.app/site/floot.com"}