First-party app
Float

Float

Manage people, projects, allocations, time off, milestones, clients, statuses and logged time in Float — the resource scheduling and team capacity planning tool.

stable Project ManagementHuman Resources

About

Float ships in the w6w first-party pack. It declares 40 actions, 2 health checks, and the host runs its code in a sandbox that never sees the credential.

App id
io.w6w.float
Version
0.1.0
Author
w6w
Licence
MIT
Categories
Project Management · Human Resources

Overview

Float is resource scheduling and team capacity planning software: who is working on what, when, and how much room is left before someone is overbooked.

This app covers Float’s core scheduling objects over its REST API v3 — People (the team roster), Projects and Clients (what work belongs to), Allocations (the schedule itself, called tasks in the API), Time Off, Milestones, Statuses (short one-off notes like ‘Travelling’ or ‘Sick’), and Logged Time (actual hours worked, distinct from the scheduled allocation). Every action does the CRUD the vendor documents for that resource — list, get, create, update, delete where Float exposes each.

Two Float quirks a workflow needs to know about, both handled here rather than left for the next step to discover: logged-time create answers 200 with an array of entries (every other create answers 201 with one object), and its own ID is a string, not the integer every other Float ID uses; and status create/update answer a {status: [...]} wrapper because creating a status that overlaps an existing one for that person silently deletes the old one and returns both.

Build with Float

Three routes to the same 40 actions. The Workflow tab is generated from Float's own manifest and carries its real ids, so it is copy-pasteable; the Code and CLI examples are the same call for any action on any app, so every app-specific value in them is a blank you fill in.

Create Allocation

allocation-create

