DocumentationOpen the app

Hosted remote MCP

MCP tools

Every tool the Swipe Pilot MCP server gives your agent, with its arguments and an answer it sends back. To connect an agent first, see MCP for agents.

All tools

ToolPurposeAccess
list_iphonesThe workspace's iPhones, each with its accounts. Their id or their name is what the other tools take as iphone.Read
upload_mediaStores one photo or video and returns its id. Give url or data_base64.Write
list_mediaThe photos and videos already in the workspace, newest first.Read
queue_postQueues a post on one iPhone: its media in slide order, its caption, now or at a given time. Name the iPhone, or only the account: its iPhone is found for you.Write
list_queueThe 50 latest tasks, newest first, posts and scripts alike, each with its state.Read
cancel_taskCancels a task that has not started. Cancelling a script's import also cancels the run that follows it.Write
list_scriptsThe workspace's scripts, and the scripts installed on each iPhone with the command that runs them. Posts are not scripts: they go through queue_post.Read
run_scriptRuns a script on one iPhone, now or at a given time. A script installed there runs under its command. A script of the workspace that is not installed is imported first, then run.Write
list_routinesThe workspace's routines, soonest first: what each one runs, on which iPhone, its next run, how often, its window, and whether it is paused.Read
create_routineCreates a routine: a post or a script on one iPhone, from first_at, then every every_hours. Give media_ids for a post, or script for a script.Write
update_routineChanges a routine. Only the arguments given change: pause or resume it, move its next run, change how often it runs, its window, its iPhone or what it runs.Write
delete_routineDeletes a routine.Write
daily_summaryWhat each iPhone did over the last hours: posts confirmed, per account, script runs, failures, tasks to check, and iPhones gone quiet.Read

Times are given in ISO 8601 and come back in Unix seconds. iPhones are named by their name or their id, accounts by their handle.

iPhones

Which iPhones the workspace has, and what each one can do now.

The workspace's iPhones, each with its accounts. Their id or their name is what the other tools take as iphone.

Arguments

None.

Answer

{
  "iphones": [
    {
      "id": "BDCE218C-953F-4976-9E41-61FE9DB13FBA",
      "name": "Alpha",
      "online": true,
      "paused": false,
      "canPost": true,
      "exitCountry": "US",
      "lastExit": { "country": "US", "ok": true, "at": 1792590000 },
      "accounts": [{ "platform": "tiktok", "handle": "@mybrand" }]
    }
  ]
}

online: the companion checked in during the last two minutes. canPost: the iPhone finished its setup and has its post command.

exitCountry: the country its traffic must leave from before a task starts, null when it is not checked. lastExit: what the last check saw.

Media

The photos and videos a post carries. Upload them once, then use their ids in as many posts and routines as you like.

Stores one photo or video and returns its id. Give url or data_base64.

Arguments

urlstring
A public https address of the file. Swipe Pilot downloads it.
data_base64string
The file itself in base64, for small files.
namestring
The file name, such as slide-1.jpg. Taken from the address when left out.
mimestring
image/jpeg, image/png, image/webp, image/heic, video/mp4 or video/quicktime. Guessed from the address or the name when left out.

Answer

{ "id": "6A4B4B3E-148E-4B82-8CF7-19D6EFE37B71", "name": "slide-1.jpg", "kind": "photo", "size": 482113 }

25 MB at most per file, within your plan's storage. For large files on your computer, upload with the REST API instead: the agent sends no base64 through the conversation.

The photos and videos already in the workspace, newest first.

Arguments

kind"photo" | "video"
Only photos, or only videos.
namestring
Only files whose name contains this.
limitnumber
How many, 1 to 100. 50 by default.

Answer

{
  "media": [
    { "id": "6A4B4B3E-148E-4B82-8CF7-19D6EFE37B71", "name": "slide-1.jpg", "kind": "photo", "mime": "image/jpeg", "size": 482113, "uploadedAt": 1792010642 }
  ]
}

Posts and the queue

Each post is a task in an iPhone's queue. The iPhone runs its tasks one at a time, at their time or as soon as it is free.

Queues a post on one iPhone: its media in slide order, its caption, now or at a given time. Name the iPhone, or only the account: its iPhone is found for you.

Arguments

media_idsstring[]required
1 to 12 media ids, in the order they are posted.
iphonestring
The iPhone's name or id. Optional when account is given.
accountstring
The account the post is for, such as @mybrand. It must be on the iPhone named.
captionstring
The caption.
titlestring
The title, for platforms that have one.
atstring
When, in ISO 8601 with a time zone, such as 2026-10-20T09:30:00+02:00. Left out: as soon as the iPhone is free. A time already past means now.
keystring
An idempotency key. Sending the same key again never queues a second task: the answer then holds the first task's id and replayed: true. A new one is made when left out.

Answer

{ "ok": true, "id": "AD02A1E6-8B8A-43A5-A1A6-4754FF268541", "runID": null, "iphone": "Alpha", "account": "@mybrand", "scheduledAt": 1792593423 }

