> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to Fly.io

The Fly.io connector lets your AI agent act in each user's Fly.io account. Each user connects their own Fly.io access token once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 54 tools.

**Authentication:** Bearer Token
**Categories:** Developer Tools
**Tools:** 54: 24 read, 22 write, 8 destructive
**Users sign in with:** Access token
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=FLY)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Fly.io connection

   In **AgentKit > Connections**, create a Fly.io connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   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 = 'fly'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Fly.io:', 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: 'fly_get_current_token',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "fly"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Fly.io:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="fly_get_current_token",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their Fly.io credentials there. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'fly_check_placements',
  toolInput: {
    org_slug: '<org_slug>',
  },
  connector: 'fly',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="fly_check_placements",
    tool_input={
        "org_slug": "<org_slug>",
    },
    connection_name="fly",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `fly_check_placements`

Check Machine Placement · Read-only

Simulate where Machines could be placed without creating any.
Returns each candidate region with its count and concurrency.
Read-only despite using POST. Use before fly_create_machine to pick a region with capacity.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `org_slug` (`string`, required): Slug of the Fly organization, or personal for your personal organization.
- `count` (`integer`, optional): Number of Machines to simulate. Defaults to 0, which returns the organization's limit per region.
- `region` (`string`, optional): Region code, for example iad, ams or syd. Use fly_list_regions to see valid codes.

Example input: `{"org_slug":"<org_slug>"}`

### `fly_get_app`

Get App · Read-only

Retrieve one Fly app by name.
Returns the app's id, name, status, network, machine count and organization.
Use fly_list_apps to browse apps.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.

Example input: `{"app_name":"<app_name>"}`

### `fly_get_certificate`

Get Certificate · Read-only

Retrieve the certificate for one hostname on a Fly app.
Returns the hostname, status, DNS requirements, validation state and issued certificates.
Use fly_list_certificates to browse.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `hostname` (`string`, required): Hostname the certificate covers, for example www.example.com.

Example input: `{"app_name":"<app_name>","hostname":"<hostname>"}`

### `fly_get_current_token`

Get Current Token · Read-only

Show what the connected Fly API token can access.
Returns each token's organization, org slug, permitted apps and any Machine restriction.
Use this to find the org_slug other tools need.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `fly_get_machine`

Get Machine · Read-only

Retrieve one Machine in a Fly app.
Returns the Machine's id, name, state, region, config, image ref, events and checks.
Use fly_list_machines to find Machine IDs.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.
- `include_leases` (`boolean`, optional): When true, include the Machine's lease.
- `version` (`string`, optional): 26-character Machine version ID. When set, returns that version of the Machine instead of the current one.

Example input: `{"app_name":"<app_name>","machine_id":"<machine_id>"}`

### `fly_get_machine_lease`

Get Machine Lease · Read-only

Retrieve the current lease on a Machine.
Returns the lease nonce, owner, description and expiry time.
Use fly_create_machine_lease to take a lease.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.

Example input: `{"app_name":"<app_name>","machine_id":"<machine_id>"}`

### `fly_get_machine_metadata`

Get Machine Metadata · Read-only

Retrieve all metadata key-value pairs on a Machine.
Returns an object mapping each metadata key to its string value.
Use fly_get_machine_metadata_value for a single key.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.

Example input: `{"app_name":"<app_name>","machine_id":"<machine_id>"}`

### `fly_get_machine_metadata_value`

Get Machine Metadata Value · Read-only

Retrieve the value of one metadata key on a Machine.
Returns an object with the value.
Use fly_get_machine_metadata to see all keys.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `key` (`string`, required): Metadata key to read, for example role.
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.

Example input: `{"app_name":"<app_name>","key":"<key>","machine_id":"<machine_id>"}`

### `fly_get_secret`

Get App Secret · Read-only

Retrieve metadata for one secret on a Fly app.
Returns the secret's name, digest and timestamps. The value is never returned.
Use fly_list_secrets to browse.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `secret_name` (`string`, required): Name of the app secret, for example DATABASE_URL.

Example input: `{"app_name":"<app_name>","secret_name":"<secret_name>"}`

### `fly_get_volume`

Get Volume · Read-only

Retrieve one volume of a Fly app.
Returns the volume's id, name, state, region, size, block counts and attached Machine.
Use fly_list_volumes to find volume IDs.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `volume_id` (`string`, required): ID of the volume, for example vol_18g2nqv2opd1rk54. Use fly_list_volumes to find volume IDs.

