addrbookFor publishers
← The evidence ledger

Evidence row 1785966

Observed , by probe.mcp/1.

Kind
mcp.tools
About
endpoint 18fe3d95-026f-4cb0-b61d-32ede1e36e04
Recorded
Previous row
None: the first of its kind about this subject
Body SHA-256
97bbb85f4afa66c92831539b53c9b6ba35edee48fa2a8f05378f5b4461fd8e42
Leaf
0x781fa497a85e9df1080e0f299dafe70a61c9f74b2479f5389723ed793d7d4ba1

What was observed

{
  "count": 27,
  "tools": [
    {
      "description": "Save an already-uploaded object (from create_media_upload) to the media library and return a media id. Works for images and videos (mp4/mov/webm). Images can optionally be reformatted to a publishing format first: the server reads the upload back from storage, stores the reformatted image as a new file and deletes the raw upload at storageKey, which cannot be undone. Videos are always recorded as-is. Omit format (or use \"original\") to record it unchanged — recording as-is deletes nothing. Pass the SAME workspaceId you gave create_media_upload — a storage key belongs to the workspace it was minted in and is refused anywhere else.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "crop": {
            "description": "How a 'cover' crop chooses what to keep: 'smart' = saliency-based, keeps the subject (default); 'centre' = predictable middle crop, better for posters/screenshots",
            "enum": [
              "smart",
              "centre"
            ],
            "type": "string"
          },
          "fit": {
            "description": "cover = crop to fill (default), contain = fit + pad",
            "enum": [
              "cover",
              "contain"
            ],
            "type": "string"
          },
          "format": {
            "description": "Reformat to this before saving; omit to keep original",
            "enum": [
              "feed_square",
              "feed_portrait",
              "landscape",
              "story",
              "reel",
              "original"
            ],
            "type": "string"
          },
          "storageKey": {
            "description": "The storageKey returned by create_media_upload",
            "type": "string"
          },
          "workspaceId": {
            "description": "Which workspace to act in — an id from list_workspaces. Optional with a single workspace; REQUIRED once there are several, where guessing would mean posting one client's content to another client's accounts. Ask the user which one before publishing.",
            "type": "string"
          }
        },
        "required": [
          "storageKey"
        ],
        "type": "object"
      },
      "name": "attach_media"
    },
    {
      "description": "Take screenshots of a web page — the workspace's own site, usually — with a headless browser, as a desktop (1440×900 at 2×) and/or a mobile (390×844 at 3×) capture, and save them to the media library as images: shots for create_video, or pictures for a post. Each device costs 2 credits; when the month's credits cover fewer devices than asked, it captures what they cover and says so, and once they are spent it is refused with the balance — tell the user, do not retry. The server fetches whatever public https address is given, so point it only at pages the user named; private and internal addresses are refused. fullPage captures the whole page (as a JPEG) rather than the first screen (PNG). Waits up to `wait` seconds (default 40) for the capture; a page that takes longer is finished with get_video.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "devices": {
            "description": "Which captures to take (default both)",
            "items": {
              "enum": [
                "desktop",
                "mobile"
              ],
              "type": "string"
            },
            "maxItems": 2,
            "type": "array"
          },
          "fullPage": {
            "description": "The whole page rather than the first screen (default false)",
            "type": "boolean"
          },
          "url": {
            "description": "The page to capture, e.g. https://example.com/",
            "type": "string"
          },
          "wait": {
            "description": "Seconds to wait for the capture (default 40)",
            "maximum": 45,
            "minimum": 0,
            "type": "integer"
          },
          "workspaceId": {
            "description": "Which workspace to act in — an id from list_workspaces. Optional with a single workspace; REQUIRED once there are several, where guessing would mean posting one client's content to another client's accounts. Ask the user which one before publishing.",
            "type": "string"
          }
        },
        "required": [
          "url"
        ],
        "type": "object"
      },
      "name": "capture_screenshot"
    },
    {
      "description": "Release a publish the user has just confirmed on the post card. The card calls this when the person presses its Publish button; it is hidden from models and is not for one to call — `confirmation` is a code only the card is given, and any other value is refused. The code is tied to the request the card shows: an edit, a newer request, or a day without an answer makes it lapse, and the card then sends the person to Ravenpost. Released, the post publishes now — or at the time that was asked for, while that is still ahead — on every target account, where it is public. That cannot be undone from here: delete_post removes only Ravenpost's copy, and a post on Instagram, TikTok, Threads and YouTube cannot be taken down through Ravenpost at all.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "confirmation": {
            "description": "The code the card was given with the post — never one made up",
            "type": "string"
          },
          "postId": {
            "description": "The post the card shows",
            "type": "string"
          }
        },
        "required": [
          "postId",
          "confirmation"
        ],
        "type": "object"
      },
      "name": "confirm_publish"
    },
    {
      "description": "Get a presigned URL to upload a file straight to storage — no base64 through this channel, no third-party host. Best for large files and production. The URL grants write access to this workspace’s own private storage for 10 minutes; it replaces nothing, and the file joins the media library only when attach_media records it. Flow: (1) call this with the contentType; (2) HTTP PUT the raw file bytes to the returned uploadUrl (e.g. `curl -X PUT --data-binary @file -H \"Content-Type: <type>\" \"<uploadUrl>\"`); (3) call attach_media with the returned storageKey to save it to the media library.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "contentType": {
            "description": "MIME type of the file, e.g. image/jpeg, image/png, video/mp4",
            "type": "string"
          },
          "filename": {
            "description": "Original filename (for a nicer storage key)",
            "type": "string"
          },
          "workspaceId": {
            "description": "Which workspace to act in — an id from list_workspaces. Optional with a single workspace; REQUIRED once there are several, where guessing would mean posting one client's content to another client's accounts. Ask the user which one before publishing.",
            "type": "string"
          }
        },
        "required": [
          "contentType"
        ],
        "type": "object"
      },
      "name": "create_media_upload"
    },
    {
      "description": "Create a post and either publish it now, schedule it, queue it, or save it as a draft. action \"now\" — and a schedule less than 15 minutes ahead, which is a publish under another name — does NOT publish by itself: the post is saved as a draft that waits for the user, who confirms it with the Publish button on the post card or on Ravenpost (the result says where), and nothing goes out until they do. A schedule further ahead, and the posting queue, go out at their time with no further step. Once it goes out the post is public on the selected networks, and that cannot be undone from here: delete_post removes only Ravenpost's copy, and a post on Instagram, TikTok, Threads and YouTube cannot be taken down through Ravenpost at all. Only a draft stays private. Each call creates a new post, so never repeat a call that succeeded — one waiting for the user's confirmation included. With more than one workspace, ASK THE USER which one to post to and give workspaceId — the connected accounts differ per workspace and posting to the wrong one is not undoable. Accounts, media and queue slots must all come from that same workspace. action=\"queue\" schedules at the workspace's next free posting-queue slot (see list_queue_slots) — no scheduledAt needed; it errors if the workspace has no slots defined. Targets are account ids from list_accounts (cross-posting to several is allowed — but one X account per post: every X account publishes the same text, and X forbids the same post on several accounts). Caption limit is the tightest selected account — each account's captionMax in list_accounts. X's depends on the account: 280 characters, or 25,000 with X Premium, counted as X counts (every link is 23, each emoji or symbol such as → − • … is 2); a caption over it is rejected, naming the account. X refuses two more things a caption can hold, and so does this tool, before anything is written: more than one $cashtag in a post (each reply of a thread is a post of its own — write other tickers without the $), and, in a thread reply, an @mention of anybody the first post did not mention. For media, first upload with upload_media and pass the returned media ids. type is Instagram’s format model (IMAGE/CAROUSEL/REEL/STORY) reused as the shared vocabulary. Instagram honors all four, and Instagram video must be posted as REEL (or STORY) — an IMAGE/CAROUSEL post with a video will be rejected at publish time. Facebook honors STORY (published to Page Stories, which have NO caption — the text is dropped) and treats every other type as a normal feed post. TikTok, X, and Telegram ignore type entirely. See platform_limits.formats for which types each platform honors. thread: extra posts published as replies after the main one, forming a chain. Supported on X, Bluesky, Mastodon, Threads, Telegram and Discord; a platform without a thread model publishes just the caption. The caption is post 1 and carries the media. Limits come from the strictest selected platform (X is tightest at 280 chars per post, or 25,000 for an account on X Premium, and 25 follow-ups) and going over is rejected, not truncated. replyTo (X only): reply to an existing tweet — pass the tweet id or its URL (x.com/<user>/status/<id>) and the post is published as a reply under it instead of a standalone tweet (a thread then continues under that reply). X takes a reply from an app only when the post it answers is the account's own, or @mentions the account, or quotes one of its posts; a reply to anybody else's post fails at publish time. Non-X targets ignore it and publish a normal post, so for a pure reply target only the X account. quote (X only): quote-tweet an existing tweet — pass the tweet id or its URL and it is embedded as a card under this post. X takes it on the same terms as a reply: the account's own post, or one that @mentions it — quoting anybody else's post fails at publish time. Can be combined with replyTo. Non-X targets ignore it. Telegram renders a markdown subset in captions ([text](url) links, **bold**, *italic*, `code`, ~~strikethrough~~) as native formatting; every other platform publishes the caption as plain text, so markdown would show literally there — only use it when all targets are Telegram (see platform_limits.captionFormatting). Threads takes text-only posts, one image/video, or a carousel of up to 20 items, and ignores type. Its 500-character limit is the tightest after X, so a mixed X+Threads selection is still capped at 280 (unless the X account has X Premium). LinkedIn publishes the caption as plain text — its reserved characters are escaped for you, so write normal prose; markdown is not rendered and a bare link does NOT produce a preview card. LinkedIn ignores type, allows text-only posts, and takes either one video or up to 20 images. audio attaches a track from Instagram’s catalog to a reel (find one with list_audio). It applies only to type=\"REEL\" on Instagram accounts connected via Facebook — other platforms and other types ignore it, and the worker logs that it was dropped rather than failing. TikTok and Facebook have NO music API at all: for them the audio has to already be part of the video file. reelCover and trialReel are an Instagram reel’s own options: its cover (a library JPEG, or a frame of the video) and a trial — a reel shown to non-followers first. Both apply only to type=\"REEL\" on Instagram, on either connection; anywhere else they are dropped. tiktok carries TikTok’s required per-post choices, keyed by account id — most importantly privacyLevel, which TikTok makes mandatory. Leave it out and TikTok targets publish privately. Pinterest needs a board: set `board` (a board name or an id from list_boards) whenever a Pinterest account is targeted — a pin belongs to a board and there is no default, so without it the post is created but fails to publish. `link` is the pin’s destination URL, which is the point of a pin, and `title` is its headline (the caption becomes the description, max 800 chars).",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "accountIds": {
            "description": "Target social account ids (from list_accounts)",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "type": "array"
          },
          "action": {
            "description": "now = publish once the user confirms it (on the post card or on Ravenpost); schedule = at scheduledAt (less than 15 minutes ahead waits for their confirmation too); queue = the next free posting-queue slot; draft = save it, unpublished",
            "enum": [
              "now",
              "schedule",
              "queue",
              "draft"
            ],
            "type": "string"
          },
          "audio": {
            "additionalProperties": false,
            "description": "Instagram reel audio — a catalog track from list_audio. Requires type=\"REEL\" and an Instagram account connected via Facebook; ignored otherwise.",
            "properties": {
              "artist": {
                "description": "Artist name, for display only",
                "type": "string"
              },
              "audioId": {
                "description": "Track id from list_audio",
                "type": "string"
              },
              "audioVolume": {
                "description": "Volume of the attached track, 0-100 (default 80)",
                "maximum": 100,
                "minimum": 0,
                "type": "number"
              },
              "title": {
                "description": "Track title, for display only",
                "type": "string"
              },
              "videoVolume": {
                "description": "Volume of the video's own audio, 0-100 (default 50)",
                "maximum": 100,
                "minimum": 0,
                "type": "number"
              }
            },
            "required": [
              "audioId"
            ],
            "type": "object"
          },
          "board": {
            "description": "Pinterest only, and REQUIRED for a Pinterest target: the board this pin goes to — its name (matched case-insensitively) or its id from list_boards. Pinterest has no default board, so a Pinterest post without one fails at publish time. Other platforms ignore it.",
            "type": "string"
          },
          "caption": {
            "description": "The post caption / text body",
            "type": "string"
          },
          "collaborators": {
            "description": "Instagram only: co-author usernames (max 3). They get an invite, and once they accept the post appears on their profile too. Feed posts and reels only — never a STORY — and ONLY on an Instagram account whose connection is \"FACEBOOK_LOGIN\" (see list_accounts). On any other Instagram account they are dropped: the post still publishes, without them, and nothing reports it afterwards — so do not promise the user co-authors without checking. preview_post takes the same argument and warns when they would be dropped.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "community": {
            "description": "X only: post into a Community — its id or URL (x.com/i/communities/<id>). Empty string clears it.",
            "type": "string"
          },
          "hashtags": {
            "description": "Hashtags to append to the caption (with or without a leading #)",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "link": {
            "description": "The URL this post points at. Facebook publishes it as a link preview card (used when the post has no media); Pinterest makes it the pin's destination, which is the whole point of a pin. Every other platform ignores it. Empty string clears it.",
            "type": "string"
          },
          "mediaIds": {
            "description": "Ordered media asset ids (from upload_media)",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "quote": {
            "description": "X quote: tweet id or tweet URL to quote — embedded as a card under this post; combinable with replyTo. X only takes it when that post is the account's own or @mentions it (X targets only; other platforms ignore it)",
            "type": "string"
          },
          "reelCover": {
            "additionalProperties": false,
            "description": "Instagram reel cover — an image OR a frame of the video, not both. Only for type=\"REEL\" on an Instagram account, either connection; other types and platforms ignore it and it is dropped there. Leave it out for Instagram’s default, the first frame.",
            "properties": {
              "mediaId": {
                "description": "A JPEG from the media library — an id from list_media or upload_media (which writes JPEG) — 8 MB at most. 9:16 fits: Instagram shows its middle 9:16 in the Reels tab and its middle square on the profile grid.",
                "type": "string"
              },
              "offsetMs": {
                "description": "Or a frame of the reel itself: milliseconds from the start of the video (2500 = 2.5 s), before it ends.",
                "minimum": 0,
                "type": "integer"
              }
            },
            "type": "object"
          },
          "replySettings": {
            "description": "X only: who may reply to this post. Omit for X's default (everyone).",
            "enum": [
              "following",
              "mentionedUsers",
              "subscribers",
              "verified"
            ],
            "type": "string"
          },
          "replyTo": {
            "description": "X reply: tweet id or tweet URL to reply to — the post publishes as a reply under that tweet instead of a standalone tweet. X only takes it when that post is the account's own or @mentions it (X targets only; other platforms ignore it)",
            "type": "string"
          },
          "scheduledAt": {
            "description": "ISO 8601 datetime — required when action is \"schedule\"",
            "type": "string"
          },
          "thread": {
            "description": "Thread: follow-up posts replied in order after the caption (X, Bluesky, Mastodon, Threads, Telegram, Discord; limits come from the strictest selected platform — at most 25 entries, each ≤280 chars on X, or 25,000 on X Premium)",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "tiktok": {
            "additionalProperties": {
              "additionalProperties": false,
              "properties": {
                "allowComment": {
                  "description": "Allow comments (default false)",
                  "type": "boolean"
                },
                "allowDuet": {
                  "description": "Allow Duet — videos only (default false)",
                  "type": "boolean"
                },
                "allowStitch": {
                  "description": "Allow Stitch — videos only (default false)",
                  "type": "boolean"
                },
                "autoAddMusic": {
                  "description": "Let TikTok pick a soundtrack. Photo posts, DIRECT_POST only.",
                  "type": "boolean"
                },
                "brandContentToggle": {
                  "description": "\"Branded content\": a paid partnership. TikTok labels the post \"Paid partnership\" and refuses it with SELF_ONLY visibility.",
                  "type": "boolean"
                },
                "brandOrganicToggle": {
                  "description": "\"Your brand\": the post promotes the creator's own business",
                  "type": "boolean"
                },
                "postMode": {
                  "description": "DIRECT_POST (default) publishes to TikTok. UPLOAD sends the media to the creator's TikTok inbox to finish and publish in the app within 24 hours — the settings below do not apply then, the creator chooses them in the app.",
                  "enum": [
                    "DIRECT_POST",
                    "UPLOAD"
                  ],
                  "type": "string"
                },
                "privacyLevel": {
                  "description": "Who can see the post. Required for DIRECT_POST, ignored for UPLOAD. Must be one the creator actually offers — a private TikTok account has no PUBLIC_TO_EVERYONE, and anything unavailable falls back to SELF_ONLY at publish time.",
                  "enum": [
                    "PUBLIC_TO_EVERYONE",
                    "MUTUAL_FOLLOW_FRIENDS",
                    "FOLLOWER_OF_CREATOR",
                    "SELF_ONLY"
                  ],
                  "type": "string"
                },
                "title": {
                  "description": "Post title. Empty uses the caption (videos) or its first line (photos, capped at 90 chars). The only field TikTok keeps in UPLOAD mode.",
                  "type": "string"
                },
                "videoMadeWithAi": {
                  "description": "TikTok's AI-generated content disclosure. Videos, DIRECT_POST only.",
                  "type": "boolean"
                }
              },
              "type": "object"
            },
            "description": "TikTok posting options, keyed by TikTok account id. Omit and TikTok targets publish privately (SELF_ONLY) — TikTok requires the creator to choose a visibility per post, so nothing wider is assumed on their behalf.",
            "type": "object"
          },
          "timezone": {
            "description": "IANA timezone for the schedule",
            "type": "string"
          },
          "title": {
            "description": "Pinterest only: the pin title (max 100 chars), which Pinterest shows above the description. Defaults to the caption’s first line. Other platforms ignore it.",
            "type": "string"
          },
          "trialReel": {
            "description": "Instagram trial reel: shown to non-followers first, and to followers only once it graduates — MANUAL means the user graduates it by hand in the Instagram app, SS_PERFORMANCE that Instagram graduates it if it performs well. Only for type=\"REEL\" on an Instagram account; other types and platforms ignore it. Instagram decides which accounts may post one (public professional accounts it can recommend) and answers only when the reel is published: if it refuses, the post fails — it is never sent as a normal reel instead. Set it only when the user asks for a trial.",
            "enum": [
              "MANUAL",
              "SS_PERFORMANCE"
            ],
            "type": "string"
          },
          "type": {
            "description": "Instagram format; defaults to IMAGE",
            "enum": [
              "IMAGE",
              "CAROUSEL",
              "REEL",
              "STORY"
            ],
            "type": "string"
          },
          "workspaceId": {
            "description": "Which workspace to act in — an id from list_workspaces. Optional with a single workspace; REQUIRED once there are several, where guessing would mean posting one client's content to another client's accounts. Ask the user which one before publishing.",
            "type": "string"
          }
        },
        "required": [
          "caption",
          "accountIds",
          "action"
        ],
        "type": "object"
      },
      "name": "create_post"
    },
    {
      "description": "Reshape ONE image already in the media library into several platform canvases at once, and return the new asset ids: feed_portrait (1080×1350, 4:5), feed_square (1080×1080), landscape (1080×566, 1.91:1) and story (1080×1920, 9:16 — also what a reel or a TikTok photo wants). Cropping is saliency-based by default: sharp scores regions by saturation, luminance and skin tone and keeps the strongest, so an off-centre subject survives a 4:5 → 9:16 cut. Use crop=\"centre\" for images composed around their middle (posters, screenshots, flat graphics), where a predictable crop beats a guessed one. fit=\"contain\" pads instead of cropping — use it when nothing may be cut off at all. Images only; video is not re-encoded. The source image is left unchanged and every canvas is a new asset. Variants inherit the source’s alt text and folder, and asking for two formats with the same dimensions produces one file, not two. Typical use: upload once, call this with the formats the selected platforms want, then pass the right variant id per post.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "crop": {
            "description": "'smart' = saliency-based (default); 'centre' = predictable middle crop",
            "enum": [
              "smart",
              "centre"
            ],
            "type": "string"
          },
          "fit": {
            "description": "'cover' crops to fill (default); 'contain' pads to fit",
            "enum": [
              "cover",
              "contain"
            ],
            "type": "string"
          },
          "formats": {
            "description": "Canvases to produce",
            "items": {
              "enum": [
                "feed_portrait",
                "feed_square",
                "landscape",
                "story"
              ],
              "type": "string"
            },
            "minItems": 1,
            "type": "array"
          },
          "mediaId": {
            "description": "Source image asset id (from list_media or upload_media)",
            "type": "string"
          },
          "workspaceId": {
            "description": "Which workspace to act in — an id from list_workspaces. Optional with a single workspace; REQUIRED once there are several, where guessing would mean posting one client's content to another client's accounts. Ask the user which one before publishing.",
            "type": "string"
          }
        },
        "required": [
          "mediaId",
          "formats"
        ],
        "type": "object"
      },
      "name": "create_variants"
    },
    {
      "description": "Render a short branded video (9:16 vertical by default; also square and landscape) and save it to the media library as an mp4 — returning a media id create_post takes as mediaIds. Either a storyboard (template storyboard: the scenes given in `scenes`, in order, with an optional music bed) or one of the fixed, silent templates in list_video_templates. Pick the canvas by where it goes: vertical for Reels, TikTok, Shorts and Stories (every word is kept clear of the buttons and captions those apps draw over a video, and inside the feed's 4:5 crop), square for X, LinkedIn and other feeds, landscape only for YouTube or a website. Fewer, shorter lines read better: three features beat five. It lays out the user's own pictures, clips and words — no generative model draws anything. It costs 25 of the workspace's monthly credits, taken before rendering and handed back if the render fails; once the month's credits are spent it is refused with the balance — tell the user, do not retry. Render only what the user asked for: confirm the template, the headline and the pictures first when they have not said. Pictures come from the media library: upload_media for a file, capture_screenshot for the website, import_app_screenshots for the App Store or Google Play listing. A shot given by mediaId must be an image. The brand name, tagline and icon are filled in from the brand profile and the workspace unless overridden here; set accent to a #rrggbb colour to give the video the brand's colour. Rendering takes one to five minutes on a shared box, a 30-second storyboard the most. The call waits up to `wait` seconds (default 40) reporting progress, then returns the finished video — or the render's id and status when it needs longer, in which case call get_video with the id. The result names any field the template leaves out. Nothing is posted anywhere: the video sits in the private library until a post carrying it is published.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "accent": {
            "description": "Brand colour as #rrggbb",
            "pattern": "^#[0-9a-fA-F]{6}$",
            "type": "string"
          },
          "body": {
            "description": "A sentence of detail (announcement template)",
            "maxLength": 220,
            "type": "string"
          },
          "brandName": {
            "description": "Overrides the brand name the workspace knows",
            "maxLength": 40,
            "type": "string"
          },
          "brandTagline": {
            "description": "Overrides the tagline; \"\" for none",
            "maxLength": 80,
            "type": "string"
          },
          "canvas": {
            "description": "vertical (9:16, default), square (1:1) or landscape (16:9)",
            "enum": [
              "vertical",
              "square",
              "landscape"
            ],
            "type": "string"
          },
          "cta": {
            "additionalProperties": false,
            "description": "The closing call to action",
            "properties": {
              "detail": {
                "description": "A URL or handle shown under the label",
                "maxLength": 60,
                "type": "string"
              },
              "label": {
                "description": "\"Download on the App Store\", \"Try it free\"",
                "maxLength": 40,
                "minLength": 1,
                "type": "string"
              },
              "store": {
                "description": "Draws the store's mark beside the label",
                "enum": [
                  "app_store",
                  "google_play"
                ],
                "type": "string"
              }
            },
            "required": [
              "label"
            ],
            "type": "object"
          },
          "features": {
            "description": "Two to five features, for feature_list",
            "items": {
              "additionalProperties": false,
              "properties": {
                "detail": {
                  "maxLength": 90,
                  "type": "string"
                },
                "title": {
                  "maxLength": 40,
                  "minLength": 1,
                  "type": "string"
                }
              },
              "required": [
                "title"
              ],
              "type": "object"
            },
            "maxItems": 5,
            "type": "array"
          },
          "headline": {
            "description": "The big line the video opens with; for a storyboard, the name it is filed under (its hook scene opens it)",
            "maxLength": 70,
            "minLength": 1,
            "type": "string"
          },
          "iconMediaId": {
            "description": "An image in the media library to use as the brand mark (the app icon)",
            "type": "string"
          },
          "music": {
            "description": "A music bed under a storyboard: glow (warm and calm — a product walkthrough, a story); pulse (upbeat — a launch, a release, a big number); drift (mellow lo-fi — tips, how-tos, behind the scenes). Leave out for none; the templates are always silent.",
            "enum": [
              "glow",
              "pulse",
              "drift"
            ],
            "type": "string"
          },
          "scenes": {
            "description": "The storyboard template's scenes, in order: 2 to 10, at most 30 s in all, opening on a hook and ending on an end card (see list_video_templates). The other templates ignore them.",
            "items": {
              "anyOf": [
                {
                  "additionalProperties": false,
                  "properties": {
                    "accent": {
                      "description": "A second line in the brand gradient: the turn (\"Do it once.\")",
                      "maxLength": 48,
                      "type": "string"
                    },
                    "detail": {
                      "description": "A short line under it",
                      "maxLength": 140,
                      "type": "string"
                    },
                    "duration": {
                      "description": "Seconds it holds; leave out to time it from its content",
                      "maximum": 10,
                      "minimum": 1.2,
                      "type": "number"
                    },
                    "kicker": {
                      "description": "A small label above the scene, e.g. \"New in 2.0\" or \"Step 2\"",
                      "maxLength": 32,
                      "type": "string"
                    },
                    "text": {
                      "description": "The opening line — a question, a claim or a problem, a few words",
                      "maxLength": 64,
                      "minLength": 1,
                      "type": "string"
                    },
                    "type": {
                      "const": "hook",
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "text"
                  ],
                  "type": "object"
                },
                {
                  "additionalProperties": false,
                  "properties": {
                    "detail": {
                      "maxLength": 140,
                      "type": "string"
                    },
                    "duration": {
                      "description": "Seconds it holds; leave out to time it from its content",
                      "maximum": 10,
                      "minimum": 1.2,
                      "type": "number"
                    },
                    "kicker": {
                      "description": "A small label above the scene, e.g. \"New in 2.0\" or \"Step 2\"",
                      "maxLength": 32,
                      "type": "string"
                    },
                    "text": {
                      "description": "One sentence",
                      "maxLength": 110,
                      "minLength": 1,
                      "type": "string"
                    },
                    "type": {
                      "const": "statement",
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "text"
                  ],
                  "type": "object"
                },
                {
                  "additionalProperties": false,
                  "properties": {
                    "caption": {
                      "description": "What the screen shows, a few words",
                      "maxLength": 80,
                      "type": "string"
                    },
                    "duration": {
                      "description": "Seconds it holds; leave out to time it from its content",
                      "maximum": 10,
                      "minimum": 1.2,
                      "type": "number"
                    },
                    "kicker": {
                      "description": "A small label above the scene, e.g. \"New in 2.0\" or \"Step 2\"",
                      "maxLength": 32,
                      "type": "string"
                    },
                    "motion": {
                      "description": "rise (default), zoom (a slow push in) or scroll (a tall capture in a phone or browser frame scrolls by)",
                      "enum": [
                        "rise",
                        "zoom",
                        "scroll"
                      ],
                      "type": "string"
                    },
                    "picture": {
                      "additionalProperties": false,
                      "description": "The picture shown in a phone or browser frame",
                      "properties": {
                        "frame": {
                          "description": "auto (default), phone, browser or none",
                          "enum": [
                            "auto",
                            "phone",
                            "browser",
                            "none"
                          ],
                          "type": "string"
                        },
                        "mediaId": {
                          "description": "An image in the media library: a screenshot, a capture of the site, a store listing picture",
                          "type": "string"
                        }
                      },
                      "required": [
                        "mediaId"
                      ],
                      "type": "object"
                    },
                    "type": {
                      "const": "device",
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "picture"
                  ],
                  "type": "object"
                },
                {
                  "additionalProperties": false,
                  "properties": {
                    "caption": {
                      "description": "Words over the clip, kept inside the safe zone",
                      "maxLength": 80,
                      "type": "string"
                    },
                    "clip": {
                      "additionalProperties": false,
                      "properties": {
                        "mediaId": {
                          "description": "A video in the media library",
                          "type": "string"
                        }
                      },
                      "required": [
                        "mediaId"
                      ],
                      "type": "object"
                    },
                    "duration": {
                      "description": "Seconds it holds; leave out to time it from its content",
                      "maximum": 10,
                      "minimum": 1.2,
                      "type": "number"
                    },
                    "fit": {
                      "description": "cover fills the frame, contain shows the whole clip on a card; auto picks by shape",
                      "enum": [
                        "auto",
                        "cover",
                        "contain"
                      ],
                      "type": "string"
                    },
                    "kicker": {
                      "description": "A small label above the scene, e.g. \"New in 2.0\" or \"Step 2\"",
                      "maxLength": 32,
                      "type": "string"
                    },
                    "sound": {
                      "description": "Keep the clip's own sound (default off; the music plays instead)",
                      "type": "boolean"
                    },
                    "start": {
                      "description": "Seconds into the clip to start from (default 0)",
                      "maximum": 3600,
                      "minimum": 0,
                      "type": "number"
                    },
                    "type": {
                      "const": "clip",
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "clip"
                  ],
                  "type": "object"
                },
                {
                  "additionalProperties": false,
                  "properties": {
                    "duration": {
                      "description": "Seconds it holds; leave out to time it from its content",
                      "maximum": 10,
                      "minimum": 1.2,
                      "type": "number"
                    },
                    "items": {
                      "description": "Two to four short points, arriving one by one",
                      "items": {
                        "maxLength": 56,
                        "minLength": 1,
                        "type": "string"
                      },
                      "maxItems": 4,
                      "minItems": 2,
                      "type": "array"
                    },
                    "kicker": {
                      "description": "A small label above the scene, e.g. \"New in 2.0\" or \"Step 2\"",
                      "maxLength": 32,
                      "type": "string"
                    },
                    "title": {
                      "maxLength": 56,
                      "type": "string"
                    },
                    "type": {
                      "const": "list",
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "items"
                  ],
                  "type": "object"
                },
                {
                  "additionalProperties": false,
                  "properties": {
                    "detail": {
                      "maxLength": 140,
                      "type": "string"
                    },
                    "duration": {
                      "description": "Seconds it holds; leave out to time it from its content",
                      "maximum": 10,
                      "minimum": 1.2,
                      "type": "number"
                    },
                    "kicker": {
                      "description": "A small label above the scene, e.g. \"New in 2.0\" or \"Step 2\"",
                      "maxLength": 32,
                      "type": "string"
                    },
                    "label": {
                      "maxLength": 48,
                      "minLength": 1,
                      "type": "string"
                    },
                    "prefix": {
                      "maxLength": 4,
                      "type": "string"
                    },
                    "suffix": {
                      "description": "\"+\" for \"10,000+\", \"%\" for a share",
                      "maxLength": 8,
                      "type": "string"
                    },
                    "type": {
                      "const": "stat",
                      "type": "string"
                    },
                    "value": {
                      "description": "The number it counts up to — only one the brand profile or the user gave",
                      "maximum": 1000000000000,
                      "minimum": 0,
                      "type": "number"
                    }
                  },
                  "required": [
                    "type",
                    "value",
                    "label"
                  ],
                  "type": "object"
                },
                {
                  "additionalProperties": false,
                  "properties": {
                    "duration": {
                      "description": "Seconds it holds; leave out to time it from its content",
                      "maximum": 10,
                      "minimum": 1.2,
                      "type": "number"
                    },
                    "kicker": {
                      "description": "A small label above the scene, e.g. \"New in 2.0\" or \"Step 2\"",
                      "maxLength": 32,
                      "type": "string"
                    },
                    "messages": {
                      "description": "A short exchange: what someone asks, and the app's answer (the app's bubbles carry the brand's icon)",
                      "items": {
                        "additionalProperties": false,
                        "properties": {
                          "from": {
                            "enum": [
                              "user",
                              "app"
                            ],
                            "type": "string"
                          },
                          "text": {
                            "maxLength": 160,
                            "minLength": 1,
                            "type": "string"
                          }
                        },
                        "required": [
                          "from",
                          "text"
                        ],
                        "type": "object"
                      },
                      "maxItems": 4,
                      "minItems": 1,
                      "type": "array"
                    },
                    "title": {
                      "maxLength": 56,
                      "type": "string"
                    },
                    "type": {
                      "const": "chat",
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "messages"
                  ],
                  "type": "object"
                },
                {
                  "additionalProperties": false,
                  "properties": {
                    "after": {
                      "additionalProperties": false,
                      "description": "With the product",
                      "properties": {
                        "label": {
                          "maxLength": 24,
                          "type": "string"
                        },
                        "text": {
                          "maxLength": 80,
                          "minLength": 1,
                          "type": "string"
                        }
                      },
                      "required": [
                        "text"
                      ],
                      "type": "object"
                    },
                    "before": {
                      "additionalProperties": false,
                      "description": "The old way",
                      "properties": {
                        "label": {
                          "maxLength": 24,
                          "type": "string"
                        },
                        "text": {
                          "maxLength": 80,
                          "minLength": 1,
                          "type": "string"
                        }
                      },
                      "required": [
                        "text"
                      ],
                      "type": "object"
                    },
                    "duration": {
                      "description": "Seconds it holds; leave out to time it from its content",
                      "maximum": 10,
                      "minimum": 1.2,
                      "type": "number"
                    },
                    "kicker": {
                      "description": "A small label above the scene, e.g. \"New in 2.0\" or \"Step 2\"",
                      "maxLength": 32,
                      "type": "string"
                    },
                    "type": {
                      "const": "compare",
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "before",
                    "after"
                  ],
                  "type": "object"
                },
                {
                  "additionalProperties": false,
                  "properties": {
                    "duration": {
                      "description": "Seconds it holds; leave out to time it from its content",
                      "maximum": 10,
                      "minimum": 1.2,
                      "type": "number"
                    },
                    "text": {
                      "description": "The closing line (default: the brand's tagline); the button under it is create_video's own cta",
                      "maxLength": 64,
                      "type": "string"
                    },
                    "type": {
                      "const": "end",
                      "type": "string"
                    }
                  },
                  "required": [
                    "type"
                  ],
                  "type": "object"
                }
              ]
            },
            "maxItems": 10,
            "type": "array"
          },
          "shots": {
            "description": "The pictures, in order (app_showcase needs at least one; announcement and feature_list take the first)",
            "items": {
              "additionalProperties": false,
              "properties": {
                "caption": {
                  "description": "Shown with this picture",
                  "maxLength": 60,
                  "type": "string"
                },
                "frame": {
                  "description": "auto (default: by the picture's shape — a store listing's screenshot, a finished panel, is drawn as itself), phone, browser or none",
                  "enum": [
                    "auto",
                    "phone",
                    "browser",
                    "none"
                  ],
                  "type": "string"
                },
                "mediaId": {
                  "description": "An image in the media library",
                  "type": "string"
                }
              },
              "required": [
                "mediaId"
              ],
              "type": "object"
            },
            "maxItems": 6,
            "type": "array"
          },
          "stat": {
            "additionalProperties": false,
            "description": "The number the milestone template counts up to",
            "properties": {
              "label": {
                "description": "\"users\", \"downloads\", \"plants kept alive\"",
                "maxLength": 40,
                "minLength": 1,
                "type": "string"
              },
              "prefix": {
                "maxLength": 4,
                "type": "string"
              },
              "suffix": {
                "description": "\"+\" for \"10,000+\"",
                "maxLength": 8,
                "type": "string"
              },
              "value": {
                "maximum": 1000000000000,
                "minimum": 0,
                "type": "number"
              }
            },
            "required": [
              "value",
              "label"
            ],
            "type": "object"
          },
          "subheadline": {
            "description": "The line under the headline",
            "maxLength": 110,
            "type": "string"
          },
          "template": {
            "description": "storyboard (your own scenes — the one for a reel or a TikTok), or a fixed template: app_showcase, feature_list, announcement or milestone (see list_video_templates)",
            "enum": [
              "app_showcase",
              "feature_list",
              "announcement",
              "milestone",
              "storyboard"
            ],
            "type": "string"
          },
          "theme": {
            "description": "dark (default) or light background",
            "enum": [
              "dark",
              "light"
            ],
            "type": "string"
          },
          "title": {
            "description": "A name for the video in the library; defaults to the headline",
            "maxLength": 120,
            "type": "string"
          },
          "wait": {
            "description": "Seconds to wait for the render before answering (default 40)",
            "maximum": 45,
            "minimum": 0,
            "type": "integer"
          },
          "workspaceId": {
            "description": "Which workspace to act in — an id from list_workspaces. Optional with a single workspace; REQUIRED once there are several, where guessing would mean posting one client's content to another client's accounts. Ask the user which one before publishing.",
            "type": "string"
          }
        },
        "required": [
          "template",
          "headline"
        ],
        "type": "object"
      },
      "name": "create_video"
    },
    {
      "description": "Permanently delete Ravenpost’s copy of a post and cancel any scheduled publish — the post cannot be restored. Use this to remove drafts or duplicate/obsolete scheduled posts. It never takes a post down from a network: a post already published stays live on the platform. The dashboard offers a separate \"delete everywhere\" on the networks Ravenpost can delete from (a post on Instagram, TikTok, Threads and YouTube cannot be taken down through Ravenpost at all); this tool does not.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "postId": {
            "description": "The post id to delete",
            "type": "string"
          }
        },
        "required": [
          "postId"
        ],
        "type": "object"
      },
      "name": "delete_post"
    },
    {
      "description": "Get one workspace's analytics overview: follower counts per connected account (plus a daily follower series for the last 30 days) and engagement on recent posts. A post's `source` says where it came from: \"ravenpost\" for one published from here, \"platform\" for one already on the account and imported so its engagement counts too. An account's `followers` is null when we collect none for its platform — today TikTok, X, Telegram, LinkedIn, Threads and YouTube, whose APIs either expose no insights or need a permission that is not approved yet (or, for X, charge for every read, so we read none and its numbers are in its own app) — so null means \"unknown\", never zero. Likewise a post metric that is absent was not collected rather than being 0.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "workspaceId": {
            "description": "Which workspace to act in — an id from list_workspaces. Optional with a single workspace; REQUIRED once there are several, where guessing would mean posting one client's content to another client's accounts. Ask the user which one before publishing.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "get_analytics"
    },
    {
      "description": "Get one post by id, including its media, per-account targets and publish status — and, when a publish asked for through an assistant is waiting for the user to confirm it, what it would do and where they can confirm it (publishRequest). Clients that render MCP Apps also show it as it looks on each destination platform, with the Publish button for a waiting publish.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "postId": {
            "description": "The post id",
            "type": "string"
          }
        },
        "required": [
          "postId"
        ],
        "type": "object"
      },
      "name": "get_post"
    },
    {
      "description": "Check a render create_video or capture_screenshot started: its status (queued, rendering, ready, failed), progress and, once ready, the media ids and URLs. Reads one row; nothing is changed. Set `wait` (seconds, up to 45) to hold the call until it settles or the time is up — one call like that beats polling every second.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "renderId": {
            "description": "The id create_video or capture_screenshot returned",
            "type": "string"
          },
          "wait": {
            "description": "Seconds to wait for it to finish (default 0: answer at once)",
            "maximum": 45,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "renderId"
        ],
        "type": "object"
      },
      "name": "get_video"
    },
    {
      "description": "List the supported image formats and their target dimensions (for choosing a format in upload_media).",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {},
        "type": "object"
      },
      "name": "image_formats"
    },
    {
      "description": "Copy an app's store listing pictures — its phone screenshots and its icon — from the App Store or Google Play into the media library, returning media ids: the screenshots become shots for create_video (app_showcase especially) and the icon its brand mark (iconMediaId). Reads the listing the workspace's brand profile holds when no url is given. Costs no credits; a picture already imported is reused rather than copied again. Apple's listing is read through its lookup API; Google Play's from its page, best effort.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "limit": {
            "description": "How many screenshots at most (default 6)",
            "maximum": 10,
            "minimum": 1,
            "type": "integer"
          },
          "store": {
            "description": "Which of the profile's listings to read (default: the App Store one when both are saved)",
            "enum": [
              "app_store",
              "google_play"
            ],
            "type": "string"
          },
          "url": {
            "description": "The App Store or Google Play link; omit to use the brand profile's",
            "type": "string"
          },
          "workspaceId": {
            "description": "Which workspace to act in — an id from list_workspaces. Optional with a single workspace; REQUIRED once there are several, where guessing would mean posting one client's content to another client's accounts. Ask the user which one before publishing.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "import_app_screenshots"
    },
    {
      "description": "List the social accounts connected to one workspace (Instagram, TikTok, X, Telegram, LinkedIn, Threads, Bluesky, YouTube and Pinterest; an account connected before its network was withdrawn still lists under its own platform). Returns each account id, platform, username, status, connection and captionMax — that account's own caption budget, which create_post holds its caption to. For X it depends on the account: `xPremium` true means X Premium and 25,000 characters, false means 280; X counts every link as 23 and each emoji or symbol such as → − • … as 2. Use an account id as a target when creating a post. Accounts belong to a single workspace, so with several workspaces give workspaceId (see list_workspaces) — an account id from one workspace is rejected by a post created in another. `connection` is only meaningful for Instagram: \"FACEBOOK_LOGIN\" accounts were connected through a Facebook Page and are the only ones that can browse and attach reel audio (list_audio) or invite collaborators; \"INSTAGRAM_LOGIN\" accounts — the way Instagram connects today — publish normally but can do neither.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "workspaceId": {
            "description": "Which workspace to act in — an id from list_workspaces. Optional with a single workspace; REQUIRED once there are several, where guessing would mean posting one client's content to another client's accounts. Ask the user which one before publishing.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_accounts"
    },
    {
      "description": "Search Instagram’s audio catalog for tracks that can be attached to a reel, then pass the chosen track’s id as create_post/update_post `audio.audioId`. Call it WITHOUT a query to get what is currently trending — that is the featured list. accountId must be an Instagram account connected through a Facebook Page (\"FACEBOOK_LOGIN\" in list_accounts); a directly-connected one cannot reach the catalog and gets an error saying so. Instagram connects directly today, so only an account connected through Facebook earlier can use this. Meta only exposes tracks licensed for third-party use, so this catalog is narrower than the one in the Instagram app — a track the user can pick on their phone may legitimately be missing here. The catalog is Meta’s, shared by every Instagram account — licensed tracks plus original sounds from other creators’ reels — not the user’s own data; searching it only reads and attaches nothing. This is Instagram-only. TikTok and Facebook expose no music API, so there is nothing to list for them.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "accountId": {
            "description": "Instagram account id (from list_accounts) to search on behalf of",
            "type": "string"
          },
          "kind": {
            "description": "'music' = licensed catalog track (default); 'original_sound' = audio lifted from another creator's reel",
            "enum": [
              "music",
              "original_sound"
            ],
            "type": "string"
          },
          "limit": {
            "description": "Max tracks to return (default 25)",
            "maximum": 50,
            "minimum": 1,
            "type": "number"
          },
          "query": {
            "description": "Search text (song or artist). Omit to get trending tracks.",
            "type": "string"
          }
        },
        "required": [
          "accountId"
        ],
        "type": "object"
      },
      "name": "list_audio"
    },
    {
      "description": "List the boards on one of the user's own connected Pinterest accounts, read live from Pinterest's API with that account's token. It reads that one account only: nothing on Pinterest is created, changed or published, and nothing becomes visible to anyone. Every pin belongs to a board and Pinterest has no default, so a post targeting Pinterest must name one — pass the board name or id as `board` on create_post/update_post. accountId is a Pinterest account id from list_accounts; other platforms have no boards and are rejected.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "accountId": {
            "description": "A Pinterest account id from list_accounts",
            "type": "string"
          }
        },
        "required": [
          "accountId"
        ],
        "type": "object"
      },
      "name": "list_boards"
    },
    {
      "description": "List recent media assets in one workspace (id, url, type, dimensions) — reuse an existing asset id in create_post instead of re-uploading. The library is per workspace, like the accounts.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "workspaceId": {
            "description": "Which workspace to act in — an id from list_workspaces. Optional with a single workspace; REQUIRED once there are several, where guessing would mean posting one client's content to another client's accounts. Ask the user which one before publishing.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_media"
    },
    {
      "description": "List the posts in one workspace, 50 at a time: newest first, or soonest first when filtered to SCHEDULED. Optionally filtered by status (DRAFT, SCHEDULED, PUBLISHING, PUBLISHED, FAILED). `total` says how many posts match and `totalPages` how many pages there are; set `page` to read further back.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "page": {
            "description": "Page to read, from 1 (the default); 50 posts a page",
            "minimum": 1,
            "type": "integer"
          },
          "status": {
            "description": "Filter by post status",
            "enum": [
              "DRAFT",
              "SCHEDULED",
              "PUBLISHING",
              "PUBLISHED",
              "FAILED"
            ],
            "type": "string"
          },
          "workspaceId": {
            "description": "Which workspace to act in — an id from list_workspaces. Optional with a single workspace; REQUIRED once there are several, where guessing would mean posting one client's content to another client's accounts. Ask the user which one before publishing.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_posts"
    },
    {
      "description": "List the workspace posting schedule: the recurring weekly queue slots (weekday + local time) that action=\"queue\" publishes into, plus `nextFreeSlot` — the next slot no post is booked into, which is where action=\"queue\" would put a post now (null when there are no slots, or none is free in the weeks ahead). Slots are defined in dashboard Settings and are workspace-wide (shared by every connected account), so each workspace has its own schedule. weekday 0 = Sunday … 6 = Saturday, in the workspace timezone.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "workspaceId": {
            "description": "Which workspace to act in — an id from list_workspaces. Optional with a single workspace; REQUIRED once there are several, where guessing would mean posting one client's content to another client's accounts. Ask the user which one before publishing.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_queue_slots"
    },
    {
      "description": "List the video templates create_video can render, with what each one is for, the fields it reads and the ones it cannot do without, plus the canvases (9:16, 1:1, 16:9) and what a video and a screenshot cost in credits. Reads a fixed catalogue; nothing is created. Call it once before the first create_video of a conversation, then choose the template whose `when` matches what the user asked for. Every template takes the same flat fields — headline, subheadline, body, shots, features, cta, stat — and ignores the ones it does not use; the brand (name, tagline, icon, accent colour) is filled in from the workspace unless overridden.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {},
        "type": "object"
      },
      "name": "list_video_templates"
    },
    {
      "description": "List every workspace this account can act in, with its id and the caller's role. Call this FIRST when more than one may exist: every other tool takes an optional workspaceId, and once there are several it becomes required — the connected social accounts, media library, posting queue and analytics are all per workspace. When there is more than one, ASK THE USER which workspace to post to rather than choosing for them.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {},
        "type": "object"
      },
      "name": "list_workspaces"
    },
    {
      "description": "Return per-platform caption limits, media rules, thread limits, and recommended media specs (dimensions, container formats, size/duration caps). Consult this BEFORE generating or picking media for a post so images/videos match what the platform renders best (e.g. X images at 1600×900 16:9, X video as MP4 H.264 up to 20 minutes). threadMax is the max follow-up posts a thread can carry after the caption; null means the platform has no thread model. captionFormatting describes the rich-text markup the platform renders in captions (e.g. Telegram accepts a markdown subset); null means captions publish as plain text. formats lists the post.type values the platform honors; null means it ignores type and just consumes the media set. supportsAudio means a track from the platform’s own catalog can be attached through the API (see list_audio) — only Instagram reels can. For every other platform the audio must already be baked into the video file. postingRules lists what the platform refuses beyond length and media (X: one $cashtag per post, replies and quotes only where the target post names the account, thread replies that @mention only people already in the conversation, one X account per post); empty means nothing beyond the numbers.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {},
        "type": "object"
      },
      "name": "platform_limits"
    },
    {
      "description": "Render a post as each destination platform will show it — WITHOUT creating anything. Nothing is written, scheduled or published; call create_post afterwards with the same arguments to actually post it. Takes the same arguments as create_post (caption, hashtags, accountIds, mediaIds, type, thread, replyTo, quote, audio, collaborators, reelCover, trialReel), and returns the same preview a client with MCP Apps renders as an interactive card, one tab per platform. Use this before create_post whenever the user is composing rather than dictating: it is the cheapest way to show them what goes out, and it reports what would be rejected or silently dropped — a caption over the tightest platform's budget, a platform that requires media when there is none, a thread longer than the strictest limit, audio on a platform with no music API, Instagram collaborators on an account that cannot invite them, a reel cover or trial on a post that is not a reel (or a cover create_post would refuse), media Bluesky leaves behind (it takes up to four images or one video), and X's own rules — more than one $cashtag in a post, a thread reply @mentioning somebody new to the conversation, the same post on two X accounts, a reply or quote X only takes from an account the target post names, media X leaves behind. The character counts it returns are per platform and authoritative: they are the same ones create_post enforces. For Pinterest, include board (and link/title) too — the preview warns when a Pinterest target has no board, which is the way a Pinterest post most often fails. The board name is taken as given: create_post checks it against the account's boards (see list_boards) and refuses an unknown one before writing anything. A preview reads only this workspace's own accounts and media and calls no social network, so nothing outside Ravenpost is touched or shown to anyone.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "accountIds": {
            "description": "Target social account ids (from list_accounts)",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "type": "array"
          },
          "audio": {
            "additionalProperties": false,
            "description": "Instagram reel track, for the preview caption line",
            "properties": {
              "artist": {
                "type": "string"
              },
              "title": {
                "type": "string"
              }
            },
            "type": "object"
          },
          "board": {
            "description": "Pinterest board name or id — pass it so the preview does not warn about a board you already picked",
            "type": "string"
          },
          "caption": {
            "description": "The post caption / text body",
            "type": "string"
          },
          "collaborators": {
            "description": "Instagram co-author usernames, as you would pass them to create_post. Nothing in the card draws them — pass them so the preview can warn when the targeted Instagram accounts cannot invite them and they would be dropped.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "hashtags": {
            "description": "Hashtags to append to the caption (with or without a leading #)",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "link": {
            "description": "Facebook link card / Pinterest pin destination URL",
            "type": "string"
          },
          "mediaIds": {
            "description": "Ordered media asset ids (from upload_media / list_media)",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "quote": {
            "description": "X quote: tweet id or URL to embed as a card — X only takes it when that post is the account's own or @mentions it",
            "type": "string"
          },
          "reelCover": {
            "additionalProperties": false,
            "description": "Instagram reel cover, as you would pass it to create_post — checked against the media library the way create_post checks it, and drawn on the card.",
            "properties": {
              "mediaId": {
                "description": "A JPEG from the media library — an id from list_media or upload_media (which writes JPEG) — 8 MB at most. 9:16 fits: Instagram shows its middle 9:16 in the Reels tab and its middle square on the profile grid.",
                "type": "string"
              },
              "offsetMs": {
                "description": "Or a frame of the reel itself: milliseconds from the start of the video (2500 = 2.5 s), before it ends.",
                "minimum": 0,
                "type": "integer"
              }
            },
            "type": "object"
          },
          "replyTo": {
            "description": "X reply: tweet id or URL the head post replies to — X only takes it when that post is the account's own or @mentions it",
            "type": "string"
          },
          "thread": {
            "description": "Follow-up posts, previewed as the reply chain they publish as",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "title": {
            "description": "Pinterest pin title",
            "type": "string"
          },
          "trialReel": {
            "description": "Instagram trial reel graduation, as you would pass it to create_post.",
            "enum": [
              "MANUAL",
              "SS_PERFORMANCE"
            ],
            "type": "string"
          },
          "type": {
            "description": "Instagram format; defaults to IMAGE",
            "enum": [
              "IMAGE",
              "CAROUSEL",
              "REEL",
              "STORY"
            ],
            "type": "string"
          },
          "workspaceId": {
            "description": "Which workspace to act in — an id from list_workspaces. Optional with a single workspace; REQUIRED once there are several, where guessing would mean posting one client's content to another client's accounts. Ask the user which one before publishing.",
            "type": "string"
          }
        },
        "required": [
          "caption",
          "accountIds"
        ],
        "type": "object"
      },
      "name": "preview_post"
    },
    {
      "description": "Publish an existing post (e.g. a draft) once the user confirms it, without editing its content. It does NOT publish by itself: the post waits for the user, who confirms it with the Publish button on the post card or on Ravenpost (the result says where); until then nothing goes out and the post stays exactly as it was — a draft stays a draft, a post on the calendar keeps its time. Call it only on the user's explicit instruction, and once: a second call only asks them again. A post that has already been published, or is publishing right now, is refused rather than sent twice. Once confirmed it goes public on every target account at once, and that cannot be undone from here: delete_post removes only Ravenpost's copy, and a post on Instagram, TikTok, Threads and YouTube cannot be taken down through Ravenpost at all.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "postId": {
            "description": "The post id to publish now",
            "type": "string"
          }
        },
        "required": [
          "postId"
        ],
        "type": "object"
      },
      "name": "publish_post"
    },
    {
      "description": "Schedule (or reschedule) an existing post for a future time, without editing its content. Give scheduledAt as an absolute ISO 8601 datetime (include the offset, e.g. 2026-07-05T09:00:00+03:00). Rescheduling replaces the previous time, which is not kept. At that time the post is published to its target accounts, where it is public — tell the user the accounts and the time. A time less than 15 minutes ahead is a publish under another name, so it waits for the user to confirm it — with the Publish button on the post card or on Ravenpost — and the post stays as it was until they do. A time in the past is refused rather than published immediately; use publish_post for that, and only on an explicit instruction.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "postId": {
            "description": "The post id",
            "type": "string"
          },
          "scheduledAt": {
            "description": "ISO 8601 datetime to publish at (include timezone offset)",
            "type": "string"
          }
        },
        "required": [
          "postId",
          "scheduledAt"
        ],
        "type": "object"
      },
      "name": "schedule_post"
    },
    {
      "description": "Edit an existing post (draft or scheduled) — caption, hashtags, format, media or target accounts. A published/publishing post can no longer be edited. IMPORTANT: editing resets the post to a DRAFT. To keep it going out, also send action=\"schedule\" + scheduledAt (or action=\"now\" to publish it). Omit action to leave it as a draft (i.e. to unschedule). action \"now\", and a schedule less than 15 minutes ahead, do NOT publish by themselves: the edit is saved and the post waits as a draft for the user to confirm it, with the Publish button on the post card or on Ravenpost (the result says where). A schedule further ahead, and the queue, go out at their time with no further step. The edit overwrites the stored post — no earlier version is kept — and any publish that was waiting for the user lapses with it. Once the post goes out it is public on its networks. The schedule is the only thing an edit drops on its own: anything else you leave out stays exactly as it was, so to REMOVE something pass its empty form (\"\", [], null or {} — each argument says which) rather than leaving it out. tiktok and board belong to specific accounts, so when accountIds adds a TikTok or Pinterest account, pass them again for it — a new TikTok target without options publishes privately, and a new Pinterest target without a board fails to publish. caption replaces the whole caption; use hashtags to append them. Telegram targets render a markdown subset in the caption ([text](url), **bold**, *italic*, `code`, ~~strikethrough~~); other platforms publish it as plain text. replySettings (who may reply) and community (the Community it posts into) are X only, like replyTo and quote; use \"\" to either to go back to X’s default — everyone may reply, and the post goes to the timeline. audio replaces the Instagram reel track (see list_audio); use null to remove it. reelCover replaces the Instagram reel cover; use null to go back to the first frame. trialReel changes how a trial reel graduates; use \"\" to make it a normal reel. collaborators replaces the Instagram co-authors; use [] to remove them. They reach only an Instagram account whose connection is \"FACEBOOK_LOGIN\" (see list_accounts) and never a STORY — anywhere else they are dropped and the post publishes without them. tiktok replaces TikTok’s per-account posting options (privacyLevel, allow*, brand toggles); use {} to clear them, which makes TikTok targets publish privately again. board moves a Pinterest pin to another board (name or id from list_boards); title replaces the pin title. link replaces the URL the post points at — Facebook’s link preview card, Pinterest’s pin destination; use \"\" to remove it.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "accountIds": {
            "description": "Replace the target accounts",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "action": {
            "description": "now = publish once the user confirms it (on the post card or on Ravenpost), schedule = re-schedule (needs scheduledAt; less than 15 minutes ahead waits for their confirmation too), queue = next free posting-queue slot, draft = keep as draft",
            "enum": [
              "now",
              "schedule",
              "queue",
              "draft"
            ],
            "type": "string"
          },
          "audio": {
            "anyOf": [
              {
                "additionalProperties": false,
                "properties": {
                  "artist": {
                    "description": "Artist name, for display only",
                    "type": "string"
                  },
                  "audioId": {
                    "description": "Track id from list_audio",
                    "type": "string"
                  },
                  "audioVolume": {
                    "description": "Volume of the attached track, 0-100 (default 80)",
                    "maximum": 100,
                    "minimum": 0,
                    "type": "number"
                  },
                  "title": {
                    "description": "Track title, for display only",
                    "type": "string"
                  },
                  "videoVolume": {
                    "description": "Volume of the video's own audio, 0-100 (default 50)",
                    "maximum": 100,
                    "minimum": 0,
                    "type": "number"
                  }
                },
                "required": [
                  "audioId"
                ],
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "description": "Instagram reel audio — a catalog track from list_audio. Requires type=\"REEL\" and an Instagram account connected via Facebook; ignored otherwise. Use null to remove the track."
          },
          "board": {
            "description": "Pinterest only: move the pin to another board — its name (matched case-insensitively) or an id from list_boards. Applied to every Pinterest target on the post.",
            "type": "string"
          },
          "caption": {
            "description": "New caption (replaces the existing one)",
            "type": "string"
          },
          "collaborators": {
            "description": "Instagram only: replace the co-author usernames (max 3); use [] to remove them. They get an invite, and once they accept the post appears on their profile too. Feed posts and reels only — never a STORY — and ONLY on an Instagram account whose connection is \"FACEBOOK_LOGIN\" (see list_accounts). On any other Instagram account they are dropped: the post still publishes, without them, and nothing reports it afterwards — so check the connection before promising the user co-authors.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "community": {
            "description": "X only: replace the Community this posts into — its id or URL (x.com/i/communities/<id>). Use \"\" to post to the timeline again.",
            "type": "string"
          },
          "hashtags": {
            "description": "Hashtags to append to the caption",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "link": {
            "description": "Replace the URL this post points at. Facebook publishes it as a link preview card (used when the post has no media); Pinterest makes it the pin's destination, which is the whole point of a pin. Every other platform ignores it. Use \"\" to remove it.",
            "type": "string"
          },
          "mediaIds": {
            "description": "Replace the media set (ordered asset ids)",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "postId": {
            "description": "The post id (from list_posts / create_post)",
            "type": "string"
          },
          "quote": {
            "description": "Replace the X quoted tweet (tweet id or tweet URL; use \"\" to remove the quote). X only takes a quote of the account's own post or one that @mentions it",
            "type": "string"
          },
          "reelCover": {
            "anyOf": [
              {
                "additionalProperties": false,
                "properties": {
                  "mediaId": {
                    "description": "A JPEG from the media library — an id from list_media or upload_media (which writes JPEG) — 8 MB at most. 9:16 fits: Instagram shows its middle 9:16 in the Reels tab and its middle square on the profile grid.",
                    "type": "string"
                  },
                  "offsetMs": {
                    "description": "Or a frame of the reel itself: milliseconds from the start of the video (2500 = 2.5 s), before it ends.",
                    "minimum": 0,
                    "type": "integer"
                  }
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "description": "Instagram reel cover — an image OR a frame of the video, not both. Only for type=\"REEL\" on an Instagram account, either connection; other types and platforms ignore it and it is dropped there. Leave it out for Instagram’s default, the first frame. Use null to go back to the first frame."
          },
          "replySettings": {
            "description": "X only: replace who may reply to this post. Use \"\" to go back to X's default (everyone).",
            "enum": [
              "following",
              "mentionedUsers",
              "subscribers",
              "verified",
              ""
            ],
            "type": "string"
          },
          "replyTo": {
            "description": "Replace the X reply target (tweet id or tweet URL; use \"\" to make it a standalone tweet again). X only takes a reply to the account's own post or one that @mentions it",
            "type": "string"
          },
          "scheduledAt": {
            "description": "ISO 8601 datetime — required when action is \"schedule\"",
            "type": "string"
          },
          "thread": {
            "description": "Replace the thread (follow-up posts; limits come from the strictest selected platform — at most 25 entries, each ≤280 chars on X, or 25,000 on X Premium. Use [] to remove the thread)",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "tiktok": {
            "additionalProperties": {
              "additionalProperties": false,
              "properties": {
                "allowComment": {
                  "description": "Allow comments (default false)",
                  "type": "boolean"
                },
                "allowDuet": {
                  "description": "Allow Duet — videos only (default false)",
                  "type": "boolean"
                },
                "allowStitch": {
                  "description": "Allow Stitch — videos only (default false)",
                  "type": "boolean"
                },
                "autoAddMusic": {
                  "description": "Let TikTok pick a soundtrack. Photo posts, DIRECT_POST only.",
                  "type": "boolean"
                },
                "brandContentToggle": {
                  "description": "\"Branded content\": a paid partnership. TikTok labels the post \"Paid partnership\" and refuses it with SELF_ONLY visibility.",
                  "type": "boolean"
                },
                "brandOrganicToggle": {
                  "description": "\"Your brand\": the post promotes the creator's own business",
                  "type": "boolean"
                },
                "postMode": {
                  "description": "DIRECT_POST (default) publishes to TikTok. UPLOAD sends the media to the creator's TikTok inbox to finish and publish in the app within 24 hours — the settings below do not apply then, the creator chooses them in the app.",
                  "enum": [
                    "DIRECT_POST",
                    "UPLOAD"
                  ],
                  "type": "string"
                },
                "privacyLevel": {
                  "description": "Who can see the post. Required for DIRECT_POST, ignored for UPLOAD. Must be one the creator actually offers — a private TikTok account has no PUBLIC_TO_EVERYONE, and anything unavailable falls back to SELF_ONLY at publish time.",
                  "enum": [
                    "PUBLIC_TO_EVERYONE",
                    "MUTUAL_FOLLOW_FRIENDS",
                    "FOLLOWER_OF_CREATOR",
                    "SELF_ONLY"
                  ],
                  "type": "string"
                },
                "title": {
                  "description": "Post title. Empty uses the caption (videos) or its first line (photos, capped at 90 chars). The only field TikTok keeps in UPLOAD mode.",
                  "type": "string"
                },
                "videoMadeWithAi": {
                  "description": "TikTok's AI-generated content disclosure. Videos, DIRECT_POST only.",
                  "type": "boolean"
                }
              },
              "type": "object"
            },
            "description": "TikTok posting options, keyed by TikTok account id. Omit and TikTok targets publish privately (SELF_ONLY) — TikTok requires the creator to choose a visibility per post, so nothing wider is assumed on their behalf.",
            "type": "object"
          },
          "timezone": {
            "description": "IANA timezone for the schedule",
            "type": "string"
          },
          "title": {
            "description": "Pinterest only: replace the pin title (max 100 chars); use \"\" to fall back to the caption’s first line.",
            "type": "string"
          },
          "trialReel": {
            "description": "Instagram trial reel: shown to non-followers first, and to followers only once it graduates — MANUAL means the user graduates it by hand in the Instagram app, SS_PERFORMANCE that Instagram graduates it if it performs well. Only for type=\"REEL\" on an Instagram account; other types and platforms ignore it. Instagram decides which accounts may post one (public professional accounts it can recommend) and answers only when the reel is published: if it refuses, the post fails — it is never sent as a normal reel instead. Set it only when the user asks for a trial. Use \"\" to make it a normal reel again.",
            "enum": [
              "MANUAL",
              "SS_PERFORMANCE",
              ""
            ],
            "type": "string"
          },
          "type": {
            "description": "Instagram format",
            "enum": [
              "IMAGE",
              "CAROUSEL",
              "REEL",
              "STORY"
            ],
            "type": "string"
          }
        },
        "required": [
          "postId"
        ],
        "type": "object"
      },
      "name": "update_post"
    },
    {
      "description": "Upload an image or a video (mp4/mov/webm) to the media library, returning a media id for create_post. Each call adds a new asset to this workspace’s private library; nothing already there is replaced, and nothing is posted anywhere. Images are reformatted to the requested publishing format; videos are stored as-is (format/fit are ignored — upload the video pre-edited). Give the file as ONE of: url (preferred when it is already online — the server downloads it from whatever public address you give) or base64 (fallback for small images; avoid for video). For a large local file in production, prefer create_media_upload (direct upload, no base64 through this channel). format: feed_square (1:1), feed_portrait (4:5), landscape (1.91:1), story or reel (9:16), or original (no resize). fit: \"cover\" crops to fill (default), \"contain\" fits the whole image and pads.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "base64": {
            "description": "Base64 file bytes (data URI ok) — fallback for small images; avoid for video",
            "type": "string"
          },
          "crop": {
            "description": "How a 'cover' crop chooses what to keep: 'smart' = saliency-based, keeps the subject (default); 'centre' = predictable middle crop, better for posters/screenshots",
            "enum": [
              "smart",
              "centre"
            ],
            "type": "string"
          },
          "fit": {
            "description": "cover = crop to fill (default), contain = fit + pad",
            "enum": [
              "cover",
              "contain"
            ],
            "type": "string"
          },
          "format": {
            "description": "Target format / aspect ratio (images only — videos are stored as-is)",
            "enum": [
              "feed_square",
              "feed_portrait",
              "landscape",
              "story",
              "reel",
              "original"
            ],
            "type": "string"
          },
          "url": {
            "description": "Public URL to fetch the file from (preferred if already online)",
            "type": "string"
          },
          "workspaceId": {
            "description": "Which workspace to act in — an id from list_workspaces. Optional with a single workspace; REQUIRED once there are several, where guessing would mean posting one client's content to another client's accounts. Ask the user which one before publishing.",
            "type": "string"
          }
        },
        "required": [
          "format"
        ],
        "type": "object"
      },
      "name": "upload_media"
    }
  ]
}

What the leaf hashes

{"body":"97bbb85f4afa66c92831539b53c9b6ba35edee48fa2a8f05378f5b4461fd8e42","id":1785966,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793558971336542,"prev":null,"subject":"18fe3d95-026f-4cb0-b61d-32ede1e36e04","subject_kind":"endpoint"}

Proof

Fold these into the leaf in order, hashing each sorted pair with keccak256, to reach the root of (302406 rows).

  1. 0x781fdbe7b78aa09635268e95076ca1a719f0b33b91858f61683c61cbe8d6a5b6
  2. 0x670a6c40a34ad65d65d09ecf2c4b3880d2f5496a95196eeb3cbb9cf8e46d922c
  3. 0x8c95121c87ba6e3b3e5765d8ad9a8edd6f3961e9a78da26c74a1e153beaceaa6
  4. 0x6837e7c1d304e0c88c20173c1cea946c0159b7b60d318613c1edca8d92a00db5
  5. 0xa403cc2cb5106feb894dd8bd24dfb0c329e1a419392e8a981ed4ec453c06fc55
  6. 0x6156cb6339bf85c267d1f96efc97ac74ca28d27aa3f72faea18b63e7ae4e4a41
  7. 0x3b604ab7a267b31208e97d71657b83e457e82e4c28951fda8c5e1433dc89e7e3
  8. 0x317bb6e1d6eeea6568054e7912834aec68a84e61cd9b818c2dec6be2f46b45d7
  9. 0x6efc9e3971a97541c25da65eaf409f1f5777f459ee21c58a9782e45b9a1fadc6
  10. 0x18a9fe4a84252769a1b45e45dfdaad1d4c31fd73e3427c04831273d71c55c7d1
  11. 0xe03e3d14c1f904e7d1eb74ab52589df7e9efeb3d89b2bc4c44dcd173996b9417
  12. 0x922a48efb43b08095a30ef6daed1c6435642500c842a9a7064ef609c7b17fa99
  13. 0x158885233a7e31127e2842e667a258b12d4e1809863fa73786d7994cec474080
  14. 0x7e26f771e19135838a4922e6feed7314ff3896114424cf5c9fb3c97de3545c5c
  15. 0x614dbc600bca0766e288d2a5ebb7709ac565230ac6acdc88a5e4a7a5ff53c58e
  16. 0xe329dbfb0db2c7f35334e66970a8ee37ee2d3356d34d692c10f84b6f7de65a35
  17. 0x0c618c42b286ad61acd8204aa6dcf024b8b041d3759aa585bf4e221abc39cb5d
  18. 0x6142ac48fda269c17791c79da99c2456ac6acfe98268f4d168a404fd6040c703
  19. 0x3315fd2757fdd435852cc277377234a3f3909a6d2a089d0e36f6d59aacfda910
Day root
0x7fa2cba1cf3d6b35630896f5fe1a650adb307ea2c376e80a5f2d9276b7cb5ab3
Chained
0x577ff89ba012beeff3197bcff7fa86752074bdf54205a24359cc437be2a952a4
Published
On Arc Testnet, block 70262758: 0x435bc1b9331471d72e1998f2e420983b5189d4da65ffbd6f27ef40daf5e1ea90

How to check it · This row as JSON