Skip to main content
Glama
Upload-Post

Upload-Post

Official

@upload-post/mcp

Official Model Context Protocol (MCP) server for Upload-Post.

Glama npm

Lets any MCP-compatible AI agent (ChatGPT, Claude Desktop, Claude Code, Cursor, …) publish, schedule, analyze and manage social media across TikTok, Instagram, YouTube, LinkedIn, Facebook, Pinterest, Threads, Reddit, Bluesky, X, Google Business, Discord, Telegram and more with a single API key.

Built on top of the official upload-post SDK and the public Upload-Post REST API.


Use it in ChatGPT (no setup)

Upload-Post is a plugin reviewed by OpenAI, listed in ChatGPT's Plugins (formerly Apps). Open Upload-Post in ChatGPT or search for Upload-Post in Plugins, click Install, then Connect, and sign in with OAuth. There is no MCP URL to paste, and you get the Upload Studio widget for publishing video files, photos and carousels straight from your computer. OpenAI dots use the same plugin: select it in your dot's Customize → Plugins and review its permissions.

Prefer to wire it up by hand? In ChatGPT on the web, open Plugins, click +, choose Add custom MCP server, point it at https://mcp.upload-post.com/mcp and set authentication to OAuth. Custom MCP servers get write actions on Business, Enterprise and Edu workspaces.

Related MCP server: Outpost

Use it in Claude (no setup)

Upload-Post is an official connector in Claude's connector directory. Add Upload-Post to Claude, or in claude.ai, Claude Desktop or Claude Cowork open Customize → Connectors, browse the directory and search for Upload-Post, then click Connect and sign in with OAuth. There is no MCP URL to paste. On Team and Enterprise an owner may need to allow it first in Organization settings.

Prefer to wire it up by hand? Open Customize → Connectors, click + Add, then Add custom connector, paste https://mcp.upload-post.com/mcp, click Continue and sign in with OAuth. Custom connectors work on every Claude plan (the Free plan allows one). In Claude Code: claude mcp add --transport http upload-post https://mcp.upload-post.com/mcp, or install the official Upload-Post plugin from the Claude directory.

Use it in Perplexity Computer

Open Plugins in the sidebar (or Customize → Connectors), then Add custom → Connector → Add MCP connector → Remote. Use https://mcp.upload-post.com/mcp with the Streamable HTTP transport and OAuth (or your Upload-Post API key), click Add, then click the Upload-Post card to sign in.

Use it in Gemini CLI

Install the extension and sign in with OAuth the first time Gemini calls a tool:

gemini extensions install https://github.com/Upload-Post/upload-post-mcp

Two ways to run it yourself

A) Local stdio (single-user) — simplest

The server runs on your machine, spawned by the MCP client. Add to ~/.claude/mcp.json (or Cursor settings, etc.):

{
  "mcpServers": {
    "upload-post": {
      "command": "npx",
      "args": ["-y", "@upload-post/mcp"],
      "env": { "UPLOAD_POST_API_KEY": "YOUR_API_KEY" }
    }
  }
}

Get your API key at https://app.upload-post.com → API Keys. Restart the client — you should see 58 upload-post tools.

B) Hosted HTTP (multi-tenant) — share one server with many users

Run the server on any Docker-capable host (Fly, Railway, Cloud Run, your own box…) and let each user connect with their own Upload-Post API key. The server stores nothing per user.

{
  "mcpServers": {
    "upload-post": {
      "url": "https://mcp.your-domain.com/mcp",
      "headers": {
        "Authorization": "ApiKey YOUR_OWN_UPLOAD_POST_API_KEY"
      }
    }
  }
}

Authorization: Bearer <key> is also accepted, for clients that only allow Bearer.


What can the agent do?

The server exposes Upload-Post API tools plus one ChatGPT App UI launcher.

Group

Tools

Upload

upload_video, upload_photos, upload_text, upload_document, open_upload_studio

Media staging

create_media_upload, complete_media_upload, get_media_upload, delete_media_upload

Status

get_status, get_job_status, get_history, get_media

Schedule

list_scheduled, cancel_scheduled, edit_scheduled

Analytics

get_analytics, get_total_impressions, get_post_analytics, get_cached_post_analytics, get_platform_metrics

Audience

get_audience, get_suggestions

Users

get_account_info, list_users, get_connect_link, create_user, delete_user, generate_jwt, validate_jwt

Pages/boards

get_facebook_pages, get_linkedin_pages, get_pinterest_boards, get_google_business_locations, get_google_business_reviews, reply_to_google_business_review, get_reddit_detailed_posts

Posts

retry_post, unpublish_post

Comments

get_post_comments, create_comment, delete_comment, reply_to_comment, public_reply_to_comment, hide_comment, like_comment, pin_comment, edit_comment, hold_comment, approve_comment, ignore_comment, set_post_comments, comment_action

TikTok

tiktok_music_trending, tiktok_music_search, tiktok_location_search, tiktok_publishing_settings

DMs

send_dm, list_dm_conversations, start_autodm (Instagram DM or public auto-reply on TikTok, YouTube, Facebook, Threads, Bluesky), list_autodms, get_autodm_logs, pause_autodm, resume_autodm, stop_autodm, delete_autodm, manage_autodms

FFmpeg

submit_ffmpeg_job, get_ffmpeg_job, download_ffmpeg_result, get_ffmpeg_consumption

Queue

get_queue_settings, update_queue_settings, preview_queue

Async uploads return a request_id. The agent should poll get_status until success: true.

One tool per question, not per network