Example input: `{"app_name":"<app_name>","volume_id":"<volume_id>"}`

### `fly_list_apps`

List Apps · Read-only

List the Fly apps in an organization.
Returns each app's id, name, network, machine count and organization, plus a next_cursor when more pages remain.
Use this to find app names for other tools. Use fly_get_app for one app's details.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `org_slug` (`string`, required): Slug of the Fly organization, or personal for your personal organization.
- `app_role` (`string`, optional): Filter apps by role. Leave empty to list all apps.
- `cursor` (`string`, optional): next_cursor value from the previous page. Requires limit to be set.
- `limit` (`integer`, optional): Maximum number of apps to return (1 to 5000). Omit to return the API default.

Example input: `{"org_slug":"<org_slug>"}`

### `fly_list_certificates`

List Certificates · Read-only

List the TLS certificates of a Fly app.
Returns each certificate's hostname, status, configured flags and issuance details, plus a next cursor when more remain.
Use fly_get_certificate for one hostname.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `cursor` (`string`, optional): Pagination cursor from the previous response.
- `filter` (`string`, optional): Only return certificates whose hostname contains this text.
- `limit` (`integer`, optional): Results per page, default 25, at most 500.

Example input: `{"app_name":"<app_name>"}`

### `fly_list_ip_assignments`

List IP Assignments · Read-only

List the IP addresses assigned to a Fly app.
Returns each assignment's ip, region, service name, shared flag and creation time.
Use fly_assign_ip to add one and fly_remove_ip to release one.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.

Example input: `{"app_name":"<app_name>"}`

### `fly_list_machine_events`

List Machine Events · Read-only

List recent lifecycle events for a Machine, such as start, stop, exit and restart.
Returns each event's id, type, status, source, timestamp and request details.
Use this to debug why a Machine stopped or restarted.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.
- `limit` (`integer`, optional): Number of events to return, at most 50. Defaults to 20.

Example input: `{"app_name":"<app_name>","machine_id":"<machine_id>"}`

### `fly_list_machine_processes`

List Machine Processes · Read-only

List the processes running inside a Machine.
Returns each process's pid, command, directory, cpu, rss and listening sockets.
The Machine must be running.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.
- `order` (`string`, optional): Sort order: asc or desc. One of: `asc`, `desc`.
- `sort_by` (`string`, optional): Field to sort by, for example cpu or rss.

Example input: `{"app_name":"<app_name>","machine_id":"<machine_id>"}`

### `fly_list_machine_versions`

List Machine Versions · Read-only

List the configuration versions a Machine has had.
Returns each version's id and the config that was in effect.
Use fly_get_machine with a version to read one in full.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.

Example input: `{"app_name":"<app_name>","machine_id":"<machine_id>"}`

### `fly_list_machines`

List Machines · Read-only

List the Machines in a Fly app, optionally filtered by region or state.
Returns each Machine's id, name, state, region, image, config and creation time.
Use fly_list_org_machines to span all apps in an organization. Use fly_get_machine for one Machine.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `include_deleted` (`boolean`, optional): When true, include Machines that were destroyed.
- `include_leases` (`boolean`, optional): When true, include each Machine's lease.
- `region` (`string`, optional): Region code, for example iad, ams or syd. Use fly_list_regions to see valid codes.
- `state` (`string`, optional): Comma-separated list of states to keep: created, started, stopped, suspended.
- `summary` (`boolean`, optional): When true, return only summary fields for each Machine and omit the full configuration.

Example input: `{"app_name":"<app_name>"}`

### `fly_list_org_machines`

List Organization Machines · Read-only

List the Machines across every app in a Fly organization.
Returns each Machine's id, name, state, region, app and config.
Use fly_list_machines to list one app's Machines.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `org_slug` (`string`, required): Slug of the Fly organization, or personal for your personal organization.
- `include_deleted` (`boolean`, optional): When true, include Machines that were destroyed.
- `limit` (`integer`, optional): Maximum number of machines to return, at most 1000.
- `region` (`string`, optional): Region code, for example iad, ams or syd. Use fly_list_regions to see valid codes.
- `state` (`string`, optional): Comma-separated list of Machine states to keep.
- `summary` (`boolean`, optional): When true, return only summary fields for each machine and omit the full configuration.
- `updated_after` (`string`, optional): Only return items updated after this RFC 3339 timestamp.

