MCP server
Give an AI agent your Fifty Eight workspace: it can list accounts, publish, schedule, dub videos and check results, by calling the same API with your key.
Connect
The server speaks Streamable HTTP at https://api.72-62-237-85.sslip.io/mcp/ (keep the trailing slash). Authenticate with your API key in the Authorization header. It is stateless and answers in JSON, so any client that supports remote MCP servers with custom headers works.
claude mcp add --transport http fifty-eight https://api.72-62-237-85.sslip.io/mcp/ \
--header "Authorization: Bearer YOUR_API_KEY"{
"mcpServers": {
"fifty-eight": {
"url": "https://api.72-62-237-85.sslip.io/mcp/",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}Claude Desktop starts local servers from claude_desktop_config.json. Use the mcp-remote bridge (needs Node.js) to reach the remote server with your key:
{
"mcpServers": {
"fifty-eight": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://api.72-62-237-85.sslip.io/mcp/",
"--header",
"Authorization:${FIFTYEIGHT_AUTH}"
],
"env": {
"FIFTYEIGHT_AUTH": "Bearer YOUR_API_KEY"
}
}
}
}tiktok_consent. Use a dedicated key per agent so you can revoke it alone.Things to ask
- “Which accounts are connected, and in which language does each one publish?”
- “Schedule this video to Instagram and TikTok tomorrow at 6 pm Paris time.”
- “Dub my last upload into Spanish and Japanese, then publish each version when it's ready.”
- “Which of this week's posts failed, and why? Retry them.”
Tools
Every tool calls the same code as the REST API, so validation, limits and credits are identical. Errors come back as a tool error with the API's message (for example Not enough credits: this dub needs 60, you have 12. Top up or turn on automatic top-up in Plan & credits.).
Accounts
list_accounts Connected accounts with their id, platform and publishing language.
connect_account A link the account owner opens in a browser to connect an account. Then call sync_accounts.
| Argument | Meaning |
|---|---|
platform | instagram, tiktok, youtube, facebook, linkedin, twitter, threads, pinterest or bluesky |
sync_accounts Refreshes the accounts after one was connected.
set_timing_optimizer Turns the best-time optimizer on or off for one account and sets its audience timezone.
| Argument | Meaning |
|---|---|
account_id | Account id |
enabled | true or false |
timezone | Optional IANA zone, e.g. Europe/Paris |
get_best_times Best posting times learned per account, confidence, and the posts the optimizer moved.
Posts
create_upload An upload slot for a local file: PUT the bytes to upload_url within 1 hour, then use media_id. Not needed for media already at a public URL.
| Argument | Meaning |
|---|---|
filename | File name |
content_type | e.g. video/mp4, image/jpeg |
size_bytes | Optional |
publish Publishes now, schedules, or saves a draft to one or more accounts.
| Argument | Meaning |
|---|---|
account_ids | Accounts to post to |
content | Caption (default empty) |
media_ids / media_urls | Uploaded media ids and/or public https URLs; media_type is video (default) or image |
publish_now / scheduled_for / draft | Exactly one. scheduled_for is ISO 8601; add timezone for a local time |
captions_by_account | Optional map of account id to caption override |
tiktok_consent | Must be true for TikTok accounts, only after the creator agreed to publish |
tiktok_privacy | PUBLIC_TO_EVERYONE (default), MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY |
youtube_title | Optional |
idempotency_key | Reuse it when retrying, so the post is never created twice |
fixed_time | true keeps the best-time optimizer from moving the post |
get_post A post and its status, URL or error on each account.
| Argument | Meaning |
|---|---|
post_id | Post id |
refresh | Ask the platforms for news (default true) |
list_posts Posts of the workspace, including posts made in other tools on its accounts.
| Argument | Meaning |
|---|---|
status | Optional: draft, scheduled, publishing, published, partially_published, failed, cancelled |
platform | Optional, e.g. instagram |
source | Optional: fifty_eight (made here) or zernio (imported: made in another tool) |
start, end | Optional ISO 8601 window on the post's moment (scheduled, else published, else created) |
order | desc (default) or asc |
limit, offset | Default 20 and 0 |
update_post Edits a draft, scheduled, failed or cancelled post. Only the fields you pass change. Imported posts need an owner or admin.
| Argument | Meaning |
|---|---|
post_id | Post id |
content | Optional new caption |
scheduled_for, timezone | Optional new time (ISO 8601 with offset, or naive local time + IANA zone) |
draft | Optional: true keeps or makes it a draft, false schedules it |
fixed_time | Optional: never let best-time testing move it |
publish_post_now Publishes a draft or scheduled post right away.
| Argument | Meaning |
|---|---|
post_id | Post id |
duplicate_post Copies a post into a new draft.
| Argument | Meaning |
|---|---|
post_id | Post id |
tiktok_consent | Needed when the copy targets TikTok |
sync_posts Imports the latest posts made in other tools on the workspace's accounts (about once a minute per brand).
| Argument | Meaning |
|---|---|
force | Optional, owners and admins: shorten the wait to a few seconds |
cancel_post Cancels a draft or scheduled post.
| Argument | Meaning |
|---|---|
post_id | Post id |
retry_post Retries only the accounts that failed.
| Argument | Meaning |
|---|---|
post_id | Post id |
Dubbing and clips
localize_video Dubs an uploaded video into other languages in the speaker's voice, with translated caption and burned-in subtitles. Runs for a few minutes.
| Argument | Meaning |
|---|---|
media_id | Uploaded video |
languages | BCP-47 tags, e.g. ["es", "pt-BR"], up to 16 |
source_language | Optional, detected when omitted |
caption | Caption to translate |
subtitles | Burn subtitles in (default true) |
subtitle_style | Optional: preset pop | bold_box | karaoke | clean | minimal | classic, plus font, highlight, text_color, position, size, uppercase |
lipsync | Also lip-sync each language (+1.5 credits per second of video, per language). Default false |
lipsync_localization Lip-syncs the ready languages of a localization. Never in a plan: +1.5 credits per second of video per language, refunded if it fails.
| Argument | Meaning |
|---|---|
localization_id | Localization id |
languages | Optional: only these languages (default: every ready one) |
create_dubbed_post Publishes a video in its own language and dubs it into others in one call. Each language version goes to its accounts as soon as it is ready (or at scheduled_for). Uses credits: seconds × languages.
| Argument | Meaning |
|---|---|
media_id | The uploaded video |
source_account_ids | Accounts that get the original |
languages | Languages to dub into |
targets | Optional: accounts per language. Default: the linked accounts (see list_language_versions) |
caption, scheduled_for, timezone, draft | Same as create_post |
subtitles, lipsync | Burned subtitles (default true), lip sync (default false, +1.5 credits / s per language) |
list_language_versions Accounts linked as language versions of one presence (e.g. @atlas FR, @atlas.en EN), plus suggested links.
link_accounts Links two or more accounts as language versions. Dubbed versions then go to the linked account of each language.
| Argument | Meaning |
|---|---|
name | Group name, e.g. Atlas on Instagram |
account_ids | Two or more account ids |
unlink_accounts Dissolves a group of language versions. The accounts stay connected.
| Argument | Meaning |
|---|---|
group_id | Group id |
remove_account Removes an account from the workspace. Accounts Fifty Eight connected are disconnected and no longer billed; accounts shared with other tools are only hidden.
| Argument | Meaning |
|---|---|
account_id | Account id |
cancel_scheduled | Confirm cancelling its scheduled posts that only go to it |
restyle_subtitles Re-renders a ready localization's subtitles with another style. Uses no credits.
| Argument | Meaning |
|---|---|
localization_id | Localization id |
subtitle_style | Same options as localize_video |
get_localization Status, video and caption of each language. Poll until status is ready.
| Argument | Meaning |
|---|---|
localization_id | Localization id |
publish_localization Sends each language to the accounts that publish in it; source-language accounts get the original.
| Argument | Meaning |
|---|---|
localization_id | Localization id |
publish_now / scheduled_for (+ timezone) / draft | Exactly one |
account_ids | Optional: only these accounts |
include_original | Default true |
tiktok_consent | Required when TikTok accounts receive a version |
youtube_title | Optional |
create_clips Cuts extracts from an uploaded video (each at most 180 s), optionally reframed to 9:16.
| Argument | Meaning |
|---|---|
media_id | Uploaded video |
clips | List of {start, end} in seconds |
vertical | Default false |
list_clips Clips, optionally only those cut from one video.
| Argument | Meaning |
|---|---|
media_id | Optional |
get_credits Credits left, credits the plan adds each month, what everything costs, automatic top-up and monthly budget. Read only: credits and plans are bought in the dashboard.
estimate_dub Credits a dub will use before starting it (1 per second per language, lip sync +1.5, preview 15).
| Argument | Meaning |
|---|---|
seconds | Length of the video |
languages | Number of languages (default 1) |
lipsync | Optional, default false |
preview | Optional, default false |
get_credit_history Credit movements, newest first, with the balance after each.
| Argument | Meaning |
|---|---|
limit | Default 25 |
offset | Default 0 |
Automations
list_automations Comment-to-DM automations with their totals, and imported ones running in another tool for linked profiles.
create_automation Answer keyword comments with a DM (Instagram, Facebook) and/or a public reply. Each person once.
| Argument | Meaning |
|---|---|
account_id | A connected account. |
name | Shown in the console. |
keywords | Trigger words; empty answers every comment. |
dm_message | Private DM; {{first_name}} is filled in. |
button_title, button_url | Optional link button in the DM. |
public_replies | Up to 3 different replies under the comment; one is picked at random for each comment. public_reply takes a single one. |
platform_post_id | One post only; omit for every post. |
trigger | comment, story (Creator+) or live (Pro+). |
update_automation Turn an automation on or off, or change its keywords and messages.
| Argument | Meaning |
|---|---|
automation_id | From list_automations. |
enabled, keywords, dm_message, public_replies, public_reply | Only the fields to change. public_replies replaces the current replies. |
get_automation_usage Replies used this month against the plan's quota, per-video limit, and replies past the quota paid in credits.
Without a client library
The server accepts plain JSON-RPC over HTTPS, which helps when testing:
curl https://api.72-62-237-85.sslip.io/mcp/ \
-H "Authorization: Bearer $FIFTYEIGHT_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}'