Add a new scheduled allocation (called a `task` in Float's own API).

Delete Allocation

allocation-delete

Delete an allocation.

Get Allocation

allocation-get

Retrieve a single allocation by ID.

List Allocations

allocation-list

List scheduled allocations (called `tasks` in Float's own API).

Update Allocation

allocation-update

Update an allocation's details. Only the fields provided are changed.

Create Client

client-create

Add a new client.

Delete Client

client-delete

Delete a client. Projects using it keep their client_id cleared to null.

Get Client

client-get

Retrieve a single client by ID.

List Clients

client-list

List clients.

Update Client

client-update

Update a client's name.

Log Time

logged-time-create

Create a logged time entry. Answers 200 (not 201) with an ARRAY of entries. 403s with "Time Tracking is not enabled for this team" if that feature is off.

Delete Logged Time

logged-time-delete

Delete a logged time entry. 403s if Time Tracking is off, or if the associated project or phase is archived.

Get Logged Time

logged-time-get

Retrieve a single logged time entry by ID.

List Logged Time

logged-time-list

List logged time for a person or project within a date range. 403s with "Time Tracking is not enabled for this team" if that feature is off.

Update Logged Time

logged-time-update

Modify an existing logged time entry. Only the fields provided are changed.

Create Milestone

milestone-create

Add a new milestone to a project.

Delete Milestone

milestone-delete

Delete a milestone.

Get Milestone

milestone-get

Retrieve a single milestone by ID.

List Milestones

milestone-list

List milestones for a project (or client, or phase).

Update Milestone

milestone-update

Update a milestone's details. Only the fields provided are changed.

Create Person

person-create

Add a new person to the schedule.

Delete Person

person-delete

Delete a person. This also deletes all of their allocations and logged time — irreversible.

Get Person

person-get

Retrieve a single person by ID.

List People

person-list

Search for people in your organization.

Update Person

person-update

Update a person's details. Only the fields provided are changed.

Create Project

project-create

Add a new project.

Delete Project

project-delete

Delete a project. Also deletes its allocations, logged time and phases — irreversible.

Get Project

project-get

Retrieve a single project by ID.

List Projects

project-list

Search for projects.

Update Project

project-update

Update a project's details. Only the fields provided are changed.

Create Status

status-create

Add a new status. If the date range overlaps an existing status for this person, Float deletes it and returns both records.

Delete Status

status-delete

Delete a status.

Get Status

status-get

Retrieve a single status by ID.

List Statuses

status-list

List statuses (short notes like "Travelling" or "Office") for people.

Update Status

status-update

Update a status's details. Only the fields provided are changed.

Create Time Off

timeoff-create

Add a new time off record for one or more people.

Delete Time Off

timeoff-delete

Delete a time off record.

Get Time Off

timeoff-get

Retrieve a single time off record by ID.

List Time Off

timeoff-list

List scheduled time off. Repeating entries are included if they recur into range.

Update Time Off

timeoff-update

Update a time off record's details. Only the fields provided are changed.

A workflow step names the app and the action, and the editor fills in the connection when you pick one. This is the Step shape from the workflow spec, carrying Float's real ids.

{
  "manifestVersion": "2",
  "name": "float-example",
  "steps": [
    {
      "id": "allocation-create",
      "uses": {
        "app": "io.w6w.float",
        "action": "allocation-create",
        "connection": "conn_YOUR_CONNECTION_ID"
      },
      "with": {
        "projectId": "<projectId>",
        "startDate": "<startDate>",
        "endDate": "<endDate>"
      }
    }
  ]
}

Here are some of the things you can do

  • Create Allocation

    perform
    allocation-create
  • Get Allocation

    read
    allocation-get
  • List Allocations

    read
    allocation-list
  • Update Allocation

    perform
    allocation-update
  • Create Client

    perform
    client-create

+35 more actions available

Every app-specific value here is a blank you have to fill in. An app action is reached through the connection that authenticates it, so the address is a connection id, not the app id — and connections belong to your account, so a public page cannot know yours. Create one for Float, then fill in the three blanks: conn_YOUR_CONNECTION_ID, the action key, and the parameters that action declares. The call itself is real — the shape is transcribed from the studio's own snippet builder, which prints the same kind of blanks — but nothing in it is specific to Float. The Workflow tab is where this app's real ids are.

Install
npm install @w6w/sdk
yarn add @w6w/sdk
pnpm add @w6w/sdk
deno add npm:@w6w/sdk
Code
import { W6wClient, isActionRun } from "@w6w/sdk";

// Reads W6W_BASE_URL and W6W_TOKEN from the environment when omitted.
const client = new W6wClient();

const envelope = await client.run({
  urn: "conn_YOUR_CONNECTION_ID",
  action: "allocation-create",
  payload: {
    projectId: "<value>",
    // peopleId: "<value>",
    // phaseId: "<value>",
    startDate: "<value>",
    endDate: "<value>",
    hours: "<value>",
    // startTime: "<value>",
    // name: "<value>",
    // taskMetaId: "<value>",
    // notes: "<value>",
    // status: "<value>",
    // repeat_state: "<value>",
    // repeat_end_date: "<value>",
    // extraFields: "<value>",
  },
});

if (isActionRun(envelope)) console.log(envelope.value);
Install the CLI
npm install -g @w6w/cli
CLI
w6w run conn_YOUR_CONNECTION_ID --action allocation-create --payload '{"projectId":"<value>","startDate":"<value>","endDate":"<value>","hours":"<value>"}'

Give an AI agent Float — without giving it Float's credentials. One MCP endpoint exposes every app, function and workflow the caller is entitled to, as tools it can discover and run. Access is granted per team while we onboard.

One tool call
{
  "name": "w6w_invoke",
  "arguments": {
    "ref": "app:io.w6w.float#allocation-create",
    "input": {
      "projectId": "<projectId>",
      "startDate": "<startDate>",
      "endDate": "<endDate>"
    }
  }
}

Every tool names its target with a single ref. The app: form above doesn't name a connection at all — the host resolves which of the caller's Float connections to sign with, and refuses rather than guesses when the answer is ambiguous.

What the agent gets

Credentials it can't read

The token is attached host-side, at the moment of the call. It is never a tool argument, never in the model's context, and never in a transcript — so a prompt injection has nothing to exfiltrate.

A tool surface scoped to the caller

Tools are derived per end user from what that person has actually connected and is entitled to — not one shared bot identity carrying the union of everyone's access.

A durable workflow in one call

Multi-step work runs on the workflow engine and returns a run handle the agent can poll — retries, branching and state survive the conversation that started them.

Health-aware discovery

Float's declared health checks are on the surface too, so an agent can tell "the vendor is down" from "your credential expired" before it burns a retry on either.

The MCP surface is part of the hosted platform. Float itself is MIT, and the runtime that executes it is source-available (FSL).

Request MCP access

Health checks

Float declares its own checks, so its health is a property of the app rather than something the host guesses at.

service

Float platform status

Component status from status.float.com: Float App, API - public, www.float.com and Float Payments & Subscriptions.

quota

Rate-limit headroom

The per-minute GET request budget (200/min per company by default), read from the `ratelimit-*` response headers on GET /v3/departments. Float's separate 100/min non-GET ceiling and per-second burst floor carry no header and cannot be read in advance.