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 Code
claude mcp add --transport http fifty-eight https://api.72-62-237-85.sslip.io/mcp/ \
  --header "Authorization: Bearer YOUR_API_KEY"
Cursor (~/.cursor/mcp.json) and other clients with header support
{
  "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:

Claude Desktop (claude_desktop_config.json)
{
  "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"
      }
    }
  }
}
The key gives the agent the same rights as the API: it can publish for real. For TikTok, the agent must ask you before setting 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.

ArgumentMeaning
platforminstagram, 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.

ArgumentMeaning
account_idAccount id
enabledtrue or false
timezoneOptional 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.

ArgumentMeaning
filenameFile name
content_typee.g. video/mp4, image/jpeg
size_bytesOptional

publish Publishes now, schedules, or saves a draft to one or more accounts.

ArgumentMeaning
account_idsAccounts to post to
contentCaption (default empty)
media_ids / media_urlsUploaded media ids and/or public https URLs; media_type is video (default) or image
publish_now / scheduled_for / draftExactly one. scheduled_for is ISO 8601; add timezone for a local time
captions_by_accountOptional map of account id to caption override
tiktok_consentMust be true for TikTok accounts, only after the creator agreed to publish
tiktok_privacyPUBLIC_TO_EVERYONE (default), MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY
youtube_titleOptional
idempotency_keyReuse it when retrying, so the post is never created twice
fixed_timetrue keeps the best-time optimizer from moving the post

get_post A post and its status, URL or error on each account.

ArgumentMeaning
post_idPost id
refreshAsk the platforms for news (default true)

list_posts Posts of the workspace, including posts made in other tools on its accounts.

ArgumentMeaning
statusOptional: draft, scheduled, publishing, published, partially_published, failed, cancelled
platformOptional, e.g. instagram
sourceOptional: fifty_eight (made here) or zernio (imported: made in another tool)
start, endOptional ISO 8601 window on the post's moment (scheduled, else published, else created)
orderdesc (default) or asc
limit, offsetDefault 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.

ArgumentMeaning
post_idPost id
contentOptional new caption
scheduled_for, timezoneOptional new time (ISO 8601 with offset, or naive local time + IANA zone)
draftOptional: true keeps or makes it a draft, false schedules it
fixed_timeOptional: never let best-time testing move it

publish_post_now Publishes a draft or scheduled post right away.

ArgumentMeaning
post_idPost id

duplicate_post Copies a post into a new draft.

ArgumentMeaning
post_idPost id
tiktok_consentNeeded 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).

ArgumentMeaning
forceOptional, owners and admins: shorten the wait to a few seconds

cancel_post Cancels a draft or scheduled post.

ArgumentMeaning
post_idPost id

retry_post Retries only the accounts that failed.

ArgumentMeaning
post_idPost 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.

ArgumentMeaning
media_idUploaded video
languagesBCP-47 tags, e.g. ["es", "pt-BR"], up to 16
source_languageOptional, detected when omitted
captionCaption to translate
subtitlesBurn subtitles in (default true)
subtitle_styleOptional: preset pop | bold_box | karaoke | clean | minimal | classic, plus font, highlight, text_color, position, size, uppercase
lipsyncAlso 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.

ArgumentMeaning
localization_idLocalization id
languagesOptional: 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.

ArgumentMeaning
media_idThe uploaded video
source_account_idsAccounts that get the original
languagesLanguages to dub into
targetsOptional: accounts per language. Default: the linked accounts (see list_language_versions)
caption, scheduled_for, timezone, draftSame as create_post
subtitles, lipsyncBurned subtitles (default true), lip sync (default false, +1.5 credits / s per language)

add_subtitles Burns subtitles into a video without dubbing it (same voice), in its spoken language and optionally translated, then publishes each version to its accounts once ready. Included in the plan: no credits.

ArgumentMeaning
media_idThe uploaded video
account_idsAccounts that get the original-language version
translate_to, targetsOptional: languages to translate the subtitles into, and their accounts (default: the linked accounts)
language, style, reviewSpoken language (default: detected), look (pop, bold_box, karaoke, clean, minimal, classic), stop for a transcript check
caption, scheduled_for, timezone, draft, tiktok_consent, youtube_titleSame as publish

get_subtitles Status of each language, the queue position (videos ahead) and the estimated wait, and the posts made.

ArgumentMeaning
subtitles_idSubtitles id

confirm_subtitles For subtitles started with review: the transcript is right, translate it and burn it.

ArgumentMeaning
subtitles_idSubtitles id

list_language_versions Accounts linked as language versions of one presence (e.g. @atlas FR, @atlas.en EN), plus suggested links.

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.

ArgumentMeaning
account_idAccount id
cancel_scheduledConfirm cancelling its scheduled posts that only go to it

restyle_subtitles Re-renders a ready localization's subtitles with another style. Uses no credits.

ArgumentMeaning
localization_idLocalization id
subtitle_styleSame options as localize_video

get_localization Status, video and caption of each language. Poll until status is ready.

ArgumentMeaning
localization_idLocalization id

publish_localization Sends each language to the accounts that publish in it; source-language accounts get the original.

ArgumentMeaning
localization_idLocalization id
publish_now / scheduled_for (+ timezone) / draftExactly one
account_idsOptional: only these accounts
include_originalDefault true
tiktok_consentRequired when TikTok accounts receive a version
youtube_titleOptional

create_clips Cuts extracts from an uploaded video (each at most 180 s), optionally reframed to 9:16.

ArgumentMeaning
media_idUploaded video
clipsList of {start, end} in seconds
verticalDefault false

list_clips Clips, optionally only those cut from one video.

ArgumentMeaning
media_idOptional

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).

ArgumentMeaning
secondsLength of the video
languagesNumber of languages (default 1)
lipsyncOptional, default false
previewOptional, default false

get_credit_history Credit movements, newest first, with the balance after each.

ArgumentMeaning
limitDefault 25
offsetDefault 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.

ArgumentMeaning
account_idA connected account.
nameShown in the console.
keywordsTrigger words; empty answers every comment.
dm_messagePrivate DM; {{first_name}} is filled in.
button_title, button_urlOptional link button in the DM.
public_repliesUp to 3 different replies under the comment; one is picked at random for each comment. public_reply takes a single one.
platform_post_idOne post only; omit for every post.
post_scopeany, post or next_post (the next post published on the account).
statuslive (default), paused or draft.
opening_dm, follow_gate, email_capture, follow_upOptional conversation steps before the link: a first DM with a button, ask to follow (Instagram), ask for the email, one follow-up if the link wasn't opened.
link_trackingCount clicks on the link button (default true).
triggercomment, story (Creator+) or live (Pro+).

update_automation Change the status (live, paused, draft), keywords, messages or conversation steps of an automation.

ArgumentMeaning
automation_idFrom list_automations.
status, enabled, keywords, dm_message, button_title, button_url, public_replies, post_scope, stepsOnly the fields to change. public_replies replaces the current replies; remove_steps deletes steps.

get_automation_history What an automation did, newest first: comments answered or skipped, taps, follow checks, emails, links, clicks, follow-ups.

ArgumentMeaning
automation_idFrom list_automations.
limitDefault 50.

list_automation_emails Email addresses collected by an automation.

ArgumentMeaning
automation_idFrom list_automations.

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:

List tools with curl
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": {}}'