Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to the Floot MCP server

Vendor MCP
Open markdown

The Floot MCP connector routes your AI agent's tool calls to Floot's own MCP server through Scalekit. Each user signs in to Floot once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 46 tools.

Tools
46
What they doRead · write · destructive
20 · 20 · 620 read20 write6 destructive
Users sign in with
OAuth app
Scalekit's or your own

Setup

  1. Install the SDK

    Terminal window
    npm install @scalekit-sdk/node dotenv
  2. Set your credentials

    Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

    .env
    SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
    SCALEKIT_CLIENT_ID=<your-client-id>
    SCALEKIT_CLIENT_SECRET=<your-client-secret>
  3. Create the Floot MCP connection

    In AgentKit > Connections, create a Floot MCP connection. The name you give it is the connection_name your code passes. See Configure connections.

    Scalekit credentials are available for Floot MCP server, so you don't need to register an OAuth app.

  4. Authorize a user and make your first call

    quickstart.mts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    import { createInterface } from 'node:readline/promises'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENVIRONMENT_URL,
    process.env.SCALEKIT_CLIENT_ID,
    process.env.SCALEKIT_CLIENT_SECRET,
    )
    const actions = scalekit.actions
    const connector = 'flootmcp'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize Floot MCP:', link)
    const rl = createInterface({ input: process.stdin, output: process.stdout })
    await rl.question('Press Enter after authorizing...')
    rl.close()
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'flootmcp_list_projects',
    toolInput: {},
    })
    console.log(result)
    Terminal window
    npx tsx quickstart.mts

    Each user signs in once. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • flootmcp_fetchFetch a search result by id: a project overview ('<projectId>') or a file ('<projectId>:<path>').Read-only

    FetchSearchResult

    Fetch a search result by id: a project overview ('<projectId>') or a file ('<projectId>:<path>'). For direct access to a known file or project, read_file/list_files give more detail.

    Inputs

    idstringrequired
    The search result id to fetch, as returned by the search tool: a project id alone (e.g. "proj_8f3a1c") for a project overview, or "<projectId>:<path>" (e.g. "proj_8f3a1c:pages/dashboard.tsx") for a specific file within that project.
  • flootmcp_get_current_contextWhat the user is looking at RIGHT NOW in their open Floot editor: the active page/component, the preview element they selected (mapped to source file:line), the preview device size, whether they drew a screenshot annotation for you, whether they REVERTED recent changes (undoing edits — re-read before editing if so), and any requests they queued via editor action buttons ("Fix with Floot" etc.).Read-only

    GetCurrentContext

    What the user is looking at RIGHT NOW in their open Floot editor: the active page/component, the preview element they selected (mapped to source file:line), the preview device size, whether they drew a screenshot annotation for you, whether they REVERTED recent changes (undoing edits — re-read before editing if so), and any requests they queued via editor action buttons ("Fix with Floot" etc.). Call this FIRST when the user refers to something without naming it ("this", "here", "the button"), reports a problem without saying where ("it's broken", "looks wrong"), or implies they triggered something in Floot ("go", "I clicked fix", "I undid that"). Cheap and text-only. With several windows open, one answers (the result says which) — but a selection made in ANY window is merged in, so a "no selection" from the answering window plus a deposited selection from another window means the deposited one is what the user means. If it reports a pending annotation, call view_annotation to see the image.

    Inputs

    projectIdstringrequired
    The Floot project ID whose open editor's current context should be retrieved.
  • flootmcp_get_job_statusPoll a pending tool call by its jobId.Read-only

    GetJobStatus

    Poll a pending tool call by its jobId. Each poll either returns the final result (succeeded/failed/cancelled), or reports the call as still running — call it again until you get the result. Failed calls return their stored error message. A jobId belongs to exactly ONE task: it never blocks other tools or other jobs (run them freely in parallel), and once terminal it is frozen history — a NEW user request means a fresh call on the originating tool, never re-polling an old jobId. Legacy v!/b! job ids are also accepted.

    Inputs

    jobIdstringrequired
    The job ID returned by a previous long-running tool call to poll for its result. Legacy job ids prefixed "v!" or "b!" are also accepted.
    wait_secondsinteger
    Optional number of seconds to keep this poll open waiting for the job to reach a terminal state before responding. If omitted, the poll returns immediately with the job's current status.
  • flootmcp_get_live_paymentsLook up your Floot Payments records in Stripe across all your projects: one record by id, or a list of one record type.Read-only

    Get Live Payments

    Look up your Floot Payments records in Stripe across all your projects: one record by id, or a list of one record type. Read-only. Reads LIVE mode unless mode is "test", which reads the test payments made in the preview (those never appear in the user's Stripe dashboard). Refunds, cancels and every other change are not possible here; for those the user logs in at stripe.com. Read get_guides('live-payments') before your first call. Responses follow Stripe API version 2026-08-26.dahlia.

    Inputs

    objectstringrequired
    The record type to read.one of payment_intentschargesrefundsdisputescheckout_sessionscustomerssubscriptionsinvoicesproductspricespayoutsbalance_transactionsbalance
    created_gteinteger
    List filter: created at or after (unix seconds).
    created_lteinteger
    List filter: created at or before (unix seconds).
    customerstring
    List filter (without projectId): a customer id.
    expandarray
    Stripe expand, e.g. ["latest_charge"].
    idstring
    A Stripe object id (pi_…, ch_…, cs_…, sub_…, in_…, cus_…, re_…) to read that one record. Omit to list.
    limitinteger
    No description.
    modestring
    "live" (default): the published app's real payments. "test": test payments made in the preview.one of livetest
    pagestring
    Project-limited list paging: next_page from the previous result.
    projectIdstring
    Limit a list to one project (runs as a Stripe search on that project)
    querystring
    Stripe search query for a project-limited list, e.g. status:"succeeded".
    starting_afterstring
    List paging: the last id of the previous page.
    statusstring
    List filter (without projectId): a status.
  • flootmcp_get_logsYour FIRST step when debugging any runtime problem — a 500, a failed request, a blank page, or 'it doesn't work' from the user.Read-only

    Get Logs

    Your FIRST step when debugging any runtime problem — a 500, a failed request, a blank page, or 'it doesn't work' from the user. Call this before theorizing from an error message alone. Reads the project's runtime logs. source 'server' (default): the dev backend's request logs from the last hour — method, URL, status, duration, and per-request server log lines (pass log_reference_id from a previous listing for one request's full logs); includes background jobs (queueTask/scheduled/failure). source 'browser': console output AND client-side network requests (each fetch as `⇄ METHOD url → status`, with the error body for failed/4xx/5xx ones — the client-side view server logs miss, e.g. CORS/timeouts/third-party calls) captured from the user's open editor session. A browser network line's `ref=<id>` is a log_reference_id you can pass back with source 'server' for that request's full server logs. Empty if no editor is open. NOT CloudWatch: entries live ~1 hour and cover the dev backend + live session only — for the PUBLISHED app's logs, use run_code_in_vm's `_floot.getProdBackendLogs` (details: get_guides('prod-backend-logs')).

    Inputs

    projectIdstringrequired
    No description.
    limitinteger
    No description.
    log_reference_idstring
    No description.
    sourcestring
    No description.one of serverbrowserbackground
  • flootmcp_get_preview_urlShow the user a live preview card and return the preview link.Read-only

    Get Preview URL

    Show the user a live preview card and return the preview link. On an EXISTING project this is typically called EARLY, before the first change, so the user watches edits live from the start; the result is informational and a working session normally continues past it. Do NOT call it right after create_project — that result already showed the same card; calling both duplicates it. The preview URL carries an access token in its query string and only works shared EXACTLY as returned (no Floot login, view-only — which is also what lets it open on a phone); it live-updates as you edit, so it also suits an in-app browser tab if your client has one. The result additionally includes the sandbox API base for your own headless /_api/* testing — the frontend does not render there and it is not a user-facing URL; the preview link is the one meant for the user. Floot HOSTS the app — to go to production use publish_app; never suggest deploying a Floot app to an external host.

    Inputs

    projectIdstringrequired
    The Floot project ID to get a live, view-only preview link for.
  • flootmcp_get_publish_statusRead-only publish snapshot for a project: published (true/false, with the live URL when published), customDomains (the user's own domains attached to the project — apex and www are listed separately; empty when none), paid (the workspace owner has a paid plan, which allows removing the Floot badge), plan (free | pro | power — `paid` cannot tell Pro from Power), nativeBuilds (the owner's remaining monthly iOS/Android app-build allowance; `unlimited` is true on plans where the ceiling is only a fair-use backstop, and while an Action Boost is live (`boostUntil` says until when; builds started before then never count toward the allowance) — read this BEFORE passing mobile: true, and on a metered plan build only when the user asked for a native/TestFlight/Play build), displayFlootLogo (whether the live app shows the 'Made with Floot' badge; true until a paid owner turns it off), and mobileBuild (the published app's latest native app build: building, succeeded, or failed with what to fix — an app build finishes minutes AFTER the publish job it rode on, so read this to learn how it ended before telling the user it worked).Read-only

    Get Publish Status

    Read-only publish snapshot for a project: published (true/false, with the live URL when published), customDomains (the user's own domains attached to the project — apex and www are listed separately; empty when none), paid (the workspace owner has a paid plan, which allows removing the Floot badge), plan (free | pro | power — `paid` cannot tell Pro from Power), nativeBuilds (the owner's remaining monthly iOS/Android app-build allowance; `unlimited` is true on plans where the ceiling is only a fair-use backstop, and while an Action Boost is live (`boostUntil` says until when; builds started before then never count toward the allowance) — read this BEFORE passing mobile: true, and on a metered plan build only when the user asked for a native/TestFlight/Play build), displayFlootLogo (whether the live app shows the 'Made with Floot' badge; true until a paid owner turns it off), and mobileBuild (the published app's latest native app build: building, succeeded, or failed with what to fix — an app build finishes minutes AFTER the publish job it rode on, so read this to learn how it ended before telling the user it worked). This is the ONLY tool that reports attached custom domains — read it before telling a user whether their domain is connected, and never conclude a domain is unattached from any other output. The publish card calls this on load to render fresh state; also check it before publishing to know whether publish_app will publish fresh or publish the live app again.

    Inputs

    projectIdstringrequired
    The Floot project ID to read the publish snapshot for.
  • flootmcp_list_filesList a Floot project's virtual file tree with sizes, plus its dependencies, current version (pass the version to write tools as expected_version), and current project metadata — title, description, app icon (iconUrl), splash screen, mobile app id, SSR, iOS Info.plist overrides, share target (iOS + Android), native system bars.Read-only

    ListProjectFiles

    List a Floot project's virtual file tree with sizes, plus its dependencies, current version (pass the version to write tools as expected_version), and current project metadata — title, description, app icon (iconUrl), splash screen, mobile app id, SSR, iOS Info.plist overrides, share target (iOS + Android), native system bars. This is where to look up those settings; update_project_metadata changes them.

    Inputs

    projectIdstringrequired
    The Floot project id whose virtual file tree, dependencies, current version, and project metadata should be listed. Get this from list_projects.