Refused when the iPhone has not finished its setup, is paused, or already holds 100 tasks.

The 50 latest tasks, newest first, posts and scripts alike, each with its state.

Arguments

iphonestring
Only this iPhone, by its name or its id.

Answer

{
  "tasks": [
    { "id": "AD02A1E6-8B8A-43A5-A1A6-4754FF268541", "name": "Three things nobody tells you about…", "iphone": "Alpha", "account": "@mybrand", "files": 2, "state": "scheduled", "at": 1792593423, "completedAt": null }
  ]
}

state is one of: scheduled, waiting for the iPhone, running, to check on the iPhone, end confirmed · cleaning up, posted · end confirmed by the iPhone (done · … for a script), failed, cancelled.

at is when the task is due; completedAt, when the iPhone confirmed its end.

Cancels a task that has not started. Cancelling a script's import also cancels the run that follows it.

Arguments

idstringrequired
The task's id, from queue_post, run_script or list_queue.

Answer

{ "ok": true, "id": "AD02A1E6-8B8A-43A5-A1A6-4754FF268541" }

A task already running is not stopped: the answer says so. Look at the iPhone first.

Scripts

Scripts are made in Swipe Pilot's script editor: scrolling, liking, warming an account up. Each iPhone runs the ones installed on it, each under its own Voice Control command.

The workspace's scripts, and the scripts installed on each iPhone with the command that runs them. Posts are not scripts: they go through queue_post.

Arguments

iphonestring
Only this iPhone, by its name or its id.

Answer

{
  "scripts": [
    {
      "id": "30672697-2531-45B6-8EA4-A4BDA60433CF",
      "name": "Morning scroll",
      "updatedAt": 1792044733,
      "installedOn": [{ "iphone": "Alpha", "command": "Alpha script 0", "upToDate": true }]
    },
    { "id": "F3A76695-E78F-4701-A949-D7099BA0EC7A", "name": "Like five videos", "updatedAt": 1791989622, "installedOn": [] }
  ],
  "installed": [
    {
      "iphone": "Alpha",
      "scripts": [{ "id": "DB1DC609-D6CB-4807-B1CB-298CE0E1B477", "command": "Alpha script 0", "name": "Morning scroll", "ready": true }]
    }
  ]
}

upToDate is false once the script was edited after it was installed: run it with reinstall to send the new version. ready is false while its import has not been confirmed.

Runs a script on one iPhone, now or at a given time. A script installed there runs under its command. A script of the workspace that is not installed is imported first, then run.

Arguments

iphonestringrequired
The iPhone's name or id.
scriptstringrequired
The script's name or id in the workspace, or the command it is installed under on this iPhone.
atstring
When, in ISO 8601 with a time zone, such as 2026-10-20T09:30:00+02:00. Left out: as soon as the iPhone is free. A time already past means now.
reinstallboolean
Import the script again, under the same command, though it is installed: after it was edited. False by default.
keystring
An idempotency key. Sending the same key again never queues a second task: the answer then holds the first task's id and replayed: true. A new one is made when left out.

Answer

{
  "ok": true,
  "id": "13AE5878-382B-4149-9F93-547DAA0579A7",
  "runID": "971BB978-BAF6-44F8-AEEB-CFABA939C946",
  "iphone": "Alpha",
  "script": "Like five videos",
  "command": "Alpha script 1",
  "imported": true,
  "scheduledAt": 1792593380
}

An import is two tasks: id installs the script, runID runs it once the import is done. A script already installed is one task, and runID is null.

The import opens Settings on the iPhone and lays the script out with the latest Screens & zones pack made for its screen. It needs the iPhone's import command, and takes the next free command: Alpha script 0, Alpha script 1…

Routines

A routine runs the same post or script again and again. Each run is queued about 15 minutes before its time, then starts at a random moment in its window, kept apart from the iPhone's other tasks by its gap between tasks.

The workspace's routines, soonest first: what each one runs, on which iPhone, its next run, how often, its window, and whether it is paused.

Arguments

iphonestring
Only this iPhone, by its name or its id.

Answer

{
  "routines": [
    {
      "id": "2B157370-199A-4AE3-8672-629C692626E8",
      "name": "Daily slideshow",
      "iphone": "Alpha",
      "runs": {
        "kind": "post",
        "media_ids": ["6A4B4B3E-148E-4B82-8CF7-19D6EFE37B71", "20EEA54D-A8F9-43FF-ADD7-CB63B41A0ACE"],
        "caption": "Three things nobody tells you about…",
        "title": null,
        "account": "@mybrand"
      },
      "nextAt": 1792593380,
      "everyHours": 24,
      "windowMinutes": 45,
      "paused": false
    }
  ]
}

runs.kind is post (with its media), script (a script, by its name and command) or command (a Voice Control command made on the website). everyHours is 0 for a routine that runs once.

Creates a routine: a post or a script on one iPhone, from first_at, then every every_hours. Give media_ids for a post, or script for a script.

Arguments