Example input: `{"org_slug":"<org_slug>"}`

### `fly_list_org_volumes`

List Organization Volumes · Read-only

List the volumes across every app in a Fly organization.
Returns each volume's id, name, state, region, size and app.
Use fly_list_volumes to list one app's volumes.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `org_slug` (`string`, required): Slug of the Fly organization, or personal for your personal organization.
- `include_deleted` (`boolean`, optional): When true, include Volumes that were destroyed.
- `limit` (`integer`, optional): Maximum number of volumes to return, at most 1000.
- `region` (`string`, optional): Region code, for example iad, ams or syd. Use fly_list_regions to see valid codes.
- `state` (`string`, optional): Comma-separated list of Volume states to keep.
- `summary` (`boolean`, optional): When true, return only summary fields for each volume and omit the full configuration.
- `updated_after` (`string`, optional): Only return items updated after this RFC 3339 timestamp.

Example input: `{"org_slug":"<org_slug>"}`

### `fly_list_regions`

List Regions · Read-only

List the Fly.io regions with their details.
Returns each region's code, name, geo region, latitude, longitude and gateway availability, plus the nearest region.
Use this to find valid region codes for creating Machines and volumes.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `fly_list_secrets`

List App Secrets · Read-only

List the secrets set on a Fly app.
Returns each secret's name, digest and timestamps. Values are never returned.
Use fly_set_secret to add or change one.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.

Example input: `{"app_name":"<app_name>"}`

### `fly_list_volume_snapshots`

List Volume Snapshots · Read-only

List the snapshots of a volume.
Returns each snapshot's id, size, digest, status and creation time.
Use fly_create_volume_snapshot to take a new one.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `volume_id` (`string`, required): ID of the volume, for example vol_18g2nqv2opd1rk54. Use fly_list_volumes to find volume IDs.

Example input: `{"app_name":"<app_name>","volume_id":"<volume_id>"}`

### `fly_list_volumes`

List Volumes · Read-only

List the volumes of a Fly app.
Returns each volume's id, name, state, region, size, attached Machine and encryption flag.
Use fly_list_org_volumes to span all apps in an organization.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `summary` (`boolean`, optional): When true, return only summary fields for each volume and omit the full configuration.

Example input: `{"app_name":"<app_name>"}`

### `fly_wait_machine`

Wait for Machine State · Read-only

Block until a Machine reaches a state, or until the timeout.
Returns ok, the state reached, the event id and the version.
Use after fly_start_machine or fly_stop_machine. Blocks for up to 60 seconds.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.
- `from_event_id` (`string`, optional): 26-character Machine event ID to start waiting after.
- `state` (`string`, optional): State to wait for. Defaults to started. One of: `started`, `stopped`, `suspended`, `destroyed`, `failed`, `settled`.
- `timeout` (`integer`, optional): Seconds to wait before giving up. Defaults to 60.
- `version` (`string`, optional): 26-character Machine version ID to wait on.

Example input: `{"app_name":"<app_name>","machine_id":"<machine_id>"}`

### `fly_assign_ip`

Assign IP Address · Write

Assign a new IP address to a Fly app.
Returns the created assignment with its ip, type, region and creation time. An egress_pair request returns an ip_pair instead of a single ip.
Use fly_list_ip_assignments to see existing addresses first.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `type` (`string`, required): Type of address to allocate. Use v4 or v6 for a dedicated public address, shared_v4 for a shared IPv4, private_v6 for a private address, egress_v4 or egress_v6 for outbound addresses, or egress_pair for both outbound addresses. One of: `v4`, `v6`, `shared_v4`, `private_v6`, `egress_v4`, `egress_v6`, `egress_pair`.
- `network` (`string`, optional): Name of a custom private network for the address. Leave empty for the default network.
- `org_slug` (`string`, optional): Slug of the Fly organization, or personal for your personal organization.
- `region` (`string`, optional): Region code, for example iad, ams or syd. Use fly_list_regions to see valid codes.
- `service_name` (`string`, optional): Name of the service the address is assigned to. Leave empty for the whole app.

Example input: `{"app_name":"<app_name>","type":"v4"}`

### `fly_check_certificate`

Check Certificate · Write

