MCP overview
The server is named 0bull Phone Farm and is served at:
Code
It drives the 0bull phone farm on behalf of the authenticated user: managing posting accounts on TikTok, Instagram and YouTube, publishing videos as submissions, controlling phones, and ordering or managing billing for new ones. See Connecting to add it to your client, and the tool reference for all 24 tools.
It is listed on Smithery,
Glama and the
official MCP Registry
as net.0bull/phone-farm.
Platforms
Accounts and submissions carry a platform of tiktok, instagram or youtube, and
it defaults to tiktok everywhere.
An account id is a UUID that identifies its own platform, so the tools that take one
(get-account-tool, update-account-tool, delete-account-tool) never ask which platform
it is on. Only create-account-tool, list-accounts-tool and create-submission-tool take
a platform, because they have no id to read it from.
Where the platforms differ:
| TikTok | YouTube | ||
|---|---|---|---|
| Required to link | handle, slot | handle | handle, google_email |
slot | Required, up to 4 accounts per phone | Optional | Optional |
| Caption | Up to 2200 chars, optional | Up to 2200 chars, optional | The Short's title, up to 100 chars, required |
An account is linked, not signed in through this server: create-account-tool records a
handle that is already signed in on the phone at the given slot. YouTube also needs the
Google account address, google_email.
Everything phone-touching is asynchronous
A tool call that reaches a phone queues the work and returns immediately. The response means the work was accepted, not that it succeeded:
create-submission-toolcreates the submission and queues a publish. It returns the submission right away, inpending.run-macro-toolandrun-phone-agent-toolonly acknowledge the start.
To learn what happened, poll get-submission-tool until the status reaches a resting state.
create-account-tool never touches a phone: it only records the handle and slot, so it
answers immediately with the finished account.
The read tools (list-*, get-*, list-phones-tool, list-phone-runs-tool,
get-phone-run-tool, phone-snapshot-tool, phone-ocr-tool) and the plain database
operations (delete-*, cancel-submission-tool) are synchronous and answer immediately.
phone-control-tool is synchronous too: it runs and returns right away instead of being
queued.
Queued phone work (phone-command-tool, run-macro-tool, run-phone-agent-tool) also
creates a phone run: poll get-phone-run-tool, or list them with
list-phone-runs-tool, to watch it move from queued/running to succeeded, failed or
cancelled.
Submission status
Poll get-submission-tool and read status:
| Status | Meaning |
|---|---|
scheduled | Queued for a future run. |
pending | Queued, not yet picked up. |
ingesting | The video is being fetched or prepared. |
driving | The phone is being driven through the platform's app. |
published | Posted. Terminal. |
drafted | Saved as a draft on the phone. Terminal. |
failed | The run failed. Terminal. |
cancelled | Cancelled before finishing. Terminal. |
pending, ingesting, and driving are in-flight: cancel-submission-tool works on
these, delete-submission-tool does not. Once a status is terminal, the reverse is true.
Billing and ordering phones
Four tools cover renting phones and checking on billing: get-billing-tool,
start-rental-tool, request-phones-tool, and get-billing-request-tool.
get-billing-tool reads the account's rentals: how many phones it has, what each one costs
and when each one renews, plus any orders still waiting on an admin to assign a phone. Every
assigned phone runs on its own monthly cycle, so renewal dates come back one per phone. Call
it first, before proposing any change.
start-rental-tool opens a Stripe Checkout link for a first order. The link saves a card and
holds one month per phone on it; nothing is charged there. The order is placed once checkout
completes, and the held amount is charged the moment an admin assigns each phone. Orders are
final: there is nothing to cancel while one waits.
request-phones-tool changes an existing rental's phone count, given either a new total or
a signed adjustment. It files the change and returns an approval link, so poll
get-billing-request-tool for the answer. If the caller has set a standing allowance in
their MCP settings, an increase within it is applied immediately, and the response says
applied: true. That means the order was placed, not that a card was charged. The card is
only charged when an admin assigns the phone.
Both start-rental-tool and request-phones-tool require accept_terms: true. Before
calling either, show the user 0bull.net/terms and
0bull.net/privacy, and get their agreement to those and to
monthly renewal charges. Without it, both tools refuse.
Scoping
Every call is scoped to the caller's own accounts and phone grants. You see your own accounts and submissions; you reach a phone only if you hold a grant on it.
Accounts and submissions you may not access return Account not found. /
Submission not found., the same error as a genuinely missing record. A "not found" may
mean it does not exist, or it is not yours.
Rate limit
250 requests per minute, the same ceiling as the REST API. Screen reads (phone-ocr-tool)
are also capped at 60 per minute, shared with the REST and WebSocket OCR calls. Polling a status is normal, just
leave a second or two between calls. A phone takes far longer than a minute to finish a
publish.
Authentication
The server uses OAuth, with the authorization endpoints published alongside it. Your client discovers them and walks you through authorization in a browser: you never copy a token. See Connecting.