The Upload-Post API has no endpoint per social network: it has an endpoint per question, and a platform parameter saying who is being asked. get_post_comments, get_post_analytics, get_audience, get_suggestions and comment_action all work that way, so an agent learns one shape and reuses it for every network. Only the four tiktok_* tools are network-specific, because what they return (the Commercial Music Library, TikTok places, TikTok's per-account publishing settings) exists only on TikTok.

  • get_audience — who follows the profile, where they are, when they are online, what they tap. Also benchmark_categories, and the niche averages to compare against when benchmarkCategory is set. The server clamps the window to at most 60 days ending before today, so a wider range is trimmed rather than rejected, and range in the response says which window was used.

  • get_suggestions — hashtags (with view_count) or related keyword searches, told apart by type, not by a different tool.

  • get_post_comments — top-level comments on a post, or, with commentId, the replies under one of them. Reads are cached for up to 60 seconds (up to 2 minutes on X); a comment created or deleted through Upload-Post by the same account shows up on the next read.

  • create_comment on X — links are removed unless the account is allowed links on X (reported in warnings); a message that was only links fails with 400 x_links_not_allowed. Replies, post edits and reposts on X share a daily limit per X account (20 on the free plan, 200 on paid plans, reset at 00:00 UTC); past it the API answers 429 x_daily_write_limit with retry_after and a Retry-After header.

  • hide_comment, like_comment, pin_comment, edit_comment, hold_comment, approve_comment, ignore_comment, set_post_comments — one tool per moderation operation. comment_action does the same through a single action argument and stays available everywhere except ChatGPT, which only gets the one-operation tools (the same goes for manage_autodms).

  • comment_action — moderate a comment on TikTok (hide / like / pin), Facebook (hide / like / edit), Instagram (hide, or enable / disable comments on a post), YouTube (hide / hold) and Threads (hide / approve / ignore). Each value carries its own inverse, so nothing is permanent.

  • get_post_analytics — per-post metrics. post_metrics is whatever the platform reports, so its shape varies: on TikTok it adds retention, impression_sources, audience_types, new_followers, reach and the watch times (average_time_watched, total_time_watched, full_video_watched_rate).

Errors are shared too: platform_not_supported (400, with the list of the networks that can answer), invalid_parameter (400), tiktok_reconnect_required (400), reauth_required (409) and 502 when the upstream network fails.

TikTok capabilities

get_post_comments, create_comment, delete_comment and comment_action accept platform: "tiktok", and firstComment works on TikTok like on every other network.

What a TikTok account can do depends on how it is connected. list_users returns a capabilities array on each TikTok account — music, location, cover_image, cover_timestamp, draft, video_privacy, photo_privacy, profile_analytics, comments, trend_search — and each tool's description names the one it needs. They are granted when the user connects TikTok, so an account connected before a capability existed has to reconnect before the matching tools answer; that is what a tiktok_reconnect_required error means.

get_media and get_cached_post_analytics are cursor-paginated: feed the response's next_cursor back as cursor until has_more is false. LinkedIn, Discord and Telegram do not support media cursors and accept limit only. Prefer get_cached_post_analytics over get_post_analytics when scanning many posts — it replays previously fetched results and so avoids the live analytics rate limit of 100 requests / 5 minutes. Only contains posts previously fetched through a live per-post endpoint; there is no background refresh, so captured_at is the last time that post was read live.

FFmpeg jobs accept one public URL through input_url or multiple URLs through files. They run on Upload-Post's encoding servers, each in its own working directory. full_command is a single ffmpeg invocation with {input} (or {input0}, {input1}…) and {output} placeholders, run without a shell: it must start with ffmpeg, every -i must be an {input}/{inputN} placeholder or a -f lavfi source, and {output} is the only output. Protocols or URLs inside the command (file:, concat:, subfile,…), the movie=/amovie=/sendcmd filters, absolute paths other than fonts under /usr/share/fonts, .., -safe 0 and shell metacharacters are rejected with a 400. Endless commands (-stream_loop -1, -loop 1, a lavfi source without a duration) need -t, -shortest or -frames, and -stream_loop goes from -1 to 100. Usage is charged at the longer of the input and output durations. Poll get_ffmpeg_job until completion, then call download_ffmpeg_result; it returns the result URL without streaming the processed binary through MCP. Nothing is posted until you pass that URL to an upload tool.

Confirmation before acting

Tools that publish or reach other people as the user run in two steps. Called without confirmed: true, they return status: "confirmation_required" with a preview of exactly what would go out (text, media, platforms or recipients, buttons, keywords, timing) and do nothing; the model shows it to the user and repeats the call with confirmed: true once they approve. This covers upload_video, upload_photos, upload_text, upload_document, send_dm, reply_to_comment, public_reply_to_comment, create_comment, reply_to_google_business_review, edit_comment, unpublish_post, start_autodm and manage_autodms with action: "start", plus comment_action / hide_comment when they edit a comment or ban its author. delete_user deletes only when confirm_username repeats the profile name. ChatGPT, which asks the user before every write tool, keeps the single-step tools.

Reddit publishing is switched off while the Reddit app is unavailable: reddit is not offered as a platform and asking for it fails with reddit_unavailable. Self-hosters can set UPLOAD_POST_REDDIT_ENABLED=true once it is back.

ChatGPT video upload UI

open_upload_studio renders a ChatGPT Apps component for file-based publishing: one video, or one or more images (up to 10, for a carousel; pass mediaType: "photos"). For each file the widget creates a short-lived Upload-Post/R2 staging upload, PUTs the file directly to R2 and completes the upload, one file at a time, then calls upload_video or upload_photos with the returned temporary media URLs in order. For photos it can instead hand the staged URLs back to ChatGPT ("Send to ChatGPT"), which then calls upload_photos itself, e.g. with a different caption per platform. upload_video and upload_photos refuse /mnt/data and sandbox attachment paths and point the model at the Studio.

The widget speaks the ChatGPT Apps SDK bridge, so it is only advertised to ChatGPT (detected from clientInfo at initialize; override the match with UPLOAD_POST_STUDIO_CLIENTS=<regex>). Every other host (claude.ai, Claude Desktop, Claude Code, Cursor, …) does not see the tool or its ui:// resource; instead create_media_upload / complete_media_upload are exposed to the model with step-by-step guidance, and upload_video tells the assistant to ask for a public URL or send the user to the dashboard when the client cannot PUT the file itself.

The staging object is deleted after 24 hours whether it is used or not. Scheduled/queued posts remain safe because upload_video copies the temporary URL into the existing durable scheduler storage before execution.

Claude and other MCP clients can use the same flow without the ChatGPT UI: call create_media_upload, PUT the file to upload_url, call complete_media_upload, then pass media_url to upload_video.

Set UPLOAD_POST_R2_CONNECT_DOMAINS on the MCP host to the comma-separated origins used by the backend's R2 signed URLs when they differ from the defaults (for example https://<account>.r2.cloudflarestorage.com,https://<bucket>.<account>.r2.cloudflarestorage.com) so the ChatGPT component CSP allows the browser PUT.

The R2 bucket CORS policy must allow browser uploads. A restrictive policy can include your actual widget origin; for fastest validation, use:

[
  {
    "AllowedOrigins": ["*"],
    "AllowedMethods": ["PUT", "GET", "HEAD"],
    "AllowedHeaders": ["*"],
    "ExposeHeaders": ["ETag"],
    "MaxAgeSeconds": 3600
  }
]

Local / development

git clone https://github.com/Upload-Post/upload-post-mcp.git
cd upload-post-mcp
npm install
npm run build

# stdio (default — used by Claude Desktop, Cursor)
UPLOAD_POST_API_KEY=... node dist/index.js

# HTTP streamable (for hosted deployments)
UPLOAD_POST_API_KEY=... node dist/index.js --http --port 8080

Inspect the live tool surface with the official inspector:

npx @modelcontextprotocol/inspector node dist/index.js

Configuration

Env var

Mode

Default

Description

UPLOAD_POST_API_KEY

stdio

— (required)

Single user's Upload-Post API key. Ignored in --http mode — keys come per request.

UPLOAD_POST_BASE_URL

both

https://api.upload-post.com/api

Override for self-hosted / staging.

UPLOAD_POST_MCP_PORT

http

8080

Port for --http mode.

UPLOAD_POST_MCP_MAX_BODY_MB

http

10

Largest /mcp request body accepted; bigger ones get 413.

UPLOAD_POST_MCP_VALIDATE_API_KEYS

http

true

Check a pasted API key once against GET /uploadposts/me (cached) before opening a session for it; a rejected key gets 401.

UPLOAD_POST_MCP_KEY_CHECK_TTL_MS

http

600000

How long an accepted key is trusted before it is checked again.

UPLOAD_POST_MCP_MAX_SESSIONS

http

2000

Live sessions kept in memory; past it the longest-idle one is closed.

UPLOAD_POST_MCP_MAX_SESSIONS_PER_KEY

http

200

Live sessions per credential; past it that credential's own longest-idle session is closed.

UPLOAD_POST_MCP_SESSION_TTL_MS

http

1800000

Idle time after which a session is closed.

UPLOAD_POST_MCP_ALLOW_LOCAL_FILES

http

false

Let tools read media from file paths on the server's disk. Off for a shared host (only http(s) URLs are accepted); turn it on only when the HTTP server runs next to your own files. stdio always allows paths.

OPENAI_APPS_CHALLENGE_TOKEN

http

Current Upload-Post challenge token

Optional override for ChatGPT Apps domain verification at /.well-known/openai-apps-challenge.

CLI flags:

  • --http — start the streamable HTTP transport instead of stdio

  • --port <n> — port for HTTP mode

HTTP endpoints:

  • POST /mcp — JSON-RPC over MCP streamable HTTP. Requires Authorization: ApiKey <key> (or Bearer <key>) on every request. The key is the user's own Upload-Post API key; the server uses it only for that session and stores nothing.

  • GET /healthz — liveness probe, always open. Returns {"ok":true}.

Auth model in --http mode is the same pattern Resend, Tavily, Brave Search and other API-key-native services use for their hosted MCPs: the upstream key is the auth.


Deploy with Docker

The repo ships with a multi-stage Dockerfile and a .dockerignore. On any Docker-capable PaaS (Fly.io, Railway, Render, Cloud Run, fly machines, your own box…):

  1. Point the PaaS at this repo and select Dockerfile as the build pack.

  2. Port: 8080 (matches EXPOSE 8080).

  3. Environment variables: none are required. Optionally set UPLOAD_POST_BASE_URL if you point at staging.

  4. Health check path: /healthz (HTTP, port 8080).

  5. Domain: attach a domain, e.g. mcp.your-domain.com, and provision TLS (most PaaS do this automatically via Let's Encrypt).

Deploy. The server is now ready for any number of users. Each user adds the endpoint to their MCP client config with their own Upload-Post API key:

{
  "mcpServers": {
    "upload-post": {
      "url": "https://mcp.your-domain.com/mcp",
      "headers": {
        "Authorization": "ApiKey USER_OWN_UPLOAD_POST_API_KEY"
      }
    }
  }
}

Without an Authorization header the server returns 401. The header is the only credential — invalid Upload-Post keys will surface as upstream errors on the first tool call.

Local test of the production image:

docker build -t upload-post-mcp .
docker run --rm -p 8080:8080 upload-post-mcp
curl http://localhost:8080/healthz   # → {"ok":true}
curl -i -X POST http://localhost:8080/mcp \
  -H "content-type: application/json" \
  -d '{}'                               # → 401 (no Authorization)

Tips for prompting the agent

  • Prefer public URLs over local paths when uploading — local paths only work if the MCP server runs on the user's machine.

  • In ChatGPT Apps, prefer open_upload_studio for user-selected video and image files. It avoids local-path handoff issues by uploading to short-lived Upload-Post/R2 staging, then passing temporary media URLs to upload_video / upload_photos.

  • In any other client with a local file: if the client can run HTTP requests (Claude Code, Cursor, a script), stage it with create_media_upload → PUT the bytes to upload_url → complete_media_upload, then pass the returned media_url to upload_video. Hosted chats without that ability (claude.ai) need a public HTTPS URL or the dashboard at https://app.upload-post.com.

  • To send video bytes directly (a client that holds the file rather than a URL), pass videoBase64 to upload_video instead of videoPathOrUrl. The server writes it to a temp file, uploads, then deletes it. Inline bytes are capped at UPLOAD_POST_MAX_INLINE_MB (default 100 MB), and in --http mode the whole request at UPLOAD_POST_MCP_MAX_BODY_MB (default 10 MB, roughly 7 MB of video once base64-encoded) — for larger videos use a public URL.

  • Always create the profile first (create_user) and connect socials in the Upload-Post dashboard before publishing.

  • For scheduled posts, pass ISO 8601 dates with timezone, e.g. "2026-12-25T10:00:00Z" + "timezone": "Europe/Madrid".


Privacy & data handling

This server is a stateless proxy to the Upload-Post API. Per request, the only data it processes is the user's API key (or OAuth access token resolved to one) and the arguments of the tool call being executed. No user data is persisted by the MCP container itself.

  • What we receive per request: the Authorization header, the MCP tool name + arguments, and any media URLs/paths the agent passes.

  • What we forward: the tool arguments to the Upload-Post API on behalf of the authenticated user.

  • What we store: nothing per-user. OAuth tokens are stored upstream in the Upload-Post backend, hashed (SHA-256), so a breach of token storage cannot impersonate users.

  • What we log: HTTP method, path, status code, and an opaque request ID. No tool arguments, no API keys, no tokens.

Full Upload-Post privacy policy (data collection, retention, third-party sharing, contact, GDPR/CCPA): https://upload-post.com/privacy

To revoke a connector's access at any time, open Connected Apps in app.upload-post.com.


Security

  • All traffic is TLS-terminated at the edge (HTTPS only).

  • /mcp requires a valid Authorization header on every request; OAuth access tokens are short-lived (1 h access + 90 d refresh with rotation per RFC 6749 §10.4).

  • The server validates the Origin header against an allow-list (claude.ai, claude.com, chatgpt.com, chat.openai.com, app.upload-post.com, localhost) to mitigate DNS-rebinding attacks from browser-based clients. Extend with OAUTH_EXTRA_ALLOWED_ORIGINS (comma-separated) when self-hosting behind a custom dashboard.

  • OAuth metadata is served both at /.well-known/oauth-protected-resource and at the path-inserted form /.well-known/oauth-protected-resource/mcp (RFC 9728 §3.1), and likewise for oauth-authorization-server.

  • In --http mode the server writes one stderr line per failed request and per OAuth/well-known request (method, path, status, auth scheme, user agent — never query strings or credentials). Set UPLOAD_POST_MCP_ACCESS_LOG=all to log every request or off to disable it.

  • If ChatGPT shows redirect_uri not on allow-list during OAuth, add the exact redirect_uri from the failing authorize request to the Upload-Post backend OAuth redirect allow-list. For ChatGPT clients this is typically on https://chatgpt.com/.../oauth/callback or https://chat.openai.com/.../oauth/callback.

  • OAuth redirect callbacks are pre-allowed for: Claude (claude.ai/claude.com), ChatGPT, Cursor, VS Code (stable + Insiders), Smithery, Glama, Toolhouse, Perplexity (standard + Enterprise), Mistral Studio debugger and Postman — plus any http://localhost/loopback redirect (RFC 8252), which covers Claude Code, Windsurf, Cline, Continue, Goose, Gemini CLI and other mcp-remote-style clients. Platforms without a documented fixed callback (e.g. Grok, Le Chat production) are added on request.

  • All tools declare MCP readOnlyHint/destructiveHint annotations so clients can surface confirmation prompts for destructive operations, and the tools that publish or message people also require an explicit confirmed: true (see Confirmation before acting).

Report a security issue: info@upload-post.com (encrypted PGP available on request).


License

MIT © Upload-Post

Available Tools

72 tools
approve_commentApprove a pending Threads replyAInspect

Approve a reply waiting for approval on one of the profile's Threads posts, so it shows publicly. Threads only; to leave it unpublished use ignore_comment.

NameRequiredDescriptionDefault
userYesUpload-Post profile name.
commentIdYesPending reply to approve (from get_post_comments).

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate this is a non-read-only, non-destructive, open-world operation. The description adds useful behavioral context by explaining that approval makes the reply publicly visible and that the tool is Threads-specific, though it does not describe permissions, reversibility, or rate limits.

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?

Two tightly written sentences with no filler. The core action and scope are front-loaded, followed by the key alternative.

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 tool has complete schema coverage, annotations, and an output schema. The description supplies the remaining decision-relevant context: platform scope, public-visibility effect, and the sibling alternative for non-approval.

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 coverage is 100%, so the parameter meanings are already fully documented in the input schema. The description does not add syntax, format, or selection detail beyond identifying that the target is a reply waiting for approval.

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: approve a pending Threads reply on one of the profile's posts. It also gives the outcome, making the reply show publicly, and scopes the operation to Threads, so it is clearly distinguishable from related comment tools.

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 names the alternative for the opposite action: use ignore_comment to leave the reply unpublished. It also clearly limits the tool to Threads, leaving little ambiguity about when to select it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cancel_scheduledCancel scheduled postB
Destructive
Inspect

Cancel a scheduled post by its job_id.

NameRequiredDescriptionDefault
jobIdYes

Output Schema

NameRequiredDescription
resultNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate destructiveHint: true, so the description doesn't need to restate that. It adds minimal context by specifying the identifier. No mention of whether cancellation is reversible or if there are side effects, but with destructiveHint present, a 3 is reasonable.

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?

One sentence, front-loaded with the action and the key parameter. No fluff, though it could specify the type of job_id (e.g., string) but that's in schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter action with destructive annotationable, the description is adequate. It doesn't explain return values, but output schema exists, so that's covered. Missing when to use and potential error cases, but given simplicity, average.

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 has 1 param with 0% description coverage)Skip. The description states that job_id is used to cancel, which adds the context that jobId is a job identifier, but it's already implicit in the param name. The description adds minimal meaning beyond the name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it cancels a scheduled post, identified by job_id. The verb 'cancel' and resource 'scheduled post' are specific. Though similar to edit_scheduled, it distinguishes itself by the action of cancellation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this versus edit_scheduled or retry_post. No mention of prerequisites like needing a valid job_id or that the post must be in scheduled state.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

comment_actionHide, like or pin a commentA
Destructive
Inspect

Moderate or react to a comment on one of the profile's own posts. One endpoint for every network, chosen with platform; each network supports its own verbs and answers 400 platform_not_supported / invalid action otherwise. TikTok: hide/unhide (postId), like/unlike (no postId), pin/unpin (postId). Facebook: hide/unhide, like/unlike, edit (needs message). Instagram: hide/unhide a comment, or enable_comments/disable_comments on a post (postId, no commentId). YouTube: hide/unhide/hold (postId; banAuthor only with hide). Threads: hide/unhide, approve/ignore. Most actions have an inverse; edit does not keep the previous text and banAuthor bans the commenter from the YouTube channel, so both need the user's approval of the exact change. Deleting a comment is a different tool: delete_comment. TikTok: Requires the 'comments' capability on the profile's TikTok account (see the capabilities array in list_users). It is granted at connection time, so an account connected earlier has to reconnect TikTok before this works. Needs the user's approval: call it first without confirmed to get a preview (nothing is sent), show the user exactly what will go out, and repeat the call with confirmed: true only after they approve.

NameRequiredDescriptionDefault
userYesUpload-Post profile name.
actionYesWhat to do. Lowercase; each value already carries its direction, so there is no separate 'undo' flag. Which values a platform accepts is listed in the tool description.
postIdNoPost the comment belongs to (TikTok: the video id). Required for TikTok hide/unhide and pin/unpin, YouTube moderation and Instagram enable_comments/disable_comments; not used by like/unlike.
messageNoFacebook `edit` only: the new comment text.
platformYesSocial platform the comment lives on.
banAuthorNoYouTube `hide` only: also ban the comment's author from the channel.
commentIdNoComment to act on (from get_post_comments). Sent as `comment_id`. Required except Instagram enable_comments/disable_comments.
confirmedNoSet to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true and openWorldHint=true, and the description goes well past them: it warns that `edit` does not retain prior text, that `banAuthor` bans the commenter channel-wide, that unsupported combos return 400 `platform_not_supported`, that TikTok actions need the 'comments' capability granted at connection time (with reconnect required), and that nothing is sent until `confirmed: true`.

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?

Front-loads the primary intent and the `platform` selector, and every sentence carries real information. The dense platform-by-platform enumeration and the capability paragraph make it long and somewhat run-on for a description that must be parsed quickly, but there is little wasted text.

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 an 8-parameter, 5-platform polymorphic mutation tool with an output schema, the description covers the aspects the schema cannot: platform/action compatibility, capability prerequisites, error behavior, irreversibility of edit and banAuthor, and the two-step confirmation protocol. Nothing an agent needs to invoke it safely is missing.

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 description coverage is 100%, so the baseline would be 3, but the description adds conditional semantics the schema only partially captures — postId applicability per platform/action, `message` being Facebook-edit-only, `banAuthor` valid only with YouTube hide, and commentId being unnecessary for Instagram enable_comments/disable_comments.

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?

Opens with a specific verb+resource ('Moderate or react to a comment on one of the profile's own posts') and explicitly frames this as one polymorphic endpoint selected by `platform`. It distinguishes itself from the sibling per-action tools (hide_comment, like_comment, pin_comment) and from delete_comment by naming that tool as a different operation.

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 an explicit per-platform matrix of supported actions (TikTok hide/like/pin, Facebook edit, Instagram enable_comments, YouTube hold, Threads approve/ignore) and states the failure mode when an action isn't supported. It also spells out the decision procedure for the approval flow: call without `confirmed` first to preview, then repeat with `confirmed: true` after user approval.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

complete_media_uploadComplete media uploadAInspect

Step 2 of staging a local file. Call it only after the file bytes were actually PUT to the upload_url from create_media_upload; without that PUT it fails or yields no publishable media. Returns a temporary media_url to pass straight to upload_video / upload_photos / upload_document.

NameRequiredDescriptionDefault
uploadIdYesupload_id returned by create_media_upload.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the mutation profile (readOnlyHint=false, destructiveHint=false). The description adds useful behavioral context beyond those annotations: the hard dependency on the preceding PUT request, the fact that it will fail or produce unusable media without that step, and the temporary nature of the returned URL. This is meaningful situational transparency.

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 three short, front-loaded sentences: step identity, call precondition, and output usage. There is no filler or redundancy, and the complexity is low. It uses a compact, informative structure rather than burying details; a 5 may be one sentence too lean, but this is already efficient.

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?

For a single-parameter tool with an output schema, the description covers the essential context: the step position, the required precondition, failure scenario, return value, and downstream consumers. It does not detail timeouts, retries, or auth, but those are likely shared across the API and not necessary for an agent to call this 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?

Schema coverage is 100% and uploadId is well-documented as 'upload_id returned by create_media_upload.' The description adds additional semantic constraint not visible in the schema: the uploadId must correspond to an upload whose bytes were actually PUT to the upload_url. This helps the agent reason about valid values beyond the schema's type and origin.

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 explicitly states the tool's role as 'Step 2 of staging a local file' and describes the return value ('temporary media_url'). It distinguishes itself from sibling tools like create_media_upload (step 1) and upload_video/upload_photos/upload_document by positioning the result as the input to those upload tools, giving it a specific verb-resource pairing.

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 gives an explicit conditional: 'Call it only after the file bytes were actually PUT...' and states the failure consequence if that precondition isn't met ('fails or yields no publishable media'). It also provides the downstream usage by naming the three upload tools to pass the returned media_url to, making the intended workflow unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_commentCreate a comment or replyA
Destructive
Inspect

Post a top-level comment or a reply on a post. Provide exactly ONE of commentId (reply to a comment), postId, or postUrl (top-level). LinkedIn: postId=the post urn. Instagram requires commentId (replies only). TikTok always needs postId (the video id); add commentId on top of it to reply inside that thread. X: links are removed from the message unless the account is allowed links on X (the response then lists it in warnings), and a message that was only links is refused with 400 x_links_not_allowed. Replies on X share a daily limit per X account with post edits and reposts made through Upload-Post (20 a day on the free plan, 200 on paid plans, reset at 00:00 UTC); past it the call returns 429 x_daily_write_limit with retry_after in seconds. TikTok: Requires the 'comments' capability on the profile's TikTok account (see the capabilities array in list_users). It is granted at connection time, so an account connected earlier has to reconnect TikTok before this works. Needs the user's approval: call it first without confirmed to get a preview (nothing is sent), show the user exactly what will go out, and repeat the call with confirmed: true only after they approve.

NameRequiredDescriptionDefault
userYesUpload-Post profile name.
postIdNoTop-level comment on this post ID. LinkedIn: the post urn. TikTok: the video id, always required.
messageYesComment text to post.
postUrlNoTop-level comment on this post URL.
platformNoSocial platform. One of instagram, facebook, youtube, linkedin, tiktok, x, threads, bluesky.instagram
commentIdNoReply to this comment. Required by Instagram. TikTok: pass it together with postId to reply inside a thread.
confirmedNoSet to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite annotations already declaring destructiveHint and openWorldHint, the description adds substantial non-obvious behavior: X daily write limits with exact thresholds, 429 x_daily_write_limit plus retry_after, the 400 x_links_not_allowed refusal, link stripping surfaced in warnings, and TikTok capability-gating that requires reconnection. This is exactly the operational context annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and the exactly-one-of constraint, then layered platform notes and the safety protocol. Every clause carries real information, though the single dense paragraph makes the platform-specific rules harder to scan than a short bulleted structure would.

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?

An output schema exists, so return values need not be explained, and the description still calls out that preflight responses list stripped links in warnings. Combined with auth/capability requirements, error codes, and the two-step confirmation flow, an agent has everything needed to invoke this destructive, open-world 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?

Schema coverage is 100%, so the baseline is 3, but the description earns above baseline by explaining platform-specific parameter interplay the schema only states per-field: 'TikTok always needs postId; add commentId on top of it to reply', and the mutual exclusivity of the three target parameters. It does not document the platform default or the user parameter's role, which keeps it from a 5.

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?

Opens with a specific verb and resource ('Post a top-level comment or a reply on a post') and immediately distinguishes the two modes via the exactly-one-of rule over commentId/postId/postUrl. An agent knows what the tool does and which shape of call it is making before reading the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit per-platform conditions (Instagram replies-only, TikTok needs postId plus optional commentId, X link restrictions) and a clear when-to-call protocol via the confirmed approval loop. The gap is sibling differentiation: reply_to_comment, public_reply_to_comment, and reply_to_google_business_review exist in the same family and the description never says why to pick this one over them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_media_uploadCreate media uploadAInspect

Step 1 of staging a local file for publishing. Returns upload_id and a short-lived upload_url; the caller must then PUT the raw file bytes to upload_url (same Content-Type and size as declared here) and call complete_media_upload. Only useful when this client can perform the HTTP PUT itself (for example a coding agent with a shell); the model cannot read chat attachments or /mnt/data paths, so for those ask the user for a public HTTPS URL or send them to https://app.upload-post.com. Staging media is deleted after 24 hours; scheduled posts are safe because upload_video copies the media into durable scheduler storage.

NameRequiredDescriptionDefault
sourceNoOptional source label identifying the calling client, e.g. mcp_studio.
filenameYesOriginal filename, e.g. clip.mp4.
mediaTypeNoKind of media being uploaded.video
contentTypeYesMIME type, e.g. video/mp4.
contentLengthYesFile size in bytes.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are minimal, so the description carries the burden. It discloses the short-lived upload_url, the requirement to PUT raw bytes with matching Content-Type and size, the 24-hour staging deletion, and the safety of scheduled posts via upload_video copying to durable storage. No contradiction with readOnly/destructive hints.

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?

Three dense sentences with no filler: purpose first, then return value and required workflow, then when not to use, then lifecycle/durability. 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?

Covers return values, next steps, constraints, TTL, and exception path. Given the output schema fills in exact response shape, nothing critical is missing for an agent deciding to call this tool.

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 already documents filename, contentType, and contentLength well, so the baseline is 3. The description adds meaningful behavioral context by requiring that the subsequent PUT uses the same Content-Type and size declared in these parameters, which is valuable 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?

Clearly identifies itself as 'Step 1 of staging a local file for publishing', states what it returns (upload_id, short-lived upload_url), and distinguishes itself from complete_media_upload and upload_video. An agent can immediately understand its role in the 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?

Explicitly states when it is useful (client can perform HTTP PUT), when it is not (model cannot read chat attachments or /mnt/data paths), and gives concrete alternatives (ask for a public HTTPS URL or send to app.upload-post.com). Also names the required follow-up call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_userCreate profileBInspect

Create a new Upload-Post profile (logical container for connected socials).

NameRequiredDescriptionDefault
usernameYes

Output Schema

NameRequiredDescription
resultNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint false and destructiveHint false, which align with the description's 'Create' action. The description adds context that the profile is a logical container for connected socials, providing some behavioral clarity beyond the annotations. However, it does not disclose side effects, permissions required, or whether the operation is reversible, but given the annotations already cover the safety profile, the bar is lower and a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that immediately conveys the core purpose without any fluff. It front-loads the action and resource, and the clarifying parenthetical adds value without redundancy. Every word earns its place, making it exceptionally concise and clear.

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?

Given the tool's low complexity (only one parameter) and the presence of an output schema (which presumably documents the return value), the description covers the essential concept of what a profile is. It explains that it is a logical container, which is helpful for an agent to understand the abstraction. However, it leaves out details like whether username has any validation rules or if there are any side effects on connected socials, but these are minor for such a simple operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 0%, and the description does not mention the 'username' parameter at all. While the parameter is simple (a string), the description provides no additional meaning, such as format, uniqueness constraints, or any examples. Since the schema itself only gives the type and required status, the description fails to compensate for the lack of coverage, resulting in minimal semantic enrichment.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Create a new Upload-Post profile') and specifies the resource type. It distinguishes itself from sibling tools by naming a specific concept (logical container for connected socials), which is unique among the listed siblings. However, it could elaborate a bit more on what 'profile' entails beyond the container metaphor, so it does not reach a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives, nor does it mention any prerequisites, exclusions, or conditions. While the name 'create_user' implies a clear use case, there is no explicit context about when not to use it or how it fits with related tools like 'list_users' or 'delete_user'. The description assumes the agent will infer usage from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_autodmDelete an AutoDMA
Destructive
Inspect

Permanently delete an AutoDM monitor with its stats and logs. Cannot be undone.

NameRequiredDescriptionDefault
monitor_idYesAutoDM monitor ID (from list_autodms or start_autodm).

Output Schema

NameRequiredDescription
resultNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the description's job is to add specificity — and it does, by naming what is destroyed (the monitor plus its stats and logs) and stating irreversibility. It does not cover auth requirements or any cascade beyond stats/logs, keeping it short of a 5.

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?

Two sentences, both front-loaded with the highest-stakes information (permanence and destruction scope) first. No filler.

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?

An output schema exists, so return values need no explanation, and annotations carry the safety profile. What's missing is routing guidance toward the reversible siblings for a destructive tool, which matters given how many autodm_* siblings exist.

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?

Only one parameter and schema coverage is 100%, so the schema fully documents monitor_id including its provenance (list_autodms, start_autodm). The description adds nothing about the parameter, which is the expected baseline here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb ('Permanently delete') plus resource ('an AutoDM monitor') with scope qualifier ('with its stats and logs'). It's clearly distinct from sibling management tools like pause_autodm or stop_autodm, though it never explicitly contrasts itself with them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Permanently... Cannot be undone' framing implies caution and thus when to prefer a non-destructive alternative, but no alternative is named. An agent must infer that stop_autodm or pause_autodm exist for reversible cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_commentDelete a commentA
Destructive
Inspect

Delete a comment by commentId. LinkedIn also requires postId (the post urn); TikTok needs only the commentId. TikTok: Requires the 'comments' capability on the profile's TikTok account (see the capabilities array in list_users). It is granted at connection time, so an account connected earlier has to reconnect TikTok before this works.

NameRequiredDescriptionDefault
userYesUpload-Post profile name.
postIdNoLinkedIn only: the post urn the comment belongs to.
platformNoSocial platform. One of instagram, facebook, youtube, linkedin, tiktok, x, bluesky (Threads cannot delete comments).instagram
commentIdYesID of the comment to delete.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false and openWorldHint=true, so the safety profile is covered. The description adds genuinely non-structured context: the TikTok capability prerequisite, that it is granted at connection time, and the reconnect remedy — a real operational constraint. It does not state irreversibility or failure behavior, keeping it below 5.

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?

Three tight sentences, front-loaded with the core action and ID, then platform deltas, then the capability prerequisite. The final sentence is long but each clause carries actionable information; no filler.

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?

An output schema exists, so return values need no explanation. Combined with annotations and full schema coverage, the description supplies the missing prerequisites and per-platform parameter rules. It is slightly incomplete on whether platforms other than LinkedIn/TikTok (e.g. the instagram default) actually support deletion.

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%, so baseline is 3. The description adds relational value the schema does not: postId is listed as optional in the schema yet the description states LinkedIn *requires* it, and it clarifies that TikTok needs only commentId — resolving a per-platform requirement ambiguity.

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 ('Delete a comment by `commentId`') immediately, and the platform-specific detail makes it distinguishable from siblings such as create_comment, reply_to_comment, and the ambiguous comment_action. An agent can identify this as the destructive comment-removal tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear conditional guidance: LinkedIn additionally requires postId, TikTok needs only commentId, and TikTok requires the 'comments' capability granted at connection time (reconnect if connected earlier). What is missing is explicit routing against alternatives like comment_action or public_reply_to_comment, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_userDelete profileA
Destructive
Inspect

Permanently delete a profile and disconnect its socials. Needs the user's approval: the call only deletes when confirm_username repeats the profile name, typed or approved by the user. Without it the response says what would be deleted.

NameRequiredDescriptionDefault
usernameYes
confirm_usernameNoThe profile name typed again by the user to confirm the deletion. Must equal `username`; otherwise nothing is deleted.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint annotation, the description explains that deletion is permanent, disconnects socials, requires user approval via confirm_username, and returns a preview of what would be deleted when confirmation is absent. This adds substantial behavioral context for a destructive operation.

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 front-loaded, starting with the permanent deletion effect and then the confirmation requirement. Every sentence adds safety-relevant information without repetition.

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 destructive tool with annotations and an output schema, the description covers the key missing context: permanence, social disconnection, confirmation behavior, and the no-confirm preview response. No critical invocation detail appears absent.

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 documents confirm_username, and the description reinforces its safety role: it must repeat the profile name and otherwise nothing is deleted. The username parameter is only indirectly described as the profile name, which is adequate but not fully detailed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/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: permanently delete a profile and disconnect its socials. This clearly separates it from siblings like create_user and list_users by operation type, though it does not explicitly name alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an important usage condition: deletion only occurs when confirm_username repeats the profile name and the user approves. However, it does not explicitly compare this tool with alternatives such as list_users or create_user, so guidance is implied rather than complete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

download_ffmpeg_resultGet FFmpeg result download URLA
Read-only
Inspect

Returns how to get a finished FFmpeg job's output without streaming it through MCP. For video and image outputs it returns a temporary public media_url (signed, no API key, deleted 24 h after the job finished) that you can pass straight to upload_video / upload_photos as the video URL / photo URL. It also returns download_url, which needs the user's Upload-Post API key.

NameRequiredDescriptionDefault
jobIdYes

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds substantial context beyond them: `media_url` is signed, needs no API key, expires 24 h after job completion, while `download_url` requires the user's Upload-Post API key. Those auth, expiry, and credential nuances are exactly the behavioral details an agent cannot get from 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core purpose, then the two return fields and their constraints. Every clause carries information (temporary, signed, no API key, 24 h expiry, downstream usage) and nothing is redundant.

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?

Although an output schema exists, the description still usefully characterizes the two returned URL fields and their caveats, plus the auth requirements for each. Combined with the read-only annotations and the downstream upload guidance, an agent has everything needed to call this 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?

Only one parameter (`jobId`) exists and the schema has 0% description coverage, so the description must carry the burden. It implies the job must already be finished (a meaningful precondition) but never explains what `jobId` is or where it comes from (e.g., the id returned by submit_ffmpeg_job), leaving that to inference.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/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: it returns download instructions/URLs for a finished FFmpeg job's output, explicitly contrasted with streaming output through MCP. This distinguishes it in practice from get_ffmpeg_job/get_job_status, though it never names those siblings directly, so the differentiation is inferred rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context for use (a job has finished and you want the output without streaming it through MCP) and even names the downstream consumers: pass `media_url` straight to upload_video / upload_photos. It does not explicitly state when to prefer get_ffmpeg_job or what to do if the job is not yet finished, so no exclusion rules are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_commentEdit a Facebook commentA
Destructive
Inspect

Replace the text of a comment the Page itself wrote on Facebook. Facebook only. The previous text is not kept. Needs the user's approval: call it first without confirmed to get a preview (nothing is sent), show the user exactly what will go out, and repeat the call with confirmed: true only after they approve.

NameRequiredDescriptionDefault
userYesUpload-Post profile name.
messageYesThe new comment text.
commentIdYesComment to act on (from get_post_comments).
confirmedNoSet to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true, but the description adds the critical detail that the previous text is not kept and that calling without `confirmed` returns a preview with nothing sent. That preview-then-confirm workflow is exactly the kind of behavioral context an agent cannot infer from annotations alone.

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?

Four compact sentences, each carrying distinct information: scope, destructive effect, and the two-step call protocol. The approval flow is front-loaded as the key operational constraint.

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?

With an output schema present and all four parameters documented in the schema, the description covers everything an agent needs: platform restriction, ownership restriction, irreversibility, and the mandatory approval sequence.

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 coverage is 100% and the schema's `confirmed` description already explains the preview/approval semantics. The description reinforces the workflow but adds no parameter details beyond what the structured schema already provides, so the 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 ('Replace the text of'), the exact resource ('a comment the Page itself wrote'), and the platform scope ('Facebook only'). This clearly distinguishes it from sibling tools like reply_to_comment and create_comment without needing to open either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives strong scoping conditions: only the Page's own comments and only on Facebook, plus a mandatory approval workflow. It stops short of explicitly naming alternatives (e.g., use reply_to_comment for other users' comments), so a 4 rather than a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_scheduledEdit scheduled postA
Destructive
Inspect

Edit a pending scheduled post in place, keeping its job ID and media: reschedule it (scheduledDate/timezone) and/or fix its text. title and caption rewrite the text for EVERY platform of the post; to change only some platforms, send platformContent instead, e.g. {"instagram":{"caption":"..."},"tiktok":{"caption":"..."}} — platforms not listed keep their text. youtubePublishAt sets or clears the date YouTube itself makes the video public (native YouTube scheduling). First comments cannot be edited on a pending post.

NameRequiredDescriptionDefault
jobIdYes
titleNoNew title for every platform of the post.
captionNoNew caption/description for every platform of the post.
timezoneNoIANA timezone for scheduledDate.
scheduledDateNoNew date, ISO 8601.
platformContentNoPer-platform text, keyed by platform (instagram, tiktok, youtube, facebook, linkedin, x, threads…). Only the platforms listed are changed.
youtubePublishAtNoYouTube only: ISO 8601 UTC date-time at which YouTube makes the video public; YouTube applies it only to private videos. Sent as `fields.youtube_publish_at`; null removes it.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare destructiveHint=true and readOnlyHint=false, so the description carries real weight here: it discloses that the job ID and media survive, that only pending posts are editable, that unlisted platforms keep their text, and that youtubePublishAt applies only to private videos and is cleared with null. It does not say what error or state change occurs when editing an already-published or in-flight job, which matters for a destructive mutation.

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?

Front-loaded with the operation and its key invariant, then the parameter branches in a logical order; nearly every clause carries information. The single-paragraph, clause-chained formatting makes it denser than it needs to be, and the inline JSON example, while useful, crowds the sentence flow.

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?

With an output schema present, the description rightly skips return values, and it covers the nested platformContent object and the multi-purpose scheduling fields thoroughly for a 7-parameter mutation. The remaining gap is the failure mode when the target post is not pending, which an agent would want before invoking a destructive edit.

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 already 86%, so the baseline is 3; the description earns above that by explaining the scope semantics of title/caption (all platforms) versus platformContent (only listed keys, with a concrete JSON example), and by characterizing youtubePublishAt as native YouTube scheduling that sets or clears the value. It adds little about jobId, timezone, or scheduledDate beyond what the schema already documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ("Edit a pending scheduled post in place") and adds the distinguishing constraint that the job ID and media are preserved, which separates it from a delete-and-recreate flow. It stops short of naming the sibling tools (list_scheduled, cancel_scheduled, retry_post) it might be confused with, so an agent still has to infer the boundary from names alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly states the two mutually exclusive edit paths with the condition that selects each: title/caption rewrite every platform, while platformContent targets only listed platforms. It also sets an explicit exclusion ("First comments cannot be edited on a pending post"), but gives no guidance about published vs pending posts or when to prefer unpublish_post/retry_post over editing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_jwtGenerate platform-integration JWTA
Destructive
Inspect

Generate a JWT + connection URL so an end-user can connect socials inside an embedded Upload-Post flow (white-label integration). The profile must already exist. Each call resets the profile's connection-page settings to the values passed. To simply help the account owner connect their own socials, prefer get_connect_link.

NameRequiredDescriptionDefault
languageNoForce the connection page language for this profile. When omitted, the page auto-detects the visitor's browser language and falls back to English.
uiLabelsNoFlat map of i18n dot-path keys to replacement strings for the connection page, e.g. { 'connect.title': 'Link your accounts' }. Max 100 entries; keys must match ^[a-zA-Z0-9_.]+$ and values are at most 300 characters. Echoed back in the `profile` object of validate_jwt.
usernameYes
logoImageNo
platformsNo
redirectUrlNo
connectTitleNo
showCalendarNo
readonlyCalendarNo
connectDescriptionNo
redirectButtonTextNo

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations declare destructiveHint=true, and the description explains exactly why: "Each call resets the profile's connection-page settings to the values passed," which is genuinely additive information an agent would otherwise have to discover by breaking a profile. It does not state JWT lifetime, scope of the token, or which settings are cleared when a param is omitted, which are the remaining behavior gaps.

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?

Four short sentences, each doing distinct work: purpose, prerequisite, destructive side effect, alternative. The alternative is placed last where a routing rule belongs, and nothing is repeated from the schema or annotations verbatim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema covers return values, so the JWT/URL needn't be explained. However, for an 11-parameter destructive tool at 18% schema coverage, the definition leaves material gaps: which settings get reset when a field is omitted, and how long the JWT is valid / who may use it, are both unanswered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 18% across 11 parameters, so the description carries the burden — but it names none of the nine undocumented parameters (logoImage, platforms, redirectUrl, connectTitle, showCalendar, readonlyCalendar, connectDescription, redirectButtonText, username). It only implies collectively that they are connection-page settings, which helps framing but not per-parameter meaning.

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 dual resource — "Generate a JWT + connection URL" — and pins the audience and scenario (end-user connecting socials inside an embedded, white-label Upload-Post flow). This is clearly distinguishable from the adjacent get_connect_link and validate_jwt siblings without opening any schema.

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 an explicit prerequisite ("The profile must already exist") and an explicit routing rule to an alternative tool ("To simply help the account owner connect their own socials, prefer get_connect_link"). An agent has both the when and the when-instead handed to it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_account_infoGet account infoA
Read-only
Inspect

Return the connected Upload-Post account: email, plan and usage limits. Useful as a first call to confirm the connection works before doing real work.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultNo

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds the useful framing that results are scoped to the currently connected account (an auth dependency), but says nothing about failure behavior when the connection is invalid. A 3 is appropriate given the lower bar set by 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?

Two short sentences, zero waste, and the substance (what is returned) is front-loaded ahead of the usage hint.

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?

With an output schema documenting return values and annotations covering safety, plus no parameters, the description covers nearly everything needed. The only minor omission is what happens when the connection is not authenticated, which would matter for the 'confirm the connection works' use case.

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 takes zero parameters, so per the baseline this is a 4. There is no parameter semantics for the description to add.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Return the connected Upload-Post account') and enumerates the fields returned (email, plan, usage limits). It is clearly account-level and distinguishable by implication from siblings like get_platform_metrics and list_users, though it never names those alternatives explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete usage recommendation: 'Useful as a first call to confirm the connection works before doing real work.' That is a clear when-to-use signal, but it offers no when-not-to-use or named alternative for account details.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_analyticsGet profile analyticsA
Read-only
Inspect

Aggregated analytics for a profile across selected platforms (followers, views, engagement). Instagram also returns two audience breakdowns with the same shape (age / gender / country / city): follower_demographics for the account's followers and engaged_audience_demographics for the accounts that engaged with its content.

NameRequiredDescriptionDefault
pageIdNoFacebook page ID, if filtering by page.
pageUrnNoLinkedIn organization/company page URN or numeric ID. LinkedIn analytics are only available for pages you administer — personal profiles are not supported. Defaults to the first administered page.
platformsNo
profileUsernameYes

Output Schema

NameRequiredDescription
resultNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read_only_hint=true and destructive_hint=false, so the description need not restate that. The description adds valuable behavioral context by disclosing that Instagram returns two audience breakdowns with a specific shape (`follower_demographics` and `engaged_audience_demographics`), which is not evident from annotations or schema. This goes beyond the read-only hint to explain a platform-specific output variation. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that front-loads the core purpose and tacks on a relevant platform-specific note. There is no redundant wording or filler. It is concise while still conveying important contextual detail.

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?

With an output schema present, the description need not detail return values. It covers the main behavior and the notable Instagram-specific breakdown, which is the only non-obvious output detail. The schema covers parameter constraints (e.g., LinkedIn pages must be administered), so the description is sufficiently complete for an agent to invoke the tool 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 description coverage is 50%, with pageId and pageUrn having descriptions but profileUsername and platforms lacking them. The description indirectly explains platforms as 'selected platforms' and mentions Instagram-specific output, but it does not add syntax or meaning for profileUsername or clarify the platforms array beyond what the enum already provides. It partially compensates for the coverage gap but not fully.

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 it provides aggregated analytics for a profile across selected platforms, listing specific metrics (followers, views, engagement). It distinguishes from sibling tools like get_post_analytics (post-level) and get_platform_metrics (platform-level) by explicitly targeting profiles. The verb and resource are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit guidance on when to use this tool versus alternatives. It does not mention that for post-level analytics one should use get_post_analytics, or that get_cached_post_analytics might be more efficient. The phrasing 'across selected platforms' implies filtering but provides no usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_audienceGet audience insightsA
Read-only
Inspect

Who follows the profile, when they are online and what they tap on it. One endpoint for every network, chosen with platform. Returns audience.countries / .cities / .ages / .genders, activity_by_hour (followers online per hour of the day — use it to pick posting times), followers_daily (total / new / lost), profile_actions and bio_description. It always returns benchmark_categories (the 25 values benchmark_category accepts), and when benchmark_category is set it adds a benchmark object with that niche's averages (engagement rate, likes, views, follower growth…) to compare the account against. The window is clamped by the server — at most 60 days, always ending before today — so a wider range is trimmed, not rejected; range in the response says which window was actually used. Requires the 'profile_analytics' capability on the profile's TikTok account (see the capabilities array in list_users).

NameRequiredDescriptionDefault
userYesUpload-Post profile name.
endDateNoLast day of the window, ISO date. Sent as `end_date`. Clamped to before today: platforms have no data for the current day.
platformYesWhich connected network answers the question. Any other value comes back as a 400 `platform_not_supported` listing the ones that do.
startDateNoFirst day of the window, ISO date, e.g. '2026-07-01'. Sent as `start_date`.
benchmarkCategoryNoCompare the account against this niche's averages. Must be one of the `benchmark_categories` the response lists; omit it on the first call to read them.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as read-only (readOnlyHint=true) and non-destructive (destructiveHint=false), so the description does not need to repeat that. It goes well beyond annotations by disclosing the server-side window clamping ('at most 60 days, always ending before today – a wider range is trimmed, not rejected'), the benchmark behavior (always returns the 25 accepted values, and adds a benchmark object when a category is set), and the capability requirement. These are significant behavioral details that an agent would not know otherwise, making the tool's runtime behavior fully transparent.

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 relatively long but every sentence carries information. It is front-loaded with the core purpose, followed by return fields and specific behavioral notes. The structure is logical and avoids redundancy. It could be slightly more concise (e.g., the capability note could be trimmed), but it is not verbose or repetitive. The density of useful facts justifies a 4, as it is more than minimal but still efficient.

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 that the tool has an output schema (so return value details are covered elsewhere), the description covers all critical aspects an agent needs: the purpose, the response structure (list of keys), the benchmark behavior, the clamping behavior, and the prerequisite capability. It even explains how to discover valid benchmark categories (omit the parameter). There are no missing pieces that would prevent a correct invocation or interpretation. The description is complete for its complexity.

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 description coverage is 100%, so the baseline for this dimension is 3. The description adds meaningful semantics beyond the schema: for benchmark_category it explains 'Must be one of the benchmark_categories the response lists; omit it on the first call to read them,' which is crucial usage guidance not present in the schema. It also clarifies endDate clamping and that platform values are constrained to an enum (though schema already lists that). The additional explanation of the interplay between benchmark_category and the response's benchmark_categories adds real value, so a 4 is warranted.

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 begins with a precise, specific statement of what the tool does: 'Who follows the profile, when they are online and what they tap on it.' It clearly identifies the resource (profile audience) and the action (retrieving insights). It also notes it's a single endpoint for every network selected via 'platform', which distinguishes it from generic analytics tools. The level of detail about return fields (audience.countries, activity_by_hour, etc.) leaves no ambiguity about the tool's purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context on when to use the tool—when you need audience composition, activity patterns, or benchmark comparisons. It also provides a critical prerequisite: 'Requires the 'profile_analytics' capability on the profile's TikTok account,' which is a form of usage constraint. However, it does not explicitly name alternative tools or state 'use X instead when you need Y,' leaving some inference to the agent. It is still clear and actionable, so a 4 is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_autodm_logsGet AutoDM logsA
Read-only
Inspect

Read the activity log of one AutoDM monitor: comments seen and DMs sent or failed.

NameRequiredDescriptionDefault
monitor_idYesAutoDM monitor ID (from list_autodms or start_autodm).

Output Schema

NameRequiredDescription
resultNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds which events appear in the log (comments seen, DMs sent or failed), but says nothing about pagination, time ranges, or retention, and an output schema already exists to describe the return shape.

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?

A single front-loaded sentence with the resource scope first and the log contents second; there is no filler or redundancy.

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?

For a one-parameter read tool with annotations and an output schema, this covers what an agent needs to select and call it correctly. Missing only minor operational details like time-range or pagination behavior.

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 coverage is 100% and the monitor_id property already documents its provenance ('from list_autodms or start_autodm'). The description adds no format or semantic detail about the parameter beyond what the schema provides, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Read') and resource ('activity log of one AutoDM monitor') and even names the log contents (comments seen, DMs sent/failed). It is clear what the tool does, though it does not explicitly distinguish itself from a sibling like get_history.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Scoping to 'one AutoDM monitor' implies the monitor_id requirement and that list_autodms/start_autodm supply that ID, but no explicit when-to-use or when-not-to-use guidance is given against alternatives such as get_history.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_cached_post_analyticsGet cached post analyticsA
Read-only
Inspect

Replays per-post metrics Upload-Post already fetched, instead of calling the platforms again. ONLY contains posts previously fetched through get_post_analytics; there is no background refresh, so captured_at is the last time that post was read live and a post never queried live will be absent. Unlike get_post_analytics it never hits the platforms, so it is not subject to the live analytics rate limit (100 requests / 5 minutes) — prefer it when scanning many posts or paging through a profile's history. Paginated: pass next_cursor from the response back as cursor until has_more is false.

NameRequiredDescriptionDefault
userYesProfile username whose posts to read.
limitNoPosts per page. Defaults to 50, max 200.
sinceNoStart date, YYYY-MM-DD. Defaults to 30 days ago.
untilNoEnd date, YYYY-MM-DD. Defaults to today.
cursorNoOpaque cursor from a previous response's `next_cursor`.
platformNoRestrict to one platform. Omit for all platforms.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly annotation, it discloses important behaviors: no background refresh, `captured_at` reflects the last live read, posts not previously fetched are absent, and the tool is exempt from the live rate limit. It also documents pagination behavior (`next_cursor`/`has_more`) in the description, which is not visible in the schema annotations alone.

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?

Three sentences carry the full load: purpose, cache freshness, rate-limit advantage, and pagination. Every clause earns its place — no filler or schema duplication. The purpose is front-loaded, and the comparison to the sibling comes early enough for fast decision-making.

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 parameter schema covers everything, the main risks for an agent are misunderstanding that this is cached and lacks fresh data, and not knowing when to avoid it. The description fully addresses these, and also provides the pagination loop, the absence of refresh, and the `captured_at` meaning. No critical behavior remains 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?

The schema already describes all six parameters at 100% coverage, including defaults, max values, formats, and enums. The description adds semantic value beyond the schema by using the `cursor` contract (`next_cursor` from response back as `cursor` until `has_more` is false), which directly clarifies how the pagination parameter should be used in practice.

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 opens with the specific verb-reource pair: 'Replays per-post metrics Upload-Post already fetched' and immediately distinguishes the tool from the live `get_post_analytics` by noting it does not hit platforms again. It also explains the scope ('ONLY contains posts previously fetched'), so an agent can tell precisely what this tool returns and how it differs from siblings without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells agents when to prefer this tool: 'prefer it when scanning many posts or paging through a profile's history' and names the key difference from `get_post_analytics` — no platform calls and no rate limit. It also warns about the limitation ('a post never queried live will be absent'), which implicitly tells the agent when to choose the live variant instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_facebook_pagesList Facebook pagesC
Read-only
Inspect

Facebook pages connected to a profile.

NameRequiredDescriptionDefault
profileNo

Output Schema

NameRequiredDescription
resultNo

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile, so the bar is lowered. The description adds the scoping fact that pages are 'connected to a profile' but discloses nothing further — behavior when the optional profile parameter is omitted, pagination, or failure conditions. It does not contradict the annotations, but contributes little beyond them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Six words, efficient and front-loaded, but the brevity veers toward under-specification. The single noun phrase carries only the resource and a vague scope; it earns its place but does little informational work beyond the name and title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (one optional parameter, no enums) and an output schema exists, so return values need not be explained. The critical gap is the profile parameter: 0% schema coverage and no description of how to supply it, though its optionality means the tool can still be invoked with no arguments. Adequate for tool selection, thin for correct invocation with the parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the undocumented profile parameter. The phrase 'connected to a profile' merely echoes the parameter name and gives no indication of accepted values, format, or how to identify a profile. It adds marginal meaning but leaves the only parameter effectively undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a concrete resource (Facebook pages) and a scope ('connected to a profile'), and the resource name clearly distinguishes it from platform siblings like get_linkedin_pages and get_pinterest_boards. However, the description itself is a noun phrase with no explicit verb — 'List' appears only in the title — and 'Facebook pages connected to a profile' borderlines on restating the name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool over alternatives. With a large sibling set containing many similar list tools (get_linkedin_pages, get_pinterest_boards, get_google_business_locations), the description provides no conditions, exclusions, or alternative routing. The agent is left to infer usage solely from the resource name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ffmpeg_consumptionGet FFmpeg quota usageA
Read-only
Inspect

Monthly FFmpeg processing minutes used vs. plan allowance.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate a read-only, non-destructive operation. The description adds useful semantic context that this is a monthly plan-allowance comparison rather than a per-job status lookup. For a simple quota getter, this is sufficient transparency.

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?

Single sentence, front-loaded with the key concept 'monthly FFmpeg processing minutes used vs. plan allowance'. No fluff, no repetition of the tool name.

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?

For a zero-parameter read-only quota tool, the description plus readOnlyHint and an output schema is largely complete. It clearly identifies the metric and comparison. It does not explicitly state when to prefer this over get_ffmpeg_job, but the quota-vs-job distinction is strongly implied by the wording.

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 accepts zero parameters, so no parameter explanation is needed. The description adds meaning to what the tool reports (monthly usage vs. allowance), fully covering the no-parameter case.

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 a specific read-only purpose: report monthly FFmpeg processing minutes used versus the plan allowance. It is unambiguous and distinct from sibling tools like get_ffmpeg_job, which concerns individual jobs, not consumption.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance is given about when to use this tool versus alternatives such as get_ffmpeg_job or submit_ffmpeg_job. The context is clear from the description, but the description does not help an agent choose between related tools or rule out alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ffmpeg_jobPoll FFmpeg job statusA
Read-only
Inspect

Poll the status of an FFmpeg job. When status is 'finished', call download_ffmpeg_result to obtain a publishable media_url (or the authenticated download URL).

NameRequiredDescriptionDefault
jobIdYes

Output Schema

NameRequiredDescription
resultNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safe read-only, closed-world, non-destructive profile, so the description's added value is the polling lifecycle: a status field with a terminal 'finished' value and the follow-up call that unlocks the result. It omits other possible states (failed/timeout) and any polling cadence or rate-limit guidance, which keeps it from a 5.

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?

Two sentences, no filler, with the poll action front-loaded and the follow-up instruction second. Every clause carries information the agent needs.

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?

An output schema exists, so return values need not be spelled out, and the description sensibly concentrates on the polling lifecycle and the hand-off. The remaining gap is behavioral: non-terminal/failure states and re-poll cadence are unaddressed for what is inherently a repeated-call tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the single parameter jobId is undocumented in both places. The description refers only to 'an FFmpeg job' and never states that jobId is the identifier returned by submit_ffmpeg_job or what format it takes; the agent must infer the link from the workflow sentence.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Poll the status of an FFmpeg job'), which cleanly separates it from submit_ffmpeg_job and download_ffmpeg_result in the sibling list. It does not explicitly differentiate itself from the adjacent generic pollers get_status / get_job_status, leaving a small ambiguity about which status tool to reach for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete conditional next step: when status is 'finished', call download_ffmpeg_result, and explains why (to get a publishable media_url). That is genuinely useful workflow context. It stops short of naming when to use this versus get_job_status, or how frequently to re-poll, so there are no explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_google_business_locationsList Google Business locationsB
Read-only
Inspect

Google Business Profile locations the profile can post to.

NameRequiredDescriptionDefault
profileNo

Output Schema

NameRequiredDescription
resultNo

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description does not need to restate safety. It adds one useful behavioral detail: only postable locations are returned. It does not describe behavior when profile is omitted or responses are empty, but the annotation coverage lowers the burden.

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?

One short front-loaded sentence with no redundancy. Every word contributes to the tool's purpose and scope.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple one-parameter tool, available output schema, and strong annotations, the description is reasonably sufficient. However, the parameter semantics and usage guidance are thin enough that an agent might not know how to populate 'profile' or when to prefer this tool over sibling list tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the single 'profile' parameter. It weakly clarifies the parameter by referring to 'the profile can post to,' but it does not explain how it should be specified, whether it is required, or what values it accepts.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource (Google Business Profile locations) and scopes it to 'the profile can post to,' which makes it distinct from sibling get_google_business_reviews. Although the description is a noun phrase rather than a verb phrase, the title supplies the action 'List.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus alternatives, nor any exclusion such as 'for reviews, use get_google_business_reviews.' The phrase 'can post to' implies use in a posting workflow, but the agent is left to infer the context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_google_business_reviewsList Google Business reviewsA
Read-only
Inspect

List reviews for a Google Business Profile location. Pass the profile that owns the connected Google Business account; location_id defaults to the account's selected location.

NameRequiredDescriptionDefault
userYesUpload-Post profile name that owns the connected Google Business account.
orderByNoe.g. 'updateTime desc' or 'rating desc'.
pageSizeNo
pageTokenNo
location_idNoLocation, e.g. 'locations/123' or a full 'accounts/.../locations/...'. Defaults to the account's location.

Output Schema

NameRequiredDescription
resultNo

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it read-only and non-destructive. The description adds one useful behavioral detail: location_id defaults to the account’s selected location. It does not mention pagination, result scope, or any rate-limit/auth implications.

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?

Two short sentences, front-loaded with the core action, and no filler or repetition of schema fields.

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?

With an output schema and read-only annotations present, the description covers the core invocation, required owner, and default location behavior. Minor gap: no explicit pagination guidance, but this is partially inferable from the parameters.

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 coverage is decent; the description adds meaning by clarifying that the profile passed must be the owner of the connected account and that omitting location defaults to the selected location. It does not fully explain pageToken or pagination behavior.

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?

‘List reviews for a Google Business Profile location’ states the action, resource, and scope in one sentence)Skip; the title reinforces it and distinguishes it from reply/update siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool and gives setup context (‘pass the profile that owns the connected Google Business account’), but it does not explicitly contrast alternatives or state the condition for choosing this over another read tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_historyGet upload historyB
Read-only
Inspect

Paginated history of uploads across all profiles.

NameRequiredDescriptionDefault
pageNo
limitNoItems per page. The API pages in 10, 20, 50 or 100, so other values are rounded up to the next of those. Defaults to 10.

Output Schema

NameRequiredDescription
resultNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds that results are paginated and span all profiles, but it does not disclose ordering, inclusion criteria for upload types, or other behavioral details 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single front-loaded sentence with no unnecessary words. The scope and pagination behavior are stated immediately.

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?

For a simple read-only list tool with an output schema, the description covers the essential scope and pagination nature. The main remaining gap is that 'uploads' is not further qualified, but the output schema can carry return-value details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%, and the page parameter has no schema description. The description says 'paginated' but does not explain page numbering, defaults, or how paging behaves; the limit parameter is already well documented in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource and action: a paginated history of uploads. The scope phrase 'across all profiles' distinguishes it from profile-specific retrieval, though it does not explicitly name sibling alternatives such as get_media.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The tool's intended use is implied by 'history of uploads,' but there is no explicit guidance on when to use it versus related tools like get_media, get_post_analytics, or get_media_upload. It lacks when-not conditions or named alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_job_statusGet scheduled job statusA
Read-only
Inspect

Check the status of a scheduled or queued upload by job_id. Use this for posts created with addToQueue or scheduledDate.

NameRequiredDescriptionDefault
jobIdYes

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint and destructiveHint annotations already convey safety, and the description adds meaningful context by scoping the tool to scheduled/queued upload status checks. It clarifies the input’s origin (posts created via `addToQueue` or `scheduledDate`), which exceeds what annotations alone indicate.

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?

Two sentences, no filler, with the primary purpose front-loaded. Every word contributes to clarifying what the tool does and when to use it.

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?

For a single-parameter read-only lookup with an output schema, the description provides necessary context about the resource type (scheduled/queued uploads) and the relevant posting flows. It is slightly incomplete in not mentioning how a jobId is obtained from related tools like `addToQueue` or `list_scheduled`, but not enough to hinder correct invocation.

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?

With schema_description_coverage at 0%, the description must compensate, and it only says 'by job_id' which is close to the schema's `jobId` field name. It adds minimal value by tying the ID to scheduled/queued uploads, but it does not explain how to obtain a valid jobId or distinguish it from other job ID formats among siblings. Adequate but not strong.

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 ('Check the status of a scheduled or queued upload by job_id') and immediately distinguishes it from generic status tools by narrowing scope to uploads created with `addToQueue` or `scheduledDate`. An agent can easily tell this apart from siblings like `get_status` and `get_ffmpeg_job`.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear usage context by explicitly stating 'Use this for posts created with addToQueue or scheduledDate'. This tells the agent when to choose this tool, though it doesn't name alternatives or exclude other status tools such as `get_status` or `list_scheduled`.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_linkedin_pagesList LinkedIn pagesA
Read-only
Inspect

LinkedIn company pages connected to a profile.

NameRequiredDescriptionDefault
profileNo

Output Schema

NameRequiredDescription
resultNo

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds the useful scoping detail that only pages connected to a profile are returned, but it does not disclose auth needs, pagination, or rate limits; that is acceptable given 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded phrase with no filler, and every word contributes meaning. The title supplies the verb, making the combined definition economical and easy to scan.

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?

For a read-only, one-parameter list tool with an output schema and annotations, the description is largely complete: it gives the resource, scope, and profile relationship. Missing details such as the exact profile identifier format and alternative routing are minor for basic invocation.

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 description coverage is 0%, so the description must carry weight; 'connected to a profile' clarifies that the profile parameter identifies whose pages are listed. It does not specify the expected format of the profile value, though the schema's required array already signals that the parameter is optional.

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 title's verb 'List' combines with the description's resource 'LinkedIn company pages' and scope 'connected to a profile' to state exactly what the tool does. The focus on LinkedIn clearly distinguishes it from sibling tools like get_facebook_pages and get_google_business_locations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the use case—retrieving LinkedIn pages for a given profile—but provides no explicit when-to-use guidance, no exclusions, and no mention of alternatives. The agent must infer usage from the resource name and scope.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_mediaGet recent media from connected accountsA
Read-only
Inspect

Retrieve recent media (videos, photos, text posts) pulled directly from a profile's connected social accounts. Supports instagram, tiktok, youtube, linkedin, facebook, x, threads, pinterest, bluesky, reddit. Useful for browsing what already exists on a platform before posting more. Paginated: the response carries pagination = { limit, next_cursor, has_more }; pass next_cursor back as cursor for the next page (the last page returns next_cursor null and has_more false).

NameRequiredDescriptionDefault
userNoProfile username to scope the query to.
limitNoItems per page. Defaults to 25 and is clamped to 1-100. Per-platform caps: TikTok 20, YouTube 50, everything else 100.
cursorNoOpaque cursor from a previous response's `pagination.next_cursor`. LinkedIn, Discord and Telegram do not support cursors — passing one there fails with HTTP 400; use `limit` alone on those platforms.
page_urnNoLinkedIn only. Numeric organization ID (e.g. '12345'), full URN ('urn:li:organization:12345'), or 'me' to force the personal profile. When omitted, accounts linked as an organization admin auto-resolve to the first administered organization; otherwise the personal profile is used.
platformNoRestrict to a single platform key.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, destructiveHint=false, so the safety profile is covered. The description adds real value beyond that by documenting the pagination contract (response shape, next_cursor→cursor chaining, terminal page signals). No concurrency, rate-limit, or ordering details are given, so it isn't a 5.

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?

Front-loaded with purpose, then platforms, then pagination – a sensible order with little waste. The platform enumeration and pagination parenthetical are slightly long but each serves a purpose.

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 read-only, paginated list tool with an output schema present, the description covers what to call, what it returns at the pagination level, and how to continue paging. Nothing an agent needs to invoke it 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?

Schema coverage is 100% and each parameter already carries rich documentation, including per-platform limit caps and the LinkedIn cursor failure. The description's only added param meaning is the next_cursor→cursor mapping, which the schema states too. Baseline 3.

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 ('Retrieve recent media ... from a profile's connected social accounts') and enumerates the supported platforms. This clearly separates it from sibling write/upload tools (upload_video, create_media_upload) and from get_media_upload.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete usage motive ('browsing what already exists on a platform before posting more'), which tells the agent this is an inspect-before-write read. It stops short of naming explicit alternatives or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_media_uploadGet media uploadA
Read-only
Inspect

Internal/app staging helper. Get status for a short-lived MCP media upload. Optionally returns a fresh temporary media_url for an already-uploaded staging object.

NameRequiredDescriptionDefault
uploadIdYes
includeUrlNo

Output Schema

NameRequiredDescription
resultNo

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only and non-destructive behavior, so the bar for extra transparency is lower. The description adds useful context about the upload being short-lived and the URL being a fresh temporary URL, which goes beyond the schema. It still doesn't disclose what happens on expiry or when includeUrl is false, but it provides reasonable behavioral color.

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?

Two compact sentences with no filler. The key purpose is front-loaded, and the optional URL behavior is stated efficiently. Every clause adds meaning.

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?

Given the output schema exists and annotations cover safety, the description supplies the essential behavioral and parameter semantics. It explains the staging context, the short-lived nature, and the optional URL return. It could mention explicit expiration or null-handling behavior, but nothing critical is missing for correct invocation.

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 description coverage is 0%, so the description carries the burden of explaining parameters. It covers uploadId implicitly as the identifier of the upload being queried and includeUrl explicitly via 'Optionally returns a fresh temporary media_url.' The mapping is clear enough for an agent to use both parameters correctly.

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: 'Get status for a short-lived MCP media upload.' It further distinguishes this from generic media or status tools by noting it can 'return a fresh temporary media_url for an already-uploaded staging object,' making the resource and behavior unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Internal/app staging helper' gives useful context about intended use, and the short-lived upload description implies this is for checking upload state rather than production media retrieval. However, it does not explicitly mention when to prefer this over siblings like get_media, get_status, or complete_media_upload, nor any usage exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_pinterest_boardsList Pinterest boardsC
Read-only
Inspect

Pinterest boards available to a profile.

NameRequiredDescriptionDefault
profileNo

Output Schema

NameRequiredDescription
resultNo

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the tool read-only and non-destructive, so the description correctly does not contradict them. It adds scoping context ('available to a profile'), but no behavioral details about authentication, default behavior, or response characteristics. The description carries some value but stays close to what the annotations imply.

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 compact phrase with no filler words, which is front-loaded and to the point. It is adequately concise, though the brief structure leaves out necessary detail that other dimensions penalize.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's very minimal description and parameter coverage, the overall picture is incomplete: the 'profile' parameter is unexplained, and there is no usage context or link to other tools. Though an output schema exists, the description fails to fill in basic operational context, leaving the agent guessing on how to invoke or select the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has no property descriptions (0% coverage) and the description only mentions 'a profile' without defining what format it expects (e.g., ID, handle) or how it affects results. This is insufficient for an agent to correctly construct the argument, especially when the parameter is optional but behaviorally meaningful.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource as Pinterest boards and scopes them to a profile, which is clear and specific. It lacks an explicit verb, relying on the title to infer the 'list' action, but that is a minor omission. Among siblings like get_facebook_pages and get_linkedin_pages, the platform is highlighted, but the description doesn't explicitly distinguish it beyond the resource name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus alternatives or what conditions make it appropriate. The description merely states a fact about Pinterest boards without explaining selection criteria, prerequisites, or fallback behavior. The agent is left to infer from the name and sibling context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_platform_metricsList platform metricsA
Read-only
Inspect

Reference: which metrics are available per platform (impressions, likes, …) and their human labels.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultNo

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds that it's a reference and includes human labels, but it doesn't disclose any additional behavioral traits such as output format, pagination, or rate limits. Since annotations cover the core safety, the added value is modest.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence that starts with 'Reference:' to immediately signal its purpose. It includes examples and the key detail about human labels, with zero wasted words. The structure is optimal for an agent scanning tool definitions.

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?

For a parameterless reference tool with an output schema present, the description adequately explains what the tool returns (metrics per platform with human labels). It doesn't describe the exact output structure, but the output schema likely covers that. No critical information is missing for an agent to decide 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?

The tool has zero parameters, so the schema coverage is trivially 100% and there is nothing to explain. Per the calibration rule, a zero-parameter tool gets a baseline of 4, and the description correctly adds no unnecessary parameter guidance.

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 returns a reference of available metrics per platform, with examples and human labels. It distinguishes itself from analytics data tools by positioning it as a metadata/reference lookup rather than a data pull, so an agent can tell it apart from siblings like get_analytics or get_total_impressions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when an agent needs to know which metrics are available, but it doesn't explicitly state when to use this tool versus alternatives like get_analytics or get_total_impressions. There is no mention of exclusions or when not to use it, leaving the decision partly to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_post_analyticsGet post analyticsAInspect

Per-platform metrics for a specific post identified by request_id. post_metrics carries whatever each platform reports, so its shape is not the same everywhere: on TikTok it adds retention (the curve, second by second), impression_sources (For You, following, search, profile…), audience_types (followers vs non-followers), new_followers won by the post, reach and the watch times (average_time_watched, total_time_watched, full_video_watched_rate) on top of the usual counters. It fetches the metrics live from the platform and changes nothing on the post or the account; Upload-Post keeps a copy of the result, which later reads of the same post can get from get_cached_post_analytics. Repeated calls for the same post within 5 minutes return the same result. When one platform cannot answer (for example, X's daily limit on live post reads), its entry carries post_metrics_error instead of post_metrics and the other platforms still answer.

NameRequiredDescriptionDefault
requestIdYes

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: it discloses a live platform call with no mutation of post or account, a server-side cached copy, a 5-minute idempotency window, and a per-platform failure mode where post_metrics_error replaces post_metrics while other platforms still answer (citing X's daily live-read limit). That error semantics and rate-limit context is exactly the kind of behavior annotations cannot express. No contradiction with readOnlyHint=false/destructiveHint=false: the tool is non-mutating but does perform external live reads and stores a result copy.

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?

Front-loads the core purpose and keeps everything else in one dense paragraph with no filler sentences. It is on the long side and the TikTok metric enumeration could be trimmed since an output schema exists, but each sentence conveys operational information.

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?

With an output schema present, the tool does not need to enumerate return fields, yet it still explains the variable post_metrics shape and the error-entry pattern, plus side effects and caching. The only real gap is the missing guidance on where requestId comes from, which matters for a one-parameter tool at 0% schema coverage.

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 coverage is 0% for the single required parameter, so the description carries the burden and only partially meets it: it names the identifier as `request_id` (note the casing differs from the schema's `requestId`) but never says where to obtain it or what format it takes. The reader knows the parameter identifies the post but not how to source it.

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: per-platform metrics for a specific post identified by request_id. It explicitly distinguishes itself from get_cached_post_analytics by noting it fetches live and that the cached sibling serves later reads of the same post, so an agent can pick between them without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternative (get_cached_post_analytics) and the condition that separates them: live fetch now vs. the stored copy. It also warns that repeat calls within 5 minutes return the same result, which tells the agent not to poll. It stops short of an explicit 'use X when / never use Y when' rule, so a 4 rather than a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_post_commentsGet post commentsA
Read-only
Inspect

List comments on a post. One endpoint for every network, chosen with platform. Identify the post by either postId or postUrl (YouTube: postId=videoId; LinkedIn: postId=the post urn; TikTok: postId=the video id, postUrl is not accepted). Add commentId to get the REPLIES hanging off that one comment instead of the post's top-level comments — replies are the same question with one more parameter, not another tool. Reads are cached for up to 60 seconds (up to 2 minutes on X); a comment created or deleted through Upload-Post by the same account shows up on the next read. TikTok: Requires the 'comments' capability on the profile's TikTok account (see the capabilities array in list_users). It is granted at connection time, so an account connected earlier has to reconnect TikTok before this works.

NameRequiredDescriptionDefault
userYesUpload-Post profile name.
afterNoPagination cursor returned by a previous call.
limitNoComments to return (1-50; that ceiling is both Meta's and TikTok's).
postIdNoPlatform media/post ID. YouTube: the videoId. LinkedIn: the post urn. TikTok: the video id (required — TikTok has no URL lookup).
postUrlNoPublic URL of the post.
platformNoSocial platform. One of instagram, facebook, youtube, linkedin, tiktok, x, threads, bluesky.instagram
commentIdNoReturn the replies under this comment instead of the post's top-level comments. Sent as `comment_id`.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past the annotations: discloses 60-second caching (2 minutes on X), read-after-write behavior for comments created/deleted through Upload-Post, and a hard TikTok capability gate with a remediation path. These are exactly the operational facts that cause failed calls or stale-data confusion.

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?

Front-loads purpose, then identity rules, then the replies hint, then caching and the TikTok gate — a sensible priority order. The TikTok prerequisite is worth its length, though the platform-syntax parenthetical partially duplicates the schema.

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?

Covers what the output schema cannot: caching latency, eventual consistency, per-platform ID conventions, the cursor-based pagination entry point, and the one platform-specific authorization gotcha. Nothing essential for a correct first call 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?

Schema coverage is 100%, so the baseline is 3. The description restates the postId-per-network mapping and the TikTok no-URL rule, which the schema already documents verbatim in its property descriptions. It adds the unifying frame (one endpoint, choose with `platform`) but no new 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?

States a specific verb+resource ("List comments on a post") and immediately scopes it as a cross-network endpoint parameterized by `platform`. It also pre-empts the most likely confusion by declaring that replies are a parameter of this tool, not a separate tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use guidance for `commentId` (replies vs top-level) and a concrete prerequisite for TikTok (the 'comments' capability, granted at connect time, reconnect required). It does not point to write-side siblings such as reply_to_comment, but for a read tool the selection risk is low.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_queue_settingsGet queue settingsC
Read-only
Inspect

Posting queue configuration (slots per day, time windows, timezone).

NameRequiredDescriptionDefault
profile_usernameNo

Output Schema

NameRequiredDescription
resultNo

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly=true and destructive=false, so the safety profile is covered. The description adds meaning by enumerating returned queue details (slots, time windows, timezone) but does not go beyond that to mention auth needs, defaults, or behavior when profile_username is omitted.

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 a single concise sentence that front-loads the resource ('Posting queue configuration') and parenthetically lists key content fields. Every word adds value; there is no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With one optional parameter and no explanation of its meaning or effect, plus no mention of what happens when it is omitted, the description leaves an important usage gap. The output schema may cover return fields, but the input behavior is not sufficiently explained for confident invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema coverage is 0% and the description does not explain the only parameter, profile_username. Although the name is somewhat self-explanatory, the description adds no information about whether it is required, what it filters, or how it affects the returned settings.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The title 'Get queue settings' plus the description 'Posting queue configuration (slots per day, time windows, timezone)' clearly identify the resource and the data returned. It does not explicitly distinguish itself from sibling tools like update_queue_settings or preview_queue, but the getter verb and listed fields make the 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 Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool instead of alternatives such as update_queue_settings or preview_queue, nor are prerequisites or typical invocation contexts mentioned. The description implies it is a read operation, but it does not state exclusions or conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_reddit_detailed_postsGet detailed Reddit postsA
Read-only
Inspect

Recent Reddit posts published from a profile, with the platform-side metadata (subreddit, flair, score, …). Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target.

NameRequiredDescriptionDefault
limitNo
profileYesUpload-Post profile name. Required by the API.

Output Schema

NameRequiredDescription
resultNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered elsewhere. The description adds genuinely useful operational context (Reddit is unavailable, error_code=reddit_unavailable), but omits behavioral details like pagination, result limits, or what an empty result means.

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?

Three short sentences, front-loaded with the core purpose before the caveat. The availability sentence and the publish-target warning overlap slightly but both carry actionable instruction rather than filler.

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?

An output schema exists, so return values needn't be explained, and the read-only profile is covered by annotations. The main residual gap is the undocumented `limit` parameter; otherwise the definition is sufficient to call the tool correctly and to know it currently fails.

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 coverage is 50%: `profile` is documented in the schema and echoed in the description, but `limit` (1–200) is unexplained in both schema and description—no default, no pagination semantics. With partial coverage, the description does not fully compensate, keeping this at baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Recent Reddit posts published from a profile') plus the payload shape (subreddit, flair, score metadata). It does not name any sibling or contrast with alternatives, but no sibling in the list fetches Reddit posts, so differentiation is implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a when-not ('Do not use reddit as a publish target') but that constraint is about publishing, not about invoking this read tool, and no alternative read tool or fallback is suggested. Usage context for fetching posts is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_statusGet async upload statusA
Read-only
Inspect

Check the status of an async upload by request_id. Poll this until status is 'success' or 'failed'.

NameRequiredDescriptionDefault
requestIdYes

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the agent knows this is a safe read. The description adds the specific polling behavior and the expected terminal states, which goes beyond the annotations. There is no contradiction; it simply adds useful behavioral context about how status evolves.

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 two sentences, front-loads the purpose, and contains zero fluff. The polling condition is placed second, efficiently guiding usage. Every word earns its place.

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 tool has an output schema that presumably defines the `status` field, so the description does not need to repeat return structure. It gives the essential polling loop and terminal conditions. It does not mention error handling or what to do if the upload never reaches a terminal state, but for a single-parameter read-poll tool this is adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% (the property has no description), so the tool description must compensate. It mentions `request_id` by name but adds little semantics: it only says 'by `request_id`', implying it is an identifier from an async upload but does not explain its format, origin, or how to obtain it. This is minimal value beyond the raw 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 states a specific verb and resource: 'Check the status of an async upload' and identifies the required identifier `request_id`. It clearly distinguishes this from sibling tools like `get_job_status` or `get_media_upload` by focusing on async upload status, though it doesn't name alternatives. The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage guidance: 'Poll this until `status` is "success" or "failed".' This tells the agent exactly when to call it and how to interpret the result iteratively. It does not explicitly mention when to avoid it or alternative tools, but the polling instruction is strong contextual guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_suggestionsGet hashtag or keyword suggestionsA
Read-only
Inspect

What to write about: the hashtags or the searches a network suggests around a word. One endpoint for both questions, told apart by type, and one endpoint for every network, chosen with platform. type: 'hashtags' returns { hashtags: [{ name, view_count }] } — pick tags that actually have reach for a caption; type: 'keywords' returns { keywords: [...] }, what people really search around q, useful for the next video topic. Requires the 'profile_analytics' capability on the profile's TikTok account (see the capabilities array in list_users). Keyword suggestions need 'trend_search' instead, granted the same way.

NameRequiredDescriptionDefault
qNoSeed word to get suggestions around, e.g. 'coffee recipe'. Without the '#'.
typeYesWhich suggestions to ask for: 'hashtags' (with view counts) or 'keywords' (related searches).
userYesUpload-Post profile name.
languageNoLanguage code for the results, e.g. 'es' or 'en'.
platformYesWhich connected network answers the question. Any other value comes back as a 400 `platform_not_supported` listing the ones that do.
countryCodeNoISO 3166-1 alpha-2 country to rank the suggestions for, e.g. 'ES' or 'US'. Sent as `country_code`.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: that the output shape depends on `type`, that capability requirements differ by type, and that the platform parameter selects the network. It also implicitly acknowledges the platform_not_supported error via the schema, but that is part of the parameter description.

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 moderately concise and front-loaded with the core purpose. It contains some redundancy ('One endpoint for both questions' is restated later), but overall it is well-structured and each sentence adds value. Not overly verbose.

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?

Given the tool's complexity (6 params, 2 enums, 3 required) and the existence of an output schema, the description covers the essential behaviors: what it returns for each type, capability prerequisites, and how platform selects the network. It does not mention pagination or limits, but the output schema likely covers those. Overall, it is sufficiently complete for an agent to use 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 description coverage is 100%, so the baseline is 3. The description does add a few nuances (e.g., q should not include '#', and the capability requirement per type), but these are minor and the schema already explains all parameters effectively. It does not fully compensate for any gaps because there are none.

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 it provides hashtag or keyword suggestions, explicitly distinguishes between the two output modes, and clarifies that it works across networks via the platform parameter. It avoids vagueness and is easily distinguishable from sibling tools like get_post_analytics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use each type ('pick tags that actually have reach for a caption' for hashtags, 'useful for the next video topic' for keywords) and notes capability requirements (profile_analytics and trend_search), with a pointer to list_users. It does not explicitly name alternatives or state when not to use the tool, but the use cases are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_total_impressionsGet total impressionsB
Read-only
Inspect

Sum of impressions for a profile from daily snapshots. Use period for presets, or startDate/endDate for custom ranges.

NameRequiredDescriptionDefault
dateNo
periodNo
endDateNo
metricsNo
breakdownNo
platformsNo
startDateNo
profileUsernameYes

Output Schema

NameRequiredDescription
resultNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this a read-only, non-destructive operation. The description adds value by revealing that impressions are aggregated from daily snapshots rather than live data, but it does not disclose limitations like timezone handling, snapshot delay, or how multiple date fields (`date` vs `startDate`/`endDate`) interact.

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 two short sentences with no filler. The core result is front-loaded, and the second sentence gives the most important parameter semantics without repetition or verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 8 parameters, 0% schema description coverage, and a non-obvious set of optional interactions (`date` vs `period` vs `startDate`/`endDate`, plus `metrics`, `breakdown`, `platforms`), the description is too minimal for an agent to reliably choose and fill optional parameters. The output schema covers return values, but input semantics remain under-specified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry parameter meaning. It explains only `period` and `startDate`/`endDate`, leaving the other five parameters (`date`, `metrics`, `breakdown`, `platforms`, `profileUsername`) effectively undocumented in both schema and description. This is a significant gap for an 8-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb-resource pairing ('Sum of impressions for a profile') and notes the data source ('daily snapshots'). It is clear, but it does not explicitly differentiate this tool from closely related siblings like get_platform_metrics or get_analytics, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete parameter guidance: use `period` for presets, or `startDate`/`endDate` for custom ranges. However, it does not say when to use this tool instead of the many sibling analytics tools, and it gives no exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hide_commentHide or unhide a commentA
Destructive
Inspect

Hide a comment on one of the profile's own posts so the public no longer sees it, or show it again with hidden: false. Works on TikTok, Facebook, Instagram, YouTube and Threads. TikTok and YouTube need the postId the comment belongs to. To delete a comment use delete_comment. TikTok: Requires the 'comments' capability on the profile's TikTok account (see the capabilities array in list_users). It is granted at connection time, so an account connected earlier has to reconnect TikTok before this works. Needs the user's approval: call it first without confirmed to get a preview (nothing is sent), show the user exactly what will go out, and repeat the call with confirmed: true only after they approve.

NameRequiredDescriptionDefault
userYesUpload-Post profile name.
hiddenNotrue hides the comment (default); false makes a hidden comment visible again.
postIdNoPost the comment belongs to (TikTok: the video id; YouTube: the videoId). Required on TikTok and YouTube.
platformYesSocial platform the comment lives on.
banAuthorNoYouTube only, when hiding: also ban the comment's author from the channel.
commentIdYesComment to act on (from get_post_comments).
confirmedNoSet to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say non-read-only, destructive, open-world. The description adds material context beyond that: the two-step preview/confirm flow where an unconfirmed call sends nothing, the TikTok capability grant at connection time with explicit reconnect remedy, and the per-platform postId requirement. Those are exactly the operational traits an agent cannot infer from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and its inverse, then platform caveats, then the safety workflow. Dense but every sentence carries necessary information; slight redundancy with the schema on postId and hidden keeps it from a 5.

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?

With 7 parameters, three platforms-specific quirks and an output schema present, the description covers the auth/capability story and the confirmation protocol well enough to call safely. The only unexplained surface is banAuthor's side effect (channel ban), which is implied but not described.

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 coverage is 100%, so the baseline is 3. The description restates what the schema already documents (hidden: false restores visibility, TikTok/YouTube require postId) and never mentions banAuthor, the YouTube-only author-ban flag, so it adds little beyond structured data.

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 (hide/unhide a comment) plus scope (the profile's own posts) and the exact effect (public no longer sees it, or restored with hidden: false). The multi-platform coverage is enumerated, so an agent can tell at a glance that this is not the same as delete_comment, hold_comment, or approve_comment.

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 routes away from the wrong sibling: 'To delete a comment use delete_comment.' It also defines the required invocation sequence for approval (call without confirmed for a preview, then with confirmed: true) and names the platform precondition (TikTok 'comments' capability, reconnect required). That is when-to-use, when-not, and prerequisites in one place.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hold_commentHold a YouTube comment for reviewA
Destructive
Inspect

Move a comment on one of the channel's YouTube videos to "Held for review", taking it off the public video until it is approved. YouTube only. To publish it again use hide_comment with hidden: false.

NameRequiredDescriptionDefault
userYesUpload-Post profile name.
postIdYesYouTube videoId the comment belongs to.
commentIdYesComment to act on (from get_post_comments).

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare destructiveHint=true and openWorldHint=true, so the safety profile is partly covered. The description adds useful behavioral context by explaining that the comment is taken off the public video until approved and can be republished via hide_comment with hidden:false.

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 front-loaded with the core action and state change, followed by the platform restriction and reversal path. Every sentence adds useful information with no repetition.

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?

An output schema exists and annotations cover the safety profile, so the description is close to complete. It explains the platform, the public-visibility effect, and how to reverse it, though it omits prerequisites such as required permissions or approval workflow details.

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 description coverage is 100%, so the three parameters are already documented in the schema. The description does not add format or syntax details beyond referring to a comment on one of the channel's videos, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

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: moving a comment to "Held for review" on a YouTube video. It also names the platform and the state change, which distinguishes it from generic comment actions and from hide_comment, whose hidden:false setting is explicitly named for reversal.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context: YouTube only, and it names the alternative call for republishing. It does not explicitly explain when to choose hold_comment versus hide_comment, ignore_comment, or approve_comment, so it falls short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ignore_commentIgnore a pending Threads replyA
Destructive
Inspect

Ignore a reply waiting for approval on one of the profile's Threads posts, so it stays unpublished. Threads only; to publish it use approve_comment.

NameRequiredDescriptionDefault
userYesUpload-Post profile name.
commentIdYesPending reply to ignore (from get_post_comments).

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose that this is a non-read-only, open-world, destructive operation. The description adds valuable outcome context: the reply 'stays unpublished', implying it is not deleted but simply left unapproved. It does not discuss reversibility or permissions, but with annotations carrying the safety profile this is a strong addition.

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?

Two short sentences, front-loaded with the core action and outcome, followed by the platform constraint and alternative. Every sentence earns its place with no waste.

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?

Given the presence of an output schema, full parameter documentation, and annotations, the description covers the essential behavioral scope and alternative well. It could optionally clarify the relationship to other comment-state tools, but nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters (user, commentId) are fully documented there, including the source of commentId. The description adds no additional parameter meaning beyond what the schema already provides, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource (ignore a reply waiting for approval) and scopes it precisely to Threads posts. It also explicitly distinguishes the tool from the sibling approve_comment, so an agent can identify its function without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states the platform constraint ('Threads only') and points to the alternative tool ('to publish it use approve_comment'). It does not explicitly exclude other comment-management siblings like hold_comment or delete_comment, but the primary usage decision is well covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

like_commentLike or unlike a commentAInspect

Like a comment as the profile's account, or remove that like with liked: false. Works on TikTok and Facebook. TikTok: Requires the 'comments' capability on the profile's TikTok account (see the capabilities array in list_users). It is granted at connection time, so an account connected earlier has to reconnect TikTok before this works.

NameRequiredDescriptionDefault
userYesUpload-Post profile name.
likedNotrue likes the comment (default); false removes the like.
platformYesSocial platform the comment lives on.
commentIdYesComment to act on (from get_post_comments).

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds genuinely non-obvious behavior beyond the annotations: the TikTok 'comments' capability requirement, where to verify it (`capabilities` in list_users), and the operational consequence that older connections must reconnect. This is exactly the auth/prerequisite context annotations don't convey.

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?

Three sentences, each carrying distinct information (action + inverse, platform scope, prerequisite). The primary action is front-loaded and the caveat follows, with no filler.

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?

With an output schema present and full schema coverage, the description needn't explain return values, and the platform/auth constraints are covered. It could note failure behavior for unsupported platforms, but nothing essential for a correct call is missing.

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%, so the baseline is 3, but the description adds meaning: the action is performed 'as the profile's account', clarifying the `user` parameter's semantics, and it reinforces the boolean toggle's dual meaning. No syntax or format gaps remain.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Like a comment as the profile's account') plus the inverse operation via `liked: false`, and scopes it to TikTok and Facebook. It does not differentiate from the ambiguous sibling `comment_action`, which likely overlaps, so an agent can't fully rule out alternatives from the description alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear conditional guidance: use the default to like, pass `liked: false` to remove the like, and platform is limited to TikTok/Facebook. It also states a prerequisite. It stops short of naming an alternative tool for cases where this one doesn't apply.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_autodmsList AutoDMs and comment auto-repliesA
Read-only
Inspect

List the account's AutoDM and comment auto-reply monitors with their platform, state and counters. Active ones only, unless include_inactive is true.

NameRequiredDescriptionDefault
include_inactiveNoAlso list stopped and expired monitors.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this is a read-only, non-destructive, closed-world operation. The description adds useful behavioral context by disclosing the default active-only filtering and the fields returned.

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?

Two short sentences with no wasted text. The resource and default filtering behavior are front-loaded, and the parameter exception is stated immediately after.

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 list tool with annotations and an output schema, the description is complete. It covers what is listed, the default filter, the override parameter, and the key returned fields.

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 is fully documented in the schema, establishing a baseline of 3. The description adds value by stating the inverse default (active ones only) and clarifying exactly when include_inactive changes that behavior.

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: list the account's AutoDM and comment auto-reply monitors. It also names the returned fields (platform, state, counters), making it distinguishable from related tools like get_autodm_logs and manage_autodms.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly defines the default behavior: active monitors only unless include_inactive is true. This gives clear context for when to use the parameter, though it does not explicitly route the agent away from sibling tools such as get_autodm_logs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_dm_conversationsList DM conversationsC
Read-only
Inspect

Recent DM conversations for a profile on a given platform.

NameRequiredDescriptionDefault
userYes
limitNo
platformNo

Output Schema

NameRequiredDescription
resultNo

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true and destructiveHint=false, so the read-only safety is covered. The description adds only a vague 'recent' ordering hint and profile/platform scoping, without clarifying pagination, auth requirements, or filtering behavior.

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 one short sentence with no fluff and important scoping words appear early. It could be rewritten as a complete imperative sentence, but it is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no parameter descriptions and no enums, the absence of platform values and user identifier semantics leaves an agent guessing about valid inputs. The output schema covers return shape, but calling the tool correctly is under-specified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It maps 'profile' to user and 'platform' to platform, but it does not explain accepted platform values, user identifier format, or limit behavior. This is minimal semantic help.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource (DM conversations), the scope (a profile on a platform), and the recency filter. The verb is only present in the title/name ('List'), not the description, so it stops just short of a fully self-contained 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given for when to use this tool versus alternatives such as send_dm or the many get_* tools. The name implies a read operation, but no conditions or exclusions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_scheduledList scheduled postsA
Read-only
Inspect

List all currently scheduled (not-yet-published) posts.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultNo

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The read-only and non-destructive nature is already covered by annotations. The description adds the useful clarification that 'scheduled' means 'not-yet-published', but does not disclose any additional behavior such as ordering, pagination, or default limits.

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?

One short, front-loaded sentence states the action, object, and a clarifying definition. There is no redundant or filler content.

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?

For a parameterless read-only operation, the description captures the essential scope and meaning. It would be slightly stronger if it mentioned the output shape, but the simplicity of the tool makes the absence non-critical.

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 sensitive to the empty input schema, so the description does not need to explain parameters. Its clarity about the resource being listed is sufficient for an agent to know what the call will return.

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 uses a specific verb ('List') with a clear resource ('post') and scope ('all currently scheduled'). The parenthetical '(not-yet-published)' removes ambiguity about what 'scheduled' means and distinguishes this from post status or history tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the intended use implicit: call this when you need the set of posts scheduled but not yet published. However, it does not explicitly say when to prefer this over related tools like get_status or get_history, or mention any exclusion conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_usersList profilesA
Read-only
Inspect

List all Upload-Post profiles in the account, with their connected social accounts. Call this FIRST, before publishing, to get the exact profile name (user) and check that the target platforms are connected; never invent a profile name. When the account has no profile, or the requested platform is not connected or needs reconnecting, the response carries next_step and connect_url: give the user that link, ask them to tell you when they have connected, and wait — do not try to publish meanwhile. The TikTok account object carries a capabilities array (music, location, cover_image, cover_timestamp, draft, photo_privacy, video_privacy, inbox_fallback, profile_analytics) telling which optional TikTok fields that connection accepts.

NameRequiredDescriptionDefault
platformsNoOptional platforms the user wants to publish to (e.g. ['tiktok','instagram']). When given, the response says whether they are connected and, if not, how to connect them.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare this a safe read; the description adds substantive behavior beyond that: the response carries next_step/connect_url on failure states, and the TikTok account object exposes a capabilities array listing which optional fields the connection accepts. It also defines a wait-and-retry workflow the agent must not short-circuit.

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?

Front-loaded with the core action and the 'call FIRST' imperative, then layered with failure handling and platform-specific detail. Dense but every sentence carries operational meaning; the long parenthetical capability enumeration is the only mildly heavy element.

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?

Covers the full pre-publish discovery workflow, what to do on the not-connected path, and the platform-specific capability surface, while an output schema exists to carry return shape. Nothing an agent needs to call 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?

Schema coverage is 100% and the single `platforms` parameter is fully documented in the schema, so the baseline applies. The description references "the target platforms" and the connected/not-connected response behavior, which adds a little context but no syntax or format detail 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?

States a specific verb and resource ("List all Upload-Post profiles") plus scope ("in the account, with their connected social accounts"). It is clearly separable from siblings like create_user, delete_user, and get_account_info.

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 to call this FIRST before publishing, forbids inventing a profile name, and prescribes the exact behavior when a platform is missing or needs reconnecting (surface connect_url, wait for user confirmation, do not publish meanwhile).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_autodmsManage automatic DM monitoringA
Destructive
Inspect

Control AutoDM monitors, which answer every comment on a post (or only those containing trigger_keywords). Instagram answers with a private DM; TikTok, YouTube, Facebook, Threads and Bluesky answer with a public reply under the comment. For action='start', provide profile_username, reply_message and the post (post_url on Instagram; post_id or post_url elsewhere, plus platform). For stop/pause/resume/delete/logs, provide monitor_id. For status, optionally set include_inactive=true. Needs the user's approval: call it first without confirmed to get a preview (nothing is sent), show the user exactly what will go out, and repeat the call with confirmed: true only after they approve.

NameRequiredDescriptionDefault
actionYes
buttonsNoInstagram only, for action='start': up to 3 web_url buttons ({ title, url }) added to each auto-DM.
post_idNoPost to watch on tiktok/youtube/facebook/threads/bluesky (instead of post_url): TikTok video id, YouTube video id, Facebook post id ('{pageId}_{postId}'), Threads post id, Bluesky at:// URI. A TikTok or YouTube URL is also accepted.
platformNoNetwork of the post. Default instagram, which answers with a private DM. tiktok, youtube, facebook, threads and bluesky have no private reply to a comment, so matching comments get a PUBLIC reply under the comment instead.
post_urlNoPost URL to monitor. Required on Instagram when action='start'.
confirmedNoSet to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.
monitor_idNoAutoDM monitor ID. Required for stop, pause, resume, delete, and logs.
reply_messageNoText sent to matching commenters (a DM on Instagram, a public reply elsewhere). Required when action='start'.
reply_messagesNoPublic replies only: up to 5 alternative texts, rotated across comments so TikTok and YouTube do not see the same reply over and over.
include_inactiveNoFor action='status', include stopped and expired monitors when true.
profile_usernameNoUpload-Post profile name. Required when action='start'.
trigger_keywordsNoOptional keyword or keywords; only comments containing these terms are answered (case and accents ignored).
monitoring_intervalNoMinutes between comment checks for action='start'. Minimum is 15. Instagram and TikTok answer within seconds, so there it only paces a backup check.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say destructiveHint=true and openWorldHint=true; the description adds the crucial, non-obvious safety mechanism that nothing is sent without confirmed:true and that an unconfirmed call returns a preview. It also discloses a behavior no annotation could convey — Instagram sends a private DM while TikTok, YouTube, Facebook, Threads and Bluesky send a public reply under the comment, which is a materially different side effect per platform.

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?

Four sentences, each carrying distinct load: what the tool does, platform-specific side effects, per-action parameter requirements, and the approval workflow. The approval rule — the highest-stakes information — is placed last but is short and unambiguous, and no sentence restates the schema or title.

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?

With 13 parameters across seven actions, an output schema already handling return values, and destructive annotations, this description covers everything an agent uniquely needs: the action taxonomy, conditional requirements, platform divergence, and the two-step confirmation gate. No gap remains that would cause a misinvocation.

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 already 92%, so the schema does most of the heavy lifting. The description still adds genuinely new semantics the schema cannot express: conditional, action-dependent required fields (profile_username, reply_message and a post identifier for start; monitor_id for stop/pause/resume/delete/logs) and the platform-specific post identifier rule.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a concrete verb-plus-resource ('Control AutoDM monitors') and immediately explains the mechanism: answering comments with a DM on Instagram or a public reply elsewhere. That distinguishes it semantically from generic comment tools like reply_to_comment. However, it never acknowledges the many overlapping siblings (start_autodm, pause_autodm, stop_autodm, delete_autodm, get_autodm_logs), so an agent cannot tell from the description alone whether this consolidated tool or those single-action tools should be used.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The per-action parameter contract is explicit: which fields action='start' needs per platform, which actions need monitor_id, and that status accepts include_inactive. The confirmation protocol is spelled out as a concrete sequence (preview first, show the user, re-call with confirmed:true). What's missing is routing guidance against the single-purpose autodm siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pause_autodmPause an AutoDMAInspect

Pause an AutoDM monitor: no DMs are sent until resume_autodm.

NameRequiredDescriptionDefault
monitor_idYesAutoDM monitor ID (from list_autodms or start_autodm).

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already establish that this is a non-read-only, non-destructive, closed-world mutation. The description adds meaningful behavior beyond that: DMs are suppressed until resume_autodm. It does not discuss permissions or idempotency, but the annotation coverage lowers that burden.

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?

One tightly structured sentence states the action and its consequence without filler. The effect and recovery path are front-loaded.

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 one-parameter, reversible pause operation with annotations and an output schema, the definition covers the essential behavior. An agent has enough to invoke it correctly and knows sending resumes via resume_autodm.

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 single parameter has 100% schema description coverage and the schema already explains that monitor_id comes from list_autodms or start_autodm. The description adds no extra parameter semantics beyond the schema, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

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: 'Pause an AutoDM monitor.' It also clarifies the operational effect ('no DMs are sent') and names the sibling that restores sending, resume_autodm.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly implies temporary suspension whose inverse is resume_autodm, giving the agent a strong usage signal. It does not explicitly distinguish when to use this rather than stop_autodm or delete_autodm.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pin_commentPin or unpin a TikTok commentA
Destructive
Inspect

Pin a comment to the top of one of the profile's own TikTok videos, or unpin it with pinned: false. TikTok only. TikTok: Requires the 'comments' capability on the profile's TikTok account (see the capabilities array in list_users). It is granted at connection time, so an account connected earlier has to reconnect TikTok before this works.

NameRequiredDescriptionDefault
userYesUpload-Post profile name.
pinnedNotrue pins the comment (default); false unpins it.
postIdYesTikTok video id the comment belongs to.
commentIdYesComment to act on (from get_post_comments).

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and openWorldHint=true, so the mutating nature is covered structurally. The description adds genuinely non-obvious context: the 'comments' capability must be present and is granted at connection time, so older connections must reconnect. It stops short of saying whether re-pinning an already-pinned comment errors or is a no-op.

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?

Action and its inverse are front-loaded in the first sentence, with the platform and capability caveats following. Slightly redundant ('TikTok only. TikTok: Requires...'), but every claim earns its place.

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?

For a 4-parameter mutation tool with an output schema and full schema coverage, the description covers the action, the inverse case, platform restriction, and the auth prerequisite. Only edge-case behavior (already-pinned state, failure modes) is left unspecified, which is minor given the output schema.

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 coverage is 100%, so every parameter is already documented, including pinned's default of true. The description reinforces the pin/unpin polarity and implies postId must belong to the profile's own video, but adds no format or constraint detail beyond the schema — baseline 3.

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 (pin/unpin), the exact resource (a TikTok comment), and the scope constraint (one of the profile's own videos). The 'pinned: false' clause tells an agent immediately that this tool covers both directions, distinguishing it from siblings like hide_comment, like_comment, or delete_comment.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear about when it applies: only TikTok, only comments on the profile's own videos, and it names get_post_comments (via the schema) as the source of commentId. It does not explicitly name a sibling alternative for other platforms, but the 'TikTok only' exclusion handles most mis-selection risk.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

preview_queuePreview queueA
Read-only
Inspect

Preview the upcoming queue slots and what would land in them. Optionally nextSlot=true returns just the next available slot timestamp.

NameRequiredDescriptionDefault
nextSlotNo
profile_usernameNo

Output Schema

NameRequiredDescription
resultNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reinforces the read-only, non-destructive nature implied by annotations by framing the result as a preview of 'what would land'. It also discloses the optional nextSlot output mode, adding useful behavior 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The core purpose is front-loaded, and the optional nextSlot behavior is stated succinctly in the second sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema and annotations cover return shape and safety, and the core preview behavior is stated. However, the unexplained profile_username parameter and lack of routing guidance against sibling read tools leave meaningful gaps, making this only minimally complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for both parameters. It explains nextSlot=true precisely but says nothing about profile_username, leaving a likely filter parameter completely unexplained and forcing the agent to guess its 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?

States a specific action, 'Preview', against a clear resource, 'upcoming queue slots', and explains what it shows: 'what would land in them'. This is distinct from sibling read tools like list_scheduled or get_status without requiring schema inspection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context on when to use the tool: when you want to see upcoming queue slots and their hypothetical contents, optionally narrowed via nextSlot=true. It does not explicitly name alternatives or exclusion conditions, but the usage context is specific enough to guide an agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

public_reply_to_commentPublic reply to commentA
Destructive
Inspect

Post a public reply visible under the original Instagram comment. Needs the user's approval: call it first without confirmed to get a preview (nothing is sent), show the user exactly what will go out, and repeat the call with confirmed: true only after they approve.

NameRequiredDescriptionDefault
userYes
messageYes
platformNoSocial platform. Only 'instagram' is currently supported.instagram
commentIdYes
confirmedNoSet to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.

Output Schema

NameRequiredDescription
resultNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds real behavior beyond the annotations: a call without `confirmed` sends nothing and returns a preview, so the destructive call is gated by a dry run. It also discloses visibility (public reply under the original comment). It doesn't mention rate limits, permission requirements, or whether a posted reply can be edited/removed afterward.

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?

Two sentences, front-loaded with what the tool does, then the approval protocol in call order (preview → show → confirm). No filler and no repetition of schema text beyond the parameter names needed to explain the flow.

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?

An output schema exists so return values needn't be described, and annotations carry the safety profile; the approval workflow is fully specified. The remaining gap is how to source `commentId` and what `user` identifies, which matters for a 5-parameter mutation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 40%, and the description adds meaning only for `confirmed`, which the schema already documents fully. The three required parameters (`user`, `commentId`, `message`) are unexplained — e.g. whether `user` is an account handle or ID, and where `commentId` should come from (get_post_comments).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Post a public reply") plus the scope ("visible under the original Instagram comment"), which implies how it differs from the private/other reply siblings. It stops short of naming the closest sibling (reply_to_comment) or clarifying when that one applies instead.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit procedural guidance for the two-phase approval loop: call first without `confirmed` to get a preview, show the user, then repeat with `confirmed: true`. What's missing is routing guidance against alternatives like reply_to_comment or create_comment, so the agent can't tell from this text which reply flavor to pick.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reply_to_commentPrivate reply (DM) to commenterA
Destructive
Inspect

Send a private DM to the author of an Instagram comment (within Instagram's 7-day reply window). Needs the user's approval: call it first without confirmed to get a preview (nothing is sent), show the user exactly what will go out, and repeat the call with confirmed: true only after they approve.

NameRequiredDescriptionDefault
userYes
buttonsNoUp to 3 web_url buttons rendered in the DM. Each item is { title, url }.
messageYes
platformNoSocial platform. Only 'instagram' is currently supported.instagram
commentIdYes
confirmedNoSet to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds critical behavior beyond the annotations: calling without `confirmed` returns a preview and sends nothing, and `confirmed: true` should be used only after user approval. This directly clarifies the mutation and approval semantics of the tool.

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 two compact sentences with the core action and approval workflow front-loaded. There is no repetitive or unnecessary text.

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?

For a mutation tool with an output schema and annotations, the description covers the essential safety workflow and the 7-day window. It leaves some parameter semantics implicit, but the critical execution flow is complete enough for an agent to call it 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 description coverage is 50%, and the description mainly reinforces the `confirmed` workflow already documented in the schema. It does not explain the `user`, `commentId`, `message`, or `buttons` parameters beyond what is obvious from their names.

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: send a private DM to the author of an Instagram comment. It distinguishes this from public comment replies by explicitly calling it a private DM, and the 7-day window adds useful scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear usage condition: the action must occur within Instagram's 7-day reply window. It also explains the required approval workflow, though it does not explicitly name sibling alternatives such as public_reply_to_comment or send_dm.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reply_to_google_business_reviewReply to a Google Business reviewA
Destructive
Inspect

Create or update the owner reply to a Google Business review. Provide review_name (the full resource path from get_google_business_reviews) or review_id + location_id. Needs the user's approval: call it first without confirmed to get a preview (nothing is sent), show the user exactly what will go out, and repeat the call with confirmed: true only after they approve.

NameRequiredDescriptionDefault
userYesUpload-Post profile name that owns the connected Google Business account.
commentYesThe reply text posted publicly under the review.
confirmedNoSet to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.
review_idNoReview ID; requires location_id to build the resource path.
location_idNoLocation for the review when using review_id.
review_nameNoFull review resource path 'accounts/.../locations/.../reviews/{id}' (from get_google_business_reviews).

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true, but the description adds the crucial behavioral detail that the first call sends nothing and only the confirmed call mutates state — that is the single most important thing an agent needs to know here. It does not mention that an existing reply is overwritten or that the text becomes publicly visible beyond the schema's note, so it falls just short of a 5.

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?

Three sentences, front-loaded with purpose, then identifiers, then the approval protocol. Every clause carries actionable information and nothing is repeated from the schema or annotations.

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?

For a six-parameter mutating tool with an output schema and complete parameter documentation, the description covers purpose, input sourcing, and the safety workflow. The only gap is what happens to a pre-existing reply on update, which matters for a destructiveHint tool.

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 already 100%, so full marks are not automatic, but the description adds genuine combination semantics: review_name is a complete resource path, OR review_id must be paired with location_id. That either/or logic is more useful than the schema's field-by-field notes and directly prevents malformed calls.

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 pair (create or update) and a precise resource (the owner reply to a Google Business review), and names the sibling get_google_business_reviews as the source of the review identifier. An agent can immediately distinguish this from generic comment tools such as reply_to_comment.

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 operational instructions: call first without `confirmed` to produce a preview, show the user exactly what will be sent, then repeat with `confirmed: true`. It also states two accepted ways to identify the review, so the agent knows which upstream call feeds which parameter.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resume_autodmResume an AutoDMAInspect

Resume a paused AutoDM monitor, so it sends DMs to new matching comments again.

NameRequiredDescriptionDefault
monitor_idYesAutoDM monitor ID (from list_autodms or start_autodm).

Output Schema

NameRequiredDescription
resultNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false, destructiveHint=false, openWorldHint=true; the description adds the crucial outward-facing consequence that the monitor will begin sending DMs to new matching comments again. It doesn't cover what happens if the monitor isn't paused or whether prior state is restored, so it is not fully fleshed out.

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?

One sentence, front-loaded with the action and immediately followed by the observable effect. Nothing is redundant or padded.

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?

With an output schema present and annotations covering the safety profile, the description supplies the missing piece – what resuming actually causes. Minor gaps remain around error behavior for a non-paused monitor, but nothing an agent needs to call it is absent.

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?

Only one parameter, and schema coverage is 100% – the schema already documents monitor_id and even points to list_autodms/start_autodm as sources. The description adds no syntax, format, or source guidance beyond that, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (resume) and resource (a paused AutoDM monitor) plus the resulting effect. It distinguishes itself from pause_autodm/stop_autodm implicitly by naming the 'paused' precondition, though it never names start_autodm as the contrasting sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The precondition ('a paused AutoDM monitor') tells the agent when this tool applies, which is enough to route away from start_autodm for an already-configured monitor. No explicit exclusion or alternative is named, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

retry_postRetry a failed uploadBInspect

Retry a failed upload. Identify it by either requestId (async upload) or jobId (scheduled/queued upload).

NameRequiredDescriptionDefault
jobIdNoScheduled/queued job_id to retry.
requestIdNoAsync upload request_id to retry.

Output Schema

NameRequiredDescription
resultNo

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false, so the description need not repeat that. However, it adds no additional behavioral context: it does not explain what happens on retry (e.g., whether a new job is created, if the original is replaced), whether authentication is required, or any side effects. The openWorldHint=true annotation suggests external effects, but the description is silent on that. For a mutation tool, this is a significant gap.

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?

Two sentences, both purposeful. The purpose is front-loaded and the identifier guidance is immediately actionable. No wasted words or redundancy with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema is present, so return values are covered. The description covers the core purpose and parameter selection, but it omits the requirement that one of the two identifiers must be provided (both are optional in the schema). It also doesn't state what constitutes a 'failed upload' or any error conditions. For a tool with two optional parameters and no required fields, this ambiguity is a notable gap.

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 description coverage is 100% for both parameters. The description adds meaning by mapping requestId to async uploads and jobId to scheduled/queued uploads, which is not in the schema descriptions. This helps the agent select the correct parameter. It could further clarify that exactly one is required, but the mapping itself is valuable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: retrying a failed upload. It specifies the two identifier types (requestId for async, jobId for scheduled/queued) and the resource (failed upload). It does not explicitly name sibling tools or differentiate itself, but the purpose is unambiguous and actionable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides guidance on which identifier to use based on upload type (requestId for async, jobId for scheduled/queued). However, it does not specify when to use this tool versus alternatives (e.g., cancel_scheduled, get_job_status, or upload tools), nor does it mention prerequisites like the upload being in a failed state. The guidance is clear on how to select parameters but not on broader usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_dmSend a direct messageA
Destructive
Inspect

Send an Instagram DM to a recipient from a connected Upload-Post profile. Use a recipient_id returned by Instagram comments or DM conversation tools. Needs the user's approval: call it first without confirmed to get a preview (nothing is sent), show the user exactly what will go out, and repeat the call with confirmed: true only after they approve.

NameRequiredDescriptionDefault
userYesUpload-Post profile name that owns the connected Instagram account.
buttonsNoUp to 3 web_url buttons rendered in the DM. Each item is { title, url }.
messageYesDM body to send.
platformYesDM platform. Currently only Instagram DMs are supported.
confirmedNoSet to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.
recipient_idYesInstagram recipient/commenter ID. Required by the Upload-Post API.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true and openWorldHint=true, but the description adds behavior they cannot convey: the first call sends nothing and returns a preview, and confirmation must be obtained from the user before the second call. This is exactly the kind of context that prevents an agent from firing an irreversible message.

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?

Three sentences, front-loaded with purpose, then sourcing guidance, then the approval protocol. No sentence restates the title or wastes tokens.

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 destructive, open-world send tool with an output schema already documenting return values, the description covers the purpose, required inputs' provenance, and the safety workflow. Nothing an agent needs to invoke it safely is missing.

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%, so the baseline is 3; the description goes beyond it by explaining the provenance of `recipient_id` and the two-phase meaning of `confirmed`, which the schema states more tersely. It adds nothing for `buttons` or `message`, though the schema already covers those adequately.

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 ("Send an Instagram DM") plus the scoping constraint that it comes from a connected Upload-Post profile. This clearly separates it from sibling tools like list_dm_conversations and reply_to_comment without needing the schema opened.

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 where the recipient_id comes from (Instagram comments or DM conversation tools) and prescribes the exact two-step protocol: call without `confirmed` for a preview, show the user, then repeat with `confirmed: true`. That is when-to-use and how-to-sequence guidance, not inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_post_commentsTurn comments on or off for an Instagram postA
Destructive
Inspect

Turn commenting off on one of the profile's own Instagram posts, or back on with enabled: true. Existing comments are kept either way. Instagram only.

NameRequiredDescriptionDefault
userYesUpload-Post profile name.
postIdYesInstagram media id of the post.
enabledYesfalse turns comments off; true turns them back on.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as non-read-only, open-world, and potentially destructive. The description adds useful behavioral context: existing comments are preserved either way, the post must belong to the profile, and the operation is Instagram-only.

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 front-loaded, compact, and waste-free. It states the action, the re-enable behavior, the preservation of existing comments, and the platform restriction in three short sentences.

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 tool has an output schema and full parameter documentation, so return values need not be explained in the description. The description covers platform scope, ownership, and side effects well; only edge cases such as permission failures are left implicit.

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 description coverage is 100%, with all three parameters documented in the schema. The description reinforces the meaning of `enabled`, but does not add substantial semantics beyond what the schema already provides.

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: turning commenting off or back on for an Instagram post. It also scopes the action to the profile's own posts and limits it to Instagram, which separates it from comment-level siblings like hide_comment or delete_comment.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly covers the two usage modes: off by default and back on with `enabled: true`. It also gives an important exclusion, "Instagram only," and restricts the action to the profile's own posts, though it does not explicitly compare against alternative comment-management tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_autodmStart an AutoDM or comment auto-replyAInspect

Watch one of the profile's posts and automatically answer everyone who comments on it (optionally only comments containing trigger_keywords, e.g. 'comment POST'). On Instagram (default) the answer is a private DM with reply_message and up to 3 link buttons. On tiktok, youtube, facebook, threads and bluesky it is a PUBLIC reply under each matching comment; links in TikTok replies are not clickable, so point people to the bio. Instagram and TikTok answer new comments within seconds; youtube, facebook, threads and bluesky check for them every monitoring_interval minutes (15 minimum). At most 25 replies per interval (10 on YouTube), and the monitor stops after 15 days. Returns the monitor ID used by the other AutoDM tools. Needs the user's approval: call it first without confirmed to get a preview (nothing is sent), show the user exactly what will go out, and repeat the call with confirmed: true only after they approve.

NameRequiredDescriptionDefault
buttonsNoInstagram only: up to 3 web_url buttons ({ title, url }) added to each DM.
post_idNoPost to watch on tiktok/youtube/facebook/threads/bluesky (instead of post_url): TikTok video id, YouTube video id, Facebook post id ('{pageId}_{postId}'), Threads post id, Bluesky at:// URI. A TikTok or YouTube URL is also accepted.
platformNoNetwork of the post. Default instagram, which answers with a private DM. tiktok, youtube, facebook, threads and bluesky have no private reply to a comment, so matching comments get a PUBLIC reply under the comment instead.
post_urlNoPost URL to watch. Required on Instagram; on the other networks post_id is preferred.
confirmedNoSet to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.
reply_messageYesText sent to matching commenters: a DM on Instagram, a public reply elsewhere.
reply_messagesNoPublic replies only: up to 5 alternative texts, rotated across comments so TikTok and YouTube do not see the same reply over and over.
profile_usernameYesUpload-Post profile name that owns the connected account.
trigger_keywordsNoKeyword or keywords; when set, only comments containing them are answered (case and accents ignored).
monitoring_intervalNoMinutes between comment checks. Minimum is 15. Instagram and TikTok answer within seconds, so there it only paces a backup check.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly=false, destructive=false, openWorld=true), it discloses concrete operational traits: per-interval reply caps (25, or 10 on YouTube), a 15-day monitor lifetime, near-real-time vs. polling cadence, non-clickable TikTok links, and that the call returns a monitor ID. It also makes clear nothing is sent until confirmed, which is exactly the side-effect transparency an agent needs.

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?

It is dense but front-loaded: what it does first, then platform behavior, then limits, then the confirmation protocol. Every sentence carries actionable information and none restates the name or title.

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?

With an output schema and annotations already present, the description still covers the gaps an agent would otherwise guess at: rate limits, monitor expiry, per-platform delivery differences, and the safe confirmation flow. Nothing material for correct invocation is missing.

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%, so the schema carries the baseline; the description adds cross-parameter meaning such as platform selecting DM vs. public reply, `buttons` being Instagram-only, and `monitoring_interval` merely pacing a backup check on Instagram/TikTok. It gives a trigger_keywords example ('comment POST') that clarifies intent beyond the schema wording.

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 opens with a precise verb+resource: it watches a post and auto-answers commenters, with per-platform reply semantics spelled out. It is clearly distinct from siblings like pause_autodm/resume_autodm/list_autodms, which operate on an existing monitor rather than creating one.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the required two-step approval workflow (call without `confirmed` for a preview, then repeat with `confirmed: true`) and explains platform-driven behavior that affects the choice. It does not explicitly point at sibling tools such as manage_autodms for later edits, so it stops short of full alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stop_autodmStop an AutoDMA
Destructive
Inspect

Stop an AutoDM monitor: it stops sending DMs and shows as stopped in list_autodms (with include_inactive). For a temporary break use pause_autodm; to remove it entirely use delete_autodm.

NameRequiredDescriptionDefault
monitor_idYesAutoDM monitor ID (from list_autodms or start_autodm).

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false; the description adds real value by describing the resulting state and how to observe it. However, it is silent on whether a stopped monitor can be resumed (resume_autodm is a sibling) and whether in-flight DMs are cut off, which matters for a tool flagged destructive. The gap between 'stop' framed as non-removal and destructiveHint=true is not resolved.

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?

Two sentences, front-loaded with the effect and followed by the disambiguation. Every clause carries information an agent needs to choose correctly.

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?

An output schema exists, so return values need no explanation, and the one parameter is fully documented. The remaining omission is resumability and in-flight-send behavior, which would matter given the destructive annotation.

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 coverage is 100% with a single required monitor_id that already documents its origin (list_autodms or start_autodm). The description adds nothing parameter-specific, so the 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 and resource ('Stop an AutoDM monitor') and immediately names the observable effect: it stops sending DMs and shows as stopped in list_autodms. This cleanly separates it from the nearby siblings start_autodm, pause_autodm and delete_autodm.

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 routes the agent: use pause_autodm for a temporary break, delete_autodm to remove entirely, and this tool otherwise. It even names the verification path (list_autodms with include_inactive), which no other sentence would have supplied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_ffmpeg_jobSubmit FFmpeg processing jobAInspect

Process media with FFmpeg on Upload-Post's encoding servers (trim, transcode, resize, watermark, concatenate, extract a thumbnail…). Inputs are public HTTP(S) URLs: input_url for one file, or files for several. They are downloaded into a working directory of their own for this job. full_command is one ffmpeg invocation using the placeholders {input} (or {input0}, {input1}… with several files) and {output}, e.g. ffmpeg -i {input} -ss 5 -t 10 -c copy {output}. It runs without a shell and must start with ffmpeg. Every -i must be an {input}/{inputN} placeholder or a generated -f lavfi source, and {output} is the only output. Rejected with a 400 that names the problem: shell metacharacters (; | & $ ), protocols or URLs anywhere in the command (file:, concat:, subfile,…), the movie=, amovie=andsendcmdfilters, absolute paths other than fonts under /usr/share/fonts,.., and -safe 0. A command that would never end (-stream_loop -1, -loop 1, or a lavfi source without a duration) needs -t, -shortestor-frames; -stream_loopaccepts -1 to 100. Usage is charged at the longer of the input and output durations, so looped or generated outputs count at their full length. The output is not posted anywhere; fetch it with download_ffmpeg_result. Returns ajob_idyou can poll withget_ffmpeg_job`.

NameRequiredDescriptionDefault
filesNoPublic URLs of multiple input media files, when the job needs more than one source.
input_urlNoPublic URL of the input media. Use this for a single source file.
full_commandNoOptional ffmpeg command with `{input}` / `{input0}`… and `{output}` placeholders. Must start with `ffmpeg`; each `-i` is a placeholder or `-f lavfi`. Protocols or URLs inside the command, `movie=`/`sendcmd`, absolute paths (except /usr/share/fonts), `..`, `-safe 0` and shell metacharacters are rejected. Endless inputs need `-t` or `-shortest`; `-stream_loop` is capped at 100.
output_filenameNoOptional preferred output filename, e.g. clip.mp4 or thumbnail.jpg.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations only covering readOnly=false/destructive=false/openWorld=true, the description supplies the real behavioral burden: the exact validation rules that trigger a 400 (shell metacharacters, protocols, movie=/sendcmd, absolute paths, .., -safe 0), the no-shell execution model, and the infinite-loop requirement (-t/-shortest/-frames, -stream_loop cap of 100). It even discloses the billing model ('charged at the longer of input and output durations'), which is non-obvious and affects command design.

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?

Front-loaded with purpose, then inputs, then command rules, then billing and follow-up calls — a sensible order with little redundancy. It is a single very dense paragraph and slightly long, but nearly every clause carries load-bearing constraint information.

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 job-submission tool with an output schema, this covers everything an agent needs: input sourcing, command grammar, rejection conditions, loop-avoidance, cost model, and the job_id polling path. No material gap remains for a correct first invocation.

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 already 100%, so the baseline is 3, but the description adds meaning the schema cannot: a concrete worked example of `full_command` with `{input}`/`{output}` placeholders, the rule that every `-i` must be a placeholder or a `-f lavfi` source, and that `{output}` is the only output. That materially improves correct parameter construction.

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?

Names a specific verb and resource ('Process media with FFmpeg on Upload-Post's encoding servers') and immediately enumerates the operations it covers (trim, transcode, resize, watermark, concatenate, thumbnail). It is clearly distinguishable from the polling/result siblings get_ffmpeg_job and download_ffmpeg_result.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete input context (public HTTP(S) URLs, `input_url` for one file vs `files` for several) and routes the agent forward to download_ffmpeg_result and get_ffmpeg_job. It stops short of stating when to prefer this tool over, say, upload_video or a plain media upload, so the alternatives discussion is incomplete for a 50+ sibling toolset.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tiktok_publishing_settingsGet TikTok publishing settingsA
Read-only
Inspect

What the connected TikTok account is allowed to publish. Call this before setting tiktokPrivacyLevel: TikTok narrows the four privacy values per account (a private account has no PUBLIC_TO_EVERYONE), and sending one the account does not have fails the upload with error_code tiktok_privacy_unavailable. Returns privacy_level_options plus the account's max video duration and its comment/duet/stitch switches.

NameRequiredDescriptionDefault
profileYesUpload-Post profile name with a TikTok account connected.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description adds valuable behavioral context: TikTok narrows privacy values per account, invalid values are not merely rejected but fail with a specific error_code, and the tool returns account-specific fields. This gives the agent a clear model of what to expect and why the call matters.

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 two sentences with no filler. It front-loads the core meaning, then packs the prerequisite, failure mode, and returned content into a compact, information-dense structure.

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 single-parameter read-only tool with a full input schema and an output schema, the description is complete. It covers when to call it, why it matters, what it returns, and how it behaves under invalid input. Nothing needed for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: the single `profile` parameter is already documented as an Upload-Post profile name with a TikTok account connected. The description adds no additional parameter-level semantics, so the baseline of 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?

The description clearly identifies the resource (the connected TikTok account's publishing settings) and the tool's function: returning what the account is allowed to publish, including privacy_level_options and other settings. It is specific and easily distinguishable from sibling tools like upload_video or tiktok_music_search.

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 explicitly instructs calling this tool before setting `tiktokPrivacyLevel`, and explains the failure mode if an unsupported privacy value is used. This is a strong, actionable usage prerequisite with the rationale attached, leaving no ambiguity about when it should be invoked.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

unpublish_postDelete a published postA
Destructive
Inspect

Delete a post already published to a platform. Supported: facebook, youtube, x, linkedin, pinterest, bluesky, google_business. Instagram, TikTok, Threads and Reddit posts cannot be deleted through the API; they have to be removed in the platform's own app. Needs the user's approval: call it first without confirmed to get a preview (nothing is sent), show the user exactly what will go out, and repeat the call with confirmed: true only after they approve.

NameRequiredDescriptionDefault
userYesUpload-Post profile name.
postIdYesPlatform post ID to delete (Bluesky: the post AT-URI; Google Business: the full accounts/.../locations/.../localPosts/... name returned on upload).
platformYesSocial platform the post lives on.
confirmedNoSet to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and openWorldHint=true, and the description adds genuinely new behavioral context: a two-phase preview call that sends nothing, the requirement for explicit user approval, and API-level deletion limits per platform. That is well beyond what the annotations convey and does not contradict them.

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?

Front-loaded purpose sentence, then platform support, then limitations, then the approval protocol — every sentence carries operational weight. The approval flow is restated somewhat redundantly with the `confirmed` schema description, keeping it just below top marks.

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 destructive, open-world mutation with an output schema present, the description supplies the safety protocol, the platform scope, and the exclusion set. Nothing an agent needs in order to call it correctly — including the sequencing of the two calls — 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?

Schema coverage is 100% and the enum plus postId format notes (AT-URI, Google Business resource name) are all in the schema, so baseline 3 applies. The description reinforces the `confirmed` gate but adds no new syntax or meaning beyond what the schema already documents.

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?

Specific verb (delete) plus resource (an already-published post) and an explicit supported-platform list, which lets an agent distinguish it from upload_* and comment/management siblings without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States exactly when it can be used (seven named platforms) and when it cannot (Instagram, TikTok, Threads, Reddit must be removed in the platform's own app), plus the mandatory preview-then-confirm sequence. No alternatives are left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_queue_settingsUpdate queue settingsA
Destructive
Inspect

Update posting queue configuration for a profile. Fields are flat, not nested: timezone, slots, days_of_week, and max_posts_per_slot.

NameRequiredDescriptionDefault
slotsNoPosting slots sorted by local time, e.g. [{hour: 10, minute: 0}, {hour: 16, minute: 0}].
timezoneNoIANA timezone, e.g. Europe/Madrid or America/New_York.
days_of_weekNoAllowed posting days where 0=Monday and 6=Sunday.
profile_usernameYesUpload-Post profile name to update.
max_posts_per_slotNoMaximum posts allowed in the same queue slot.

Output Schema

NameRequiredDescription
resultNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide destructiveHint=true and readOnlyHint=false, so the mutation risk is known. The description adds a useful behavioral note about fields being flat rather than nested, but it does not disclose whether this is a full replacement or partial update, or what happens to existing queue configuration.

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?

Two short sentences, with the action and target front-loaded and no filler. The flat-format hint is valuable and earns its place.

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?

Given the full schema coverage, output schema, and annotations, the description is largely sufficient. It could mention replacement semantics or how to fetch current settings, but the combination of schema and output schema covers most operational needs.

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%, so baseline is 3. The description adds meaningful guidance beyond the schema by explicitly telling the agent that fields are flat, not nested, and listing the exact fields (timezone, slots, days_of_week, max_posts_per_slot), which helps prevent the common mistake of trying a nested settings object.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Update') and the resource ('posting queue configuration for a profile'), and names the affected fields. It does not explicitly name sibling alternatives like get_queue_settings or preview_queue, but the verb distinguishes it from read-only siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used to modify queue settings, and the context of the sibling list makes that clear. However, it does not explicitly state when to use this tool instead of get_queue_settings or preview_queue, nor does it mention any exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_documentUpload document (LinkedIn)AInspect

Publish a document (PDF / PPT / PPTX / DOC / DOCX) to LinkedIn. Title is required. Needs the user's approval: call it first without confirmed to get a preview (nothing is sent), show the user exactly what will go out, and repeat the call with confirmed: true only after they approve.

NameRequiredDescriptionDefault
userYes
titleYes
timezoneNoIANA timezone for scheduled date, e.g. 'Europe/Madrid'.
confirmedNoSet to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.
addToQueueNoInsert into the user's posting queue instead of publishing now.
asyncUploadNoReturn immediately with request_id (default true).
descriptionNo
scheduledDateNoISO 8601 date for scheduled publishing, e.g. '2026-12-25T10:00:00Z'. Omit for immediate post.
maxPostsPerSlotNo
documentPathOrUrlYes
linkedinVisibilityNo
targetLinkedinPageIdNo

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnly=false, destructive=false, openWorld=true; the description adds the crucial non-obvious behavior that an unconfirmed call sends nothing and returns a preview. It still does not disclose what the preview contains, how async `request_id` retrieval works, or what happens if approval is skipped.

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?

Three sentences, zero filler, and the destination/formats are front-loaded ahead of the approval workflow. Each sentence carries distinct information: what, requirement, and safety protocol.

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?

For a 12-parameter external-publishing mutation with an output schema present, the description covers what matters most: destination, required fields, and the two-phase confirmation safety model. Scheduling/queueing and visibility targeting are left entirely to schema descriptions, which is a real but modest gap.

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 coverage is only 42%, so the description must compensate; it clarifies `title` as required and fully explains the `confirmed` gate. But six parameters — `user`, `documentPathOrUrl`, `addToQueue`, `maxPostsPerSlot`, `linkedinVisibility`, `targetLinkedinPageId` — get no semantic help beyond the schema, leaving the gap partly unclosed.

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 ('Publish a document') plus the exact resource and the accepted file formats (PDF/PPT/PPTX/DOC/DOCX) on LinkedIn. The resource-plus-format framing naturally separates it from upload_text, upload_photos, and upload_video siblings without needing to name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an unusually precise when-to-call protocol: first call without `confirmed` to get a preview, then repeat with `confirmed: true` only after user approval. It does not address when to choose immediate publish vs `scheduledDate` vs `addToQueue`, so the alternatives space is only partially covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_photosUpload photos / carouselAInspect

Publish one or more photos (single image or carousel; items are published in array order). Each item in photosPathsOrUrls must be a public/signed HTTPS URL (a staged media_url from complete_media_upload works), or an absolute local path only when the MCP server runs on the same machine as the file. One call can carry a different caption per platform: title is the default and platformOptions.facebookTitle, platformOptions.instagramTitle, platformOptions.linkedinTitle, platformOptions.xTitle, … override it for that platform. A hosted MCP server cannot read files on the user's machine or chat attachments (/mnt/data, sandbox paths). To publish a local file: (1) if this client can run HTTP requests itself (for example a coding agent with a shell), stage it with create_media_upload (returns upload_id + upload_url), PUT the raw file bytes to upload_url with the same Content-Type, call complete_media_upload and pass the returned media_url as the media URL; (2) otherwise ask the user for a public HTTPS URL of the file, or tell them to publish it from the dashboard at https://app.upload-post.com. Staged media is deleted after 24 hours. Needs the user's approval: call it first without confirmed to get a preview (nothing is sent), show the user exactly what will go out, and repeat the call with confirmed: true only after they approve.

NameRequiredDescriptionDefault
userYes
titleNo
altTextNo
timezoneNoIANA timezone for scheduled date, e.g. 'Europe/Madrid'.
confirmedNoSet to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.
platformsYesRequired array of platform identifiers.
addToQueueNoInsert into the user's posting queue instead of publishing now.
asyncUploadNoReturn immediately with request_id (default true).
descriptionNoDescription for the platforms that take one, unless a per-platform override is set. TikTok ignores it: set `platformOptions.tiktokDescription` for the TikTok description; the TikTok title comes from `platformOptions.tiktokTitle`, or `title`.
firstCommentNoComment auto-posted under the post right after publishing. Supported on every platform that has comments, TikTok included. Use `platformOptions.<platform>FirstComment` to override it for one platform. X: links can be removed from X posts and first comments, depending on the account, so a 'link in the first comment' may go out without the URL; check `warnings` in get_status after publishing.
scheduledDateNoISO 8601 date for scheduled publishing, e.g. '2026-12-25T10:00:00Z'. Omit for immediate post.
maxPostsPerSlotNo
platformOptionsNoFlat platform-specific override object with camelCase keys. Per-platform text overrides (instagramTitle, xFirstComment, …) are also accepted. Keys the upload-post SDK does not support are silently ignored upstream.
photosPathsOrUrlsYesPhoto URLs (or same-machine local paths), in carousel order. Never `/mnt/data` or sandbox attachment paths.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past the annotations (readOnly=false, destructive=false, openWorld=true) by disclosing the two-phase preview/confirm gate ('nothing is sent' without `confirmed`), the 24-hour TTL on staged media, the local-file access limitation for hosted servers, and the per-platform caption override mechanics. These are real behavioral traits an agent would otherwise have to discover by failing.

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?

Front-loaded with the core capability and media-source rule before the staging workflow, and every paragraph carries actionable information. The staging walkthrough is the longest block; it is justified but could be tightened into a pointer to create_media_upload/complete_media_upload.

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?

Covers the hard parts — media sourcing, ordering, approval gating, 24h cleanup — and an output schema exists so return values needn't be described. It omits any mention of scheduling, queue insertion, or async behavior even though the schema exposes `scheduledDate`, `addToQueue`, and `asyncUpload`, which is the main remaining gap.

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 a moderate 71%, and the description adds genuine meaning beyond it: that `photosPathsOrUrls` is ordered for carousels and rejects sandbox paths, that `title` is a default with `platformOptions.<platform>Title` overrides, and how `confirmed` interacts with the preview. It doesn't touch the many platform-specific options (scheduling, queueing, TikTok music/location), leaving those to 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?

States a specific verb and resource ('Publish one or more photos') plus scope ('single image or carousel; items are published in array order'). The resource name alone separates it from the sibling upload_video / upload_text / upload_document tools, so an agent can route correctly without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when the tool works (public/signed HTTPS URLs, or same-machine absolute paths) and when it cannot (hosted server cannot read the user's disk, `/mnt/data`, sandbox attachments), then prescribes the exact alternatives: stage via create_media_upload → complete_media_upload, or ask the user for a public URL, or send them to the dashboard. It also spells out the approval protocol — call without `confirmed` first, show the preview, then repeat with `confirmed: true`.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_textUpload text postAInspect

Publish a text-only post. linkUrl (or platform-specific *LinkUrl) attaches a link preview where supported. Needs the user's approval: call it first without confirmed to get a preview (nothing is sent), show the user exactly what will go out, and repeat the call with confirmed: true only after they approve.

NameRequiredDescriptionDefault
userYes
titleYesPost text / caption.
linkUrlNoGeneric link preview URL (LinkedIn, Bluesky, Facebook).
timezoneNoIANA timezone for scheduled date, e.g. 'Europe/Madrid'.
confirmedNoSet to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.
platformsYesRequired array of platform identifiers.
addToQueueNoInsert into the user's posting queue instead of publishing now.
asyncUploadNoReturn immediately with request_id (default true).
scheduledDateNoISO 8601 date for scheduled publishing, e.g. '2026-12-25T10:00:00Z'. Omit for immediate post.
maxPostsPerSlotNo
platformOptionsNoFlat platform-specific override object with camelCase keys. Per-platform text overrides (xTitle, linkedinTitle, …) are also accepted. Keys the upload-post SDK does not support are silently ignored upstream.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare it is a non-read-only, non-destructive, open-world write. Beyond that, the description discloses the critical behavioral trait that the first call sends nothing and returns a preview — this is exactly the kind of context annotations cannot convey. It does not cover deferred/scheduled execution behavior, but the safety-critical mutation semantics are well handled.

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?

Three sentences, front-loaded with the core action, then the link-preview note, then the approval workflow. No filler. Slightly compressed phrasing ('platform-specific *LinkUrl') is the only minor friction.

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?

With an output schema present and 82% schema coverage across 11 params plus a large nested platformOptions object, the description needn't re-document fields. It supplies the operationally essential approval loop, leaving only minor gaps around scheduling/queue interaction.

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 description coverage is 82%, so the schema already documents nearly every parameter, including `confirmed` and the platform-specific overrides. The description only restates the `linkUrl`/*LinkUrl behavior and the confirmation meaning, adding little beyond what is already structured — the 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+resource ('Publish a text-only post') immediately, which cleanly separates it from siblings like upload_video, upload_photos, and upload_document. An agent can identify the correct tool without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit operating instructions: call first without `confirmed` to get a preview, show the user exactly what will go out, then repeat with `confirmed: true`. That is a concrete when/how recipe. It stops short of naming alternatives (e.g., upload_photos for media posts) or exclusions, so it isn't a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_videoUpload videoAInspect

Publish a video to one or more platforms. Use videoPathOrUrl only for public/signed HTTPS URLs, or for absolute local paths when the MCP server runs on the same machine as the file. videoBase64 is only for clients that can provide raw bytes directly and is capped by UPLOAD_POST_MAX_INLINE_MB (default 100). Returns a request_id you can poll with get_status. Supports per-platform overrides (tiktokPrivacyLevel, youtubePrivacyStatus, youtubePlaylistId, youtubeThumbnailUrl, youtubeTags, facebookPageId, instagramMediaType, etc.). A hosted MCP server cannot read files on the user's machine or chat attachments (/mnt/data, sandbox paths). To publish a local file: (1) if this client can run HTTP requests itself (for example a coding agent with a shell), stage it with create_media_upload (returns upload_id + upload_url), PUT the raw file bytes to upload_url with the same Content-Type, call complete_media_upload and pass the returned media_url as the media URL; (2) otherwise ask the user for a public HTTPS URL of the file, or tell them to publish it from the dashboard at https://app.upload-post.com. Staged media is deleted after 24 hours. Needs the user's approval: call it first without confirmed to get a preview (nothing is sent), show the user exactly what will go out, and repeat the call with confirmed: true only after they approve.

NameRequiredDescriptionDefault
userYesProfile name (Upload-Post user).
titleNoCaption / title.
timezoneNoIANA timezone for scheduled date, e.g. 'Europe/Madrid'.
confirmedNoSet to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.
platformsYesRequired array of platform identifiers, e.g. ['instagram']. Never pass a single string.
addToQueueNoInsert into the user's posting queue instead of publishing now.
asyncUploadNoReturn immediately with request_id (default true).
descriptionNoDescription for the platforms that take one, unless a per-platform override is set. TikTok ignores it: set `platformOptions.tiktokDescription` for the TikTok description; the TikTok title comes from `platformOptions.tiktokTitle`, or `title`.
videoBase64NoVideo bytes as base64 (or a data: URI). Provide this OR videoPathOrUrl. The server writes it to a temp file, uploads, then deletes it. Capped by UPLOAD_POST_MAX_INLINE_MB (default 100); over HTTP the whole request is also capped by UPLOAD_POST_MCP_MAX_BODY_MB (default 10), so use videoPathOrUrl for anything larger.
firstCommentNoComment auto-posted under the post right after publishing. Supported on every platform that has comments, TikTok included. Use `platformOptions.<platform>FirstComment` to override it for one platform. X: links can be removed from X posts and first comments, depending on the account, so a 'link in the first comment' may go out without the URL; check `warnings` in get_status after publishing.
scheduledDateNoISO 8601 date for scheduled publishing, e.g. '2026-12-25T10:00:00Z'. Omit for immediate post.
videoFilenameNoOptional filename (e.g. 'clip.mp4') used only to pick the temp file extension when videoBase64 is given. Defaults to .mp4.
videoPathOrUrlNoPublic/signed HTTPS URL of the video (a staged `media_url` from complete_media_upload also works). Absolute local paths are supported only for local/self-hosted MCP clients sharing the same filesystem. Never pass `/mnt/data`, sandbox, or other mounted attachment paths: the server cannot read them.
maxPostsPerSlotNo
platformOptionsNoPlatform-specific overrides as a flat object (camelCase keys), e.g. { tiktokPrivacyLevel: 'PUBLIC_TO_EVERYONE', youtubePrivacyStatus: 'public', youtubePlaylistId: 'PLxxxxxxxxxxxx', facebookPageId: '123' }. `youtubePlaylistId` may also be an array or a comma-separated list of playlist IDs to add the uploaded video to. The `tiktokMusic*`, `tiktokLocation*`, and `tiktokCoverImageUrl` keys depend on the TikTok connection's `capabilities` (see list_users); discover valid values with tiktok_music_trending and tiktok_location_search. tiktokPostMode=MEDIA_UPLOAD and tiktokUploadToDraft=true are the same draft/inbox flag for every TikTok account.

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare non-read-only and open-world, and the description goes substantially beyond them: nothing is published without confirmed, the first call is a dry-run preview, staged media is deleted after 24 hours, hosted servers cannot read /mnt/data or sandbox paths, and per-field capability warnings appear in the response. These are the operational traps an agent would otherwise hit.

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?

Purpose and source-mode limits lead, then the approval protocol, so it is well front-loaded. It is on the long side and the staged-upload walkthrough could be tightened, but every sentence carries operational information rather than repetition.

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 15-parameter publishing tool with nested platformOptions and an open-world annotation, the description covers the source-of-bytes decision, the approval gate, the async request_id handoff, and the capability caveats. Because an output schema exists, it does not need to enumerate return fields, and it still mentions request_id only as a pointer to get_status.

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 93%, so 3 is the baseline, but the description adds real constraints the schema alone does not emphasize: local paths only work on a colocated server, base64 is bounded by both UPLOAD_POST_MAX_INLINE_MB and the HTTP body cap, and per-platform overrides take precedence over the shared title/description. It does not attempt to explain the long platformOptions key space, which is correctly left to 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?

Opens with a specific verb+resource statement ('Publish a video to one or more platforms') and immediately signals multi-platform scope. An agent can tell this apart from upload_photos, upload_text, and upload_document without opening any schema.

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 routes between the two source modes (videoPathOrUrl for public/signed HTTPS or colocated absolute paths; videoBase64 only for raw-byte clients with the size cap) and gives a numbered fallback procedure (create_media_upload -> PUT -> complete_media_upload, or ask the user, or dashboard). It also states exactly when to send confirmed:true versus the preview call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_jwtValidate platform-integration JWTA
Read-only
Inspect

Verify a JWT previously issued by generate_jwt. The returned profile object echoes the connection page settings, including language and any ui_labels.

NameRequiredDescriptionDefault
jwtYes

Output Schema

NameRequiredDescription
resultNo

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only and non-destructive behavior, so the bar for extra disclosure is lower. The description adds that it returns profile settings including `language` and `ui_labels`, but it does not mention what happens with invalid tokens or any other behavioral constraints, such as rate limits or required conditions.

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?

Two sentences, no redundancy, and the core action is front-loaded. Every clause contributes information, and it resists repeating the title or other fields.

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?

For a single-parameter, read-only tool with an output schema present, the description is largely complete. It covers purpose, usage scope, and key response content. It slightly omits what happens when validation fails for an invalid token, but this is a minor gap relative to the tool's simplicity.

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?

With 0% schema description coverage, the description must do the work, and it does: it says the `jwt` must be one previously issued by `generate_jwt`, and connects it to the returned profile. It clarifies semantic meaning and helps an agent construct a valid call, even though it doesn't describe token format.

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 a specific verb and resource: `verify` a JWT. It further distinguishes itself from the sibling `generate_jwt` by focusing on validation, and mentions the meaningful return (`profile` object), leaving no doubt about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear contextual guidance by specifying that the JWT must have been previously issued via `generate_jwt`, which tells an agent when this tool applies. It doesn't explicitly describe alternatives or when-not-to-use, but no equivalent validation sibling exists, so this is effective.

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. 34 tool updatesv0.17.2
    • Addedapprove_comment
    • Changedcomment_action1 field changed
      • addedInput schema / properties / confirmed
        Added value: +{
        +  "description": "Set to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.",
        +  "type": "boolean"
        +}
    • Changedcreate_comment1 field changed
      • addedInput schema / properties / confirmed
        Added value: +{
        +  "description": "Set to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.",
        +  "type": "boolean"
        +}
    • Addeddelete_autodm
    • Removeddelete_media_upload
    • Changeddelete_user1 field changed
      • addedInput schema / properties / confirm_username
        Added value: +{
        +  "description": "The profile name typed again by the user to confirm the deletion. Must equal `username`; otherwise nothing is deleted.",
        +  "type": "string"
        +}
    • Addededit_comment
    • Changededit_scheduled1 field changed
      • addedInput schema / properties / youtubePublishAt
        Added value: +{
        +  "description": "YouTube only: ISO 8601 UTC date-time at which YouTube makes the video public; YouTube applies it only to private videos. Sent as `fields.youtube_publish_at`; null removes it.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Addedget_autodm_logs
    • Addedget_connect_link
    • Changedget_history2 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Items per page. The API pages in 10, 20, 50 or 100, so other values are rounded up to the next of those. Defaults to 10."
      • changedInput schema / properties / limit / maximum
        Previous value: -200New value: +100
    • Addedhide_comment
    • Addedhold_comment
    • Addedignore_comment
    • Addedlike_comment
    • Addedlist_autodms
    • Changedlist_users2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / platforms
        Added value: +{
        +  "description": "Optional platforms the user wants to publish to (e.g. ['tiktok','instagram']). When given, the response says whether they are connected and, if not, how to connect them.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedmanage_autodms9 fields changed
      • changedInput schema / properties / buttons / description
        Previous value: -"For action='start': up to 3 web_url buttons ({ title, url }) added to each auto-DM."New value: +"Instagram only, for action='start': up to 3 web_url buttons ({ title, url }) added to each auto-DM."
      • addedInput schema / properties / confirmed
        Added value: +{
        +  "description": "Set to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / monitoring_interval / description
        Previous value: -"Polling interval in minutes for action='start'. Minimum is 15."New value: +"Minutes between comment checks for action='start'. Minimum is 15. Instagram and TikTok answer within seconds, so there it only paces a backup check."
      • addedInput schema / properties / platform
        Added value: +{
        +  "description": "Network of the post. Default instagram, which answers with a private DM. tiktok, youtube, facebook, threads and bluesky have no private reply to a comment, so matching comments get a PUBLIC reply under the comment instead.",
        +  "enum": [
        +    "instagram",
        +    "tiktok",
        +    "youtube",
        +    "facebook",
        +    "threads",
        +    "bluesky"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / post_id
        Added value: +{
        +  "description": "Post to watch on tiktok/youtube/facebook/threads/bluesky (instead of post_url): TikTok video id, YouTube video id, Facebook post id ('{pageId}_{postId}'), Threads post id, Bluesky at:// URI. A TikTok or YouTube URL is also accepted.",
        +  "type": "string"
        +}
      • changedInput schema / properties / post_url / description
        Previous value: -"Instagram post URL to monitor. Required when action='start'."New value: +"Post URL to monitor. Required on Instagram when action='start'."
      • changedInput schema / properties / reply_message / description
        Previous value: -"DM text sent to matching commenters. Required when action='start'."New value: +"Text sent to matching commenters (a DM on Instagram, a public reply elsewhere). Required when action='start'."
      • addedInput schema / properties / reply_messages
        Added value: +{
        +  "description": "Public replies only: up to 5 alternative texts, rotated across comments so TikTok and YouTube do not see the same reply over and over.",
        +  "items": {
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "maxItems": 5,
        +  "type": "array"
        +}
      • changedInput schema / properties / trigger_keywords / description
        Previous value: -"Optional keyword or keywords; only comments containing these terms receive a DM."New value: +"Optional keyword or keywords; only comments containing these terms are answered (case and accents ignored)."
    • Addedpause_autodm
    • Addedpin_comment
    • Changedpublic_reply_to_comment1 field changed
      • addedInput schema / properties / confirmed
        Added value: +{
        +  "description": "Set to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.",
        +  "type": "boolean"
        +}
    • Changedreply_to_comment1 field changed
      • addedInput schema / properties / confirmed
        Added value: +{
        +  "description": "Set to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.",
        +  "type": "boolean"
        +}
    • Changedreply_to_google_business_review1 field changed
      • addedInput schema / properties / confirmed
        Added value: +{
        +  "description": "Set to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.",
        +  "type": "boolean"
        +}
    • Addedresume_autodm
    • Changedsend_dm1 field changed
      • addedInput schema / properties / confirmed
        Added value: +{
        +  "description": "Set to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.",
        +  "type": "boolean"
        +}
    • Addedset_post_comments
    • Addedstart_autodm
    • Addedstop_autodm
    • Changedsubmit_ffmpeg_job1 field changed
      • changedInput schema / properties / full_command / description
        Previous value: -"Optional explicit command. Must start with `ffmpeg`; shell metacharacters are rejected by the API."New value: +"Optional ffmpeg command with `{input}` / `{input0}`… and `{output}` placeholders. Must start with `ffmpeg`; each `-i` is a placeholder or `-f lavfi`. Protocols or URLs inside the command, `movie=`/`sendcmd`, absolute paths (except /usr/share/fonts), `..`, `-safe 0` and shell metacharacters are rejected. Endless inputs need `-t` or `-shortest`; `-stream_loop` is capped at 100."
    • Changedunpublish_post4 fields changed
      • addedInput schema / properties / confirmed
        Added value: +{
        +  "description": "Set to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / description
        Previous value: -"Social platform. One of facebook, youtube, x, linkedin, threads. Instagram and TikTok are unsupported."New value: +"Social platform the post lives on."
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "facebook",
        -  "youtube",
        -  "x",
        -  "linkedin",
        -  "threads"
        -]New value: +[
        +  "facebook",
        +  "youtube",
        +  "x",
        +  "linkedin",
        +  "pinterest",
        +  "bluesky",
        +  "google_business"
        +]
      • changedInput schema / properties / postId / description
        Previous value: -"Platform post ID to delete."New value: +"Platform post ID to delete (Bluesky: the post AT-URI; Google Business: the full accounts/.../locations/.../localPosts/... name returned on upload)."
    • Changedupload_document1 field changed
      • addedInput schema / properties / confirmed
        Added value: +{
        +  "description": "Set to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.",
        +  "type": "boolean"
        +}
    • Changedupload_photos10 fields changed
      • addedInput schema / properties / confirmed
        Added value: +{
        +  "description": "Set to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / description / description
        Added value: +"Description for the platforms that take one, unless a per-platform override is set. TikTok ignores it: set `platformOptions.tiktokDescription` for the TikTok description; the TikTok title comes from `platformOptions.tiktokTitle`, or `title`."
      • changedInput schema / properties / firstComment / description
        Previous value: -"Comment auto-posted under the post right after publishing. Supported on every platform that has comments, TikTok included. Use `platformOptions.<platform>FirstComment` to override it for one platform."New value: +"Comment auto-posted under the post right after publishing. Supported on every platform that has comments, TikTok included. Use `platformOptions.<platform>FirstComment` to override it for one platform. X: links can be removed from X posts and first comments, depending on the account, so a 'link in the first comment' may go out without the URL; check `warnings` in get_status after publishing."
      • addedInput schema / properties / photosPathsOrUrls / description
        Added value: +"Photo URLs (or same-machine local paths), in carousel order. Never `/mnt/data` or sandbox attachment paths."
      • changedInput schema / properties / platformOptions / description
        Previous value: -"Flat platform-specific override object with camelCase keys. Per-platform text overrides (instagramTitle, xFirstComment, …) are also accepted. Keys the upload-post SDK does not support are silently ignored upstream. Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."New value: +"Flat platform-specific override object with camelCase keys. Per-platform text overrides (instagramTitle, xFirstComment, …) are also accepted. Keys the upload-post SDK does not support are silently ignored upstream."
      • changedInput schema / properties / platformOptions / properties / redditFlairId / description
        Previous value: -"Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."New value: +"Reddit only."
      • changedInput schema / properties / platformOptions / properties / redditSubreddit / description
        Previous value: -"Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."New value: +"Reddit only."
      • changedInput schema / properties / platforms / description
        Previous value: -"Required array of platform identifiers. Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."New value: +"Required array of platform identifiers."
      • changedInput schema / properties / platforms / items / description
        Previous value: -"Target social platform. Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."New value: +"Target social platform."
      • changedInput schema / properties / platforms / items / enum
        Previous value: -[
        -  "tiktok",
        -  "instagram",
        -  "linkedin",
        -  "facebook",
        -  "pinterest",
        -  "threads",
        -  "reddit",
        -  "bluesky",
        -  "x",
        -  "google_business",
        -  "discord",
        -  "telegram",
        -  "mastodon",
        -  "lemmy",
        -  "wordpress"
        -]New value: +[
        +  "tiktok",
        +  "instagram",
        +  "linkedin",
        +  "facebook",
        +  "pinterest",
        +  "threads",
        +  "bluesky",
        +  "x",
        +  "google_business",
        +  "discord",
        +  "telegram",
        +  "mastodon",
        +  "lemmy",
        +  "wordpress"
        +]
    • Changedupload_text8 fields changed
      • addedInput schema / properties / confirmed
        Added value: +{
        +  "description": "Set to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platformOptions / description
        Previous value: -"Flat platform-specific override object with camelCase keys. Per-platform text overrides (xTitle, linkedinTitle, …) are also accepted. Keys the upload-post SDK does not support are silently ignored upstream. Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."New value: +"Flat platform-specific override object with camelCase keys. Per-platform text overrides (xTitle, linkedinTitle, …) are also accepted. Keys the upload-post SDK does not support are silently ignored upstream."
      • changedInput schema / properties / platformOptions / properties / redditFlairId / description
        Previous value: -"Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."New value: +"Reddit only."
      • changedInput schema / properties / platformOptions / properties / redditLinkUrl / description
        Previous value: -"Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."New value: +"Reddit only."
      • changedInput schema / properties / platformOptions / properties / redditSubreddit / description
        Previous value: -"Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."New value: +"Reddit only."
      • changedInput schema / properties / platforms / description
        Previous value: -"Required array of platform identifiers. Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."New value: +"Required array of platform identifiers."
      • changedInput schema / properties / platforms / items / description
        Previous value: -"Target social platform. Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."New value: +"Target social platform."
      • changedInput schema / properties / platforms / items / enum
        Previous value: -[
        -  "x",
        -  "linkedin",
        -  "facebook",
        -  "threads",
        -  "reddit",
        -  "bluesky",
        -  "google_business",
        -  "discord",
        -  "telegram",
        -  "slack",
        -  "mastodon",
        -  "nostr",
        -  "lemmy",
        -  "devto",
        -  "hashnode",
        -  "wordpress",
        -  "whop",
        -  "listmonk"
        -]New value: +[
        +  "x",
        +  "linkedin",
        +  "facebook",
        +  "threads",
        +  "bluesky",
        +  "google_business",
        +  "discord",
        +  "telegram",
        +  "slack",
        +  "mastodon",
        +  "nostr",
        +  "lemmy",
        +  "devto",
        +  "hashnode",
        +  "wordpress",
        +  "whop",
        +  "listmonk"
        +]
    • Changedupload_video7 fields changed
      • addedInput schema / properties / confirmed
        Added value: +{
        +  "description": "Set to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / description / description
        Added value: +"Description for the platforms that take one, unless a per-platform override is set. TikTok ignores it: set `platformOptions.tiktokDescription` for the TikTok description; the TikTok title comes from `platformOptions.tiktokTitle`, or `title`."
      • changedInput schema / properties / firstComment / description
        Previous value: -"Comment auto-posted under the post right after publishing. Supported on every platform that has comments, TikTok included. Use `platformOptions.<platform>FirstComment` to override it for one platform."New value: +"Comment auto-posted under the post right after publishing. Supported on every platform that has comments, TikTok included. Use `platformOptions.<platform>FirstComment` to override it for one platform. X: links can be removed from X posts and first comments, depending on the account, so a 'link in the first comment' may go out without the URL; check `warnings` in get_status after publishing."
      • changedInput schema / properties / platforms / description
        Previous value: -"Required array of platform identifiers, e.g. ['instagram']. Never pass a single string. Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."New value: +"Required array of platform identifiers, e.g. ['instagram']. Never pass a single string."
      • changedInput schema / properties / platforms / items / description
        Previous value: -"Target social platform. Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."New value: +"Target social platform."
      • changedInput schema / properties / platforms / items / enum
        Previous value: -[
        -  "tiktok",
        -  "instagram",
        -  "youtube",
        -  "linkedin",
        -  "facebook",
        -  "pinterest",
        -  "threads",
        -  "reddit",
        -  "bluesky",
        -  "x",
        -  "google_business",
        -  "discord",
        -  "telegram",
        -  "mastodon",
        -  "wordpress"
        -]New value: +[
        +  "tiktok",
        +  "instagram",
        +  "youtube",
        +  "linkedin",
        +  "facebook",
        +  "pinterest",
        +  "threads",
        +  "bluesky",
        +  "x",
        +  "google_business",
        +  "discord",
        +  "telegram",
        +  "mastodon",
        +  "wordpress"
        +]
      • changedInput schema / properties / videoBase64 / description
        Previous value: -"Video bytes as base64 (or a data: URI). Provide this OR videoPathOrUrl. The server writes it to a temp file, uploads, then deletes it. Capped by UPLOAD_POST_MAX_INLINE_MB (default 100)."New value: +"Video bytes as base64 (or a data: URI). Provide this OR videoPathOrUrl. The server writes it to a temp file, uploads, then deletes it. Capped by UPLOAD_POST_MAX_INLINE_MB (default 100); over HTTP the whole request is also capped by UPLOAD_POST_MCP_MAX_BODY_MB (default 10), so use videoPathOrUrl for anything larger."
  2. 5 tool updatesv0.11.4
    • Changedcomment_action8 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"What to do. Lowercase; each value already carries its direction, so there is no separate 'undo' flag."New value: +"What to do. Lowercase; each value already carries its direction, so there is no separate 'undo' flag. Which values a platform accepts is listed in the tool description."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "hide",
        -  "unhide",
        -  "like",
        -  "unlike",
        -  "pin",
        -  "unpin"
        -]New value: +[
        +  "hide",
        +  "unhide",
        +  "like",
        +  "unlike",
        +  "pin",
        +  "unpin",
        +  "edit",
        +  "hold",
        +  "approve",
        +  "ignore",
        +  "enable_comments",
        +  "disable_comments"
        +]
      • addedInput schema / properties / banAuthor
        Added value: +{
        +  "description": "YouTube `hide` only: also ban the comment's author from the channel.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / commentId / description
        Previous value: -"Comment to act on (from get_post_comments). Sent as `comment_id`."New value: +"Comment to act on (from get_post_comments). Sent as `comment_id`. Required except Instagram enable_comments/disable_comments."
      • addedInput schema / properties / message
        Added value: +{
        +  "description": "Facebook `edit` only: the new comment text.",
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "tiktok"
        -]New value: +[
        +  "tiktok",
        +  "facebook",
        +  "instagram",
        +  "youtube",
        +  "threads"
        +]
      • changedInput schema / properties / postId / description
        Previous value: -"Post the comment belongs to (TikTok: the video id). Required for hide/unhide and pin/unpin; not used by like/unlike."New value: +"Post the comment belongs to (TikTok: the video id). Required for TikTok hide/unhide and pin/unpin, YouTube moderation and Instagram enable_comments/disable_comments; not used by like/unlike."
      • changedInput schema / required
        Previous value: -[
        -  "user",
        -  "platform",
        -  "commentId",
        -  "action"
        -]New value: +[
        +  "user",
        +  "platform",
        +  "action"
        +]
    • Changedcreate_comment2 fields changed
      • changedInput schema / properties / platform / description
        Previous value: -"Social platform. One of instagram, facebook, youtube, linkedin, tiktok."New value: +"Social platform. One of instagram, facebook, youtube, linkedin, tiktok, x, threads, bluesky."
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "instagram",
        -  "facebook",
        -  "youtube",
        -  "linkedin",
        -  "tiktok"
        -]New value: +[
        +  "instagram",
        +  "facebook",
        +  "youtube",
        +  "linkedin",
        +  "tiktok",
        +  "x",
        +  "threads",
        +  "bluesky"
        +]
    • Changeddelete_comment2 fields changed
      • changedInput schema / properties / platform / description
        Previous value: -"Social platform. One of instagram, facebook, youtube, linkedin, tiktok."New value: +"Social platform. One of instagram, facebook, youtube, linkedin, tiktok, x, bluesky (Threads cannot delete comments)."
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "instagram",
        -  "facebook",
        -  "youtube",
        -  "linkedin",
        -  "tiktok"
        -]New value: +[
        +  "instagram",
        +  "facebook",
        +  "youtube",
        +  "linkedin",
        +  "tiktok",
        +  "x",
        +  "bluesky"
        +]
    • Changededit_scheduled5 fields changed
      • addedInput schema / properties / caption
        Added value: +{
        +  "description": "New caption/description for every platform of the post.",
        +  "type": "string"
        +}
      • addedInput schema / properties / platformContent
        Added value: +{
        +  "additionalProperties": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "caption": {
        +        "type": "string"
        +      },
        +      "title": {
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "description": "Per-platform text, keyed by platform (instagram, tiktok, youtube, facebook, linkedin, x, threads…). Only the platforms listed are changed.",
        +  "type": "object"
        +}
      • addedInput schema / properties / scheduledDate / description
        Added value: +"New date, ISO 8601."
      • addedInput schema / properties / timezone / description
        Added value: +"IANA timezone for scheduledDate."
      • addedInput schema / properties / title
        Added value: +{
        +  "description": "New title for every platform of the post.",
        +  "type": "string"
        +}
    • Changedget_post_comments2 fields changed
      • changedInput schema / properties / platform / description
        Previous value: -"Social platform. One of instagram, facebook, youtube, linkedin, tiktok."New value: +"Social platform. One of instagram, facebook, youtube, linkedin, tiktok, x, threads, bluesky."
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "instagram",
        -  "facebook",
        -  "youtube",
        -  "linkedin",
        -  "tiktok"
        -]New value: +[
        +  "instagram",
        +  "facebook",
        +  "youtube",
        +  "linkedin",
        +  "tiktok",
        +  "x",
        +  "threads",
        +  "bluesky"
        +]
  3. 58 tool updatesv0.11.1
    • Changedcancel_scheduled2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Addedcomment_action
    • Changedcomplete_media_upload2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedcreate_comment6 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / commentId / description
        Previous value: -"Reply to this comment. Required by Instagram."New value: +"Reply to this comment. Required by Instagram. TikTok: pass it together with postId to reply inside a thread."
      • changedInput schema / properties / platform / description
        Previous value: -"Social platform. One of instagram, facebook, youtube, linkedin."New value: +"Social platform. One of instagram, facebook, youtube, linkedin, tiktok."
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "instagram",
        -  "facebook",
        -  "youtube",
        -  "linkedin"
        -]New value: +[
        +  "instagram",
        +  "facebook",
        +  "youtube",
        +  "linkedin",
        +  "tiktok"
        +]
      • changedInput schema / properties / postId / description
        Previous value: -"Top-level comment on this post ID. LinkedIn: the post urn."New value: +"Top-level comment on this post ID. LinkedIn: the post urn. TikTok: the video id, always required."
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedcreate_media_upload3 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / source / description
        Previous value: -"Optional source label, e.g. mcp_chatgpt or mcp_claude."New value: +"Optional source label identifying the calling client, e.g. mcp_studio."
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedcreate_user2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changeddelete_comment4 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / platform / description
        Previous value: -"Social platform. One of instagram, facebook, youtube, linkedin."New value: +"Social platform. One of instagram, facebook, youtube, linkedin, tiktok."
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "instagram",
        -  "facebook",
        -  "youtube",
        -  "linkedin"
        -]New value: +[
        +  "instagram",
        +  "facebook",
        +  "youtube",
        +  "linkedin",
        +  "tiktok"
        +]
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changeddelete_media_upload2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changeddelete_user2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changeddownload_ffmpeg_result2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changededit_scheduled2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedgenerate_jwt2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_account_info2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_analytics2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Addedget_audience
    • Changedget_cached_post_analytics2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_facebook_pages2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_ffmpeg_consumption2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_ffmpeg_job2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_google_business_locations2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_google_business_reviews2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_history2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_job_status2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_linkedin_pages2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_media2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_media_upload2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_pinterest_boards2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_platform_metrics2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_post_analytics2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_post_comments7 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / properties / commentId
        Added value: +{
        +  "description": "Return the replies under this comment instead of the post's top-level comments. Sent as `comment_id`.",
        +  "type": "string"
        +}
      • changedInput schema / properties / limit / description
        Previous value: -"Comments to return (1-50, Meta's cap)."New value: +"Comments to return (1-50; that ceiling is both Meta's and TikTok's)."
      • changedInput schema / properties / platform / description
        Previous value: -"Social platform. One of instagram, facebook, youtube, linkedin. TikTok is unsupported."New value: +"Social platform. One of instagram, facebook, youtube, linkedin, tiktok."
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "instagram",
        -  "facebook",
        -  "youtube",
        -  "linkedin"
        -]New value: +[
        +  "instagram",
        +  "facebook",
        +  "youtube",
        +  "linkedin",
        +  "tiktok"
        +]
      • changedInput schema / properties / postId / description
        Previous value: -"Platform media/post ID. YouTube: the videoId. LinkedIn: the post urn."New value: +"Platform media/post ID. YouTube: the videoId. LinkedIn: the post urn. TikTok: the video id (required — TikTok has no URL lookup)."
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_queue_settings2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_reddit_detailed_posts2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_status2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Addedget_suggestions
    • Changedget_total_impressions2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedlist_dm_conversations2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedlist_scheduled2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedlist_users2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedmanage_autodms2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Removedopen_upload_studio
    • Changedpreview_queue2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedpublic_reply_to_comment2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedreply_to_comment2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedreply_to_google_business_review2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedretry_post2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedsend_dm2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedsubmit_ffmpeg_job2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Addedtiktok_location_search
    • Addedtiktok_music_search
    • Addedtiktok_music_trending
    • Addedtiktok_publishing_settings
    • Changedunpublish_post2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedupdate_queue_settings2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedupload_document2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedupload_photos20 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / properties / firstComment / description
        Added value: +"Comment auto-posted under the post right after publishing. Supported on every platform that has comments, TikTok included. Use `platformOptions.<platform>FirstComment` to override it for one platform."
      • changedInput schema / properties / platformOptions / description
        Previous value: -"Flat platform-specific override object with camelCase keys. Per-platform text overrides (instagramTitle, xFirstComment, …) are also accepted. Keys the upload-post SDK does not support are silently ignored upstream."New value: +"Flat platform-specific override object with camelCase keys. Per-platform text overrides (instagramTitle, xFirstComment, …) are also accepted. Keys the upload-post SDK does not support are silently ignored upstream. Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."
      • changedInput schema / properties / platformOptions / properties / redditFlairId / description
        Previous value: -"Reddit flair template ID."New value: +"Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."
      • changedInput schema / properties / platformOptions / properties / redditSubreddit / description
        Previous value: -"Subreddit name, without r/."New value: +"Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."
      • addedInput schema / properties / platformOptions / properties / replyToId
        Added value: +{
        +  "description": "Publish as a reply to an existing post (X: tweet ID; Bluesky: post URL or AT-URI). On X's Pay-Per-Use tier a reply to an author the account has not engaged with is rejected with 403.",
        +  "type": "string"
        +}
      • addedInput schema / properties / platformOptions / properties / tiktokFirstComment
        Added value: +{
        +  "description": "First comment posted under the TikTok post, overriding the shared `firstComment` for TikTok only. Requires the 'comments' capability on the profile's TikTok account (see the `capabilities` array in list_users).",
        +  "type": "string"
        +}
      • addedInput schema / properties / platformOptions / properties / tiktokIsAiGenerated
        Added value: +{
        +  "description": "Disclose the photo post as AI-generated content.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / platformOptions / properties / tiktokLocationId
        Added value: +{
        +  "description": "Location to tag — pass a `location_id` from tiktok_location_search. Must be sent together with tiktokLocationName. Needs the `location` capability (see tiktokMusicId).",
        +  "type": "string"
        +}
      • addedInput schema / properties / platformOptions / properties / tiktokLocationName
        Added value: +{
        +  "description": "Name of the tagged location, from tiktok_location_search. TikTok requires it whenever tiktokLocationId is set.",
        +  "type": "string"
        +}
      • addedInput schema / properties / platformOptions / properties / tiktokMusicId
        Added value: +{
        +  "description": "Commercial Music Library track to add to the photo post — pass a track `id` from tiktok_music_trending or tiktok_music_search (the `id` field, not `commercial_music_id`). TikTok's photo posts take the id alone: there is no volume or trim. Available on connections that declare the `music` capability (see `capabilities` on the TikTok account in list_users); otherwise the field is ignored, the post still publishes and the response includes a per-field warning.",
        +  "type": "string"
        +}
      • changedInput schema / properties / platformOptions / properties / tiktokPhotoCoverIndex / description
        Previous value: -"Index of the cover photo, 0-based."New value: +"Index of the cover photo, 0-based. Sent as `photo_cover_index`; picks the cover of a TikTok photo post."
      • addedInput schema / properties / platformOptions / properties / tiktokPhotoCoverIndex / minimum
        Added value: +0
      • addedInput schema / properties / platformOptions / properties / tiktokPostMode
        Added value: +{
        +  "description": "Send to TikTok drafts/inbox. Same flag for every TikTok account; do not pick a different field for Business. MEDIA_UPLOAD (or tiktokUploadToDraft=true) sends the post to drafts/inbox. DIRECT_POST publishes now.",
        +  "enum": [
        +    "DIRECT_POST",
        +    "MEDIA_UPLOAD"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / platformOptions / properties / tiktokPrivacyLevel
        Added value: +{
        +  "description": "TikTok privacy value: PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY. TikTok requires one on photo posts (defaults to PUBLIC_TO_EVERYONE) and decides per account which values are available.",
        +  "type": "string"
        +}
      • addedInput schema / properties / platformOptions / properties / tiktokUploadToDraft
        Added value: +{
        +  "description": "Send to TikTok drafts/inbox. Same flag for every TikTok account; do not pick a different field for Business. Set true, or tiktokPostMode=MEDIA_UPLOAD.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / platformOptions / properties / xReplyToId
        Added value: +{
        +  "description": "Alias of replyToId, scoped to X: the tweet ID to reply to.",
        +  "type": "string"
        +}
      • addedInput schema / properties / platforms / description
        Added value: +"Required array of platform identifiers. Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."
      • addedInput schema / properties / platforms / items / description
        Added value: +"Target social platform. Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedupload_text11 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / platformOptions / description
        Previous value: -"Flat platform-specific override object with camelCase keys. Per-platform text overrides (xTitle, linkedinTitle, …) are also accepted. Keys the upload-post SDK does not support are silently ignored upstream."New value: +"Flat platform-specific override object with camelCase keys. Per-platform text overrides (xTitle, linkedinTitle, …) are also accepted. Keys the upload-post SDK does not support are silently ignored upstream. Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."
      • changedInput schema / properties / platformOptions / properties / redditFlairId / description
        Previous value: -"Reddit flair template ID."New value: +"Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."
      • changedInput schema / properties / platformOptions / properties / redditLinkUrl / description
        Previous value: -"Link to attach on Reddit."New value: +"Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."
      • changedInput schema / properties / platformOptions / properties / redditSubreddit / description
        Previous value: -"Subreddit name, without r/. Title is required for Reddit."New value: +"Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."
      • addedInput schema / properties / platformOptions / properties / replyToId
        Added value: +{
        +  "description": "Publish as a reply to an existing post (X: tweet ID; Bluesky: post URL or AT-URI). On X's Pay-Per-Use tier a reply to an author the account has not engaged with is rejected with 403.",
        +  "type": "string"
        +}
      • addedInput schema / properties / platformOptions / properties / tiktokFirstComment
        Added value: +{
        +  "description": "First comment posted under the TikTok post, overriding the shared `firstComment` for TikTok only. Requires the 'comments' capability on the profile's TikTok account (see the `capabilities` array in list_users).",
        +  "type": "string"
        +}
      • addedInput schema / properties / platformOptions / properties / xReplyToId
        Added value: +{
        +  "description": "Alias of replyToId, scoped to X: the tweet ID to reply to.",
        +  "type": "string"
        +}
      • addedInput schema / properties / platforms / description
        Added value: +"Required array of platform identifiers. Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."
      • addedInput schema / properties / platforms / items / description
        Added value: +"Target social platform. Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedupload_video22 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / properties / firstComment / description
        Added value: +"Comment auto-posted under the post right after publishing. Supported on every platform that has comments, TikTok included. Use `platformOptions.<platform>FirstComment` to override it for one platform."
      • changedInput schema / properties / platformOptions / description
        Previous value: -"Platform-specific overrides as a flat object (camelCase keys), e.g. { tiktokPrivacyLevel: 'PUBLIC_TO_EVERYONE', youtubePrivacyStatus: 'public', youtubePlaylistId: 'PLxxxxxxxxxxxx', facebookPageId: '123' }. `youtubePlaylistId` may also be an array or a comma-separated list of playlist IDs to add the uploaded video to."New value: +"Platform-specific overrides as a flat object (camelCase keys), e.g. { tiktokPrivacyLevel: 'PUBLIC_TO_EVERYONE', youtubePrivacyStatus: 'public', youtubePlaylistId: 'PLxxxxxxxxxxxx', facebookPageId: '123' }. `youtubePlaylistId` may also be an array or a comma-separated list of playlist IDs to add the uploaded video to. The `tiktokMusic*`, `tiktokLocation*`, and `tiktokCoverImageUrl` keys depend on the TikTok connection's `capabilities` (see list_users); discover valid values with tiktok_music_trending and tiktok_location_search. tiktokPostMode=MEDIA_UPLOAD and tiktokUploadToDraft=true are the same draft/inbox flag for every TikTok account."
      • addedInput schema / properties / platformOptions / properties / replyToId
        Added value: +{
        +  "description": "Publish as a reply to an existing post (X: tweet ID; Bluesky: post URL or AT-URI). On X's Pay-Per-Use tier a reply to an author the account has not engaged with is rejected with 403.",
        +  "type": "string"
        +}
      • addedInput schema / properties / platformOptions / properties / tiktokCoverImageUrl
        Added value: +{
        +  "description": "Custom cover image URL. Takes priority over tiktokCoverTimestamp. Needs the `cover_image` capability (see tiktokMusicId).",
        +  "type": "string"
        +}
      • addedInput schema / properties / platformOptions / properties / tiktokFirstComment
        Added value: +{
        +  "description": "First comment posted under the TikTok post, overriding the shared `firstComment` for TikTok only. Requires the 'comments' capability on the profile's TikTok account (see the `capabilities` array in list_users).",
        +  "type": "string"
        +}
      • addedInput schema / properties / platformOptions / properties / tiktokIsAiGenerated
        Added value: +{
        +  "description": "Disclose the video as AI-generated content.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / platformOptions / properties / tiktokLocationId
        Added value: +{
        +  "description": "Location to tag — pass a `location_id` from tiktok_location_search. Must be sent together with tiktokLocationName. Needs the `location` capability (see tiktokMusicId).",
        +  "type": "string"
        +}
      • addedInput schema / properties / platformOptions / properties / tiktokLocationName
        Added value: +{
        +  "description": "Name of the tagged location, from tiktok_location_search. TikTok requires it whenever tiktokLocationId is set.",
        +  "type": "string"
        +}
      • addedInput schema / properties / platformOptions / properties / tiktokMusicEnd
        Added value: +{
        +  "description": "End offset of the music track, in milliseconds.",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / platformOptions / properties / tiktokMusicId
        Added value: +{
        +  "description": "Commercial Music Library track to add to the video — pass a track `id` from tiktok_music_trending (the `id` field, not `commercial_music_id`). Available on connections that declare the `music` capability (see `capabilities` on the TikTok account in list_users); otherwise the field is ignored, the post still publishes and the response includes a per-field warning — reconnect the TikTok account to enable it.",
        +  "type": "string"
        +}
      • addedInput schema / properties / platformOptions / properties / tiktokMusicStart
        Added value: +{
        +  "description": "Start offset of the music track, in milliseconds.",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / platformOptions / properties / tiktokMusicVolume
        Added value: +{
        +  "description": "Volume of the added music track, 0-100. Defaults to 50 when music is set.",
        +  "maximum": 100,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / platformOptions / properties / tiktokOriginalSoundVolume
        Added value: +{
        +  "description": "Volume of the video's own audio when music is added, 0-100. Defaults to 50 so the original audio is not muted.",
        +  "maximum": 100,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / properties / platformOptions / properties / tiktokPostMode / description
        Previous value: -"TikTok post mode. DIRECT_POST publishes straight to the account. MEDIA_UPLOAD (Draft) sends the video to the user's TikTok inbox/drafts to publish from the app — RECOMMENDED for TikTok, as publishing natively from the app tends to get more organic reach. Note: in Draft mode TikTok ignores the title/caption and other metadata sent via API; the user adds them in the app before publishing. Defaults to DIRECT_POST."New value: +"Send to TikTok drafts/inbox. Same flag for every TikTok account; do not pick a different field for Business. MEDIA_UPLOAD (or tiktokUploadToDraft=true) sends the video to drafts/inbox. DIRECT_POST publishes now."
      • changedInput schema / properties / platformOptions / properties / tiktokPrivacyLevel / description
        Previous value: -"TikTok privacy value, e.g. PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY."New value: +"TikTok privacy value: PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY. TikTok decides per account which of these are available (a private account has no PUBLIC_TO_EVERYONE); asking for another one fails with error_code tiktok_privacy_unavailable listing the allowed ones. Omit it to keep the account's own default."
      • addedInput schema / properties / platformOptions / properties / tiktokUploadToDraft
        Added value: +{
        +  "description": "Send to TikTok drafts/inbox. Same flag for every TikTok account; do not pick a different field for Business. Set true, or tiktokPostMode=MEDIA_UPLOAD.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / platformOptions / properties / xReplyToId
        Added value: +{
        +  "description": "Alias of replyToId, scoped to X: the tweet ID to reply to.",
        +  "type": "string"
        +}
      • changedInput schema / properties / platforms / description
        Previous value: -"Required array of platform identifiers, e.g. ['instagram']. Never pass a single string."New value: +"Required array of platform identifiers, e.g. ['instagram']. Never pass a single string. Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."
      • addedInput schema / properties / platforms / items / description
        Added value: +"Target social platform. Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target."
      • changedInput schema / properties / videoPathOrUrl / description
        Previous value: -"Public/signed HTTPS URL of the video. Absolute local paths are supported only for local/self-hosted MCP clients sharing the same filesystem. Do not pass ChatGPT `/mnt/data` or sandbox paths; use open_upload_studio instead."New value: +"Public/signed HTTPS URL of the video (a staged `media_url` from complete_media_upload also works). Absolute local paths are supported only for local/self-hosted MCP clients sharing the same filesystem. Never pass `/mnt/data`, sandbox, or other mounted attachment paths: the server cannot read them."
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedvalidate_jwt2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
  4. 18 tool updatesv0.7.0
    • Addedcreate_comment
    • Addeddelete_comment
    • Changedgenerate_jwt2 fields changed
      • changedInput schema / properties / language / enum
        Previous value: -[
        -  "en",
        -  "es",
        -  "de",
        -  "fr",
        -  "pt"
        -]New value: +[
        +  "en",
        +  "es",
        +  "de",
        +  "fr",
        +  "pt",
        +  "pl",
        +  "tr"
        +]
      • addedInput schema / properties / uiLabels
        Added value: +{
        +  "additionalProperties": {
        +    "maxLength": 300,
        +    "type": "string"
        +  },
        +  "description": "Flat map of i18n dot-path keys to replacement strings for the connection page, e.g. { 'connect.title': 'Link your accounts' }. Max 100 entries; keys must match ^[a-zA-Z0-9_.]+$ and values are at most 300 characters. Echoed back in the `profile` object of validate_jwt.",
        +  "type": "object"
        +}
    • Changedget_analytics1 field changed
      • changedInput schema / properties / pageUrn / description
        Previous value: -"LinkedIn page URN, if filtering by company page."New value: +"LinkedIn organization/company page URN or numeric ID. LinkedIn analytics are only available for pages you administer — personal profiles are not supported. Defaults to the first administered page."
    • Addedget_cached_post_analytics
    • Addedget_google_business_reviews
    • Changedget_media3 fields changed
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "Opaque cursor from a previous response's `pagination.next_cursor`. LinkedIn, Discord and Telegram do not support cursors — passing one there fails with HTTP 400; use `limit` alone on those platforms.",
        +  "type": "string"
        +}
      • addedInput schema / properties / limit / description
        Added value: +"Items per page. Defaults to 25 and is clamped to 1-100. Per-platform caps: TikTok 20, YouTube 50, everything else 100."
      • changedInput schema / properties / limit / maximum
        Previous value: -200New value: +100
    • Changedget_post_comments3 fields changed
      • changedInput schema / properties / platform / description
        Previous value: -"Social platform. Only 'instagram' is currently supported."New value: +"Social platform. One of instagram, facebook, youtube, linkedin. TikTok is unsupported."
      • addedInput schema / properties / platform / enum
        Added value: +[
        +  "instagram",
        +  "facebook",
        +  "youtube",
        +  "linkedin"
        +]
      • changedInput schema / properties / postId / description
        Previous value: -"Platform media/post ID."New value: +"Platform media/post ID. YouTube: the videoId. LinkedIn: the post urn."
    • Changedmanage_autodms1 field changed
      • addedInput schema / properties / buttons
        Added value: +{
        +  "description": "For action='start': up to 3 web_url buttons ({ title, url }) added to each auto-DM.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "title": {
        +        "type": "string"
        +      },
        +      "url": {
        +        "format": "uri",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "title",
        +      "url"
        +    ],
        +    "type": "object"
        +  },
        +  "maxItems": 3,
        +  "type": "array"
        +}
    • Changedreply_to_comment1 field changed
      • addedInput schema / properties / buttons
        Added value: +{
        +  "description": "Up to 3 web_url buttons rendered in the DM. Each item is { title, url }.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "title": {
        +        "type": "string"
        +      },
        +      "url": {
        +        "format": "uri",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "title",
        +      "url"
        +    ],
        +    "type": "object"
        +  },
        +  "maxItems": 3,
        +  "type": "array"
        +}
    • Addedreply_to_google_business_review
    • Addedretry_post
    • Changedsend_dm1 field changed
      • addedInput schema / properties / buttons
        Added value: +{
        +  "description": "Up to 3 web_url buttons rendered in the DM. Each item is { title, url }.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "title": {
        +        "type": "string"
        +      },
        +      "url": {
        +        "format": "uri",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "title",
        +      "url"
        +    ],
        +    "type": "object"
        +  },
        +  "maxItems": 3,
        +  "type": "array"
        +}
    • Addedunpublish_post
    • Changedupload_document4 fields changed
      • removedInput schema / properties / autogenerate
        Removed value: -{
        -  "description": "If true, AI generates native per-platform title/description from the media and fills any field left empty.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / autogenerateDescription
        Removed value: -{
        -  "description": "Generate only the description with AI.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / autogenerateLanguage
        Removed value: -{
        -  "description": "Force the AI output language (ISO code); omit to auto-detect from the media.",
        -  "type": "string"
        -}
      • removedInput schema / properties / autogenerateTitle
        Removed value: -{
        -  "description": "Generate only the title with AI.",
        -  "type": "boolean"
        -}
    • Changedupload_photos6 fields changed
      • removedInput schema / properties / autogenerate
        Removed value: -{
        -  "description": "If true, AI generates native per-platform title/description from the media and fills any field left empty.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / autogenerateDescription
        Removed value: -{
        -  "description": "Generate only the description with AI.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / autogenerateLanguage
        Removed value: -{
        -  "description": "Force the AI output language (ISO code); omit to auto-detect from the media.",
        -  "type": "string"
        -}
      • removedInput schema / properties / autogenerateTitle
        Removed value: -{
        -  "description": "Generate only the title with AI.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / platformOptions / properties / gbpMediaCategory
        Added value: +{
        +  "description": "Google Business gallery category for the uploaded photo. Only used with gbpPostType. Defaults to ADDITIONAL.",
        +  "enum": [
        +    "COVER",
        +    "PROFILE",
        +    "LOGO",
        +    "EXTERIOR",
        +    "INTERIOR",
        +    "PRODUCT",
        +    "AT_WORK",
        +    "FOOD_AND_DRINK",
        +    "MENU",
        +    "COMMON_AREA",
        +    "ROOMS",
        +    "TEAMS",
        +    "ADDITIONAL"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / platformOptions / properties / gbpPostType
        Added value: +{
        +  "description": "Publish into the Google Business location's photo gallery instead of creating a Local Post. Omitting it keeps the Local Post behaviour.",
        +  "enum": [
        +    "MEDIA",
        +    "PHOTO",
        +    "GALLERY"
        +  ],
        +  "type": "string"
        +}
    • Changedupload_text6 fields changed
      • removedInput schema / properties / autogenerate
        Removed value: -{
        -  "description": "If true, AI generates native per-platform title/description from the media and fills any field left empty.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / autogenerateDescription
        Removed value: -{
        -  "description": "Generate only the description with AI.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / autogenerateLanguage
        Removed value: -{
        -  "description": "Force the AI output language (ISO code); omit to auto-detect from the media.",
        -  "type": "string"
        -}
      • removedInput schema / properties / autogenerateTitle
        Removed value: -{
        -  "description": "Generate only the title with AI.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / platformOptions / properties / gbpMediaCategory
        Added value: +{
        +  "description": "Google Business gallery category for the uploaded photo. Only used with gbpPostType. Defaults to ADDITIONAL.",
        +  "enum": [
        +    "COVER",
        +    "PROFILE",
        +    "LOGO",
        +    "EXTERIOR",
        +    "INTERIOR",
        +    "PRODUCT",
        +    "AT_WORK",
        +    "FOOD_AND_DRINK",
        +    "MENU",
        +    "COMMON_AREA",
        +    "ROOMS",
        +    "TEAMS",
        +    "ADDITIONAL"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / platformOptions / properties / gbpPostType
        Added value: +{
        +  "description": "Publish into the Google Business location's photo gallery instead of creating a Local Post. Omitting it keeps the Local Post behaviour.",
        +  "enum": [
        +    "MEDIA",
        +    "PHOTO",
        +    "GALLERY"
        +  ],
        +  "type": "string"
        +}
    • Changedupload_video6 fields changed
      • removedInput schema / properties / autogenerate
        Removed value: -{
        -  "description": "If true, AI generates native per-platform title/description from the media and fills any field left empty.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / autogenerateDescription
        Removed value: -{
        -  "description": "Generate only the description with AI.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / autogenerateLanguage
        Removed value: -{
        -  "description": "Force the AI output language (ISO code); omit to auto-detect from the media.",
        -  "type": "string"
        -}
      • removedInput schema / properties / autogenerateTitle
        Removed value: -{
        -  "description": "Generate only the title with AI.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / platformOptions / properties / gbpMediaCategory
        Added value: +{
        +  "description": "Google Business gallery category for the uploaded photo. Only used with gbpPostType. Defaults to ADDITIONAL.",
        +  "enum": [
        +    "COVER",
        +    "PROFILE",
        +    "LOGO",
        +    "EXTERIOR",
        +    "INTERIOR",
        +    "PRODUCT",
        +    "AT_WORK",
        +    "FOOD_AND_DRINK",
        +    "MENU",
        +    "COMMON_AREA",
        +    "ROOMS",
        +    "TEAMS",
        +    "ADDITIONAL"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / platformOptions / properties / gbpPostType
        Added value: +{
        +  "description": "Publish into the Google Business location's photo gallery instead of creating a Local Post. Omitting it keeps the Local Post behaviour.",
        +  "enum": [
        +    "MEDIA",
        +    "PHOTO",
        +    "GALLERY"
        +  ],
        +  "type": "string"
        +}
  5. 4 tool updatesv0.5.0
    • Changedopen_upload_studio2 fields changed
      • changedInput schema / properties / platforms / items / enum
        Previous value: -[
        -  "tiktok",
        -  "instagram",
        -  "youtube",
        -  "linkedin",
        -  "facebook",
        -  "pinterest",
        -  "threads",
        -  "bluesky",
        -  "x",
        -  "google_business",
        -  "discord",
        -  "telegram"
        -]New value: +[
        +  "tiktok",
        +  "instagram",
        +  "youtube",
        +  "linkedin",
        +  "facebook",
        +  "pinterest",
        +  "threads",
        +  "reddit",
        +  "bluesky",
        +  "x",
        +  "google_business",
        +  "discord",
        +  "telegram",
        +  "mastodon",
        +  "wordpress"
        +]
      • changedOutput schema / properties / platforms / items / enum
        Previous value: -[
        -  "tiktok",
        -  "instagram",
        -  "youtube",
        -  "linkedin",
        -  "facebook",
        -  "pinterest",
        -  "threads",
        -  "bluesky",
        -  "x",
        -  "google_business",
        -  "discord",
        -  "telegram"
        -]New value: +[
        +  "tiktok",
        +  "instagram",
        +  "youtube",
        +  "linkedin",
        +  "facebook",
        +  "pinterest",
        +  "threads",
        +  "reddit",
        +  "bluesky",
        +  "x",
        +  "google_business",
        +  "discord",
        +  "telegram",
        +  "mastodon",
        +  "wordpress"
        +]
    • Changedupload_photos1 field changed
      • changedInput schema / properties / platforms / items / enum
        Previous value: -[
        -  "tiktok",
        -  "instagram",
        -  "linkedin",
        -  "facebook",
        -  "pinterest",
        -  "threads",
        -  "reddit",
        -  "bluesky",
        -  "x",
        -  "google_business",
        -  "discord",
        -  "telegram"
        -]New value: +[
        +  "tiktok",
        +  "instagram",
        +  "linkedin",
        +  "facebook",
        +  "pinterest",
        +  "threads",
        +  "reddit",
        +  "bluesky",
        +  "x",
        +  "google_business",
        +  "discord",
        +  "telegram",
        +  "mastodon",
        +  "lemmy",
        +  "wordpress"
        +]
    • Changedupload_text1 field changed
      • changedInput schema / properties / platforms / items / enum
        Previous value: -[
        -  "x",
        -  "linkedin",
        -  "facebook",
        -  "threads",
        -  "reddit",
        -  "bluesky",
        -  "google_business",
        -  "discord",
        -  "telegram"
        -]New value: +[
        +  "x",
        +  "linkedin",
        +  "facebook",
        +  "threads",
        +  "reddit",
        +  "bluesky",
        +  "google_business",
        +  "discord",
        +  "telegram",
        +  "slack",
        +  "mastodon",
        +  "nostr",
        +  "lemmy",
        +  "devto",
        +  "hashnode",
        +  "wordpress",
        +  "whop",
        +  "listmonk"
        +]
    • Changedupload_video1 field changed
      • changedInput schema / properties / platforms / items / enum
        Previous value: -[
        -  "tiktok",
        -  "instagram",
        -  "youtube",
        -  "linkedin",
        -  "facebook",
        -  "pinterest",
        -  "threads",
        -  "bluesky",
        -  "x",
        -  "google_business",
        -  "discord",
        -  "telegram"
        -]New value: +[
        +  "tiktok",
        +  "instagram",
        +  "youtube",
        +  "linkedin",
        +  "facebook",
        +  "pinterest",
        +  "threads",
        +  "reddit",
        +  "bluesky",
        +  "x",
        +  "google_business",
        +  "discord",
        +  "telegram",
        +  "mastodon",
        +  "wordpress"
        +]
  6. 44 tool updatesv0.4.0
    • First observedcancel_scheduled
    • First observedcomplete_media_upload
    • First observedcreate_media_upload
    • First observedcreate_user
    • First observeddelete_media_upload
    • First observeddelete_user
    • First observeddownload_ffmpeg_result
    • First observededit_scheduled
    • First observedgenerate_jwt
    • First observedget_account_info
    • First observedget_analytics
    • First observedget_facebook_pages
    • First observedget_ffmpeg_consumption
    • First observedget_ffmpeg_job
    • First observedget_google_business_locations
    • First observedget_history
    • First observedget_job_status
    • First observedget_linkedin_pages
    • First observedget_media
    • First observedget_media_upload
    • First observedget_pinterest_boards
    • First observedget_platform_metrics
    • First observedget_post_analytics
    • First observedget_post_comments
    • First observedget_queue_settings
    • First observedget_reddit_detailed_posts
    • First observedget_status
    • First observedget_total_impressions
    • First observedlist_dm_conversations
    • First observedlist_scheduled
    • First observedlist_users
    • First observedmanage_autodms
    • First observedopen_upload_studio
    • First observedpreview_queue
    • First observedpublic_reply_to_comment
    • First observedreply_to_comment
    • First observedsend_dm
    • First observedsubmit_ffmpeg_job
    • First observedupdate_queue_settings
    • First observedupload_document
    • First observedupload_photos
    • First observedupload_text
    • First observedupload_video
    • First observedvalidate_jwt

TDQS

B3.3/5.0

Scored across 72 tools

Disambiguation2/5

The set has many useful distinctions, but the comment and AutoDM areas overlap heavily: comment_action duplicates hide_comment, like_comment, pin_comment, approve_comment/ignore_comment, and hold_comment; manage_autodms duplicates start_autodm, list_autodms, pause/resume/stop/delete_autodm, and get_autodm_logs. An agent can easily choose the wrong tool for a comment or monitor action.

Naming Consistency3/5

Most names are snake_case and action-oriented, but the conventions are mixed: get_*, upload_*, create_*, manage_*, start_/stop_/pause_/resume_*, platform-prefixed tiktok_* tools, and some noun-only names. It remains readable, but there is no single predictable verb_noun pattern.

Tool Count1/5

72 tools is an extreme surface for a social publishing API, and many tools duplicate broader multi-action tools. The count is not well-scoped: duplicate comment and AutoDM operations make the set bloated rather than earned tool by tool.

Completeness4/5

The surface is broad: publishing across media types, scheduling/queueing, analytics, comments, DMs, AutoDMs, media staging, FFmpeg jobs, profiles, and platform resources are covered. Some platform-specific operations are unavailable or documented as limitations, but the major lifecycle and workflows are present.

Maintenance

ActivityActive
ResponsivenessUnresponsive

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
    455 npm
    7
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Social media API and MCP server for AI agents that enables publishing to X, Instagram, LinkedIn, Reddit, Bluesky, and Threads from a single endpoint.
    100 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    MCP server to manage social media accounts from AI assistants, enabling post creation, scheduling, publishing, and media uploads across multiple platforms.
    13
    16 npm
    1
    MIT