Check a hostname's DNS and re-run certificate validation.
Returns the updated certificate state and DNS requirements.
Use after changing DNS records, following fly_request_acme_certificate.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `hostname` (`string`, required): Hostname the certificate covers, for example www.example.com.

Example input: `{"app_name":"<app_name>","hostname":"<hostname>"}`

### `fly_cordon_machine`

Cordon Machine · Write

Disable a Machine's services so the Fly proxy stops routing requests to it.
Returns no body on success.
Use this to drain a Machine before maintenance. Use fly_uncordon_machine to route traffic again.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.

Example input: `{"app_name":"<app_name>","machine_id":"<machine_id>"}`

### `fly_create_app`

Create App · Write

Create a new Fly app in an organization.
Returns the new app's id and creation timestamp.
Use this before creating Machines or volumes. Returns a 422 error when the app name is already taken.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): Unique app name, for example my-app. Lowercase letters, numbers and dashes only.
- `org_slug` (`string`, required): Slug of the Fly organization, or personal for your personal organization.
- `enable_subdomains` (`boolean`, optional): When true, enable subdomains for the app.
- `idempotency_key` (`string`, optional): Key that makes a retry of this exact create request safe: a second call with the same key and name returns the app the first call created.
- `network` (`string`, optional): Name of a custom private network to place the app in. Leave empty for the default network.

Example input: `{"name":"<name>","org_slug":"<org_slug>"}`

### `fly_create_machine`

Create Machine · Write

Create and launch a Machine in a Fly app from a Docker image and configuration.
Returns the new Machine's id, name, state, region, config and instance id.
Use fly_update_machine to change an existing Machine. Capacity errors can occur; retry or pick another region.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `config` (`object`, required): Machine configuration object. It needs an image (the Docker image to run) and usually a guest block for CPU and memory. It can also carry env (environment variables), services (ports and health checks), mounts (volumes), restart, metadata, checks, files and init settings. Example: {"image": "flyio/hellofly:latest", "guest": {"cpu_kind": "shared", "cpus": 1, "memory_mb": 256}, "env": {"PORT": "8080"}, "services": [{"protocol": "tcp", "internal_port": 8080, "ports": [{"port": 443, "handlers": ["tls", "http"]}]}]}
- `lease_ttl` (`integer`, optional): Seconds to hold a lease on the new Machine, so it cannot be modified by others while you finish setup.
- `min_secrets_version` (`integer`, optional): Minimum app secrets version the Machine must have available when it starts.
- `name` (`string`, optional): Unique name for the Machine. Leave empty and Fly generates one.
- `region` (`string`, optional): Region code, for example iad, ams or syd. Use fly_list_regions to see valid codes.
- `skip_launch` (`boolean`, optional): When true, create the Machine without starting it.
- `skip_secrets` (`boolean`, optional): When true, do not inject app secrets into the Machine.
- `skip_service_registration` (`boolean`, optional): When true, skip registering the Machine's services with the Fly proxy.

Example input: `{"app_name":"<app_name>","config":{}}`

### `fly_create_machine_lease`

Create Machine Lease · Write

Take an exclusive lease on a Machine so other callers cannot modify it until the lease expires or is released.
Returns the lease nonce, description and expiry time. Keep the nonce, since releasing the lease needs it.
Use fly_release_machine_lease when you are done.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.
- `description` (`string`, optional): Reason for the lease, shown to other callers.
- `ttl` (`integer`, optional): Seconds the lease stays valid.

Example input: `{"app_name":"<app_name>","machine_id":"<machine_id>"}`

### `fly_create_volume`

Create Volume · Write

Create a persistent volume for a Fly app, optionally restoring a snapshot or forking another volume.
Returns the new volume's id, name, region, size, state and encryption flag.
A volume attaches to one Machine in the same region.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `name` (`string`, required): Volume name, for example data. Lowercase letters, numbers and underscores.
- `region` (`string`, required): Region code, for example iad, ams or syd. Use fly_list_regions to see valid codes.
- `auto_backup_enabled` (`boolean`, optional): When true, take scheduled automatic snapshots. Fly defaults to true.
- `encrypted` (`boolean`, optional): When true, encrypt the volume. Fly defaults to encrypted.
- `fstype` (`string`, optional): Filesystem type for the volume.
- `require_unique_zone` (`boolean`, optional): When true, place the volume in a hardware zone that holds no other volume of this app.
- `size_gb` (`integer`, optional): Volume size in gigabytes.
- `snapshot_id` (`string`, optional): ID of a snapshot to restore the new volume from.
- `snapshot_retention` (`integer`, optional): Days to keep automatic snapshots.
- `source_volume_id` (`string`, optional): ID of an existing volume to fork the new volume from.

