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
| Tool | Purpose | Access |
|---|---|---|
| list_iphones | The workspace's iPhones, each with its accounts. Their id or their name is what the other tools take as iphone. | Read |
| upload_media | Stores one photo or video and returns its id. Give url or data_base64. | Write |
| list_media | The photos and videos already in the workspace, newest first. | Read |
| queue_post | 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. | Write |
| list_queue | The 50 latest tasks, newest first, posts and scripts alike, each with its state. | Read |
| cancel_task | Cancels a task that has not started. Cancelling a script's import also cancels the run that follows it. | Write |
| list_scripts | 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. | Read |
| run_script | 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. | Write |
| list_routines | 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. | Read |
| create_routine | 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. | Write |
| update_routine | 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. | Write |
| delete_routine | Deletes a routine. | Write |
| daily_summary | What 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.
list_iphones
ReadArguments
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.
upload_media
WriteArguments
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.
list_media
ReadArguments
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.
queue_post
WriteArguments
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.
list_queue
ReadArguments
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.
cancel_task
WriteArguments
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.
list_scripts
ReadArguments
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.
run_script
WriteArguments
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.
list_routines
ReadArguments
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.
create_routine
WriteArguments
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.
update_routine
WriteArguments
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.
delete_routine
WriteArguments
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.
daily_summary
ReadArguments
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.