addrbookFor publishers
← The evidence ledger

Evidence row 303801

Observed , by probe.mcp/1.

Kind
mcp.tools
About
endpoint dc54ddb6-2c94-496d-815e-52a69fa543cc
Recorded
Previous row
None: the first of its kind about this subject
Body SHA-256
cb09516585ca3965ae282bafa60c27fa79da6d7b57485fdf01f0ddaf626649b1
Leaf
0x635bf14d30f98ef34bd4919466f397e9dd40d762b38c2783fdbef44a9f76cd34

What was observed

{
  "count": 76,
  "tools": [
    {
      "description": "Stores text the workspace will want again: product details, positioning, a policy, notes from a call. Use it when the user tells you something factual worth keeping, rather than only using it in this conversation. Give it a title so it can be recognised later.",
      "inputSchema": {
        "properties": {
          "content": {
            "description": "The text to store.",
            "type": "string"
          },
          "sourceUrl": {
            "description": "Where it came from, if anywhere.",
            "type": "string"
          },
          "title": {
            "description": "A short name, e.g. \"Pricing, 2026\".",
            "type": "string"
          }
        },
        "required": [
          "content"
        ],
        "type": "object"
      },
      "name": "add_knowledge"
    },
    {
      "description": "Reads an already uploaded PDF, image or text file and stores what it says so it can be searched. Give it a media id from an upload.",
      "inputSchema": {
        "properties": {
          "mediaId": {
            "description": "Media id from an upload tool.",
            "type": "string"
          },
          "title": {
            "description": "A name for it. Defaults to the file name.",
            "type": "string"
          }
        },
        "required": [
          "mediaId"
        ],
        "type": "object"
      },
      "name": "add_knowledge_from_file"
    },
    {
      "description": "Fetches a web page or a PDF at a URL and stores its text so it can be searched later. Use it for the workspace's own site, a product page, a press release. It reads the page as it is served, so a page that needs a sign-in will not work.",
      "inputSchema": {
        "properties": {
          "title": {
            "description": "A name for it. Defaults to the page title.",
            "type": "string"
          },
          "url": {
            "description": "The address to read.",
            "type": "string"
          }
        },
        "required": [
          "url"
        ],
        "type": "object"
      },
      "name": "add_knowledge_from_url"
    },
    {
      "description": "Reads the project's website and fills in what it does, who it is for, its keywords and its voice. Use it when the brand kit is empty and you know the address, instead of interviewing the user about things their own site already says. It fills only empty fields unless you say otherwise.",
      "inputSchema": {
        "properties": {
          "overwrite": {
            "description": "Replace fields that are already filled in. Ask the user before doing this.",
            "type": "boolean"
          },
          "url": {
            "description": "The website. Defaults to the one already on the profile.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "analyze_website"
    },
    {
      "description": "Returns a Stripe checkout link for a credit pack. Nothing is charged until the user opens the link and pays; the credits are added to their account as soon as Stripe confirms the payment. Packs: starter (50 credits, $4.99), growth (200, $14.99), power (500, $29.99), power_plus (1000, $49.99). Credits never expire. Give the user the link; never claim the credits were added.",
      "inputSchema": {
        "properties": {
          "packageId": {
            "anyOf": [
              {
                "const": "starter",
                "type": "string"
              },
              {
                "const": "growth",
                "type": "string"
              },
              {
                "const": "power",
                "type": "string"
              },
              {
                "const": "power_plus",
                "type": "string"
              }
            ],
            "description": "starter, growth, power or power_plus."
          }
        },
        "required": [
          "packageId"
        ],
        "type": "object"
      },
      "name": "buy_credits"
    },
    {
      "description": "Pauses a campaign and cancels every post of it that has not gone out yet. Posts already published are untouched: they exist on the platform.",
      "inputSchema": {
        "properties": {
          "id": {
            "description": "The campaign, by id or by name.",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "cancel_campaign_posts"
    },
    {
      "description": "Counts what each of your projects holds and checks that nothing crosses between them: posts, accounts, pages, campaigns, workflows, knowledge and media. Run it after adding a project, or whenever something looks like it belongs somewhere else.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "check_projects"
    },
    {
      "description": "Sets which Facebook page this project posts to, when its Facebook connection holds several. The other pages are removed from this project only. Ask the user which page belongs to this project; list_subaccounts gives the choices.",
      "inputSchema": {
        "properties": {
          "page": {
            "description": "The page: its subaccount id from list_subaccounts, or its name.",
            "type": "string"
          }
        },
        "required": [
          "page"
        ],
        "type": "object"
      },
      "name": "choose_facebook_page"
    },
    {
      "description": "Call after PUTting a file to the presigned uploadUrl: checks the file arrived and records its size and type. Says so if the file is not there yet.",
      "inputSchema": {
        "properties": {
          "mediaId": {
            "description": "The mediaId create_presigned_upload_url returned.",
            "type": "string"
          }
        },
        "required": [
          "mediaId"
        ],
        "type": "object"
      },
      "name": "complete_upload"
    },
    {
      "description": "Produces a link the user opens to connect a social account. Authorization happens on the platform, so give them the link and wait; the account appears in list_accounts once they have finished. Use this when an account they want is missing, or when one is marked as needing a reconnect.",
      "inputSchema": {
        "properties": {
          "platform": {
            "description": "facebook, instagram, x, linkedin, tiktok or youtube.",
            "type": "string"
          }
        },
        "required": [
          "platform"
        ],
        "type": "object"
      },
      "name": "connect_account"
    },
    {
      "description": "Connects an Instagram business account found by list_instagram_accounts. With only one available, instagramId can be left out. Replaces a different Instagram account already on this project, as every connection does.",
      "inputSchema": {
        "properties": {
          "instagramId": {
            "description": "instagramId or @username from list_instagram_accounts.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "connect_instagram"
    },
    {
      "description": "Publishes a post, or schedules one to be published. This is not how a draft is saved: use save_draft for that, which needs no confirmation. Publishes immediately by default; pass scheduledTime for a specific moment, or useNextFreeSlot to take the next opening in the calendar. Use variants to word the same post differently per platform. To publish something you saved with save_draft, pass its postId and the draft becomes the post rather than a second copy of it. altText is not supported for Instagram Reels; ignored for Instagram video posts.",
      "inputSchema": {
        "properties": {
          "destinations": {
            "description": "Where to publish. Leave it out when publishing a draft by postId: it goes to the connected account for each platform the draft was written for.",
            "items": {
              "properties": {
                "accountId": {
                  "description": "Connected account id from list_accounts.",
                  "type": "string"
                },
                "subaccountId": {
                  "description": "Page or organization id from list_subaccounts.",
                  "type": "string"
                },
                "target": {
                  "properties": {
                    "altText": {
                      "description": "Accessibility description for the image. Not supported for Instagram Reels; ignored for Instagram video posts.",
                      "type": "string"
                    },
                    "collaborators": {
                      "description": "Instagram handles to invite, up to three.",
                      "items": {
                        "type": "string"
                      },
                      "type": "array"
                    },
                    "containsSyntheticMedia": {
                      "description": "YouTube only: realistic AI-generated or altered content. Set from the media when left out.",
                      "type": "boolean"
                    },
                    "disabledComments": {
                      "description": "TikTok only.",
                      "type": "boolean"
                    },
                    "disabledDuet": {
                      "description": "TikTok only.",
                      "type": "boolean"
                    },
                    "disabledStitch": {
                      "description": "TikTok only.",
                      "type": "boolean"
                    },
                    "firstComment": {
                      "description": "Posted as a comment once the post is live.",
                      "type": "string"
                    },
                    "isAiGenerated": {
                      "description": "TikTok only: AI-generated content disclosure.",
                      "type": "boolean"
                    },
                    "isBrandedContent": {
                      "description": "TikTok only: paid partnership.",
                      "type": "boolean"
                    },
                    "isMadeForKids": {
                      "description": "YouTube only, and required by law: whether the video is made for kids. Ask the user; never assume.",
                      "type": "boolean"
                    },
                    "isYourBrand": {
                      "description": "TikTok only: promoting your own brand.",
                      "type": "boolean"
                    },
                    "link": {
                      "description": "Link preview, Facebook only.",
                      "type": "string"
                    },
                    "mediaType": {
                      "description": "reel or story, for Instagram and Facebook video.",
                      "type": "string"
                    },
                    "pageId": {
                      "description": "Facebook page or LinkedIn organization to post as.",
                      "type": "string"
                    },
                    "privacyLevel": {
                      "description": "TikTok only, and required: who can see it, one of the options get_tiktok_settings lists for the account. The user chooses it; ask them, never pick one yourself.",
                      "type": "string"
                    },
                    "privacyStatus": {
                      "anyOf": [
                        {
                          "const": "public",
                          "type": "string"
                        },
                        {
                          "const": "unlisted",
                          "type": "string"
                        },
                        {
                          "const": "private",
                          "type": "string"
                        }
                      ],
                      "description": "YouTube only, and required: who can watch it. The user chooses it; ask them, never pick one yourself."
                    },
                    "shareToFeed": {
                      "description": "Instagram reels: also show in the feed.",
                      "type": "boolean"
                    },
                    "shouldNotifySubscribers": {
                      "description": "YouTube only: tell the channel's subscribers. Default yes.",
                      "type": "boolean"
                    },
                    "title": {
                      "description": "Required by YouTube (at most 100 characters, no < or >); optional title for TikTok photos.",
                      "type": "string"
                    }
                  },
                  "type": "object"
                }
              },
              "required": [
                "accountId"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "mediaIds": {
            "description": "Media ids from an upload tool.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "platformTargets": {
            "description": "Settings per platform, keyed by platform, applied to that platform's destination - also when publishing a draft by postId. TikTok needs privacyLevel chosen by the user (read the options with get_tiktok_settings, ask, never pick one yourself), and the interaction and commercial-content choices they made. YouTube needs a title, privacyStatus and isMadeForKids, all asked of the user (get_youtube_settings shows the channel); the video must be vertical or square and at most 3 minutes, which makes it a Short.",
            "patternProperties": {
              "^(.*)$": {
                "properties": {
                  "altText": {
                    "description": "Accessibility description for the image. Not supported for Instagram Reels; ignored for Instagram video posts.",
                    "type": "string"
                  },
                  "collaborators": {
                    "description": "Instagram handles to invite, up to three.",
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "containsSyntheticMedia": {
                    "description": "YouTube only: realistic AI-generated or altered content. Set from the media when left out.",
                    "type": "boolean"
                  },
                  "disabledComments": {
                    "description": "TikTok only.",
                    "type": "boolean"
                  },
                  "disabledDuet": {
                    "description": "TikTok only.",
                    "type": "boolean"
                  },
                  "disabledStitch": {
                    "description": "TikTok only.",
                    "type": "boolean"
                  },
                  "firstComment": {
                    "description": "Posted as a comment once the post is live.",
                    "type": "string"
                  },
                  "isAiGenerated": {
                    "description": "TikTok only: AI-generated content disclosure.",
                    "type": "boolean"
                  },
                  "isBrandedContent": {
                    "description": "TikTok only: paid partnership.",
                    "type": "boolean"
                  },
                  "isMadeForKids": {
                    "description": "YouTube only, and required by law: whether the video is made for kids. Ask the user; never assume.",
                    "type": "boolean"
                  },
                  "isYourBrand": {
                    "description": "TikTok only: promoting your own brand.",
                    "type": "boolean"
                  },
                  "link": {
                    "description": "Link preview, Facebook only.",
                    "type": "string"
                  },
                  "mediaType": {
                    "description": "reel or story, for Instagram and Facebook video.",
                    "type": "string"
                  },
                  "pageId": {
                    "description": "Facebook page or LinkedIn organization to post as.",
                    "type": "string"
                  },
                  "privacyLevel": {
                    "description": "TikTok only, and required: who can see it, one of the options get_tiktok_settings lists for the account. The user chooses it; ask them, never pick one yourself.",
                    "type": "string"
                  },
                  "privacyStatus": {
                    "anyOf": [
                      {
                        "const": "public",
                        "type": "string"
                      },
                      {
                        "const": "unlisted",
                        "type": "string"
                      },
                      {
                        "const": "private",
                        "type": "string"
                      }
                    ],
                    "description": "YouTube only, and required: who can watch it. The user chooses it; ask them, never pick one yourself."
                  },
                  "shareToFeed": {
                    "description": "Instagram reels: also show in the feed.",
                    "type": "boolean"
                  },
                  "shouldNotifySubscribers": {
                    "description": "YouTube only: tell the channel's subscribers. Default yes.",
                    "type": "boolean"
                  },
                  "title": {
                    "description": "Required by YouTube (at most 100 characters, no < or >); optional title for TikTok photos.",
                    "type": "string"
                  }
                },
                "type": "object"
              }
            },
            "type": "object"
          },
          "postId": {
            "description": "A draft to publish, by its id or by the number shown to the user (#1). Its text, pictures and per-platform wording are used unless you pass your own.",
            "type": "string"
          },
          "scheduledTime": {
            "description": "ISO 8601 instant to publish at.",
            "type": "string"
          },
          "text": {
            "description": "The post body. Per-platform limits apply; see variants to differ by platform. Leave it out when publishing an existing draft by postId: the draft already has its words.",
            "type": "string"
          },
          "thread": {
            "description": "Continuations, posted as replies to the first one. X and Threads only; other platforms ignore them.",
            "items": {
              "properties": {
                "mediaIds": {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "title": {
            "description": "Internal title, never published.",
            "type": "string"
          },
          "useNextFreeSlot": {
            "description": "Take the next free opening in the calendar.",
            "type": "boolean"
          },
          "variants": {
            "description": "Per-platform overrides, keyed by platform name.",
            "patternProperties": {
              "^(.*)$": {
                "properties": {
                  "mediaIds": {
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "text": {
                    "type": "string"
                  },
                  "thread": {
                    "items": {
                      "properties": {
                        "mediaIds": {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        "text": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "text"
                      ],
                      "type": "object"
                    },
                    "type": "array"
                  }
                },
                "type": "object"
              }
            },
            "type": "object"
          }
        },
        "type": "object"
      },
      "name": "create_post"
    },
    {
      "description": "Returns a presigned URL for uploading a local file directly to storage. PUT the file bytes to uploadUrl with the same Content-Type, call complete_upload with the mediaId, then use mediaId or publicUrl when creating a post.",
      "inputSchema": {
        "properties": {
          "contentType": {
            "description": "MIME type, for example image/jpeg or video/mp4.",
            "type": "string"
          },
          "filename": {
            "description": "Original file name, used for the extension.",
            "type": "string"
          }
        },
        "required": [
          "filename",
          "contentType"
        ],
        "type": "object"
      },
      "name": "create_presigned_upload_url"
    },
    {
      "description": "Adds recurring weekly openings to the calendar. Times are in the workspace timezone. Adding more slots than there is content for produces gaps, so ask how often the user actually wants to post.",
      "inputSchema": {
        "properties": {
          "slots": {
            "items": {
              "properties": {
                "accountIds": {
                  "description": "Limit this slot to certain accounts. Omit for any.",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "dayOfWeek": {
                  "description": "0 is Sunday, 1 is Monday, through 6 for Saturday.",
                  "type": "number"
                },
                "hour": {
                  "description": "Hour in the workspace timezone, 0 to 23.",
                  "type": "number"
                },
                "minute": {
                  "description": "Minute, 0 to 59. Defaults to 0.",
                  "type": "number"
                }
              },
              "required": [
                "dayOfWeek",
                "hour"
              ],
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "slots"
        ],
        "type": "object"
      },
      "name": "create_slots"
    },
    {
      "description": "Sets up work that repeats on its own: read a source, write a post, make a picture, publish it. Steps run in the order given. It is created paused and does nothing until start_workflow turns it on, so making one is safe. Use it when the user asks for something to happen daily, weekly or at a set time.",
      "inputSchema": {
        "properties": {
          "context": {
            "description": "Shared settings every step can read.",
            "patternProperties": {
              "^(.*)$": {}
            },
            "type": "object"
          },
          "daysOfWeek": {
            "description": "recurring: 0 is Sunday. [1,2,3,4,5] is weekdays.",
            "items": {
              "type": "number"
            },
            "type": "array"
          },
          "name": {
            "description": "What it is for, in a few words.",
            "type": "string"
          },
          "runAt": {
            "description": "once: an ISO time.",
            "type": "string"
          },
          "steps": {
            "description": "The steps, in order.",
            "items": {
              "properties": {
                "aspectRatio": {
                  "description": "video: 9:16 for reels, 16:9, 1:1.",
                  "type": "string"
                },
                "brief": {
                  "description": "write: what the post should be about.",
                  "type": "string"
                },
                "fromImage": {
                  "description": "video: animate the picture from the step before. On by default when there is one.",
                  "type": "boolean"
                },
                "kind": {
                  "description": "One of: source, write, image, video, draft, publish.",
                  "type": "string"
                },
                "limit": {
                  "description": "source: how many posts to read. Defaults to 10.",
                  "type": "number"
                },
                "model": {
                  "description": "image or video: a model from list_image_models / list_video_models.",
                  "type": "string"
                },
                "platform": {
                  "description": "source: read a feed instead - instagram, facebook, linkedin, tiktok or x. This costs credits per post read.",
                  "type": "string"
                },
                "platforms": {
                  "description": "write: which platforms. Defaults to every connected account.",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "prompt": {
                  "description": "image: what to draw. Defaults to what the writer suggested.",
                  "type": "string"
                },
                "query": {
                  "description": "source: search the knowledge base instead.",
                  "type": "string"
                },
                "resolution": {
                  "description": "video: 720p, 1080p or 2k.",
                  "type": "string"
                },
                "scheduledTime": {
                  "description": "publish: an ISO time instead of publishing at once.",
                  "type": "string"
                },
                "seconds": {
                  "description": "video: how long. Costs by the second.",
                  "type": "number"
                },
                "target": {
                  "description": "source: whose feed - a handle or a profile URL.",
                  "type": "string"
                },
                "url": {
                  "description": "source: a page to read.",
                  "type": "string"
                },
                "withImage": {
                  "description": "write: a picture will be attached, so write for one.",
                  "type": "boolean"
                }
              },
              "required": [
                "kind"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "timeOfDay": {
            "description": "recurring: HH:MM in the project timezone.",
            "type": "string"
          },
          "trigger": {
            "description": "recurring (default), once, or manual for run-on-demand only.",
            "type": "string"
          }
        },
        "required": [
          "name",
          "steps"
        ],
        "type": "object"
      },
      "name": "create_workflow"
    },
    {
      "description": "Removes a campaign and its plan. Posts it already produced are kept - they are posts like any other, and some may be published.",
      "inputSchema": {
        "properties": {
          "id": {
            "description": "The campaign, by id or by name.",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "delete_campaign"
    },
    {
      "description": "Removes a stored item and everything derived from it. Name what you are about to delete first.",
      "inputSchema": {
        "properties": {
          "itemId": {
            "description": "Item id from list_knowledge or search_knowledge.",
            "type": "string"
          }
        },
        "required": [
          "itemId"
        ],
        "type": "object"
      },
      "name": "delete_knowledge"
    },
    {
      "description": "Deletes a draft, or cancels one that has not gone out yet. A post that is already published cannot be deleted here: it exists on the platform, and removing our record would not remove it.",
      "inputSchema": {
        "properties": {
          "postId": {
            "description": "The post, by id or by the number shown to the user.",
            "type": "string"
          }
        },
        "required": [
          "postId"
        ],
        "type": "object"
      },
      "name": "delete_post"
    },
    {
      "description": "Permanently deletes the current project and everything in it: posts, scheduled posts, connected accounts, knowledge, workflows, campaigns and its API keys. Credits are not affected. Only the owner can do it, it cannot be the only project, and confirmName must be the project name exactly as the user typed it. Before calling, tell the user what will be lost and have them type the name. It cannot be undone.",
      "inputSchema": {
        "properties": {
          "confirmName": {
            "description": "The project name, typed by the user to confirm.",
            "type": "string"
          }
        },
        "required": [
          "confirmName"
        ],
        "type": "object"
      },
      "name": "delete_project"
    },
    {
      "description": "Cancels a post that has not gone out yet. A post that is already published cannot be cancelled: the platform has it and we do not.",
      "inputSchema": {
        "properties": {
          "submissionId": {
            "description": "The scheduled post: a submission id, a post id, or the number shown to the user (#4).",
            "type": "string"
          }
        },
        "required": [
          "submissionId"
        ],
        "type": "object"
      },
      "name": "delete_schedule"
    },
    {
      "description": "Removes one recurring opening. Posts already scheduled into it keep their time.",
      "inputSchema": {
        "properties": {
          "slotId": {
            "type": "string"
          }
        },
        "required": [
          "slotId"
        ],
        "type": "object"
      },
      "name": "delete_slot"
    },
    {
      "description": "Removes a workflow and its run history. Posts it already published are untouched.",
      "inputSchema": {
        "properties": {
          "id": {
            "description": "The workflow, by id or by its name as list_workflows shows it.",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "delete_workflow"
    },
    {
      "description": "Removes a connected account and cancels anything still scheduled to it. Say how many posts that is before asking the user to confirm.",
      "inputSchema": {
        "properties": {
          "accountId": {
            "description": "Account id from list_accounts.",
            "type": "string"
          }
        },
        "required": [
          "accountId"
        ],
        "type": "object"
      },
      "name": "disconnect_account"
    },
    {
      "description": "Adds posts to a campaign plan, removes planned ones, or rewrites their theme and angle. This is how you add \"one more post about X\" without planning the campaign again. Posts already written keep their words - use edit_post for those - and removing one that is already written is refused.",
      "inputSchema": {
        "properties": {
          "add": {
            "description": "Posts to add to the plan.",
            "items": {
              "properties": {
                "angle": {
                  "description": "One sentence: what this post says and why somebody stops for it.",
                  "type": "string"
                },
                "date": {
                  "description": "ISO date. Leave out to add it after the last one.",
                  "type": "string"
                },
                "imagePrompt": {
                  "description": "What a picture for it should show.",
                  "type": "string"
                },
                "kind": {
                  "description": "One of: educational, promotional, engagement, proof, behind_the_scenes, news.",
                  "type": "string"
                },
                "theme": {
                  "description": "Three to five words.",
                  "type": "string"
                }
              },
              "required": [
                "theme",
                "angle"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "id": {
            "description": "The campaign, by id or by name.",
            "type": "string"
          },
          "remove": {
            "description": "Day numbers to drop, as get_campaign shows them.",
            "items": {
              "type": "number"
            },
            "type": "array"
          },
          "update": {
            "description": "Changes to planned posts.",
            "items": {
              "properties": {
                "angle": {
                  "type": "string"
                },
                "date": {
                  "description": "Move it to another day.",
                  "type": "string"
                },
                "day": {
                  "description": "Which planned post, by its day number.",
                  "type": "number"
                },
                "kind": {
                  "type": "string"
                },
                "theme": {
                  "type": "string"
                }
              },
              "required": [
                "day"
              ],
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "edit_campaign_plan"
    },
    {
      "description": "Changes a post that already exists: its words, its pictures, the platforms it is for, or any combination. Pass only what changes; everything else stays. This is how you rewrite a draft or swap its image - do not write a second copy. Read it with get_post first when you are changing the words, since you cannot rewrite what you have not read. Works on drafts and on posts that are scheduled but have not gone out; a published post cannot be edited here.",
      "inputSchema": {
        "properties": {
          "mediaIds": {
            "description": "Replaces the pictures or video. Pass an empty list to take the media off entirely.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "platforms": {
            "description": "Which platforms it is for, if that is changing.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "postId": {
            "description": "The post, by id or by the number shown to the user (#2).",
            "type": "string"
          },
          "text": {
            "description": "New words. Leave out to keep what is there.",
            "type": "string"
          },
          "title": {
            "description": "Internal title, never published.",
            "type": "string"
          },
          "variants": {
            "description": "Per-platform changes, keyed by platform (facebook, instagram, x, linkedin, tiktok, youtube). Only the platforms and fields named change; the rest stays.",
            "patternProperties": {
              "^(.*)$": {
                "properties": {
                  "mediaIds": {
                    "anyOf": [
                      {
                        "items": {
                          "type": "string"
                        },
                        "type": "array"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "Its own pictures on this platform (an empty list for none), or null to use the shared ones again."
                  },
                  "text": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "Its own words on this platform, or null to use the shared text again."
                  }
                },
                "type": "object"
              }
            },
            "type": "object"
          }
        },
        "required": [
          "postId"
        ],
        "type": "object"
      },
      "name": "edit_post"
    },
    {
      "description": "Says what generating would cost in credits, without generating. Use it when the user asks what something would cost. You do not need it before generating: the confirmation prompt already states the price.",
      "inputSchema": {
        "properties": {
          "count": {
            "description": "How many images. Defaults to 1.",
            "type": "number"
          },
          "model": {
            "description": "A model from list_image_models. Defaults to the workspace one.",
            "type": "string"
          },
          "resolution": {
            "description": "1K, 2K or 4K. Larger costs more at some models.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "estimate_image_cost"
    },
    {
      "description": "Says what reading someone’s posts would cost in credits, without reading anything.",
      "inputSchema": {
        "properties": {
          "limit": {
            "description": "How many posts. Defaults to 10.",
            "type": "number"
          },
          "platform": {
            "description": "instagram, facebook, linkedin, tiktok or x.",
            "type": "string"
          }
        },
        "required": [
          "platform"
        ],
        "type": "object"
      },
      "name": "estimate_scrape_cost"
    },
    {
      "description": "Says what youtube, tiktok, audio or research would cost in credits, without reading anything. Article, PDF and plain text pages are free: use add_knowledge_from_url or add_knowledge for those instead.",
      "inputSchema": {
        "properties": {
          "sourceType": {
            "description": "youtube, tiktok, audio or research.",
            "type": "string"
          }
        },
        "required": [
          "sourceType"
        ],
        "type": "object"
      },
      "name": "estimate_source_cost"
    },
    {
      "description": "Says what a video of a given length and resolution would cost in credits, without making one. Use it whenever the user has not agreed to a price, since video is the most expensive thing here.",
      "inputSchema": {
        "properties": {
          "model": {
            "description": "A model from list_video_models.",
            "type": "string"
          },
          "resolution": {
            "description": "Defaults to 720p. What each model offers, and at what price, is in list_video_models.",
            "type": "string"
          },
          "seconds": {
            "description": "How long, in seconds.",
            "type": "number"
          }
        },
        "type": "object"
      },
      "name": "estimate_video_cost"
    },
    {
      "description": "Makes a picture from a description and stores it, ready to attach to a post. Call it as soon as you know what the picture should be: the user is asked to confirm the spend before it runs, with the price, so you do not need to ask them first. Describe the subject and the setting in the prompt; the model cannot see the brand kit, so put anything from it that matters into the words. If the project has set an image prompt, it is wrapped around what you write and sets the look, so you do not need to repeat the house style.",
      "inputSchema": {
        "properties": {
          "aspectRatio": {
            "description": "e.g. 1:1, 4:5 for Instagram, 16:9 for a link preview.",
            "type": "string"
          },
          "count": {
            "description": "How many to make, up to 4. Defaults to 1.",
            "type": "number"
          },
          "forPlatform": {
            "description": "Where this picture is going: facebook, instagram, x, linkedin or tiktok. Give it and the shape is chosen to suit that feed, which saves the user a cropped post.",
            "type": "string"
          },
          "ignoreProjectStyle": {
            "description": "Generate exactly this prompt, without the project's image template. Only when the user asks for something outside their usual look.",
            "type": "boolean"
          },
          "imageUrl": {
            "description": "An existing picture to edit or work from, rather than starting blank.",
            "type": "string"
          },
          "model": {
            "description": "A model from list_image_models. Defaults to the workspace one.",
            "type": "string"
          },
          "prompt": {
            "description": "What the picture should show, in detail.",
            "type": "string"
          },
          "resolution": {
            "description": "1K, 2K or 4K. Larger costs more at some models.",
            "type": "string"
          }
        },
        "required": [
          "prompt"
        ],
        "type": "object"
      },
      "name": "generate_image"
    },
    {
      "description": "Makes a short video with its own audio and stores it, ready to attach to a post. It takes a few minutes: over MCP or the API it may answer with status \"processing\" and a jobId instead of a mediaId; then call get_video_status with that jobId until it gives the mediaId, and only then save the draft. Say what it will cost first; video is the most expensive thing here and is charged by the second. Pass imageId to animate a picture the project already has - a product photo or one you generated - and it becomes the first frame. Structure the prompt with [VISUAL], [SPEECH], [SOUNDS] and [TEXT] sections; English is the language the model is validated in.",
      "inputSchema": {
        "properties": {
          "aspectRatio": {
            "description": "16:9, 9:16 for reels, TikTok and YouTube Shorts, 1:1, 4:3, 3:4, or auto to let the model choose.",
            "type": "string"
          },
          "audioUrl": {
            "description": "Narration or music to build the visuals around.",
            "type": "string"
          },
          "ignoreProjectStyle": {
            "description": "Make exactly this prompt, without the project's video template. Only when the user asks for something outside their usual look.",
            "type": "boolean"
          },
          "imageId": {
            "description": "A picture in this project to animate; it becomes the first frame.",
            "type": "string"
          },
          "imageUrl": {
            "description": "A public picture to animate, if it is not one of ours.",
            "type": "string"
          },
          "model": {
            "description": "A model from list_video_models.",
            "type": "string"
          },
          "negativePrompt": {
            "description": "What to keep out of it.",
            "type": "string"
          },
          "prompt": {
            "description": "What happens, what is said, what is heard. E.g. \"[VISUAL] a hand lifts the jar... [SPEECH] Three plants, one minute. [SOUNDS] quiet kitchen\".",
            "type": "string"
          },
          "resolution": {
            "description": "Defaults to 720p, which is right for a phone screen. Higher costs several times more; list_video_models has the rates.",
            "type": "string"
          },
          "seconds": {
            "description": "How long. Shorter is cheaper and usually better.",
            "type": "number"
          }
        },
        "required": [
          "prompt"
        ],
        "type": "object"
      },
      "name": "generate_video"
    },
    {
      "description": "The workspace's voice, audience, rules and example posts, which everything written for it follows. Your instructions already carry the voice and the rules (in the app and over MCP alike), so call this for the full kit: when the user asks what is set, when you are about to change something, or when you need the example posts.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "get_brand_kit"
    },
    {
      "description": "One campaign in full: every planned post with its date, kind (educational, promotional, engagement, proof, behind_the_scenes, news), theme and angle, and which of them have been written. Read it before changing anything about the campaign.",
      "inputSchema": {
        "properties": {
          "id": {
            "description": "The campaign, by id or by name.",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "get_campaign"
    },
    {
      "description": "Returns the credit balance for the workspace. Credits pay for generated images, video, transcription and scraping; writing, publishing and scheduling are free on paid plans.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "get_credits"
    },
    {
      "description": "Returns the stored details of one media asset, including whether its bytes have arrived.",
      "inputSchema": {
        "properties": {
          "mediaId": {
            "description": "Id returned when the media was created.",
            "type": "string"
          }
        },
        "required": [
          "mediaId"
        ],
        "type": "object"
      },
      "name": "get_media"
    },
    {
      "description": "The full text of one post, with its pictures, its per-platform wording and its state. Call it before changing or rewriting a post: list_posts only shows the first line of each, and working from that means working from a fragment.",
      "inputSchema": {
        "properties": {
          "postId": {
            "description": "The post, by id or by the number shown to the user (#2).",
            "type": "string"
          }
        },
        "required": [
          "postId"
        ],
        "type": "object"
      },
      "name": "get_post"
    },
    {
      "description": "The numbers for one published post on every network it went to: the latest reading and every earlier one, so you can say whether it is still growing. Pass refresh: true to read the networks again now (at most every ten minutes); leave it off to use what was already collected.",
      "inputSchema": {
        "properties": {
          "postId": {
            "description": "The post, by id or by the number the user sees (#7).",
            "type": "string"
          },
          "refresh": {
            "description": "Read the networks again now. Defaults to false.",
            "type": "boolean"
          }
        },
        "required": [
          "postId"
        ],
        "type": "object"
      },
      "name": "get_post_analytics"
    },
    {
      "description": "Returns where a post stands on each platform, including the public link once it is live. Instagram and TikTok process uploads in the background, so a post can be accepted and not yet visible.",
      "inputSchema": {
        "properties": {
          "postId": {
            "description": "The post, by id or by the number shown to the user (#2), or a submission id returned by create_post.",
            "type": "string"
          }
        },
        "required": [
          "postId"
        ],
        "type": "object"
      },
      "name": "get_post_status"
    },
    {
      "description": "Reads, from TikTok, what the connected TikTok account may post: the account name, the privacy levels it offers, whether comments, Duet and Stitch are allowed, and the longest video. Call it before publishing to TikTok, show the user the account name, and ask them to choose the privacy level (there is no default), whether to allow comments (and Duet and Stitch for video), and whether the post promotes their own brand or is branded content. Pass their answers in create_post as platformTargets.tiktok.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "get_tiktok_settings"
    },
    {
      "description": "Returns the signed-in user, the active workspace, the plan and the credit balance. Call this first to confirm which workspace you are acting on.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "get_user"
    },
    {
      "description": "Whether a video generate_video started is ready. Pass the jobId it returned. When it is done this gives the mediaId to attach to a post with save_draft, edit_post or create_post. If it is still being made, wait about a minute and ask again; never generate it a second time and never make up a media id.",
      "inputSchema": {
        "properties": {
          "jobId": {
            "description": "The jobId generate_video returned.",
            "type": "string"
          }
        },
        "required": [
          "jobId"
        ],
        "type": "object"
      },
      "name": "get_video_status"
    },
    {
      "description": "One workflow in full: every step with its settings, its schedule, and how the last runs went. Read it before changing anything, since update_workflow replaces the steps you pass and you cannot keep what you have not seen.",
      "inputSchema": {
        "properties": {
          "id": {
            "description": "The workflow, by id or by its name.",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "get_workflow"
    },
    {
      "description": "Reads, from YouTube, the connected channel a Short would go to: its name and handle, who can be chosen to watch (public, unlisted, private) and the longest Short (3 minutes). Call it before publishing to YouTube, show the user the channel, and ask them for a title (at most 100 characters), who can watch it, and whether it is made for kids. Pass their answers in create_post as platformTargets.youtube: title, privacyStatus, isMadeForKids. The video must be vertical or square.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "get_youtube_settings"
    },
    {
      "description": "Fills the brand kit's example posts from what this workspace has already published. Use it when the brand kit has no examples and there is a publishing history, instead of asking the user to paste posts they have already sent.",
      "inputSchema": {
        "properties": {
          "limit": {
            "description": "How many to take, up to 10. Defaults to 5.",
            "type": "number"
          },
          "platform": {
            "description": "Take examples from one platform only.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "learn_voice_from_published"
    },
    {
      "description": "Lists the social accounts connected to this workspace, with their platform, handle and whether they are currently usable. Call this before writing or scheduling, so you only offer platforms that are actually connected.",
      "inputSchema": {
        "properties": {
          "platform": {
            "description": "Limit to one platform: facebook, instagram, x, linkedin, tiktok or youtube.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_accounts"
    },
    {
      "description": "The campaigns in this project, what each is for, and how far through it is.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "list_campaigns"
    },
    {
      "description": "The image models available, what each costs in credits, and which one this workspace uses by default. Call it when the user asks what you can make images with, or before generating if they might care about the price.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "list_image_models"
    },
    {
      "description": "Lists the Instagram business accounts linked to the connected Facebook pages, the ones this project can post to. Facebook must be connected first. Follow with connect_instagram.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "list_instagram_accounts"
    },
    {
      "description": "Lists what this workspace has stored, with whether each item is searchable yet. Use it when the user asks what you know about them, or when a search came back empty and you want to say why.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "list_knowledge"
    },
    {
      "description": "Lists posts in this workspace, newest first, with the first line of each. Use it before writing to check what has already been said. The text here is shortened: to work on a post, read it with get_post first.",
      "inputSchema": {
        "properties": {
          "limit": {
            "description": "How many to return, at most 50.",
            "type": "number"
          },
          "offset": {
            "description": "How many of the newest to skip, to read further back.",
            "type": "number"
          },
          "status": {
            "description": "draft, scheduled, publishing, partially_published, published or failed. Several, comma separated, list them together.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_posts"
    },
    {
      "description": "Lists posts waiting to go out, soonest first.",
      "inputSchema": {
        "properties": {
          "limit": {
            "description": "How many to return, at most 50.",
            "type": "number"
          }
        },
        "type": "object"
      },
      "name": "list_schedules"
    },
    {
      "description": "The networks this server can read posts from, and what each costs per result. Call it when the user asks whether you can look at a competitor.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "list_scrapers"
    },
    {
      "description": "Lists the recurring weekly openings this workspace publishes in, and which of the coming ones are already taken. Read this before scheduling, so posts land in the rhythm the user already chose.",
      "inputSchema": {
        "properties": {
          "days": {
            "description": "How far ahead to show occupancy, default 14.",
            "type": "number"
          }
        },
        "type": "object"
      },
      "name": "list_slots"
    },
    {
      "description": "Lists the pages, organizations or boards an account can publish to. Facebook posts go to a page and LinkedIn can post as a company, so this is where the id for those comes from.",
      "inputSchema": {
        "properties": {
          "accountId": {
            "description": "The connected account to list destinations for.",
            "type": "string"
          }
        },
        "required": [
          "accountId"
        ],
        "type": "object"
      },
      "name": "list_subaccounts"
    },
    {
      "description": "Ranks published posts by how they did: views, likes, comments, shares, reach, saves, or engagement (likes + comments + shares + saves). Each network a post went to is ranked on its own. Numbers are the ones already collected (an hour, a day and a week after publishing, then daily for a month); nothing is fetched from the networks. Use it for \"which post worked\", \"what did best on LinkedIn this month\", or before planning what to write next.",
      "inputSchema": {
        "properties": {
          "limit": {
            "description": "How many, 1 to 50. Defaults to 10.",
            "type": "number"
          },
          "platform": {
            "description": "facebook, instagram, x, linkedin, tiktok or youtube. Leave out for all.",
            "type": "string"
          },
          "since": {
            "description": "ISO date or time; posts published on or after it. Defaults to 30 days ago.",
            "type": "string"
          },
          "sortBy": {
            "description": "One of views, likes, comments, shares, reach, saves, engagement. Defaults to views.",
            "type": "string"
          },
          "until": {
            "description": "ISO date or time; posts published on or before it.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_top_posts"
    },
    {
      "description": "The video models available, what each costs per second at each resolution, and how long a clip can be. Call it when the user asks whether you can make video.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "list_video_models"
    },
    {
      "description": "The workflows in this project, what they do, when they next run, and how the last run went. Call it when the user asks what is running on its own.",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "list_workflows"
    },
    {
      "description": "Returns the next free opening in the calendar, without taking it. Use it to tell the user when a post would go out before scheduling it.",
      "inputSchema": {
        "properties": {
          "accountId": {
            "description": "Only consider slots that publish to this account.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "next_available_slot"
    },
    {
      "description": "Verifies the connection end to end. Returns the caller identity, the channel it arrived on, and the server time. It is for someone checking that an API key or an MCP setup works, and it does nothing else: never call it as a step in doing what the user asked.",
      "inputSchema": {
        "properties": {
          "echo": {
            "description": "Text echoed back unchanged.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "noop"
    },
    {
      "description": "Stops a campaign writing any more posts. Posts already written keep their place in the calendar; cancel them individually if they should not go out.",
      "inputSchema": {
        "properties": {
          "id": {
            "description": "The campaign, by id or by name.",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "pause_campaign"
    },
    {
      "description": "Plans a run of posts around one goal: what each post is for, its theme and its angle, spread over the days the project posts on. It writes nothing and publishes nothing - the plan is one line per post, to be read and changed before anything is written. Use this when the user wants a month of content, a launch, or anything with more than a couple of posts behind one idea.",
      "inputSchema": {
        "properties": {
          "audience": {
            "description": "Who it is for, if not the usual audience.",
            "type": "string"
          },
          "daysOfWeek": {
            "description": "Days to post on, 0 is Sunday. Defaults to every day.",
            "items": {
              "type": "number"
            },
            "type": "array"
          },
          "goal": {
            "description": "What the campaign is for, in the user's words.",
            "type": "string"
          },
          "leadDays": {
            "description": "How many days before a post goes out it is written. Default 2.",
            "type": "number"
          },
          "name": {
            "description": "What to call it.",
            "type": "string"
          },
          "notes": {
            "description": "Anything else the planner should know.",
            "type": "string"
          },
          "offer": {
            "description": "What is being promoted, if anything.",
            "type": "string"
          },
          "platforms": {
            "description": "Which platforms. Defaults to every connected account.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "posts": {
            "description": "How many posts, up to 60.",
            "type": "number"
          },
          "sources": {
            "description": "Pages the campaign is based on - articles, a product page, a blog. They are read here and kept in the knowledge base, and every post of the campaign is then written from what they say. Pass them whenever the user says the campaign is about their own content; you do not need to read anything first.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "startsOn": {
            "description": "ISO date for the first post. Defaults to tomorrow.",
            "type": "string"
          },
          "themes": {
            "description": "Subjects it should cover.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "timeOfDay": {
            "description": "HH:MM in the project timezone. Defaults to 09:00.",
            "type": "string"
          },
          "useSlots": {
            "description": "Publish into the project's own calendar slots instead of at a fixed hour, taking the next free one on or after each planned day. Prefer this when the project has slots.",
            "type": "boolean"
          },
          "withImages": {
            "description": "Generate a picture for each post. This costs credits.",
            "type": "boolean"
          }
        },
        "required": [
          "name",
          "goal",
          "posts"
        ],
        "type": "object"
      },
      "name": "plan_campaign"
    },
    {
      "description": "Turns a YouTube video, a TikTok, an audio file, or a research question into text to write from. sourceType youtube or tiktok take a video url and read its spoken transcript (English captions for YouTube; TikTok's own captions when it has them, speech-to-text otherwise). sourceType audio takes a url to a recording and transcribes it. sourceType research takes a question and answers it from a live web search. Each costs credits; quote it first with estimate_source_cost. The text is stored in the knowledge base unless saveToKnowledge is false, and is also returned here so it can be used straight away.",
      "inputSchema": {
        "properties": {
          "saveToKnowledge": {
            "description": "Store the result in the knowledge base. Defaults to true.",
            "type": "boolean"
          },
          "sourceType": {
            "description": "youtube, tiktok, audio or research.",
            "type": "string"
          },
          "title": {
            "description": "A name for it, if stored. Defaults to the source’s own title.",
            "type": "string"
          },
          "value": {
            "description": "A video or audio URL for youtube, tiktok and audio; the question itself for research.",
            "type": "string"
          }
        },
        "required": [
          "sourceType",
          "value"
        ],
        "type": "object"
      },
      "name": "read_source"
    },
    {
      "description": "Runs a workflow immediately, whatever its schedule says, and reports what each step did. Use it to show the user what their workflow actually produces before leaving it to run on its own.",
      "inputSchema": {
        "properties": {
          "id": {
            "description": "The workflow, by id or by its name as list_workflows shows it.",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "run_workflow"
    },
    {
      "description": "Saves a post you have written so it appears under Drafts and can be published or scheduled later. Use it whenever you write a post the user has not asked you to publish yet, instead of leaving it in the conversation: a draft in the chat is lost, a saved one is not. Always name the platforms it is for, and attach any picture you made for it. To change something that already exists, use edit_post rather than saving a second copy. Nothing is published by this.",
      "inputSchema": {
        "properties": {
          "mediaIds": {
            "description": "Media ids, e.g. from generate_image.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "platforms": {
            "description": "Which platforms this draft is for, e.g. [\"x\", \"linkedin\"]. Required: a draft that does not say where it is going cannot be shown beside the account it belongs to, and nobody can tell what it was written for.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "postId": {
            "description": "Revise this draft instead of saving a new one.",
            "type": "string"
          },
          "text": {
            "description": "The post body.",
            "type": "string"
          },
          "thread": {
            "description": "Continuations for X or Threads.",
            "items": {
              "properties": {
                "mediaIds": {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "title": {
            "description": "Internal title, never published.",
            "type": "string"
          },
          "variants": {
            "description": "Per-platform wording, keyed by platform.",
            "patternProperties": {
              "^(.*)$": {
                "properties": {
                  "mediaIds": {
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "text": {
                    "type": "string"
                  }
                },
                "type": "object"
              }
            },
            "type": "object"
          }
        },
        "required": [
          "text",
          "platforms"
        ],
        "type": "object"
      },
      "name": "save_draft"
    },
    {
      "description": "Reads recent posts from a public profile on Instagram, Facebook, LinkedIn, TikTok or X, and keeps them so patterns across weeks can be seen. Use it to look at a competitor before writing, or as the first step of a workflow. It costs credits per post read, so say what it will cost first.",
      "inputSchema": {
        "properties": {
          "limit": {
            "description": "How many posts to read, up to 100. Defaults to 10.",
            "type": "number"
          },
          "platform": {
            "description": "instagram, facebook, linkedin, tiktok or x.",
            "type": "string"
          },
          "target": {
            "description": "A handle, a profile URL, or a search term where the network allows one.",
            "type": "string"
          }
        },
        "required": [
          "platform",
          "target"
        ],
        "type": "object"
      },
      "name": "scrape_posts"
    },
    {
      "description": "Searches what this workspace has stored: notes, pages, documents, product details. Use it before writing anything factual about them, rather than guessing or asking. It searches by meaning, so ask in whatever words the user used. Returns nothing when the workspace has stored nothing, which is worth saying rather than working around.",
      "inputSchema": {
        "properties": {
          "limit": {
            "description": "How many passages to return, up to 20. Defaults to 5.",
            "type": "number"
          },
          "query": {
            "description": "What you need to know, in plain words.",
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "type": "object"
      },
      "name": "search_knowledge"
    },
    {
      "description": "Sets which model this workspace generates with unless told otherwise. Use it when the user says they want a particular one from now on.",
      "inputSchema": {
        "properties": {
          "model": {
            "description": "A model from list_image_models.",
            "type": "string"
          }
        },
        "required": [
          "model"
        ],
        "type": "object"
      },
      "name": "set_default_image_model"
    },
    {
      "description": "Turns a campaign on. Its posts are written a couple of days before each one goes out and land in the calendar as scheduled, where they can still be read, edited or cancelled. Posts with pictures spend credits as they are written. Tell the user how many posts and roughly how many credits before calling this.",
      "inputSchema": {
        "properties": {
          "id": {
            "description": "The campaign, by id or by name.",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "start_campaign"
    },
    {
      "description": "Turns a workflow on. From then on it runs to its schedule and publishes without asking again, so make sure the user has seen what it does. Use stop_workflow to pause it.",
      "inputSchema": {
        "properties": {
          "id": {
            "description": "The workflow, by id or by its name as list_workflows shows it.",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "start_workflow"
    },
    {
      "description": "Pauses a workflow so it stops running on its own. Nothing is deleted and it can be started again.",
      "inputSchema": {
        "properties": {
          "id": {
            "description": "The workflow, by id or by its name as list_workflows shows it.",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "stop_workflow"
    },
    {
      "description": "Records what the workspace sounds like. Pass only the fields you are changing; anything you leave out is kept. Example posts matter most: ask for two or three things they actually published, since those define the voice better than adjectives do. Use this whenever the user tells you something about their voice, audience or rules, rather than remembering it for one conversation.",
      "inputSchema": {
        "properties": {
          "audience": {
            "description": "Who the posts are for, e.g. \"office managers\".",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "bannedWords": {
            "description": "Words never to use.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "contentInstructions": {
            "description": "Standing rules for everything written for this project, e.g. \"always end with a question\". These are applied to every draft, so put a rule here rather than repeating it each time. Pass an empty string to clear them.",
            "type": "string"
          },
          "ctas": {
            "description": "Calls to action they use.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "defaultImagePrompt": {
            "description": "A template wrapped around every image prompt, where {{DESCRIPTION}} is replaced by what the picture should show. This is how a project keeps one look. Pass an empty string to clear it.",
            "type": "string"
          },
          "defaultVideoPrompt": {
            "description": "The same, for video, where {{DESCRIPTION}} is what the clip should show. Left empty, videos use the image template, since a project usually has one look. Pass an empty string to clear it.",
            "type": "string"
          },
          "description": {
            "description": "A paragraph of background.",
            "type": "string"
          },
          "examplePosts": {
            "description": "Posts they wrote themselves. These define the voice; add rather than invent.",
            "items": {
              "properties": {
                "platform": {
                  "type": "string"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "platform",
                "text"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "hashtagSets": {
            "description": "Named sets of hashtags, e.g. {\"core\": [\"#plants\", \"#office\"]}.",
            "patternProperties": {
              "^(.*)$": {
                "items": {
                  "type": "string"
                },
                "type": "array"
              }
            },
            "type": "object"
          },
          "keywords": {
            "description": "What this project is about, in the words people would search for.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "languagePrimary": {
            "description": "Two-letter code for the language posts are usually written in.",
            "type": "string"
          },
          "name": {
            "description": "The brand or business name.",
            "type": "string"
          },
          "oneLiner": {
            "description": "What they do, in one sentence.",
            "type": "string"
          },
          "replaceExamplePosts": {
            "description": "Replace the stored examples instead of adding to them.",
            "type": "boolean"
          },
          "toneDo": {
            "description": "Things to do, e.g. \"name the plant\".",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "toneDont": {
            "description": "Things to avoid, e.g. \"use stock phrases\".",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "voice": {
            "description": "Adjectives for the voice, e.g. \"warm\", \"practical\".",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "website": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "update_brand_kit"
    },
    {
      "description": "Changes how a campaign runs: whether its posts get a generated picture, whether it uses the calendar slots, how many days ahead it writes, or its name. Pass only what changes. Pictures apply to the posts not yet written and cost a credit each at the cheapest model - say the number before turning them on.",
      "inputSchema": {
        "properties": {
          "id": {
            "description": "The campaign, by id or by name.",
            "type": "string"
          },
          "leadDays": {
            "description": "How many days before a post goes out it is written.",
            "type": "number"
          },
          "name": {
            "type": "string"
          },
          "useSlots": {
            "description": "Publish into the project's calendar slots.",
            "type": "boolean"
          },
          "withImages": {
            "description": "Generate a picture for each post still to be written. This costs credits.",
            "type": "boolean"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "update_campaign"
    },
    {
      "description": "Changes when a post goes out, or takes it off the calendar and leaves it as a draft. Pass scheduledTime for a specific moment or useNextFreeSlot to take the next opening. A post that has already gone out cannot be moved.",
      "inputSchema": {
        "properties": {
          "scheduledTime": {
            "description": "ISO 8601 instant to publish at instead.",
            "type": "string"
          },
          "submissionId": {
            "description": "The scheduled post: a submission id from list_schedules, a post id, or the number shown to the user (#4).",
            "type": "string"
          },
          "unschedule": {
            "description": "Take it off the calendar and leave it as a draft, without cancelling it.",
            "type": "boolean"
          },
          "useNextFreeSlot": {
            "description": "Take the next free opening in the calendar.",
            "type": "boolean"
          }
        },
        "required": [
          "submissionId"
        ],
        "type": "object"
      },
      "name": "update_schedule"
    },
    {
      "description": "Changes a workflow that already exists: its steps, its name, or when it runs. Pass only what changes. Call get_workflow first when you are changing the steps, since the list you pass replaces the ones that are there. Its run history is kept.",
      "inputSchema": {
        "properties": {
          "context": {
            "patternProperties": {
              "^(.*)$": {}
            },
            "type": "object"
          },
          "daysOfWeek": {
            "description": "0 is Sunday.",
            "items": {
              "type": "number"
            },
            "type": "array"
          },
          "id": {
            "description": "The workflow, by id or by its name.",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "runAt": {
            "description": "For a one-off: an ISO time.",
            "type": "string"
          },
          "steps": {
            "description": "The complete new list of steps, in order.",
            "items": {
              "properties": {
                "aspectRatio": {
                  "description": "video: 9:16 for reels, 16:9, 1:1.",
                  "type": "string"
                },
                "brief": {
                  "description": "write: what the post should be about.",
                  "type": "string"
                },
                "fromImage": {
                  "description": "video: animate the picture from the step before. On by default when there is one.",
                  "type": "boolean"
                },
                "kind": {
                  "description": "One of: source, write, image, video, draft, publish.",
                  "type": "string"
                },
                "limit": {
                  "description": "source: how many posts to read. Defaults to 10.",
                  "type": "number"
                },
                "model": {
                  "description": "image or video: a model from list_image_models / list_video_models.",
                  "type": "string"
                },
                "platform": {
                  "description": "source: read a feed instead - instagram, facebook, linkedin, tiktok or x. This costs credits per post read.",
                  "type": "string"
                },
                "platforms": {
                  "description": "write: which platforms. Defaults to every connected account.",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "prompt": {
                  "description": "image: what to draw. Defaults to what the writer suggested.",
                  "type": "string"
                },
                "query": {
                  "description": "source: search the knowledge base instead.",
                  "type": "string"
                },
                "resolution": {
                  "description": "video: 720p, 1080p or 2k.",
                  "type": "string"
                },
                "scheduledTime": {
                  "description": "publish: an ISO time instead of publishing at once.",
                  "type": "string"
                },
                "seconds": {
                  "description": "video: how long. Costs by the second.",
                  "type": "number"
                },
                "target": {
                  "description": "source: whose feed - a handle or a profile URL.",
                  "type": "string"
                },
                "url": {
                  "description": "source: a page to read.",
                  "type": "string"
                },
                "withImage": {
                  "description": "write: a picture will be attached, so write for one.",
                  "type": "boolean"
                }
              },
              "required": [
                "kind"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "timeOfDay": {
            "description": "HH:MM in the project timezone.",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "update_workflow"
    },
    {
      "description": "Downloads a publicly reachable file into storage and returns a stable URL to use in posts. Use this for images or video that already live on the web.",
      "inputSchema": {
        "properties": {
          "altText": {
            "description": "Accessibility description.",
            "type": "string"
          },
          "url": {
            "description": "Publicly reachable URL of the file.",
            "type": "string"
          }
        },
        "required": [
          "url"
        ],
        "type": "object"
      },
      "name": "upload_media_from_url"
    },
    {
      "description": "Writes the next few posts of a campaign immediately instead of waiting for their lead time, and schedules them at their planned dates. Use it to show the user what the plan actually produces.",
      "inputSchema": {
        "properties": {
          "count": {
            "description": "How many to write now. Default 2.",
            "type": "number"
          },
          "id": {
            "description": "The campaign, by id or by name.",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "write_campaign_posts"
    }
  ]
}

What the leaf hashes

{"body":"cb09516585ca3965ae282bafa60c27fa79da6d7b57485fdf01f0ddaf626649b1","id":303801,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793055549728815,"prev":null,"subject":"dc54ddb6-2c94-496d-815e-52a69fa543cc","subject_kind":"endpoint"}

Proof

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

  1. 0x635c053700c8e716b1fde950c7d1b0857cac2d1c6b3ae0f15af1491b62ebea62
  2. 0x4c85c06c2daebd6dafcc2151eedf874ca9c413818235af253f57309fc96fe19f
  3. 0xe22cef4ec05b0394867cd08c5760679987b66d892e03d1a91a9f6141af82327b
  4. 0xded33adc91e42168c3dc181fcef93c794c13e4cf062bb846039a5520bd266a95
  5. 0xf1e8ff712cd60ce958d21131553c8f004ea77d801b6d7dd3a6297f9459c5f644
  6. 0x2b9bf47cfcabe3d175ec5fe5bee05d11da5cf67762141a7b69fc9b857c33dbc7
  7. 0x7d435ff6e05d8be22ecd2db7a07662fe8fc09059652b2c37a9ab01acad45cce4
  8. 0xe89ce62aa82c8d97dddb6f684deb1f77d284d33e6bb43b3e5af44febe0194ae5
  9. 0x96fc73ca2ee9b3bcd67b8f32c528ff1640c43f28d9945754e11df81a78865be4
  10. 0x805c08486b6cd1b041c9a402e5b3eb6f97649952efcabb97e1817185a4ce7572
  11. 0xde5ff34fc9e6ff297fede5d3c4b4de6828c65b98246109399106064f912afa82
  12. 0x3c8355143bb13802401d5a80f8a70809a59f429bc298f4912731fc8d207e4f43
  13. 0x13f4b94ecf613d585c952b5363dad2b247a55371eb8e358bb89dc033e83128b1
  14. 0x9a79c65e077cd9da9d436b3ade6f5ddc0d244510c4d5903ef2f02d81205f7666
  15. 0xa2d436d488e3600b0e5c3e3ed9c9234cd52853c59830b786334fd0c4292d9f40
  16. 0x47b89901b0f07938a6b9a66ddf35683903f79d756a7c7763665fd632758b08d0
  17. 0x9a83be955a206deb65b995adfd92c58fa31c95fbbf926bd199d300e70b08b26d
  18. 0x20704208aa6923d6b2450ef74ede87a6e0265d46447926038fe9506e9e154b2d
  19. 0x9b9ce5b74b9bab5121612ef6b64920a8d453cbf311096a423eef9702747e868a
Day root
0xf43e8dcc3d451a4788b26be904c55e8c4c0fa75c9666796c51db38d37e2c0df8
Chained
0x702d5ac508f08b0d1accf36af25822d8e5660367494edd17a642fb61e158a57a
Published
On Arc Testnet, block 69251483: 0x495162f8936e19f0039918feebe6c307f327cd6bf8c37219620b1970041fa9ae

How to check it · This row as JSON