Example input: `{"app_name":"<app_name>","name":"<name>","region":"<region>"}`

### `fly_create_volume_snapshot`

Create Volume Snapshot · Write

Take an on-demand snapshot of a volume.
Returns no body on success; use fly_list_volume_snapshots to see the snapshot once it appears.
Use before risky changes such as fly_delete_volume.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `volume_id` (`string`, required): ID of the volume, for example vol_18g2nqv2opd1rk54. Use fly_list_volumes to find volume IDs.

Example input: `{"app_name":"<app_name>","volume_id":"<volume_id>"}`

### `fly_exec_machine`

Execute Machine Command · Write

Run a command inside a running Machine and wait for it to finish.
Returns stdout, stderr, exit_code and exit_signal.
The Machine must be started. Use fly_list_machine_processes to inspect what is already running.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `command` (`array`, required): Command and arguments as a list of strings, for example ["ls", "-la", "/app"].
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.
- `stdin` (`string`, optional): Text to send to the command on standard input.
- `timeout` (`integer`, optional): Seconds to let the command run before it is cancelled.

Example input: `{"app_name":"<app_name>","command":[],"machine_id":"<machine_id>"}`

### `fly_extend_volume`

Extend Volume · Write

Grow a volume to a larger size. Volumes cannot shrink.
Returns the updated volume and needs_restart, which is true when the attached Machine must restart to use the new size.
Use fly_get_volume to see the current size.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `size_gb` (`integer`, required): New total size in gigabytes. Must be larger than the current size.
- `volume_id` (`string`, required): ID of the volume, for example vol_18g2nqv2opd1rk54. Use fly_list_volumes to find volume IDs.

Example input: `{"app_name":"<app_name>","size_gb":1,"volume_id":"<volume_id>"}`

### `fly_request_acme_certificate`

Request ACME Certificate · Write

Request a free Let's Encrypt certificate for a custom hostname on a Fly app.
Returns the certificate record with DNS requirements and validation state.
Point the hostname's DNS at the app first, then use fly_check_certificate to re-validate.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `hostname` (`string`, required): Custom domain to secure, for example www.example.com.

Example input: `{"app_name":"<app_name>","hostname":"<hostname>"}`

### `fly_restart_machine`

Restart Machine · Write

Restart a Machine, stopping it with a signal and starting it again.
Returns no body on success.
Use fly_stop_machine and fly_start_machine to control the stop and start separately.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.
- `signal` (`string`, optional): Unix signal used to stop the Machine. One of: `SIGHUP`, `SIGINT`, `SIGQUIT`, `SIGKILL`, `SIGUSR1`, `SIGUSR2`, `SIGTERM`.
- `timeout` (`string`, optional): How long to wait for the Machine to stop, as a duration such as 30s or a number of seconds.

Example input: `{"app_name":"<app_name>","machine_id":"<machine_id>"}`

### `fly_set_machine_metadata_value`

Set Machine Metadata Value · Write

Create or overwrite one metadata key on a Machine.
Returns no body; the API replies 204 No Content.
Use fly_update_machine_metadata to change several keys at once.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `key` (`string`, required): Metadata key to set, for example role.
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.
- `value` (`string`, required): The string value to store for the key.

Example input: `{"app_name":"<app_name>","key":"<key>","machine_id":"<machine_id>","value":"<value>"}`

### `fly_set_secret`

Set App Secret · Write

Create or overwrite one secret on a Fly app.
Returns the secret's name, digest, version and timestamps.
Running Machines pick the new value up on their next update or restart. Use fly_delete_secret to remove one.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `secret_name` (`string`, required): Name of the app secret, for example DATABASE_URL.
- `value` (`string`, required): The secret value to store. It cannot be read back later.

Example input: `{"app_name":"<app_name>","secret_name":"<secret_name>","value":"<value>"}`

### `fly_signal_machine`

Signal Machine · Write

