Upload-Post
OfficialThe Upload-Post MCP server lets AI agents publish, schedule, analyze, and manage social media content and interactions across many platforms through the Upload-Post API.
Publish videos, photo carousels, text posts, and LinkedIn documents with per-platform overrides and optional scheduling or queuing.
Stage local media through create/complete media upload tools, then publish using the returned temporary media URL.
Check async upload status, scheduled job status, upload history, and recent media from connected accounts.
List, cancel, and edit scheduled posts; manage posting queue settings and preview upcoming queue slots.
Retrieve profile analytics, post analytics, cached post analytics, total impressions, platform metrics, audience insights, and hashtag/keyword suggestions.
Manage Upload-Post profiles/users, get account info, generate connection links, create/delete profiles, and generate/validate integration JWTs.
List connected Facebook pages, LinkedIn pages, Pinterest boards, Google Business locations/reviews, and Reddit post details.
Read, create, delete, reply to, hide, like, pin, edit, hold, approve, ignore, or configure comments across supported platforms.
Send Instagram DMs, list DM conversations, and start/manage/pause/resume/stop/delete AutoDM or comment auto-reply monitors.
Use TikTok-specific tools for trending/searchable music, location search, and publishing settings.
Submit FFmpeg processing jobs, poll job status, get result URLs, and check FFmpeg quota usage.
Retry failed uploads and unpublish/delete supported published posts.
Run locally over stdio with a single API key or as a hosted multi-tenant HTTP server where each user supplies their own Upload-Post API key.
Allows publishing, scheduling, analyzing, and managing posts on Bluesky.
Allows publishing, scheduling, analyzing, and managing posts on Discord, including sending DMs and managing conversations.
Allows publishing, scheduling, analyzing, and managing posts on Facebook, including managing Facebook pages.
Provides tools to submit FFmpeg video processing jobs, monitor their status, and download results.
Allows publishing, scheduling, analyzing, and managing posts on Instagram, including video and photo uploads.
Allows publishing, scheduling, analyzing, and managing posts on Pinterest, including managing boards.
Allows publishing, scheduling, analyzing, and managing posts on Reddit, including detailed post management.
Allows publishing, scheduling, analyzing, and managing posts on Telegram.
Allows publishing, scheduling, analyzing, and managing posts on Threads.
Allows publishing, scheduling, analyzing, and managing posts on TikTok, including video uploads.
Allows publishing, scheduling, analyzing, and managing videos on YouTube.
@upload-post/mcp
Official Model Context Protocol (MCP) server for Upload-Post.
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-postSDK 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-mcpTwo 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 |
|
Media staging |
|
Status |
|
Schedule |
|
Analytics |
|
Audience |
|
Users |
|
Pages/boards |
|
Posts |
|
Comments |
|
TikTok |
|
DMs |
|
FFmpeg |
|
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. Alsobenchmark_categories, and the niche averages to compare against whenbenchmarkCategoryis set. The server clamps the window to at most 60 days ending before today, so a wider range is trimmed rather than rejected, andrangein the response says which window was used.get_suggestions— hashtags (withview_count) or related keyword searches, told apart bytype, not by a different tool.get_post_comments— top-level comments on a post, or, withcommentId, 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_commenton X — links are removed unless the account is allowed links on X (reported inwarnings); a message that was only links fails with 400x_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 429x_daily_write_limitwithretry_afterand aRetry-Afterheader.hide_comment,like_comment,pin_comment,edit_comment,hold_comment,approve_comment,ignore_comment,set_post_comments— one tool per moderation operation.comment_actiondoes the same through a singleactionargument and stays available everywhere except ChatGPT, which only gets the one-operation tools (the same goes formanage_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_metricsis whatever the platform reports, so its shape varies: on TikTok it addsretention,impression_sources,audience_types,new_followers,reachand 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 8080Inspect the live tool surface with the official inspector:
npx @modelcontextprotocol/inspector node dist/index.jsConfiguration
Env var | Mode | Default | Description |
| stdio | — (required) | Single user's Upload-Post API key. Ignored in |
| both |
| Override for self-hosted / staging. |
| http |
| Port for |
| http |
| Largest |
| http |
| Check a pasted API key once against |
| http |
| How long an accepted key is trusted before it is checked again. |
| http |
| Live sessions kept in memory; past it the longest-idle one is closed. |
| http |
| Live sessions per credential; past it that credential's own longest-idle session is closed. |
| http |
| Idle time after which a session is closed. |
| http |
| 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. |
| http | Current Upload-Post challenge token | Optional override for ChatGPT Apps domain verification at |
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. RequiresAuthorization: ApiKey <key>(orBearer <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…):
Point the PaaS at this repo and select Dockerfile as the build pack.
Port: 8080 (matches
EXPOSE 8080).Environment variables: none are required. Optionally set
UPLOAD_POST_BASE_URLif you point at staging.Health check path:
/healthz(HTTP, port 8080).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
Authorizationheader the server returns401. 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_studiofor 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 toupload_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 toupload_url→complete_media_upload, then pass the returnedmedia_urltoupload_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
videoBase64toupload_videoinstead ofvideoPathOrUrl. The server writes it to a temp file, uploads, then deletes it. Inline bytes are capped atUPLOAD_POST_MAX_INLINE_MB(default 100 MB), and in--httpmode the whole request atUPLOAD_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
Authorizationheader, 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).
/mcprequires a validAuthorizationheader 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
Originheader 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 withOAUTH_EXTRA_ALLOWED_ORIGINS(comma-separated) when self-hosting behind a custom dashboard.OAuth metadata is served both at
/.well-known/oauth-protected-resourceand at the path-inserted form/.well-known/oauth-protected-resource/mcp(RFC 9728 §3.1), and likewise foroauth-authorization-server.In
--httpmode 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). SetUPLOAD_POST_MCP_ACCESS_LOG=allto log every request oroffto disable it.If ChatGPT shows
redirect_uri not on allow-listduring OAuth, add the exactredirect_urifrom the failing authorize request to the Upload-Post backend OAuth redirect allow-list. For ChatGPT clients this is typically onhttps://chatgpt.com/.../oauth/callbackorhttps://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 othermcp-remote-style clients. Platforms without a documented fixed callback (e.g. Grok, Le Chat production) are added on request.All tools declare MCP
readOnlyHint/destructiveHintannotations so clients can surface confirmation prompts for destructive operations, and the tools that publish or message people also require an explicitconfirmed: 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 toolsapprove_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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Upload-Post profile name. | |
| commentId | Yes | Pending reply to approve (from get_post_comments). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 postBDestructiveInspect
Cancel a scheduled post by its job_id.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 commentADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Upload-Post profile name. | |
| action | Yes | 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. | |
| postId | No | 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. | |
| message | No | Facebook `edit` only: the new comment text. | |
| platform | Yes | Social platform the comment lives on. | |
| banAuthor | No | YouTube `hide` only: also ban the comment's author from the channel. | |
| commentId | No | Comment to act on (from get_post_comments). Sent as `comment_id`. Required except Instagram enable_comments/disable_comments. | |
| confirmed | No | Set 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
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| uploadId | Yes | upload_id returned by create_media_upload. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 replyADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Upload-Post profile name. | |
| postId | No | Top-level comment on this post ID. LinkedIn: the post urn. TikTok: the video id, always required. | |
| message | Yes | Comment text to post. | |
| postUrl | No | Top-level comment on this post URL. | |
| platform | No | Social platform. One of instagram, facebook, youtube, linkedin, tiktok, x, threads, bluesky. | |
| commentId | No | Reply to this comment. Required by Instagram. TikTok: pass it together with postId to reply inside a thread. | |
| confirmed | No | Set 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
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| source | No | Optional source label identifying the calling client, e.g. mcp_studio. | |
| filename | Yes | Original filename, e.g. clip.mp4. | |
| mediaType | No | Kind of media being uploaded. | video |
| contentType | Yes | MIME type, e.g. video/mp4. | |
| contentLength | Yes | File size in bytes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 AutoDMADestructiveInspect
Permanently delete an AutoDM monitor with its stats and logs. Cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| monitor_id | Yes | AutoDM monitor ID (from list_autodms or start_autodm). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 commentADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Upload-Post profile name. | |
| postId | No | LinkedIn only: the post urn the comment belongs to. | |
| platform | No | Social platform. One of instagram, facebook, youtube, linkedin, tiktok, x, bluesky (Threads cannot delete comments). | |
| commentId | Yes | ID of the comment to delete. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 profileADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes | ||
| confirm_username | No | The profile name typed again by the user to confirm the deletion. Must equal `username`; otherwise nothing is deleted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 URLARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 commentADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Upload-Post profile name. | |
| message | Yes | The new comment text. | |
| commentId | Yes | Comment to act on (from get_post_comments). | |
| confirmed | No | Set 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
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 postADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | ||
| title | No | New title for every platform of the post. | |
| caption | No | New caption/description for every platform of the post. | |
| timezone | No | IANA timezone for scheduledDate. | |
| scheduledDate | No | New date, ISO 8601. | |
| platformContent | No | Per-platform text, keyed by platform (instagram, tiktok, youtube, facebook, linkedin, x, threads…). Only the platforms listed are changed. | |
| youtubePublishAt | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 JWTADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | Force the connection page language for this profile. When omitted, the page auto-detects the visitor's browser language and falls back to English. | |
| uiLabels | No | 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. | |
| username | Yes | ||
| logoImage | No | ||
| platforms | No | ||
| redirectUrl | No | ||
| connectTitle | No | ||
| showCalendar | No | ||
| readonlyCalendar | No | ||
| connectDescription | No | ||
| redirectButtonText | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 infoARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 analyticsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | No | Facebook page ID, if filtering by page. | |
| pageUrn | No | 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. | |
| platforms | No | ||
| profileUsername | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 insightsARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Upload-Post profile name. | |
| endDate | No | Last day of the window, ISO date. Sent as `end_date`. Clamped to before today: platforms have no data for the current day. | |
| platform | Yes | Which connected network answers the question. Any other value comes back as a 400 `platform_not_supported` listing the ones that do. | |
| startDate | No | First day of the window, ISO date, e.g. '2026-07-01'. Sent as `start_date`. | |
| benchmarkCategory | No | Compare 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
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 logsARead-onlyInspect
Read the activity log of one AutoDM monitor: comments seen and DMs sent or failed.
| Name | Required | Description | Default |
|---|---|---|---|
| monitor_id | Yes | AutoDM monitor ID (from list_autodms or start_autodm). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 analyticsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Profile username whose posts to read. | |
| limit | No | Posts per page. Defaults to 50, max 200. | |
| since | No | Start date, YYYY-MM-DD. Defaults to 30 days ago. | |
| until | No | End date, YYYY-MM-DD. Defaults to today. | |
| cursor | No | Opaque cursor from a previous response's `next_cursor`. | |
| platform | No | Restrict to one platform. Omit for all platforms. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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_connect_linkGet link to connect social accountsAInspect
Get the link the user opens to connect (or reconnect) social accounts such as TikTok, Instagram or YouTube. Use it when list_users shows no profile, or the platform the user wants is not connected or needs reconnecting. If the account has no profile yet, this creates one named "default" and returns a one-click link to connect accounts to it (valid 48 h); otherwise it returns the dashboard link. Give the user connect_url, ask them to tell you when they are done, then call list_users to confirm before publishing.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | Existing profile to connect the accounts to, if the user already has one. | |
| platforms | No | Platforms the user wants to connect, e.g. ['tiktok','instagram']. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses the hidden side effect of creating a 'default' profile when none exists (consistent with readOnlyHint=false), the 48-hour link validity, and the branch where an existing profile yields the dashboard link instead. Rate limits and auth requirements are not covered, keeping 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each doing distinct work: purpose, trigger conditions, branching behavior, and the post-call workflow. The purpose and the user-facing action are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no elaboration, yet the description still names the `connect_url` field the agent must surface. For a zero-required-parameter, side-effecting tool, nothing an agent needs to call it and act on the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented. The description adds only indirect meaning (that 'profile' refers to an existing profile and platforms examples), so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the link the user opens to connect (or reconnect) social accounts') with concrete platform examples. It is clearly distinct from sibling read tools like get_account_info or get_platform_metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the trigger conditions ('when list_users shows no profile, or the platform is not connected or needs reconnecting') and specifies the follow-up sequence (give connect_url, wait, call list_users to confirm before publishing). Alternatives and when-not are implied by the prerequisites.
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 pagesCRead-onlyInspect
Facebook pages connected to a profile.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 usageARead-onlyInspect
Monthly FFmpeg processing minutes used vs. plan allowance.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 statusARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 locationsBRead-onlyInspect
Google Business Profile locations the profile can post to.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 reviewsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Upload-Post profile name that owns the connected Google Business account. | |
| orderBy | No | e.g. 'updateTime desc' or 'rating desc'. | |
| pageSize | No | ||
| pageToken | No | ||
| location_id | No | Location, e.g. 'locations/123' or a full 'accounts/.../locations/...'. Defaults to the account's location. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 historyBRead-onlyInspect
Paginated history of uploads across all profiles.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 statusARead-onlyInspect
Check the status of a scheduled or queued upload by job_id. Use this for posts created with addToQueue or scheduledDate.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 pagesARead-onlyInspect
LinkedIn company pages connected to a profile.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 accountsARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| user | No | Profile username to scope the query to. | |
| limit | No | Items per page. Defaults to 25 and is clamped to 1-100. Per-platform caps: TikTok 20, YouTube 50, everything else 100. | |
| cursor | No | 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. | |
| page_urn | No | LinkedIn 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. | |
| platform | No | Restrict to a single platform key. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 uploadARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| uploadId | Yes | ||
| includeUrl | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 boardsCRead-onlyInspect
Pinterest boards available to a profile.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 metricsARead-onlyInspect
Reference: which metrics are available per platform (impressions, likes, …) and their human labels.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| requestId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 commentsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Upload-Post profile name. | |
| after | No | Pagination cursor returned by a previous call. | |
| limit | No | Comments to return (1-50; that ceiling is both Meta's and TikTok's). | |
| postId | No | Platform media/post ID. YouTube: the videoId. LinkedIn: the post urn. TikTok: the video id (required — TikTok has no URL lookup). | |
| postUrl | No | Public URL of the post. | |
| platform | No | Social platform. One of instagram, facebook, youtube, linkedin, tiktok, x, threads, bluesky. | |
| commentId | No | Return the replies under this comment instead of the post's top-level comments. Sent as `comment_id`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 settingsCRead-onlyInspect
Posting queue configuration (slots per day, time windows, timezone).
| Name | Required | Description | Default |
|---|---|---|---|
| profile_username | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 postsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| profile | Yes | Upload-Post profile name. Required by the API. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 statusARead-onlyInspect
Check the status of an async upload by request_id. Poll this until status is 'success' or 'failed'.
| Name | Required | Description | Default |
|---|---|---|---|
| requestId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 suggestionsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Seed word to get suggestions around, e.g. 'coffee recipe'. Without the '#'. | |
| type | Yes | Which suggestions to ask for: 'hashtags' (with view counts) or 'keywords' (related searches). | |
| user | Yes | Upload-Post profile name. | |
| language | No | Language code for the results, e.g. 'es' or 'en'. | |
| platform | Yes | Which connected network answers the question. Any other value comes back as a 400 `platform_not_supported` listing the ones that do. | |
| countryCode | No | ISO 3166-1 alpha-2 country to rank the suggestions for, e.g. 'ES' or 'US'. Sent as `country_code`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 impressionsBRead-onlyInspect
Sum of impressions for a profile from daily snapshots. Use period for presets, or startDate/endDate for custom ranges.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| period | No | ||
| endDate | No | ||
| metrics | No | ||
| breakdown | No | ||
| platforms | No | ||
| startDate | No | ||
| profileUsername | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 commentADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Upload-Post profile name. | |
| hidden | No | true hides the comment (default); false makes a hidden comment visible again. | |
| postId | No | Post the comment belongs to (TikTok: the video id; YouTube: the videoId). Required on TikTok and YouTube. | |
| platform | Yes | Social platform the comment lives on. | |
| banAuthor | No | YouTube only, when hiding: also ban the comment's author from the channel. | |
| commentId | Yes | Comment to act on (from get_post_comments). | |
| confirmed | No | Set 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
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 reviewADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Upload-Post profile name. | |
| postId | Yes | YouTube videoId the comment belongs to. | |
| commentId | Yes | Comment to act on (from get_post_comments). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 replyADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Upload-Post profile name. | |
| commentId | Yes | Pending reply to ignore (from get_post_comments). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Upload-Post profile name. | |
| liked | No | true likes the comment (default); false removes the like. | |
| platform | Yes | Social platform the comment lives on. | |
| commentId | Yes | Comment to act on (from get_post_comments). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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-repliesARead-onlyInspect
List the account's AutoDM and comment auto-reply monitors with their platform, state and counters. Active ones only, unless include_inactive is true.
| Name | Required | Description | Default |
|---|---|---|---|
| include_inactive | No | Also list stopped and expired monitors. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 conversationsCRead-onlyInspect
Recent DM conversations for a profile on a given platform.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | ||
| limit | No | ||
| platform | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 postsARead-onlyInspect
List all currently scheduled (not-yet-published) posts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 profilesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| platforms | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 monitoringADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| buttons | No | Instagram only, for action='start': up to 3 web_url buttons ({ title, url }) added to each auto-DM. | |
| post_id | No | 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. | |
| platform | No | 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. | |
| post_url | No | Post URL to monitor. Required on Instagram when action='start'. | |
| confirmed | No | Set to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent. | |
| monitor_id | No | AutoDM monitor ID. Required for stop, pause, resume, delete, and logs. | |
| reply_message | No | Text sent to matching commenters (a DM on Instagram, a public reply elsewhere). Required when action='start'. | |
| reply_messages | No | Public replies only: up to 5 alternative texts, rotated across comments so TikTok and YouTube do not see the same reply over and over. | |
| include_inactive | No | For action='status', include stopped and expired monitors when true. | |
| profile_username | No | Upload-Post profile name. Required when action='start'. | |
| trigger_keywords | No | Optional keyword or keywords; only comments containing these terms are answered (case and accents ignored). | |
| monitoring_interval | No | Minutes 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
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| monitor_id | Yes | AutoDM monitor ID (from list_autodms or start_autodm). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 commentADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Upload-Post profile name. | |
| pinned | No | true pins the comment (default); false unpins it. | |
| postId | Yes | TikTok video id the comment belongs to. | |
| commentId | Yes | Comment to act on (from get_post_comments). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 queueARead-onlyInspect
Preview the upcoming queue slots and what would land in them. Optionally nextSlot=true returns just the next available slot timestamp.
| Name | Required | Description | Default |
|---|---|---|---|
| nextSlot | No | ||
| profile_username | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 commentADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | ||
| message | Yes | ||
| platform | No | Social platform. Only 'instagram' is currently supported. | |
| commentId | Yes | ||
| confirmed | No | Set 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
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 commenterADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | ||
| buttons | No | Up to 3 web_url buttons rendered in the DM. Each item is { title, url }. | |
| message | Yes | ||
| platform | No | Social platform. Only 'instagram' is currently supported. | |
| commentId | Yes | ||
| confirmed | No | Set 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
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 reviewADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Upload-Post profile name that owns the connected Google Business account. | |
| comment | Yes | The reply text posted publicly under the review. | |
| confirmed | No | Set to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent. | |
| review_id | No | Review ID; requires location_id to build the resource path. | |
| location_id | No | Location for the review when using review_id. | |
| review_name | No | Full review resource path 'accounts/.../locations/.../reviews/{id}' (from get_google_business_reviews). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| monitor_id | Yes | AutoDM monitor ID (from list_autodms or start_autodm). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | No | Scheduled/queued job_id to retry. | |
| requestId | No | Async upload request_id to retry. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 messageADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Upload-Post profile name that owns the connected Instagram account. | |
| buttons | No | Up to 3 web_url buttons rendered in the DM. Each item is { title, url }. | |
| message | Yes | DM body to send. | |
| platform | Yes | DM platform. Currently only Instagram DMs are supported. | |
| confirmed | No | Set to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent. | |
| recipient_id | Yes | Instagram recipient/commenter ID. Required by the Upload-Post API. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 postADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Upload-Post profile name. | |
| postId | Yes | Instagram media id of the post. | |
| enabled | Yes | false turns comments off; true turns them back on. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| buttons | No | Instagram only: up to 3 web_url buttons ({ title, url }) added to each DM. | |
| post_id | No | 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. | |
| platform | No | 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. | |
| post_url | No | Post URL to watch. Required on Instagram; on the other networks post_id is preferred. | |
| confirmed | No | Set to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent. | |
| reply_message | Yes | Text sent to matching commenters: a DM on Instagram, a public reply elsewhere. | |
| reply_messages | No | Public replies only: up to 5 alternative texts, rotated across comments so TikTok and YouTube do not see the same reply over and over. | |
| profile_username | Yes | Upload-Post profile name that owns the connected account. | |
| trigger_keywords | No | Keyword or keywords; when set, only comments containing them are answered (case and accents ignored). | |
| monitoring_interval | No | Minutes between comment checks. Minimum is 15. Instagram and TikTok answer within seconds, so there it only paces a backup check. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 AutoDMADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| monitor_id | Yes | AutoDM monitor ID (from list_autodms or start_autodm). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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`.
| Name | Required | Description | Default |
|---|---|---|---|
| files | No | Public URLs of multiple input media files, when the job needs more than one source. | |
| input_url | No | Public URL of the input media. Use this for a single source file. | |
| full_command | No | 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. | |
| output_filename | No | Optional preferred output filename, e.g. clip.mp4 or thumbnail.jpg. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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_location_searchSearch TikTok locationsARead-onlyInspect
Search TikTok places to tag on a post. TikTok needs both parts, so pass the returned location_id as tiktokLocationId and location_name as tiktokLocationName in upload_video's platformOptions. Available on TikTok connections that declare the location capability (see capabilities on the TikTok account in list_users).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Place to search for, e.g. 'Madrid'. Max 100 characters. | |
| profile | Yes | Upload-Post profile name with a TikTok account connected. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal readOnlyHint=true and destructiveHint=false. The description adds non-obvious behavioral context: TikTok requires both parts, so the returned `location_id` and `location_name` must be passed as `tiktokLocationId` and `tiktokLocationName` in upload_video's platformOptions. It also discloses the capability precondition. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly written sentences: front-loaded purpose, a precise instruction for using the result, and a capability note. Every sentence carries distinct, necessary information with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, how to consume its output (via upload_video), and the availability precondition. With an output schema present and annotations covering read-only/non-destructive behavior, an agent has enough information to invoke the tool correctly. Minor omissions like result-set size or error cases are covered by structured data or are non-critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully documents both parameters: `query` includes example and max length, `profile` explains it must be an Upload-Post profile name with a TikTok account connected. The description adds no additional parameter-level detail beyond referencing how the result is consumed, so it meets the baseline for 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Search TikTok places to tag on a post.' It clearly differentiates the tool from sibling TikTok search tools like tiktok_music_search by focusing on location/place tagging, and 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: when you need a TikTok place to tag on a post, and it explicitly conditions usage on TikTok connections that declare the `location` capability, pointing to list_users for verification. It does not explicitly contrast with alternatives, but the specialized purpose makes the condition evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tiktok_music_searchSearch TikTok musicARead-onlyInspect
Find a TikTok Commercial Music Library track by song title or artist, to soundtrack a TikTok video. Pass the returned track id as tiktokMusicId in upload_video's platformOptions (not commercial_music_id, which TikTok rejects on public posts). IMPORTANT: TikTok has no music search endpoint, so this searches the trending charts Upload-Post caches per genre/country/period, NOT TikTok's whole catalogue — a song that is not trending in the chart you query will not be found; widening the search means trying another genre, country or period. Matching is case- and accent-insensitive and every word must match. Available on TikTok connections that declare the music capability (see capabilities on the TikTok account in list_users).
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Song title or artist to look for, e.g. 'bad bunny'. Omit to get the chart in trending order. | |
| genre | No | Genre filter, e.g. 'ALL' or 'POP'. Defaults to ALL. | |
| limit | No | Maximum tracks to return. Defaults to 50. | |
| profile | Yes | Upload-Post profile name with a TikTok account connected. | |
| dateRange | No | Chart window. Defaults to 7DAY. | |
| countryCode | No | ISO country code choosing WHICH country's chart is searched, e.g. 'US' or 'ES'. Defaults to US. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds substantial behavior beyond that: the fundamental limitation (searches cached trending charts, not the full catalogue), matching semantics (case- and accent-insensitive, every word must match), and the note that TikTok has no search endpoint. This is exactly the kind of non-obvious behavioral disclosure 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense (~200 words) but every sentence earns its place: purpose, downstream id usage, the critical catalogue limitation, matching rules, and capability prerequisite. The most important information is front-loaded and the critical caveat is prominently marked with 'IMPORTANT'. Slightly longer than minimal, but the complexity of the tool justifies the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters, an output schema, and safety annotations, the description covers the tricky parts: limitations, matching behavior, downstream integration, and prerequisites. The only minor gap is that the 'omit q to get the trending chart' behavior lives in the schema rather than the description, and the overlap with tiktok_music_trending is implied rather than addressed directly. This is nevertheless very complete for an agent to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value on top by explaining the chart-scoped semantics of genre/country/period interplay ("widening the search means trying another genre, country or period") and matching rules that qualify how q behaves. This is meaningful but modest compensation beyond an already well-documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: "Find a TikTok Commercial Music Library track by song title or artist, to soundtrack a TikTok video." It also distinguishes the tool from a naive search expectation by explicitly stating it does NOT search TikTok's whole catalogue, which separates it from sibling tools like tiktok_music_trending.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong usage context: how to pass the returned id downstream ("as tiktokMusicId in upload_video's platformOptions, not commercial_music_id"), how to widen a failed search ("trying another genre, country or period"), and the capability prerequisite ("declare the music capability"). It does not explicitly name the sibling alternative tiktok_music_trending or give a when-not-to-use statement, so it falls just 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.
tiktok_music_trendingList trending TikTok musicARead-onlyInspect
Trending tracks from the TikTok Commercial Music Library, to soundtrack a TikTok video. Pass the returned track id as tiktokMusicId in upload_video's platformOptions (not commercial_music_id, which TikTok rejects on public posts). Available on TikTok connections that declare the music capability (see capabilities on the TikTok account in list_users).
| Name | Required | Description | Default |
|---|---|---|---|
| genre | No | Genre filter, e.g. 'ALL' or 'POP'. Defaults to ALL. | |
| profile | Yes | Upload-Post profile name with a TikTok account connected. | |
| dateRange | No | Chart window. Defaults to 7DAY. | |
| countryCode | No | ISO country code, e.g. 'US' or 'ES'. Defaults to US. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true and destructiveHint=false, so the description doesn't need to restate safety. It adds valuable behavioral context about the required TikTok capability and the distinction between two ID fields that could cause errors. It doesn't contradict annotations. The slight deduction is because it doesn't mention any rate limits or pagination, but the description goes beyond the annotations sufficiently.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph that is concise and front-loaded with the core purpose (trending tracks to soundtrack a video), then provides essential integration details. Every sentence earns its place; there is no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is relatively simple (4 optional parameters, one required) and has a rich output schema (not shown but noted). The description covers the critical context: the purpose, the capability requirement, and the correct usage in a downstream tool. Nothing essential is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are documented in the schema. The description does not elaborate on parameters beyond the schema, but that is acceptable given the full coverage. The baseline of 3 applies. The description does add context about the returned id's usage, but that's not parameter-specific.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'lists trending tracks from the TikTok Commercial Music Library' with specific purpose (to soundtrack a TikTok video) and distinguishes it from the sibling tiktok_music_search by focusing on trending tracks rather than general search. The resource and action are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: it says to pass the returned track id as `tiktokMusicId` in upload_video's platformOptions and warns against using `commercial_music_id` because TikTok rejects it on public posts. It also states that the tool is available on TikTok connections that declare the `music` capability, and directs users to check `capabilities` in list_users. This makes when to use it and how to integrate with other tools clear.
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 settingsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | Yes | Upload-Post profile name with a TikTok account connected. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 postADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Upload-Post profile name. | |
| postId | Yes | Platform post ID to delete (Bluesky: the post AT-URI; Google Business: the full accounts/.../locations/.../localPosts/... name returned on upload). | |
| platform | Yes | Social platform the post lives on. | |
| confirmed | No | Set 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
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 settingsADestructiveInspect
Update posting queue configuration for a profile. Fields are flat, not nested: timezone, slots, days_of_week, and max_posts_per_slot.
| Name | Required | Description | Default |
|---|---|---|---|
| slots | No | Posting slots sorted by local time, e.g. [{hour: 10, minute: 0}, {hour: 16, minute: 0}]. | |
| timezone | No | IANA timezone, e.g. Europe/Madrid or America/New_York. | |
| days_of_week | No | Allowed posting days where 0=Monday and 6=Sunday. | |
| profile_username | Yes | Upload-Post profile name to update. | |
| max_posts_per_slot | No | Maximum posts allowed in the same queue slot. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | ||
| title | Yes | ||
| timezone | No | IANA timezone for scheduled date, e.g. 'Europe/Madrid'. | |
| confirmed | No | Set to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent. | |
| addToQueue | No | Insert into the user's posting queue instead of publishing now. | |
| asyncUpload | No | Return immediately with request_id (default true). | |
| description | No | ||
| scheduledDate | No | ISO 8601 date for scheduled publishing, e.g. '2026-12-25T10:00:00Z'. Omit for immediate post. | |
| maxPostsPerSlot | No | ||
| documentPathOrUrl | Yes | ||
| linkedinVisibility | No | ||
| targetLinkedinPageId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | ||
| title | No | ||
| altText | No | ||
| timezone | No | IANA timezone for scheduled date, e.g. 'Europe/Madrid'. | |
| confirmed | No | Set to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent. | |
| platforms | Yes | Required array of platform identifiers. | |
| addToQueue | No | Insert into the user's posting queue instead of publishing now. | |
| asyncUpload | No | Return immediately with request_id (default true). | |
| description | No | 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`. | |
| firstComment | No | 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. | |
| scheduledDate | No | ISO 8601 date for scheduled publishing, e.g. '2026-12-25T10:00:00Z'. Omit for immediate post. | |
| maxPostsPerSlot | No | ||
| platformOptions | No | 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. | |
| photosPathsOrUrls | Yes | Photo URLs (or same-machine local paths), in carousel order. Never `/mnt/data` or sandbox attachment paths. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | ||
| title | Yes | Post text / caption. | |
| linkUrl | No | Generic link preview URL (LinkedIn, Bluesky, Facebook). | |
| timezone | No | IANA timezone for scheduled date, e.g. 'Europe/Madrid'. | |
| confirmed | No | Set to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent. | |
| platforms | Yes | Required array of platform identifiers. | |
| addToQueue | No | Insert into the user's posting queue instead of publishing now. | |
| asyncUpload | No | Return immediately with request_id (default true). | |
| scheduledDate | No | ISO 8601 date for scheduled publishing, e.g. '2026-12-25T10:00:00Z'. Omit for immediate post. | |
| maxPostsPerSlot | No | ||
| platformOptions | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Profile name (Upload-Post user). | |
| title | No | Caption / title. | |
| timezone | No | IANA timezone for scheduled date, e.g. 'Europe/Madrid'. | |
| confirmed | No | Set to true only after the user has seen the preview this tool returns without it and approved it. Without it nothing is sent. | |
| platforms | Yes | Required array of platform identifiers, e.g. ['instagram']. Never pass a single string. | |
| addToQueue | No | Insert into the user's posting queue instead of publishing now. | |
| asyncUpload | No | Return immediately with request_id (default true). | |
| description | No | 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`. | |
| videoBase64 | No | 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. | |
| firstComment | No | 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. | |
| scheduledDate | No | ISO 8601 date for scheduled publishing, e.g. '2026-12-25T10:00:00Z'. Omit for immediate post. | |
| videoFilename | No | Optional filename (e.g. 'clip.mp4') used only to pick the temp file extension when videoBase64 is given. Defaults to .mp4. | |
| videoPathOrUrl | No | 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. | |
| maxPostsPerSlot | No | ||
| platformOptions | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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 JWTARead-onlyInspect
Verify a JWT previously issued by generate_jwt. The returned profile object echoes the connection page settings, including language and any ui_labels.
| Name | Required | Description | Default |
|---|---|---|---|
| jwt | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
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.
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.
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.
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.
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.
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.
34 tool updates
v0.17.2- Added
approve_comment - Changed
comment_action1 field changed- added
Input schema / properties / confirmedAdded 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" +}
- Changed
create_comment1 field changed- added
Input schema / properties / confirmedAdded 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" +}
- Added
delete_autodm - Removed
delete_media_upload - Changed
delete_user1 field changed- added
Input schema / properties / confirm_usernameAdded value: +{ + "description": "The profile name typed again by the user to confirm the deletion. Must equal `username`; otherwise nothing is deleted.", + "type": "string" +}
- Added
edit_comment - Changed
edit_scheduled1 field changed- added
Input schema / properties / youtubePublishAtAdded 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" + ] +}
- Added
get_autodm_logs - Added
get_connect_link - Changed
get_history2 fields changed- added
Input schema / properties / limit / descriptionAdded 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." - changed
Input schema / properties / limit / maximumPrevious value: -200New value: +100
- Added
hide_comment - Added
hold_comment - Added
ignore_comment - Added
like_comment - Added
list_autodms - Changed
list_users2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / platformsAdded 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" +}
- Changed
manage_autodms9 fields changed- changed
Input schema / properties / buttons / descriptionPrevious 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." - added
Input schema / properties / confirmedAdded 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" +} - changed
Input schema / properties / monitoring_interval / descriptionPrevious 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." - added
Input schema / properties / platformAdded 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" +} - added
Input schema / properties / post_idAdded 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" +} - changed
Input schema / properties / post_url / descriptionPrevious value: -"Instagram post URL to monitor. Required when action='start'."New value: +"Post URL to monitor. Required on Instagram when action='start'." - changed
Input schema / properties / reply_message / descriptionPrevious 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'." - added
Input schema / properties / reply_messagesAdded 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" +} - changed
Input schema / properties / trigger_keywords / descriptionPrevious 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)."
- Added
pause_autodm - Added
pin_comment - Changed
public_reply_to_comment1 field changed- added
Input schema / properties / confirmedAdded 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" +}
- Changed
reply_to_comment1 field changed- added
Input schema / properties / confirmedAdded 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" +}
- Changed
reply_to_google_business_review1 field changed- added
Input schema / properties / confirmedAdded 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" +}
- Added
resume_autodm - Changed
send_dm1 field changed- added
Input schema / properties / confirmedAdded 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" +}
- Added
set_post_comments - Added
start_autodm - Added
stop_autodm - Changed
submit_ffmpeg_job1 field changed- changed
Input schema / properties / full_command / descriptionPrevious 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."
- Changed
unpublish_post4 fields changed- added
Input schema / properties / confirmedAdded 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" +} - changed
Input schema / properties / platform / descriptionPrevious value: -"Social platform. One of facebook, youtube, x, linkedin, threads. Instagram and TikTok are unsupported."New value: +"Social platform the post lives on." - changed
Input schema / properties / platform / enumPrevious value: -[ - "facebook", - "youtube", - "x", - "linkedin", - "threads" -]New value: +[ + "facebook", + "youtube", + "x", + "linkedin", + "pinterest", + "bluesky", + "google_business" +] - changed
Input schema / properties / postId / descriptionPrevious 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)."
- Changed
upload_document1 field changed- added
Input schema / properties / confirmedAdded 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" +}
- Changed
upload_photos10 fields changed- added
Input schema / properties / confirmedAdded 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" +} - added
Input schema / properties / description / descriptionAdded 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`." - changed
Input schema / properties / firstComment / descriptionPrevious 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." - added
Input schema / properties / photosPathsOrUrls / descriptionAdded value: +"Photo URLs (or same-machine local paths), in carousel order. Never `/mnt/data` or sandbox attachment paths." - changed
Input schema / properties / platformOptions / descriptionPrevious 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." - changed
Input schema / properties / platformOptions / properties / redditFlairId / descriptionPrevious 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." - changed
Input schema / properties / platformOptions / properties / redditSubreddit / descriptionPrevious 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." - changed
Input schema / properties / platforms / descriptionPrevious 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." - changed
Input schema / properties / platforms / items / descriptionPrevious 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." - changed
Input schema / properties / platforms / items / enumPrevious 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" +]
- Changed
upload_text8 fields changed- added
Input schema / properties / confirmedAdded 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" +} - changed
Input schema / properties / platformOptions / descriptionPrevious 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." - changed
Input schema / properties / platformOptions / properties / redditFlairId / descriptionPrevious 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." - changed
Input schema / properties / platformOptions / properties / redditLinkUrl / descriptionPrevious 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." - changed
Input schema / properties / platformOptions / properties / redditSubreddit / descriptionPrevious 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." - changed
Input schema / properties / platforms / descriptionPrevious 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." - changed
Input schema / properties / platforms / items / descriptionPrevious 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." - changed
Input schema / properties / platforms / items / enumPrevious 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" +]
- Changed
upload_video7 fields changed- added
Input schema / properties / confirmedAdded 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" +} - added
Input schema / properties / description / descriptionAdded 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`." - changed
Input schema / properties / firstComment / descriptionPrevious 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." - changed
Input schema / properties / platforms / descriptionPrevious 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." - changed
Input schema / properties / platforms / items / descriptionPrevious 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." - changed
Input schema / properties / platforms / items / enumPrevious 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" +] - changed
Input schema / properties / videoBase64 / descriptionPrevious 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."
5 tool updates
v0.11.4- Changed
comment_action8 fields changed- changed
Input schema / properties / action / descriptionPrevious 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." - changed
Input schema / properties / action / enumPrevious value: -[ - "hide", - "unhide", - "like", - "unlike", - "pin", - "unpin" -]New value: +[ + "hide", + "unhide", + "like", + "unlike", + "pin", + "unpin", + "edit", + "hold", + "approve", + "ignore", + "enable_comments", + "disable_comments" +] - added
Input schema / properties / banAuthorAdded value: +{ + "description": "YouTube `hide` only: also ban the comment's author from the channel.", + "type": "boolean" +} - changed
Input schema / properties / commentId / descriptionPrevious 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." - added
Input schema / properties / messageAdded value: +{ + "description": "Facebook `edit` only: the new comment text.", + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "tiktok" -]New value: +[ + "tiktok", + "facebook", + "instagram", + "youtube", + "threads" +] - changed
Input schema / properties / postId / descriptionPrevious 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." - changed
Input schema / requiredPrevious value: -[ - "user", - "platform", - "commentId", - "action" -]New value: +[ + "user", + "platform", + "action" +]
- Changed
create_comment2 fields changed- changed
Input schema / properties / platform / descriptionPrevious value: -"Social platform. One of instagram, facebook, youtube, linkedin, tiktok."New value: +"Social platform. One of instagram, facebook, youtube, linkedin, tiktok, x, threads, bluesky." - changed
Input schema / properties / platform / enumPrevious value: -[ - "instagram", - "facebook", - "youtube", - "linkedin", - "tiktok" -]New value: +[ + "instagram", + "facebook", + "youtube", + "linkedin", + "tiktok", + "x", + "threads", + "bluesky" +]
- Changed
delete_comment2 fields changed- changed
Input schema / properties / platform / descriptionPrevious 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)." - changed
Input schema / properties / platform / enumPrevious value: -[ - "instagram", - "facebook", - "youtube", - "linkedin", - "tiktok" -]New value: +[ + "instagram", + "facebook", + "youtube", + "linkedin", + "tiktok", + "x", + "bluesky" +]
- Changed
edit_scheduled5 fields changed- added
Input schema / properties / captionAdded value: +{ + "description": "New caption/description for every platform of the post.", + "type": "string" +} - added
Input schema / properties / platformContentAdded 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" +} - added
Input schema / properties / scheduledDate / descriptionAdded value: +"New date, ISO 8601." - added
Input schema / properties / timezone / descriptionAdded value: +"IANA timezone for scheduledDate." - added
Input schema / properties / titleAdded value: +{ + "description": "New title for every platform of the post.", + "type": "string" +}
- Changed
get_post_comments2 fields changed- changed
Input schema / properties / platform / descriptionPrevious value: -"Social platform. One of instagram, facebook, youtube, linkedin, tiktok."New value: +"Social platform. One of instagram, facebook, youtube, linkedin, tiktok, x, threads, bluesky." - changed
Input schema / properties / platform / enumPrevious value: -[ - "instagram", - "facebook", - "youtube", - "linkedin", - "tiktok" -]New value: +[ + "instagram", + "facebook", + "youtube", + "linkedin", + "tiktok", + "x", + "threads", + "bluesky" +]
58 tool updates
v0.11.1- Changed
cancel_scheduled2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Added
comment_action - Changed
complete_media_upload2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
create_comment6 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - changed
Input schema / properties / commentId / descriptionPrevious 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." - changed
Input schema / properties / platform / descriptionPrevious value: -"Social platform. One of instagram, facebook, youtube, linkedin."New value: +"Social platform. One of instagram, facebook, youtube, linkedin, tiktok." - changed
Input schema / properties / platform / enumPrevious value: -[ - "instagram", - "facebook", - "youtube", - "linkedin" -]New value: +[ + "instagram", + "facebook", + "youtube", + "linkedin", + "tiktok" +] - changed
Input schema / properties / postId / descriptionPrevious 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." - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
create_media_upload3 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - changed
Input schema / properties / source / descriptionPrevious value: -"Optional source label, e.g. mcp_chatgpt or mcp_claude."New value: +"Optional source label identifying the calling client, e.g. mcp_studio." - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
create_user2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
delete_comment4 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - changed
Input schema / properties / platform / descriptionPrevious value: -"Social platform. One of instagram, facebook, youtube, linkedin."New value: +"Social platform. One of instagram, facebook, youtube, linkedin, tiktok." - changed
Input schema / properties / platform / enumPrevious value: -[ - "instagram", - "facebook", - "youtube", - "linkedin" -]New value: +[ + "instagram", + "facebook", + "youtube", + "linkedin", + "tiktok" +] - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
delete_media_upload2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
delete_user2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
download_ffmpeg_result2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
edit_scheduled2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
generate_jwt2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_account_info2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_analytics2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Added
get_audience - Changed
get_cached_post_analytics2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_facebook_pages2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_ffmpeg_consumption2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_ffmpeg_job2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_google_business_locations2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_google_business_reviews2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_history2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_job_status2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_linkedin_pages2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_media2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_media_upload2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_pinterest_boards2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_platform_metrics2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_post_analytics2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_post_comments7 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / commentIdAdded value: +{ + "description": "Return the replies under this comment instead of the post's top-level comments. Sent as `comment_id`.", + "type": "string" +} - changed
Input schema / properties / limit / descriptionPrevious 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)." - changed
Input schema / properties / platform / descriptionPrevious value: -"Social platform. One of instagram, facebook, youtube, linkedin. TikTok is unsupported."New value: +"Social platform. One of instagram, facebook, youtube, linkedin, tiktok." - changed
Input schema / properties / platform / enumPrevious value: -[ - "instagram", - "facebook", - "youtube", - "linkedin" -]New value: +[ + "instagram", + "facebook", + "youtube", + "linkedin", + "tiktok" +] - changed
Input schema / properties / postId / descriptionPrevious 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)." - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_queue_settings2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_reddit_detailed_posts2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_status2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Added
get_suggestions - Changed
get_total_impressions2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
list_dm_conversations2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
list_scheduled2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
list_users2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
manage_autodms2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Removed
open_upload_studio - Changed
preview_queue2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
public_reply_to_comment2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
reply_to_comment2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
reply_to_google_business_review2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
retry_post2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
send_dm2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
submit_ffmpeg_job2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Added
tiktok_location_search - Added
tiktok_music_search - Added
tiktok_music_trending - Added
tiktok_publishing_settings - Changed
unpublish_post2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
update_queue_settings2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
upload_document2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
upload_photos20 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / firstComment / descriptionAdded 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." - changed
Input schema / properties / platformOptions / descriptionPrevious 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." - changed
Input schema / properties / platformOptions / properties / redditFlairId / descriptionPrevious 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." - changed
Input schema / properties / platformOptions / properties / redditSubreddit / descriptionPrevious 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." - added
Input schema / properties / platformOptions / properties / replyToIdAdded 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" +} - added
Input schema / properties / platformOptions / properties / tiktokFirstCommentAdded 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" +} - added
Input schema / properties / platformOptions / properties / tiktokIsAiGeneratedAdded value: +{ + "description": "Disclose the photo post as AI-generated content.", + "type": "boolean" +} - added
Input schema / properties / platformOptions / properties / tiktokLocationIdAdded 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" +} - added
Input schema / properties / platformOptions / properties / tiktokLocationNameAdded value: +{ + "description": "Name of the tagged location, from tiktok_location_search. TikTok requires it whenever tiktokLocationId is set.", + "type": "string" +} - added
Input schema / properties / platformOptions / properties / tiktokMusicIdAdded 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" +} - changed
Input schema / properties / platformOptions / properties / tiktokPhotoCoverIndex / descriptionPrevious 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." - added
Input schema / properties / platformOptions / properties / tiktokPhotoCoverIndex / minimumAdded value: +0 - added
Input schema / properties / platformOptions / properties / tiktokPostModeAdded 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" +} - added
Input schema / properties / platformOptions / properties / tiktokPrivacyLevelAdded 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" +} - added
Input schema / properties / platformOptions / properties / tiktokUploadToDraftAdded 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" +} - added
Input schema / properties / platformOptions / properties / xReplyToIdAdded value: +{ + "description": "Alias of replyToId, scoped to X: the tweet ID to reply to.", + "type": "string" +} - added
Input schema / properties / platforms / descriptionAdded 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." - added
Input schema / properties / platforms / items / descriptionAdded 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." - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
upload_text11 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - changed
Input schema / properties / platformOptions / descriptionPrevious 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." - changed
Input schema / properties / platformOptions / properties / redditFlairId / descriptionPrevious 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." - changed
Input schema / properties / platformOptions / properties / redditLinkUrl / descriptionPrevious 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." - changed
Input schema / properties / platformOptions / properties / redditSubreddit / descriptionPrevious 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." - added
Input schema / properties / platformOptions / properties / replyToIdAdded 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" +} - added
Input schema / properties / platformOptions / properties / tiktokFirstCommentAdded 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" +} - added
Input schema / properties / platformOptions / properties / xReplyToIdAdded value: +{ + "description": "Alias of replyToId, scoped to X: the tweet ID to reply to.", + "type": "string" +} - added
Input schema / properties / platforms / descriptionAdded 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." - added
Input schema / properties / platforms / items / descriptionAdded 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." - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
upload_video22 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / firstComment / descriptionAdded 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." - changed
Input schema / properties / platformOptions / descriptionPrevious 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." - added
Input schema / properties / platformOptions / properties / replyToIdAdded 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" +} - added
Input schema / properties / platformOptions / properties / tiktokCoverImageUrlAdded value: +{ + "description": "Custom cover image URL. Takes priority over tiktokCoverTimestamp. Needs the `cover_image` capability (see tiktokMusicId).", + "type": "string" +} - added
Input schema / properties / platformOptions / properties / tiktokFirstCommentAdded 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" +} - added
Input schema / properties / platformOptions / properties / tiktokIsAiGeneratedAdded value: +{ + "description": "Disclose the video as AI-generated content.", + "type": "boolean" +} - added
Input schema / properties / platformOptions / properties / tiktokLocationIdAdded 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" +} - added
Input schema / properties / platformOptions / properties / tiktokLocationNameAdded value: +{ + "description": "Name of the tagged location, from tiktok_location_search. TikTok requires it whenever tiktokLocationId is set.", + "type": "string" +} - added
Input schema / properties / platformOptions / properties / tiktokMusicEndAdded value: +{ + "description": "End offset of the music track, in milliseconds.", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / platformOptions / properties / tiktokMusicIdAdded 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" +} - added
Input schema / properties / platformOptions / properties / tiktokMusicStartAdded value: +{ + "description": "Start offset of the music track, in milliseconds.", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / platformOptions / properties / tiktokMusicVolumeAdded value: +{ + "description": "Volume of the added music track, 0-100. Defaults to 50 when music is set.", + "maximum": 100, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / platformOptions / properties / tiktokOriginalSoundVolumeAdded 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" +} - changed
Input schema / properties / platformOptions / properties / tiktokPostMode / descriptionPrevious 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." - changed
Input schema / properties / platformOptions / properties / tiktokPrivacyLevel / descriptionPrevious 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." - added
Input schema / properties / platformOptions / properties / tiktokUploadToDraftAdded 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" +} - added
Input schema / properties / platformOptions / properties / xReplyToIdAdded value: +{ + "description": "Alias of replyToId, scoped to X: the tweet ID to reply to.", + "type": "string" +} - changed
Input schema / properties / platforms / descriptionPrevious 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." - added
Input schema / properties / platforms / items / descriptionAdded 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." - changed
Input schema / properties / videoPathOrUrl / descriptionPrevious 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." - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
validate_jwt2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
18 tool updates
v0.7.0- Added
create_comment - Added
delete_comment - Changed
generate_jwt2 fields changed- changed
Input schema / properties / language / enumPrevious value: -[ - "en", - "es", - "de", - "fr", - "pt" -]New value: +[ + "en", + "es", + "de", + "fr", + "pt", + "pl", + "tr" +] - added
Input schema / properties / uiLabelsAdded 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" +}
- Changed
get_analytics1 field changed- changed
Input schema / properties / pageUrn / descriptionPrevious 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."
- Added
get_cached_post_analytics - Added
get_google_business_reviews - Changed
get_media3 fields changed- added
Input schema / properties / cursorAdded 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" +} - added
Input schema / properties / limit / descriptionAdded value: +"Items per page. Defaults to 25 and is clamped to 1-100. Per-platform caps: TikTok 20, YouTube 50, everything else 100." - changed
Input schema / properties / limit / maximumPrevious value: -200New value: +100
- Changed
get_post_comments3 fields changed- changed
Input schema / properties / platform / descriptionPrevious value: -"Social platform. Only 'instagram' is currently supported."New value: +"Social platform. One of instagram, facebook, youtube, linkedin. TikTok is unsupported." - added
Input schema / properties / platform / enumAdded value: +[ + "instagram", + "facebook", + "youtube", + "linkedin" +] - changed
Input schema / properties / postId / descriptionPrevious value: -"Platform media/post ID."New value: +"Platform media/post ID. YouTube: the videoId. LinkedIn: the post urn."
- Changed
manage_autodms1 field changed- added
Input schema / properties / buttonsAdded 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" +}
- Changed
reply_to_comment1 field changed- added
Input schema / properties / buttonsAdded 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" +}
- Added
reply_to_google_business_review - Added
retry_post - Changed
send_dm1 field changed- added
Input schema / properties / buttonsAdded 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" +}
- Added
unpublish_post - Changed
upload_document4 fields changed- removed
Input schema / properties / autogenerateRemoved value: -{ - "description": "If true, AI generates native per-platform title/description from the media and fills any field left empty.", - "type": "boolean" -} - removed
Input schema / properties / autogenerateDescriptionRemoved value: -{ - "description": "Generate only the description with AI.", - "type": "boolean" -} - removed
Input schema / properties / autogenerateLanguageRemoved value: -{ - "description": "Force the AI output language (ISO code); omit to auto-detect from the media.", - "type": "string" -} - removed
Input schema / properties / autogenerateTitleRemoved value: -{ - "description": "Generate only the title with AI.", - "type": "boolean" -}
- Changed
upload_photos6 fields changed- removed
Input schema / properties / autogenerateRemoved value: -{ - "description": "If true, AI generates native per-platform title/description from the media and fills any field left empty.", - "type": "boolean" -} - removed
Input schema / properties / autogenerateDescriptionRemoved value: -{ - "description": "Generate only the description with AI.", - "type": "boolean" -} - removed
Input schema / properties / autogenerateLanguageRemoved value: -{ - "description": "Force the AI output language (ISO code); omit to auto-detect from the media.", - "type": "string" -} - removed
Input schema / properties / autogenerateTitleRemoved value: -{ - "description": "Generate only the title with AI.", - "type": "boolean" -} - added
Input schema / properties / platformOptions / properties / gbpMediaCategoryAdded 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" +} - added
Input schema / properties / platformOptions / properties / gbpPostTypeAdded 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" +}
- Changed
upload_text6 fields changed- removed
Input schema / properties / autogenerateRemoved value: -{ - "description": "If true, AI generates native per-platform title/description from the media and fills any field left empty.", - "type": "boolean" -} - removed
Input schema / properties / autogenerateDescriptionRemoved value: -{ - "description": "Generate only the description with AI.", - "type": "boolean" -} - removed
Input schema / properties / autogenerateLanguageRemoved value: -{ - "description": "Force the AI output language (ISO code); omit to auto-detect from the media.", - "type": "string" -} - removed
Input schema / properties / autogenerateTitleRemoved value: -{ - "description": "Generate only the title with AI.", - "type": "boolean" -} - added
Input schema / properties / platformOptions / properties / gbpMediaCategoryAdded 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" +} - added
Input schema / properties / platformOptions / properties / gbpPostTypeAdded 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" +}
- Changed
upload_video6 fields changed- removed
Input schema / properties / autogenerateRemoved value: -{ - "description": "If true, AI generates native per-platform title/description from the media and fills any field left empty.", - "type": "boolean" -} - removed
Input schema / properties / autogenerateDescriptionRemoved value: -{ - "description": "Generate only the description with AI.", - "type": "boolean" -} - removed
Input schema / properties / autogenerateLanguageRemoved value: -{ - "description": "Force the AI output language (ISO code); omit to auto-detect from the media.", - "type": "string" -} - removed
Input schema / properties / autogenerateTitleRemoved value: -{ - "description": "Generate only the title with AI.", - "type": "boolean" -} - added
Input schema / properties / platformOptions / properties / gbpMediaCategoryAdded 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" +} - added
Input schema / properties / platformOptions / properties / gbpPostTypeAdded 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" +}
4 tool updates
v0.5.0- Changed
open_upload_studio2 fields changed- changed
Input schema / properties / platforms / items / enumPrevious 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" +] - changed
Output schema / properties / platforms / items / enumPrevious 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" +]
- Changed
upload_photos1 field changed- changed
Input schema / properties / platforms / items / enumPrevious 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" +]
- Changed
upload_text1 field changed- changed
Input schema / properties / platforms / items / enumPrevious 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" +]
- Changed
upload_video1 field changed- changed
Input schema / properties / platforms / items / enumPrevious 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" +]
44 tool updates
v0.4.0- First observed
cancel_scheduled - First observed
complete_media_upload - First observed
create_media_upload - First observed
create_user - First observed
delete_media_upload - First observed
delete_user - First observed
download_ffmpeg_result - First observed
edit_scheduled - First observed
generate_jwt - First observed
get_account_info - First observed
get_analytics - First observed
get_facebook_pages - First observed
get_ffmpeg_consumption - First observed
get_ffmpeg_job - First observed
get_google_business_locations - First observed
get_history - First observed
get_job_status - First observed
get_linkedin_pages - First observed
get_media - First observed
get_media_upload - First observed
get_pinterest_boards - First observed
get_platform_metrics - First observed
get_post_analytics - First observed
get_post_comments - First observed
get_queue_settings - First observed
get_reddit_detailed_posts - First observed
get_status - First observed
get_total_impressions - First observed
list_dm_conversations - First observed
list_scheduled - First observed
list_users - First observed
manage_autodms - First observed
open_upload_studio - First observed
preview_queue - First observed
public_reply_to_comment - First observed
reply_to_comment - First observed
send_dm - First observed
submit_ffmpeg_job - First observed
update_queue_settings - First observed
upload_document - First observed
upload_photos - First observed
upload_text - First observed
upload_video - First observed
validate_jwt
TDQS
Scored across 72 tools
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.
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.
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.
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
Related MCP Connectors
Publish and schedule videos to TikTok, YouTube Shorts, Instagram, Facebook, LinkedIn, Pinterest, Bluesky, Threads and X from Claude, Cursor or any MCP client. Upload once, post everywhere, track views in unified analytics, and retry failed posts. Official platform APIs only, free plan available. Docs: https://docs.multi-upload-tool.com/mcp
MCP server for QPost — lets AI agents publish video and image posts to YouTube, TikTok, Instagram.
Agent-first social media publishing, scheduling, analytics, and unified inbox API + 16-tool MCP server across 18 social platforms (X, LinkedIn, Instagram, YouTube, TikTok, Threads, Bluesky, Reddit, Telegram, Discord, Mastodon, Facebook, Pinterest).
Connect any AI agent to 11+ social platforms: schedule, publish & track posts via hosted MCP.
Related MCP Servers
- AlicenseAqualityBmaintenanceSchedule and manage social media posts across 10 platforms (Instagram, Facebook, TikTok, X, LinkedIn, YouTube, Threads, Pinterest, Bluesky, Telegram) from any MCP-compatible AI assistant. Supports batch posting, media uploads, analytics, and platform-specific features like Reels, Shorts, and carousels.11455 npm7MIT
- AlicenseNot gradedqualityCmaintenanceSocial media API and MCP server for AI agents that enables publishing to X, Instagram, LinkedIn, Reddit, Bluesky, and Threads from a single endpoint.100 npmMIT
- AlicenseAqualityDmaintenanceA local MCP server that lets Claude post to social media via upload-post.com — text, photos, and videos across 13 platforms.17MIT
- AlicenseAqualityCmaintenanceMCP server to manage social media accounts from AI assistants, enabling post creation, scheduling, publishing, and media uploads across multiple platforms.1316 npm1MIT