Skip to main content
Glama
adaptlypost

AdaptlyPost

Official

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/agent

Works 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

  1. Create an account at adaptlypost.com

  2. Connect your social media accounts

  3. Create an API token at Settings > API Tokens

  4. 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"
      }
    }
  }
}

MCP setup docs

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-mcp

License

MIT

Available Tools

12 tools
bulk_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
postsYes1 to 100 posts to schedule; each is created independently
pageIdsNoFacebook page account ids from list_accounts (the account id; its pageId value is also accepted). Facebook has no connection-id array
timezoneNoIANA timezone stored with every post for display; does not shift scheduledAtUTC
platformsYesTarget platforms shared by every item. Each needs its connection-id array (pageIds for FACEBOOK)
tiktokConfigsNoTikTok per-connection config. Each entry needs connectionId + privacyLevel at minimum
youtubeConfigsNoYouTube per-connection config with video title, tags, privacy, etc.
facebookConfigsNoFacebook per-page config with post type and video title. pageId must match an entry in pageIds
instagramConfigsNoInstagram per-connection config to set post type (FEED, REEL, STORY)
pinterestConfigsNoPinterest per-connection config. Each entry needs connectionId + boardId; there is no API to list boards, so ask the user for the board id
tiktokConnectionIdsNoTikTok account connection IDs to post from
blueskyConnectionIdsNoBluesky account connection IDs to post from
threadsConnectionIdsNoThreads account connection IDs to post from
twitterConnectionIdsNoX (Twitter) account connection IDs to post from
youtubeConnectionIdsNoYouTube channel connection IDs to post from
linkedinConnectionIdsNoLinkedIn account connection IDs to post from
instagramConnectionIdsNoInstagram account connection IDs to post from
pinterestConnectionIdsNoPinterest account connection IDs to post from

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoAn object with totalScheduled, totalFailed, and results: one { postId, success, isScheduled, scheduledAt, errorMessage } per input item, in input order.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNoDefault post text shared across platforms
pageIdsNoFacebook page account ids from list_accounts (the account id; its pageId value is also accepted). Facebook has no connection-id array
timezoneNoIANA timezone stored with the post for display (e.g. "America/New_York"); it does not shift scheduledAtUTC
mediaUrlsNoMedia URLs to attach. Use publicUrl values from upload_media or get_upload_urls
platformsYesTarget platforms (e.g. ["LINKEDIN", "TWITTER"]). Each one needs its matching connection-id array (pageIds for FACEBOOK) filled with ids from list_accounts
contentTypeYesContent type: TEXT, IMAGE, VIDEO, or CAROUSEL. Must match mediaUrls (CAROUSEL needs several)
saveAsDraftNoSave as DRAFT instead of publishing or scheduling; publish later with publish_draft
scheduledAtNoAbsolute ISO 8601 instant to schedule (e.g. "2026-03-15T10:00:00Z"). Omit to post immediately; a past time also posts immediately
thumbnailUrlNoCustom thumbnail image URL for video posts
platformTextsNoPer-platform caption overrides
tiktokConfigsNoTikTok per-connection config. Each entry needs connectionId + privacyLevel at minimum
youtubeConfigsNoYouTube per-connection config with video title, tags, privacy, etc.
facebookConfigsNoFacebook per-page config with post type and video title. pageId must match an entry in pageIds
instagramConfigsNoInstagram per-connection config to set post type (FEED, REEL, STORY)
pinterestConfigsNoPinterest per-connection config. Each entry needs connectionId + boardId; there is no API to list boards, so ask the user for the board id
tiktokConnectionIdsNoTikTok account connection IDs to post from
blueskyConnectionIdsNoBluesky account connection IDs to post from
threadsConnectionIdsNoThreads account connection IDs to post from
thumbnailTimestampMsNoGenerate thumbnail from video at this timestamp (milliseconds)
twitterConnectionIdsNoX (Twitter) account connection IDs to post from
youtubeConnectionIdsNoYouTube channel connection IDs to post from
linkedinConnectionIdsNoLinkedIn account connection IDs to post from
instagramConnectionIdsNoInstagram account connection IDs to post from
pinterestConnectionIdsNoPinterest account connection IDs to post from

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoAn 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

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 PostA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPost ID to delete, from list_posts or create_post

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoAn object with deleted: true once the post record is removed from AdaptlyPost.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 PostA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPost ID from create_post, bulk_schedule_posts, or list_posts

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoThe 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

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
filesYesFiles to get upload URLs for

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoAn object with urls: one { uploadUrl, publicUrl, key } entry per requested file.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 AccountsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoAn 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

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ResultsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPost ID from create_post, publish_draft, bulk_schedule_posts, or list_posts

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoAn object with postId, the overall post status, and results: one { platformId, platform, accountName, status, platformPostId, errorMessage, publishedAt } per targeted platform.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 PostsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results, 1 to 100
offsetNoPosts to skip; increase by limit while hasMore is true
endDateNoUpper bound (ISO 8601, e.g. "2026-03-31") on scheduledAt, or createdAt for posts never scheduled
statusesNoFilter by status (e.g. ["SCHEDULED", "DRAFT"]); omit for all statuses
platformsNoFilter to posts targeting any of these platforms
sortOrderNoNEWEST (default) or OLDEST
startDateNoLower bound (ISO 8601, e.g. "2026-03-01") on scheduledAt, or createdAt for posts never scheduled

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoAn 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

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPost ID with status DRAFT (or SCHEDULED)
timezoneNoIANA timezone stored with the post for display (e.g. "America/New_York"); it does not shift scheduledAtUTC
scheduledAtNoAbsolute ISO 8601 instant (e.g. "2026-03-15T10:00:00Z"). Omit, or pass a past time, to publish now

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoAn object with postId, queuedPlatforms (platforms whose publishing job was queued; empty when scheduled for later), isScheduled, and scheduledAt.

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPost ID whose platforms failed
platformIdsYesplatformId values of FAILED rows from list_post_results (not platform names). At least one

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoAn object with postId, queuedPlatforms (platforms re-queued for publishing), and isScheduled: false. Outcomes arrive asynchronously in list_post_results.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPost ID to update (must be DRAFT or SCHEDULED)
textNoUpdated text; omit to keep the current text
pageIdsNoFacebook page account ids from list_accounts (the account id; its pageId value is also accepted). Facebook has no connection-id array
timezoneNoIANA timezone stored for display; does not shift scheduledAt
mediaUrlsNoReplacement media URLs, applied only when platforms is also sent. Use publicUrl values from upload_media or get_upload_urls
platformsNoNew target platforms. Sending this replaces every target, so also resend the connection-id arrays and platform configs to keep; omit to leave targets unchanged
contentTypeNoNew content type; must match the media on the post
scheduledAtNoNew schedule time as an absolute ISO 8601 instant; omit to keep
thumbnailUrlNoCustom thumbnail image URL for video posts
platformTextsNoPer-platform caption overrides; applied to the targets sent in platforms
tiktokConfigsNoTikTok per-connection config. Each entry needs connectionId + privacyLevel at minimum
youtubeConfigsNoYouTube per-connection config with video title, tags, privacy, etc.
facebookConfigsNoFacebook per-page config with post type and video title. pageId must match an entry in pageIds
instagramConfigsNoInstagram per-connection config to set post type (FEED, REEL, STORY)
pinterestConfigsNoPinterest per-connection config. Each entry needs connectionId + boardId; there is no API to list boards, so ask the user for the board id
tiktokConnectionIdsNoTikTok account connection IDs to post from
blueskyConnectionIdsNoBluesky account connection IDs to post from
threadsConnectionIdsNoThreads account connection IDs to post from
thumbnailTimestampMsNoGenerate thumbnail from video at this timestamp (milliseconds)
twitterConnectionIdsNoX (Twitter) account connection IDs to post from
youtubeConnectionIdsNoYouTube channel connection IDs to post from
linkedinConnectionIdsNoLinkedIn account connection IDs to post from
instagramConnectionIdsNoInstagram account connection IDs to post from
pinterestConnectionIdsNoPinterest account connection IDs to post from

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoThe updated post record: id, status (still DRAFT or SCHEDULED), text, contentType, scheduledAt, timezone, and platforms with per-target details.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlsNoPublic URLs of images or videos to upload (e.g. ["https://example.com/photo.jpg"])
filesNoDirect file uploads as base64. Use this when the user attaches/pastes an image or video in the conversation

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoAn object with uploaded (array of { publicUrl, key } per file) and mediaUrls (the public URLs ready to pass to create_post).

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 10 tool updatesv0.1.1
    • Changedbulk_schedule_posts11 fields changed
      • changedInput schema / properties / facebookConfigs / description
        Previous 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"
      • changedInput schema / properties / pageIds / description
        Previous 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"
      • changedInput schema / properties / pinterestConfigs / description
        Previous 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"
      • changedInput schema / properties / platforms / description
        Previous value: -"Target platforms"New value: +"Target platforms shared by every item. Each needs its connection-id array (pageIds for FACEBOOK)"
      • changedInput schema / properties / posts / description
        Previous value: -"Array of posts to schedule"New value: +"1 to 100 posts to schedule; each is created independently"
      • addedInput schema / properties / posts / items / properties / contentType / description
        Added value: +"TEXT, IMAGE, VIDEO, or CAROUSEL; must match mediaUrls"
      • changedInput schema / properties / posts / items / properties / mediaUrls / description
        Previous value: -"Image or video URLs to attach"New value: +"publicUrl values from upload_media; unstored URLs fail this item"
      • addedInput schema / properties / posts / items / properties / platformTexts / description
        Added value: +"Per-platform caption overrides for this item"
      • changedInput schema / properties / posts / items / properties / scheduledAt / description
        Previous value: -"ISO 8601 schedule time"New value: +"Absolute ISO 8601 instant; a past time publishes immediately"
      • changedInput schema / properties / timezone / description
        Previous value: -"IANA timezone"New value: +"IANA timezone stored with every post for display; does not shift scheduledAt"
      • changedOutput schema / properties / result / description
        Previous 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."
    • Changedcreate_post9 fields changed
      • changedInput schema / properties / contentType / description
        Previous value: -"Content type: TEXT, IMAGE, VIDEO, or CAROUSEL"New value: +"Content type: TEXT, IMAGE, VIDEO, or CAROUSEL. Must match mediaUrls (CAROUSEL needs several)"
      • changedInput schema / properties / facebookConfigs / description
        Previous 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"
      • changedInput schema / properties / pageIds / description
        Previous 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"
      • changedInput schema / properties / pinterestConfigs / description
        Previous 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"
      • changedInput schema / properties / platforms / description
        Previous 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"
      • changedInput schema / properties / saveAsDraft / description
        Previous value: -"Save as draft instead of publishing"New value: +"Save as DRAFT instead of publishing or scheduling; publish later with publish_draft"
      • changedInput schema / properties / scheduledAt / description
        Previous 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"
      • changedInput schema / properties / timezone / description
        Previous 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"
      • changedOutput schema / properties / result / description
        Previous 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."
    • Changeddelete_post2 fields changed
      • changedInput schema / properties / id / description
        Previous value: -"Post ID to delete"New value: +"Post ID to delete, from list_posts or create_post"
      • changedOutput schema / properties / result / description
        Previous 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."
    • Changedget_post2 fields changed
      • changedInput schema / properties / id / description
        Previous value: -"Post ID"New value: +"Post ID from create_post, bulk_schedule_posts, or list_posts"
      • changedOutput schema / properties / result / description
        Previous 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)."
    • Changedlist_accounts1 field changed
      • changedOutput schema / properties / result / description
        Previous 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)."
    • Changedlist_post_results2 fields changed
      • changedInput schema / properties / id / description
        Previous value: -"Post ID to check results for"New value: +"Post ID from create_post, publish_draft, bulk_schedule_posts, or list_posts"
      • changedOutput schema / properties / result / description
        Previous 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."
    • Changedlist_posts8 fields changed
      • changedInput schema / properties / endDate / description
        Previous value: -"End date (ISO 8601)"New value: +"Upper bound (ISO 8601, e.g. \"2026-03-31\") on scheduledAt, or createdAt for posts never scheduled"
      • changedInput schema / properties / limit / description
        Previous value: -"Max results"New value: +"Max results, 1 to 100"
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset"New value: +"Posts to skip; increase by limit while hasMore is true"
      • changedInput schema / properties / platforms / description
        Previous value: -"Filter by platform"New value: +"Filter to posts targeting any of these platforms"
      • changedInput schema / properties / sortOrder / description
        Previous value: -"NEWEST or OLDEST"New value: +"NEWEST (default) or OLDEST"
      • changedInput schema / properties / startDate / description
        Previous value: -"Start date (ISO 8601)"New value: +"Lower bound (ISO 8601, e.g. \"2026-03-01\") on scheduledAt, or createdAt for posts never scheduled"
      • changedInput schema / properties / statuses / description
        Previous value: -"Filter by status (e.g. [\"SCHEDULED\", \"DRAFT\"])"New value: +"Filter by status (e.g. [\"SCHEDULED\", \"DRAFT\"]); omit for all statuses"
      • changedOutput schema / properties / result / description
        Previous 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."
    • Changedpublish_draft4 fields changed
      • changedInput schema / properties / id / description
        Previous value: -"Draft post ID"New value: +"Post ID with status DRAFT (or SCHEDULED)"
      • changedInput schema / properties / scheduledAt / description
        Previous 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"
      • changedInput schema / properties / timezone / description
        Previous value: -"IANA timezone"New value: +"IANA timezone stored with the post for display (e.g. \"America/New_York\"); it does not shift scheduledAt"
      • changedOutput schema / properties / result / description
        Previous 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."
    • Changedretry_failed_platforms3 fields changed
      • changedInput schema / properties / id / description
        Previous value: -"Post ID"New value: +"Post ID whose platforms failed"
      • changedInput schema / properties / platformIds / description
        Previous value: -"Failed platform IDs to retry"New value: +"platformId values of FAILED rows from list_post_results (not platform names). At least one"
      • changedOutput schema / properties / result / description
        Previous 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."
    • Changedupdate_post12 fields changed
      • addedInput schema / properties / contentType / description
        Added value: +"New content type; must match the media on the post"
      • changedInput schema / properties / facebookConfigs / description
        Previous 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"
      • changedInput schema / properties / id / description
        Previous value: -"Post ID to update"New value: +"Post ID to update (must be DRAFT or SCHEDULED)"
      • changedInput schema / properties / mediaUrls / description
        Previous 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"
      • changedInput schema / properties / pageIds / description
        Previous 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"
      • changedInput schema / properties / pinterestConfigs / description
        Previous 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"
      • addedInput schema / properties / platformTexts / description
        Added value: +"Per-platform caption overrides; applied to the targets sent in platforms"
      • changedInput schema / properties / platforms / description
        Previous 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"
      • changedInput schema / properties / scheduledAt / description
        Previous value: -"Updated schedule time (ISO 8601)"New value: +"New schedule time as an absolute ISO 8601 instant; omit to keep"
      • changedInput schema / properties / text / description
        Previous value: -"Updated text"New value: +"Updated text; omit to keep the current text"
      • changedInput schema / properties / timezone / description
        Previous value: -"IANA timezone for the schedule time"New value: +"IANA timezone stored for display; does not shift scheduledAt"
      • changedOutput schema / properties / result / description
        Previous 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."
  2. 12 tool updatesv0.1.0
    • First observedbulk_schedule_posts
    • First observedcreate_post
    • First observeddelete_post
    • First observedget_post
    • First observedget_upload_urls
    • First observedlist_accounts
    • First observedlist_post_results
    • First observedlist_posts
    • First observedpublish_draft
    • First observedretry_failed_platforms
    • First observedupdate_post
    • First observedupload_media

TDQS

A4.8/5.0

Scored across 12 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Schedule 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.
    11
    393 npm
    5
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI assistants to schedule and publish social media posts to platforms like Instagram, TikTok, YouTube, LinkedIn, Facebook, X, Threads, and Pinterest using natural language.
    33
    118 npm
    3
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Social 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 npm
    87
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Lets 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.
    2
    67 npm
    MIT