Send a Unix signal to the main process of a Machine.
Returns no body on success.
Use fly_stop_machine to shut a Machine down cleanly.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.
- `signal` (`string`, required): Signal to send. One of: `SIGABRT`, `SIGALRM`, `SIGFPE`, `SIGHUP`, `SIGILL`, `SIGINT`, `SIGKILL`, `SIGPIPE`, `SIGQUIT`, `SIGSEGV`, `SIGTERM`, `SIGTRAP`, `SIGUSR1`, `SIGUSR2`.

Example input: `{"app_name":"<app_name>","machine_id":"<machine_id>","signal":"SIGABRT"}`

### `fly_start_machine`

Start Machine · Write

Start a stopped or suspended Machine.
Returns no body on success.
Use fly_wait_machine to wait until it reports started.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.

Example input: `{"app_name":"<app_name>","machine_id":"<machine_id>"}`

### `fly_stop_machine`

Stop Machine · Write

Stop a running Machine, optionally choosing the signal and the time to wait.
Returns no body on success.
Use fly_suspend_machine to keep a memory snapshot, or fly_delete_machine to remove it.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.
- `signal` (`string`, optional): Unix signal used to stop the Machine. Defaults to the Machine's configured stop signal. One of: `SIGHUP`, `SIGINT`, `SIGQUIT`, `SIGKILL`, `SIGUSR1`, `SIGUSR2`, `SIGTERM`.
- `timeout` (`string`, optional): How long to wait for the Machine to stop, as a duration such as 30s.

Example input: `{"app_name":"<app_name>","machine_id":"<machine_id>"}`

### `fly_suspend_machine`

Suspend Machine · Write

Suspend a Machine, taking a snapshot so the next start can resume from it instead of cold booting.
Returns no body on success. Resuming is attempted but not guaranteed.
Use fly_stop_machine for a normal stop.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.

Example input: `{"app_name":"<app_name>","machine_id":"<machine_id>"}`

### `fly_uncordon_machine`

Uncordon Machine · Write

Re-enable a cordoned Machine's services so the Fly proxy routes requests to it again.
Returns no body on success.
Use after fly_cordon_machine.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.

Example input: `{"app_name":"<app_name>","machine_id":"<machine_id>"}`

### `fly_update_machine`

Update Machine · Write

Update a Machine's configuration, which replaces the config and restarts the Machine.
Returns the updated Machine with its new version, state and config.
Use fly_get_machine first and send the full config you want, since the config is replaced rather than merged.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `config` (`object`, required): Machine configuration object. It needs an image (the Docker image to run) and usually a guest block for CPU and memory. It can also carry env (environment variables), services (ports and health checks), mounts (volumes), restart, metadata, checks, files and init settings. Example: {"image": "flyio/hellofly:latest", "guest": {"cpu_kind": "shared", "cpus": 1, "memory_mb": 256}, "env": {"PORT": "8080"}, "services": [{"protocol": "tcp", "internal_port": 8080, "ports": [{"port": 443, "handlers": ["tls", "http"]}]}]}
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.
- `current_version` (`string`, optional): The Machine's current version, as returned by get or a previous update. When set and no longer current, the update is rejected instead of overwriting newer changes.
- `lease_ttl` (`integer`, optional): Seconds to hold a lease on the Machine during the update.
- `min_secrets_version` (`integer`, optional): Minimum app secrets version the Machine must have available when it starts.
- `name` (`string`, optional): New unique name for the Machine. Leave empty to keep the current name.
- `region` (`string`, optional): Region code, for example iad, ams or syd. Use fly_list_regions to see valid codes.
- `skip_launch` (`boolean`, optional): When true, update without starting the Machine.
- `skip_secrets` (`boolean`, optional): When true, do not inject app secrets into the Machine.
- `skip_service_registration` (`boolean`, optional): When true, skip registering the Machine's services with the Fly proxy.

Example input: `{"app_name":"<app_name>","config":{},"machine_id":"<machine_id>"}`

### `fly_update_machine_metadata`

Update Machine Metadata · Write

Set or remove several metadata keys on a Machine in one call. Keys you leave out stay unchanged.
Returns no body; the API replies 204 No Content.
A null or empty-string value removes that key. Use fly_set_machine_metadata_value to set one key.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.
- `metadata` (`object`, required): Object of metadata keys to string values to set. A null or empty-string value removes the key. Example: {"role": "web", "stale": ""}.
- `machine_version` (`string`, optional): When set and the Machine's version has changed, the update fails with 412 instead of overwriting.

Example input: `{"app_name":"<app_name>","machine_id":"<machine_id>","metadata":{"role":"web","stale":""}}`