namestringrequired
The routine's name, such as Morning slideshow.
first_atstringrequired
Its first run, in ISO 8601 with a time zone.
iphonestring
The iPhone's name or id. Optional for a post when account is given.
every_hoursnumber
Hours between two runs: 1 or more, decimals allowed. 0 runs it once.
window_minutesnumber
Each run starts at a random moment up to this many minutes after its time, so runs never start at a fixed time. 0 to 360, and shorter than every_hours. 0 by default.
media_idsstring[]
For a post: 1 to 12 media ids, in slide order. The same media are posted at each run.
captionstring
For a post: its caption.
titlestring
For a post: its title, for platforms that have one.
accountstring
For a post: the account it is for, such as @mybrand. It must be on the routine's iPhone.
scriptstring
For a script: its name or id, or the command it is installed under, as run_script takes it. Give media_ids or script, not both.

Answer

{
  "ok": true,
  "routine": {
    "id": "2B157370-199A-4AE3-8672-629C692626E8",
    "name": "Daily slideshow",
    "iphone": "Alpha",
    "runs": {
      "kind": "post",
      "media_ids": ["6A4B4B3E-148E-4B82-8CF7-19D6EFE37B71", "20EEA54D-A8F9-43FF-ADD7-CB63B41A0ACE"],
      "caption": "Three things nobody tells you about…",
      "title": null,
      "account": "@mybrand"
    },
    "nextAt": 1792593380,
    "everyHours": 24,
    "windowMinutes": 45,
    "paused": false
  }
}

A script installed on the iPhone runs under its command at each run. A script not installed is imported again at each run, as routines made on the website do. A workspace keeps 100 routines at most.

Changes a routine. Only the arguments given change: pause or resume it, move its next run, change how often it runs, its window, its iPhone or what it runs.

Arguments

idstringrequired
The routine's id, from list_routines or create_routine.
pausedboolean
true pauses the routine, false resumes it.
namestring
A new name.
iphonestring
Move it to this iPhone. A script routine then needs script again: on another iPhone, a script runs under another command.
next_atstring
Its next run, in ISO 8601 with a time zone.
every_hoursnumber
Hours between two runs: 1 or more, decimals allowed. 0 runs it once.
window_minutesnumber
Each run starts at a random moment up to this many minutes after its time, so runs never start at a fixed time. 0 to 360, and shorter than every_hours. 0 by default.
media_idsstring[]
For a post: 1 to 12 media ids, in slide order. The same media are posted at each run.
captionstring
For a post: its caption.
titlestring
For a post: its title, for platforms that have one.
accountstring
For a post: the account it is for, such as @mybrand. It must be on the routine's iPhone.
scriptstring
For a script: its name or id, or the command it is installed under, as run_script takes it. Give media_ids or script, not both.

Answer

{
  "ok": true,
  "routine": {
    "id": "2B157370-199A-4AE3-8672-629C692626E8",
    "name": "Daily slideshow",
    "iphone": "Alpha",
    "runs": {
      "kind": "post",
      "media_ids": ["6A4B4B3E-148E-4B82-8CF7-19D6EFE37B71", "20EEA54D-A8F9-43FF-ADD7-CB63B41A0ACE"],
      "caption": "Three things nobody tells you about…",
      "title": null,
      "account": "@mybrand"
    },
    "nextAt": 1792593380,
    "everyHours": 24,
    "windowMinutes": 45,
    "paused": true
  }
}

An empty account takes the account off a post routine. Captions and titles left out stay as they are.

Deletes a routine.

Arguments

idstringrequired
The routine's id.

Answer

{ "ok": true, "id": "2B157370-199A-4AE3-8672-629C692626E8", "name": "Daily slideshow" }

A run it already queued stays in the queue: find it with list_queue and cancel it with cancel_task.

Summary

What went out, as the iPhones confirmed it.

What each iPhone did over the last hours: posts confirmed, per account, script runs, failures, tasks to check, and iPhones gone quiet.

Arguments

hoursnumber
How many hours back, 1 to 168. 24 by default.

Answer

{
  "since": 1792506600,
  "until": 1792593000,
  "posts": 6,
  "failed": 1,
  "toCheck": 0,
  "phones": [
    {
      "device": "BDCE218C-953F-4976-9E41-61FE9DB13FBA",
      "name": "Alpha",
      "posts": 4,
      "runs": 2,
      "failed": 0,
      "toCheck": 0,
      "lastPost": 1792590000,
      "quiet": false,
      "accounts": { "mybrand": 3, "otherbrand": 1 }
    }
  ]
}

A post counts once the iPhone confirmed the end of its post script: Swipe Pilot never opens TikTok to check. quiet is true for an iPhone that had posts due and confirmed none for 18 hours.

Errors and limits

A tool that cannot do what it was asked answers with isError: true and one sentence saying why, such as No iPhone named Bravo. Call list_iphones to see them. The agent reads it and can correct itself.

A connection makes 120 requests a minute at most. Tasks count toward your plan's daily allowance, and script imports toward its hourly one, as they do on the website.