Upload-Post
OfficialThe Upload-Post server enables AI agents to publish, schedule, analyze, and manage social media content across 15+ platforms via a single API key.
Publishing & Uploading
Upload videos, photos/carousels, text posts, and documents (PDF, PPT, DOCX for LinkedIn) to platforms including TikTok, Instagram, YouTube, LinkedIn, Facebook, Pinterest, Threads, Reddit, Bluesky, X, Google Business, Discord, Telegram, Mastodon, WordPress, and more.
Open Upload Studio — a browser-based UI for staging and publishing locally attached video files (useful in ChatGPT/Claude).
Scheduling & Queue
Schedule posts for future publication, list/edit/cancel scheduled posts.
Configure queue settings (slots, timezone, days of week, max posts per slot) and preview upcoming queue slots.
Status & History
Poll async upload status by
request_idand scheduled job status byjob_id.Browse paginated upload history and retrieve recent media from connected accounts.
Analytics
Get aggregated profile analytics (followers, views, engagement), total impressions for date ranges, per-post analytics, and a reference of available platform metrics.
Media Staging
Create short-lived upload URLs for direct browser PUT, then complete or delete staged uploads.
FFmpeg Video Processing
Submit FFmpeg jobs for trimming, transcoding, watermarking, and thumbnail extraction; poll job status, download results, and check monthly quota usage.
User & Profile Management
Validate API keys, list/create/delete Upload-Post profiles, and generate/validate JWTs for white-label social connection flows.
Platform-Specific Utilities
List connected Facebook Pages, LinkedIn Pages, Pinterest Boards, and Google Business locations; get detailed Reddit post metadata (subreddit/flair).
Comments & DMs
Get Instagram post comments, reply publicly or privately via DM, send direct messages, list DM conversations, and manage AutoDM monitors (start, stop, pause, resume, delete, view logs).
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 reviewed app in the ChatGPT app directory. Add Upload-Post in ChatGPT — or search for Upload-Post under Apps — click Connect and sign in with OAuth. No Developer mode, no MCP URL to paste, and you get the Upload Studio widget for publishing video files straight from your computer.
Prefer to wire it up by hand? Enable Developer mode in Settings → Apps → Advanced settings, click Create app, point it at https://mcp.upload-post.com/mcp and set authentication to OAuth.
Related MCP server: Outpost
Two ways to run it yourself
A) Local stdio (single-user) — simplest
The server runs on your machine, spawned by the MCP client. Add to ~/.claude/mcp.json (or Cursor settings, etc.):
{
"mcpServers": {
"upload-post": {
"command": "npx",
"args": ["-y", "@upload-post/mcp"],
"env": { "UPLOAD_POST_API_KEY": "YOUR_API_KEY" }
}
}
}Get your API key at https://app.upload-post.com → API Keys. Restart the client — you should see 58 upload-post tools.
B) Hosted HTTP (multi-tenant) — share one server with many users
Run the server on any Docker-capable host (Fly, Railway, Cloud Run, your own box…) and let each user connect with their own Upload-Post API key. The server stores nothing per user.
{
"mcpServers": {
"upload-post": {
"url": "https://mcp.your-domain.com/mcp",
"headers": {
"Authorization": "ApiKey YOUR_OWN_UPLOAD_POST_API_KEY"
}
}
}
}Authorization: Bearer <key> is also accepted, for clients that only allow Bearer.
What can the agent do?
The server exposes Upload-Post API tools plus one ChatGPT App UI launcher.
Group | Tools |
Upload |
|
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.comment_action— hide / unhide, like / unlike, pin / unpin a comment. Each value carries its own inverse, so nothing is permanent.postIdis required for hide and pin and must not be sent for like.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. Poll get_ffmpeg_job until completion, then call download_ffmpeg_result; it returns the result URL without streaming the processed binary through MCP.
ChatGPT video upload UI
open_upload_studio renders a ChatGPT Apps component for file-based video publishing. The widget creates a short-lived Upload-Post/R2 staging upload, PUTs the local video directly to R2, completes the upload, then calls upload_video with the returned temporary media URL.
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 | 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 files. It avoids local-path handoff issues by uploading to short-lived Upload-Post/R2 staging, then passing a temporary media URL toupload_video.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) — 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.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.
Report a security issue: info@upload-post.com (encrypted PGP available on request).
License
MIT © Upload-Post
Available Tools
57 toolscancel_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 commentAInspect
Moderate or react to a comment on one of the profile's own posts: hide it from other viewers, like it as the account, or pin it to the top. One endpoint for every network, chosen with platform; a network that cannot do it answers 400 platform_not_supported with the list of the ones that can. Every action carries its own inverse (hide/unhide, like/unlike, pin/unpin), so nothing here is permanent. postId is required for hide/unhide and pin/unpin, and must NOT be sent for like/unlike. 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.
| 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. | |
| postId | No | Post the comment belongs to (TikTok: the video id). Required for hide/unhide and pin/unpin; not used by like/unlike. | |
| platform | Yes | Social platform the comment lives on. | |
| commentId | Yes | Comment to act on (from get_post_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?
Annotations only mark readOnly=false and destructiveHint=false; the description adds meaningful behavioral disclosure: every action has an inverse so nothing is permanent, unsupported networks return 400 platform_not_supported, and TikTok capability must be present and reconnected if not granted. This is useful context that the annotations do not provide.
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?
Every sentence earns its place: first line summarizes purpose, then error behavior, inverses, parameter constraint, sibling separation, and the TikTok caveat. The structure is logical and front-loaded with the core action taxonomy.
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?
Despite the complexity (six actions, network-specific behavior, capability requirements), the description covers the error contract, inverse semantics, parameter constraints, TikTok special case, and sibling differentiation. The presence of an output schema means return-value documentation is not needed, so nothing important is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description reinforces and sharpens the postId constraint by saying it 'must NOT be sent' for like/unlike, which is stricter than the schema's 'not used.' It mostly restates the schema's parameter descriptions, so it adds only a moderate amount beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb phrase: 'Moderate or react to a comment' and enumerates the concrete actions (hide, like, pin), which clearly identifies the resource and scope. It also explicitly separates itself from delete_comment, so the agent can distinguish this tool from comment-management 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?
It states when to use it (actions on one of the profile's own posts) and explicitly names delete_comment as the different tool for deletion. It adds actionable conditions: postId is required for hide/unhide and pin/unpin and must NOT be sent for like/unlike, and TikTok requires the 'comments' capability, with a reconnect instruction. This goes beyond merely implying context.
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. 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 | 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. | |
| commentId | No | Reply to this comment. Required by Instagram. TikTok: pass it together with postId to reply inside a thread. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses a non-obvious operational requirement beyond the annotations: TikTok requires the 'comments' capability, it is granted at connection time, and older accounts must reconnect. This is exactly the type of behavioral context an agent needs and it does not contradict readOnlyHint=false or destructiveHint=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?
Every sentence earns its place: purpose, target exclusivity, per-platform rules, and auth prerequisite. The description is dense but well organized and contains 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?
Covers cross-platform variations, parameter relationships, and an authentication edge case. With an output schema present and annotations already indicating the safety profile, nothing essential is missing for an agent to invoke 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?
Even though the schema has 100% coverage, the description adds genuinely new meaning: exactly one of commentId/postId/postUrl must be chosen, Instagram only accepts replies, TikTok always requires postId, and postId+commentId can be combined for TikTok thread replies. This goes well beyond the bare schema definitions.
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 action ('Post') and clearly identifies two modes: top-level comments (via postId/postUrl) and replies (via commentId). Platform-specific notes further disambiguate it from sibling comment tools like 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?
Provides strong within-tool guidance: exactly one target parameter, Instagram's reply-only restriction, TikTok's postId requirement, and the TikTok capability prerequisite. However, it does not explicitly mention sibling alternatives such as reply_to_comment or comment_action, leaving the when-to-use-this-versus-that decision slightly implicit.
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_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. | |
| 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 mark destructiveHint=true and readOnlyHint=false, so the description adds useful context: the LinkedIn postId dependency, the TikTok capability requirement, and the fact that older connections must be reconnected. This goes beyond the annotations and informs the agent about potential failure 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?
The description is three concise sentences, front-loading the primary action and then efficiently addressing platform-specific requirements. No redundant wording; each sentence adds necessary 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?
The tool has an output schema, so return details are not needed. The description covers the main prerequisites (postId for LinkedIn, TikTok capability) and the need for reconnection. It is sufficiently complete for an agent to execute the deletion correctly, though it doesn't detail behavior for other platforms, which is likely fine.
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 clear per-parameter descriptions. The description adds value by explicitly clarifying that postId is only needed for LinkedIn and commentId is the core ID, reinforcing platform-specific usage and the TikTok capability prerequisite, which is not purely schema-level.
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 verb 'Delete' and resource 'comment' by `commentId`. It distinguishes from sibling tools like get_post_comments, reply_to_comment, and create_comment by focusing on deletion. The platform-specific nuance is highlighted, making it 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 operational context (e.g., LinkedIn requires postId, TikTok requires a capability) but does not explicitly state when to use this tool vs. alternatives or mention exclusions. It implies usage by the nature of the action but lacks direct comparative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_media_uploadDelete media uploadADestructiveInspect
Internal/app staging helper. Delete a short-lived MCP staging media upload from R2. This does not delete scheduler durable copies created later by upload_video.
| Name | Required | Description | Default |
|---|---|---|---|
| uploadId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint=true, and the description adds valuable scope beyond that: it deletes only the short-lived R2 staging upload and leaves later scheduler copies intact. This precise what-gets-destroyed disclosure is exactly the kind of behavioral context agents need for a destructive 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?
Two tight sentences front-load the key context ('Internal/app staging helper') and state purpose plus a critical exclusion with no wasted words. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with an output schema, the description covers the essential context: what is deleted, where it comes from, and what is explicitly not deleted. An agent has enough information to decide whether to call it and what the uploadId refers to.
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 0% description coverage and only names uploadId as a string. The description's mention of deleting a media upload implies uploadId identifies that staging upload, but it does not explicitly explain where the ID comes from or any constraints. The single self-explanatory parameter softens the gap.
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: 'Delete a short-lived MCP staging media upload from R2.' It clearly distinguishes itself from siblings like upload_video by stating it does not delete scheduler durable copies. This makes the tool's purpose and scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context as an 'Internal/app staging helper' and explicitly states a when-not: it does not delete scheduler durable copies created later by upload_video. It does not name an alternative deletion tool for durable copies, so it stops short of fully explicit alternative routing.
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.
| 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?
The destructiveHint annotation is present, but the description adds meaningful behavior beyond it: deletion is permanent and also disconnects the profile's connected social accounts. This gives the agent a clearer picture of the side effects without relying on annotation defaults.
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 that contains no filler. Every word contributes: 'permanently' communicates irreversibility, 'delete a profile' states the purpose, and 'disconnect its socials' describes an important side effect.
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 destructive tool with an output schema, the description communicates the core action, irreversibility, and the social-disconnect side effect. It does not mention cascading data deletion or authorization requirements, but the tool is simple enough that this is still nearly 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 underdocumented parameters. It does not explain what 'username' refers to or what constraints or formats apply, leaving the agent with only the parameter name to infer 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?
The description states a specific action ('permanently delete') on a clear resource ('profile') and adds a distinguishing side effect ('disconnect its socials'). It is easily distinguished from siblings like delete_comment, unpublish_post, and delete_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?
The description does not say when to choose this tool over alternatives, nor does it mention any preconditions for deleting a user. When it should be used is only inferred from the tool name and purpose statement.
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 the download URL and metadata for a completed FFmpeg job without streaming the processed file through MCP.
| 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?
With readOnlyHint=true and destructiveHint=false already in annotations, the description only needs to add extra nuance. It does so by explaining that no streaming through MCP occurs, which is a meaningful behavioral trait beyond a simple read operation. It adds useful context without any contradictions.
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 explanatory sentence that leads with the core purpose, uses precise wording, and avoids extraneous details. It is efficient and well-structured for quick parsing.
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 is a simple read-only operation with one parameter and an output schema exists to describe the returned structure, the description covers the essential facts: what is being returned, for which kind of job, and its non-streaming behavior. The only minor gap is not clarifying any required preconditions (e.g., that job must have succeeded), but 'completed' mitigates this.
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%, so the description must compensate for the undocumented jobId param. It refers to a 'completed FFmpeg job', which strongly implies jobId is the job identifier, but it never explicitly names or formats the parameter. The description adds marginal meaning but not as explicitly as it could.
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 verb ('Returns'), the resource ('download URL and metadata for a completed FFmpeg job'), and adds a key differentiator: 'without streaming the processed file through MCP'. This distinguishes it from sibling tools like get_ffmpeg_job or submit_ffmpeg_job with no ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description specifies that the tool is for a 'completed' FFmpeg job, providing a clear prerequisite. It also hints at an alternative behavior by indicating it does not stream, but it stops short of explicitly naming sibling tools like get_ffmpeg_job or other streaming-oriented tools, so no clear 'when-not-to-use' is stated.
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
Reschedule a post: change date and/or timezone.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | ||
| timezone | No | ||
| scheduledDate | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Descriptions adds modest context beyond the destructiveHint annotation by saying exactly what changes (date and/or timezone). It does not describe side effects, whether existing values are overwritten, or how missing fields are handled, but the annotation already signals 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?
A single, front-loaded sentence states the action and the scope of the change with no filler. It is appropriately sized for a simple rescheduling tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, has an output schema, and has annotations that signal mutation, which reduces the description's burden. Still, the required jobId is not explained and no date/timezone format guidance is given, so an agent has to infer some important invocation 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?
The input schema has 0% description coverage, so the description must carry parameter meaning. It explains timezone and scheduledDate, but does not clarify jobId, which is the only required parameter, nor does it give format or constraint details for the date/timezone strings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Reschedule') and resource ('a post'), and narrows the scope to changing date and/or timezone. This clearly distinguishes it from siblings like cancel_scheduled and list_scheduled, even without naming 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 phrase 'Reschedule a post' implies when to use the tool: when an agent wants to change an existing scheduled post's date or timezone. However, it does not explicitly contrast with alternatives like cancel_scheduled or state any prerequisites, leaving usage guidance implied rather than explicit.
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 JWTAInspect
Generate a JWT + connection URL so an end-user can connect socials inside an embedded Upload-Post flow (white-label integration).
| 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?
Annotations provide only generic hints (not read-only, not destructive, not open-world). The description adds that the tool returns a JWT and connection URL and is used in an embedded flow, but doesn't disclose side effects such as token expiration, session creation, or whether it persists state. This is acceptable for a token-generation tool but leaves behavioral details to the agent's assumptions.
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 with no filler; the core action and purpose are front-loaded. It earns its place without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema and nested objects, the description is too thin for an 11-parameter tool with 18% coverage. It omits prerequisites (e.g., username), how to select platforms, or how the returned URL is used, so an agent would struggle to construct a correct call beyond the single required 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?
With only 18% schema description coverage, most parameters (username, platforms, redirectUrl, etc.) are undocumented in the schema, and the description adds no parameter-level meaning. It only hints at the high-level purpose (connecting socials), so the agent has no guidance for the many undefined parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Generate a JWT + connection URL') with a concrete resource and purpose (letting an end-user connect socials in an embedded Upload-Post flow). It clearly distinguishes this from sibling validate_jwt and upload_* tools by positioning it as token generation for a white-label integration.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear intended-use context: it is for end-users connecting socials inside an embedded white-label Upload-Post flow. However, it doesn't explicitly contrast with validate_jwt or state when not to use it, leaving some routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_account_infoValidate API key & get accountARead-onlyInspect
Validate the current API key and return account information. Useful as a first call to confirm credentials 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 and destructiveHint=false, so the safety profile is covered. The description adds that it validates the current API key and returns account information, which is useful behavioral context 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 compact sentences: the first states what the tool does and the second gives its intended use. No filler or repetition; the most important action is 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 zero-parameter read-only tool with an output schema, the description fully covers when to invoke it and what it does. 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?
The tool has zero parameters白白留下,so there is no parameter detail to add. Baseline 3 applies because the description adds no hidden parameter behavior beyond what the empty schema already makes obvious.
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 plus outcome: 'Validate the current API key and return account information.' It clearly identifies the tool's function and differentiates it from sibling tools like validate_jwt or get_history by tying validation to the API key and account data.
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 recommends use as a first call before real work, giving clear contextual timing. It does not mention alternative tools or exclusion cases, but the use-case guidance is sufficient for a simple tool.
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_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_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 'completed', call download_ffmpeg_result to obtain the file.
| 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=falseikuha. The description adds that the job reaches a 'completed' status and that the result is fetched via a separate call, which is useful. It doesn't disclose potential edge cases (e.g., failure states, whether polling consumes resources), but for a simple read-only poller this is acceptable.
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. The main action is front-loaded and the follow-up action is included without 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?
For a one-parameter, read-only polling operation with an output schema, this is nearly complete. The only missing piece is the jobId source or format, but the schema and title carry that weight.
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% for the jobId parameter. The description never mentions jobId's format, origin, or how to obtain it. The name 'jobId' is self-evident, but the description adds no parameter-level value.
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 ('Poll') plus a specific resource ('FFmpeg job status'), and the title reinforces it. It distinguishes this tool from the generic sibling get_job_status by naming the exact domain (FFmpeg).
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 the status result and directs the caller to download_ffmpeg_result when status is 'completed'. However, it doesn't explain when to prefer this over generic alternatives like get_job_status, nor does it say how frequently to poll.
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 |
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 operation. The description adds the pagination behavior and cross-profile scope, but does not disclose ordering, return format, or any additional behavioral constraints beyond the schema's limit.
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 sentence with zero fluff. It efficiently states the core purpose and scope, making it easy for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even though an output schema exists, the description lacks details about the returned history entries, ordering, or pagination mechanics. It does not explain what fields are available or how to interpret the data, leaving significant gaps for a caller.
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 explain the page and limit parameters. It only mentions 'Paginated' without defining what page and limit mean, their defaults, or how they interact. This is minimal compensation for the lack of schema descriptions.
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 'Paginated history of uploads across all profiles' clearly states the verb (get history), resource (uploads), and scope (across all profiles). It distinguishes itself from sibling tools like get_media (specific media) and get_status (job status) without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as get_media or get_status. There is no mention of exclusions, prerequisites, or typical use cases beyond the bare statement of function.
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 and destructiveHint=false, so safety is covered. The description adds the full pagination contract (pagination field names, passing next_cursor back as cursor, and terminal conditions for the last page), which is the meaningful behavioral detail beyond the annotations. It does not mention rate limits or auth expectations, but it adds real value without contradicting 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?
Four sentences, each earning its place: the core operation and types, the platform scope and use case, and the compact pagination contract. It stays front-loaded and avoids repetition of the schema's parameter docs.
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 5 parameters, an output schema, and readOnly/destructive annotations protecting the safety domain, the description is nearly complete: it clarifies the tool's orientation and the only behavioral protocol agents must implement correctly (pagination). Per-platform caveats such as cursor failures on LinkedIn/Discord/Telegram are left to the schema, which is acceptable given the schema's high detail.
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 qualitative baseline is 3. The description adds value by enumerating supported platforms (the 'platform' param has no enum in the schema in the schema) and by explaining how cursor and pagination fit together, which helps agents use the cursor parameter correctly beyond the schema's own description.
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 the specific verb ('Retrieve'), the resource ('recent media from connected social accounts'), the content types (videos, photos, text posts), and the supported platforms. The phrase 'browsing what already exists... before posting more' clearly distinguishes it from the many upload/post/comment sibling tools, even without naming 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?
Provides a clear use-case ('browsing what already exists on a platform before posting more') that orients the agent against posting and media-upload siblings, and it gives explicit pagination steps. It doesn't explicitly state when not to use this tool or name preferred alternatives, 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.
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 analyticsARead-onlyInspect
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.
| 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 cover the read-only and non-destructive nature. The description adds value beyond annotations by disclosing that post_metrics is not a fixed shape, may differ by platform, and enumerates the TikTok-specific extras. This is above-average behavioral context, though it doesn't cover platform absence behavior or response edge cases.
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 first sentence front-loads the main purpose, and the second sentence expands on the non-standard output shape. The TikTok field list is long but relevant to prevent an agent from expecting a fixed schema; still, it could be tightened without losing that insight.
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 and annotations, the description covers the key non-obvious point: results differ per platform. It also gives a concrete example of the extra fields. It doesn't explain which platforms are supported or how the request_id originates, but those are not critical for invoking 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?
With 0% schema coverage, the description helps by identifying the single parameter as the post identifier. However, it writes the parameter as `request_id` while the schema expects `requestId`, which is a small but real invocation risk. It doesn't explain where to obtain the request ID, so the semantic help is partial.
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 the resource clearly: per-platform metrics for a specific post identified by a request ID. It distinguishes from general analytics by being post- and platform-specific, but it does not explicitly differentiate itself from close siblings like get_cached_post_analytics 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?
The implied usage is clear: call this when you need per-platform metrics for one post. However, there is no explicit when-not-to-use guidance or mention of alternatives, so the agent has to infer boundaries from the parameter and sibling list.
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. 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. | |
| 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?
Annotations already indicate readOnlyHint=true and destructiveHint=false, but the description adds substantial behavioral detail: pagination via `after`, a hard limit of 50 (with reasoning), platform-specific ID formats, the switch to replies with `commentId`, and the TikTok prerequisite (capability granted at connection, requiring reconnection). These disclose behavior not evident 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?
The description is moderately long but every sentence carries essential information: main purpose, platform handling, post identification, replies, and TikTok caveat. It is organized logically and avoids redundancy, though it could be slightly reorganized into clearer bullets for platform specifics. Overall, it is efficient without being 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?
Complete for a read-only, multi-platform comment-listing tool. The description covers platform quirks, capability prerequisites, pagination, replies, and limits. Combined with an output schema and annotations, an agent has everything needed to invoke it correctly across all supported networks.
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. The description adds valuable enrichment: platform-specific meanings for `postId` (YouTube=videoId, LinkedIn=post URN, TikTok=video id with no URL lookup), the role of `commentId`, and the rationale for `limit`. This goes beyond the schema, though some details are already present in the property descriptions.
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 the specific action ('List comments on a post'), the resource (comments), and clarifies it is a single endpoint for all networks via `platform`. It clearly distinguishes listing from comment manipulation tools (reply, create, delete) and from analytics tools by focusing on the read-only retrieval of comments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: to list comments use this tool; to get replies use the same tool with `commentId` (not another tool). It also covers platform-specific requirements (TikTok capability) and the fact that TikTok does not accept `postUrl`. Lacks an explicit 'when not to use this' compared to other read tools like `get_media` or `get_history`, but the comment-specific focus is clear.
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 postsCRead-onlyInspect
Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target. Recent Reddit posts published from a profile, with the platform-side metadata (subreddit, flair, score, …).
| 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 and destructiveHint=false, so the safety profile is covered. The description adds that posts come with platform-side metadata (subreddit, flair, score), which is useful, but it does not disclose pagination, ordering, or any limitations beyond that. 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 short but poorly structured. The first sentence about posting unavailability is a distraction that belongs in a separate operational note, not the tool description. The second part is a fragment lacking a clear verb, and the overall flow is disjointed.
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 tool with an output schema, the description still fails to clearly state its function. It leaves out an explicit statement of what it retrieves and does not explain the limit parameter. The unrelated warning further detracts from completeness. An agent could misinterpret the tool as related to publishing.
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% (profile is documented in schema, limit is not). The description adds a hint that posts are 'published from a profile,' which maps to the profile parameter, but it provides no explanation of the limit parameter or its default behavior. It does not adequately compensate for the missing schema description.
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 implies the tool returns recent Reddit posts from a profile with metadata, but it lacks an explicit verb and is framed as a noun fragment. The opening sentence about Reddit posting being unavailable is unrelated to this read tool and confuses the purpose. It does not distinguish the tool from siblings like get_history or 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?
No guidance on when to use this tool versus alternatives. The only directive, 'Do not use reddit as a publish target,' pertains to publishing, not fetching posts, and is irrelevant to this read operation. No context for choosing this over other get tools is provided.
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.
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. 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 |
|---|---|---|---|
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 openWorldHint=false, and the description reinforces a read-only list operation. It adds concrete detail about the response (connected social accounts, and a `capabilities` array with TikTok fields), which helps an agent predict output without over-explaining.
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 operation. The second sentence bundles a useful but somewhat long list of TikTok capability fields; still no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only list call, the description plus annotations cover the essentials: what is returned, and the safety profile. It doesn't mention pagination or the exact shape of the response object, but 'all' and the field list largely compensate.
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 no parametersasi input schema fully covers this. The description adds no parameter syntax or constraints, so a baseline score 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 ('List'), the resource ('Upload-Post profiles'), and the scope ('all in the account'), with a concrete note that connected social accounts are included. An agent can tell this from the many sibling tools without opening any schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case is implied – list all profiles in the account – but there is no explicit guidance about when to prefer this over siblings like get_account_info or get_media, nor any prerequisites or exclusion criteria. It is serviceable but not actively instructive.
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 Instagram AutoDM monitors. For action='start', provide post_url, reply_message, and profile_username. For stop/pause/resume/delete/logs, provide monitor_id. For status, optionally set include_inactive=true.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| buttons | No | For action='start': up to 3 web_url buttons ({ title, url }) added to each auto-DM. | |
| post_url | No | Instagram post URL to monitor. Required when action='start'. | |
| monitor_id | No | AutoDM monitor ID. Required for stop, pause, resume, delete, and logs. | |
| reply_message | No | DM text sent to matching commenters. Required when action='start'. | |
| 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 receive a DM. | |
| monitoring_interval | No | Polling interval in minutes for action='start'. Minimum is 15. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructiveHint=true slash readOnlyHint=false, which suggests state-changing behavior, but the description does not contradict that. It adds value by specifying that some actions (delete) are destructive and others (pause, resume) are state changesholistic. It does not detail the response format, but output schema exists, and the annotations already signal non-read-only nature. However, it could have warned that 'delete' is irreversible, so it's not a full 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?
The description is compact and front-loaded with the main purpose. The action-to-parameter mapping is useful and in one sentence. It could be slightly more structured (e.g., bullet points) for scanning, but it is efficient 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 complexity (9 params, multiple actions, output schema exists), the description covers the critical action-parameter relationships. However, it omits information about the operation's side effects (e.g., whether starting a monitor immediately begins polling, or how logs are returned). It is adequate for basic usage but leaves gaps for an agent to infer.
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 high (89%), meaning most parameters already have descriptions. The tool description adds a small amount of value by mapping actions to required parametersholistically, but it largely restates what the schema already says. No new parameter semantics or examples are given, so this is a 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?
The description clearly identifies the tool as controlling Instagram AutoDM monitors and enumerates the possible actions. It differentiates from sibling tools by focusing on DM automation rather than post management or user management. However, it does not explicitly name a sibling to distinguish from, so it loses a point.
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 action-specific parameter requirements: for 'start' you need post_url, reply_message, profile_username; for stop/pause/resume/delete/logs you need monitor_id; for status you may set include_inactive. This is explicit and practical, guiding the agent directly on which parameters to supply for each action.
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 commentCDestructiveInspect
Post a public reply visible under the original Instagram comment.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | ||
| message | Yes | ||
| platform | No | Social platform. Only 'instagram' is currently supported. | |
| commentId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description says 'Post a public reply', which is a state-changing write operation, but the annotations declare readOnlyHint=true and destructiveHint=false. This is a direct contradiction: an agent could infer the tool is read-only while it actually publishes content.
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 compact, front-loaded sentence 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?
It omits the operation's write effects, required permissions, expected response, and how it differs from the sibling reply_to_comment. The contradiction with the read-only annotation leaves an agent with dangerously incomplete context.
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 low and the description adds little parameter meaning. It clarifies 'comment' context, but does not explain the critical 'user' parameter, what form the message takes, or the relationship between user and commentId.
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 action (post), a specific object (public reply), and placement (under the original Instagram comment). It is not explicitly contrasted with the sibling reply_to_comment, so it loses the top point.
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 choose this tool over siblings like reply_to_comment, nor any prerequisites such as authentication, comment ownership, or rate-limit considerations.
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).
| 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 |
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 destructive, side-effecting nature is known. The description adds the 7-day reply window constraint, which is useful behavioral context, but it doesn't describe other consequences like irreversibility or on-behalf-of behavior. With annotations carrying the safety signal, this is adequate.
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 concise sentence front-loads the core action and the time constraint. No redundant words or 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?
Despite having an output schema, the tool's call structure remains unclear because required parameter semantics are undocumented. Critically missing: the role of the 'user' parameter (e.g., Instagram username? comment author handle?), how 'commentId' relates to comments, and how to discover valid 'commentId' values via sibling tools like get_post_comments. A minimal description does not fully equip an agent 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 only 40%; 'buttons' and 'platform' are documented, but required params 'user', 'commentId', and 'message' have no descriptions. The description does not explain what 'user' means in this context, how to obtain 'commentId', or what content 'message' should contain, so agents are left to guess on critical inputs.
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.' The '7-day reply window' narrows context, and the title plus sibling names (public_reply_to_comment, send_dm) make the tool's unique purpose immediately distinguishable.
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 by specifying the 7-day reply window and implies the intended use is private replies rather than public ones. However, it does not explicitly mention alternative tools such as public_reply_to_comment or send_dm, nor does it say when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| 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. | |
| 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 already declare `destructiveHint` true and `readOnlyHint` false, signaling mutation. The description adds the create/update nature, which is consistent. It does not disclose extra behavioral details such as whether an existing reply is overwritten, permission requirements, or rate limits, but with annotations covering the safety profile, the description provides minimal added 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 a single, front-loaded sentence that states the action first, then gives the target specification. There is no filler or redundancy; every phrase contributes to clarity.
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 has an output schema and the schema documents all parameters with full coverage, the description covers the key usage nuance (review_name vs review_id+location_id). It lacks explicit prerequisites like required permissions or overwrite behavior, but the output schema likely captures the response. The description is adequate for a mutating tool with annotations.
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 each parameter is described in the schema. The description adds value by grouping `review_name` as a standalone option and `review_id` + `location_id` as an alternative, clarifying the mutual relationship and how to construct the resource path. This goes beyond the schema's individual field descriptions.
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 the specific action ('Create or update the owner reply') and targets a specific resource ('a Google Business review'). It clearly distinguishes from sibling tools by naming the platform and the owner-reply nature, making its purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains how to specify the target via either `review_name` or `review_id` + `location_id`, which is useful. However, it does not explicitly state when to use this tool versus alternatives like `reply_to_comment` or `public_reply_to_comment`, leaving the condition to the agent's inference. The usage guidance is implied but not explicitly contrasted with siblings.
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.
| 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. | |
| 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 already declare destructiveHint=true and readOnlyHint=false, so the agent knows this is a mutating, potentially destructive action. The description adds the prerequisite of a connected Upload-Post profile and the source of recipient_id, but does not disclose other behavioral traits such as delivery semantics, rate limits, or irreversibility. Given the annotations cover the safety profile, the description adds some value but remains limited.
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 concise sentences, perfectly front-loaded with the primary action and resource, followed by the key prerequisite. There is no fluff or repetition of schema details. Every word adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple send operation with a full input schema and an existing output schema, the description covers the essential context: what it does, the required connection, and how to get the recipient. It does not elaborate on edge cases or error conditions, but for this tool's simplicity and the presence of annotations covering safety, it is complete enough.
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 each parameter is already documented. The description adds meaningful guidance on how to obtain recipient_id (from comments or DM tools) and implies that user should be a connected profile, but this is marginal over the schema. For a well-covered schema, baseline is 3, and the extra note is helpful but not comprehensive enough to raise the score.
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 ('Send an Instagram DM'), the resource (recipient), and the context ('from a connected Upload-Post profile'). It also specifies how to obtain the critical recipient_id, making the tool's purpose immediate and unambiguous. There is no sibling that sends DMs, so it is easily distinguished.
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 the prerequisite for the recipient_id ('returned by Instagram comments or DM conversation tools'), which is necessary for correct usage. However, it does not explicitly say when to use this tool instead of alternatives like reply_to_comment or manage_autodms, nor does it mention any exclusions or conditions. The usage context is implied but not fully explicit.
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
Submit a private FFmpeg processing job through Upload-Post. Provide input_url for one input, or files for multiple public URLs. Optionally provide full_command beginning with ffmpeg for explicit trim/transcode/watermark/thumbnail commands. Returns a job_id you can poll with get_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 explicit command. Must start with `ffmpeg`; shell metacharacters are rejected by the API. | |
| 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?
Annotations already indicate a non-read-only, non-destructive operation. The description adds that the job is private, goes through Upload-Post, and returns a pollable `job_id`, but it does not disclose quota/consumption, authentication, or failure behavior. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler, front-loading the purpose before parameter guidance and return behavior. Every sentence contributes to the agent's ability to select and invoke the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the main choices (`input_url` vs `files`), optional command behavior, and the expected `job_id` polling flow, with full schema and output schema support. It could be stronger on the implicit requirement to supply either `input_url` or `files` and on consumption/quota context, but those are minor gaps.
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 adds useful mapping: `input_url` for a single source, `files` for multiple sources, and `full_command` for explicit editing operations, though it omits `output_filename` and partly repeats 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?
States a specific verb ('Submit'), a specific resource ('FFmpeg processing job'), and the mechanism ('through Upload-Post'). It clearly distinguishes itself from sibling polling, download, and consumption tools like 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?
Provides clear context for when to use `input_url` vs `files` and notes that `full_command` is optional for explicit trim/transcode/watermark/thumbnail operations. It references `get_ffmpeg_job` for polling, though it does not explicitly enumerate alternatives or exclusions.
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. Instagram and TikTok are not supported.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Upload-Post profile name. | |
| postId | Yes | Platform post ID to delete. | |
| platform | Yes | Social platform. One of facebook, youtube, x, linkedin, threads. Instagram and TikTok are unsupported. |
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 adds the platform limitation (Instagram/TikTok unsupported) which is beyond the annotation. This is useful behavioral context, and there is no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no redundancy. It front-loads the main action and then states a key constraint, making it efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple delete operation with a full schema and output schema, the description is adequate. It could mention permanence, but destructiveHint already conveys that. The platform constraint is the key additional context, and it's provided.
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 all three parameters are well-documented in the schema. The description adds no new parameter-specific semantics beyond what's already in the schema, so a baseline score 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 clearly states the tool deletes a published post, using a specific verb and resource. It distinguishes itself from siblings by specifying it applies only to already-published posts, and the platform restriction further differentiates it from other operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage for published posts and explicitly lists unsupported platforms, giving clear context. While it doesn't name alternatives like cancel_scheduled for scheduled posts, the phrase 'already published' effectively guides the agent to use this only for live posts.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | ||
| title | Yes | ||
| timezone | No | IANA timezone for scheduled date, e.g. 'Europe/Madrid'. | |
| 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 already declare readOnlyHint=false and destructiveHint=false, so the agent knows this is a safe write operation. The description adds no additional behavioral context beyond 'Publish' – it doesn't mention asynchronous behavior, queue interaction, scheduling, or side effects like overwriting. Given that annotations cover the safety profile, a score of 3 is appropriate; the description adds minimal value beyond the structured metadata.
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 sentence that front-loads the core action and resource. Every word serves a purpose: 'Publish' sets the verb, 'document' and the format list define the resource, and 'Title is required' highlights a critical constraint. There is zero redundancy or filler, making it exceptionally concise and well-structured.
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 11 parameters and low schema coverage, the description is notably sparse. It does not explain optional parameters such as scheduling, queue insertion, visibility, or page targeting. While an output schema exists (which may document return values), the description fails to provide essential usage context for a complex publishing tool. The agent would need to infer too much from parameter names alone.
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 36%, which is low, so the description should compensate. It does add value by enumerating supported file formats for documentPathOrUrl, which is not in the schema. However, it does not explain any of the other 8 optional parameters (e.g., scheduledDate, addToQueue, linkedinVisibility, targetLinkedinPageId). The description only partially offsets the schema gap, so a 3 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 clearly states a specific verb ('Publish'), a resource ('document'), the target platform ('LinkedIn'), and lists supported formats (PDF/PPT/PPTX/DOC/DOCX). This distinguishes it from sibling tools like upload_video, upload_text, and upload_photos, which handle other media types. The purpose is unambiguous and operationally specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: this tool publishes documents to LinkedIn. However, it does not explicitly state when to use this tool instead of alternatives, nor does it mention exclusions or prerequisites beyond 'Title is required'. While the sibling names imply a division of labor, the description leaves the selection logic to inference.
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). Each item in photosPathsOrUrls may be a public URL or a local path. 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 |
|---|---|---|---|
| user | Yes | ||
| title | No | ||
| altText | No | ||
| timezone | No | IANA timezone for scheduled date, e.g. 'Europe/Madrid'. | |
| platforms | Yes | 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. | |
| addToQueue | No | Insert into the user's posting queue instead of publishing now. | |
| asyncUpload | No | Return immediately with request_id (default true). | |
| description | No | ||
| 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. | |
| 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. Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target. | |
| photosPathsOrUrls | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the operation is a write (readOnlyHint=false) and non-destructive (destructiveHint=false). The description adds a useful operative constraint about Reddit unavailability, but it does not disclose async behavior, queueing side effects, or whether request_id is returned. These are left to the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, followed by the key parameter nuance, and ends with the critical availability warning. The Reddit warning is slightly wordy and repeated in the schema, but the description remains compact and well-ordered.
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 high parameter count, the description covers the essential calling information: what is published, what input form is accepted, and which platform must be avoided. Since an output schema exists, return-value detail is not required from the description. It still omits explicit routing among sibling publish tools, but the schema and title cover most invocation 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?
The description adds real value beyond the schema by explaining that each item in `photosPathsOrUrls` may be a public URL or a local path, and that multiple items form a carousel. This directly clarifies the primary input beyond the schema's bare array-of-strings definition. Remaining parameters rely on their own schema descriptions.
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: 'Publish one or more photos (single image or carousel)'. It clearly distinguishes this tool from siblings such as upload_video, upload_text, and upload_document by content type, and the 'single image or carousel' detail adds precise 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?
The description implies appropriate use through 'Publish one or more photos' and the sibling tool names, but it never explicitly says 'use upload_video for videos' or names alternative tools. The only explicit guidance is the reddit exclusion, which is a platform constraint rather than tool-selection guidance.
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. 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 |
|---|---|---|---|
| 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'. | |
| platforms | Yes | 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. | |
| 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. Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a write operation that is not destructive, lowering the bar. The description adds useful operational context: the Reddit outage and error_code, and that link previews work only 'where supported'. However, it does not disclose behaviors like asyncReturn default, queue insertion, or silent ignoring of unsupported platformOptions keys, though some of these appear in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose, and no filler. The Reddit warning is prominently placed and repeated only where needed in the supporting schema. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the large schema, nested platformOptions object, and existing output schema, the description is sufficiently complete as an orientation layer. It covers the primary limitation (Reddit) and the distinguishing trait (text-only). It leaves queue/scheduling mechanics to the schema, which is acceptable given the schema's own detailed descriptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80%, so the schema already documents most parameters. The description adds a useful generalization about `linkUrl` and platform-specific `*LinkUrl` variants, but it does not clarify the required `user` parameter or `maxPostsPerSlot`, and the added value over the schema is modest.
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-resource pair: 'Publish a text-only post.' This clearly differentiates it from media-oriented siblings like upload_photos and upload_video, and the 'text-only' qualifier removes ambiguity without requiring the agent to inspect 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 gives clear context: this tool is for text-only posts, and it names an explicit exclusion ('Do not use reddit as a publish target') with a concrete reason. It does not name alternative tools for media posts or scheduling, but the core when/when-not guidance is present and actionable.
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.). Reddit posting is currently unavailable (error_code=reddit_unavailable) until the Reddit app is restored. Do not use reddit as a publish target. 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.
| 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'. | |
| platforms | Yes | 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. | |
| addToQueue | No | Insert into the user's posting queue instead of publishing now. | |
| asyncUpload | No | Return immediately with request_id (default true). | |
| description | No | ||
| 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). | |
| 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. | |
| 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?
Beyond annotations (readOnlyHint=false, openWorldHint=true), the description discloses the asynchronous return (request_id to poll with get_status), the reddit_unavailable error, the 24-hour deletion of staged media, and the limitation of hosted servers regarding local file access. This is rich behavioral context that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured, starting with the core purpose, then input options, then caveats, and a numbered staging workflow. Each sentence provides necessary information and the length is justified by the tool's complexity. It is front-loaded with the primary action.
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 14 parameters and a nested platformOptions object, the description covers the essential flows: how to provide the video, how to handle local files, the return mechanism, and the reddit restriction. The output schema exists, so return values are already documented. 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 86%, so the schema carries most parameter documentation. The description adds meaningful value for the two main input methods (videoPathOrUrl and videoBase64) with constraints and use cases, and explains the staging workflow. It does not repeat all parameter details, but the added context is substantial beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Publish a video to one or more platforms.' This clearly distinguishes it from sibling tools like upload_photos and upload_text, and the mention of per-platform overrides adds clarity. No ambiguity 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 concrete conditions for choosing videoPathOrUrl vs videoBase64, explains the staging workflow for local files, and explicitly warns not to use reddit as a target. It doesn't explicitly compare with other upload tools, but the purpose is self-evident and the guidance is actionable.
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. Dates show when Glama detected each change.
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 57 tools
Most tools are distinct, but there are several overlapping pairs: get_status vs get_job_status, get_analytics vs get_post_analytics vs get_cached_post_analytics vs get_total_impressions, and reply_to_comment vs public_reply_to_comment vs create_comment vs send_dm. The descriptions help, but an agent could easily pick the wrong analytics or comment tool.
The set mostly follows a verb_noun pattern (upload_photos, list_scheduled, get_analytics, delete_comment, cancel_scheduled). Minor deviations exist: tiktok_music_trending and tiktok_music_search are noun-first rather than verb-first, and get_google_business_locations is a bit verbose, but the overall pattern is consistent and readable.
57 tools is a very large surface for a single MCP server. While the domain is broad (publishing, scheduling, analytics, comments, DMs, FFmpeg processing, user management), the count is heavy and includes internal/app staging helpers (get_media_upload, delete_media_upload) that add clutter. The scope could be split into separate servers.
The publishing lifecycle is well covered: create, schedule, retry, status, history, cancel, edit, unpublish. Analytics, comments, DMs, and queue management are also present. Minor gaps exist: no tool to update a published post, no tool to list failed uploads specifically, and Reddit is explicitly unavailable, but the core workflows are complete.
Maintenance
Related MCP Connectors
MCP server for QPost — lets AI agents publish video and image posts to YouTube, TikTok, Instagram.
Connect any AI agent to 11+ social platforms: schedule, publish & track posts via hosted MCP.
Schedule and publish social posts across 9 platforms (Instagram, LinkedIn, X, TikTok, Facebook, Threads, Pinterest, Bluesky, Mastodon) straight from Claude, ChatGPT, Cursor, or any MCP client. Create, edit, and reschedule posts, upload media, and pull account and post analytics, follower demographics, and best-time windows. 20 tools, free on every plan.
- MysocialOAuthio.mysocial
Social media MCP server: your Instagram, TikTok, YouTube, LinkedIn and Threads history for your AI.
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.114185MIT
- AlicenseNot gradedqualityDmaintenanceSocial media API and MCP server for AI agents that enables publishing to X, Instagram, LinkedIn, Reddit, Bluesky, and Threads from a single endpoint.28MIT
- AlicenseAqualityBmaintenanceA local MCP server that lets Claude post to social media via upload-post.com — text, photos, and videos across 13 platforms.17MIT
- AlicenseAqualityBmaintenanceMCP server to manage social media accounts from AI assistants, enabling post creation, scheduling, publishing, and media uploads across multiple platforms.131931MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Upload-Post/upload-post-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server