### `fly_update_volume`

Update Volume · Write

Change a volume's snapshot settings.
Returns the updated volume.
Use fly_extend_volume to change its size.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `volume_id` (`string`, required): ID of the volume, for example vol_18g2nqv2opd1rk54. Use fly_list_volumes to find volume IDs.
- `auto_backup_enabled` (`boolean`, optional): When true, take scheduled automatic snapshots.
- `snapshot_retention` (`integer`, optional): Days to keep automatic snapshots.

Example input: `{"app_name":"<app_name>","volume_id":"<volume_id>"}`

### `fly_delete_app`

Delete App · Destructive

Delete a Fly app by name, which also removes its Machines and volumes.
Returns no body; the API replies 202 Accepted and deletion continues in the background.
This cannot be undone, so confirm the app name first.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.

Example input: `{"app_name":"<app_name>"}`

### `fly_delete_certificate`

Delete Certificate · Destructive

Remove the certificate and hostname from a Fly app.
Returns no body; the API replies 204 No Content.
Traffic for that hostname stops being served over TLS.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `hostname` (`string`, required): Hostname the certificate covers, for example www.example.com.

Example input: `{"app_name":"<app_name>","hostname":"<hostname>"}`

### `fly_delete_machine`

Delete Machine · Destructive

Destroy a Machine in a Fly app.
Returns no body on success.
This cannot be undone. A running Machine must be stopped first unless force is true. Use fly_stop_machine to keep it.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.
- `force` (`boolean`, optional): When true, kill the Machine even if it is running.

Example input: `{"app_name":"<app_name>","machine_id":"<machine_id>"}`

### `fly_delete_machine_metadata_key`

Delete Machine Metadata Key · Destructive

Remove one metadata key from a Machine.
Returns no body; the API replies 204 No Content.
Use fly_update_machine_metadata to remove several keys at once.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `key` (`string`, required): Metadata key to remove, for example role.
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.

Example input: `{"app_name":"<app_name>","key":"<key>","machine_id":"<machine_id>"}`

### `fly_delete_secret`

Delete App Secret · Destructive

Remove one secret from a Fly app.
Returns the new secrets version.
Running Machines keep the old value until their next update or restart.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `secret_name` (`string`, required): Name of the app secret, for example DATABASE_URL.

Example input: `{"app_name":"<app_name>","secret_name":"<secret_name>"}`

### `fly_delete_volume`

Delete Volume · Destructive

Destroy a volume of a Fly app and its data.
Returns the deleted volume's details.
This cannot be undone. The volume must be detached from any Machine. Use fly_create_volume_snapshot first to keep a copy.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `volume_id` (`string`, required): ID of the volume, for example vol_18g2nqv2opd1rk54. Use fly_list_volumes to find volume IDs.

Example input: `{"app_name":"<app_name>","volume_id":"<volume_id>"}`

### `fly_release_machine_lease`

Release Machine Lease · Destructive

Release a lease you hold on a Machine.
Returns no body on success.
Needs the nonce returned by fly_create_machine_lease.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `machine_id` (`string`, required): ID of the Machine, for example 148ed599e12589. Use fly_list_machines to find Machine IDs.
- `nonce` (`string`, required): The lease nonce returned when the lease was created.

Example input: `{"app_name":"<app_name>","machine_id":"<machine_id>","nonce":"<nonce>"}`

### `fly_remove_ip`

Remove IP Assignment · Destructive

Release an IP address from a Fly app.
Returns no body; the API replies 204 No Content.
Use fly_list_ip_assignments to find the address. Releasing a dedicated address cannot be undone.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `app_name` (`string`, required): Name of the Fly app, for example my-app. Use fly_list_apps to find app names.
- `ip` (`string`, required): The IP address to release, exactly as shown by fly_list_ip_assignments, for example 2a09:8280:1::1:2345.

Example input: `{"app_name":"<app_name>","ip":"<ip>"}`

## Related

Other Developer Tools connectors ([all 117](/agentkit/connectors/?category=developer-tools)):

- [GitHub](/agentkit/connectors/github/): Scalekit connector, OAuth, 217 tools
- [Microsoft Entra ID](/agentkit/connectors/microsoftentraid/): Scalekit connector, OAuth, 82 tools
- [Datadog](/agentkit/connectors/datadog/): Scalekit connector, API key, 105 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
