AdaptlyPost
OfficialThis server lets AI agents publish and manage social media posts across nine platforms from one API.
Post to 9 platforms — LinkedIn, YouTube, Instagram, Facebook, TikTok, Pinterest, Threads, Bluesky, and X/Twitter, with per-platform caption overrides and platform-specific configs (e.g. TikTok privacy, YouTube title/tags, Pinterest board).
Schedule or publish now — create posts with an absolute ISO time or publish immediately; schedule up to 100 posts in bulk.
Manage drafts — save posts as drafts, update them, publish or reschedule later.
Upload media — upload images/videos via URL or base64, or get presigned upload URLs, then attach the returned public URLs to posts.
Read post history and status — list posts by status/date/platform, fetch full post details, and see per-platform publishing results with errors and platform post IDs.
Retry failures — re-queue only the failed platforms for a post after fixing the cause.
Update or delete posts — edit draft/scheduled posts in place, or cancel/delete scheduled posts before they publish.
Allows posting to Bluesky, scheduling posts, checking per-platform results, retrying failed publishes, and managing draft/publish workflows.
Allows posting to Facebook, scheduling posts, checking per-platform results, retrying failed publishes, and managing draft/publish workflows.
Allows posting to Instagram, scheduling posts, checking per-platform results, retrying failed publishes, and managing draft/publish workflows.
Allows posting to Pinterest, scheduling posts, checking per-platform results, retrying failed publishes, and managing draft/publish workflows.
Allows posting to Threads, scheduling posts, checking per-platform results, retrying failed publishes, and managing draft/publish workflows.
Allows posting to TikTok, scheduling posts, checking per-platform results, retrying failed publishes, and managing draft/publish workflows.
Allows posting to YouTube, scheduling posts, checking per-platform results, retrying failed publishes, and managing draft/publish workflows.
AdaptlyPost Agent
Give your AI agent the ability to post to Instagram, TikTok, YouTube, X, LinkedIn, Facebook, Pinterest, Threads, and Bluesky from a single command, and to read how those posts performed.
Supports: Instagram, TikTok, YouTube, X (Twitter), LinkedIn, Facebook, Pinterest, Threads, Bluesky
Install
npx skills add adaptlypost/agentWorks with Claude Code, Cursor, Windsurf, Codex, and any agent that supports skills.
Other installation methods
Manual: Copy the skills/adaptlypost/ folder into your project's skills directory.
Cursor remote rules: Point to https://raw.githubusercontent.com/adaptlypost/agent/main/skills/adaptlypost/SKILL.md
Related MCP server: @posteverywhere/mcp
Setup
Create an account at adaptlypost.com
Connect your social media accounts
Create an API token at Settings > API Tokens
Run:
./scripts/adaptlypost.js setup --key adaptly_xxxxx
What it does
Once installed, your AI agent can:
Post to 9 platforms simultaneously with per-platform caption overrides
Schedule posts for any future time
Bulk schedule up to 100 posts at once
Check results per-platform success/failure with error details
Retry just the failed platforms
Draft & publish workflow — save drafts, review, publish later
Read analytics — views, likes, comments, followers and engagement per window, per platform and per post
Example
You: Schedule a LinkedIn post for tomorrow at 9am about our new feature launch
Agent: Done. Post scheduled for tomorrow at 9:00 AM on your LinkedIn account.Alternative: MCP
For deeper integration with Claude Desktop, Cursor, or other MCP-compatible clients, use the AdaptlyPost MCP server:
{
"mcpServers": {
"adaptlypost": {
"type": "http",
"url": "https://mcp.adaptlypost.com/mcp",
"headers": {
"Authorization": "Bearer adaptly_your_key"
}
}
}
}Run it locally
The server source lives in mcp-server/. Run it over stdio with Bun:
{
"mcpServers": {
"adaptlypost": {
"command": "bun",
"args": ["run", "/path/to/agent/mcp-server/src/index.ts"],
"env": { "ADAPTLYPOST_API_TOKEN": "adaptly_your_key" }
}
}
}Or with Docker:
docker build -t adaptlypost-mcp .
docker run -i -e ADAPTLYPOST_API_TOKEN=adaptly_your_key adaptlypost-mcpLinks
License
MIT
Available Tools
12 toolsbulk_schedule_postsBulk Schedule PostsA
Schedule up to 100 posts in one call to the same platforms and accounts. Each item supplies its own text, contentType, scheduledAt, and optional media; platforms, connection-id arrays, timezone, and platform configs are shared by every item. Items are processed independently: each is validated and created like create_post, so one bad item fails alone while the rest are scheduled. Returns { totalScheduled, totalFailed, results[] } with a postId or errorMessage per item, in input order; read every row. An item with a past scheduledAt publishes immediately rather than being rejected. Call list_accounts first; TikTok needs tiktokConfigs with privacyLevel and Pinterest needs pinterestConfigs with boardId. Use create_post for a single post or a draft; this tool has no draft mode.
| Name | Required | Description | Default |
|---|---|---|---|
| posts | Yes | 1 to 100 posts to schedule; each is created independently | |
| pageIds | No | Facebook page account ids from list_accounts (the account id; its pageId value is also accepted). Facebook has no connection-id array | |
| timezone | No | IANA timezone stored with every post for display; does not shift scheduledAt | UTC |
| platforms | Yes | Target platforms shared by every item. Each needs its connection-id array (pageIds for FACEBOOK) | |
| tiktokConfigs | No | TikTok per-connection config. Each entry needs connectionId + privacyLevel at minimum | |
| youtubeConfigs | No | YouTube per-connection config with video title, tags, privacy, etc. | |
| facebookConfigs | No | Facebook per-page config with post type and video title. pageId must match an entry in pageIds | |
| instagramConfigs | No | Instagram per-connection config to set post type (FEED, REEL, STORY) | |
| pinterestConfigs | No | Pinterest per-connection config. Each entry needs connectionId + boardId; there is no API to list boards, so ask the user for the board id | |
| tiktokConnectionIds | No | TikTok account connection IDs to post from | |
| blueskyConnectionIds | No | Bluesky account connection IDs to post from | |
| threadsConnectionIds | No | Threads account connection IDs to post from | |
| twitterConnectionIds | No | X (Twitter) account connection IDs to post from | |
| youtubeConnectionIds | No | YouTube channel connection IDs to post from | |
| linkedinConnectionIds | No | LinkedIn account connection IDs to post from | |
| instagramConnectionIds | No | Instagram account connection IDs to post from | |
| pinterestConnectionIds | No | Pinterest account connection IDs to post from |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | An object with totalScheduled, totalFailed, and results: one { postId, success, isScheduled, scheduledAt, errorMessage } per input item, in input order. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly=false and destructive=false. The description discloses independent item processing, partial failure isolation, immediate publishing for past scheduledAt, and the exact result structure with instruction to read every row. These are valuable behavioral details beyond 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?
The description is long but dense; it front-loads the core capability and then covers behavior, prerequisites, and alternatives. While it could be organized into bullets for easier scanning, every sentence contributes needed information without redundancy.
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 (17 parameters, multiple platforms, output schema), the description covers prerequisites, platform-specific requirements, partial failure behavior, return format, and how to interpret results. It leaves nothing critical for correct invocation unexplained.
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%, but the description adds meaning by distinguishing shared vs per-item parameters and highlighting required platform configs (tiktokConfigs, pinterestConfigs). It clarifies that each post item supplies its own text/contentType/scheduledAt/media while platforms and connection arrays are common.
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: 'Schedule up to 100 posts in one call to the same platforms and accounts.' It explicitly distinguishes from create_post by noting the bulk capability and the absence of a draft mode, making the tool's scope unambiguous.
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 create_post for a single post or draft, names list_accounts as a prerequisite, and gives platform-specific requirements (TikTok needs tiktokConfigs with privacyLevel, Pinterest needs pinterestConfigs with boardId). This clearly tells the agent when to choose this tool and what to prepare first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_postCreate PostA
Create one post for one or more platforms: publish now, schedule, or save a draft. Omit scheduledAt to publish immediately; a future scheduledAt sets status SCHEDULED; saveAsDraft stores it as DRAFT and defers validation to publish_draft. Publishing runs asynchronously per platform, so the response ({ postId, queuedPlatforms, isScheduled, scheduledAt }) is not the outcome; read list_post_results, where each platform succeeds or fails on its own. Call list_accounts first: each platform in platforms needs its connection-id array (linkedinConnectionIds, pageIds for Facebook, and so on), one account per platform. TikTok needs tiktokConfigs with privacyLevel; Pinterest needs pinterestConfigs with boardId. mediaUrls must come from upload_media, or the call fails with "Media file(s) not found in storage". Use bulk_schedule_posts for many posts on the same accounts, and update_post or publish_draft for an existing post.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Default post text shared across platforms | |
| pageIds | No | Facebook page account ids from list_accounts (the account id; its pageId value is also accepted). Facebook has no connection-id array | |
| timezone | No | IANA timezone stored with the post for display (e.g. "America/New_York"); it does not shift scheduledAt | UTC |
| mediaUrls | No | Media URLs to attach. Use publicUrl values from upload_media or get_upload_urls | |
| platforms | Yes | Target platforms (e.g. ["LINKEDIN", "TWITTER"]). Each one needs its matching connection-id array (pageIds for FACEBOOK) filled with ids from list_accounts | |
| contentType | Yes | Content type: TEXT, IMAGE, VIDEO, or CAROUSEL. Must match mediaUrls (CAROUSEL needs several) | |
| saveAsDraft | No | Save as DRAFT instead of publishing or scheduling; publish later with publish_draft | |
| scheduledAt | No | Absolute ISO 8601 instant to schedule (e.g. "2026-03-15T10:00:00Z"). Omit to post immediately; a past time also posts immediately | |
| thumbnailUrl | No | Custom thumbnail image URL for video posts | |
| platformTexts | No | Per-platform caption overrides | |
| tiktokConfigs | No | TikTok per-connection config. Each entry needs connectionId + privacyLevel at minimum | |
| youtubeConfigs | No | YouTube per-connection config with video title, tags, privacy, etc. | |
| facebookConfigs | No | Facebook per-page config with post type and video title. pageId must match an entry in pageIds | |
| instagramConfigs | No | Instagram per-connection config to set post type (FEED, REEL, STORY) | |
| pinterestConfigs | No | Pinterest per-connection config. Each entry needs connectionId + boardId; there is no API to list boards, so ask the user for the board id | |
| tiktokConnectionIds | No | TikTok account connection IDs to post from | |
| blueskyConnectionIds | No | Bluesky account connection IDs to post from | |
| threadsConnectionIds | No | Threads account connection IDs to post from | |
| thumbnailTimestampMs | No | Generate thumbnail from video at this timestamp (milliseconds) | |
| twitterConnectionIds | No | X (Twitter) account connection IDs to post from | |
| youtubeConnectionIds | No | YouTube channel connection IDs to post from | |
| linkedinConnectionIds | No | LinkedIn account connection IDs to post from | |
| instagramConnectionIds | No | Instagram account connection IDs to post from | |
| pinterestConnectionIds | No | Pinterest account connection IDs to post from |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | An object with postId, queuedPlatforms (platforms whose publishing job was queued; empty for scheduled posts and drafts), skippedPlatforms, isScheduled, and scheduledAt. Publishing is asynchronous: check list_post_results for outcomes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that publishing is asynchronous per platform, that the response is not the final outcome, and that callers should read list_post_results to see per-platform success or failure. It also reveals draft validation deferral and the mediaUrls dependency, going well beyond the sparse 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?
The description is long but dense and front-loaded with the core purpose and key behavioral caveats. The amount of detail is justified by the number of platform-specific parameters, though it is presented as a single paragraph rather than structured sections.
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 covers the essential workflow dependencies, async outcome checking, platform-specific requirements, and sibling tool distinctions. It does not enumerate every output field or failure mode, but it gives enough context for an agent to call the tool and verify results 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?
Although the schema already has 100% property description coverage, the tool description adds important cross-parameter meaning: scheduledAt is absolute and omission/past means immediate, timezone only affects display, each platform requires its matching connection-id array, TikTok configs need privacyLevel, and Pinterest needs a board id with no API to list boards.
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 creates one post for one or more platforms and immediately distinguishes publish-now, schedule, and draft modes. It also names sibling tools like bulk_schedule_posts, update_post, and publish_draft, so an agent can tell this tool apart.
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 bulk_schedule_posts for many posts on the same accounts and update_post or publish_draft for existing posts. It also instructs callers to call list_accounts first and to source mediaUrls from upload_media or get_upload_urls, giving clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_postDelete PostADestructive
Delete a post record from AdaptlyPost by id. Use it to cancel a DRAFT or SCHEDULED post before it goes out; a deleted scheduled post will not publish. Deleting never removes content already on a network: for a COMPLETED or PARTIAL_FAILURE post this only drops AdaptlyPost's record, and the live posts stay up until removed on each platform. Prefer update_post to change a post instead of deleting and recreating it. Only posts in the token's workspace can be deleted; others return "Post not found or access denied". Returns { deleted: true }. Irreversible.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Post ID to delete, from list_posts or create_post |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | An object with deleted: true once the post record is removed from AdaptlyPost. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description reveals that deletion only removes the record, not the actual platform content for already-published posts. It also discloses irreversibility, workspace access restriction, and the exact error message for unauthorized or missing posts.
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 yet comprehensive, organized logically from action to usage guidance to caveats to error handling. It packs necessary details without redundancy, making it easy to scan and understand.
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 one-parameter destructive operation, the description covers all relevant context: what it does, when to use it, side effects on different post statuses, workspace restrictions, expected return value, and irreversibility. No important information 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?
The only parameter (id) is fully described in the input schema ('Post ID to delete, from list_posts or create_post'), so coverage is 100%. The tool description does not add additional parameter semantics beyond what the schema already provides, keeping the score at the baseline for full coverage.
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 clear, specific action ('Delete a post record from AdaptlyPost by id') and distinguishes it from siblings by noting when to use update_post instead. It also clarifies the tool's scope (only DRAFT or SCHEDULED posts cancel publishing).
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 ('Use it to cancel a DRAFT or SCHEDULED post before it goes out') and when to prefer an alternative ('Prefer update_post to change a post instead of deleting and recreating it'). Also explains behavior for COMPLETED or PARTIAL_FAILURE posts, giving complete usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_postGet PostARead-only
Get one post's full record by id: text, contentType, status, scheduledAt, timezone, and a platforms array with each target's connection, status, errorMessage, and media. Visible only within the token's workspace; any other id returns "Post not found or access denied". Use this to inspect content before update_post or publish_draft. Use list_post_results instead when you only need per-platform publishing outcomes and the platformIds for retry_failed_platforms, and list_posts to find ids by status, platform, or date. Post ids come from create_post, bulk_schedule_posts, or list_posts.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Post ID from create_post, bulk_schedule_posts, or list_posts |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | The full post record: id, status, contentType, text, scheduledAt, timezone, createdAt, updatedAt, and platforms (one entry per target with id, platform, connectionId or pageId, status, errorMessage, mediaUrls). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, destructiveHint=false, openWorldHint=false. The description adds valuable context about workspace scope ('visible only within the token's workspace') and error behavior ('any other id returns "Post not found or access denied"'), enhancing transparency without contradicting 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?
The description is concise but informative, using three sentences to convey the tool's purpose, returned content, and usage guidance. It avoids redundancy while providing necessary distinctions from sibling tools.
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 covers the tool's primary function, output contents, error/access behavior, and relationship to other tools. Given the simple parameter and the provision of an output schema (not shown but indicated), it provides sufficient context for an agent to use the 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?
The single parameter 'id' is fully described in the schema (coverage 100%) and the description reinforces its origin ('Post ID from create_post, bulk_schedule_posts, or list_posts'). This adds practical context beyond the schema's basic type definition.
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 retrieves a single post's full record by ID and enumerates the included fields (text, contentType, status, scheduledAt, timezone, platforms with connection/status/errorMessage/media). It distinguishes itself from related tools like list_posts and list_post_results.
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 instructs when to use this tool ('inspect content before update_post or publish_draft') and when to use alternatives (list_post_results for per-platform outcomes, list_posts for finding IDs). This provides clear selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_upload_urlsGet Media Upload URLsA
Get presigned upload URLs for direct file uploads. Returns uploadUrl (PUT your file here) and publicUrl (use in create_post mediaUrls). This only mints a URL — you MUST PUT the file to uploadUrl and confirm a 2xx response before using publicUrl, otherwise create_post/bulk rejects it with "Media file(s) not found in storage". Prefer the upload_media tool, which performs the upload for you. For each file, provide fileName and mimeType. Supported types: image/jpeg, image/png, image/webp, video/mp4, video/quicktime.
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | Files to get upload URLs for |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | An object with urls: one { uploadUrl, publicUrl, key } entry per requested file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide readOnlyHint=false and destructiveHint=false, so the description carries the full burden of behavioral disclosure. It clearly reveals that the tool 'only mints a URL' and does not actually upload the file, and it warns about the rejection error if the subsequent PUT is not completed. This is critical behavioral context beyond the structured 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?
The description is dense but efficient: each sentence carries essential information. It front-loads the purpose, then immediately clarifies return values, the critical usage sequence, the preferred alternative, and required parameters. No fluff or redundancy; 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?
Given the tool's moderate complexity and the presence of an output schema, the description covers all essential operational context: what is returned, how to use the returned URLs, the failure mode, a preferred alternative, and the required input fields. Nothing an agent needs to invoke this 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?
The input schema already provides 100% coverage, with descriptions for files, fileName, and mimeType, plus an enum for mimeType. The description repeats 'provide fileName and mimeType' and lists supported types, but adds little new semantic meaning beyond reinforcing the schema. Baseline 3 is appropriate because the schema handles the heavy lifting.
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's function: 'Get presigned upload URLs for direct file uploads.' The verb-resource pairing is specific and distinct. It differentiates itself from sibling tools by naming upload_media as the alternative that performs the upload, and by explaining its role in the create_post workflow.
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 when-to-use guidance: 'Prefer the upload_media tool, which performs the upload for you.' It also details the required sequence (PUT to uploadUrl, confirm 2xx before using publicUrl) and states the consequence of non-compliance (create_post/bulk rejects). This leaves no ambiguity about when and how to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsList Connected AccountsARead-only
List the social accounts connected to the token's workspace across all nine platforms. Returns { accounts } with id, platform, displayName, username, avatarUrl, and pageId for Facebook pages. Call this before create_post, update_post, or bulk_schedule_posts: they take these ids, never usernames. Put each id in the array for its platform (linkedinConnectionIds, tiktokConnectionIds, and so on); Facebook page accounts go in pageIds. Not for post history or publishing status: use list_posts or list_post_results for those. Takes no arguments.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | An object with accounts: one { id, platform, displayName, username, avatarUrl } per connected account, plus pageId for Facebook pages. Use id as the connection id (or in pageIds for Facebook). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description clearly states it takes no arguments and returns a read-only list of accounts, aligning with the readOnlyHint annotation. It doesn't mention potential throttling or data pagination, but no destructive or side-effect behavior is hidden; annotation and description are consistent.
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 well-structured: it states the result, the key usage imperative, the alternative for other use cases, and the no-arguments fact. Every sentence adds necessary guidance without redundancy.
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 empty schema and no parameters, the description covers everything an agent needs: what it returns, when to call it, how to use the IDs, and which sibling tools handle related but different tasks. The output schema likely provides the return structure, so no further detail is needed here.
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 tool has zero parameters and the schema already reflects that with an empty properties object. The description reinforces 'Takes no arguments,' so there is no missing parameter guidance; a small deduction because no mention of output schema details, but that's not parameter semantics.
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?
Clearly states the tool lists social accounts connected to the workspace across all nine platforms, and enumerates the returned fields. It also contrasts with related tools for posting and analytics, making its purpose unambiguous.
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 instructs to call this before create_post, update_post, or bulk_schedule_posts to obtain IDs, and tells which ID arrays to use for each platform. It also directs users to list_posts or list_post_results for post history/publishing status, leaving no ambiguity about when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_post_resultsList Post ResultsARead-only
Get one post's per-platform publishing outcomes: { postId, status, results[] } where each result has platformId, platform, accountName, status (PENDING, PUBLISHING, PUBLISHED, or FAILED), platformPostId, errorMessage, and publishedAt. Each platform reports separately, so read every row instead of treating the post as one pass or fail. Call this after create_post, publish_draft, or retry_failed_platforms, since publishing is asynchronous and their responses only confirm queueing; poll until no row is PENDING or PUBLISHING. Take platformId from FAILED rows for retry_failed_platforms. Use get_post when you also need the content and schedule.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Post ID from create_post, publish_draft, bulk_schedule_posts, or list_posts |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | An object with postId, the overall post status, and results: one { platformId, platform, accountName, status, platformPostId, errorMessage, publishedAt } per targeted platform. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only; description adds the critical behavior that each platform reports separately and that publishing is asynchronous, so responses only confirm queueing and you must poll until no PENDING/PUBLISHING. This goes beyond 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?
Four sentences, each earning its place: purpose, return shape, usage guidance, and alternative. Well structured but could be slightly more concise with bullets; still no fluff.
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 an output schema exists, description covers the return shape and the polling logic, plus how to use FAILED rows for retry_failed_platforms. Complete for an agent to call 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 covers 100% of the single parameter (id) with sources (create_post, publish_draft, etc.). Description doesn't add extra semantics beyond the schema, so 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 (Get) and resource (one post's per-platform publishing outcomes), and distinguishes from get_post (which gets content and schedule) and list_posts. It clearly defines what it returns: { postId, status, results[] }.
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 call it (after create_post, publish_draft, or retry_failed_platforms), explains the asynchronous nature and polling requirement, and names get_post as the alternative when content and schedule are also needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_postsList PostsARead-only
List posts in the token's workspace, any status, newest first by default. Returns { posts, total, hasMore }; each post carries its status and a platforms array with per-platform status. Filters: statuses, platforms (posts targeting any of them), and startDate/endDate, which bound scheduledAt, or createdAt for posts never scheduled. limit is 1 to 100 (default 20); page with offset while hasMore is true. Use this to find post ids or check what is already queued. Use get_post for one post's full record and list_post_results for one post's per-platform outcomes and retry ids.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results, 1 to 100 | |
| offset | No | Posts to skip; increase by limit while hasMore is true | |
| endDate | No | Upper bound (ISO 8601, e.g. "2026-03-31") on scheduledAt, or createdAt for posts never scheduled | |
| statuses | No | Filter by status (e.g. ["SCHEDULED", "DRAFT"]); omit for all statuses | |
| platforms | No | Filter to posts targeting any of these platforms | |
| sortOrder | No | NEWEST (default) or OLDEST | |
| startDate | No | Lower bound (ISO 8601, e.g. "2026-03-01") on scheduledAt, or createdAt for posts never scheduled |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | An object with posts (each with id, status, contentType, text, scheduledAt, timezone, and platforms with per-platform status), total (count of all matches), and hasMore. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint and non-destructive behavior. The description adds useful context about return shape and pagination semantics but does not contradict annotations or introduce unexpected side effects.
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 paragraph with two sentences, but it repeats some schema details (e.g., date bounds, pagination). It is not overly verbose but could be slightly more concise by omitting redundant parameter explanations.
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 fully specifies what is returned (posts array with status and platforms, total, hasMore) and how to paginate. It also mentions appropriate use cases and sibling tools, making it complete for an agent to decide when and how to call 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 descriptions cover 100% of parameters with clear explanations of filters and pagination. The description reinforces date and status semantics but does not add significant new meaning beyond the schema; still, it helps clarify usage.
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 lists posts in the workspace with filtering and pagination, and explicitly distinguishes it from get_post and list_post_results. The verb 'list' and resource 'posts' are specific.
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 explicit guidance: 'Use this to find post ids or check what is already queued.' It also mentions alternatives for single-post details and per-platform outcomes, and explains filtering/pagination usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_draftPublish DraftA
Publish a DRAFT post now or schedule it; SCHEDULED posts are accepted too, to reschedule or push live. Other statuses fail with "Post is not a draft". Without scheduledAt (or with a past one) the post moves to PENDING and a publishing job is queued per platform: content reaches the networks within moments and cannot be recalled. A future scheduledAt sets SCHEDULED and queues nothing yet. Fails if an account was disconnected or a TikTok entry lacks privacyLevel; fix with update_post first. Not for new content, use create_post. Check list_post_results afterwards for per-platform outcomes.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Post ID with status DRAFT (or SCHEDULED) | |
| timezone | No | IANA timezone stored with the post for display (e.g. "America/New_York"); it does not shift scheduledAt | UTC |
| scheduledAt | No | Absolute ISO 8601 instant (e.g. "2026-03-15T10:00:00Z"). Omit, or pass a past time, to publish now |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | An object with postId, queuedPlatforms (platforms whose publishing job was queued; empty when scheduled for later), isScheduled, and scheduledAt. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Clearly discloses side effects: moves to PENDING, queues per-platform publishing, content reaches networks and cannot be recalled, and explains failure conditions (disconnected account, missing TikTok privacyLevel). This matches the readOnlyHint=false annotation and adds important behavioral context beyond 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?
The description is dense but every sentence carries necessary information: accepted statuses, scheduling behavior, failure modes, and cross-references to sibling tools. No redundant filler or vague phrasing.
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 output schema exists and the tool has moderate complexity, the description fully covers preconditions, post-conditions, failure modes, and follow-up actions. It leaves no critical ambiguity about what the tool does or when to use 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?
The schema already covers all three parameters with descriptions, and the tool description adds crucial semantics: timezone does not shift scheduledAt, and omitting scheduledAt or passing a past time publishes immediately. This goes beyond simple field listings.
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 ('Publish a DRAFT post'), clarifies that SCHEDULED posts are also accepted, and explicitly distinguishes from create_post for new content. This makes the tool's purpose unmistakable and differentiates it from 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?
Gives explicit when-to-use guidance: publish now or schedule, accepts DRAFT/SCHEDULED, fails on other statuses, and directs users to update_post for fixes and create_post for new content. Also recommends checking list_post_results afterwards, which is actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
retry_failed_platformsRetry Failed PlatformsA
Re-queue publishing for a post's FAILED platforms. Only rows with status FAILED whose id is in platformIds are reset to PENDING and retried with the same content; other ids are ignored, and with none matching the call fails with "No failed platforms to retry". The post moves to PUBLISHING and the retry is asynchronous, so check list_post_results for the outcome. Get platformIds (not platform names) and each errorMessage from list_post_results first; retry once the cause is fixed (reconnected account, replaced media), not for a platform-side restriction, which will just fail again. Content cannot change on retry.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Post ID whose platforms failed | |
| platformIds | Yes | platformId values of FAILED rows from list_post_results (not platform names). At least one |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | An object with postId, queuedPlatforms (platforms re-queued for publishing), and isScheduled: false. Outcomes arrive asynchronously in list_post_results. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, openWorldHint=true, destructiveHint=false), the description reveals key behaviors: only FAILED rows are reset, other ids are ignored, failure condition if none match, post moves to PUBLISHING, retry is asynchronous, and content cannot change. These are critical behavioral details that annotations do not capture.
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 yet information-dense. It front-loads the core action, then adds conditions, async behavior, prerequisites, and retry criteria in a logical flow. No redundant sentences; every clause 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?
Given the tool's complexity, the description covers all essential aspects: operation, conditions, error case, async behavior, dependency on list_post_results, retry criteria, and immutability of content. The output schema exists, so return value details are not required. The description is fully sufficient for an agent to use 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?
The schema already fully documents both parameters (id and platformIds) with clear descriptions, including the requirement that platformIds come from FAILED rows of list_post_results. The description reinforces this and adds context about the retry logic and source, but does not introduce new parameter meanings beyond what the schema provides. Since schema coverage is 100%, the baseline is 3; the description adds a small extra value by tying the parameters to the retry workflow.
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 on a specific resource: 'Re-queue publishing for a post's FAILED platforms.' It clearly distinguishes the tool's scope (only FAILED platforms) and mentions the sibling list_post_results for gathering prerequisites, making its purpose unambiguous.
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 when-to-use guidance: get platformIds and errorMessage from list_post_results first, retry only after fixing the cause (reconnected account, replaced media), and explicitly warns not to retry platform-side restrictions that will just fail again. It also notes the async nature and where to check outcome, giving clear context for appropriate use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_postUpdate PostA
Update a DRAFT or SCHEDULED post in place; any other status fails with "Cannot edit post in current state", so published posts cannot be changed. Updates are partial: text, contentType, scheduledAt, timezone, and thumbnail fields you omit keep their values. The exception is platforms: sending it rebuilds the post's target set from this request alone, so include every connection-id array and platform config you want to keep (TikTok with privacyLevel, Pinterest with boardId); omitting platforms leaves accounts, configs, and media untouched. mediaUrls only take effect together with platforms; use publicUrl values from upload_media. On SCHEDULED posts new media is verified in storage. Returns the updated post record. Use publish_draft to change a draft's status, delete_post to cancel, and create_post for a new post.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Post ID to update (must be DRAFT or SCHEDULED) | |
| text | No | Updated text; omit to keep the current text | |
| pageIds | No | Facebook page account ids from list_accounts (the account id; its pageId value is also accepted). Facebook has no connection-id array | |
| timezone | No | IANA timezone stored for display; does not shift scheduledAt | |
| mediaUrls | No | Replacement media URLs, applied only when platforms is also sent. Use publicUrl values from upload_media or get_upload_urls | |
| platforms | No | New target platforms. Sending this replaces every target, so also resend the connection-id arrays and platform configs to keep; omit to leave targets unchanged | |
| contentType | No | New content type; must match the media on the post | |
| scheduledAt | No | New schedule time as an absolute ISO 8601 instant; omit to keep | |
| thumbnailUrl | No | Custom thumbnail image URL for video posts | |
| platformTexts | No | Per-platform caption overrides; applied to the targets sent in platforms | |
| tiktokConfigs | No | TikTok per-connection config. Each entry needs connectionId + privacyLevel at minimum | |
| youtubeConfigs | No | YouTube per-connection config with video title, tags, privacy, etc. | |
| facebookConfigs | No | Facebook per-page config with post type and video title. pageId must match an entry in pageIds | |
| instagramConfigs | No | Instagram per-connection config to set post type (FEED, REEL, STORY) | |
| pinterestConfigs | No | Pinterest per-connection config. Each entry needs connectionId + boardId; there is no API to list boards, so ask the user for the board id | |
| tiktokConnectionIds | No | TikTok account connection IDs to post from | |
| blueskyConnectionIds | No | Bluesky account connection IDs to post from | |
| threadsConnectionIds | No | Threads account connection IDs to post from | |
| thumbnailTimestampMs | No | Generate thumbnail from video at this timestamp (milliseconds) | |
| twitterConnectionIds | No | X (Twitter) account connection IDs to post from | |
| youtubeConnectionIds | No | YouTube channel connection IDs to post from | |
| linkedinConnectionIds | No | LinkedIn account connection IDs to post from | |
| instagramConnectionIds | No | Instagram account connection IDs to post from | |
| pinterestConnectionIds | No | Pinterest account connection IDs to post from |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | The updated post record: id, status (still DRAFT or SCHEDULED), text, contentType, scheduledAt, timezone, and platforms with per-target details. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description thoroughly explains behavioral nuances: partial updates for most fields, full replacement of targets when platforms is sent, media verification for SCHEDULED posts, and the return value. It also notes that certain parameters (mediaUrls) have dependencies, which goes beyond 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?
The description is dense but well-organized, front-loading the core behavior and then covering exceptions and dependencies. It avoids unnecessary words while conveying essential information. Slightly long but appropriate for the complexity.
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 covers the main behavior, failure conditions, alternative tools, and dependencies on other tools (upload_media, list_accounts), and states the return value. Given the presence of an output schema, it does not need to detail the response structure, making it complete for effective usage.
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 descriptions for all parameters, so the baseline is 3. However, the description adds value by clarifying conditional relationships (e.g., mediaUrls only with platforms) and specifying source of values (publicUrl from upload_media). This enriches understanding 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 clearly states the action ('Update a DRAFT or SCHEDULED post in place') and the resource (post). It also differentiates from sibling tools by naming publish_draft, delete_post, and create_post as alternatives for different operations.
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?
Provides explicit when-to-use conditions: only DRAFT or SCHEDULED posts are allowed, with failure otherwise. It also gives guidance on when to use alternatives (publish_draft for status change, delete_post for cancel, create_post for new). Additional constraints like 'mediaUrls only take effect together with platforms' are clearly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_mediaUpload MediaA
Upload images or videos to AdaptlyPost storage and return public URLs for the mediaUrls of create_post, update_post, or bulk_schedule_posts. Two sources, combinable in one call: urls (public URLs the server downloads and re-hosts) and files (base64 data, for media attached in the conversation). Omitting both returns an error. Accepts image/jpeg, image/png, image/webp, video/mp4, video/quicktime. Stored files are public immediately, post or no post. Prefer this over get_upload_urls, which only mints URLs and leaves the PUT to you. Returns uploaded ({ publicUrl, key } per file) and mediaUrls; pass mediaUrls straight into the post.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | No | Public URLs of images or videos to upload (e.g. ["https://example.com/photo.jpg"]) | |
| files | No | Direct file uploads as base64. Use this when the user attaches/pastes an image or video in the conversation |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | An object with uploaded (array of { publicUrl, key } per file) and mediaUrls (the public URLs ready to pass to create_post). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that files are stored publicly and immediately, that URLs are downloaded and re-hosted, and that base64 files are uploaded. It goes beyond the minimal annotations by explaining the server-side behavior and output shape, though it does not mention rate limits or authentication.
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 dense and informative, but it is a single long paragraph with some repetition (e.g., 'post or no post'). It could be slightly more structured, but the key information is front-loaded and no unnecessary filler is present.
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 two parameters and nested file object, the description is complete: it covers both input modes, supported MIME types, the required fields for files, the error case, and the return format. It ties the output directly to the expected mediaUrls field used by sibling post-creation tools.
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 description adds important behavioral context: urls are downloaded and re-hosted, files are for attached media, the two sources can be combined, and omitting both is an error. This goes well beyond the raw property names and enum values.
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 uploads images or videos to storage and returns public URLs for use in post creation tools. It explicitly differentiates itself from get_upload_urls by explaining the server re-hosts content rather than just minting URLs.
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 names the exact downstream tools (create_post, update_post, bulk_schedule_posts) and explains when to use each parameter source. It also provides an explicit alternative (get_upload_urls) and states the error condition when both sources are omitted.
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.
10 tool updates
v0.1.1- Changed
bulk_schedule_posts11 fields changed- changed
Input schema / properties / facebookConfigs / descriptionPrevious value: -"Facebook per-page config with post type and video title"New value: +"Facebook per-page config with post type and video title. pageId must match an entry in pageIds" - changed
Input schema / properties / pageIds / descriptionPrevious value: -"Facebook page IDs"New value: +"Facebook page account ids from list_accounts (the account id; its pageId value is also accepted). Facebook has no connection-id array" - changed
Input schema / properties / pinterestConfigs / descriptionPrevious value: -"Pinterest per-connection config. boardId is required for Pinterest posts"New value: +"Pinterest per-connection config. Each entry needs connectionId + boardId; there is no API to list boards, so ask the user for the board id" - changed
Input schema / properties / platforms / descriptionPrevious value: -"Target platforms"New value: +"Target platforms shared by every item. Each needs its connection-id array (pageIds for FACEBOOK)" - changed
Input schema / properties / posts / descriptionPrevious value: -"Array of posts to schedule"New value: +"1 to 100 posts to schedule; each is created independently" - added
Input schema / properties / posts / items / properties / contentType / descriptionAdded value: +"TEXT, IMAGE, VIDEO, or CAROUSEL; must match mediaUrls" - changed
Input schema / properties / posts / items / properties / mediaUrls / descriptionPrevious value: -"Image or video URLs to attach"New value: +"publicUrl values from upload_media; unstored URLs fail this item" - added
Input schema / properties / posts / items / properties / platformTexts / descriptionAdded value: +"Per-platform caption overrides for this item" - changed
Input schema / properties / posts / items / properties / scheduledAt / descriptionPrevious value: -"ISO 8601 schedule time"New value: +"Absolute ISO 8601 instant; a past time publishes immediately" - changed
Input schema / properties / timezone / descriptionPrevious value: -"IANA timezone"New value: +"IANA timezone stored with every post for display; does not shift scheduledAt" - changed
Output schema / properties / result / descriptionPrevious value: -"The created scheduled post records with their ids, statuses, and schedule times as returned by the AdaptlyPost API."New value: +"An object with totalScheduled, totalFailed, and results: one { postId, success, isScheduled, scheduledAt, errorMessage } per input item, in input order."
- Changed
create_post9 fields changed- changed
Input schema / properties / contentType / descriptionPrevious value: -"Content type: TEXT, IMAGE, VIDEO, or CAROUSEL"New value: +"Content type: TEXT, IMAGE, VIDEO, or CAROUSEL. Must match mediaUrls (CAROUSEL needs several)" - changed
Input schema / properties / facebookConfigs / descriptionPrevious value: -"Facebook per-page config with post type and video title"New value: +"Facebook per-page config with post type and video title. pageId must match an entry in pageIds" - changed
Input schema / properties / pageIds / descriptionPrevious value: -"Facebook page IDs"New value: +"Facebook page account ids from list_accounts (the account id; its pageId value is also accepted). Facebook has no connection-id array" - changed
Input schema / properties / pinterestConfigs / descriptionPrevious value: -"Pinterest per-connection config. boardId is required for Pinterest posts"New value: +"Pinterest per-connection config. Each entry needs connectionId + boardId; there is no API to list boards, so ask the user for the board id" - changed
Input schema / properties / platforms / descriptionPrevious value: -"Target platforms (e.g. [\"LINKEDIN\", \"TWITTER\"])"New value: +"Target platforms (e.g. [\"LINKEDIN\", \"TWITTER\"]). Each one needs its matching connection-id array (pageIds for FACEBOOK) filled with ids from list_accounts" - changed
Input schema / properties / saveAsDraft / descriptionPrevious value: -"Save as draft instead of publishing"New value: +"Save as DRAFT instead of publishing or scheduling; publish later with publish_draft" - changed
Input schema / properties / scheduledAt / descriptionPrevious value: -"ISO 8601 datetime to schedule (e.g. \"2026-03-15T10:00:00Z\"). Omit to post immediately"New value: +"Absolute ISO 8601 instant to schedule (e.g. \"2026-03-15T10:00:00Z\"). Omit to post immediately; a past time also posts immediately" - changed
Input schema / properties / timezone / descriptionPrevious value: -"IANA timezone (e.g. \"America/New_York\")"New value: +"IANA timezone stored with the post for display (e.g. \"America/New_York\"); it does not shift scheduledAt" - changed
Output schema / properties / result / descriptionPrevious value: -"The created post record including its id, status, and scheduled time as returned by the AdaptlyPost API."New value: +"An object with postId, queuedPlatforms (platforms whose publishing job was queued; empty for scheduled posts and drafts), skippedPlatforms, isScheduled, and scheduledAt. Publishing is asynchronous: check list_post_results for outcomes."
- Changed
delete_post2 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"Post ID to delete"New value: +"Post ID to delete, from list_posts or create_post" - changed
Output schema / properties / result / descriptionPrevious value: -"The deletion confirmation for the post as returned by the AdaptlyPost API."New value: +"An object with deleted: true once the post record is removed from AdaptlyPost."
- Changed
get_post2 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"Post ID"New value: +"Post ID from create_post, bulk_schedule_posts, or list_posts" - changed
Output schema / properties / result / descriptionPrevious value: -"The full post record including its id, status, per-platform publishing status, and error messages as returned by the AdaptlyPost API."New value: +"The full post record: id, status, contentType, text, scheduledAt, timezone, createdAt, updatedAt, and platforms (one entry per target with id, platform, connectionId or pageId, status, errorMessage, mediaUrls)."
- Changed
list_accounts1 field changed- changed
Output schema / properties / result / descriptionPrevious value: -"The connected social accounts with their platform, connection ID, username, and pageId for Facebook pages as returned by the AdaptlyPost API."New value: +"An object with accounts: one { id, platform, displayName, username, avatarUrl } per connected account, plus pageId for Facebook pages. Use id as the connection id (or in pageIds for Facebook)."
- Changed
list_post_results2 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"Post ID to check results for"New value: +"Post ID from create_post, publish_draft, bulk_schedule_posts, or list_posts" - changed
Output schema / properties / result / descriptionPrevious value: -"The per-platform posting results with success/failure status and error details as returned by the AdaptlyPost API."New value: +"An object with postId, the overall post status, and results: one { platformId, platform, accountName, status, platformPostId, errorMessage, publishedAt } per targeted platform."
- Changed
list_posts8 fields changed- changed
Input schema / properties / endDate / descriptionPrevious value: -"End date (ISO 8601)"New value: +"Upper bound (ISO 8601, e.g. \"2026-03-31\") on scheduledAt, or createdAt for posts never scheduled" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results"New value: +"Max results, 1 to 100" - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset"New value: +"Posts to skip; increase by limit while hasMore is true" - changed
Input schema / properties / platforms / descriptionPrevious value: -"Filter by platform"New value: +"Filter to posts targeting any of these platforms" - changed
Input schema / properties / sortOrder / descriptionPrevious value: -"NEWEST or OLDEST"New value: +"NEWEST (default) or OLDEST" - changed
Input schema / properties / startDate / descriptionPrevious value: -"Start date (ISO 8601)"New value: +"Lower bound (ISO 8601, e.g. \"2026-03-01\") on scheduledAt, or createdAt for posts never scheduled" - changed
Input schema / properties / statuses / descriptionPrevious value: -"Filter by status (e.g. [\"SCHEDULED\", \"DRAFT\"])"New value: +"Filter by status (e.g. [\"SCHEDULED\", \"DRAFT\"]); omit for all statuses" - changed
Output schema / properties / result / descriptionPrevious value: -"The matching posts with their ids, statuses, platforms, and schedule times as returned by the AdaptlyPost API."New value: +"An object with posts (each with id, status, contentType, text, scheduledAt, timezone, and platforms with per-platform status), total (count of all matches), and hasMore."
- Changed
publish_draft4 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"Draft post ID"New value: +"Post ID with status DRAFT (or SCHEDULED)" - changed
Input schema / properties / scheduledAt / descriptionPrevious value: -"Schedule time (ISO 8601). Omit to publish now"New value: +"Absolute ISO 8601 instant (e.g. \"2026-03-15T10:00:00Z\"). Omit, or pass a past time, to publish now" - changed
Input schema / properties / timezone / descriptionPrevious value: -"IANA timezone"New value: +"IANA timezone stored with the post for display (e.g. \"America/New_York\"); it does not shift scheduledAt" - changed
Output schema / properties / result / descriptionPrevious value: -"The published or scheduled post record with its updated status as returned by the AdaptlyPost API."New value: +"An object with postId, queuedPlatforms (platforms whose publishing job was queued; empty when scheduled for later), isScheduled, and scheduledAt."
- Changed
retry_failed_platforms3 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"Post ID"New value: +"Post ID whose platforms failed" - changed
Input schema / properties / platformIds / descriptionPrevious value: -"Failed platform IDs to retry"New value: +"platformId values of FAILED rows from list_post_results (not platform names). At least one" - changed
Output schema / properties / result / descriptionPrevious value: -"The retry outcome for the requested platform IDs as returned by the AdaptlyPost API."New value: +"An object with postId, queuedPlatforms (platforms re-queued for publishing), and isScheduled: false. Outcomes arrive asynchronously in list_post_results."
- Changed
update_post12 fields changed- added
Input schema / properties / contentType / descriptionAdded value: +"New content type; must match the media on the post" - changed
Input schema / properties / facebookConfigs / descriptionPrevious value: -"Facebook per-page config with post type and video title"New value: +"Facebook per-page config with post type and video title. pageId must match an entry in pageIds" - changed
Input schema / properties / id / descriptionPrevious value: -"Post ID to update"New value: +"Post ID to update (must be DRAFT or SCHEDULED)" - changed
Input schema / properties / mediaUrls / descriptionPrevious value: -"Updated media URLs. Use publicUrl values from upload_media or get_upload_urls"New value: +"Replacement media URLs, applied only when platforms is also sent. Use publicUrl values from upload_media or get_upload_urls" - changed
Input schema / properties / pageIds / descriptionPrevious value: -"Facebook page IDs"New value: +"Facebook page account ids from list_accounts (the account id; its pageId value is also accepted). Facebook has no connection-id array" - changed
Input schema / properties / pinterestConfigs / descriptionPrevious value: -"Pinterest per-connection config. boardId is required for Pinterest posts"New value: +"Pinterest per-connection config. Each entry needs connectionId + boardId; there is no API to list boards, so ask the user for the board id" - added
Input schema / properties / platformTexts / descriptionAdded value: +"Per-platform caption overrides; applied to the targets sent in platforms" - changed
Input schema / properties / platforms / descriptionPrevious value: -"Updated target platforms"New value: +"New target platforms. Sending this replaces every target, so also resend the connection-id arrays and platform configs to keep; omit to leave targets unchanged" - changed
Input schema / properties / scheduledAt / descriptionPrevious value: -"Updated schedule time (ISO 8601)"New value: +"New schedule time as an absolute ISO 8601 instant; omit to keep" - changed
Input schema / properties / text / descriptionPrevious value: -"Updated text"New value: +"Updated text; omit to keep the current text" - changed
Input schema / properties / timezone / descriptionPrevious value: -"IANA timezone for the schedule time"New value: +"IANA timezone stored for display; does not shift scheduledAt" - changed
Output schema / properties / result / descriptionPrevious value: -"The updated post record including its id, status, and scheduled time as returned by the AdaptlyPost API."New value: +"The updated post record: id, status (still DRAFT or SCHEDULED), text, contentType, scheduledAt, timezone, and platforms with per-target details."
12 tool updates
v0.1.0- First observed
bulk_schedule_posts - First observed
create_post - First observed
delete_post - First observed
get_post - First observed
get_upload_urls - First observed
list_accounts - First observed
list_post_results - First observed
list_posts - First observed
publish_draft - First observed
retry_failed_platforms - First observed
update_post - First observed
upload_media
TDQS
Scored across 12 tools
Each tool owns a distinct resource/action (accounts, media, posts, results, retries), and descriptions include cross-references to route to the right tool. The only mild overlap is upload_media vs get_upload_urls, since both can produce mediaUrls, but the descriptions clearly position one as the preferred path and the other as a lower-level alternative. create_post vs bulk_schedule_posts is also clearly differentiated by single vs batch.
All tools follow a consistent snake_case verb_noun pattern: list_accounts, upload_media, create_post, get_post, list_posts, update_post, delete_post, publish_draft, list_post_results, retry_failed_platforms, bulk_schedule_posts, get_upload_urls. There are no mixed naming conventions or vague verbs. Even the batch and URL tools fit the same predictable pattern.
12 tools is well within the ideal range for a social media posting and scheduling server. Each tool covers a necessary part of the workflow: account lookup, media handling, single/bulk post creation, read/update/delete, publishing, and result/retry management. None feel redundant enough to cut, even the two media tools serve different upload methods.
The post lifecycle is fully covered: create (single and bulk), read by ID or list, update, delete, draft publishing, scheduling, asynchronous result monitoring, and failed-platform retries. Media upload and account discovery are provided as prerequisites. There are no obvious dead-end operations that would prevent an agent from completing a standard posting workflow.
Maintenance
Related MCP Connectors
Schedule and publish social posts across 9 platforms (Instagram, LinkedIn, X, TikTok, Facebook, Threads, Pinterest, Bluesky, Mastodon) straight from Claude, ChatGPT, Cursor, or any MCP client. Create, edit, and reschedule posts, upload media, and pull account and post analytics, follower demographics, and best-time windows. 20 tools, free on every plan.
Schedule and publish social media posts to 10 platforms from your AI agent
Draft, schedule and publish social posts to nine platforms from any AI agent.
Post, schedule, and track social posts on X, Bluesky, LinkedIn, Instagram and more from AI agents.
Related MCP Servers
- AlicenseAqualityBmaintenanceSchedule and manage social media posts across 10 platforms (Instagram, Facebook, TikTok, X, LinkedIn, YouTube, Threads, Pinterest, Bluesky, Telegram) from any MCP-compatible AI assistant. Supports batch posting, media uploads, analytics, and platform-specific features like Reels, Shorts, and carousels.11393 npm5MIT
- AlicenseAqualityBmaintenanceEnables AI assistants to schedule and publish social media posts to platforms like Instagram, TikTok, YouTube, LinkedIn, Facebook, X, Threads, and Pinterest using natural language.33118 npm3MIT
- AlicenseNot gradedqualityAmaintenanceSocial media scheduling and publishing for AI agents. 17 validation-first tools to post to X, LinkedIn, Instagram, TikTok, YouTube, Reddit, Discord, Telegram, and more through one connected workspace.142 npm87MIT
- AlicenseAqualityBmaintenanceLets any AI agent post to TikTok, Instagram, YouTube, X, LinkedIn, Bluesky, Telegram, Mastodon and Discord through a single post_to_social tool. Connect an account once, then publish everywhere.267 npmMIT