BulkPublish
Server Details
Hosted MCP endpoint for AI agents to plan, adapt, review, schedule, and batch-publish social media content across connected channels.
The last two health checks of this connector failed. If this server requires authentication, missing or expired test credentials may be the cause. A test profile lets Glama authenticate for health checks and discover tools; it is separate from your personal connections.
If you are the author, claim ownership, then add or update a test profile under Admin → Test Profile.
- Status
- Unhealthy
- Uptime
- 94.3% over 63 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 27 tools
Descriptions go out of their way to say when to prefer one tool over another (compose_post vs create_post, view_posts vs list_posts, upload_media vs create_media_upload), so an agent can usually pick correctly. However, there are five near-duplicate UI/API pairs (view_* vs list_/get_*) plus a three-tool media upload pipeline, which leaves real boundary judgment calls rather than cleanly distinct purposes.
Nearly every tool is verb_noun snake_case (create_post, update_post, delete_post, list_posts, reply_to_comment, moderate_comment), and plural/singular noun usage is stable across the post, media, and conversation families. The few outliers (get_queue_slot, finalize_media_upload) still fit the same pattern.
27 tools for a social-media publishing product spans a broad but coherent domain (posts, media, channels, analytics, inbox, comments). The count is inflated by five view_* wrappers that largely mirror existing list_/get_analytics tools, so it sits at the heavy end of appropriate.
Post lifecycle is fully covered (create, compose, update, publish, retry, delete, get, list) along with media upload/listing, comments, and Inbox conversations. Gaps are minor: no media deletion, no channel connect/disconnect or get_channel, and approval is handled through flags rather than a dedicated tool.
Available Tools
27 toolscompose_postCompose a postARead-onlyIdempotentInspect
Open an interactive composer to draft or schedule a social media post. Shows the user's connected channels to pick from and pre-fills any provided text. The user finishes in the UI; on submit it creates the post via create_post. Use this when the user wants to compose a post interactively in a UI — prefer this over create_post when they'd review before posting.
| Name | Required | Description | Default |
|---|---|---|---|
| content | No | Optional initial text to pre-fill the composer with. |
Output Schema
| Name | Required | Description |
|---|---|---|
| media | No | |
| channels | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses an important side effect: 'on submit it creates the post via create_post.' However, this directly contradicts the annotation readOnlyHint: true. Because the description claims a write behavior while the annotations mark the tool read-only, this dimension scores 1 as an annotation contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the purpose and user flow. The final sentence repeats the idea of interactive UI/composing somewhat, but overall every sentence adds useful routing or behavior context with little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-optional-parameter tool with an output schema and low complexity, the description gives enough invocation context: it explains the interactive UI, channel selection, pre-fill behavior, and delegation to create_post. It could add more about scheduling-edge behavior, but the schema and output schema cover the rest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one optional parameter, content, and the schema already describes it fully as 'Optional initial text to pre-fill the composer.' The description restates pre-filling in prose, but adds no format, length, or behavior details beyond the schema. With 100% schema coverage, the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action ('Open an interactive composer') and resource ('social media post'), and clarifies the flow up to creating the post via create_post. It also distinguishes itself from the sibling create_post by being the interactive, review-first path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage guidance: 'Use this when the user wants to compose a post interactively in a UI' and 'prefer this over create_post when they'd review before posting.' This directly tells an agent when to choose this tool over its closest sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_media_uploadStart media uploadAInspect
Reserve a presigned upload URL for a direct browser upload (used by the composer UI). For scripted uploads use upload_media instead. Use this when you need a presigned URL for a large direct upload (advanced; prefer upload_media for normal files).
| Name | Required | Description | Default |
|---|---|---|---|
| sizeBytes | Yes | File size in bytes. | |
| contentType | Yes | File MIME type, e.g. image/png or video/mp4. |
Output Schema
| Name | Required | Description |
|---|---|---|
| r2Key | No | |
| expiresIn | No | |
| uploadUrl | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only mark the tool as non-readonly/non-idempotent and don't describe the side effect. The description adds meaningful behavior: it reserves a URL rather than uploading bytes, and frames it as a large direct browser upload path. It doesn't go into URL expiry or a required finalize step, but the core mutation is clear enough that agents won't assume bytes are sent in this call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence and the alternative is named in the second. It is concise overall, though the second and third sentences partly repeat the same routing advice ('use upload_media instead' and 'prefer upload_media for normal files'), keeping it just below a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with a full input schema, an output schema, and an annotation block, the description gives enough selection and invocation guidance. It names the sibling alternative and the conditions that choose between them, so nothing critical is missing for calling this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters have descriptions, so the schema already defines sizeBytes and contentType. The description adds the 'large direct upload' context but no syntax or format details beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Reserve a presigned upload URL for a direct browser upload'. It also scopes the tool to the composer UI and explicitly distinguishes it from upload_media, so an agent can identify what this tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing: scripted uploads should use upload_media, and presigned large direct uploads should use this tool, with 'advanced' and 'prefer upload_media for normal files' as guardrails. These are concrete when/when-not conditions, not implied context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_postCreate postAInspect
Create a new social media post. Can be saved as a draft or scheduled for a specific time. Supports platform-specific content overrides, media attachments, labels, and thread format. IMPORTANT: YouTube and TikTok REQUIRE video — do not include them when posting images only. Instagram defaults to feed_photo — set postTypeOverrides for video content (reel, feed_video). Use this when the user wants to draft or schedule one new post. It never publishes immediately; publish_post does that.
| Name | Required | Description | Default |
|---|---|---|---|
| labels | No | Array of label IDs to tag the post with. | |
| status | No | Post status. "draft" (default) or "scheduled". | |
| content | No | The post text content. Optional — defaults to empty for media-only posts. LinkedIn mentions: write @[Display Name](urn:li:organization:ID) for a Page or @[Display Name](urn:li:person:ID) for a person; The token publishes as a real mention on LinkedIn and as plain @Display Name on other channels. | |
| channels | Yes | Array of channels to post to. Get channel IDs from list_channels. | |
| timezone | No | Timezone for scheduling (e.g. "America/New_York"). Defaults to UTC. | |
| postFormat | No | Post format. "post" (default), "video", "reel", "story", "carousel", or "thread" for multi-part threads. | |
| scheduledAt | No | ISO 8601 datetime for scheduling (e.g. 2025-01-15T10:00:00Z). Required when status is scheduled. | |
| threadParts | No | Thread parts array. Required when postFormat is thread (min 2 parts). EVERY part is measured against the character limit of every platform the post targets, not only the first — an over-long part is rejected with 400 VALIDATION_ERROR naming the part number, the platform and its limit. URLs count as 23 characters on X and Mastodon, their real length elsewhere. | |
| mediaFileIds | No | Array of media file IDs to attach. Upload media first with upload_media. | |
| platformContent | No | Per-platform content overrides, e.g. { "x": "Short tweet", "linkedin": "Longer LinkedIn post" }. | |
| requestApproval | No | Optional (default false). Set true to hold a scheduled post for team approval (approvalStatus becomes 'pending'). Forced on server-side for API keys of roles without post:publish (contributors), regardless of this flag. | |
| platformSpecific | No | Platform-specific settings, e.g. { "youtube": { "title": "…", "privacyStatus": "public" } }. Discord, Telegram, Tumblr and Snapchat nest their options under the BulkPublish channel id, e.g. { "discord": { "12": { "channelId": "1090123456789012345" } } }. Full per-platform option lists (polls, quotes, tags, drafts, settings) are on each platform key; bad values are refused with 400 VALIDATION_ERROR. | |
| postTypeOverrides | No | Per-platform post type override. E.g. { "instagram": "reel", "youtube": "short" }. Video length is checked per type when the post is scheduled or published, and a video outside the range is refused: instagram reel/feed_video 3s–15min, story 3–60s; facebook reel 3–90s, story 3–60s; threads video/carousel up to 5min; linkedin 3s–30min; pinterest video_pin at least 4s; snapchat story 5–60s, spotlight 6–60s (saved_story not checked). | |
| publishWhenApproved | No | Optional (default false). Set true on a post that waits for approval when it should go out as soon as it is approved, even if that is after its scheduled time. This is how someone who needs approval says 'publish now': status 'scheduled', scheduledAt = now, requestApproval true (or a contributor key), publishWhenApproved true. An approval arriving more than 15 minutes late then publishes immediately; with false it is approved but returned to draft for a new time. Stored only when the post ends up approvalStatus 'pending'; otherwise saved as false. | |
| linkTrackingOverride | No | Optional per-post override for link tracking (bulkpubli.sh). true forces links in this post to be shortened and their clicks counted, false forces them to publish as written, and null/omitted (the default) inherits the organization's Link Tracking setting. Shortening happens at publish time, per channel, so two accounts on the same platform get distinct codes; it is skipped for a channel when the rewrite would push the post past that platform's character limit (a short URL is 28 characters and can be longer than the link it replaces). Short links are part of the Pro and Business plans: on Free, links always publish as written and true has no effect. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| author | No | Who wrote the post: { id, name, image }. Null when that account is gone. |
| labels | No | |
| status | No | draft, scheduled, processing, published, partial or failed. |
| content | No | |
| approver | No | Who approved it: { id, name, image }. Null unless approvalStatus is approved. |
| assignee | No | Who is expected to act on it next: { id, name, image }. Null when nobody is. |
| timezone | No | |
| createdAt | No | |
| mediaFiles | No | |
| publishedAt | No | |
| scheduledAt | No | |
| postPlatforms | No | |
| approvalStatus | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, so the bar is lower, yet the description still adds real behavior: the post is never published immediately, and YouTube/TikTok reject image-only posts while Instagram silently defaults to feed_photo unless postTypeOverrides is set. It does not cover rate limits or the approval flow, but those live in the schema for requestApproval/publishWhenApproved.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short sentences, front-loaded with the core action, followed by platform constraints marked IMPORTANT, then the routing sentence. Every sentence adds either a behavior or a selection rule; nothing is redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 15 parameters with deep nested platform objects and an output schema, the description correctly stays high-level and covers the cross-cutting traps (media-required platforms, Instagram default post type, no immediate publish). It could have noted that Discord/Telegram/Tumblr/Snapchat options nest under the BulkPublish channel id, which is the trickiest structural detail, but that is documented in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does add meaning beyond the schema for two parameters by naming postTypeOverrides' role with video on Instagram, but it never mentions channels, status, scheduledAt, mediaFileIds, labels or threadParts by name, leaving the schema to carry it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new social media post') with the draft/scheduled scope spelled out, and explicitly separates itself from publish_post ('It never publishes immediately'). The remaining ambiguity is with the sibling compose_post, which the description never mentions, so an agent cannot tell create from compose without opening both schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use ('when the user wants to draft or schedule one new post') and a when-not (never publishes immediately; publish_post does that), plus platform exclusion rules for YouTube/TikTok and an Instagram default. It stops short of routing among the other write siblings (compose_post, update_post, create_media_upload).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_postDelete postADestructiveIdempotentInspect
Delete a post by ID. Only draft and failed posts can be deleted. Use this when the user wants to permanently remove a post.
| Name | Required | Description | Default |
|---|---|---|---|
| postId | Yes | The post ID to delete. |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint: true, so the destructive nature is known. The description adds the eligibility constraint (draft/failed only), which is behavioral context beyond the annotation. It also reinforces permanence with 'permanently remove,' adding a nuance not present in the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero redundancy. The action and constraint are front-loaded, and every word serves a purpose. It is efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple delete operation with one parameter, annotations cover destructiveness, an output schema exists, and the description provides the essential eligibility rule and usage trigger. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the postId parameter is already described as 'The post ID to delete.' The tool description adds no additional semantic detail beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('delete') and resource ('post'), identifies the identifier (postId), and clarifies the scope by limiting eligible posts to draft and failed ones. This clearly distinguishes it from sibling tools like publish_post or update_post.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use this when the user wants to permanently remove a post,' which provides a direct usage condition. It also adds an eligibility constraint ('Only draft and failed posts can be deleted'), implicitly excluding published posts. However, it does not name alternative tools explicitly, so the guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
finalize_media_uploadFinalize media uploadAInspect
Record an uploaded file as a media file after the browser PUT (pairs with create_media_upload; used by the composer UI). Use this when a presigned direct upload finished and the file must be registered (advanced).
| Name | Required | Description | Default |
|---|---|---|---|
| r2Key | Yes | The r2Key returned by create_media_upload. | |
| width | No | Pixel width (images/video). | |
| height | No | Pixel height (images/video). | |
| duration | No | Duration in seconds (video). | |
| fileName | Yes | Original file name. | |
| mimeType | Yes | File MIME type. | |
| sizeBytes | Yes | File size in bytes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| file | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state the tool is not read-only and not destructive, leaving the mutation nature clear. The description adds that it pairs with create_media_upload and is used by the composer UI, but does not disclose potential side effects (like what happens if called twice) or any authentication requirements. With annotations covering the basic safety profile, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with two sentences that front-load the core action and then provide usage guidance. No unnecessary words or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return values are assumed to be documented there. The description clarifies the step in the upload flow and the advanced nature, which is sufficient for a well-defined tool in a pipeline. Minor missing detail: preconditions like having a valid presigned upload, but this is implied by pairing with create_media_upload.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% coverage, so all parameters are described there. The description specifically mentions r2Key as returned by create_media_upload, which adds useful context, but does not explain the optional nature of width, height, and duration, or when they should be provided. This is adequate but not exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool records an uploaded file as a media file after a browser PUT, and explicitly pairs it with create_media_upload. This makes the tool's purpose specific and distinguishes it from the sibling create_media_upload and upload_media, which are likely for different stages of the upload process.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: 'Use this when a presigned direct upload finished and the file must be registered (advanced).' This tells the agent exactly when to invoke this tool and indicates it is for advanced scenarios, complementing create_media_upload which is the first step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_analyticsGet analyticsARead-onlyIdempotentInspect
Get an analytics summary for a date range. Returns total posts, status breakdown (published, failed, scheduled), per-platform stats, and daily post counts. Optional filters narrow every figure to matching posts; compare adds the equal-length previous window under previous (available for windows of 15 days or fewer — the 30-day statistics-retention cap applies). Use this when the user asks how their content performed overall, across channels and over a date range.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | End date in ISO format (e.g. 2025-01-31). | |
| tz | No | IANA timezone (e.g. "Asia/Karachi") that sets where each day starts and ends and how daily counts are grouped. Defaults to UTC; pass the user's zone so 'today' and daily figures match their calendar. | |
| from | Yes | Start date in ISO format (e.g. 2025-01-01). | |
| compare | No | Also return the previous equal-length window as `previous` / `previousWindow`. | |
| labelIds | No | Comma-separated label ids; a post matches when it carries ANY of them. | |
| mediaType | No | By the post's first media file: text (no media), image or video. | |
| platforms | No | Comma-separated platform keys to include, e.g. "x,linkedin". | |
| channelIds | No | Comma-separated channel ids to include, e.g. "12,15". | |
| postFormat | No | Only single posts or only threads. |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | No | |
| from | No | |
| byDay | No | |
| failed | No | |
| partial | No | |
| previous | No | |
| published | No | |
| scheduled | No | |
| byPlatform | No | |
| totalPosts | No | |
| previousWindow | No | |
| publishedTimes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered. The description adds genuinely new behavior: optional filters narrow every figure, compare returns the previous equal-length window, and it is only available for windows of 15 days or fewer under a 30-day retention cap. That constraint disclosure is exactly what annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler, with the output shape and the compare caveat front-loaded before the usage cue. Slightly dense in the parenthetical, but every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Nine parameters, two enums, and an output schema are all covered; the description explains scope, filter interaction, and the compare window limit without re-documenting return fields that the output schema already defines. Nothing required to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so a 3 would be the floor; the description earns above that by explaining that filters apply to every returned figure rather than just the list, and by restating the 15-day ceiling on compare that the schema itself does not mention.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (analytics summary for a date range) and enumerates what comes back: totals, status breakdown, per-platform stats, daily counts. It is clear on its own, but with siblings named view_analytics and get_post_metrics the description never draws the boundary between this tool and those, leaving the agent to infer which analytics endpoint applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use this when the user asks how their content performed overall, across channels and over a date range" gives a concrete triggering condition. It stops short of explicit exclusions or naming alternatives, so an agent comparing it against view_analytics or get_post_metrics still has to guess.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_conversationGet Inbox conversationARead-onlyIdempotentInspect
Get the messages of one Inbox conversation: the newest 500, oldest first, each with its direction (in from the other person, out sent by the workspace), text, attachments and time. Reading does not mark the conversation read. The Inbox is part of the Pro and Business plans; on other plans, or before it is available to the account, the call is refused with a message saying so. Use this when the user wants to read one Inbox conversation in full.
| Name | Required | Description | Default |
|---|---|---|---|
| conversationId | Yes | The conversation id from list_conversations. |
Output Schema
| Name | Required | Description |
|---|---|---|
| messages | No | |
| conversationId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the read-only, idempotent, non-destructive profile, and the description adds real behavioral context on top: the 500-message cap, oldest-first ordering, per-message fields, the fact that reading does not mark the conversation read, and the plan-gating refusal. That is substantive disclosure beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with what is returned and immediately followed by the side-effect caveat and the availability caveat. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be re-explained, yet the description still summarizes the payload fields. Combined with the read-does-not-mark-read note and the plan gating, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single conversationId parameter is documented in the schema as coming from list_conversations, so the baseline of 3 applies. The description adds no format or sourcing detail beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the messages of one Inbox conversation') and pins the scope to a single conversation, which clearly separates it from list_conversations. An agent can tell what it retrieves without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Use this when the user wants to read one Inbox conversation in full') and a pre-condition (Pro/Business plans, otherwise the call is refused). It never names a sibling such as list_conversations or reply_to_conversation as the alternative, so routing is clear but not fully disambiguated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_postGet postARead-onlyIdempotentInspect
Get a single post by ID with full details including platform statuses, labels, media files, recurring schedule info, and metrics. For a thread post, threadParts holds the parts and threadMediaFiles resolves the media they reference: that media is NOT in mediaFiles, which carries only the media on the post itself. Use this when the user references one specific post by its ID.
| Name | Required | Description | Default |
|---|---|---|---|
| postId | Yes | The post ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| author | No | Who wrote the post: { id, name, image }. Null when that account is gone. |
| labels | No | |
| status | No | draft, scheduled, processing, published, partial or failed. |
| content | No | |
| approver | No | Who approved it: { id, name, image }. Null unless approvalStatus is approved. |
| assignee | No | Who is expected to act on it next: { id, name, image }. Null when nobody is. |
| timezone | No | |
| createdAt | No | |
| mediaFiles | No | |
| publishedAt | No | |
| scheduledAt | No | |
| postPlatforms | No | |
| approvalStatus | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds valuable behavioral nuance about thread posts: threadParts and threadMediaFiles behave differently from mediaFiles, which is not inferable from annotations or the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the core purpose, the thread nuance, and the usage trigger. The most important information is front-loaded, and there is no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with a full output schema, the description covers the needed call context and clarifies a non-obvious data placement behavior. Nothing essential is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the only parameter, postId, is already documented as 'The post ID.' The description reinforces that the ID selects a single post but adds no additional format or constraint details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Get a single post by ID') and resource, with an explicit enumeration of what 'full details' includes. It clearly distinguishes this from sibling tools like list_posts and get_post_metrics by anchoring on a single post ID.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The final sentence gives an explicit trigger: 'Use this when the user references one specific post by its ID.' It does not name alternatives such as list_posts for multiple posts, so there is a clear usage context but no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_post_metricsGet post metricsARead-onlyIdempotentInspect
Get engagement metrics for a published post. Returns likes, comments, shares, impressions, and other platform-specific metrics. IMPORTANT: every platform entry carries metricsSupported and supportedMetrics — a metric key NOT in supportedMetrics is stored as 0 because that platform's API has no such field, so report it as unavailable rather than as zero. X reports impressions/likes/comments/shares/saves (bookmarks); Bluesky and Mastodon report no impressions; Pinterest reports no reach; YouTube reports no shares or reach; Discord reports likes (reaction counts) and comments (thread replies); TikTok reports reach, saves and clicks only for accounts that have granted TikTok insights. An Instagram story reports only impressions, reach and comments (story replies). Google Business, Telegram, Tumblr and LinkedIn personal profiles report nothing readable at all, and an X post comes back with metricsSupported: false until its channel turns on X metrics sync. Each platform entry also carries linkClicks (summed in totals.linkClicks): clicks on bulkpubli.sh short links in this post, measured by BulkPublish rather than reported by the platform. It sits OUTSIDE latest and is distinct from the platform's own clicks — one visit can register in both, so never add them together. It is therefore available even for the platforms that report nothing, and supportedMetrics always includes it. Bot and link-preview traffic is excluded; it is 0 for organizations without Link Tracking enabled. Use this when the user asks how a specific post performed (likes, views, engagement).
| Name | Required | Description | Default |
|---|---|---|---|
| postId | Yes | The post ID to get metrics for. |
Output Schema
| Name | Required | Description |
|---|---|---|
| postId | No | |
| totals | No | |
| platforms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe, idempotent, closed read, so the description is free to add interpretation-critical behavior: the metricsSupported/supportedMetrics contract, per-platform reporting quirks (Bluesky/Mastodon no impressions, TikTok insights gating, X metrics sync), the linkClicks-vs-clicks distinction and the explicit warning never to sum them, and bot/link-preview exclusion. This is exactly the extra context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and every sentence carries non-obvious operational detail, but at ~230 words for a one-parameter read it is long, and much of the per-platform metric inventory overlaps with what the output schema could document.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool whose risk is misinterpreting cross-platform metrics, the description covers the value contract, per-platform support matrix, link-click semantics, and traffic exclusions. With an output schema present it does not need to explain return shape, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (postId) with 100% schema description coverage, so the schema already documents it. The description adds no syntax, format, or sourcing detail for postId, leaving the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get engagement metrics for a published post') and enumerates what comes back (likes, comments, shares, impressions). The 'for a published post' scoping implicitly separates it from the aggregate get_analytics/view_analytics siblings, but no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing sentence gives explicit when-to-use guidance: 'Use this when the user asks how a specific post performed (likes, views, engagement).' That is a clear selection trigger, though it names no alternative tool and gives no when-not boundary against get_analytics or get_post.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_queue_slotGet next queue slotARead-onlyIdempotentInspect
Get the organization's next available queue slot. Useful for finding the next optimal scheduling time. Use this when the user asks when the next available scheduling slot is, or wants a post moved to the top or bottom of the queue (then update_post with the returned scheduledAt).
| Name | Required | Description | Default |
|---|---|---|---|
| position | No | "next" (default): the next free slot. "end": the slot after the last pending scheduled post, i.e. the bottom of the queue. | |
| timezone | No | IANA timezone for the slot calculation (e.g. "America/New_York"). Defaults to UTC. | |
| excludePostId | No | When the slot is for rescheduling an existing post, its ID — so its current slot is not counted as booked. |
Output Schema
| Name | Required | Description |
|---|---|---|
| dayLabel | No | Human label, e.g. "Today" or "Wed, Feb 14". |
| scheduledAt | No | ISO timestamp of the next free slot. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, and idempotentHint, covering the safety profile. The description adds useful behavioral context beyond those annotations: the tool returns a scheduledAt value intended to be passed to update_post for queue repositioning, and it frames the result as the next available or end-of-queue slot. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler. The tool's core action is front-loaded, followed by the use-case guidance and the companion-tool workflow. Every sentence contributes to selection or invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, idempotent tool with zero required parameters, full schema parameter coverage, and an output schema present, the description is complete. It explains when to reach for the tool and what to do with its result, while the structured data handles parameter details and return shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage with detailed descriptions for all parameters, including the position enum, timezone format, and excludePostId semantics. The description adds only general context about 'top or bottom of the queue,' which maps loosely to the position parameter but does not materially improve on the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pair: "Get the organization's next available queue slot." It also clarifies the purpose as finding the next optimal scheduling time, and it implicitly distinguishes itself from the content-management siblings by framing the tool as a scheduling-position query rather than a post creation or editing operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: when the user asks for the next available scheduling slot or wants a post moved to the top/bottom of the queue. It even names the follow-up action, update_post with the returned scheduledAt, which gives the agent a clear invocation path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_channelsList channelsARead-onlyIdempotentInspect
List all connected social media channels (X/Twitter, Instagram, LinkedIn, Facebook, TikTok, etc.). Returns channel ID, platform, account name, and token status, plus a capabilities object saying whether the caller may create, publish or approve posts. Check that before attempting a write rather than discovering the permission from a 403. Use this when the user wants to see which social accounts are connected.
| Name | Required | Description | Default |
|---|---|---|---|
| active | No | Filter by active status. Defaults to true (only active channels). |
Output Schema
| Name | Required | Description |
|---|---|---|
| channels | No | |
| capabilities | No | Whether the caller may create, publish or approve posts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context by explaining that the tool returns a `capabilities` object that indicates whether the caller may create, publish, or approve posts, and advises checking it before a write to avoid a 403. This goes beyond the annotations and helps the agent understand the tool's role in the workflow.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it states the core purpose first, then the return fields, then the capabilities warning, then the usage trigger. Every sentence earns its place, and the structure is logical for an agent scanning for when to use the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return values are documented elsewhere. The description covers the key behavioral aspect (capabilities check) and the usage context. It doesn't mention pagination or rate limits, but for a simple list tool with one optional parameter and an output schema, the description is sufficiently complete. A 4 is appropriate because it adds the capabilities context that is crucial for the agent's decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single parameter `active` is fully documented in the schema. The description doesn't add extra parameter semantics beyond what the schema provides, but it does mention the default behavior ('Defaults to true') which is already in the schema. Baseline 3 is appropriate since the schema carries the parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and resource ('all connected social media channels'), enumerates the platforms, and lists the returned fields. It distinguishes itself from sibling tools like view_channels by focusing on the channel listing with token status and capabilities, making it clear what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this when the user wants to see which social accounts are connected.' It also provides a clear directive to check the `capabilities` object before attempting a write, which guides the agent on when to use this tool versus attempting a write operation directly. This is strong usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_conversationsList Inbox conversationsARead-onlyIdempotentInspect
List Inbox conversations: direct messages, reviews and comment threads across the connected channels, newest activity first. Each conversation has its platform, kind (dm, review or comment), the other person, unread count, a preview of the last message, and canReply with replyNotice saying why a reply cannot be sent now. Internal team notes are not included. Results are paged: pass nextCursor back as cursor for the next page. The Inbox is part of the Pro and Business plans; on other plans, or before it is available to the account, the call is refused with a message saying so. Use this when the user asks about their direct messages, reviews or comment threads, or what is waiting for a reply.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Search the person's name and handle and the message text (2 to 100 characters). | |
| kind | No | Only direct messages, reviews or comment threads. Omit for all. | |
| limit | No | Page size, 1 to 100 (default 50). | |
| cursor | No | nextCursor from the previous page. | |
| status | No | open (default), archived or snoozed. | |
| assigned | No | me, unassigned, or a teammate's user id. | |
| channelId | No | Only this channel. | |
| platforms | No | Only these platforms, e.g. ["instagram", "facebook"]. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | How many conversations match the filters, across every page. |
| offset | No | Where this page started when paging by position; 0 when paging by cursor. |
| nextCursor | No | Pass back as cursor for the next page; null on the last page. |
| conversations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description still adds substantial context beyond them: newest-activity-first ordering, the exclusion of internal team notes, the canReply/replyNotice mechanism, cursor-based paging, and the Pro/Business plan gate that causes a refusal with an explanatory message. That is genuinely useful behavior an agent cannot infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and resource, then ordering, contents, exclusions, pagination, plan gate, and when-to-use — each sentence carries distinct information. It is dense rather than padded, though the field-level enumeration of conversation contents is arguably redundant given the output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a paged, plan-gated list tool with eight optional filters and an output schema, the description covers everything an agent needs: what is returned at a summary level, what is excluded, how to page, and the failure mode on non-Pro plans. The output schema handles return-value detail, so nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all eight parameters are already documented, including the q, kind, limit, cursor, status, assigned, channelId and platforms filters. The description only reinforces the cursor round-trip ('pass nextCursor back as cursor'), which is a minor addition over the schema's own wording. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List Inbox conversations') and immediately enumerates the three kinds it spans (direct messages, reviews, comment threads). This distinguishes it from get_conversation (single item) and list_post_comments (post-scoped) without the agent opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The final sentence gives a clear triggering condition: 'Use this when the user asks about their direct messages, reviews or comment threads, or what is waiting for a reply.' It also flags the plan prerequisite and the refusal behavior. It does not explicitly name which sibling to use instead for a single conversation or for post comments, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_mediaList mediaARead-onlyIdempotentInspect
List uploaded media files with optional search and pagination. Returns file metadata including URLs, dimensions, and labels. Use this when the user wants a list of their uploaded media files.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1). | |
| type | No | Filter by media kind: image, video or document (PDF, Word and PowerPoint files). Omit for all files. The response's `total` counts matches across all pages. | |
| limit | No | Results per page (default 20, max 100). | |
| search | No | Search by filename. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | No | |
| files | No | |
| limit | No | |
| total | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is fully covered without the description. The added behavioral content is the return shape (URLs, dimensions, labels), which is largely redundant given an output schema exists. No pagination-overflow or search-matching behavior beyond what the schema says.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with the action and scope front-loaded and no filler or hedging. The returns clause is mildly redundant given the output schema, which is the only thing keeping this from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, zero-required-param list tool with full annotation coverage, an output schema, and 100% schema documentation, the description is sufficient to call the tool correctly. Only the sibling disambiguation (view_media vs list_media) is thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so page, limit, type and search are already fully documented in the schema, including defaults, max, and enum semantics. The description only echoes 'optional search and pagination' and adds no syntax, format, or matching nuance beyond that. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('uploaded media files') plus the two modifiers that shape results, search and pagination. It contrasts implicitly with the singular view_media and the write-side upload_media/create_media_upload, but never names a sibling or draws the boundary explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this when the user wants a list of their uploaded media files' gives a usage context, but it largely restates the stated purpose rather than adding routing information. There is no when-not guidance and no mention of view_media for a single asset or list_posts for correlated content, so selection against the 26 siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_post_commentsList post commentsARead-onlyIdempotentInspect
List the comments and reactions on one published post, per channel, read from each platform. Each channel's entry has its postPlatformId and each comment its id, which reply_to_comment and moderate_comment take, plus commentActions listing the actions that channel supports. Some platforms have no comment access (TikTok, Pinterest, Google Business, Telegram, Snapchat) and say so in a notice. Use this when the user asks who commented on one of their published posts, or needs a comment's id to reply to or moderate it.
| Name | Required | Description | Default |
|---|---|---|---|
| postId | Yes | The post id. | |
| commentsLimit | No | Max comments per channel (default 25, max 100). |
Output Schema
| Name | Required | Description |
|---|---|---|
| postId | No | |
| platforms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, so the bar is lower, and the description adds genuine context beyond them: per-channel response shape, the postPlatformId/commentActions fields, and explicit unsupported-platform notices. It stops short of noting pagination or rate behavior, but the coverage is strong for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with purpose and response structure before usage. Every sentence carries information, though the last usage sentence overlaps somewhat with the routing already implied earlier.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description still sketches the per-channel/per-comment structure and the commentActions field. Combined with platform caveats and usage routing, an agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents postId and commentsLimit (including default and max). The description adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list), resource (comments and reactions), and scope (one published post, per channel, read from each platform). It also distinguishes itself from sibling tools reply_to_comment and moderate_comment by naming them as consumers of the returned ids.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('when the user asks who commented... or needs a comment's id to reply to or moderate it') and routes to the sibling tools that need that id. It also documents platform exclusions (TikTok, Pinterest, Google Business, Telegram, Snapchat), which is real when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_postsList postsARead-onlyIdempotentInspect
List posts with optional filters for status, search text, date range, channel, and label. Returns paginated results with platform statuses and metrics, ordered newest-first by publishedAt if the post is live, else scheduledAt, else createdAt. Use this when the user wants to browse, filter, or check the status of existing posts as raw data (not the visual dashboard).
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Filter posts created on or before this ISO date. | |
| from | No | Filter posts created on or after this ISO date. | |
| page | No | Page number (default 1). | |
| limit | No | Results per page (default 20, max 500). | |
| order | No | Direction of the timeline sort (published, else due, else created). 'desc' is the default and returns the most recent first. Use 'asc' to read what is coming NEXT — with a limit, 'desc' returns the posts scheduled furthest out, not the soonest. | |
| search | No | Search post content (case-insensitive). | |
| status | No | Filter by post status. | |
| labelId | No | Filter by label ID. | |
| channelId | No | Filter by channel ID. | |
| assignedTo | No | Filter by who the post is assigned to: a user id, 'me' for the caller, or 'unassigned'. Orthogonal to status — a post can be scheduled AND assigned. | |
| scheduledTo | No | Filter posts scheduled on or before this ISO date. | |
| scheduledFrom | No | Filter posts scheduled on or after this ISO date. | |
| approvalStatus | No | Filter by team approval state (e.g. 'pending' for the approval queue). |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | No | |
| limit | No | |
| posts | No | |
| total | No | |
| totalPages | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds genuine behavioral context beyond annotations: pagination, platform statuses and metrics in results, and the exact ordering rule (publishedAt if live, else scheduledAt, else createdAt). This is useful operational detail not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no wasted words. It front-loads the core purpose and filters, then gives return/ordering behavior, then a usage context. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 13-parameter list tool, the description covers what the tool returns, how results are ordered, pagination, and when to use it, while the schema and output schema cover parameter details. No critical aspect needed to invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 13 parameters in detail. The description adds a helpful high-level summary of filter categories and clarifies the ordering semantics, but it does not meaningfully add parameter-level meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List posts') and immediately enumerates the optional filter dimensions: status, search text, date range, channel, and label. It also distinguishes itself from visual-dashboard siblings by explicitly positioning this tool as returning raw data, so an agent can tell list_posts from view_posts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear trigger: 'Use this when the user wants to browse, filter, or check the status of existing posts as raw data.' It also implies a boundary with 'not the visual dashboard,' but it does not explicitly name alternative tools or state when not to use them, so it stops short of full exclusionary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moderate_commentLike, hide or delete commentADestructiveInspect
Like, unlike, hide, unhide or delete a comment on one of the workspace's published posts, on the platform, as the channel the post was published to. Likes and hides can be undone; delete is permanent and needs a role that can publish. Hiding or deleting also removes the comment from the Inbox. Which actions a channel supports is in its commentActions from list_post_comments (Threads supports hide and unhide; Facebook supports hide, unhide and delete). A comment hidden on Threads or Facebook comes back with hidden: true. If the channel's connection has stopped working, the call is refused and the channel needs reconnecting from the Channels page. Replying to and moderating comments is on every plan except Free; on Free, or before it is available to the account, the call is refused with a message saying so. Use this when the user wants to like, hide or delete a comment on one of their published posts.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | What to do with the comment. | |
| postId | Yes | The post id. | |
| commentId | Yes | The comment's id from list_post_comments. | |
| postPlatformId | Yes | The channel's postPlatformId from list_post_comments. |
Output Schema
| Name | Required | Description |
|---|---|---|
| action | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: likes and hides are reversible while delete is permanent and requires a publish-capable role, hiding/deleting removes the comment from the Inbox, per-channel action support differs (Threads vs Facebook), hidden state returns as hidden: true, broken connections cause refusal, and the feature is plan-gated outside Free.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action list and resource, then stacks the behavioral constraints efficiently in dense sentences. The closing "Use this when..." sentence partly restates the opening and drops unlike/unhide, making it the one weakly-earning line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be described, and the description still covers the relevant result state (hidden: true). It also anticipates the main failure modes an agent will hit: unsupported action per channel, dead connection, and plan gating.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning to the action enum by explaining which values each channel actually supports, and clarifies that postId/postPlatformId/commentId come from a published post and list_post_comments respectively. It does not add format details for the numeric ids, which the schema already covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States exact verbs (like, unlike, hide, unhide, delete), the resource (a comment on a published post), and the acting identity (the channel the post was published to). It is immediately distinguishable from reply_to_comment and from list_post_comments, which it explicitly references as the source of ids and action capabilities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use this when the user wants to like, hide or delete a comment on one of their published posts" gives a clear trigger, and the channel-capability note directs the agent to check commentActions from list_post_comments before calling. It does not explicitly route replying to the reply_to_comment sibling, only implying the separation via the plan note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_postPublish post nowADestructiveInspect
Publish a draft or scheduled post immediately. The post will be queued for publishing to all its target channels. Requires a role with post:publish — contributors get 403 APPROVAL_REQUIRED and must submit the post for approval instead (create/update with requestApproval, then a teammate approves). To 'publish now' with approval, create_post with status 'scheduled', scheduledAt = now, requestApproval true and publishWhenApproved true, so it goes out the moment it is approved. Publishing a pending/rejected post as an approver implicitly approves it. Use this when the user wants to publish an existing draft or scheduled post right now.
| Name | Required | Description | Default |
|---|---|---|---|
| postId | Yes | The post ID to publish. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| author | No | Who wrote the post: { id, name, image }. Null when that account is gone. |
| labels | No | |
| status | No | draft, scheduled, processing, published, partial or failed. |
| content | No | |
| approver | No | Who approved it: { id, name, image }. Null unless approvalStatus is approved. |
| assignee | No | Who is expected to act on it next: { id, name, image }. Null when nobody is. |
| timezone | No | |
| createdAt | No | |
| mediaFiles | No | |
| publishedAt | No | |
| scheduledAt | No | |
| postPlatforms | No | |
| approvalStatus | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds significant context beyond the annotations: the post is queued to all target channels, requires a post:publish role, and publishing a pending/rejected post as an approver implicitly approves it. These side effects and permission boundaries are not conveyed by readOnlyHint, destructiveHint, or idempotentHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than minimal, but each sentence earns its place: action and effect, permission requirement, contributor failure mode, approval workaround, implicit approval behavior, and final use-case summary. It could be tightened slightly, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutating tool, this covers when to use it, who can use it, the failure mode, the workaround, and the queuing side effect. An output schema exists, so return-value details are not needed, and nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents the single parameter postId at 100% coverage, so the description does not need to restate it. It usefully implies the post must already be a draft or scheduled post, but adds no format or validation detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Publish a draft or scheduled post immediately.' Closes with the precise use case ('existing draft or scheduled post right now'), which clearly differentiates it from create, update, retry, and delete siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use this tool and when not to: contributors get 403 APPROVAL_REQUIRED and must instead use create/update with requestApproval. It even provides the exact create_post parameters for the approval-based 'publish now' path, leaving no ambiguity about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_to_commentReply to commentADestructiveInspect
Reply to a comment on one of the workspace's published posts. The reply is posted publicly on the platform right away, as the channel the post was published to, and it cannot be taken back from here. Up to 2,000 characters. If the channel's connection has stopped working, the call is refused and the channel needs reconnecting from the Channels page. Comment replies are on every plan except Free; on Free, or before they are available to the account, the call is refused with a message saying so. Use this when the user wants to answer a comment on one of their published posts.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The reply text. | |
| postId | Yes | The post id. | |
| commentId | Yes | The comment's id from list_post_comments. | |
| rootCommentId | No | When replying to a reply: the thread's top-level comment id (Instagram and YouTube). | |
| postPlatformId | Yes | The channel's postPlatformId from list_post_comments. |
Output Schema
| Name | Required | Description |
|---|---|---|
| replyId | No | |
| success | No | |
| accountName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give the generic write/destructive/open-world profile; the description adds the material specifics: the reply is published publicly and immediately under the channel's identity, it cannot be undone from here, there is a 2,000-character ceiling, and the call is refused (with an explanatory message) when the channel connection is broken or the plan doesn't include replies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose, visibility, irreversibility and eligibility are front-loaded and every sentence carries information. The public/immediate posting and irreversibility points are stated twice in slightly different words, which is minor padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description covers the remaining agent-relevant context: public posting, irreversibility, length cap, and both refusal paths (broken connection, plan restriction). Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description restates the 2,000-character limit that the schema's maxLength already encodes and says nothing about postId, commentId, postPlatformId, or the rootCommentId used for threaded replies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (reply) and resource (a comment on one of the workspace's published posts), and scopes it away from conversation replies and comment moderation, which are handled by siblings like reply_to_conversation and moderate_comment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Ends with an explicit trigger: 'Use this when the user wants to answer a comment on one of their published posts,' plus concrete eligibility conditions (all plans except Free; connection must be live). It does not name an alternative tool or state when not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_to_conversationReply in Inbox conversationADestructiveInspect
Send a reply in an Inbox conversation. The message goes to the person on the platform right away, from the channel the conversation belongs to, and it cannot be unsent. Send text (up to 4,000 characters), up to 4 media library files, or both; reviews and comment threads take text only. Facebook Messenger and Instagram accept a reply only within 24 hours of the person's last message; after that the call is refused. If the channel's connection has stopped working, the call is refused and the channel needs reconnecting from the Channels page. The Inbox is part of the Pro and Business plans; on other plans, or before it is available to the account, the call is refused with a message saying so. Use this when the user wants to answer a direct message, review or comment thread in their Inbox.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | The reply text. | |
| mediaIds | No | Media library file ids to attach (direct messages only). | |
| conversationId | Yes | The conversation id from list_conversations. | |
| replyToMessageId | No | Comment threads only: the id of the incoming message to answer. Defaults to the newest one from the other person. |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| messageId | No | The platform's id for the sent message. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only mark this as non-read-only, non-idempotent and destructive; the description adds substantial operational detail beyond that: the message is irreversible ('cannot be unsent'), the 24-hour channel window, refusal conditions for broken channel connections, and plan-based refusal behavior. This is exactly the kind of behavioral context the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single dense paragraph, but it is front-loaded with the action and its irreversibility, then layers limits, channel constraints, and plan gating in a logical order. Every sentence carries a distinct constraint, though the block could be broken up for faster scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description instead covers the dimensions an agent actually needs: reversibility, channel-specific time limits, media/text restrictions, and the failure modes (refused calls) for connection and plan issues.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so a baseline of 3 applies, but the description adds real meaning: the 4,000-character text limit, the cap of four media files, the fact that reviews and comment threads are text-only, and that replyToMessageId is comment-thread specific. These constraints go beyond the raw schema field types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Send a reply in an Inbox conversation') and scopes it to direct messages, reviews and comment threads. This clearly separates it from sibling tools like reply_to_comment, create_post, or moderate_comment without needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit trigger context ('Use this when the user wants to answer a direct message, review or comment thread in their Inbox') plus concrete preconditions: 24-hour Messenger/Instagram window, channel connection health, and Pro/Business plan gating. It stops short of naming alternative tools for out-of-window or non-Inbox cases, so the routing is implied rather than fully spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
retry_postRetry failed postADestructiveInspect
Retry publishing a failed or partially failed post. Only retries the platforms that failed, not the ones that already succeeded. Platforms in status 'unconfirmed' (the publish request may have reached the platform but its response was lost — the post may already be live) are NOT retried unless republish is true; if the post has unconfirmed platforms and no failed ones, the call fails with a 400 and code UNCONFIRMED_REQUIRES_REPUBLISH — ask the user to check the account on the platform, and only pass republish: true after they confirm the post is not live. Use this when a post failed on some platforms and the user wants to retry just those.
| Name | Required | Description | Default |
|---|---|---|---|
| postId | Yes | The post ID to retry. | |
| republish | No | Explicit opt-in to also retry platforms in status 'unconfirmed'. Their publish may have already gone through, so this can DUPLICATE the post — only pass true after the user has checked the account and confirmed the post is not live. Defaults to false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| author | No | Who wrote the post: { id, name, image }. Null when that account is gone. |
| labels | No | |
| status | No | draft, scheduled, processing, published, partial or failed. |
| content | No | |
| approver | No | Who approved it: { id, name, image }. Null unless approvalStatus is approved. |
| assignee | No | Who is expected to act on it next: { id, name, image }. Null when nobody is. |
| timezone | No | |
| createdAt | No | |
| mediaFiles | No | |
| publishedAt | No | |
| scheduledAt | No | |
| retriedCount | No | How many destinations were retried. |
| postPlatforms | No | |
| approvalStatus | No | |
| skippedMaxRetries | No | Destinations skipped for hitting the retry ceiling. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive and non-idempotent behavior, but the description adds critical context: it explains that only failed platforms are retried, that unconfirmed platforms are excluded unless republish=true, and that using republish can duplicate posts. It also discloses the exact error behavior (400 with code UNCONFIRMED_REQUIRES_REPUBLISH) and instructs how to handle it. This goes well beyond the annotations and is essential for safe invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is thorough and slightly long, but every sentence contributes necessary details: purpose, platform scoping, unconfirmed handling, error guidance, and usage condition. It is front-loaded with the core action and then elaborates logically. No redundancy is present; it earns its length, though it could be trimmed slightly without losing value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (subtle platform statuses, error handling, user interaction) and the presence of an output schema, the description covers everything an agent needs: purpose, scope, parameter semantics, error behavior, and actionable guidance. The output schema handles return values, so no gaps are apparent. This is a complete, self-sufficient description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are documented. The description adds significant meaning for republish: clarifying the exact condition for passing true (after user confirmation), the risk of duplication, and the error scenario. It also reinforces the purpose of postId. While the baseline for full schema coverage is 3, the added semantic depth for republish justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Retry publishing a failed or partially failed post.' It immediately clarifies scope by stating it only retries failed platforms, not successful ones, which distinguishes it clearly from sibling tools like create_post or publish_post. The purpose is unmistakable and precise.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: 'Use this when a post failed on some platforms and the user wants to retry just those.' It also provides detailed conditions for the republish parameter, explains the UNCONFIRMED_REQUIRES_REPUBLISH error case, and advises how to interact with the user. This is exemplary usage guidance, including both when-to-use and when-not-to.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_conversationUpdate Inbox conversationAIdempotentInspect
Change how the workspace handles one Inbox conversation: mark it read or unread, archive or reopen it, snooze it until a time (at most 90 days out), or assign it to a teammate, who is notified. Nothing is sent to the other person and nothing changes on the platform. Send at least one field. The Inbox is part of the Pro and Business plans; on other plans, or before it is available to the account, the call is refused with a message saying so. Use this when the user wants to mark a conversation read or unread, archive or reopen it, snooze it, or assign it to a teammate.
| Name | Required | Description | Default |
|---|---|---|---|
| read | No | true marks it read, false unread. | |
| status | No | archived archives it, open reopens it. Either clears a snooze. | |
| snoozedUntil | No | ISO timestamp in the future to snooze until; null unsnoozes. | |
| assignedUserId | No | A workspace member's user id; null unassigns. | |
| conversationId | Yes | The conversation id from list_conversations. |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (not read-only, idempotent, non-destructive). The description adds genuinely non-obvious behavior: the 90-day snooze ceiling, that assigning notifies the teammate, that no message is sent and no platform state changes, that at least one field must be supplied, and that the call is refused on non-Pro/Business plans or before Inbox availability.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the operations and side-effect caveat, and each sentence carries information. The final sentence restates the same four operations already enumerated in sentence one, which is mild redundancy but also serves as an explicit usage trigger.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain returns, and it covers the remaining agent-critical gaps: plan gating, refusal behavior, no outbound message, teammate notification, snooze bounds, and the minimum-field requirement. An agent can call this correctly without further inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description contributes constraints the schema does not state: the 90-day maximum for snoozedUntil and the 'send at least one field' requirement beyond the single required conversationId. It does not add format or interaction detail (e.g., that status clears a snooze) beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (change how the workspace handles) plus the resource (one Inbox conversation) and enumerates the four concrete operations. It is immediately distinguishable from get_conversation, list_conversations, and reply_to_conversation, especially via the explicit note that nothing is sent to the other person.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing sentence gives a clear when-to-use trigger ('Use this when the user wants to mark a conversation read or unread, archive or reopen it, snooze it, or assign it to a teammate') and the 'nothing is sent' clause implicitly excludes reply_to_conversation. It never names an alternative sibling tool explicitly, so it stops short of a full when/when-not/alternative treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_postUpdate postADestructiveIdempotentInspect
Update an existing post. Can change content, schedule, media, labels, status, and platform-specific settings. Only draft, scheduled, failed, or partial posts can be edited; editing a failed post resets it to draft, a partial post stays partial. Set status to 'draft' or 'scheduled' to move the post between those states — scheduling a partial post re-queues only its failed channels; use publish_post to publish immediately. Use this when the user wants to edit an existing post.
| Name | Required | Description | Default |
|---|---|---|---|
| postId | Yes | The post ID to update. | |
| status | No | Move the post between draft and scheduled. 'scheduled' requires a future scheduledAt (in this call or already stored) and at least one channel; 'draft' unschedules it. Any other value is rejected. Omit to leave the status unchanged. To publish immediately, use publish_post instead. | |
| content | No | New post text content. | |
| labelIds | No | Replace label IDs on the post. | |
| timezone | No | Timezone for scheduling. | |
| scheduledAt | No | New ISO 8601 scheduled datetime. | |
| mediaFileIds | No | Replace attached media file IDs. | |
| requestApproval | No | Optional (default false). Set true to hold a scheduled post for team approval (approvalStatus becomes 'pending'). Forced on server-side for API keys of roles without post:publish (contributors), regardless of this flag. | |
| platformSpecific | No | Platform-specific settings, e.g. { "youtube": { "title": "…", "privacyStatus": "public" } }. Discord, Telegram, Tumblr and Snapchat nest their options under the BulkPublish channel id, e.g. { "discord": { "12": { "channelId": "1090123456789012345" } } }. Full per-platform option lists (polls, quotes, tags, drafts, settings) are on each platform key; bad values are refused with 400 VALIDATION_ERROR. | |
| ifUnmodifiedSince | No | Optional precondition: the post's updatedAt exactly as the last read returned it. The update is refused with 409 CONFLICT if a teammate has changed the post since, rather than overwriting their version. Pass it whenever you read a post before editing it; omit it to keep the previous last-write-wins behaviour. | |
| postTypeOverrides | No | Per-platform post type override. E.g. { "instagram": "reel", "youtube": "short" }. Video length is checked per type when the post is scheduled or published, and a video outside the range is refused: instagram reel/feed_video 3s–15min, story 3–60s; facebook reel 3–90s, story 3–60s; threads video/carousel up to 5min; linkedin 3s–30min; pinterest video_pin at least 4s; snapchat story 5–60s, spotlight 6–60s (saved_story not checked). | |
| publishWhenApproved | No | Optional. Set true to have the post go out as soon as it is approved, even after its scheduled time (see create_post). An explicit value is stored while the post waits for approval. Omitted, it is kept, except that sending a different scheduledAt clears it to false, and it is always false once the post is no longer approvalStatus 'pending'. | |
| linkTrackingOverride | No | Optional per-post override for link tracking (bulkpubli.sh). true forces links in this post to be shortened and their clicks counted, false forces them to publish as written, and null clears the override so the post inherits the organization's Link Tracking setting again. Omit to leave it unchanged. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| author | No | Who wrote the post: { id, name, image }. Null when that account is gone. |
| labels | No | |
| status | No | draft, scheduled, processing, published, partial or failed. |
| content | No | |
| approver | No | Who approved it: { id, name, image }. Null unless approvalStatus is approved. |
| assignee | No | Who is expected to act on it next: { id, name, image }. Null when nobody is. |
| timezone | No | |
| createdAt | No | |
| mediaFiles | No | |
| publishedAt | No | |
| scheduledAt | No | |
| postPlatforms | No | |
| approvalStatus | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavior beyond the destructiveHint annotation: only draft/scheduled/failed/partial posts are editable, a failed post resets to draft, a partial post stays partial, and re-scheduling a partial post re-queues only its failed channels. These are non-obvious side effects an agent needs. Concurrency preconditions and the approval flow exist only in the schema, not the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then constraints, then the alternative tool. Every sentence carries information, though the closing 'Use this when the user wants to edit an existing post' largely restates the opening sentence and could be folded in.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 13-parameter mutation tool with a rich output schema, the description covers the critical decision inputs: eligibility, state transitions, and the publish-vs-schedule fork. Gaps like approval handling and the optimistic-concurrency precondition are absorbed by the schema's own field descriptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with rich per-field documentation, so the baseline is 3. The description's enumeration of changeable fields (content, schedule, media, labels, status, platform-specific) loosely maps to parameters but adds no syntax or constraint detail beyond what the schema already supplies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update an existing post') and immediately enumerates the editable surface (content, schedule, media, labels, status, platform-specific settings). This distinguishes it cleanly from create_post, compose_post, and publish_post.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes immediate publishing to publish_post and names the eligible post states, so the agent knows when the call will succeed. It stops short of contrasting with sibling editing/retry paths such as retry_post or create_post for cloned content, so the coverage is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_mediaUpload mediaAInspect
Upload a media file (image, video or document) from a URL or local file path. The file is stored in BulkPublish for use in posts. Supported formats: JPEG, PNG, WebP, GIF, MP4, MOV, WebM, and documents (PDF, Word .doc/.docx, PowerPoint .ppt/.pptx). Max 100MB. A document has no thumbnail or preview and can only be published to LinkedIn, as a document post. Provide either url OR filePath, not both. Use this when the user provides an image, video or document to attach to a post.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Public URL of the media file to upload. | |
| file | No | A file provided by the chat host. Leave unset and use url otherwise. | |
| filePath | No | Absolute path to a local file to upload (e.g. /Users/me/photo.png). | |
| filename | No | Optional filename. If omitted, derived from the URL or file path. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| url | No | |
| file | No | |
| filename | No | |
| mimeType | No | |
| sizeBytes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=true, so the write/non-destructive profile is covered. The description adds genuinely non-structural behavior: 100MB size ceiling, accepted formats, and the significant quirk that documents have no thumbnail/preview and can only be published to LinkedIn as a `document` post. It omits retry/idempotency effects and error behavior on unsupported formats.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and resource, then formats, limits, and the document caveat—every sentence carries information. It is somewhat dense with format enumeration, but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and annotations cover the safety profile, so the description needn't explain return values. Given that, it covers inputs, constraints, and the document special case adequately; the main gaps are the unmentioned `file` parameter path and any relation to the staged upload siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the schema already documents url, filePath, filename and the nested file object. The description adds useful semantics (url must be public, url vs filePath are mutually exclusive) but omits the third `file` input mode entirely, so a reader of the description alone would not know a host-provided file option exists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Upload a media file') and enumerates what counts as media (image, video, document) plus accepted formats and the 100MB cap. An agent knows exactly what the tool ingests without opening the schema. It does not, however, distinguish itself from the sibling staged-upload pair create_media_upload/finalize_media_upload, which keeps it just short of a perfect sibling-differentiating 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this when the user provides an image, video or document to attach to a post,' giving a clear triggering condition, and adds the mutual-exclusivity rule 'Provide either url OR filePath, not both.' It stops short of naming alternatives (e.g. create_media_upload/finalize_media_upload or composing a post without media), so there is no real when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
view_analyticsAnalytics dashboardARead-onlyIdempotentInspect
Open an interactive analytics dashboard for a date range — totals, status breakdown, per-platform stats, and daily post counts. Use this when the user wants an interactive analytics dashboard — prefer over get_analytics for a visual view.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date (ISO). Defaults to today. | |
| from | No | Start date (ISO, e.g. 2025-01-01). Defaults to 30 days ago. |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | No | |
| from | No | |
| summary | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering risks. The description additionally clarifies the tool's behavior (interactive dashboard) and what the view contains, which goes beyond the structured annotations. It does not mention any auth/rate constraints, but these are not necessary given the pervasive read-only safety profile and the annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences that lead with the precise action, list the dashboard content, and give selection guidance. There is no filler and each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description gives sufficient context for a tool that already has an output schema and annotations for side-effect behavior. It clearly conveys what the dashboard includes and when to use it. The 'interactive' nature is described with enough clarity for typical agent invocation; a slightly deeper note about return format would be a minor embellishment, but output schema covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully describes both parameters with dates and defaults (100% coverage), so the description adds no new parameter semantics; it only repeats the concept of a date range. With the schema doing the heavy lifting, baseline 3 is right.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly says 'Open an interactive analytics dashboard' and lists the contents: totals, status breakdown, per-platform stats, daily post counts. It also distinguishes itself from get_analytics by noting that this is the visual alternative. This fully disambiguates it from sibling tools without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a clear decision rule: 'Use this when the user wants an interactive analytics dashboard — prefer over get_analytics for a visual view.' This explicitly states when to select it and names the actual alternative, so an agent can decide without inspecting other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
view_channelsChannelsARead-onlyIdempotentInspect
Open an interactive view of connected social channels with platform, account, and connection/token status. Use this when the user wants an interactive view of their connected channels.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| channels | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, covering the safety profile of the tool. The description adds the 'interactive' nature and the data content shown, but it does not describe how interaction works, whether there are any side effects or state changes, or any other behaviors beyond what the structured annotations imply. The 'interactive' wording is a valuable addition, but the overall disclosure is modest.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences, the first stating the action and content, the second giving the trigger condition. No fluff or repetition; every sentence earns its place and the key verb and resource are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a barrier-less, parameterless tool with a read-only and idempotent annotation set and an output schema, the description is sufficiently complete for an agent to know why and when to use it. A slight gap is the lack of a suggested contrast with 'list_channels' to make the selection fully unambiguous, but that mostly affects usage differentiation rather than invocation correctness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0 parameters, the schema covers 100% of the interface by definition, so the description does not need to explain any parameter. It correctly omits parameter details and instead focuses on the action, which is the right baseline for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Open an interactive view') and the resource ('connected social channels'), and it enumerates the visible content (platform, account, connection/token status). It differentiates from siblings through the 'interactive view' phrasing, but it never names the natural alternative 'list_channels', so the distinction remains implicit rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a direct usage cue: 'Use this when the user wants an interactive view of their connected channels.' This communicates the intended scenario, but it does not mention when not to use it or point to an alternative like 'list_channels', which would be the analogous non-interactive read tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
view_mediaMedia libraryARead-onlyIdempotentInspect
Open an interactive gallery of uploaded media files with thumbnails and metadata. Use this when the user wants to browse their media library visually.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items to show (default 30). |
Output Schema
| Name | Required | Description |
|---|---|---|
| media | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, idempotent, and non-destructive. The description adds relevant behavior beyond that: it opens an interactive gallery with thumbnails and metadata, clarifying the experience the user will get. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences that immediately state the action and the intended use case. No redundant filler or schema repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only gallery tool with one optional parameter and an output schema, the description provides sufficient context. It could be slightly stronger by explaining the role of the limit parameter or by distinguishing itself from list_media, but it is not a major gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully describes the only parameter (limit) with a default value, so the description doesn't need to add much. It adds no extra detail about how the limit applies to the gallery, but the schema coverage is complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Open an interactive gallery') and the resource ('uploaded media files'). It also conveys the visual browsing purpose, which differentiates it from a plain data-returning list tool like list_media.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this when the user wants to visually browse their media library. It does not explicitly contrast it with sibling tools like list_media, but the visual-gallery framing gives enough direction for most cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
view_postsPostsARead-onlyIdempotentInspect
Open an interactive list of posts with their status, schedule, and channels. Optionally filter by status. Use this when the user wants to see their posts as an interactive dashboard — prefer over list_posts for a visual view.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max posts to show (default 20). | |
| status | No | Filter by post status. |
Output Schema
| Name | Required | Description |
|---|---|---|
| posts | No | |
| total | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, covering the safety profile. The description adds the behavioral nuance of being 'interactive' and 'visual,' which goes beyond the annotations. It doesn't contradict them, and it provides useful context about the nature of the UI.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tightly written sentence that leads with the primary purpose and includes routing advice. Every word earns its place; there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, non-destructive tool with only two optional parameters, a clear purpose, and an existing output schema, the description fully covers what an agent needs: what it does, when to use it, and how to differentiate it. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (limit and status) are already well-documented. The description merely reiterates that status filtering is optional, which is already implied by the schema's non-required status. It adds no new meaning beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Open'), a resource ('interactive list of posts'), and the key attributes (status, schedule, channels). It explicitly differentiates from sibling list_posts by saying 'prefer over list_posts for a visual view,' making the tool's distinct purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides direct when-to-use guidance: 'Use this when the user wants to see their posts as an interactive dashboard.' It also names the alternative (list_posts) and the selection criterion (visual vs. non-visual), leaving no ambiguity about tool choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
- Changed
create_post5 fields changed- changed
Input schema / properties / content / descriptionPrevious value: -"The post text content. Optional — defaults to empty for media-only posts. LinkedIn mentions: write @[Display Name](urn:li:organization:ID) for a Page or @[Display Name](urn:li:person:ID) for a person; search_mentions on a LinkedIn channel returns ready-made Page tokens. The token publishes as a real mention on LinkedIn and as plain @Display Name on other channels."New value: +"The post text content. Optional — defaults to empty for media-only posts. LinkedIn mentions: write @[Display Name](urn:li:organization:ID) for a Page or @[Display Name](urn:li:person:ID) for a person; The token publishes as a real mention on LinkedIn and as plain @Display Name on other channels." - changed
Input schema / properties / platformSpecific / properties / discord / anyOfPrevious value: -[ - { - "additionalProperties": { - "additionalProperties": {}, - "properties": { - "buttons": { - "description": "Link buttons, up to 5.", - "items": { - "properties": { - "label": { - "description": "Up to 80 characters.", - "type": "string" - }, - "url": { - "description": "http(s) link.", - "type": "string" - } - }, - "required": [ - "label", - "url" - ], - "type": "object" - }, - "type": "array" - }, - "channelId": { - "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key. List postable channels via get_channel_options.", - "type": "string" - }, - "embed": { - "description": "Send the text as a rich embed with the first image inside.", - "properties": { - "color": { - "enum": [ - "orange", - "blue", - "green", - "red", - "purple", - "gray" - ], - "type": "string" - }, - "title": { - "description": "Up to 256 characters.", - "type": "string" - } - }, - "type": "object" - }, - "pin": { - "description": "Pin the message. If Discord refuses, the post stays published and a warning is recorded. The bot needs the Pin Messages permission.", - "type": "boolean" - }, - "poll": { - "description": "A native poll. The bot needs the Send Polls permission.", - "properties": { - "answers": { - "description": "2 to 10 answers, each up to 55 characters.", - "items": { - "type": "string" - }, - "type": "array" - }, - "durationHours": { - "description": "Whole hours 1 to 768 (default 24).", - "type": "number" - }, - "multiselect": { - "type": "boolean" - }, - "question": { - "description": "Up to 300 characters.", - "type": "string" - } - }, - "required": [ - "question", - "answers" - ], - "type": "object" - }, - "silent": { - "description": "Suppress notifications for the message.", - "type": "boolean" - }, - "startThread": { - "description": "Start a thread from the message (no effect on a forum channel).", - "type": "boolean" - }, - "tags": { - "description": "Up to 5 forum tag IDs (digits) for a forum channel; IDs come from get_channel_options.", - "items": { - "type": "string" - }, - "type": "array" - }, - "threadName": { - "description": "Name for that thread, up to 100 characters.", - "type": "string" - } - }, - "type": "object" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - { - "additionalProperties": {}, - "properties": { - "buttons": { - "description": "Link buttons, up to 5.", - "items": { - "properties": { - "label": { - "description": "Up to 80 characters.", - "type": "string" - }, - "url": { - "description": "http(s) link.", - "type": "string" - } - }, - "required": [ - "label", - "url" - ], - "type": "object" - }, - "type": "array" - }, - "channelId": { - "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key. List postable channels via get_channel_options.", - "type": "string" - }, - "embed": { - "description": "Send the text as a rich embed with the first image inside.", - "properties": { - "color": { - "enum": [ - "orange", - "blue", - "green", - "red", - "purple", - "gray" - ], - "type": "string" - }, - "title": { - "description": "Up to 256 characters.", - "type": "string" - } - }, - "type": "object" - }, - "pin": { - "description": "Pin the message. If Discord refuses, the post stays published and a warning is recorded. The bot needs the Pin Messages permission.", - "type": "boolean" - }, - "poll": { - "description": "A native poll. The bot needs the Send Polls permission.", - "properties": { - "answers": { - "description": "2 to 10 answers, each up to 55 characters.", - "items": { - "type": "string" - }, - "type": "array" - }, - "durationHours": { - "description": "Whole hours 1 to 768 (default 24).", - "type": "number" - }, - "multiselect": { - "type": "boolean" - }, - "question": { - "description": "Up to 300 characters.", - "type": "string" - } - }, - "required": [ - "question", - "answers" - ], - "type": "object" - }, - "silent": { - "description": "Suppress notifications for the message.", - "type": "boolean" - }, - "startThread": { - "description": "Start a thread from the message (no effect on a forum channel).", - "type": "boolean" - }, - "tags": { - "description": "Up to 5 forum tag IDs (digits) for a forum channel; IDs come from get_channel_options.", - "items": { - "type": "string" - }, - "type": "array" - }, - "threadName": { - "description": "Name for that thread, up to 100 characters.", - "type": "string" - } - }, - "type": "object" - } -]New value: +[ + { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "buttons": { + "description": "Link buttons, up to 5.", + "items": { + "properties": { + "label": { + "description": "Up to 80 characters.", + "type": "string" + }, + "url": { + "description": "http(s) link.", + "type": "string" + } + }, + "required": [ + "label", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "channelId": { + "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key.", + "type": "string" + }, + "embed": { + "description": "Send the text as a rich embed with the first image inside.", + "properties": { + "color": { + "enum": [ + "orange", + "blue", + "green", + "red", + "purple", + "gray" + ], + "type": "string" + }, + "title": { + "description": "Up to 256 characters.", + "type": "string" + } + }, + "type": "object" + }, + "pin": { + "description": "Pin the message. If Discord refuses, the post stays published and a warning is recorded. The bot needs the Pin Messages permission.", + "type": "boolean" + }, + "poll": { + "description": "A native poll. The bot needs the Send Polls permission.", + "properties": { + "answers": { + "description": "2 to 10 answers, each up to 55 characters.", + "items": { + "type": "string" + }, + "type": "array" + }, + "durationHours": { + "description": "Whole hours 1 to 768 (default 24).", + "type": "number" + }, + "multiselect": { + "type": "boolean" + }, + "question": { + "description": "Up to 300 characters.", + "type": "string" + } + }, + "required": [ + "question", + "answers" + ], + "type": "object" + }, + "silent": { + "description": "Suppress notifications for the message.", + "type": "boolean" + }, + "startThread": { + "description": "Start a thread from the message (no effect on a forum channel).", + "type": "boolean" + }, + "tags": { + "description": "Up to 5 forum tag IDs (digits) for a forum channel.", + "items": { + "type": "string" + }, + "type": "array" + }, + "threadName": { + "description": "Name for that thread, up to 100 characters.", + "type": "string" + } + }, + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "buttons": { + "description": "Link buttons, up to 5.", + "items": { + "properties": { + "label": { + "description": "Up to 80 characters.", + "type": "string" + }, + "url": { + "description": "http(s) link.", + "type": "string" + } + }, + "required": [ + "label", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "channelId": { + "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key.", + "type": "string" + }, + "embed": { + "description": "Send the text as a rich embed with the first image inside.", + "properties": { + "color": { + "enum": [ + "orange", + "blue", + "green", + "red", + "purple", + "gray" + ], + "type": "string" + }, + "title": { + "description": "Up to 256 characters.", + "type": "string" + } + }, + "type": "object" + }, + "pin": { + "description": "Pin the message. If Discord refuses, the post stays published and a warning is recorded. The bot needs the Pin Messages permission.", + "type": "boolean" + }, + "poll": { + "description": "A native poll. The bot needs the Send Polls permission.", + "properties": { + "answers": { + "description": "2 to 10 answers, each up to 55 characters.", + "items": { + "type": "string" + }, + "type": "array" + }, + "durationHours": { + "description": "Whole hours 1 to 768 (default 24).", + "type": "number" + }, + "multiselect": { + "type": "boolean" + }, + "question": { + "description": "Up to 300 characters.", + "type": "string" + } + }, + "required": [ + "question", + "answers" + ], + "type": "object" + }, + "silent": { + "description": "Suppress notifications for the message.", + "type": "boolean" + }, + "startThread": { + "description": "Start a thread from the message (no effect on a forum channel).", + "type": "boolean" + }, + "tags": { + "description": "Up to 5 forum tag IDs (digits) for a forum channel.", + "items": { + "type": "string" + }, + "type": "array" + }, + "threadName": { + "description": "Name for that thread, up to 100 characters.", + "type": "string" + } + }, + "type": "object" + } +] - changed
Input schema / properties / platformSpecific / properties / pinterest / properties / boardSectionId / descriptionPrevious value: -"Numeric ID of a section of the chosen board (list with get_channel_options and boardId). Send it beside its board, per channel or flat. Pin, video_pin and carousel. A flat value is ignored for a channel with its own boardId, and any section is ignored when no board was chosen."New value: +"Numeric ID of a section of the chosen board. Send it beside its board, per channel or flat. Pin, video_pin and carousel. A flat value is ignored for a channel with its own boardId, and any section is ignored when no board was chosen." - changed
Input schema / properties / platformSpecific / properties / threads / properties / locationId / descriptionPrevious value: -"Numeric place ID from get_channel_options with a `q` search on a Threads channel. Only works once the channel has granted location tagging."New value: +"Numeric Threads place ID. Only works once the channel has granted location tagging." - changed
Input schema / properties / platformSpecific / properties / tumblr / anyOfPrevious value: -[ - { - "additionalProperties": { - "additionalProperties": {}, - "properties": { - "blogName": { - "description": "Which blog to publish to. Defaults to the blog the channel was connected as (list via get_channel_options).", - "type": "string" - }, - "link": { - "description": "Appended as a link block.", - "type": "string" - }, - "reblogInteraction": { - "description": "Who can reblog the post.", - "enum": [ - "everyone", - "noone" - ], - "type": "string" - }, - "reblogUrl": { - "description": "A Tumblr post link (tumblr.com/<blog>/<id> or <blog>.tumblr.com/post/<id>): publishes a reblog of that post with your text as the comment.", - "type": "string" - }, - "slug": { - "description": "Up to 200 characters; lowercased and hyphenated into the permalink.", - "type": "string" - }, - "sourceUrl": { - "description": "Attribution URL stored as the post's source.", - "type": "string" - }, - "state": { - "description": "Default published. A scheduled post with published still goes out at its time; draft and private override that and the post is never made public by BulkPublish.", - "enum": [ - "published", - "queue", - "draft", - "private" - ], - "type": "string" - }, - "tags": { - "description": "Tumblr tags, without the leading '#'.", - "items": { - "type": "string" - }, - "type": "array" - }, - "title": { - "description": "Rendered as a heading block above the body.", - "type": "string" - } - }, - "type": "object" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - { - "additionalProperties": {}, - "properties": { - "blogName": { - "description": "Which blog to publish to. Defaults to the blog the channel was connected as (list via get_channel_options).", - "type": "string" - }, - "link": { - "description": "Appended as a link block.", - "type": "string" - }, - "reblogInteraction": { - "description": "Who can reblog the post.", - "enum": [ - "everyone", - "noone" - ], - "type": "string" - }, - "reblogUrl": { - "description": "A Tumblr post link (tumblr.com/<blog>/<id> or <blog>.tumblr.com/post/<id>): publishes a reblog of that post with your text as the comment.", - "type": "string" - }, - "slug": { - "description": "Up to 200 characters; lowercased and hyphenated into the permalink.", - "type": "string" - }, - "sourceUrl": { - "description": "Attribution URL stored as the post's source.", - "type": "string" - }, - "state": { - "description": "Default published. A scheduled post with published still goes out at its time; draft and private override that and the post is never made public by BulkPublish.", - "enum": [ - "published", - "queue", - "draft", - "private" - ], - "type": "string" - }, - "tags": { - "description": "Tumblr tags, without the leading '#'.", - "items": { - "type": "string" - }, - "type": "array" - }, - "title": { - "description": "Rendered as a heading block above the body.", - "type": "string" - } - }, - "type": "object" - } -]New value: +[ + { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "blogName": { + "description": "Which blog to publish to. Defaults to the blog the channel was connected as.", + "type": "string" + }, + "link": { + "description": "Appended as a link block.", + "type": "string" + }, + "reblogInteraction": { + "description": "Who can reblog the post.", + "enum": [ + "everyone", + "noone" + ], + "type": "string" + }, + "reblogUrl": { + "description": "A Tumblr post link (tumblr.com/<blog>/<id> or <blog>.tumblr.com/post/<id>): publishes a reblog of that post with your text as the comment.", + "type": "string" + }, + "slug": { + "description": "Up to 200 characters; lowercased and hyphenated into the permalink.", + "type": "string" + }, + "sourceUrl": { + "description": "Attribution URL stored as the post's source.", + "type": "string" + }, + "state": { + "description": "Default published. A scheduled post with published still goes out at its time; draft and private override that and the post is never made public by BulkPublish.", + "enum": [ + "published", + "queue", + "draft", + "private" + ], + "type": "string" + }, + "tags": { + "description": "Tumblr tags, without the leading '#'.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Rendered as a heading block above the body.", + "type": "string" + } + }, + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "blogName": { + "description": "Which blog to publish to. Defaults to the blog the channel was connected as.", + "type": "string" + }, + "link": { + "description": "Appended as a link block.", + "type": "string" + }, + "reblogInteraction": { + "description": "Who can reblog the post.", + "enum": [ + "everyone", + "noone" + ], + "type": "string" + }, + "reblogUrl": { + "description": "A Tumblr post link (tumblr.com/<blog>/<id> or <blog>.tumblr.com/post/<id>): publishes a reblog of that post with your text as the comment.", + "type": "string" + }, + "slug": { + "description": "Up to 200 characters; lowercased and hyphenated into the permalink.", + "type": "string" + }, + "sourceUrl": { + "description": "Attribution URL stored as the post's source.", + "type": "string" + }, + "state": { + "description": "Default published. A scheduled post with published still goes out at its time; draft and private override that and the post is never made public by BulkPublish.", + "enum": [ + "published", + "queue", + "draft", + "private" + ], + "type": "string" + }, + "tags": { + "description": "Tumblr tags, without the leading '#'.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Rendered as a heading block above the body.", + "type": "string" + } + }, + "type": "object" + } +]
- Changed
update_post4 fields changed- changed
Input schema / properties / platformSpecific / properties / discord / anyOfPrevious value: -[ - { - "additionalProperties": { - "additionalProperties": {}, - "properties": { - "buttons": { - "description": "Link buttons, up to 5.", - "items": { - "properties": { - "label": { - "description": "Up to 80 characters.", - "type": "string" - }, - "url": { - "description": "http(s) link.", - "type": "string" - } - }, - "required": [ - "label", - "url" - ], - "type": "object" - }, - "type": "array" - }, - "channelId": { - "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key. List postable channels via get_channel_options.", - "type": "string" - }, - "embed": { - "description": "Send the text as a rich embed with the first image inside.", - "properties": { - "color": { - "enum": [ - "orange", - "blue", - "green", - "red", - "purple", - "gray" - ], - "type": "string" - }, - "title": { - "description": "Up to 256 characters.", - "type": "string" - } - }, - "type": "object" - }, - "pin": { - "description": "Pin the message. If Discord refuses, the post stays published and a warning is recorded. The bot needs the Pin Messages permission.", - "type": "boolean" - }, - "poll": { - "description": "A native poll. The bot needs the Send Polls permission.", - "properties": { - "answers": { - "description": "2 to 10 answers, each up to 55 characters.", - "items": { - "type": "string" - }, - "type": "array" - }, - "durationHours": { - "description": "Whole hours 1 to 768 (default 24).", - "type": "number" - }, - "multiselect": { - "type": "boolean" - }, - "question": { - "description": "Up to 300 characters.", - "type": "string" - } - }, - "required": [ - "question", - "answers" - ], - "type": "object" - }, - "silent": { - "description": "Suppress notifications for the message.", - "type": "boolean" - }, - "startThread": { - "description": "Start a thread from the message (no effect on a forum channel).", - "type": "boolean" - }, - "tags": { - "description": "Up to 5 forum tag IDs (digits) for a forum channel; IDs come from get_channel_options.", - "items": { - "type": "string" - }, - "type": "array" - }, - "threadName": { - "description": "Name for that thread, up to 100 characters.", - "type": "string" - } - }, - "type": "object" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - { - "additionalProperties": {}, - "properties": { - "buttons": { - "description": "Link buttons, up to 5.", - "items": { - "properties": { - "label": { - "description": "Up to 80 characters.", - "type": "string" - }, - "url": { - "description": "http(s) link.", - "type": "string" - } - }, - "required": [ - "label", - "url" - ], - "type": "object" - }, - "type": "array" - }, - "channelId": { - "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key. List postable channels via get_channel_options.", - "type": "string" - }, - "embed": { - "description": "Send the text as a rich embed with the first image inside.", - "properties": { - "color": { - "enum": [ - "orange", - "blue", - "green", - "red", - "purple", - "gray" - ], - "type": "string" - }, - "title": { - "description": "Up to 256 characters.", - "type": "string" - } - }, - "type": "object" - }, - "pin": { - "description": "Pin the message. If Discord refuses, the post stays published and a warning is recorded. The bot needs the Pin Messages permission.", - "type": "boolean" - }, - "poll": { - "description": "A native poll. The bot needs the Send Polls permission.", - "properties": { - "answers": { - "description": "2 to 10 answers, each up to 55 characters.", - "items": { - "type": "string" - }, - "type": "array" - }, - "durationHours": { - "description": "Whole hours 1 to 768 (default 24).", - "type": "number" - }, - "multiselect": { - "type": "boolean" - }, - "question": { - "description": "Up to 300 characters.", - "type": "string" - } - }, - "required": [ - "question", - "answers" - ], - "type": "object" - }, - "silent": { - "description": "Suppress notifications for the message.", - "type": "boolean" - }, - "startThread": { - "description": "Start a thread from the message (no effect on a forum channel).", - "type": "boolean" - }, - "tags": { - "description": "Up to 5 forum tag IDs (digits) for a forum channel; IDs come from get_channel_options.", - "items": { - "type": "string" - }, - "type": "array" - }, - "threadName": { - "description": "Name for that thread, up to 100 characters.", - "type": "string" - } - }, - "type": "object" - } -]New value: +[ + { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "buttons": { + "description": "Link buttons, up to 5.", + "items": { + "properties": { + "label": { + "description": "Up to 80 characters.", + "type": "string" + }, + "url": { + "description": "http(s) link.", + "type": "string" + } + }, + "required": [ + "label", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "channelId": { + "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key.", + "type": "string" + }, + "embed": { + "description": "Send the text as a rich embed with the first image inside.", + "properties": { + "color": { + "enum": [ + "orange", + "blue", + "green", + "red", + "purple", + "gray" + ], + "type": "string" + }, + "title": { + "description": "Up to 256 characters.", + "type": "string" + } + }, + "type": "object" + }, + "pin": { + "description": "Pin the message. If Discord refuses, the post stays published and a warning is recorded. The bot needs the Pin Messages permission.", + "type": "boolean" + }, + "poll": { + "description": "A native poll. The bot needs the Send Polls permission.", + "properties": { + "answers": { + "description": "2 to 10 answers, each up to 55 characters.", + "items": { + "type": "string" + }, + "type": "array" + }, + "durationHours": { + "description": "Whole hours 1 to 768 (default 24).", + "type": "number" + }, + "multiselect": { + "type": "boolean" + }, + "question": { + "description": "Up to 300 characters.", + "type": "string" + } + }, + "required": [ + "question", + "answers" + ], + "type": "object" + }, + "silent": { + "description": "Suppress notifications for the message.", + "type": "boolean" + }, + "startThread": { + "description": "Start a thread from the message (no effect on a forum channel).", + "type": "boolean" + }, + "tags": { + "description": "Up to 5 forum tag IDs (digits) for a forum channel.", + "items": { + "type": "string" + }, + "type": "array" + }, + "threadName": { + "description": "Name for that thread, up to 100 characters.", + "type": "string" + } + }, + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "buttons": { + "description": "Link buttons, up to 5.", + "items": { + "properties": { + "label": { + "description": "Up to 80 characters.", + "type": "string" + }, + "url": { + "description": "http(s) link.", + "type": "string" + } + }, + "required": [ + "label", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "channelId": { + "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key.", + "type": "string" + }, + "embed": { + "description": "Send the text as a rich embed with the first image inside.", + "properties": { + "color": { + "enum": [ + "orange", + "blue", + "green", + "red", + "purple", + "gray" + ], + "type": "string" + }, + "title": { + "description": "Up to 256 characters.", + "type": "string" + } + }, + "type": "object" + }, + "pin": { + "description": "Pin the message. If Discord refuses, the post stays published and a warning is recorded. The bot needs the Pin Messages permission.", + "type": "boolean" + }, + "poll": { + "description": "A native poll. The bot needs the Send Polls permission.", + "properties": { + "answers": { + "description": "2 to 10 answers, each up to 55 characters.", + "items": { + "type": "string" + }, + "type": "array" + }, + "durationHours": { + "description": "Whole hours 1 to 768 (default 24).", + "type": "number" + }, + "multiselect": { + "type": "boolean" + }, + "question": { + "description": "Up to 300 characters.", + "type": "string" + } + }, + "required": [ + "question", + "answers" + ], + "type": "object" + }, + "silent": { + "description": "Suppress notifications for the message.", + "type": "boolean" + }, + "startThread": { + "description": "Start a thread from the message (no effect on a forum channel).", + "type": "boolean" + }, + "tags": { + "description": "Up to 5 forum tag IDs (digits) for a forum channel.", + "items": { + "type": "string" + }, + "type": "array" + }, + "threadName": { + "description": "Name for that thread, up to 100 characters.", + "type": "string" + } + }, + "type": "object" + } +] - changed
Input schema / properties / platformSpecific / properties / pinterest / properties / boardSectionId / descriptionPrevious value: -"Numeric ID of a section of the chosen board (list with get_channel_options and boardId). Send it beside its board, per channel or flat. Pin, video_pin and carousel. A flat value is ignored for a channel with its own boardId, and any section is ignored when no board was chosen."New value: +"Numeric ID of a section of the chosen board. Send it beside its board, per channel or flat. Pin, video_pin and carousel. A flat value is ignored for a channel with its own boardId, and any section is ignored when no board was chosen." - changed
Input schema / properties / platformSpecific / properties / threads / properties / locationId / descriptionPrevious value: -"Numeric place ID from get_channel_options with a `q` search on a Threads channel. Only works once the channel has granted location tagging."New value: +"Numeric Threads place ID. Only works once the channel has granted location tagging." - changed
Input schema / properties / platformSpecific / properties / tumblr / anyOfPrevious value: -[ - { - "additionalProperties": { - "additionalProperties": {}, - "properties": { - "blogName": { - "description": "Which blog to publish to. Defaults to the blog the channel was connected as (list via get_channel_options).", - "type": "string" - }, - "link": { - "description": "Appended as a link block.", - "type": "string" - }, - "reblogInteraction": { - "description": "Who can reblog the post.", - "enum": [ - "everyone", - "noone" - ], - "type": "string" - }, - "reblogUrl": { - "description": "A Tumblr post link (tumblr.com/<blog>/<id> or <blog>.tumblr.com/post/<id>): publishes a reblog of that post with your text as the comment.", - "type": "string" - }, - "slug": { - "description": "Up to 200 characters; lowercased and hyphenated into the permalink.", - "type": "string" - }, - "sourceUrl": { - "description": "Attribution URL stored as the post's source.", - "type": "string" - }, - "state": { - "description": "Default published. A scheduled post with published still goes out at its time; draft and private override that and the post is never made public by BulkPublish.", - "enum": [ - "published", - "queue", - "draft", - "private" - ], - "type": "string" - }, - "tags": { - "description": "Tumblr tags, without the leading '#'.", - "items": { - "type": "string" - }, - "type": "array" - }, - "title": { - "description": "Rendered as a heading block above the body.", - "type": "string" - } - }, - "type": "object" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - { - "additionalProperties": {}, - "properties": { - "blogName": { - "description": "Which blog to publish to. Defaults to the blog the channel was connected as (list via get_channel_options).", - "type": "string" - }, - "link": { - "description": "Appended as a link block.", - "type": "string" - }, - "reblogInteraction": { - "description": "Who can reblog the post.", - "enum": [ - "everyone", - "noone" - ], - "type": "string" - }, - "reblogUrl": { - "description": "A Tumblr post link (tumblr.com/<blog>/<id> or <blog>.tumblr.com/post/<id>): publishes a reblog of that post with your text as the comment.", - "type": "string" - }, - "slug": { - "description": "Up to 200 characters; lowercased and hyphenated into the permalink.", - "type": "string" - }, - "sourceUrl": { - "description": "Attribution URL stored as the post's source.", - "type": "string" - }, - "state": { - "description": "Default published. A scheduled post with published still goes out at its time; draft and private override that and the post is never made public by BulkPublish.", - "enum": [ - "published", - "queue", - "draft", - "private" - ], - "type": "string" - }, - "tags": { - "description": "Tumblr tags, without the leading '#'.", - "items": { - "type": "string" - }, - "type": "array" - }, - "title": { - "description": "Rendered as a heading block above the body.", - "type": "string" - } - }, - "type": "object" - } -]New value: +[ + { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "blogName": { + "description": "Which blog to publish to. Defaults to the blog the channel was connected as.", + "type": "string" + }, + "link": { + "description": "Appended as a link block.", + "type": "string" + }, + "reblogInteraction": { + "description": "Who can reblog the post.", + "enum": [ + "everyone", + "noone" + ], + "type": "string" + }, + "reblogUrl": { + "description": "A Tumblr post link (tumblr.com/<blog>/<id> or <blog>.tumblr.com/post/<id>): publishes a reblog of that post with your text as the comment.", + "type": "string" + }, + "slug": { + "description": "Up to 200 characters; lowercased and hyphenated into the permalink.", + "type": "string" + }, + "sourceUrl": { + "description": "Attribution URL stored as the post's source.", + "type": "string" + }, + "state": { + "description": "Default published. A scheduled post with published still goes out at its time; draft and private override that and the post is never made public by BulkPublish.", + "enum": [ + "published", + "queue", + "draft", + "private" + ], + "type": "string" + }, + "tags": { + "description": "Tumblr tags, without the leading '#'.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Rendered as a heading block above the body.", + "type": "string" + } + }, + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "blogName": { + "description": "Which blog to publish to. Defaults to the blog the channel was connected as.", + "type": "string" + }, + "link": { + "description": "Appended as a link block.", + "type": "string" + }, + "reblogInteraction": { + "description": "Who can reblog the post.", + "enum": [ + "everyone", + "noone" + ], + "type": "string" + }, + "reblogUrl": { + "description": "A Tumblr post link (tumblr.com/<blog>/<id> or <blog>.tumblr.com/post/<id>): publishes a reblog of that post with your text as the comment.", + "type": "string" + }, + "slug": { + "description": "Up to 200 characters; lowercased and hyphenated into the permalink.", + "type": "string" + }, + "sourceUrl": { + "description": "Attribution URL stored as the post's source.", + "type": "string" + }, + "state": { + "description": "Default published. A scheduled post with published still goes out at its time; draft and private override that and the post is never made public by BulkPublish.", + "enum": [ + "published", + "queue", + "draft", + "private" + ], + "type": "string" + }, + "tags": { + "description": "Tumblr tags, without the leading '#'.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Rendered as a heading block above the body.", + "type": "string" + } + }, + "type": "object" + } +]
- Changed
upload_media1 field changed- added
Input schema / properties / fileAdded value: +{ + "description": "A file provided by the chat host. Leave unset and use url otherwise.", + "properties": { + "download_url": { + "description": "Temporary download link for the file.", + "type": "string" + }, + "file_id": { + "description": "The file's id.", + "type": "string" + }, + "file_name": { + "description": "The file's name, when known.", + "type": "string" + }, + "mime_type": { + "description": "The file's type, when known.", + "type": "string" + } + }, + "required": [ + "download_url", + "file_id" + ], + "type": "object" +}
2 tool updates
- Changed
create_post1 field changed- changed
Input schema / properties / platformSpecific / properties / tiktok / properties / sendToDrafts / descriptionPrevious value: -"Send a video or photo_slideshow post to the creator's TikTok drafts instead of publishing it (default false). privacyLevel is then not required, and the direct-post settings (privacyLevel, disableDuet, disableStitch, disableComment, isAigc, brandContentToggle, brandOrganicToggle, autoAddMusic, thumbnailTimestamp) are ignored. A video draft carries no caption; a photo draft sends it. Once delivered the destination becomes published with no platformUrl, and analytics are not collected."New value: +"Send a video or photo_slideshow post to the creator's TikTok drafts instead of publishing it (default false). privacyLevel is then not required, and the direct-post settings (privacyLevel, disableDuet, disableStitch, disableComment, isAigc, brandContentToggle, brandOrganicToggle, autoAddMusic, thumbnailTimestamp) are ignored. A video draft carries no caption; a photo draft sends it. Once delivered the destination becomes published with no platformUrl; if the creator posts it within about a week, platformPostId becomes the video id, platformUrl is filled in and analytics are collected."
- Changed
update_post1 field changed- changed
Input schema / properties / platformSpecific / properties / tiktok / properties / sendToDrafts / descriptionPrevious value: -"Send a video or photo_slideshow post to the creator's TikTok drafts instead of publishing it (default false). privacyLevel is then not required, and the direct-post settings (privacyLevel, disableDuet, disableStitch, disableComment, isAigc, brandContentToggle, brandOrganicToggle, autoAddMusic, thumbnailTimestamp) are ignored. A video draft carries no caption; a photo draft sends it. Once delivered the destination becomes published with no platformUrl, and analytics are not collected."New value: +"Send a video or photo_slideshow post to the creator's TikTok drafts instead of publishing it (default false). privacyLevel is then not required, and the direct-post settings (privacyLevel, disableDuet, disableStitch, disableComment, isAigc, brandContentToggle, brandOrganicToggle, autoAddMusic, thumbnailTimestamp) are ignored. A video draft carries no caption; a photo draft sends it. Once delivered the destination becomes published with no platformUrl; if the creator posts it within about a week, platformPostId becomes the video id, platformUrl is filled in and analytics are collected."
3 tool updates
- Changed
create_post53 fields changed- changed
Input schema / properties / channels / items / properties / platform / enumPrevious value: -[ - "facebook", - "instagram", - "x", - "tiktok", - "youtube", - "threads", - "bluesky", - "pinterest", - "gmb", - "linkedin", - "mastodon", - "reddit", - "discord", - "telegram", - "tumblr", - "snapchat" -]New value: +[ + "facebook", + "instagram", + "x", + "tiktok", + "youtube", + "threads", + "bluesky", + "pinterest", + "gmb", + "linkedin", + "mastodon", + "discord", + "telegram", + "tumblr", + "snapchat" +] - removed
Input schema / properties / platformContent / properties / redditRemoved value: -{ - "type": "string" -} - changed
Input schema / properties / platformSpecific / descriptionPrevious value: -"Platform-specific settings, e.g. { \"youtube\": { \"title\": \"…\", \"privacyStatus\": \"public\" } }. Reddit, Discord, Tumblr and Snapchat nest their options under the BulkPublish channel id, e.g. { \"reddit\": { \"12\": { \"subreddit\": \"webdev\" } } }. Telegram takes no options."New value: +"Platform-specific settings, e.g. { \"youtube\": { \"title\": \"…\", \"privacyStatus\": \"public\" } }. Discord, Telegram, Tumblr and Snapchat nest their options under the BulkPublish channel id, e.g. { \"discord\": { \"12\": { \"channelId\": \"1090123456789012345\" } } }. Full per-platform option lists (polls, quotes, tags, drafts, settings) are on each platform key; bad values are refused with 400 VALIDATION_ERROR." - added
Input schema / properties / platformSpecific / properties / bluesky / properties / allowQuotesAdded value: +{ + "description": "false stops other accounts quoting the post (default true). Set right after publishing, like replyAllow.", + "type": "boolean" +} - added
Input schema / properties / platformSpecific / properties / bluesky / properties / contentLabelAdded value: +{ + "description": "Adds a content warning. Applies to every part of a thread.", + "enum": [ + "sexual", + "nudity", + "porn", + "graphic-media" + ], + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / bluesky / properties / langsAdded value: +{ + "description": "Up to 3 language codes such as 'en' or 'pt-BR'. Applies to every part of a thread.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / platformSpecific / properties / bluesky / properties / quoteIdAdded value: +{ + "description": "The post to quote: a bsky.app post link or an at:// URI (a bare ID is read as one of your own posts). Replaces a link card; with media attached both appear together. Publishing fails before anything is posted if the post cannot be found.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / bluesky / properties / replyAllowAdded value: +{ + "description": "Who can reply. Omitted or [] means everyone; otherwise ['nobody'] or any mix of mention, following, follower ('nobody' cannot be combined). Set right after the post publishes; if Bluesky refuses it the post stays published without it. First post of a thread.", + "items": { + "enum": [ + "nobody", + "mention", + "following", + "follower" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / platformSpecific / properties / discord / anyOfPrevious value: -[ - { - "additionalProperties": { - "additionalProperties": {}, - "properties": { - "channelId": { - "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key. List postable channels via get_channel_options.", - "type": "string" - } - }, - "type": "object" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - { - "additionalProperties": {}, - "properties": { - "channelId": { - "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key. List postable channels via get_channel_options.", - "type": "string" - } - }, - "type": "object" - } -]New value: +[ + { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "buttons": { + "description": "Link buttons, up to 5.", + "items": { + "properties": { + "label": { + "description": "Up to 80 characters.", + "type": "string" + }, + "url": { + "description": "http(s) link.", + "type": "string" + } + }, + "required": [ + "label", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "channelId": { + "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key. List postable channels via get_channel_options.", + "type": "string" + }, + "embed": { + "description": "Send the text as a rich embed with the first image inside.", + "properties": { + "color": { + "enum": [ + "orange", + "blue", + "green", + "red", + "purple", + "gray" + ], + "type": "string" + }, + "title": { + "description": "Up to 256 characters.", + "type": "string" + } + }, + "type": "object" + }, + "pin": { + "description": "Pin the message. If Discord refuses, the post stays published and a warning is recorded. The bot needs the Pin Messages permission.", + "type": "boolean" + }, + "poll": { + "description": "A native poll. The bot needs the Send Polls permission.", + "properties": { + "answers": { + "description": "2 to 10 answers, each up to 55 characters.", + "items": { + "type": "string" + }, + "type": "array" + }, + "durationHours": { + "description": "Whole hours 1 to 768 (default 24).", + "type": "number" + }, + "multiselect": { + "type": "boolean" + }, + "question": { + "description": "Up to 300 characters.", + "type": "string" + } + }, + "required": [ + "question", + "answers" + ], + "type": "object" + }, + "silent": { + "description": "Suppress notifications for the message.", + "type": "boolean" + }, + "startThread": { + "description": "Start a thread from the message (no effect on a forum channel).", + "type": "boolean" + }, + "tags": { + "description": "Up to 5 forum tag IDs (digits) for a forum channel; IDs come from get_channel_options.", + "items": { + "type": "string" + }, + "type": "array" + }, + "threadName": { + "description": "Name for that thread, up to 100 characters.", + "type": "string" + } + }, + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "buttons": { + "description": "Link buttons, up to 5.", + "items": { + "properties": { + "label": { + "description": "Up to 80 characters.", + "type": "string" + }, + "url": { + "description": "http(s) link.", + "type": "string" + } + }, + "required": [ + "label", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "channelId": { + "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key. List postable channels via get_channel_options.", + "type": "string" + }, + "embed": { + "description": "Send the text as a rich embed with the first image inside.", + "properties": { + "color": { + "enum": [ + "orange", + "blue", + "green", + "red", + "purple", + "gray" + ], + "type": "string" + }, + "title": { + "description": "Up to 256 characters.", + "type": "string" + } + }, + "type": "object" + }, + "pin": { + "description": "Pin the message. If Discord refuses, the post stays published and a warning is recorded. The bot needs the Pin Messages permission.", + "type": "boolean" + }, + "poll": { + "description": "A native poll. The bot needs the Send Polls permission.", + "properties": { + "answers": { + "description": "2 to 10 answers, each up to 55 characters.", + "items": { + "type": "string" + }, + "type": "array" + }, + "durationHours": { + "description": "Whole hours 1 to 768 (default 24).", + "type": "number" + }, + "multiselect": { + "type": "boolean" + }, + "question": { + "description": "Up to 300 characters.", + "type": "string" + } + }, + "required": [ + "question", + "answers" + ], + "type": "object" + }, + "silent": { + "description": "Suppress notifications for the message.", + "type": "boolean" + }, + "startThread": { + "description": "Start a thread from the message (no effect on a forum channel).", + "type": "boolean" + }, + "tags": { + "description": "Up to 5 forum tag IDs (digits) for a forum channel; IDs come from get_channel_options.", + "items": { + "type": "string" + }, + "type": "array" + }, + "threadName": { + "description": "Name for that thread, up to 100 characters.", + "type": "string" + } + }, + "type": "object" + } +] - added
Input schema / properties / platformSpecific / properties / facebook / properties / textFormatPresetIdAdded value: +{ + "description": "Digits only (a Facebook background ID). Shows a short text post on a coloured background. Used only on a Page feed post with no photo, video or link card and at most 130 characters; anywhere else it is left out and the post publishes as plain text. If Facebook refuses the background the post is published once more without it.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / instagram / properties / locationIdAdded value: +{ + "description": "Digits only: the numeric ID of a Facebook Page that has a location. Applies to photos, videos, Reels and carousels, not Stories. Instagram refuses the post if it does not recognise the ID as a place.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / instagram / properties / shareToFeedAdded value: +{ + "description": "Reels only. false shows the Reel only in the Reels tab; true also shows it in the main feed. Omitted: Instagram's own default (feed and Reels tab).", + "type": "boolean" +} - added
Input schema / properties / platformSpecific / properties / instagram / properties / userTagsAdded value: +{ + "description": "People tagged in the post, up to 20 per photo or video. On a photo (and each photo of a carousel) a tag needs x and y or it is left out; on a Reel or video post people are tagged by username only and any position is ignored. Carousel videos and Stories carry no tags.", + "items": { + "properties": { + "mediaIndex": { + "description": "Which attached media item the tag belongs to, counting from 0 in attachment order (default 0).", + "type": "number" + }, + "username": { + "description": "A public Instagram username, leading @ optional.", + "type": "string" + }, + "x": { + "description": "Position on the photo, 0 to 1 from the left. Give x and y together or not at all.", + "type": "number" + }, + "y": { + "description": "Position on the photo, 0 to 1 from the top.", + "type": "number" + } + }, + "required": [ + "username" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / platformSpecific / properties / linkedin / properties / disableReshareAdded value: +{ + "description": "true stops other members resharing the post (default false).", + "type": "boolean" +} - added
Input schema / properties / platformSpecific / properties / linkedin / properties / documentTitleAdded value: +{ + "description": "`document` posts only: the title shown above the document in the feed. Defaults to the file's name.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / linkedin / properties / pollAdded value: +{ + "description": "Required for `poll` posts, which also need post text and take no media.", + "properties": { + "duration": { + "description": "Default THREE_DAYS.", + "enum": [ + "ONE_DAY", + "THREE_DAYS", + "SEVEN_DAYS", + "FOURTEEN_DAYS" + ], + "type": "string" + }, + "options": { + "description": "2 to 4 answers, each up to 30 characters; blank entries are ignored.", + "items": { + "type": "string" + }, + "type": "array" + }, + "question": { + "description": "Up to 140 characters.", + "type": "string" + } + }, + "required": [ + "question", + "options" + ], + "type": "object" +} - added
Input schema / properties / platformSpecific / properties / linkedin / properties / reshareIdAdded value: +{ + "description": "Required for `reshare` posts: the post's LinkedIn link, or its urn:li:share:<id> / urn:li:ugcPost:<id> ID. Activity links (urn:li:activity:<id>) cannot be reshared.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / linkedin / properties / thumbnailUrlAdded value: +{ + "description": "Cover for a `post` that carries a video: a public http(s) link to an image of up to 10MB. A cover that cannot be fetched is skipped and LinkedIn picks the frame.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / linkedin / properties / visibilityAdded value: +{ + "description": "Who can see the post (default PUBLIC). CONNECTIONS applies to personal profiles only; on a Page it is published as PUBLIC.", + "enum": [ + "PUBLIC", + "CONNECTIONS", + "LOGGED_IN" + ], + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / mastodon / properties / pollAdded value: +{ + "description": "Adds a poll. Cannot be combined with media. First post of a thread. A server with tighter limits refuses it at publish time.", + "properties": { + "expiresIn": { + "description": "Seconds the poll stays open, 300 to 2629746.", + "type": "number" + }, + "hideTotals": { + "description": "Hide counts until the poll ends (default false).", + "type": "boolean" + }, + "multiple": { + "description": "Voters may pick more than one choice (default false).", + "type": "boolean" + }, + "options": { + "description": "2 to 4 choices, each 1 to 50 characters.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "options", + "expiresIn" + ], + "type": "object" +} - added
Input schema / properties / platformSpecific / properties / mastodon / properties / quoteIdAdded value: +{ + "description": "The post to quote: its URL, or its status ID on your own server. Needs a server running Mastodon 4.5 or later, otherwise publishing fails and nothing is posted.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / mastodon / properties / sensitiveAdded value: +{ + "description": "Hides attached media behind a click (default false). No effect without media. Applies to every part of a thread.", + "type": "boolean" +} - added
Input schema / properties / platformSpecific / properties / pinterest / properties / boardSectionIdAdded value: +{ + "description": "Numeric ID of a section of the chosen board (list with get_channel_options and boardId). Send it beside its board, per channel or flat. Pin, video_pin and carousel. A flat value is ignored for a channel with its own boardId, and any section is ignored when no board was chosen.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / pinterest / properties / coverKeyFrameTimeAdded value: +{ + "description": "video_pin only: use the frame at this many seconds (whole number, 0 or more) as the cover. A time past the end uses the last frame; coverImageUrl wins when both are sent.", + "type": "number" +} - removed
Input schema / properties / platformSpecific / properties / redditRemoved value: -{ - "anyOf": [ - { - "additionalProperties": { - "additionalProperties": {}, - "properties": { - "flairId": { - "description": "Link-flair id (list via get_channel_options).", - "type": "string" - }, - "subreddit": { - "description": "Required. Target subreddit — 'webdev', 'r/webdev' and '/r/webdev' are all accepted. Falls back to the subreddit stored on the channel.", - "type": "string" - }, - "thumbnailUrl": { - "description": "Poster image URL for video posts. Optional — when omitted the server falls back to the video's auto-extracted poster frame, failing only if neither exists. Unlike Pinterest's coverImageUrl there is no attached-image fallback, because a Reddit media post accepts exactly one file.", - "type": "string" - }, - "title": { - "description": "Post title. Defaults to the first line of content, truncated to 300 characters.", - "type": "string" - }, - "type": { - "description": "Set to 'link' to force a link submission. Otherwise the kind is resolved from media: image -> image, video -> video, url set -> link, else self (text).", - "type": "string" - }, - "url": { - "description": "Destination URL for a link post; implies type 'link'.", - "type": "string" - } - }, - "type": "object" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - { - "additionalProperties": {}, - "properties": { - "flairId": { - "description": "Link-flair id (list via get_channel_options).", - "type": "string" - }, - "subreddit": { - "description": "Required. Target subreddit — 'webdev', 'r/webdev' and '/r/webdev' are all accepted. Falls back to the subreddit stored on the channel.", - "type": "string" - }, - "thumbnailUrl": { - "description": "Poster image URL for video posts. Optional — when omitted the server falls back to the video's auto-extracted poster frame, failing only if neither exists. Unlike Pinterest's coverImageUrl there is no attached-image fallback, because a Reddit media post accepts exactly one file.", - "type": "string" - }, - "title": { - "description": "Post title. Defaults to the first line of content, truncated to 300 characters.", - "type": "string" - }, - "type": { - "description": "Set to 'link' to force a link submission. Otherwise the kind is resolved from media: image -> image, video -> video, url set -> link, else self (text).", - "type": "string" - }, - "url": { - "description": "Destination URL for a link post; implies type 'link'.", - "type": "string" - } - }, - "type": "object" - } - ], - "description": "Reddit options, nested under the BulkPublish channel id: { \"12\": { \"subreddit\": \"webdev\" } }. A flat object (e.g. { \"subreddit\": \"webdev\" }) applies to every Reddit channel on the post. subreddit is required; a media post accepts exactly one file." -} - removed
Input schema / properties / platformSpecific / properties / telegram / additionalPropertiesRemoved value: -{} - added
Input schema / properties / platformSpecific / properties / telegram / anyOfAdded value: +[ + { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "buttons": { + "description": "Link buttons under the message, up to 3.", + "items": { + "properties": { + "label": { + "description": "Up to 64 characters.", + "type": "string" + }, + "url": { + "description": "http(s) link.", + "type": "string" + } + }, + "required": [ + "label", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "disablePreview": { + "description": "Turns off the link preview.", + "type": "boolean" + }, + "pin": { + "description": "Pin after sending. If the bot lacks the right to pin the post still publishes and a warning is recorded.", + "type": "boolean" + }, + "poll": { + "description": "Sent as a poll after the message.", + "properties": { + "anonymous": { + "description": "Default true.", + "type": "boolean" + }, + "correctOption": { + "description": "0-based index of the right answer; required when quiz is true.", + "type": "number" + }, + "multipleAnswers": { + "description": "Default false. Cannot be combined with quiz.", + "type": "boolean" + }, + "options": { + "description": "2 to 12 answers, each up to 100 characters.", + "items": { + "type": "string" + }, + "type": "array" + }, + "question": { + "description": "1 to 300 characters.", + "type": "string" + }, + "quiz": { + "description": "Default false.", + "type": "boolean" + } + }, + "required": [ + "question", + "options" + ], + "type": "object" + }, + "protectContent": { + "description": "Recipients cannot forward or save the message.", + "type": "boolean" + }, + "silent": { + "description": "Send without a notification sound.", + "type": "boolean" + }, + "spoiler": { + "description": "Hides a photo or video behind a spoiler.", + "type": "boolean" + }, + "threadId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ], + "description": "Forum topic to post into: digits only, up to 12." + } + }, + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "buttons": { + "description": "Link buttons under the message, up to 3.", + "items": { + "properties": { + "label": { + "description": "Up to 64 characters.", + "type": "string" + }, + "url": { + "description": "http(s) link.", + "type": "string" + } + }, + "required": [ + "label", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "disablePreview": { + "description": "Turns off the link preview.", + "type": "boolean" + }, + "pin": { + "description": "Pin after sending. If the bot lacks the right to pin the post still publishes and a warning is recorded.", + "type": "boolean" + }, + "poll": { + "description": "Sent as a poll after the message.", + "properties": { + "anonymous": { + "description": "Default true.", + "type": "boolean" + }, + "correctOption": { + "description": "0-based index of the right answer; required when quiz is true.", + "type": "number" + }, + "multipleAnswers": { + "description": "Default false. Cannot be combined with quiz.", + "type": "boolean" + }, + "options": { + "description": "2 to 12 answers, each up to 100 characters.", + "items": { + "type": "string" + }, + "type": "array" + }, + "question": { + "description": "1 to 300 characters.", + "type": "string" + }, + "quiz": { + "description": "Default false.", + "type": "boolean" + } + }, + "required": [ + "question", + "options" + ], + "type": "object" + }, + "protectContent": { + "description": "Recipients cannot forward or save the message.", + "type": "boolean" + }, + "silent": { + "description": "Send without a notification sound.", + "type": "boolean" + }, + "spoiler": { + "description": "Hides a photo or video behind a spoiler.", + "type": "boolean" + }, + "threadId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ], + "description": "Forum topic to post into: digits only, up to 12." + } + }, + "type": "object" + } +] - changed
Input schema / properties / platformSpecific / properties / telegram / descriptionPrevious value: -"Telegram accepts no options — the destination chat is fixed when the channel is connected. Content is sent as plain text (no markdown). Text over the 1024-char caption limit is posted as a second message alongside captionless media."New value: +"Telegram options, nested under the BulkPublish channel id: { \"12\": { \"silent\": true } }. A flat object applies to every Telegram channel on the post. The destination chat is fixed when the channel is connected. Content is sent as plain text (no markdown). Text over the 1024-char caption limit is posted as a second message alongside captionless media. Attached GIFs, audio and other files are sent as an animation, an audio file or a document according to their type." - removed
Input schema / properties / platformSpecific / properties / telegram / propertiesRemoved value: -{} - removed
Input schema / properties / platformSpecific / properties / telegram / typeRemoved value: -"object" - added
Input schema / properties / platformSpecific / properties / threads / properties / linkAttachmentAdded value: +{ + "description": "An http(s) URL on a public host shown as the preview card on a text post; left out on other post types. Threads refuses a post with more than 5 links in total, and a link here that differs from every link in the text counts as one more.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / threads / properties / pollOptionsAdded value: +{ + "description": "2 to 4 poll choices, each 1 to 25 characters. Text-only posts: on an image, video or carousel post the poll is left out. In a thread it goes on the first part when that part has no media.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / platformSpecific / properties / threads / properties / replyControlAdded value: +{ + "description": "Who can reply (default everyone). parent_post_author_only means only you. Applies to the post itself, never to later replies in a thread; ignored on a repost.", + "enum": [ + "everyone", + "accounts_you_follow", + "mentioned_only", + "parent_post_author_only", + "followers_only" + ], + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / tiktok / properties / autoAddMusicAdded value: +{ + "description": "Photo posts published directly only: lets TikTok add a recommended track (default false). Ignored with sendToDrafts.", + "type": "boolean" +} - added
Input schema / properties / platformSpecific / properties / tiktok / properties / photoCoverIndexAdded value: +{ + "description": "photo_slideshow only: which image is the cover, a whole number 0 to 34 counting from 0 in attachment order (default 0). An index past the last image falls back to the first.", + "type": "number" +} - added
Input schema / properties / platformSpecific / properties / tiktok / properties / sendToDraftsAdded value: +{ + "description": "Send a video or photo_slideshow post to the creator's TikTok drafts instead of publishing it (default false). privacyLevel is then not required, and the direct-post settings (privacyLevel, disableDuet, disableStitch, disableComment, isAigc, brandContentToggle, brandOrganicToggle, autoAddMusic, thumbnailTimestamp) are ignored. A video draft carries no caption; a photo draft sends it. Once delivered the destination becomes published with no platformUrl, and analytics are not collected.", + "type": "boolean" +} - changed
Input schema / properties / platformSpecific / properties / tumblr / anyOfPrevious value: -[ - { - "additionalProperties": { - "additionalProperties": {}, - "properties": { - "blogName": { - "description": "Which blog to publish to. Defaults to the blog the channel was connected as (list via get_channel_options).", - "type": "string" - }, - "link": { - "description": "Appended as a link block.", - "type": "string" - }, - "sourceUrl": { - "description": "Attribution URL stored as the post's source.", - "type": "string" - }, - "tags": { - "description": "Tumblr tags, without the leading '#'.", - "items": { - "type": "string" - }, - "type": "array" - }, - "title": { - "description": "Rendered as a heading block above the body.", - "type": "string" - } - }, - "type": "object" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - { - "additionalProperties": {}, - "properties": { - "blogName": { - "description": "Which blog to publish to. Defaults to the blog the channel was connected as (list via get_channel_options).", - "type": "string" - }, - "link": { - "description": "Appended as a link block.", - "type": "string" - }, - "sourceUrl": { - "description": "Attribution URL stored as the post's source.", - "type": "string" - }, - "tags": { - "description": "Tumblr tags, without the leading '#'.", - "items": { - "type": "string" - }, - "type": "array" - }, - "title": { - "description": "Rendered as a heading block above the body.", - "type": "string" - } - }, - "type": "object" - } -]New value: +[ + { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "blogName": { + "description": "Which blog to publish to. Defaults to the blog the channel was connected as (list via get_channel_options).", + "type": "string" + }, + "link": { + "description": "Appended as a link block.", + "type": "string" + }, + "reblogInteraction": { + "description": "Who can reblog the post.", + "enum": [ + "everyone", + "noone" + ], + "type": "string" + }, + "reblogUrl": { + "description": "A Tumblr post link (tumblr.com/<blog>/<id> or <blog>.tumblr.com/post/<id>): publishes a reblog of that post with your text as the comment.", + "type": "string" + }, + "slug": { + "description": "Up to 200 characters; lowercased and hyphenated into the permalink.", + "type": "string" + }, + "sourceUrl": { + "description": "Attribution URL stored as the post's source.", + "type": "string" + }, + "state": { + "description": "Default published. A scheduled post with published still goes out at its time; draft and private override that and the post is never made public by BulkPublish.", + "enum": [ + "published", + "queue", + "draft", + "private" + ], + "type": "string" + }, + "tags": { + "description": "Tumblr tags, without the leading '#'.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Rendered as a heading block above the body.", + "type": "string" + } + }, + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "blogName": { + "description": "Which blog to publish to. Defaults to the blog the channel was connected as (list via get_channel_options).", + "type": "string" + }, + "link": { + "description": "Appended as a link block.", + "type": "string" + }, + "reblogInteraction": { + "description": "Who can reblog the post.", + "enum": [ + "everyone", + "noone" + ], + "type": "string" + }, + "reblogUrl": { + "description": "A Tumblr post link (tumblr.com/<blog>/<id> or <blog>.tumblr.com/post/<id>): publishes a reblog of that post with your text as the comment.", + "type": "string" + }, + "slug": { + "description": "Up to 200 characters; lowercased and hyphenated into the permalink.", + "type": "string" + }, + "sourceUrl": { + "description": "Attribution URL stored as the post's source.", + "type": "string" + }, + "state": { + "description": "Default published. A scheduled post with published still goes out at its time; draft and private override that and the post is never made public by BulkPublish.", + "enum": [ + "published", + "queue", + "draft", + "private" + ], + "type": "string" + }, + "tags": { + "description": "Tumblr tags, without the leading '#'.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Rendered as a heading block above the body.", + "type": "string" + } + }, + "type": "object" + } +] - added
Input schema / properties / platformSpecific / properties / x / properties / communityIdAdded value: +{ + "description": "Posts into an X Community: its numeric ID or its https://x.com/i/communities/<id> URL. The account must be a member.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / x / properties / pollAdded value: +{ + "description": "Adds a poll. Cannot be combined with media or quoteId. On a thread it goes on the first post.", + "properties": { + "durationMinutes": { + "description": "How long the poll stays open, whole minutes from 5 to 10080 (7 days).", + "type": "number" + }, + "options": { + "description": "2 to 4 choices, each 1 to 25 characters.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "options", + "durationMinutes" + ], + "type": "object" +} - added
Input schema / properties / platformSpecific / properties / x / properties / quoteIdAdded value: +{ + "description": "The post to quote: its numeric ID or its x.com / twitter.com status URL. Cannot be combined with poll. On a thread it applies to the first post.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / x / properties / replySettings / descriptionAdded value: +"Who can reply: everyone, following, verified, subscribers or mentionedUsers. Applies to a single post and to the first post of a thread." - added
Input schema / properties / platformSpecific / properties / x / properties / shareWithFollowersAdded value: +{ + "description": "With communityId, also shows the post to your followers (default false). Ignored without communityId.", + "type": "boolean" +} - added
Input schema / properties / platformSpecific / properties / youtube / properties / containsSyntheticMediaAdded value: +{ + "description": "true discloses realistic altered or synthetic content. Video and short posts.", + "type": "boolean" +} - added
Input schema / properties / platformSpecific / properties / youtube / properties / defaultAudioLanguageAdded value: +{ + "description": "Language spoken in the video, e.g. 'en'.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / youtube / properties / defaultLanguageAdded value: +{ + "description": "Language of the title and description, e.g. 'en', 'pt-BR', 'zh-Hans'.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / youtube / properties / embeddableAdded value: +{ + "description": "false stops other websites embedding the video.", + "type": "boolean" +} - added
Input schema / properties / platformSpecific / properties / youtube / properties / licenseAdded value: +{ + "description": "Default youtube; creativeCommon publishes under Creative Commons Attribution.", + "enum": [ + "youtube", + "creativeCommon" + ], + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / youtube / properties / notifySubscribersAdded value: +{ + "description": "Only an explicit false changes anything: publishes without notifying subscribers.", + "type": "boolean" +} - added
Input schema / properties / platformSpecific / properties / youtube / properties / publicStatsViewableAdded value: +{ + "description": "false hides extended statistics on the watch page.", + "type": "boolean" +} - added
Input schema / properties / platformSpecific / properties / youtube / properties / recordingDateAdded value: +{ + "description": "YYYY-MM-DD or an ISO 8601 date-time; a plain date is stored as midnight UTC.", + "type": "string" +} - added
Input schema / properties / postTypeOverrides / properties / linkedin / descriptionAdded value: +"document: one PDF, Word or PowerPoint file from the media library (exactly one document, no images or videos; title from platformSpecific.linkedin.documentTitle). poll: a question with 2-4 answers from platformSpecific.linkedin.poll (needs post text, no media). reshare: shares an existing LinkedIn post from platformSpecific.linkedin.reshareId (post text optional, no media)." - changed
Input schema / properties / postTypeOverrides / properties / linkedin / enumPrevious value: -[ - "post", - "multi_image", - "pdf_carousel", - "article" -]New value: +[ + "post", + "multi_image", + "pdf_carousel", + "article", + "document", + "poll", + "reshare" +] - removed
Input schema / properties / postTypeOverrides / properties / redditRemoved value: -{ - "enum": [ - "post" - ], - "type": "string" -}
- Changed
list_media2 fields changed- changed
Input schema / properties / type / descriptionPrevious value: -"Filter by media kind (matches the MIME type prefix). The response's `total` counts matches across all pages."New value: +"Filter by media kind: image, video or document (PDF, Word and PowerPoint files). Omit for all files. The response's `total` counts matches across all pages." - changed
Input schema / properties / type / enumPrevious value: -[ - "image", - "video" -]New value: +[ + "image", + "video", + "document" +]
- Changed
update_post51 fields changed- changed
Input schema / properties / platformSpecific / descriptionPrevious value: -"Platform-specific settings, e.g. { \"youtube\": { \"title\": \"…\", \"privacyStatus\": \"public\" } }. Reddit, Discord, Tumblr and Snapchat nest their options under the BulkPublish channel id, e.g. { \"reddit\": { \"12\": { \"subreddit\": \"webdev\" } } }. Telegram takes no options."New value: +"Platform-specific settings, e.g. { \"youtube\": { \"title\": \"…\", \"privacyStatus\": \"public\" } }. Discord, Telegram, Tumblr and Snapchat nest their options under the BulkPublish channel id, e.g. { \"discord\": { \"12\": { \"channelId\": \"1090123456789012345\" } } }. Full per-platform option lists (polls, quotes, tags, drafts, settings) are on each platform key; bad values are refused with 400 VALIDATION_ERROR." - added
Input schema / properties / platformSpecific / properties / bluesky / properties / allowQuotesAdded value: +{ + "description": "false stops other accounts quoting the post (default true). Set right after publishing, like replyAllow.", + "type": "boolean" +} - added
Input schema / properties / platformSpecific / properties / bluesky / properties / contentLabelAdded value: +{ + "description": "Adds a content warning. Applies to every part of a thread.", + "enum": [ + "sexual", + "nudity", + "porn", + "graphic-media" + ], + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / bluesky / properties / langsAdded value: +{ + "description": "Up to 3 language codes such as 'en' or 'pt-BR'. Applies to every part of a thread.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / platformSpecific / properties / bluesky / properties / quoteIdAdded value: +{ + "description": "The post to quote: a bsky.app post link or an at:// URI (a bare ID is read as one of your own posts). Replaces a link card; with media attached both appear together. Publishing fails before anything is posted if the post cannot be found.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / bluesky / properties / replyAllowAdded value: +{ + "description": "Who can reply. Omitted or [] means everyone; otherwise ['nobody'] or any mix of mention, following, follower ('nobody' cannot be combined). Set right after the post publishes; if Bluesky refuses it the post stays published without it. First post of a thread.", + "items": { + "enum": [ + "nobody", + "mention", + "following", + "follower" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / platformSpecific / properties / discord / anyOfPrevious value: -[ - { - "additionalProperties": { - "additionalProperties": {}, - "properties": { - "channelId": { - "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key. List postable channels via get_channel_options.", - "type": "string" - } - }, - "type": "object" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - { - "additionalProperties": {}, - "properties": { - "channelId": { - "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key. List postable channels via get_channel_options.", - "type": "string" - } - }, - "type": "object" - } -]New value: +[ + { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "buttons": { + "description": "Link buttons, up to 5.", + "items": { + "properties": { + "label": { + "description": "Up to 80 characters.", + "type": "string" + }, + "url": { + "description": "http(s) link.", + "type": "string" + } + }, + "required": [ + "label", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "channelId": { + "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key. List postable channels via get_channel_options.", + "type": "string" + }, + "embed": { + "description": "Send the text as a rich embed with the first image inside.", + "properties": { + "color": { + "enum": [ + "orange", + "blue", + "green", + "red", + "purple", + "gray" + ], + "type": "string" + }, + "title": { + "description": "Up to 256 characters.", + "type": "string" + } + }, + "type": "object" + }, + "pin": { + "description": "Pin the message. If Discord refuses, the post stays published and a warning is recorded. The bot needs the Pin Messages permission.", + "type": "boolean" + }, + "poll": { + "description": "A native poll. The bot needs the Send Polls permission.", + "properties": { + "answers": { + "description": "2 to 10 answers, each up to 55 characters.", + "items": { + "type": "string" + }, + "type": "array" + }, + "durationHours": { + "description": "Whole hours 1 to 768 (default 24).", + "type": "number" + }, + "multiselect": { + "type": "boolean" + }, + "question": { + "description": "Up to 300 characters.", + "type": "string" + } + }, + "required": [ + "question", + "answers" + ], + "type": "object" + }, + "silent": { + "description": "Suppress notifications for the message.", + "type": "boolean" + }, + "startThread": { + "description": "Start a thread from the message (no effect on a forum channel).", + "type": "boolean" + }, + "tags": { + "description": "Up to 5 forum tag IDs (digits) for a forum channel; IDs come from get_channel_options.", + "items": { + "type": "string" + }, + "type": "array" + }, + "threadName": { + "description": "Name for that thread, up to 100 characters.", + "type": "string" + } + }, + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "buttons": { + "description": "Link buttons, up to 5.", + "items": { + "properties": { + "label": { + "description": "Up to 80 characters.", + "type": "string" + }, + "url": { + "description": "http(s) link.", + "type": "string" + } + }, + "required": [ + "label", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "channelId": { + "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key. List postable channels via get_channel_options.", + "type": "string" + }, + "embed": { + "description": "Send the text as a rich embed with the first image inside.", + "properties": { + "color": { + "enum": [ + "orange", + "blue", + "green", + "red", + "purple", + "gray" + ], + "type": "string" + }, + "title": { + "description": "Up to 256 characters.", + "type": "string" + } + }, + "type": "object" + }, + "pin": { + "description": "Pin the message. If Discord refuses, the post stays published and a warning is recorded. The bot needs the Pin Messages permission.", + "type": "boolean" + }, + "poll": { + "description": "A native poll. The bot needs the Send Polls permission.", + "properties": { + "answers": { + "description": "2 to 10 answers, each up to 55 characters.", + "items": { + "type": "string" + }, + "type": "array" + }, + "durationHours": { + "description": "Whole hours 1 to 768 (default 24).", + "type": "number" + }, + "multiselect": { + "type": "boolean" + }, + "question": { + "description": "Up to 300 characters.", + "type": "string" + } + }, + "required": [ + "question", + "answers" + ], + "type": "object" + }, + "silent": { + "description": "Suppress notifications for the message.", + "type": "boolean" + }, + "startThread": { + "description": "Start a thread from the message (no effect on a forum channel).", + "type": "boolean" + }, + "tags": { + "description": "Up to 5 forum tag IDs (digits) for a forum channel; IDs come from get_channel_options.", + "items": { + "type": "string" + }, + "type": "array" + }, + "threadName": { + "description": "Name for that thread, up to 100 characters.", + "type": "string" + } + }, + "type": "object" + } +] - added
Input schema / properties / platformSpecific / properties / facebook / properties / textFormatPresetIdAdded value: +{ + "description": "Digits only (a Facebook background ID). Shows a short text post on a coloured background. Used only on a Page feed post with no photo, video or link card and at most 130 characters; anywhere else it is left out and the post publishes as plain text. If Facebook refuses the background the post is published once more without it.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / instagram / properties / locationIdAdded value: +{ + "description": "Digits only: the numeric ID of a Facebook Page that has a location. Applies to photos, videos, Reels and carousels, not Stories. Instagram refuses the post if it does not recognise the ID as a place.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / instagram / properties / shareToFeedAdded value: +{ + "description": "Reels only. false shows the Reel only in the Reels tab; true also shows it in the main feed. Omitted: Instagram's own default (feed and Reels tab).", + "type": "boolean" +} - added
Input schema / properties / platformSpecific / properties / instagram / properties / userTagsAdded value: +{ + "description": "People tagged in the post, up to 20 per photo or video. On a photo (and each photo of a carousel) a tag needs x and y or it is left out; on a Reel or video post people are tagged by username only and any position is ignored. Carousel videos and Stories carry no tags.", + "items": { + "properties": { + "mediaIndex": { + "description": "Which attached media item the tag belongs to, counting from 0 in attachment order (default 0).", + "type": "number" + }, + "username": { + "description": "A public Instagram username, leading @ optional.", + "type": "string" + }, + "x": { + "description": "Position on the photo, 0 to 1 from the left. Give x and y together or not at all.", + "type": "number" + }, + "y": { + "description": "Position on the photo, 0 to 1 from the top.", + "type": "number" + } + }, + "required": [ + "username" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / platformSpecific / properties / linkedin / properties / disableReshareAdded value: +{ + "description": "true stops other members resharing the post (default false).", + "type": "boolean" +} - added
Input schema / properties / platformSpecific / properties / linkedin / properties / documentTitleAdded value: +{ + "description": "`document` posts only: the title shown above the document in the feed. Defaults to the file's name.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / linkedin / properties / pollAdded value: +{ + "description": "Required for `poll` posts, which also need post text and take no media.", + "properties": { + "duration": { + "description": "Default THREE_DAYS.", + "enum": [ + "ONE_DAY", + "THREE_DAYS", + "SEVEN_DAYS", + "FOURTEEN_DAYS" + ], + "type": "string" + }, + "options": { + "description": "2 to 4 answers, each up to 30 characters; blank entries are ignored.", + "items": { + "type": "string" + }, + "type": "array" + }, + "question": { + "description": "Up to 140 characters.", + "type": "string" + } + }, + "required": [ + "question", + "options" + ], + "type": "object" +} - added
Input schema / properties / platformSpecific / properties / linkedin / properties / reshareIdAdded value: +{ + "description": "Required for `reshare` posts: the post's LinkedIn link, or its urn:li:share:<id> / urn:li:ugcPost:<id> ID. Activity links (urn:li:activity:<id>) cannot be reshared.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / linkedin / properties / thumbnailUrlAdded value: +{ + "description": "Cover for a `post` that carries a video: a public http(s) link to an image of up to 10MB. A cover that cannot be fetched is skipped and LinkedIn picks the frame.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / linkedin / properties / visibilityAdded value: +{ + "description": "Who can see the post (default PUBLIC). CONNECTIONS applies to personal profiles only; on a Page it is published as PUBLIC.", + "enum": [ + "PUBLIC", + "CONNECTIONS", + "LOGGED_IN" + ], + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / mastodon / properties / pollAdded value: +{ + "description": "Adds a poll. Cannot be combined with media. First post of a thread. A server with tighter limits refuses it at publish time.", + "properties": { + "expiresIn": { + "description": "Seconds the poll stays open, 300 to 2629746.", + "type": "number" + }, + "hideTotals": { + "description": "Hide counts until the poll ends (default false).", + "type": "boolean" + }, + "multiple": { + "description": "Voters may pick more than one choice (default false).", + "type": "boolean" + }, + "options": { + "description": "2 to 4 choices, each 1 to 50 characters.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "options", + "expiresIn" + ], + "type": "object" +} - added
Input schema / properties / platformSpecific / properties / mastodon / properties / quoteIdAdded value: +{ + "description": "The post to quote: its URL, or its status ID on your own server. Needs a server running Mastodon 4.5 or later, otherwise publishing fails and nothing is posted.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / mastodon / properties / sensitiveAdded value: +{ + "description": "Hides attached media behind a click (default false). No effect without media. Applies to every part of a thread.", + "type": "boolean" +} - added
Input schema / properties / platformSpecific / properties / pinterest / properties / boardSectionIdAdded value: +{ + "description": "Numeric ID of a section of the chosen board (list with get_channel_options and boardId). Send it beside its board, per channel or flat. Pin, video_pin and carousel. A flat value is ignored for a channel with its own boardId, and any section is ignored when no board was chosen.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / pinterest / properties / coverKeyFrameTimeAdded value: +{ + "description": "video_pin only: use the frame at this many seconds (whole number, 0 or more) as the cover. A time past the end uses the last frame; coverImageUrl wins when both are sent.", + "type": "number" +} - removed
Input schema / properties / platformSpecific / properties / redditRemoved value: -{ - "anyOf": [ - { - "additionalProperties": { - "additionalProperties": {}, - "properties": { - "flairId": { - "description": "Link-flair id (list via get_channel_options).", - "type": "string" - }, - "subreddit": { - "description": "Required. Target subreddit — 'webdev', 'r/webdev' and '/r/webdev' are all accepted. Falls back to the subreddit stored on the channel.", - "type": "string" - }, - "thumbnailUrl": { - "description": "Poster image URL for video posts. Optional — when omitted the server falls back to the video's auto-extracted poster frame, failing only if neither exists. Unlike Pinterest's coverImageUrl there is no attached-image fallback, because a Reddit media post accepts exactly one file.", - "type": "string" - }, - "title": { - "description": "Post title. Defaults to the first line of content, truncated to 300 characters.", - "type": "string" - }, - "type": { - "description": "Set to 'link' to force a link submission. Otherwise the kind is resolved from media: image -> image, video -> video, url set -> link, else self (text).", - "type": "string" - }, - "url": { - "description": "Destination URL for a link post; implies type 'link'.", - "type": "string" - } - }, - "type": "object" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - { - "additionalProperties": {}, - "properties": { - "flairId": { - "description": "Link-flair id (list via get_channel_options).", - "type": "string" - }, - "subreddit": { - "description": "Required. Target subreddit — 'webdev', 'r/webdev' and '/r/webdev' are all accepted. Falls back to the subreddit stored on the channel.", - "type": "string" - }, - "thumbnailUrl": { - "description": "Poster image URL for video posts. Optional — when omitted the server falls back to the video's auto-extracted poster frame, failing only if neither exists. Unlike Pinterest's coverImageUrl there is no attached-image fallback, because a Reddit media post accepts exactly one file.", - "type": "string" - }, - "title": { - "description": "Post title. Defaults to the first line of content, truncated to 300 characters.", - "type": "string" - }, - "type": { - "description": "Set to 'link' to force a link submission. Otherwise the kind is resolved from media: image -> image, video -> video, url set -> link, else self (text).", - "type": "string" - }, - "url": { - "description": "Destination URL for a link post; implies type 'link'.", - "type": "string" - } - }, - "type": "object" - } - ], - "description": "Reddit options, nested under the BulkPublish channel id: { \"12\": { \"subreddit\": \"webdev\" } }. A flat object (e.g. { \"subreddit\": \"webdev\" }) applies to every Reddit channel on the post. subreddit is required; a media post accepts exactly one file." -} - removed
Input schema / properties / platformSpecific / properties / telegram / additionalPropertiesRemoved value: -{} - added
Input schema / properties / platformSpecific / properties / telegram / anyOfAdded value: +[ + { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "buttons": { + "description": "Link buttons under the message, up to 3.", + "items": { + "properties": { + "label": { + "description": "Up to 64 characters.", + "type": "string" + }, + "url": { + "description": "http(s) link.", + "type": "string" + } + }, + "required": [ + "label", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "disablePreview": { + "description": "Turns off the link preview.", + "type": "boolean" + }, + "pin": { + "description": "Pin after sending. If the bot lacks the right to pin the post still publishes and a warning is recorded.", + "type": "boolean" + }, + "poll": { + "description": "Sent as a poll after the message.", + "properties": { + "anonymous": { + "description": "Default true.", + "type": "boolean" + }, + "correctOption": { + "description": "0-based index of the right answer; required when quiz is true.", + "type": "number" + }, + "multipleAnswers": { + "description": "Default false. Cannot be combined with quiz.", + "type": "boolean" + }, + "options": { + "description": "2 to 12 answers, each up to 100 characters.", + "items": { + "type": "string" + }, + "type": "array" + }, + "question": { + "description": "1 to 300 characters.", + "type": "string" + }, + "quiz": { + "description": "Default false.", + "type": "boolean" + } + }, + "required": [ + "question", + "options" + ], + "type": "object" + }, + "protectContent": { + "description": "Recipients cannot forward or save the message.", + "type": "boolean" + }, + "silent": { + "description": "Send without a notification sound.", + "type": "boolean" + }, + "spoiler": { + "description": "Hides a photo or video behind a spoiler.", + "type": "boolean" + }, + "threadId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ], + "description": "Forum topic to post into: digits only, up to 12." + } + }, + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "buttons": { + "description": "Link buttons under the message, up to 3.", + "items": { + "properties": { + "label": { + "description": "Up to 64 characters.", + "type": "string" + }, + "url": { + "description": "http(s) link.", + "type": "string" + } + }, + "required": [ + "label", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "disablePreview": { + "description": "Turns off the link preview.", + "type": "boolean" + }, + "pin": { + "description": "Pin after sending. If the bot lacks the right to pin the post still publishes and a warning is recorded.", + "type": "boolean" + }, + "poll": { + "description": "Sent as a poll after the message.", + "properties": { + "anonymous": { + "description": "Default true.", + "type": "boolean" + }, + "correctOption": { + "description": "0-based index of the right answer; required when quiz is true.", + "type": "number" + }, + "multipleAnswers": { + "description": "Default false. Cannot be combined with quiz.", + "type": "boolean" + }, + "options": { + "description": "2 to 12 answers, each up to 100 characters.", + "items": { + "type": "string" + }, + "type": "array" + }, + "question": { + "description": "1 to 300 characters.", + "type": "string" + }, + "quiz": { + "description": "Default false.", + "type": "boolean" + } + }, + "required": [ + "question", + "options" + ], + "type": "object" + }, + "protectContent": { + "description": "Recipients cannot forward or save the message.", + "type": "boolean" + }, + "silent": { + "description": "Send without a notification sound.", + "type": "boolean" + }, + "spoiler": { + "description": "Hides a photo or video behind a spoiler.", + "type": "boolean" + }, + "threadId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ], + "description": "Forum topic to post into: digits only, up to 12." + } + }, + "type": "object" + } +] - changed
Input schema / properties / platformSpecific / properties / telegram / descriptionPrevious value: -"Telegram accepts no options — the destination chat is fixed when the channel is connected. Content is sent as plain text (no markdown). Text over the 1024-char caption limit is posted as a second message alongside captionless media."New value: +"Telegram options, nested under the BulkPublish channel id: { \"12\": { \"silent\": true } }. A flat object applies to every Telegram channel on the post. The destination chat is fixed when the channel is connected. Content is sent as plain text (no markdown). Text over the 1024-char caption limit is posted as a second message alongside captionless media. Attached GIFs, audio and other files are sent as an animation, an audio file or a document according to their type." - removed
Input schema / properties / platformSpecific / properties / telegram / propertiesRemoved value: -{} - removed
Input schema / properties / platformSpecific / properties / telegram / typeRemoved value: -"object" - added
Input schema / properties / platformSpecific / properties / threads / properties / linkAttachmentAdded value: +{ + "description": "An http(s) URL on a public host shown as the preview card on a text post; left out on other post types. Threads refuses a post with more than 5 links in total, and a link here that differs from every link in the text counts as one more.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / threads / properties / pollOptionsAdded value: +{ + "description": "2 to 4 poll choices, each 1 to 25 characters. Text-only posts: on an image, video or carousel post the poll is left out. In a thread it goes on the first part when that part has no media.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / platformSpecific / properties / threads / properties / replyControlAdded value: +{ + "description": "Who can reply (default everyone). parent_post_author_only means only you. Applies to the post itself, never to later replies in a thread; ignored on a repost.", + "enum": [ + "everyone", + "accounts_you_follow", + "mentioned_only", + "parent_post_author_only", + "followers_only" + ], + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / tiktok / properties / autoAddMusicAdded value: +{ + "description": "Photo posts published directly only: lets TikTok add a recommended track (default false). Ignored with sendToDrafts.", + "type": "boolean" +} - added
Input schema / properties / platformSpecific / properties / tiktok / properties / photoCoverIndexAdded value: +{ + "description": "photo_slideshow only: which image is the cover, a whole number 0 to 34 counting from 0 in attachment order (default 0). An index past the last image falls back to the first.", + "type": "number" +} - added
Input schema / properties / platformSpecific / properties / tiktok / properties / sendToDraftsAdded value: +{ + "description": "Send a video or photo_slideshow post to the creator's TikTok drafts instead of publishing it (default false). privacyLevel is then not required, and the direct-post settings (privacyLevel, disableDuet, disableStitch, disableComment, isAigc, brandContentToggle, brandOrganicToggle, autoAddMusic, thumbnailTimestamp) are ignored. A video draft carries no caption; a photo draft sends it. Once delivered the destination becomes published with no platformUrl, and analytics are not collected.", + "type": "boolean" +} - changed
Input schema / properties / platformSpecific / properties / tumblr / anyOfPrevious value: -[ - { - "additionalProperties": { - "additionalProperties": {}, - "properties": { - "blogName": { - "description": "Which blog to publish to. Defaults to the blog the channel was connected as (list via get_channel_options).", - "type": "string" - }, - "link": { - "description": "Appended as a link block.", - "type": "string" - }, - "sourceUrl": { - "description": "Attribution URL stored as the post's source.", - "type": "string" - }, - "tags": { - "description": "Tumblr tags, without the leading '#'.", - "items": { - "type": "string" - }, - "type": "array" - }, - "title": { - "description": "Rendered as a heading block above the body.", - "type": "string" - } - }, - "type": "object" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - { - "additionalProperties": {}, - "properties": { - "blogName": { - "description": "Which blog to publish to. Defaults to the blog the channel was connected as (list via get_channel_options).", - "type": "string" - }, - "link": { - "description": "Appended as a link block.", - "type": "string" - }, - "sourceUrl": { - "description": "Attribution URL stored as the post's source.", - "type": "string" - }, - "tags": { - "description": "Tumblr tags, without the leading '#'.", - "items": { - "type": "string" - }, - "type": "array" - }, - "title": { - "description": "Rendered as a heading block above the body.", - "type": "string" - } - }, - "type": "object" - } -]New value: +[ + { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "blogName": { + "description": "Which blog to publish to. Defaults to the blog the channel was connected as (list via get_channel_options).", + "type": "string" + }, + "link": { + "description": "Appended as a link block.", + "type": "string" + }, + "reblogInteraction": { + "description": "Who can reblog the post.", + "enum": [ + "everyone", + "noone" + ], + "type": "string" + }, + "reblogUrl": { + "description": "A Tumblr post link (tumblr.com/<blog>/<id> or <blog>.tumblr.com/post/<id>): publishes a reblog of that post with your text as the comment.", + "type": "string" + }, + "slug": { + "description": "Up to 200 characters; lowercased and hyphenated into the permalink.", + "type": "string" + }, + "sourceUrl": { + "description": "Attribution URL stored as the post's source.", + "type": "string" + }, + "state": { + "description": "Default published. A scheduled post with published still goes out at its time; draft and private override that and the post is never made public by BulkPublish.", + "enum": [ + "published", + "queue", + "draft", + "private" + ], + "type": "string" + }, + "tags": { + "description": "Tumblr tags, without the leading '#'.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Rendered as a heading block above the body.", + "type": "string" + } + }, + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "blogName": { + "description": "Which blog to publish to. Defaults to the blog the channel was connected as (list via get_channel_options).", + "type": "string" + }, + "link": { + "description": "Appended as a link block.", + "type": "string" + }, + "reblogInteraction": { + "description": "Who can reblog the post.", + "enum": [ + "everyone", + "noone" + ], + "type": "string" + }, + "reblogUrl": { + "description": "A Tumblr post link (tumblr.com/<blog>/<id> or <blog>.tumblr.com/post/<id>): publishes a reblog of that post with your text as the comment.", + "type": "string" + }, + "slug": { + "description": "Up to 200 characters; lowercased and hyphenated into the permalink.", + "type": "string" + }, + "sourceUrl": { + "description": "Attribution URL stored as the post's source.", + "type": "string" + }, + "state": { + "description": "Default published. A scheduled post with published still goes out at its time; draft and private override that and the post is never made public by BulkPublish.", + "enum": [ + "published", + "queue", + "draft", + "private" + ], + "type": "string" + }, + "tags": { + "description": "Tumblr tags, without the leading '#'.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Rendered as a heading block above the body.", + "type": "string" + } + }, + "type": "object" + } +] - added
Input schema / properties / platformSpecific / properties / x / properties / communityIdAdded value: +{ + "description": "Posts into an X Community: its numeric ID or its https://x.com/i/communities/<id> URL. The account must be a member.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / x / properties / pollAdded value: +{ + "description": "Adds a poll. Cannot be combined with media or quoteId. On a thread it goes on the first post.", + "properties": { + "durationMinutes": { + "description": "How long the poll stays open, whole minutes from 5 to 10080 (7 days).", + "type": "number" + }, + "options": { + "description": "2 to 4 choices, each 1 to 25 characters.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "options", + "durationMinutes" + ], + "type": "object" +} - added
Input schema / properties / platformSpecific / properties / x / properties / quoteIdAdded value: +{ + "description": "The post to quote: its numeric ID or its x.com / twitter.com status URL. Cannot be combined with poll. On a thread it applies to the first post.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / x / properties / replySettings / descriptionAdded value: +"Who can reply: everyone, following, verified, subscribers or mentionedUsers. Applies to a single post and to the first post of a thread." - added
Input schema / properties / platformSpecific / properties / x / properties / shareWithFollowersAdded value: +{ + "description": "With communityId, also shows the post to your followers (default false). Ignored without communityId.", + "type": "boolean" +} - added
Input schema / properties / platformSpecific / properties / youtube / properties / containsSyntheticMediaAdded value: +{ + "description": "true discloses realistic altered or synthetic content. Video and short posts.", + "type": "boolean" +} - added
Input schema / properties / platformSpecific / properties / youtube / properties / defaultAudioLanguageAdded value: +{ + "description": "Language spoken in the video, e.g. 'en'.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / youtube / properties / defaultLanguageAdded value: +{ + "description": "Language of the title and description, e.g. 'en', 'pt-BR', 'zh-Hans'.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / youtube / properties / embeddableAdded value: +{ + "description": "false stops other websites embedding the video.", + "type": "boolean" +} - added
Input schema / properties / platformSpecific / properties / youtube / properties / licenseAdded value: +{ + "description": "Default youtube; creativeCommon publishes under Creative Commons Attribution.", + "enum": [ + "youtube", + "creativeCommon" + ], + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / youtube / properties / notifySubscribersAdded value: +{ + "description": "Only an explicit false changes anything: publishes without notifying subscribers.", + "type": "boolean" +} - added
Input schema / properties / platformSpecific / properties / youtube / properties / publicStatsViewableAdded value: +{ + "description": "false hides extended statistics on the watch page.", + "type": "boolean" +} - added
Input schema / properties / platformSpecific / properties / youtube / properties / recordingDateAdded value: +{ + "description": "YYYY-MM-DD or an ISO 8601 date-time; a plain date is stored as midnight UTC.", + "type": "string" +} - added
Input schema / properties / postTypeOverrides / properties / linkedin / descriptionAdded value: +"document: one PDF, Word or PowerPoint file from the media library (exactly one document, no images or videos; title from platformSpecific.linkedin.documentTitle). poll: a question with 2-4 answers from platformSpecific.linkedin.poll (needs post text, no media). reshare: shares an existing LinkedIn post from platformSpecific.linkedin.reshareId (post text optional, no media)." - changed
Input schema / properties / postTypeOverrides / properties / linkedin / enumPrevious value: -[ - "post", - "multi_image", - "pdf_carousel", - "article" -]New value: +[ + "post", + "multi_image", + "pdf_carousel", + "article", + "document", + "poll", + "reshare" +] - removed
Input schema / properties / postTypeOverrides / properties / redditRemoved value: -{ - "enum": [ - "post" - ], - "type": "string" -}
8 tool updates
- Changed
create_post1 field changed- changed
Input schema / properties / linkTrackingOverride / descriptionPrevious value: -"Optional per-post override for link tracking (bulkpubli.sh). true forces links in this post to be shortened and their clicks counted, false forces them to publish as written, and null/omitted (the default) inherits the organization's Link Tracking setting. Shortening happens at publish time, per channel, so two accounts on the same platform get distinct codes; it is skipped for a channel when the rewrite would push the post past that platform's character limit (a short URL is 28 characters and can be longer than the link it replaces)."New value: +"Optional per-post override for link tracking (bulkpubli.sh). true forces links in this post to be shortened and their clicks counted, false forces them to publish as written, and null/omitted (the default) inherits the organization's Link Tracking setting. Shortening happens at publish time, per channel, so two accounts on the same platform get distinct codes; it is skipped for a channel when the rewrite would push the post past that platform's character limit (a short URL is 28 characters and can be longer than the link it replaces). Short links are part of the Pro and Business plans: on Free, links always publish as written and true has no effect."
- Added
get_conversation - Added
list_conversations - Added
list_post_comments - Added
moderate_comment - Added
reply_to_comment - Added
reply_to_conversation - Added
update_conversation
3 tool updates
- Changed
create_post3 fields changed- changed
Input schema / properties / platformSpecific / properties / snapchat / descriptionPrevious value: -"Snapchat options, nested under the BulkPublish channel id: { \"12\": { \"title\": \"My story\" } }. A flat object applies to every Snapchat channel on the post. Post types: story (default), saved_story, spotlight. Every Snapchat post requires exactly ONE image or video (vertical, videos 5–60s, spotlight 6–60s video-only, max 1GB). The caption is NOT sent for plain stories — it is only the Spotlight description (160 chars max) and the Saved Story title fallback. First comments are not supported."New value: +"Snapchat options, nested under the BulkPublish channel id: { \"12\": { \"title\": \"My story\" } }. A flat object applies to every Snapchat channel on the post. Post types: story (default), saved_story, spotlight. Every Snapchat post requires exactly ONE image or video (vertical, story videos 5–60s, spotlight 6–60s video-only, saved_story videos not length-checked, max 1GB; a video outside its range is refused when the post is scheduled or published). The caption is NOT sent for plain stories — it is only the Spotlight description (160 chars max) and the Saved Story title fallback. First comments are not supported." - changed
Input schema / properties / postTypeOverrides / descriptionPrevious value: -"Per-platform post type override. E.g. { \"instagram\": \"reel\", \"youtube\": \"short\" }."New value: +"Per-platform post type override. E.g. { \"instagram\": \"reel\", \"youtube\": \"short\" }. Video length is checked per type when the post is scheduled or published, and a video outside the range is refused: instagram reel/feed_video 3s–15min, story 3–60s; facebook reel 3–90s, story 3–60s; threads video/carousel up to 5min; linkedin 3s–30min; pinterest video_pin at least 4s; snapchat story 5–60s, spotlight 6–60s (saved_story not checked)." - changed
Input schema / properties / postTypeOverrides / properties / snapchat / descriptionPrevious value: -"story (default): 1 image or video, caption NOT sent. saved_story: 1 image or video with a title. spotlight: video only, 6–60s, caption becomes the description."New value: +"story (default): 1 image or video, caption NOT sent. saved_story: 1 image or video with a title. spotlight: video only, 6–60s, caption becomes the description. Story videos must be 5–60s; a video outside its range is refused when the post is scheduled or published. saved_story video length is not checked."
- Changed
get_analytics1 field changed- added
Input schema / properties / tzAdded value: +{ + "description": "IANA timezone (e.g. \"Asia/Karachi\") that sets where each day starts and ends and how daily counts are grouped. Defaults to UTC; pass the user's zone so 'today' and daily figures match their calendar.", + "type": "string" +}
- Changed
update_post3 fields changed- changed
Input schema / properties / platformSpecific / properties / snapchat / descriptionPrevious value: -"Snapchat options, nested under the BulkPublish channel id: { \"12\": { \"title\": \"My story\" } }. A flat object applies to every Snapchat channel on the post. Post types: story (default), saved_story, spotlight. Every Snapchat post requires exactly ONE image or video (vertical, videos 5–60s, spotlight 6–60s video-only, max 1GB). The caption is NOT sent for plain stories — it is only the Spotlight description (160 chars max) and the Saved Story title fallback. First comments are not supported."New value: +"Snapchat options, nested under the BulkPublish channel id: { \"12\": { \"title\": \"My story\" } }. A flat object applies to every Snapchat channel on the post. Post types: story (default), saved_story, spotlight. Every Snapchat post requires exactly ONE image or video (vertical, story videos 5–60s, spotlight 6–60s video-only, saved_story videos not length-checked, max 1GB; a video outside its range is refused when the post is scheduled or published). The caption is NOT sent for plain stories — it is only the Spotlight description (160 chars max) and the Saved Story title fallback. First comments are not supported." - changed
Input schema / properties / postTypeOverrides / descriptionPrevious value: -"Per-platform post type override. E.g. { \"instagram\": \"reel\", \"youtube\": \"short\" }."New value: +"Per-platform post type override. E.g. { \"instagram\": \"reel\", \"youtube\": \"short\" }. Video length is checked per type when the post is scheduled or published, and a video outside the range is refused: instagram reel/feed_video 3s–15min, story 3–60s; facebook reel 3–90s, story 3–60s; threads video/carousel up to 5min; linkedin 3s–30min; pinterest video_pin at least 4s; snapchat story 5–60s, spotlight 6–60s (saved_story not checked)." - changed
Input schema / properties / postTypeOverrides / properties / snapchat / descriptionPrevious value: -"story (default): 1 image or video, caption NOT sent. saved_story: 1 image or video with a title. spotlight: video only, 6–60s, caption becomes the description."New value: +"story (default): 1 image or video, caption NOT sent. saved_story: 1 image or video with a title. spotlight: video only, 6–60s, caption becomes the description. Story videos must be 5–60s; a video outside its range is refused when the post is scheduled or published. saved_story video length is not checked."
8 tool updates
- Changed
create_post24 fields changed- changed
Input schema / properties / content / descriptionPrevious value: -"The post text content. Optional — defaults to empty for media-only posts."New value: +"The post text content. Optional — defaults to empty for media-only posts. LinkedIn mentions: write @[Display Name](urn:li:organization:ID) for a Page or @[Display Name](urn:li:person:ID) for a person; search_mentions on a LinkedIn channel returns ready-made Page tokens. The token publishes as a real mention on LinkedIn and as plain @Display Name on other channels." - added
Input schema / properties / platformSpecific / properties / bluesky / properties / repostIdAdded value: +{ + "description": "With postTypeOverrides.bluesky = 'repost': the bsky.app post URL (or at:// URI) to repost.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / facebook / properties / thumbnailUrlAdded value: +{ + "description": "Cover image URL for a video or Reel. Facebook only accepts a cover once the video exists, so it is applied after the video publishes and appears a moment after the post; a cover that cannot be fetched or that Facebook rejects leaves the video published with Facebook's own chosen frame rather than failing the post.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / instagram / properties / collaborators / descriptionAdded value: +"Comma-separated Instagram usernames (no leading @) tagged as co-authors. Applies with postTypeOverrides.instagram of 'feed_photo', 'feed_video', 'reel' or 'carousel' — on a carousel the co-authors are set on the carousel itself, not on its individual items. Ignored on 'story', which has no co-author concept." - added
Input schema / properties / platformSpecific / properties / instagram / properties / coverUrlAdded value: +{ + "description": "Cover image URL for a video or Reel. Takes precedence over thumbnailTimestamp: Instagram accepts one or the other and rejects a request carrying both, so only this one is forwarded when both are sent.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / instagram / properties / graduationStrategy / descriptionAdded value: +"How a trial reel becomes a normal one: 'manual' (the creator releases it) or 'auto' (released automatically if it performs well). Default 'manual'. Ignored unless trialReel is true." - added
Input schema / properties / platformSpecific / properties / instagram / properties / thumbnailTimestamp / descriptionAdded value: +"Cover frame for a video or Reel, in seconds from the start. Applies to postTypeOverrides.instagram of 'feed_video' or 'reel'. Ignored when coverUrl is also set." - added
Input schema / properties / platformSpecific / properties / instagram / properties / trialReel / descriptionAdded value: +"Publish as a trial reel, shown to people who do not follow the account first. Only takes effect with postTypeOverrides.instagram of 'reel' — a 'feed_video' publishes as an ordinary reel and this is ignored, even though both use the same underlying reel container." - added
Input schema / properties / platformSpecific / properties / mastodon / properties / repostIdAdded value: +{ + "description": "With postTypeOverrides.mastodon = 'repost': the status URL or ID to boost.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / threads / properties / locationIdAdded value: +{ + "description": "Numeric place ID from get_channel_options with a `q` search on a Threads channel. Only works once the channel has granted location tagging.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / threads / properties / repostIdAdded value: +{ + "description": "With postTypeOverrides.threads = 'repost': the numeric ID of the Threads post to repost (Threads links cannot be used; the ID of a post published through BulkPublish is in get_post's platforms[].platformPostId).", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / threads / properties / topicTagAdded value: +{ + "description": "One topic tag for the post, without a leading '#'. Must not contain periods or ampersands.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / tiktok / properties / thumbnailTimestamp / descriptionAdded value: +"Cover frame for the video, in seconds from the start." - changed
Input schema / properties / platformSpecific / properties / tumblr / descriptionPrevious value: -"Tumblr options, nested under the BulkPublish channel id: { \"12\": { \"blogName\": \"myblog\", \"tags\": [\"art\"] } }. A flat object applies to every Tumblr channel on the post. Up to 30 images OR exactly one video per post."New value: +"Tumblr options, nested under the BulkPublish channel id: { \"12\": { \"blogName\": \"myblog\", \"tags\": [\"art\"] } } (tags: array of strings or one comma-separated string). A flat object applies to every Tumblr channel on the post. Up to 30 images OR exactly one video per post." - added
Input schema / properties / platformSpecific / properties / x / properties / repostIdAdded value: +{ + "description": "With postTypeOverrides.x = 'repost': the X post URL or ID to repost (retweet).", + "type": "string" +} - changed
Input schema / properties / postTypeOverrides / properties / bluesky / enumPrevious value: -[ - "post", - "video" -]New value: +[ + "post", + "video", + "thread", + "repost" +] - changed
Input schema / properties / postTypeOverrides / properties / mastodon / enumPrevious value: -[ - "post" -]New value: +[ + "post", + "thread", + "repost" +] - changed
Input schema / properties / postTypeOverrides / properties / threads / enumPrevious value: -[ - "text", - "image", - "video", - "carousel" -]New value: +[ + "text", + "image", + "video", + "carousel", + "repost" +] - changed
Input schema / properties / postTypeOverrides / properties / x / enumPrevious value: -[ - "tweet", - "video", - "thread" -]New value: +[ + "tweet", + "video", + "thread", + "repost" +] - added
Input schema / properties / publishWhenApprovedAdded value: +{ + "description": "Optional (default false). Set true on a post that waits for approval when it should go out as soon as it is approved, even if that is after its scheduled time. This is how someone who needs approval says 'publish now': status 'scheduled', scheduledAt = now, requestApproval true (or a contributor key), publishWhenApproved true. An approval arriving more than 15 minutes late then publishes immediately; with false it is approved but returned to draft for a new time. Stored only when the post ends up approvalStatus 'pending'; otherwise saved as false.", + "type": "boolean" +} - changed
Input schema / properties / threadParts / descriptionPrevious value: -"Thread parts array. Required when postFormat is thread (min 2 parts)."New value: +"Thread parts array. Required when postFormat is thread (min 2 parts). EVERY part is measured against the character limit of every platform the post targets, not only the first — an over-long part is rejected with 400 VALIDATION_ERROR naming the part number, the platform and its limit. URLs count as 23 characters on X and Mastodon, their real length elsewhere." - added
Output schema / properties / approverAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Who approved it: { id, name, image }. Null unless approvalStatus is approved." +} - added
Output schema / properties / assigneeAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Who is expected to act on it next: { id, name, image }. Null when nobody is." +} - added
Output schema / properties / authorAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Who wrote the post: { id, name, image }. Null when that account is gone." +}
- Changed
get_analytics6 fields changed- added
Input schema / properties / channelIdsAdded value: +{ + "description": "Comma-separated channel ids to include, e.g. \"12,15\".", + "type": "string" +} - added
Input schema / properties / compareAdded value: +{ + "description": "Also return the previous equal-length window as `previous` / `previousWindow`.", + "type": "boolean" +} - added
Input schema / properties / labelIdsAdded value: +{ + "description": "Comma-separated label ids; a post matches when it carries ANY of them.", + "type": "string" +} - added
Input schema / properties / mediaTypeAdded value: +{ + "description": "By the post's first media file: text (no media), image or video.", + "enum": [ + "text", + "image", + "video" + ], + "type": "string" +} - added
Input schema / properties / platformsAdded value: +{ + "description": "Comma-separated platform keys to include, e.g. \"x,linkedin\".", + "type": "string" +} - added
Input schema / properties / postFormatAdded value: +{ + "description": "Only single posts or only threads.", + "enum": [ + "post", + "thread" + ], + "type": "string" +}
- Changed
get_post3 fields changed- added
Output schema / properties / approverAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Who approved it: { id, name, image }. Null unless approvalStatus is approved." +} - added
Output schema / properties / assigneeAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Who is expected to act on it next: { id, name, image }. Null when nobody is." +} - added
Output schema / properties / authorAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Who wrote the post: { id, name, image }. Null when that account is gone." +}
- Changed
get_queue_slot2 fields changed- added
Input schema / properties / excludePostIdAdded value: +{ + "description": "When the slot is for rescheduling an existing post, its ID — so its current slot is not counted as booked.", + "type": "number" +} - added
Input schema / properties / positionAdded value: +{ + "description": "\"next\" (default): the next free slot. \"end\": the slot after the last pending scheduled post, i.e. the bottom of the queue.", + "enum": [ + "next", + "end" + ], + "type": "string" +}
- Changed
list_posts3 fields changed- added
Input schema / properties / assignedToAdded value: +{ + "description": "Filter by who the post is assigned to: a user id, 'me' for the caller, or 'unassigned'. Orthogonal to status — a post can be scheduled AND assigned.", + "type": "string" +} - added
Input schema / properties / orderAdded value: +{ + "description": "Direction of the timeline sort (published, else due, else created). 'desc' is the default and returns the most recent first. Use 'asc' to read what is coming NEXT — with a limit, 'desc' returns the posts scheduled furthest out, not the soonest.", + "enum": [ + "asc", + "desc" + ], + "type": "string" +} - changed
Output schema / properties / posts / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": {}, - "properties": { - "approvalStatus": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "content": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "createdAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "id": { - "anyOf": [ - { - "anyOf": [ - { - "type": "number" - }, - { - "type": "string" - } - ] - }, - { - "type": "null" - } - ] - }, - "labels": { - "anyOf": [ - { - "items": { - "additionalProperties": {}, - "properties": {}, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "mediaFiles": { - "anyOf": [ - { - "items": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "string" - }, - { - "additionalProperties": {}, - "properties": {}, - "type": "object" - } - ] - }, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "postPlatforms": { - "anyOf": [ - { - "items": { - "additionalProperties": {}, - "properties": { - "platform": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "status": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "publishedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "scheduledAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "status": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "draft, scheduled, processing, published, partial or failed." - }, - "timezone": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": {}, + "properties": { + "approvalStatus": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "approver": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Who approved it: { id, name, image }. Null unless approvalStatus is approved." + }, + "assignee": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Who is expected to act on it next: { id, name, image }. Null when nobody is." + }, + "author": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Who wrote the post: { id, name, image }. Null when that account is gone." + }, + "content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "id": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "labels": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "mediaFiles": { + "anyOf": [ + { + "items": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + }, + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "postPlatforms": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": { + "platform": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "publishedAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "scheduledAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "draft, scheduled, processing, published, partial or failed." + }, + "timezone": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +]
- Changed
publish_post3 fields changed- added
Output schema / properties / approverAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Who approved it: { id, name, image }. Null unless approvalStatus is approved." +} - added
Output schema / properties / assigneeAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Who is expected to act on it next: { id, name, image }. Null when nobody is." +} - added
Output schema / properties / authorAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Who wrote the post: { id, name, image }. Null when that account is gone." +}
- Changed
retry_post3 fields changed- added
Output schema / properties / approverAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Who approved it: { id, name, image }. Null unless approvalStatus is approved." +} - added
Output schema / properties / assigneeAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Who is expected to act on it next: { id, name, image }. Null when nobody is." +} - added
Output schema / properties / authorAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Who wrote the post: { id, name, image }. Null when that account is gone." +}
- Changed
update_post23 fields changed- added
Input schema / properties / ifUnmodifiedSinceAdded value: +{ + "description": "Optional precondition: the post's updatedAt exactly as the last read returned it. The update is refused with 409 CONFLICT if a teammate has changed the post since, rather than overwriting their version. Pass it whenever you read a post before editing it; omit it to keep the previous last-write-wins behaviour.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / bluesky / properties / repostIdAdded value: +{ + "description": "With postTypeOverrides.bluesky = 'repost': the bsky.app post URL (or at:// URI) to repost.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / facebook / properties / thumbnailUrlAdded value: +{ + "description": "Cover image URL for a video or Reel. Facebook only accepts a cover once the video exists, so it is applied after the video publishes and appears a moment after the post; a cover that cannot be fetched or that Facebook rejects leaves the video published with Facebook's own chosen frame rather than failing the post.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / instagram / properties / collaborators / descriptionAdded value: +"Comma-separated Instagram usernames (no leading @) tagged as co-authors. Applies with postTypeOverrides.instagram of 'feed_photo', 'feed_video', 'reel' or 'carousel' — on a carousel the co-authors are set on the carousel itself, not on its individual items. Ignored on 'story', which has no co-author concept." - added
Input schema / properties / platformSpecific / properties / instagram / properties / coverUrlAdded value: +{ + "description": "Cover image URL for a video or Reel. Takes precedence over thumbnailTimestamp: Instagram accepts one or the other and rejects a request carrying both, so only this one is forwarded when both are sent.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / instagram / properties / graduationStrategy / descriptionAdded value: +"How a trial reel becomes a normal one: 'manual' (the creator releases it) or 'auto' (released automatically if it performs well). Default 'manual'. Ignored unless trialReel is true." - added
Input schema / properties / platformSpecific / properties / instagram / properties / thumbnailTimestamp / descriptionAdded value: +"Cover frame for a video or Reel, in seconds from the start. Applies to postTypeOverrides.instagram of 'feed_video' or 'reel'. Ignored when coverUrl is also set." - added
Input schema / properties / platformSpecific / properties / instagram / properties / trialReel / descriptionAdded value: +"Publish as a trial reel, shown to people who do not follow the account first. Only takes effect with postTypeOverrides.instagram of 'reel' — a 'feed_video' publishes as an ordinary reel and this is ignored, even though both use the same underlying reel container." - added
Input schema / properties / platformSpecific / properties / mastodon / properties / repostIdAdded value: +{ + "description": "With postTypeOverrides.mastodon = 'repost': the status URL or ID to boost.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / threads / properties / locationIdAdded value: +{ + "description": "Numeric place ID from get_channel_options with a `q` search on a Threads channel. Only works once the channel has granted location tagging.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / threads / properties / repostIdAdded value: +{ + "description": "With postTypeOverrides.threads = 'repost': the numeric ID of the Threads post to repost (Threads links cannot be used; the ID of a post published through BulkPublish is in get_post's platforms[].platformPostId).", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / threads / properties / topicTagAdded value: +{ + "description": "One topic tag for the post, without a leading '#'. Must not contain periods or ampersands.", + "type": "string" +} - added
Input schema / properties / platformSpecific / properties / tiktok / properties / thumbnailTimestamp / descriptionAdded value: +"Cover frame for the video, in seconds from the start." - changed
Input schema / properties / platformSpecific / properties / tumblr / descriptionPrevious value: -"Tumblr options, nested under the BulkPublish channel id: { \"12\": { \"blogName\": \"myblog\", \"tags\": [\"art\"] } }. A flat object applies to every Tumblr channel on the post. Up to 30 images OR exactly one video per post."New value: +"Tumblr options, nested under the BulkPublish channel id: { \"12\": { \"blogName\": \"myblog\", \"tags\": [\"art\"] } } (tags: array of strings or one comma-separated string). A flat object applies to every Tumblr channel on the post. Up to 30 images OR exactly one video per post." - added
Input schema / properties / platformSpecific / properties / x / properties / repostIdAdded value: +{ + "description": "With postTypeOverrides.x = 'repost': the X post URL or ID to repost (retweet).", + "type": "string" +} - changed
Input schema / properties / postTypeOverrides / properties / bluesky / enumPrevious value: -[ - "post", - "video" -]New value: +[ + "post", + "video", + "thread", + "repost" +] - changed
Input schema / properties / postTypeOverrides / properties / mastodon / enumPrevious value: -[ - "post" -]New value: +[ + "post", + "thread", + "repost" +] - changed
Input schema / properties / postTypeOverrides / properties / threads / enumPrevious value: -[ - "text", - "image", - "video", - "carousel" -]New value: +[ + "text", + "image", + "video", + "carousel", + "repost" +] - changed
Input schema / properties / postTypeOverrides / properties / x / enumPrevious value: -[ - "tweet", - "video", - "thread" -]New value: +[ + "tweet", + "video", + "thread", + "repost" +] - added
Input schema / properties / publishWhenApprovedAdded value: +{ + "description": "Optional. Set true to have the post go out as soon as it is approved, even after its scheduled time (see create_post). An explicit value is stored while the post waits for approval. Omitted, it is kept, except that sending a different scheduledAt clears it to false, and it is always false once the post is no longer approvalStatus 'pending'.", + "type": "boolean" +} - added
Output schema / properties / approverAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Who approved it: { id, name, image }. Null unless approvalStatus is approved." +} - added
Output schema / properties / assigneeAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Who is expected to act on it next: { id, name, image }. Null when nobody is." +} - added
Output schema / properties / authorAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Who wrote the post: { id, name, image }. Null when that account is gone." +}
6 tool updates
- Changed
create_post1 field changed- changed
Output schema / properties / mediaFiles / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": {}, - "properties": {}, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + }, + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } +]
- Changed
get_post1 field changed- changed
Output schema / properties / mediaFiles / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": {}, - "properties": {}, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + }, + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } +]
- Changed
list_posts1 field changed- changed
Output schema / properties / posts / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": {}, - "properties": { - "approvalStatus": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "content": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "createdAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "id": { - "anyOf": [ - { - "anyOf": [ - { - "type": "number" - }, - { - "type": "string" - } - ] - }, - { - "type": "null" - } - ] - }, - "labels": { - "anyOf": [ - { - "items": { - "additionalProperties": {}, - "properties": {}, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "mediaFiles": { - "anyOf": [ - { - "items": { - "additionalProperties": {}, - "properties": {}, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "postPlatforms": { - "anyOf": [ - { - "items": { - "additionalProperties": {}, - "properties": { - "platform": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "status": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "publishedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "scheduledAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "status": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "draft, scheduled, processing, published, partial or failed." - }, - "timezone": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": {}, + "properties": { + "approvalStatus": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "id": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "labels": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "mediaFiles": { + "anyOf": [ + { + "items": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + }, + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "postPlatforms": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": { + "platform": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "publishedAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "scheduledAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "draft, scheduled, processing, published, partial or failed." + }, + "timezone": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +]
- Changed
publish_post1 field changed- changed
Output schema / properties / mediaFiles / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": {}, - "properties": {}, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + }, + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } +]
- Changed
retry_post1 field changed- changed
Output schema / properties / mediaFiles / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": {}, - "properties": {}, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + }, + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } +]
- Changed
update_post1 field changed- changed
Output schema / properties / mediaFiles / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": {}, - "properties": {}, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + }, + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } +]
15 tool updates
- Changed
create_media_upload1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "expiresIn": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "r2Key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "uploadUrl": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
create_post1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "approvalStatus": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "id": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "labels": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "mediaFiles": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "postPlatforms": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": { + "platform": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "publishedAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "scheduledAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "draft, scheduled, processing, published, partial or failed." + }, + "timezone": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
delete_post1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "success": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
finalize_media_upload1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "file": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": { + "filename": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "id": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
get_analytics1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "byDay": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "byPlatform": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "failed": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "from": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "partial": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "previous": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "previousWindow": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "published": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "publishedTimes": { + "anyOf": [ + { + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "scheduled": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "to": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "totalPosts": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
get_post1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "approvalStatus": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "id": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "labels": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "mediaFiles": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "postPlatforms": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": { + "platform": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "publishedAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "scheduledAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "draft, scheduled, processing, published, partial or failed." + }, + "timezone": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
get_post_metrics1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "platforms": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": { + "platform": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "postId": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "totals": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
get_queue_slot1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "dayLabel": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Human label, e.g. \"Today\" or \"Wed, Feb 14\"." + }, + "scheduledAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "ISO timestamp of the next free slot." + } + }, + "type": "object" +}
- Changed
list_channels1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "capabilities": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Whether the caller may create, publish or approve posts." + }, + "channels": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": { + "accountName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "active": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "channelId": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "platform": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
list_media1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "files": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": { + "filename": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "id": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "mimeType": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "sizeBytes": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "limit": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "page": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "total": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
list_posts1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "limit": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "page": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "posts": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": { + "approvalStatus": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "id": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "labels": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "mediaFiles": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "postPlatforms": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": { + "platform": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "publishedAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "scheduledAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "draft, scheduled, processing, published, partial or failed." + }, + "timezone": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "total": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "totalPages": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
publish_post1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "approvalStatus": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "id": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "labels": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "mediaFiles": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "postPlatforms": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": { + "platform": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "publishedAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "scheduledAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "draft, scheduled, processing, published, partial or failed." + }, + "timezone": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
retry_post1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "approvalStatus": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "id": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "labels": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "mediaFiles": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "postPlatforms": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": { + "platform": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "publishedAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retriedCount": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ], + "description": "How many destinations were retried." + }, + "scheduledAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "skippedMaxRetries": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ], + "description": "Destinations skipped for hitting the retry ceiling." + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "draft, scheduled, processing, published, partial or failed." + }, + "timezone": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
update_post1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "approvalStatus": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "id": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "labels": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "mediaFiles": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "postPlatforms": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": { + "platform": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "publishedAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "scheduledAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "draft, scheduled, processing, published, partial or failed." + }, + "timezone": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
upload_media1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "file": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "filename": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "id": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "mimeType": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "sizeBytes": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
31 tool updates
- Removed
abort_multipart_upload - Removed
approve_post - Removed
bulk_posts - Removed
complete_multipart_upload - Removed
create_channel_set - Removed
create_label - Removed
create_multipart_upload - Removed
create_rss_feed - Removed
create_schedule - Removed
delete_channel_set - Removed
delete_label - Removed
delete_media - Removed
delete_rss_feed - Removed
delete_schedule - Removed
get_channel_health - Removed
get_channel_options - Removed
get_media - Removed
get_quota_usage - Removed
list_channel_sets - Removed
list_labels - Removed
list_platforms - Removed
list_rss_feeds - Removed
list_schedules - Removed
publish_story - Removed
reject_post - Removed
search_mentions - Removed
update_channel_set - Removed
update_label - Removed
update_rss_feed - Removed
update_schedule - Removed
view_quota
51 tool updates
- First observed
abort_multipart_upload - First observed
approve_post - First observed
bulk_posts - First observed
complete_multipart_upload - First observed
compose_post - First observed
create_channel_set - First observed
create_label - First observed
create_media_upload - First observed
create_multipart_upload - First observed
create_post - First observed
create_rss_feed - First observed
create_schedule - First observed
delete_channel_set - First observed
delete_label - First observed
delete_media - First observed
delete_post - First observed
delete_rss_feed - First observed
delete_schedule - First observed
finalize_media_upload - First observed
get_analytics - First observed
get_channel_health - First observed
get_channel_options - First observed
get_media - First observed
get_post - First observed
get_post_metrics - First observed
get_queue_slot - First observed
get_quota_usage - First observed
list_channel_sets - First observed
list_channels - First observed
list_labels - First observed
list_media - First observed
list_platforms - First observed
list_posts - First observed
list_rss_feeds - First observed
list_schedules - First observed
publish_post - First observed
publish_story - First observed
reject_post - First observed
retry_post - First observed
search_mentions - First observed
update_channel_set - First observed
update_label - First observed
update_post - First observed
update_rss_feed - First observed
update_schedule - First observed
upload_media - First observed
view_analytics - First observed
view_channels - First observed
view_media - First observed
view_posts - First observed
view_quota
Publisher details
- Operator
- https://www.browse.fyi
- Operator website
- https://www.bulkpublish.com
- Vendor relationship
- First-party
- Documentation
- https://app.bulkpublish.com/docs
- Trust center
- https://help.bulkpublish.com
- Restrictions
- Unknown
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceRemote MCP server that lets AI assistants read tracked competitive intelligence — competitor news, reviews, website changes, social posts and ads — and act on it by managing projects, competitors, battle cards, reports and canvases. Every answer carries a source and a date, and write actions only publish when explicitly shared.MIT
- AlicenseCqualityBmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs115 npm58 PyPIMIT
- AlicenseAqualityCmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.1623 npm1MIT

industrylens-mcpofficial
AlicenseNot gradedqualityBmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.