OmniSocials
Server Details
Official OmniSocials MCP server — schedule and publish posts, stories, and reels across 11 platforms (Instagram, Facebook, LinkedIn, YouTube, TikTok, X, Pinterest, Bluesky, Threads, Mastodon, Google Business), plus media, analytics, hashtag sets, inbox, and webhooks.
- Status
- Healthy
- Uptime
- 14.8% over 38 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 50 tools
Most tools target distinct resource+action pairs, and descriptions carefully distinguish near-neighbors (create_post vs create_and_publish_post, publish_post vs retry_post, hide vs delete_inbox_comment). The main risk is the analytics cluster (get_analytics_overview, get_account_analytics, get_post_analytics, get_posts_analytics) where boundaries require reading descriptions, but they are ultimately separable.
Overwhelmingly consistent verb_noun snake_case (create_post, list_posts, update_post, delete_webhook, reply_to_inbox). A few compound/descriptive names like create_and_publish_post, check_media_compatibility, rotate_webhook_secret, get_next_unanswered deviate but stay readable and unambiguous.
50 tools is double the 25-tool heavy threshold, and the surface spans posts, media, analytics, inbox, approvals, hashtags and webhooks. While the platform's breadth justifies many tools, some clusters (6 webhook tools, 4 hashtag-set tools, 4 analytics tools) show redundancy that inflates the count beyond what an agent can easily navigate.
Coverage is very broad and deep: full post lifecycle (create/update/delete/publish/retry/approve/reject), media library with folders and compatibility checks, inbox read/reply/hide/delete, webhooks, hashtag sets and rich analytics. Minor gaps exist (no update_folder/delete_folder, approval workflows can only be listed not created), but core workflows are well covered.
Available Tools
50 toolsapprove_postADestructiveInspect
Approve the current step of a post's approval workflow. Only works on a post with approval_status 'pending' (post status in_approval) — check get_post first. IMPORTANT: only succeeds if the connected user is a listed approver for the workflow's CURRENT step (steps approve in order); a forbidden error means the user isn't an approver for this step yet — tell them who needs to approve instead, don't retry. If this is the last step, the post is finalized immediately (moves to scheduled or posting). If steps remain, the post stays in_approval and the next step's approvers are notified.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The post ID to approve (must have approval_status 'pending') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give the safety profile (readOnlyHint=false, destructiveHint=true, openWorldHint=true); the description adds substantial context beyond them: ordered step approval, the auth requirement that the user must be a listed approver for the CURRENT step, the meaning of a forbidden error, and the exact resulting state transitions. This goes well past what the structured fields convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: purpose first, then precondition, then auth/error semantics, then outcome. Every sentence carries operational weight, though the 'approval_status pending (post status in_approval)' phrasing and the id precondition are mildly redundant 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?
For a mutating workflow tool with no output schema, the description covers everything needed to call it correctly: precondition, prerequisite read, authorization rules, failure interpretation, and post-condition state changes. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single parameter whose schema description already states the 'pending' approval_status constraint, so the description's restatement of that constraint adds little. Baseline 3 is appropriate when the schema fully documents the parameter.
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 (approve) and resource (the current step of a post's approval workflow), and explicitly frames it as a step-wise action distinct from reject_post or publish_post. An agent can distinguish it from all siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit preconditions ('Only works on a post with approval_status pending'), a prerequisite action ('check get_post first'), and error handling guidance ('a forbidden error means the user isn't an approver for this step yet — tell them who needs to approve instead, don't retry'). This is textbook when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_media_compatibilityARead-onlyInspect
Check whether a video/image will be accepted by the platforms CONNECTED to this workspace, BEFORE uploading or posting. Use this when the user gives you a file (URL) so you can warn them upfront — e.g. "this 995 MB video won't post to Instagram (max 300 MB), continue?" — then confirm before uploading. Provide ONE of: a public 'url' (size/type read via HEAD), an existing 'media_id', or 'size_bytes' + 'mime'.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Public URL of the file to check. Use this OR media_id OR size_bytes+mime. | |
| mime | No | MIME type, e.g. 'video/mp4' (use with size_bytes). | |
| media_id | No | Id of an already-uploaded library item to check. | |
| size_bytes | No | File size in bytes (use with mime). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, destructiveHint=false. The description adds real value beyond them: it discloses how a URL is inspected (size/type read via HEAD) and gives a concrete expected output example. It does not cover error/unsupported-platform behavior, so 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?
Purpose is front-loaded in the first sentence, and the example and parameter rule follow logically. Slightly long with the quoted example, but each clause (the HEAD mechanism, the ONE-of rule) 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?
With no output schema, the description compensates by showing the shape of the warning ('won't post to Instagram (max 300 MB)') and covers all three input modes. Complete enough for a 0-required, 4-param read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds the real semantic constraint: 'Provide ONE of' url, media_id, or size_bytes + mime, i.e. the mutual-exclusion rule and the pairing of size_bytes with mime. This is meaning beyond the flat schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (check media compatibility) tightly scoped to 'platforms CONNECTED to this workspace' and to a pre-upload moment. It is clearly distinguishable from write-oriented siblings like upload_media and from list_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?
Explicitly says when to call it ('when the user gives you a file (URL) ... BEFORE uploading or posting') and what to do with the result ('warn them upfront ... then confirm before uploading'). The workflow placement relative to upload_media is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_and_publish_postADestructiveInspect
Create a new post and publish it immediately (no scheduling). Same media rules, channel IDs, and workspace selection rule as create_post apply (only one workspace → use it; multiple workspaces with no named one → ask first; named workspace → use and remember; mention workspace name on success). linkedin (personal profile) and linkedin_page (company page) are independent channels.
Pinterest board (auto-default to first board): If Pinterest is in channels and pinterest.board_id is NOT provided, do NOT block on asking — and do NOT skip Pinterest. Call get_account on the Pinterest account, take the FIRST board from the returned boards list, and pass its id as pinterest.board_id. In your reply, mention which board you used (e.g. "Published to your 'Marketing' board on Pinterest — let me know if you'd prefer a different one.") so the user can redirect. If the user named a specific board in the request, match it (case-insensitive) against the list and use that one instead.
X threads: For a chained X thread, pass x.thread_parts (2–25 { text } parts, each <= 280 chars). Do NOT split into "1/", "2/" inside content — that posts a single tweet, not a thread.
X posts containing a link use credits: X's API charges more for posts whose text contains a URL; OmniSocials passes that platform fee through as credits from the organisation's existing balance. Only a link written with http:// or https:// counts; a bare domain or www. link is free. Credits are only deducted once the post publishes successfully (a failed publish is never charged) — if the balance can't cover it at publish time, the X target alone fails and explains the shortfall while other platforms still publish. Relay any x_url_post_credits warning and X failure to the user; never strip their link to avoid the fee without asking. If the balance (minus credits reserved by scheduled X link posts) can't cover this post, the request is refused up front with a 402 x_credits_insufficient error instead of failing at publish — tell the user their X credit balance is too low for this post, don't retry.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | X (Twitter) options, including thread mode via `thread_parts`. | |
| type | No | ||
| tiktok | No | TikTok options | |
| bluesky | No | Bluesky options, including thread mode via `thread_parts`. | |
| content | Yes | Post caption. String or object with platform keys for per-channel captions: { "default": "fallback", "linkedin": "long", "threads": "short" }. Prefer one call per topic. | |
| threads | No | Threads options: thread mode via `thread_parts`, location tag via `location_id`. | |
| youtube | No | YouTube Shorts options. Only applies when type is 'reel' and youtube is among the selected channels. A custom Shorts thumbnail is set with the top-level `video_cover` (a `youtube` override for a YouTube-only image); it shows on Shorts only on channels where YouTube has enabled custom Shorts thumbnails (Partner Program channels first, since July 2026), other channels show a frame from the video. | |
| channels | No | Array of channel IDs to post to (e.g. linkedin, linkedin_page, instagram). | |
| No | Facebook options | ||
| link_url | No | URL to share as a rich preview card on platforms that support link-share posts (LinkedIn and Facebook). Renders as a tile with thumbnail/title/description instead of plain text. Ignored on platforms that don't support link shares, and ignored on posts that already have media attached (media wins). | |
| No | LinkedIn Profile options | ||
| mastodon | No | Mastodon options, including thread mode via `thread_parts`. | |
| No | Instagram options | ||
| media_ids | No | ||
| No | |||
| user_tags | No | Instagram only. Tag public accounts at x/y positions on a PHOTO (not video/reels/stories). For a single image omit image_index; for a carousel, set image_index to the slide each tag belongs to. Private/non-existent usernames are rejected at publish time. Ignored by other platforms. | |
| link_title | No | Optional title for the link-share preview. LinkedIn uses this when set; Facebook ignores it and fetches OG metadata server-side. Omit to let LinkedIn auto-fetch the page title. | |
| media_urls | No | External image/video/PDF URLs — flat array or per-platform object. Max 10 total (Pinterest: max 5 images per carousel pin), each file ≤ 100 MB. Entries are URL strings or { url, alt } objects (alt = accessibility description, delivered to Mastodon/Bluesky/X/Pinterest/Instagram (images)/LinkedIn (images)). For larger files (up to 1 GB): upload_media with method 'url' first, then pass the returned media id in `media`. | |
| hashtag_set | No | Name of a saved hashtag set (from list_hashtag_sets, matched case-insensitively) to apply to this post. The set's tags are merged in once at create time; tags already present in a caption are skipped. When the user says something like 'add my usual hashtags', check list_hashtag_sets first. Instagram's 30-hashtag cap is enforced with a clear error (hashtag_limit_exceeded). | |
| location_id | No | Instagram only. Facebook Place ID for a single physical venue (with a street address) to tag the post's location. Find it via the location search in the OmniSocials dashboard. Ignored by other platforms. | |
| video_cover | No | Video thumbnail for a post whose media is ONE video. Applied on Instagram (feed videos and reels), Facebook (feed videos and reels), LinkedIn Profile and Page, TikTok, Pinterest and YouTube Shorts. YouTube Shorts: the cover shows on Shorts only on channels where YouTube has enabled custom Shorts thumbnails (rolling out since July 2026, Partner Program channels first); on other channels YouTube stores it as the default thumbnail but shows a frame from the video on Shorts. Say that it depends on the channel; do not promise it. TikTok only takes a frame: a 'custom' cover is skipped there, so add a tiktok override with type 'frame' when the user wants a specific TikTok frame. The per-platform reel fields (instagram.thumb_offset / cover_url, tiktok.video_cover_timestamp_ms, pinterest.video_cover) keep working and win over the base cover for their platform. get_post reads it back as `video_cover`. | |
| collaborators | No | Instagram only. Up to 3 public Instagram usernames to invite as co-authors (the 'Collab' feature). Works on image, carousel, and reel posts — NOT Stories. Invited users get an invite in the Instagram app; once they accept, the post also appears on their profile and feed. A leading '@' is stripped; usernames are case-insensitive. Private or non-existent usernames are rejected by Instagram at publish time. Ignored by other platforms. | |
| linkedin_page | No | LinkedIn Company Page options | |
| linkedin_poll | No | Non-sponsored LinkedIn poll(s) — independent per channel, keyed by `linkedin` (personal profile) / `linkedin_page` (company page). A poll is mutually exclusive with media and a link share on that channel's post — a poll takes priority over both at publish time. Still requires `content.linkedin` (or `content.default`) as that channel's caption; the poll itself only carries the question/options/duration. On update_post, set a channel's key to `null` to clear that channel's poll and revert it to a normal post — send the full desired state for both channels, since the whole object replaces wholesale. | |
| google_business | No | Google Business Profile options. Use to publish EVENT or OFFER posts, attach a CTA button, or both. Shape mirrors Google's LocalPost resource (see https://developers.google.com/my-business/reference/rest/v4/accounts.locations.localPosts#LocalPost). Google Business caption rules (enforced at scheduling — text that violates these will return a `validation_error` 400 before the post is saved): • Phone numbers in the caption are rejected — use a CALL button instead. • Inline URLs / bare domains / emails are rejected — use LEARN_MORE / BOOK / SHOP / SIGN_UP / ORDER buttons instead. • Caption max 1500 characters. • Media is optional (text-only posts are allowed). If attached: exactly one JPEG/PNG/WebP image (no video, no carousels). • The workspace must have a Google Business location selected (Settings → Organisation → Workspaces → Google Business) before scheduling — otherwise returns a 400. | |
| link_description | No | Optional description for the link-share preview. LinkedIn uses this when set; Facebook auto-fetches the OG description. | |
| hashtag_placement | No | Where the set's tags land. caption_append (default): appended to each target caption after a blank line. first_comment: posted as the auto first comment on Instagram/Facebook/LinkedIn/LinkedIn Page/YouTube/TikTok (TikTok only when the workspace enabled TikTok comments) (keeps hashtags out of the caption — appended after any explicit first_comment); platforms without a comment API fall back to caption_append. Stories always use captions. | |
| hashtag_platforms | No | Optional subset of the post's channels to apply the hashtag set to (e.g. ["instagram", "tiktok"]). Defaults to all selected channels. | |
| link_thumbnail_url | No | Optional thumbnail image URL for the preview card. Currently applied on Facebook; reserved for LinkedIn. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, yet the description adds substantial context beyond them: X link posts consume credits, failed publishes are never charged, partial failure isolates to the X target only, and a 402 x_credits_insufficient is returned up front rather than at publish. This is meaningful behavioral disclosure for a publish tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence is front-loaded and clear, but the body is a dense run of bold-headed paragraphs mixing operational rules, error semantics, and edge cases. Much of this is justified by the tool's 29-parameter complexity, but the volume is heavy and some guidance could be tighter.
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 29-param, nested-object tool with no output schema, the description covers the highest-risk cross-cutting behaviors (credits, partial failure, workspace/board resolution). It leaves many per-platform option semantics to the 90%-covered schema, which is appropriate, but does not explain approval-workflow interactions despite siblings like get_post_approval existing.
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 90%, so baseline is 3, but the description adds genuine meaning for several params — the Pinterest board_id auto-default fallback logic, the distinction between x.thread_parts (thread) and content (single tweet), and the workspace selection rule — none of which are fully derivable from schema descriptions alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a new post and publish it immediately (no scheduling)'), which cleanly distinguishes immediate publishing from scheduled drafting. However, it does not explicitly name create_post or publish_post as the sibling it differs from, leaving the agent to infer the boundary from the parenthetical.
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 operational guidance for specific cases (workspace selection rule, Pinterest board auto-default, X thread vs single tweet), but never states when to choose this tool over create_post/publish_post or what the prerequisites are. Usage is implied through the referenced create_post rules rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_folderAInspect
Create a media-library folder. Use it to organize assets (e.g. a 'win-graphics' folder), then upload into it with upload_media (folder) or move files with update_media (folder_id).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Folder name, e.g. 'win-graphics' | |
| parent_id | No | Optional parent folder id to nest under (from list_folders). Omit for a top-level folder. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, so the mutation/safety profile is covered. The description adds the workflow role of a folder (a container for later uploads/moves), but says nothing about permissions, whether folders are renameable/removable, or naming constraints. Useful but modest context on top of 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 tightly packed sentences with zero filler: the purpose is front-loaded and the second sentence carries only actionable workflow routing. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter create tool with full annotation coverage and no output schema, the description supplies enough to call it correctly and to know what to do next. Minor omissions (permissions, whether the folder name must be unique) are non-blocking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents both 'name' and 'parent_id' including the nesting behavior and the list_folders source. The description's example ('win-graphics') merely echoes the schema's own example, adding no syntax or constraint detail beyond it. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Create a media-library folder'), which is clearly distinct from sibling create_* tools that operate on posts, hashtags, and webhooks. It does not explicitly contrast itself against those siblings, but the resource noun makes the target unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete usage context ('Use it to organize assets') and routes the agent to the correct follow-up tools: upload_media (folder) for uploads and update_media (folder_id) for moving files. There is no explicit when-not-to-use guidance or prerequisite/permission note, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_hashtag_setAInspect
Save a reusable, named group of hashtags (e.g. 'Fitness Brand' -> #fitness #gym #workout). Tags may include or omit the leading '#'; they are deduped case-insensitively and kept in order (max 100). Then apply the set to any new post via create_post (hashtag_set).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Set name, unique per workspace, e.g. 'Fitness Brand' | |
| hashtags | Yes | Tags in order, with or without the leading "#", e.g. ["fitness", "#gym", "workout"] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this is a non-destructive, non-open-world write, so the safety profile is covered. The description adds genuinely useful behavior beyond that: '#' prefix optional, case-insensitive dedup, order preservation, and a max of 100 tags — all things an agent must know to build a valid call. It omits what happens on a duplicate set name (the schema says unique per workspace) or what is returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler. The core behavior and the example come first, and the follow-up usage note is placed at the end where it belongs.
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 two-parameter write tool with no output schema, the description covers creation semantics, normalization rules, and how the set is consumed later. It leaves open the duplicate-name failure mode and the return payload, but nothing essential to invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, and the description goes beyond the schema by specifying normalization semantics for the hashtags array (optional '#', case-insensitive dedup, order retention, 100-item cap). The name parameter gets no extra clarification beyond the schema's 'unique per workspace' note.
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 ('Save a reusable, named group of hashtags') and grounds it with a concrete example ('Fitness Brand' -> #fitness #gym #workout), which separates it cleanly from list_hashtag_sets, update_hashtag_set, and delete_hashtag_set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear downstream context: the set is meant to be applied to a new post via create_post (hashtag_set). It does not, however, mention when to use this versus update_hashtag_set for editing an existing set, so the alternative-selection guidance is partial.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_postAInspect
Create a new social media post, story, or reel.
IMPORTANT — Before calling this tool, make sure you have all required information from the user. If anything is missing, ASK the user before calling:
Workspace: If the user has only one workspace, just use it (no need to ask). If the user has named a workspace in their request, switch to it once and remember it for the rest of the conversation. If multiple workspaces exist and the user has NOT named one, call
list_workspacesand ASK which workspace to post to before continuing. Never silently pick a workspace when more than one exists — each workspace has different connected channels and different audiences. After a successful create/schedule/publish, mention the workspace name in your reply for clarity (e.g. "Scheduled to the Acme workspace for Tuesday 3pm").Content/caption: What text should the post have? If captions differ per platform, use one call with an object: { "default": "fallback text", "linkedin": "long version", "threads": "short version", "x": "short version", "bluesky": "short version" }. Always prefer one call per topic. RESPECT character limits per platform (see below).
Channels: Which platforms to post to? Call
list_accountsto show available options for the active workspace. Ask the user which channels to use.Schedule: When should it be published? (Or save as draft?)
Media (REQUIRED for some types):
Stories: ALWAYS require an image or video. A story can carry up to 10 media items: each item is one slide, published as its own story in the order given. Ask the user which slides and in what order.
Reels: ALWAYS require a video.
Instagram posts: ALWAYS require at least one image or video.
TikTok posts: ALWAYS require at least one image or video.
Pinterest posts: ALWAYS require an image AND a board_id.
Other platforms (LinkedIn Profile, LinkedIn Page, X, Bluesky, etc.): Media is optional.
Platform-specific options (ask only when relevant):
Pinterest board (auto-default to first board): If Pinterest is in
channelsandpinterest.board_idis NOT provided, do NOT block on asking the user — and do NOT skip Pinterest. Instead:Call
get_accounton the Pinterest account — the response includes aPinterest Boardstable with each board's name and ID.Use the FIRST board in that list as
pinterest.board_idautomatically.In your reply, explicitly mention which board you used (e.g. "Posted to your 'Marketing' board on Pinterest — let me know if you'd prefer a different one and I'll move it.") so the user can correct course. If the user named a board ("post to my Marketing board") or specified one in the request, match it (case-insensitive) against the list and use that one instead of the first.
YouTube: Title, privacy status, tags?
TikTok: Privacy level?
X threads vs long-form: A chained "thread" (the user explicitly asks for one) → pass
x.thread_partsas an array of 2–25{ text }objects (each ≤ 280 chars); the top-levelcontentis then ignored for X. A single long-form post on a Premium / Premium+ account → just put the full text (up to 25,000 chars) incontent— no threading needed (checkplatform_details.subscription_typevia list_accounts). On free / Basic, X caps a single post at 280 chars, so either split into a thread or shorten. Never cram "1/", "2/" prefixes intocontent— that posts one tweet, not a thread.X posts containing a link use credits: X's API charges more for posts whose text contains a URL; OmniSocials passes that platform fee through as credits from the organisation's existing balance (threads: per link-containing part). Only a link written with http:// or https:// counts; a bare domain (brand.com) or a www. link is free. The create response includes a
warningsentry (x_url_post_credits) with the cost and current balance — relay it to the user. Credits are only deducted after the post successfully publishes; a failed publish is never charged. If the balance can't cover it at publish time, only the X target fails (its error explains the shortfall) and the post can be retried later. Posts without links stay free — never remove a user's link to dodge the fee without asking them. Scheduling is also gated up front: every scheduled X link post reserves its cost, and a create/schedule that would push the reserved total past the balance is refused with a 402x_credits_insufficienterror (details carry credits_required / credits_balance / credits_reserved) — tell the user their X credit balance is too low for this post, don't silently retry.
VIDEO DURATION CAPS — MUST RESPECT THESE (returns 400 validation_error when exceeded):
Platform | Post mode | Reel mode |
240 min | 240 min (the old 90 s Reel cap is gone) | |
YouTube Short | (no Post mode) | 3 min |
X | 140 s | N/A |
Bluesky | 180 s | N/A |
Threads | 5 min | N/A |
TikTok | 10 min | 10 min |
LinkedIn / LinkedIn Page | 10 min | N/A |
15 min | 15 min | |
15 min | N/A | |
15 min | N/A | |
Mastodon | (instance-dependent) | N/A |
VIDEO FILE-SIZE CAPS — MUST RESPECT THESE (validated via ffprobe at schedule/publish time; drafts exempt):
Platform | Video cap |
Mastodon | 99 MB |
Bluesky | 100 MB |
300 MB | |
X (free tier) | 512 MB |
Threads / Reddit | 1 GB |
2 GB | |
Facebook / TikTok | 4 GB |
LinkedIn / LinkedIn Page | 5 GB |
YouTube | 256 GB |
Upload requests are capped at 100 MB on top of these; anything bigger gets rejected with code: file_too_large before the validator runs.
Cap-violation error shape (one sentence per offending platform):
{ "error": { "code": "validation_error", "message": "YouTube only allows videos up to 3min; yours is 3min 12s. Trim the video or deselect YouTube." } }Before sending an oversized video, warn the user and offer to trim, deselect that platform, or split. Drafts can still be created without media — the validator only runs when transitioning to scheduled or publish_now.
CHARACTER LIMITS — MUST RESPECT THESE:
Platform | Max chars | Notes |
X (free / Basic) | 280 | Long posts require Premium or Premium+ — Basic does NOT count |
X (Premium / Premium+) | 25,000 | Check platform_details.subscription_type on the account |
Bluesky | 300 | Counted in graphemes |
Mastodon | 500 | |
Threads | 500 | |
YouTube | 500 | Description field |
500 | Pin description | |
2,200 | Caption | |
TikTok | 2,200 (videos) / 4,000 (photo posts) | Videos have a single caption field |
3,000 | ||
63,206 | Very generous |
When posting to multiple platforms with different limits, ALWAYS use per-platform captions. For example, if posting to LinkedIn (3000 chars) and X (280 chars), use: { "default": "full version", "x": "shortened version" }. Never post content that exceeds a platform's limit.
Channel IDs you can pass: instagram, facebook, threads, linkedin (personal profile), linkedin_page (company page), youtube, tiktok, pinterest, x, bluesky, mastodon. linkedin and linkedin_page are independent. A workspace can have both connected and post to each separately. Always confirm with list_accounts which are actually connected.
Do NOT call this tool without media when creating stories, reels, Instagram posts, TikTok posts, or Pinterest posts — it will fail.
IMPORTANT - When the user shares an image or screenshot in chat: You MUST upload it before creating the post. Do NOT skip the image. Do NOT create a text-only draft when an image was provided. Follow these steps:
Call
upload_mediawithmethod="upload_url"to get upload instructionsUse code execution to upload the image file to OmniSocials
Use the returned media ID in
media_idswhen creating the post Only if code execution is completely unavailable, save as a draft and tell the user to add the image at app.omnisocials.com.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | X (Twitter) options, including thread mode via `thread_parts`. | |
| type | No | Content type. 'story' takes 1 to 10 media items; each is one slide, published in order. | |
| tiktok | No | TikTok options | |
| bluesky | No | Bluesky options, including thread mode via `thread_parts`. | |
| content | Yes | Post caption. String for same text on all channels, or object with platform keys for per-channel captions: { "default": "fallback", "linkedin": "long version", "threads": "short version" }. The "default" key is used for any selected channel without its own key. Always prefer one call per topic, even when captions differ across platforms. | |
| threads | No | Threads options: thread mode via `thread_parts`, location tag via `location_id`. | |
| youtube | No | YouTube Shorts options. Only applies when type is 'reel' and youtube is among the selected channels. A custom Shorts thumbnail is set with the top-level `video_cover` (a `youtube` override for a YouTube-only image); it shows on Shorts only on channels where YouTube has enabled custom Shorts thumbnails (Partner Program channels first, since July 2026), other channels show a frame from the video. | |
| channels | No | Array of channel IDs to post to (e.g. linkedin, linkedin_page, instagram). Get available IDs from list_accounts. | |
| No | Facebook options | ||
| link_url | No | URL to share as a rich preview card on platforms that support link-share posts (LinkedIn and Facebook). Renders as a tile with thumbnail/title/description instead of plain text. Ignored on platforms that don't support link shares, and ignored on posts that already have media attached (media wins). | |
| No | LinkedIn Profile options | ||
| mastodon | No | Mastodon options, including thread mode via `thread_parts`. | |
| No | Instagram options | ||
| media_ids | No | Media IDs — flat array or per-platform object | |
| No | |||
| user_tags | No | Instagram only. Tag public accounts at x/y positions on a PHOTO (not video/reels/stories). For a single image omit image_index; for a carousel, set image_index to the slide each tag belongs to. Private/non-existent usernames are rejected at publish time. Ignored by other platforms. | |
| link_title | No | Optional title for the link-share preview. LinkedIn uses this when set; Facebook ignores it and fetches OG metadata server-side. Omit to let LinkedIn auto-fetch the page title. | |
| media_urls | No | External image/video/PDF URLs — flat array or per-platform object. Max 10 total (Pinterest: max 5 images per carousel pin), each file ≤ 100 MB. Entries are URL strings or { url, alt } objects (alt = accessibility description, delivered to Mastodon/Bluesky/X/Pinterest/Instagram (images)/LinkedIn (images)). For larger files (up to 1 GB): upload_media with method 'url' first, then pass the returned media id in `media`. | |
| hashtag_set | No | Name of a saved hashtag set (from list_hashtag_sets, matched case-insensitively) to apply to this post. The set's tags are merged in once at create time; tags already present in a caption are skipped. When the user says something like 'add my usual hashtags', check list_hashtag_sets first. Instagram's 30-hashtag cap is enforced with a clear error (hashtag_limit_exceeded). | |
| location_id | No | Instagram only. Facebook Place ID for a single physical venue (with a street address) to tag the post's location. Find it via the location search in the OmniSocials dashboard. Ignored by other platforms. | |
| video_cover | No | Video thumbnail for a post whose media is ONE video. Applied on Instagram (feed videos and reels), Facebook (feed videos and reels), LinkedIn Profile and Page, TikTok, Pinterest and YouTube Shorts. YouTube Shorts: the cover shows on Shorts only on channels where YouTube has enabled custom Shorts thumbnails (rolling out since July 2026, Partner Program channels first); on other channels YouTube stores it as the default thumbnail but shows a frame from the video on Shorts. Say that it depends on the channel; do not promise it. TikTok only takes a frame: a 'custom' cover is skipped there, so add a tiktok override with type 'frame' when the user wants a specific TikTok frame. The per-platform reel fields (instagram.thumb_offset / cover_url, tiktok.video_cover_timestamp_ms, pinterest.video_cover) keep working and win over the base cover for their platform. get_post reads it back as `video_cover`. | |
| scheduled_at | No | ISO 8601 date for scheduled publishing | |
| collaborators | No | Instagram only. Up to 3 public Instagram usernames to invite as co-authors (the 'Collab' feature). Works on image, carousel, and reel posts — NOT Stories. Invited users get an invite in the Instagram app; once they accept, the post also appears on their profile and feed. A leading '@' is stripped; usernames are case-insensitive. Private or non-existent usernames are rejected by Instagram at publish time. Ignored by other platforms. | |
| linkedin_page | No | LinkedIn Company Page options | |
| linkedin_poll | No | Non-sponsored LinkedIn poll(s) — independent per channel, keyed by `linkedin` (personal profile) / `linkedin_page` (company page). A poll is mutually exclusive with media and a link share on that channel's post — a poll takes priority over both at publish time. Still requires `content.linkedin` (or `content.default`) as that channel's caption; the poll itself only carries the question/options/duration. On update_post, set a channel's key to `null` to clear that channel's poll and revert it to a normal post — send the full desired state for both channels, since the whole object replaces wholesale. | |
| google_business | No | Google Business Profile options. Use to publish EVENT or OFFER posts, attach a CTA button, or both. Shape mirrors Google's LocalPost resource (see https://developers.google.com/my-business/reference/rest/v4/accounts.locations.localPosts#LocalPost). Google Business caption rules (enforced at scheduling — text that violates these will return a `validation_error` 400 before the post is saved): • Phone numbers in the caption are rejected — use a CALL button instead. • Inline URLs / bare domains / emails are rejected — use LEARN_MORE / BOOK / SHOP / SIGN_UP / ORDER buttons instead. • Caption max 1500 characters. • Media is optional (text-only posts are allowed). If attached: exactly one JPEG/PNG/WebP image (no video, no carousels). • The workspace must have a Google Business location selected (Settings → Organisation → Workspaces → Google Business) before scheduling — otherwise returns a 400. | |
| link_description | No | Optional description for the link-share preview. LinkedIn uses this when set; Facebook auto-fetches the OG description. | |
| hashtag_placement | No | Where the set's tags land. caption_append (default): appended to each target caption after a blank line. first_comment: posted as the auto first comment on Instagram/Facebook/LinkedIn/LinkedIn Page/YouTube/TikTok (TikTok only when the workspace enabled TikTok comments) (keeps hashtags out of the caption — appended after any explicit first_comment); platforms without a comment API fall back to caption_append. Stories always use captions. | |
| hashtag_platforms | No | Optional subset of the post's channels to apply the hashtag set to (e.g. ["instagram", "tiktok"]). Defaults to all selected channels. | |
| link_thumbnail_url | No | Optional thumbnail image URL for the preview card. Currently applied on Facebook; reserved for LinkedIn. | |
| approval_workflow_id | No | Route the post through a saved approval workflow (id from list_approval_workflows). The post is created as `in_approval` instead of `scheduled`: its approvers are notified, they review it on the Approvals page, and it publishes at schedule_at only once the workflow's last step approves it (or approve_post). Use this whenever the user wants to review/approve agent-created posts before they go out. Requires schedule_at; not allowed with publish_now (use create_post, never create_and_publish_post). A workflow with no approvers on its first step is rejected with validation_error. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (readOnlyHint=false, destructiveHint=false, openWorldHint=false), so the description carries the behavioral burden, and it does: it discloses the credit/fee model for X URL posts including the 402 x_credits_insufficient error, the reservation model for scheduled link posts, the 100 MB upload cap and per-platform file-size/ffprobe validation, the draft-exempt rule, the type/media validation failures, and the publish-time failure semantics. This is far more than the annotations 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?
Front-loaded with a clear purpose line and a numbered checklist, which is good structure. But the body is very long — large tables that partially duplicate the schema (character limits, video caps), and the Pinterest default flow is repeated in narrative form. It earns most of its length, but the duplication and the 400+ word length keep it out of 4-5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 31-param, deeply nested mutation tool with no output schema and sparse annotations, the description covers preflight steps, per-platform media requirements, validation error shapes, credit semantics, and scheduling/approval flows. Nothing critical an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 97%, so the schema does most of the work. The description still adds value the schema does not: channel ID list, platform-specific caption object shape with example keys, X thread vs long-form decision path, Pinterest board_id auto-default behavior, character limits table, and video duration/file-size caps. It could go further on some top-level params (link_url, hashtag_set, location_id) but for a 31-param tool this is 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+resource ('Create a new social media post, story, or reel') and enumerates the three content types. The sibling set contains create_and_publish_post, so the description's careful 'save as draft / schedule / publish_now' framing plus the explicit approval_workflow guidance lets an agent distinguish it from the publish-immediately variant.
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?
Explicit when-to-use and when-not-to for the major alternatives: it names list_workspaces, list_accounts, upload_media and get_account as required preflight steps, tells the agent to ASK the user for missing info, and gives platform-specific gate conditions (Pinterest board auto-default, X thread vs long-form). The only reason it isn't a 5 is that it doesn't explicitly say 'use create_and_publish_post instead when the user wants immediate publish,' but the approval_workflow paragraph implies the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_webhookBInspect
Create a new webhook. Available events: post.scheduled, post.published, post.failed, post.approved (the last approval of a post's approval workflow is in), post.rejected (an approver rejected the post)
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The HTTPS URL to send events to | |
| events | Yes | Events to subscribe to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, so the safety profile is covered structurally. The description adds domain behavior by explaining what triggers each event (e.g., post.approved fires on the last workflow approval), but says nothing about auth needs, whether a signing secret is issued, or delivery semantics — useful additions against a low annotation-derived bar.
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 action, and the dense event enumeration earns its space by disambiguating valid values. Slightly parenthetical annotation of a couple events could be tightened but nothing is wasteful.
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?
There is no output schema, so the description could reasonably explain what a successful creation returns (e.g., an ID or signing secret). For a low-complexity two-parameter tool it is mostly adequate, but the post-creation contract is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by enumerating the valid event values and clarifying their trigger conditions, which the schema only calls 'Events to subscribe to'. It does not elaborate on the url parameter, which the schema already defines as an HTTPS URL.
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 ('Create a new webhook'), making it clearly distinguishable from the sibling delete_webhook, get_webhook, list_webhooks, and update_webhook. It does not name a sibling explicitly, but the create/list/get/delete verb family makes the intent 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 when-to-use guidance, no prerequisites, and no comparison to alternatives like update_webhook (for modifying an existing hook) or list_webhooks (for inspecting them). The event list informs invocation but not tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_hashtag_setADestructiveInspect
Delete a saved hashtag set. Posts that already used it keep their hashtags — the tags were merged into their captions at create time.
| Name | Required | Description | Default |
|---|---|---|---|
| set_id | Yes | The hashtag set id (from list_hashtag_sets) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, openWorldHint=false, so the safety profile is covered structurally. The description adds genuine value beyond them by disclosing the blast radius: posts that already used the set retain their hashtags because tags were merged into captions at create time. It does not address reversibility, permissions, or error 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?
Two short sentences, front-loaded with the action, and the second sentence earns its place by preventing a likely misconception about published posts. 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 single-parameter destructive tool with no output schema, the description covers the action and the side-effect scope, which is what an agent most needs before calling it. It omits what happens on an invalid or already-deleted set_id and whether the delete is permanent, minor gaps given annotations carry the destructiveness signal.
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 the single parameter, and the schema already documents set_id including its provenance ("from list_hashtag_sets"). The description adds nothing about the parameter, so the baseline 3 for fully documented params applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Delete a saved hashtag set"), and the resource name is unique enough among the 48 siblings (delete_post, delete_media, delete_webhook) that an agent can tell it apart without opening schemas. It stops short of explicitly naming related siblings such as update_hashtag_set or list_hashtag_sets, so it does not fully earn 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?
Usage is only implied: the description tells the agent the effect of deleting (posts keep their tags), which implicitly reassures that deletion is scoped to the saved set, but never states when to delete versus update, nor any prerequisite such as needing a valid set_id. No alternatives or when-not conditions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_inbox_commentADestructiveInspect
Permanently delete a comment someone left on one of the workspace's posts, on the platform and from the inbox. Facebook, Instagram and TikTok comments only (YouTube's API cannot delete other people's comments; use hide_inbox_comment there). Replies under the comment are deleted with it. This cannot be undone: confirm with the user before calling. Takes the message id (the #id in the thread), not the conversation id. A 403 reconnect_required means the account must be reconnected in the dashboard to grant the moderation permission.
| Name | Required | Description | Default |
|---|---|---|---|
| message_id | Yes | The inbox message id of the comment (the #id in the thread) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, and the description goes well beyond them: it discloses the cascade effect (replies under the comment are deleted too), irreversibility, the required user confirmation, and the meaning of a 403 reconnect_required error including the remediation path. That is exactly the extra context annotations cannot carry.
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?
Five short sentences, front-loaded with the action and scope, then cascade behavior, safety, parameter clarification and error handling. Every sentence carries information absent from the schema or annotations; nothing is padding.
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?
Single-required-parameter tool with no output schema and complete annotations; the description covers scope, side effects, irreversibility, confirmation requirements and the one documented error path. Nothing an agent needs in order to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% on the single parameter, so the baseline is 3, but the description adds a genuine disambiguation: it warns that message_id is the #id in the thread, not the conversation id — a real confusion source given siblings like get_inbox_conversation. It stops short of any id format example, so not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb (delete), the exact resource (a comment on one of the workspace's posts), and the two surfaces affected (platform and inbox). It also carves out platform scope (Facebook, Instagram, TikTok) and explicitly names the sibling it is not (hide_inbox_comment for YouTube). An agent can distinguish this from every other inbox tool without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use (FB/IG/TikTok comments), when-not (YouTube, because the API cannot delete others' comments, use hide_inbox_comment), and a mandatory pre-call step ('confirm with the user before calling'). That is the full when/when-not/alternative triad.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_mediaBDestructiveInspect
Delete a media file by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The media ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is carried structurally. The description adds no behavioral context beyond that: it does not say whether deletion is permanent or reversible, whether it cascades (e.g. to scheduled posts referencing the media), or whether it requires elevated permissions.
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 zero padding. The verb and the discriminator (by ID) come first.
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 required string param, no output schema, no nesting) and annotations carry the destructive signal, so little prose is needed. However, for a permanent destructive operation on media, the absence of any statement about irreversibility or side effects leaves a meaningful 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% and the single parameter is fully documented as "The media ID to delete." The description's "by ID" merely restates the schema, so the baseline 3 applies with no added semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Delete a media file") with the identifying parameter, so the agent can distinguish it from update_media, upload_media, and list_media. It does not explicitly name or contrast with those siblings, but the operation 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?
"by ID" implies an ID must already be known (presumably from list_media), but there is no explicit when-to-use guidance, no prerequisites, and no mention of alternatives or how to recover the ID. Nothing tells the agent when deletion is appropriate versus updating.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_postADestructiveInspect
Delete a post by ID. This action cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The post ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so safety is covered. The description adds a specific behavioral fact beyond that: 'This action cannot be undone,' which tells the agent the deletion is irreversible. It does not mention auth requirements or side effects, but the added irreversibility note is valuable.
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 zero waste; the action and irreversible warning are both front-loaded 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 simple one-parameter delete tool with a complete input schema and annotations covering the destructive nature, the description supplies what an agent needs: what it does, how it identifies the target, and that the result is irreversible. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single 'id' parameter is already documented as the post ID to delete. The description repeats 'by ID' without adding format, source, or validation details beyond the schema, so the baseline is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a post') plus the required identifier, so the action is unambiguous. The sibling set contains several delete_* tools for other resources (media, webhook, hashtag set), and naming 'post' is enough to distinguish this tool from 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 description says what the tool does but gives no guidance on when to use it versus alternatives like update_post or other delete_* tools, nor any exclusions or prerequisites. Usage is only implied by the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_webhookCDestructiveInspect
Delete a webhook by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The webhook ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds nothing beyond that: it does not say the deletion is permanent, whether it can be undone, whether it revokes any associated delivery endpoints, or what permissions are required. For a destructive operation it contributes no behavioral context of its own.
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 four-word sentence with zero padding, front-loaded with verb and resource. It is efficient rather than verbose; the only cost is that the brevity leaves behavioral gaps unaddressed elsewhere.
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 fully documented parameter, no output schema) and annotations carry the destructive/safety signal, so the description is close to sufficient. It is still missing the two things an agent would want before an irreversible delete: confirmation that the operation is permanent and whether related resources are affected.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single id parameter is already documented as 'The webhook ID to delete'. The description's 'by ID' phrasing adds no format, source, or lookup guidance beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Delete) and resource (webhook) with the keying parameter (by ID), so an agent can distinguish it from update_webhook, get_webhook, and the unrelated delete_post/delete_media siblings without opening the schema. It stops short of any scope detail (e.g. workspace/account ownership of the webhook), but the purpose itself 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?
There is no guidance on when to use this tool versus alternatives such as update_webhook (which could disable rather than remove) or rotate_webhook_secret, and no prerequisites or warnings about irreversibility. The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accountBRead-onlyInspect
Get details of a specific connected social media account.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The account ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds nothing beyond that: it doesn't say what 'details' are returned, whether access is scoped to the workspace, or any rate/permission behavior. With annotations doing the work, the description contributes no extra behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the verb and resource lead and nothing is wasted.
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?
There is no output schema, so the description would need to convey what a 'detail' response contains, and it does not — 'details' remains undefined. For a trivial one-parameter read tool with annotations covering safety, this is adequate but leaves the return payload opaque.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter 'id' is documented as 'The account ID'. The description adds no format, sourcing, or naming detail beyond the schema, so the baseline 3 for high coverage applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('details of a specific connected social media account'), which implicitly contrasts with the sibling list_accounts (plural enumeration vs. single fetch). It is clear but never explicitly names or differentiates itself from list_accounts.
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 required 'id' parameter implies the caller must already know the account ID, but the description never says when to use this vs. list_accounts to discover IDs, nor states any prerequisite or exclusion. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_account_analyticsARead-onlyInspect
Get account-level analytics for all connected platforms: followers, following, posts, and the day values the platform reports for the snapshot date (impressions/views, reach, engagement, profile_views, link_clicks, follows_gained, follows_lost, Google Business calls/direction_requests/website_clicks/average_rating/review_count, Pinterest monthly_views). Rows with day values carry period: "daily". Audience objects appear when available: demographics (+ demographics_unit) and online_followers (UTC hour to followers online). Present as a sorted table by follower count. Metric semantics: LinkedIn profile rows keep a lifetime total under impressions_lifetime (all content ever, including posts published outside OmniSocials) and period: "lifetime" when no daily breakdown is served. A missing key means the platform does not report it. Each metrics object carries a note explaining its scope where semantics are non-obvious; always relay that note to the user.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date (YYYY-MM-DD, defaults to today) | |
| platform | No | Filter by platform |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds substantial context beyond that: daily vs lifetime periods, the meaning of a missing key, and a per-object `note` field the caller must relay. It does not discuss auth or rate limits, but the metric-interpretation guidance is genuinely valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose before diving into metric semantics. It is long for a two-parameter tool and reads as a dense run-on, but with no output schema present most sentences carry needed return-interpretation detail rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description bears the burden of explaining the return shape and does so thoroughly – platform metrics, audience objects, period values, and the note-relaying requirement. The main gap is the absence of any usage routing relative to the sibling analytics 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 100%, so the date and platform parameters are already documented in the schema. The description references 'the snapshot date' but adds no filtering syntax or defaults beyond what the schema provides. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get account-level analytics') and enumerates the metrics returned (followers, impressions, reach, engagement, etc.). 'Account-level' implicitly distinguishes it from post-level siblings like get_post_analytics, but it never names them, so the differentiation is left to inference.
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 when-to-use/when-not guidance and no routing to alternatives. Siblings get_analytics_overview, get_post_analytics, and get_best_times are never mentioned, so an agent must guess which analytics tool to pick. Only the implicit 'account-level' scope hints at selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_analytics_overviewARead-onlyInspect
Get analytics overview with total posts, impressions, engagements, engagement rate, and per-platform breakdown. Use period for a rolling window (7d / 30d / 90d) or start_date + end_date for a custom range. The response echoes the resolved range and today's date — read those before assuming a year from training data (e.g. when the user says 'April', use the most recent April, not April from your training cutoff).
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | Rolling window: 7d, 30d, 90d (default: 30d). Ignored if start_date/end_date are provided. | |
| end_date | No | Custom end date. Same formats as start_date; "YYYY-MM" expands to the last day of the month. | |
| start_date | No | Custom start date. Accepts "YYYY-MM-DD" (e.g. "2026-04-01") or "YYYY-MM" month-shorthand (e.g. "2026-04" → first of the month). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed-world), so the bar is lower, and the description still adds substantive behavior: the response echoes the resolved range plus today's date, and the agent is told to read those before assuming dates from training data. That is a concrete, non-obvious operational trait that annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the return contents, then parameter modes, then the date-interpretation caveat. Three sentences with no filler; the final sentence is longer but carries a genuinely useful warning that would otherwise be lost.
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?
No output schema exists, so the description carries the burden of describing returns, and it does list the metrics and the echoed resolved range. Combined with annotations covering safety and a fully documented parameter schema, an agent has enough to call and interpret this correctly; only the sibling boundary remains unaddressed.
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 schema already documents period defaults, the 7d/30d/90d options, date formats, and the YYYY-MM expansion. The description restates the period values and range combination but adds no syntax or precedence detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (analytics overview) and enumerates the metrics returned: total posts, impressions, engagements, engagement rate, per-platform breakdown. It implicitly differs from per-post siblings, but never names get_account_analytics or get_post_analytics to make the boundary explicit.
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?
Explains how to drive the two date modes (rolling `period` vs `start_date`+`end_date`) and how to interpret the resolved range, which is real usage guidance. However, it gives no guidance on when to pick this overview tool over get_account_analytics, get_post_analytics, or get_posts_analytics, leaving the alternative-selection decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_best_timesARead-onlyInspect
Get recommended posting times (day + hour) for one platform, computed from the workspace's own posting history: publish time × engagement of every post published there, recency-weighted and outlier-damped, bucketed in the user's timezone, and blended with when the account's followers are online when the platform provides that (Instagram, TikTok Business; basis: own_data_and_audience, response carries audience_online). Returns the top 3 recommended slots plus a per-day breakdown. When the workspace has fewer than 15 analyzed posts on the platform, the audience-online profile alone is used (basis: audience) or industry-average defaults are returned (basis: defaults) with how many more posts unlock personalized recommendations — tell the user that so the numbers aren't mistaken for their own audience data. Use this before scheduling when the user asks 'when should I post?' or hasn't specified a time. Requires the analytics:read scope.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | Platform identifier, e.g. instagram, tiktok, linkedin, linkedin_page, x, facebook, youtube, pinterest, threads, bluesky, mastodon, google_business | |
| timezone | No | IANA timezone for the buckets (e.g. Europe/Amsterdam). Defaults to the account's timezone. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/destructiveHint/openWorldHint annotations, the description discloses the scoring methodology, the three possible `basis` values, the 15-post threshold that switches behavior, the audience-online blending limited to Instagram and TikTok Business, the `audience_online` response field, and the required analytics:read scope. This is unusually rich behavioral disclosure for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and output shape are front-loaded in the first clause, and the fallback/scope information follows in a logical order. It is dense and some computation internals ('recency-weighted and outlier-damped') are arguably more than needed, but nearly every sentence carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns and does so ('top 3 recommended slots plus a per-day breakdown'), plus the basis values and fallback counts. An agent has everything needed to call and interpret the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: `platform` determines whether audience-online blending applies (only Instagram and TikTok Business) and `timezone` governs how buckets are computed. It goes beyond restating the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get recommended posting times (day + hour) for one platform') and immediately scopes it to workspace posting history. It is clearly distinguishable from the analytics siblings (get_account_analytics, get_analytics_overview), which return metrics rather than recommendations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names the trigger ('Use this before scheduling when the user asks "when should I post?" or hasn't specified a time'), which functions as both when-to-use and an implicit when-not. It does not name a competing tool, but no sibling actually competes for this job, so the guidance is close to complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_calendarARead-onlyInspect
Get a content calendar showing scheduled and published posts organized by day of the week.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter: scheduled, published, or omit for both | |
| end_date | No | End date (YYYY-MM-DD). Defaults to end of current week (Sunday). | |
| start_date | No | Start date (YYYY-MM-DD). Defaults to start of current week (Monday). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description usefully adds the grouping semantics (organized by day of the week) and that both scheduled and published posts appear, but says nothing about pagination, ordering, or 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?
A single, front-loaded sentence with no filler. Every clause (scheduled, published, organized by day of the week) carries information an agent can use.
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 tool with full annotation coverage and complete parameter docs, the description supplies the essential return-shape context (a calendar grouped by weekday). No output schema exists, so it should ideally say a bit more about what each calendar entry contains, but it is close to sufficient.
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% — all three parameters (status, start_date, end_date) are documented in the schema, including defaults. The description adds no parameter-level detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (content calendar) and clarifies the shape of the result: scheduled and published posts organized by day of the week. This framing distinguishes it from the flat list_posts sibling, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The calendar framing implies the use case (viewing posts in a weekly calendar layout rather than a flat list), but the description never states when to prefer this over list_posts or get_post, nor any prerequisites or exclusions. Usage must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_inbox_conversationARead-onlyInspect
Get the full message history of one inbox conversation, oldest first, with the post it belongs to (caption, link, image) for comment/mention threads. Each message shows its inbox id (#id); that id is what hide_inbox_comment and delete_inbox_comment take. Use the conversation_id from list_inbox_conversations. Replies sent from the native apps appear as outgoing messages too.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max messages per page (1-100, default 50) | |
| cursor | No | Pagination cursor from a previous response | |
| conversation_id | Yes | The conversation ID to fetch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so safety is covered. The description adds real behavior: oldest-first ordering, inclusion of the parent post's caption/link/image, the #id format that other tools consume, and the non-obvious fact that native-app replies surface as outgoing messages.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with what is returned and ordered before workflow details. Dense but almost every clause carries information; the parenthetical field list is the only slightly heavy part.
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 no output schema, the description carries the burden of describing the return shape and does so (message ids, per-message data, attached post fields, ordering). Pagination is handled by the schema's limit/cursor, so nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so limit, cursor, and conversation_id are already documented in the schema; baseline is 3. The description adds provenance for conversation_id (source it from list_inbox_conversations) but says nothing extra about limit or cursor semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the full message history of one inbox conversation'), plus ordering ('oldest first') and included payload ('the post it belongs to ... for comment/mention threads'). It is clearly distinguishable from list_inbox_conversations, which enumerates conversations rather than one thread.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Use the conversation_id from list_inbox_conversations,' and names the downstream consumers of the returned ids (hide_inbox_comment, delete_inbox_comment). No explicit when-not or exclusion criteria are given, but the workflow context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_next_unansweredARead-onlyInspect
Get the next inbox item that needs an answer, with the whole conversation and the post it is on, in one call. An item needs an answer when it is the customer's latest DM with no reply after it, or a comment/mention nobody replied to and that is not hidden. Order: DMs that can still be answered first (Instagram/Facebook DMs inside Meta's 24-hour window, the one closing soonest first, plus X DMs), then Instagram/Facebook DMs whose window has closed (reply_window.open = false: OmniSocials cannot reply, tell the user to answer from the native app or skip with mark_inbox_read), then comments and mentions, oldest first. Replies typed in the native apps count as answered (they are mirrored into the inbox), so a thread a colleague answered on their phone is not served again. Instagram mentions are skipped (no reply path). Only unread items are served by default: to skip one for good, mark_inbox_read it; pass include_read to also see read-but-unanswered items. Looks back 30 days. Loop: get_next_unanswered → draft a reply → reply_to_inbox with the conversation id, message_id = the served message's #id, and include_next: true → repeat until nothing is waiting.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Only items of one type | |
| order | No | oldest (default): the item that has waited longest first; newest: the most recent first. Applies within each group (answerable DMs, then expired Instagram/Facebook DMs, then comments); the groups keep their order | |
| exclude | No | Comma-separated conversation ids to leave out of this call (a temporary skip; up to 100) | |
| platform | No | Only items from one platform | |
| include_read | No | Also serve items that were marked read but never answered |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds substantial behavioral context the annotations cannot: the 30-day lookback, the three-tier ordering with 24-hour window logic, that native-app replies count as answered, and that Instagram mentions are skipped. However it does not state return format or pagination, so against a lower bar it is solid but not exhaustive.
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?
Long but front-loaded: the first sentence gives the core purpose and payload, and every subsequent sentence carries needed ordering, window, or loop semantics with no filler. The information density justifies the length for a tool with this much selection logic.
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?
There is no output schema, and the description compensates by stating the return payload (whole conversation plus the post) and the identifiers the agent needs for the follow-up call (conversation id, message #id). Combined with the lookback limit and ordering rules, an agent can invoke this correctly without further 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 100%, so the baseline is 3, but the description adds semantic nuance beyond the schema: it explains that ordering preserves group order, that skip-via-exclude is temporary while mark_inbox_read is permanent, and clarifies include_read's role in the workflow.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('get the next inbox item that needs an answer') and precisely defines the selection predicate (customer's latest unanswered DM, or unhidden unreplied comment/mention), which clearly separates it from list_inbox_conversations and get_inbox_conversation.
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?
Explicit when-to-use with a full decision flow: it defines what 'needs an answer' means, names the alternatives for skipping (mark_inbox_read for permanent, include_read for read items), tells the agent what to do when the reply window is closed, and closes with the get_next_unanswered → reply_to_inbox loop.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_postARead-onlyInspect
Get full details of a specific post including content, channels, media (with URLs), first comment, Instagram collaborators/user tags/location/Trial Reel state/Reel cover (thumbnail_type + thumb_offset in ms), dates, live URLs, per-platform publish errors, and retry linkage (retry_of / retries — a published post with empty published_urls and retries set is a resolved failure whose live URLs live on the retry post) — enough to fully verify a scheduled post without opening the dashboard. When a post has per-platform caption overrides (e.g. a shorter X version alongside the default), every variant is rendered as its own labeled block under ### Content so you can see exactly what each platform will publish. X threads are rendered under ### X Thread with each tweet labeled in publish order — read this to see the full chained tweet text, since thread-only posts have no caption in content. A LinkedIn poll is rendered under ### LinkedIn Profile Poll and/or ### LinkedIn Page Poll (independent per channel) with the question, options, and duration. After a post is published, published_urls maps each platform to the live post URL (only platforms that successfully posted appear).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The post ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, destructiveHint=false, openWorldHint=false), and the description goes further by disclosing return semantics: per-platform publish errors, how `retry_of`/`retries` indicate a resolved failure, and that `published_urls` only lists platforms that successfully posted. This is genuine behavioral context an agent cannot get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening clause is well front-loaded, but the body is one sprawling, unparagraphed run-on that mixes content rendering rules, thread handling, poll rendering, and retry semantics. The information is relevant, yet its density and lack of structure make it hard to scan for the one parameter an agent must supply.
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 no output schema, the description shoulders the return-value burden and does so thoroughly, covering content, media URLs, threads, polls, errors, and published URL mapping. It omits only edge behavior such as an invalid or missing post ID, which is a minor gap for a single-resource getter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single `id` parameter already documented as 'The post ID.' The description adds no format, source, or lookup guidance for the ID, so the baseline 3 applies – the schema carries the full burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Get full details of a specific post' with an enumerated scope (content, channels, media, errors, retry linkage). An agent can tell this is a single-post detail fetch, not a list or analytics call, though it never names the sibling it differs from (get_post_analytics, list_posts) to sharpen the distinction.
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?
Usage is only implied via the phrase 'enough to fully verify a scheduled post without opening the dashboard.' There is no explicit when-to-use, when-not-to-use, or named alternative such as get_post_analytics for metrics; the agent must infer the boundary itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_post_analyticsARead-onlyInspect
Get detailed analytics for a specific published post. Renders every metric the platform reported — impressions, reach, views, saves, likes, comments, shares, clicks, engagements, and more — per platform. TikTok videos also carry average_time_watched, full_video_watched_rate, total_time_watched, favorites and reach when the workspace enabled TikTok comments (Business API authorization).
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes | The numeric OmniSocials post id (the `id` field from list_posts). NOT a platform post id such as a YouTube video id or tweet id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/openWorld=false/destructive=false, so the description's job is additive — and it delivers: it enumerates the returned metric families and discloses that certain TikTok fields (average_time_watched, full_video_watched_rate, etc.) are conditional on workspace TikTok Business API authorization. That conditional-data caveat is real 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 sentences, front-loaded with the core purpose, then the metric inventory and the conditional TikTok caveat. The long metric list ('impressions, reach, views, saves, likes, comments, shares, clicks, engagements, and more') is somewhat enumerative but serves the no-output-schema case, so it earns most of its space.
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 no output schema, the description compensates by describing the return payload per platform, which is exactly what an agent needs to interpret the result. It omits any note on authentication scope or whether metrics can be empty for older posts, minor gaps given the annotation coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter already explains that post_id is the numeric OmniSocials id from list_posts, not a platform id. The description adds nothing about the parameter, 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?
States a specific verb ('Get') plus resource ('detailed analytics') scoped to 'a specific published post', which implicitly sets it apart from the plural sibling get_posts_analytics and from get_analytics_overview. It stops short of naming those siblings, so the differentiation is inferential rather than explicit.
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 'specific published post' weakly implies the per-post scenario and that drafts are excluded, but there is no explicit when-to-use versus get_posts_analytics, get_analytics_overview, or get_account_analytics, and no stated prerequisites beyond the required id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_post_approvalARead-onlyInspect
Read the approval review of a post: every workflow step with its approvers and their decisions, the rejection with its reason, and the comment thread. Use it when get_post shows status rejected (who rejected it and why, what to change before sending it again) or in_approval (who the post waits for, what the reviewers wrote). Read-only. A post without an approval workflow returns status none.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The post ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered; the description's 'Read-only' line is largely redundant. It does add genuine behavioral context by describing the returned content and the edge case where a post has no workflow and returns status `none`.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the payload description, then the usage trigger, then edge cases; each sentence earns its place. The standalone 'Read-only.' fragment restates the readOnlyHint annotation and is the one piece of low-value 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?
There is no output schema, so the description carries the return-value burden, and it does so by enumerating what the approval review contains plus the `none` status for posts without a workflow. Combined with annotation-covered safety, an agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single required `id` parameter already documented in the schema, so per calibration the baseline is 3. The description adds no syntax or format detail about the post ID beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (the approval review of a post) and enumerates the exact payload: workflow steps, approvers, decisions, rejection reason, and comment thread. This clearly distinguishes it from approve_post, reject_post, and get_post, which an agent can tell apart without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger conditions keyed to a sibling's output: use it when get_post shows status `rejected` or `in_approval`, with the purpose spelled out for each case. It also names the fallback behavior (a post without an approval workflow returns `none`), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_posts_analyticsARead-onlyInspect
Get analytics for several published posts at once (up to 100), each totalled into impressions and engagements. Use this instead of calling get_post_analytics in a loop — it is a single request rather than one per post.
| Name | Required | Description | Default |
|---|---|---|---|
| post_ids | Yes | Numeric OmniSocials post ids (the `id` field from list_posts), up to 100. NOT platform post ids such as YouTube video ids or tweet ids. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds real behavioral context beyond that: results are aggregated (totalled into impressions and engagements), the batch cap is 100, and the call is a single request rather than N. It does not discuss pagination, partial failures, or permission requirements, so 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?
Two sentences, zero waste. The scope and cap are front-loaded, and the routing instruction to get_post_analytics follows immediately after.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with annotations covering the safety profile and no output schema, the description supplies what an agent needs: the batching semantics, the cap, the aggregation into impressions/engagements, and the alternative it replaces. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter is already documented in the schema, including the numeric-OmniSocials-id vs platform-id distinction and the maxItems=100 cap. The description's 'up to 100' and 'published posts' restate the schema rather than adding syntax or format meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (analytics) with an explicit scope: several published posts at once, up to 100, totalled into impressions and engagements. It names the sibling get_post_analytics and explains how it differs, so an agent can select it without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use this instead of calling get_post_analytics in a loop, and gives the reason (single request rather than one per post). This is a clear when-to-use directive with the alternative named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recent_platform_postsARead-onlyInspect
Fetch the user's most recent posts straight from their connected platform APIs (Instagram, TikTok, X, YouTube, Facebook, LinkedIn, and more), INCLUDING content published outside OmniSocials. Use this when list_posts is empty — e.g. a brand-new workspace that has not published through OmniSocials yet — so you can still analyze the user's real content. Each post includes normalized engagement plus every raw metric the platform reported (Instagram: reach/views/saves/shares from per-post insights; TikTok: average_time_watched/full_video_watched_rate/total_time_watched/favorites/reach when the workspace enabled TikTok comments). Metrics only appear where the platform exposes them for historical posts (X, TikTok, Bluesky, Mastodon, Instagram, Facebook, YouTube); Threads, Pinterest, and Google Business return captions only. Records also carry duration_seconds — the video length in whole seconds — where the platform's listing API reports it (currently TikTok and YouTube); null for images and platforms that don't expose it. LinkedIn personal profiles can't be listed live (LinkedIn grants apps no such permission), so their results are posts published through OmniSocials with their latest collected stats. Fetched live for most platforms, so expect a few seconds of latency; X results may come from a snapshot up to 24h old (X bills per returned post) — the snapshot refreshes right after the user publishes to X through OmniSocials. Output is a human-readable summary table PLUS a 'Structured data' JSON block carrying, for every post, the platform's own post id (the stable dedupe key), a permalink, the FULL untruncated caption, and exact-integer metrics — use that block when ingesting or storing native posts rather than the rounded/truncated table. Requires the analytics:read scope.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max posts per connected platform (1-50, default 25; X defaults to 10 unless set explicitly — its API bills per returned post). | |
| platforms | No | Optional comma-separated platform filter, e.g. "instagram,tiktok". Defaults to every connected platform. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly/openWorld/non-destructive), and the description adds substantial behavioral context: live-fetch latency, a possible 24h snapshot staleness for X with the billing rationale, the LinkedIn personal-profile permission limitation, which platforms actually expose metrics, and the required analytics:read scope.
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?
Well front-loaded — the core purpose and the list_posts routing come first, caveats after. It is dense and long, but nearly every clause (snapshot staleness, metric availability, duration_seconds, output block) carries actionable information, so little is wasted.
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 no output schema, the description carries the return-value burden and does so thoroughly: a summary table plus a 'Structured data' JSON block with stable post id, permalink, untruncated caption, and exact-integer metrics. Combined with the per-platform metric caveats, an agent has everything needed to call and consume it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both params, giving a baseline of 3. The description reinforces why limit defaults differ for X (billing) and clarifies platform-filtering intent, adding marginal value over the schema rather than restating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Fetch the user's most recent posts') with precise scope ('straight from their connected platform APIs... INCLUDING content published outside OmniSocials'). It explicitly distinguishes itself from the sibling list_posts, so an agent can separate the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger condition: 'Use this when list_posts is empty — e.g. a brand-new workspace that has not published through OmniSocials yet.' The alternative (list_posts) is named and the selecting condition is spelled out, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_webhookBRead-onlyInspect
Get details of a specific webhook by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The webhook ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false. The description adds no behavioral context such as error handling, permissions, or response shape beyond what the structured annotations already 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?
A single front-loaded sentence with verb, resource, and scope. No filler or wasted words.
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 backed by full annotation coverage and a 100%-documented schema, the description is complete enough to invoke correctly. It does not need to explain return values because no output schema exists, though it lacks routing and error 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?
The single id parameter has 100% schema description coverage, so the schema already documents it. The description's 'by ID' adds no format or constraint detail beyond the schema, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific GET operation on a webhook resource, scoped by ID, which separates it from list_webhooks. No explicit sibling is named, but the by-ID scope gives sufficient differentiation.
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?
Usage is implied by 'by ID'—call this when you have a known webhook ID—but there is no when-to-use or when-not-to-use guidance, and no alternative routing among get/list/update siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hide_inbox_commentAInspect
Hide (or unhide) a comment someone left on one of the workspace's posts, on the platform, as the post owner. Facebook, Instagram, TikTok, YouTube and Threads comments. On YouTube, hide sets the comment to 'rejected' (removed from public view together with its replies) and unhide publishes it again. Takes the message id (the #id shown by get_inbox_conversation and get_next_unanswered), not the conversation id. A hidden comment no longer counts as unanswered. If the comment was already deleted on the platform (its author removed it, etc.), this still succeeds — the response says so — and the item is marked handled; do not retry it. A 403 reconnect_required means the account was connected without the comment-moderation permission and must be reconnected in the dashboard; relay that to the user rather than retrying. A 422 cannot_hide means Facebook does not let the Page hide this particular comment (the commenter blocked the Page, their account is deactivated or restricted, or the comment sits on a shared copy of the post): retrying never changes it — tell the user, and use mark_inbox_read on the conversation if it should stop coming up. A 502 hide_not_applied means Instagram accepted the call but still reports the comment as visible (this happens with comments shown under 'Comments from Facebook' on a reel shared to Facebook; they live on Facebook and Instagram's hide does not reach them): nothing changed in the inbox, tell the user to hide it in the Instagram or Facebook app, do not retry.
| Name | Required | Description | Default |
|---|---|---|---|
| hide | No | true (default) to hide, false to unhide | |
| message_id | Yes | The inbox message id of the comment (the #id in the thread) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true), and the description adds substantial context beyond it: platform-specific semantics (YouTube 'rejected' plus replies), idempotency when the comment was already deleted, the 'no longer counts as unanswered' side effect, and precise handling for 403 reconnect_required, 422 cannot_hide and 502 hide_not_applied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and is information-dense with essentially no wasted sentence, but it is delivered as one very long run-on paragraph that is harder to scan than a structured breakdown of error cases would be.
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?
No output schema exists, yet the description still tells the agent what the success response indicates and how each error code should be handled. For a two-parameter mutation tool with open-world behavior, nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds real disambiguation the schema lacks: it stresses the message id (#id) from get_inbox_conversation/get_next_unanswered is required, not the conversation id, and confirms the default hide=true toggle semantics. It stops short of new syntax detail but clearly earns above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (hide/unhide) and resource (a comment someone left on the workspace's posts), names the platforms, and clarifies the actor scope ('as the post owner'). An agent can distinguish it from delete_inbox_comment, mark_inbox_read and reply_to_inbox immediately.
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 the identifier to pass (message id, not conversation id) and names get_inbox_conversation and get_next_unanswered as the sources. It also gives when-not-to-retry conditions and routes to mark_inbox_read for the 422 case, so alternatives and exclusions are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsARead-onlyInspect
List all connected social media accounts for the active workspace. If the user has multiple workspaces, call list_workspaces first so they can pick which one to work with.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral context beyond that: results are scoped to the active workspace and workspace selection may need to happen first. It omits any note on result volume or pagination.
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. The core action and its scope are front-loaded, and the workspace prerequisite follows immediately after.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless read-only list tool with annotations carrying the safety profile and no output schema, the description covers action, scope and the one workflow dependency an agent needs. Nothing required to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. The description correctly implies no filtering or selection arguments are needed, and there is nothing for it to compensate for.
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 (list) and resource (connected social media accounts) and constrains scope to the active workspace. That scope constraint is what separates it from the singular get_account sibling without needing to name it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite and routes to list_workspaces when the user has multiple workspaces, which is real when-to-use guidance. It does not, however, state when to prefer this over get_account or what to do if no workspace is active.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_approval_workflowsARead-onlyInspect
List the approval workflows this workspace can use (company-wide ones plus workspace-bound ones), with their steps and named approvers. Workflows are created in the OmniSocials dashboard (Approvals); this tool only lists them. Pass a workflow's id as approval_workflow_id on create_post to hold a scheduled post for review: it is created as in_approval, the approvers are notified, and it publishes at schedule_at once the last step approves. Call this first when the user wants agent-created posts to be reviewed/approved before publishing; if the list is empty, tell the user to create a workflow under Approvals in the dashboard.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds real behavioral context beyond them: that workflows are created only in the dashboard and this tool merely lists them, plus the side effects (created as in_approval, approvers notified, publishes at schedule_at after final approval) of using a returned id.
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 what is listed, then the create-vs-list boundary, then the operational guidance and empty-state instruction. No filler; every sentence changes agent behavior.
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 no output schema, the description specifies the returned content (steps, named approvers) and the empty-list handling. For a zero-parameter read tool with annotations already covering the safety profile, nothing an agent needs 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 takes zero parameters, so the baseline is 4. The only identifier mentioned (approval_workflow_id) belongs to create_post, not this tool, and the description correctly frames it as a value this tool produces to be consumed elsewhere.
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 with explicit scope: company-wide plus workspace-bound workflows, including that steps and named approvers are returned. No sibling tool overlaps this resource, so differentiation is inherent.
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?
Tells the agent exactly when to call it ('Call this first when the user wants agent-created posts to be reviewed/approved before publishing') and what to do on the empty case ('tell the user to create a workflow under Approvals in the dashboard'). It also names the downstream alternative path via create_post's approval_workflow_id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_foldersARead-onlyInspect
List the media-library folders in this workspace (Finder-style organization). Returns each folder's id, name, parent, and item count. Use a folder id with list_media (folder_id) or update_media (folder_id), or a folder name with upload_media (folder).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds real value by enumerating the returned fields (id, name, parent, item count), which matters because there is no output schema. It does not mention ordering, pagination, or empty-workspace 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?
Two sentences, no filler, and the core purpose is front-loaded before the return-value and downstream-usage details. Every clause carries information the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only listing tool with annotations covering safety, the description supplies the one thing not in structured data — the shape of the result — via the enumerated return fields. Nothing essential to calling 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?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. The mention of folder_id/folder applies to sibling tools rather than this one's inputs, so no additional credit 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?
States a specific verb and resource ('List the media-library folders in this workspace') and adds scope qualifier ('Finder-style organization'), which distinguishes it from create_folder and list_media. An agent immediately knows what it returns and that it enumerates rather than filters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear downstream context: folder ids feed list_media and update_media, folder names feed upload_media. That tells the agent why to call it, but it never states when not to call it or names an alternative folder-listing route (there effectively is none among the siblings), so it falls short of explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_hashtag_setsARead-onlyInspect
List the saved hashtag sets in this workspace. Apply one to a new post by passing its name via create_post (hashtag_set) — the tags are appended to the captions or, with hashtag_placement='first_comment', posted as the auto first comment.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true and destructiveHint=false already declaring the safety profile, the description adds useful behavioral context about what applying a set does (append to captions, or post as auto first comment with hashtag_placement='first_comment'). This goes beyond what annotations cover.
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 core purpose leads, and the follow-on workflow note earns its place without 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?
No output schema exists, yet the description implicitly conveys the return (saved hashtag sets usable by name) and the workflow around them. Adequate for a zero-param list tool, though it could note whether sets are ordered or include counts.
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?
Zero parameters, so baseline is 4. The description still adds semantic value by explaining the hashtag_set and hashtag_placement parameters of the related create_post tool, clarifying how the names returned here are meant to be consumed.
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 (List) and resource (saved hashtag sets) scoped to the workspace, which cleanly distinguishes it from create_hashtag_set, update_hashtag_set, and delete_hashtag_set.
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?
Explains the downstream use case: apply a set to a new post by passing its name via create_post. It gives clear consumption context but does not state explicit when-not-to-use conditions or point to a direct alternative listing tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_inbox_conversationsARead-onlyInspect
List social inbox conversations (Instagram/Facebook DMs, comments, mentions, LinkedIn company-page comments/mentions, TikTok video comments, YouTube video comments, X DMs where the workspace has opted into X DMs, and Threads replies on the workspace's posts plus mentions), newest activity first. Cursor-paginated: pass the returned cursor to get the next page. To work through what needs answering one item at a time, use get_next_unanswered instead.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter to one conversation type | |
| limit | No | Max conversations per page (1-100, default 25) | |
| cursor | No | Pagination cursor from a previous response | |
| unread | No | Only conversations with unread incoming messages | |
| platform | No | Filter to one platform | |
| unanswered | No | Only conversations that still need an answer: the customer's latest DM has no reply after it (Instagram/Facebook DMs past the 24-hour reply window included; they cannot be answered through the API but the customer is still waiting), or a comment/mention nobody replied to and that is not hidden. Replies typed in the native apps count as answers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered; the description adds real behavioral context on ordering ('newest activity first') and pagination mechanics ('pass the returned cursor to get the next page'). It does not describe the shape or size of an individual conversation record, but the added pagination/ordering detail goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core operation and ordering are front-loaded, followed by pagination mechanics and the sibling routing. The long parenthetical platform inventory is dense but each item is load-bearing for scope. Slightly heavy in one sentence, but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still tells the agent the ordering and the cursor-pagination contract, and the six optional filters are fully documented in the schema. Combined with annotations covering the read-only profile, nothing essential 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%, with the 'unanswered' filter even spelled out in detail at the schema level, so the description does not need to re-explain parameters. It adds no syntax or format nuance beyond what the schema already provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List social inbox conversations') and enumerates exactly which sources are covered (IG/FB DMs, comments, mentions, LinkedIn, TikTok, YouTube, X, Threads). It also draws the boundary against the nearest sibling by contrasting bulk listing with one-at-a-time triage. An agent can identify the tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent to get_next_unanswered when the goal is working through items one at a time, which is a clear when-to-use-alternative statement. It stops short of covering other adjacent siblings (get_inbox_conversation, mark_inbox_read) or when to prefer the 'unanswered' filter over the sibling triage tool, so it is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_mediaARead-onlyInspect
List media files in the workspace. Shows each file's name, folder, type (image, video, or document: a PDF kept as one item whose ID in media_ids expands into every page), size, a preview link, and its media ID for use when creating posts. To reuse an existing graphic, SEARCH for it by name here FIRST instead of re-uploading — re-uploading the same image creates duplicates. Organize assets into folders with create_folder / list_folders.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results | |
| offset | No | Offset for pagination | |
| search | No | Find a file by name or filename, e.g. "play5get50". Use this before uploading to check if the graphic already exists. | |
| folder_id | No | Only return media in this folder id (from list_folders). Use "root" for unfiled items. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe read operation (readOnlyHint=true, destructiveHint=false). The description adds useful non-annotation context: the exact fields returned, the PDF-as-one-item expansion behavior, and the duplicate-creation warning. It does not cover pagination defaults, but the added behavioral detail is substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose and output summary. The parenthetical about PDF expansion is dense but valuable, and all sentences earn their place. Minor length but no wasted prose.
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 list tool with four optional params and no output schema, the description compensates by naming the returned fields and giving usage guidance. Annotations cover the safety profile. It is complete enough for correct invocation, with only pagination behavior left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents all four optional parameters. The description reinforces the search-before-upload guidance but adds no new syntax or meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List media files in the workspace,' and enumerates the returned fields. It does not explicitly contrast with sibling list tools like list_folders or list_posts, but the 'media files' resource is distinct enough to be clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use: search here before uploading to avoid duplicates. Also points to create_folder / list_folders for organizing assets. It lacks explicit exclusions or comparison to other list tools, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pinterest_productsARead-onlyInspect
List the product Pins of the connected Pinterest account, to tag products on a Pin (people can then shop the items in the image). Use this whenever the user wants to tag products on a Pinterest post.
Flow: call it → show the products to the user → pass the chosen pin_id values (max 24) as pinterest.product_tags on create_post / create_and_publish_post / update_post. If the user gives a Pin link or Pin ID of a product, pass it as check_pin to check it first, or put it straight in pinterest.product_tags.
Notes:
Only the account's own product Pins can be tagged: a public product Pin with a link on a website the account claimed on Pinterest. Products of other merchants cannot be tagged through the API.
source"catalog" reads the Pinterest catalog (with price and stock). It needs catalog access, which the user gives one time in OmniSocials: create a post, open the Pinterest options, select Add products, then Connect catalog.source"pins" reads the account's own Pins and returns the product Pins; one call scans up to 250 Pins, so an empty result with a bookmark means: call again with that bookmark. Withoutsource, the catalog is used when the connection has catalog access, else the Pins.A product that Pinterest refuses never fails the post; get_post shows which products were tagged.
| Name | Required | Description | Default |
|---|---|---|---|
| source | No | Where to read product Pins from. Default: catalog when the Pinterest connection has catalog access, else pins. | |
| bookmark | No | Cursor from an earlier result, to get the next page. | |
| check_pin | No | A Pin ID or Pin link (https://www.pinterest.com/pin/<id>/) to check instead of listing: answers whether that Pin can be tagged as a product. | |
| product_group_id | No | Catalog source only. A product group ID from an earlier result. Default: the group named All Products. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=true, so safety is covered, but the description adds substantial context: source 'catalog' vs 'pins' behavior, catalog access requirement and how to grant it, 250-Pin scan limit with bookmark pagination, the fact that a refused product never fails the post, and that get_post shows tagged products. This is rich behavioral disclosure beyond what annotations 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 front-loaded with purpose and flow, then notes. It is somewhat long but every section earns its place by covering distinct concerns (flow, access, source semantics, failure behavior). Minor verbosity in the catalog-access instructions keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with 5 mxed params, no output schema, and clear pagination semantics, the description covers everything an agent needs: when to call, what to do with results, how to paginate, how source resolution works, and failure behavior. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema documents all four parameters including the enum for source and the default logic. The description reinforces and contextualizes these (source default behavior, bookmark pagination, check_pin semantics) but does not add syntax beyond the schema, so it exceeds the baseline of 3 modestly.
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 (List) and resource (product Pins of the connected Pinterest account) and explains the downstream use case (tagging products on a Pin for shopping). It is clearly distinguished from siblings like create_post and search_* tools by naming the exact workflow it feeds into.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this whenever the user wants to tag products on a Pinterest post' and lays out the full flow: call it, show products, pass pin_id values as pinterest.product_tags on create_post/create_and_publish_post/update_post. It also states the check_pin alternative for single Pin checks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_postsARead-onlyInspect
List posts in the workspace. Filter by status to see drafts, scheduled, published, or failed posts. Returns a formatted table with content preview, channels, dates, and post IDs. The content cell shows the default caption; if a post has per-platform overrides (e.g. a custom X version) the preview is suffixed with (per-platform) — call get_post to see every variant.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default: 20) | |
| offset | No | Offset for pagination | |
| status | No | Filter by status: draft, scheduled, published, failed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the exact shape of the returned table (content preview, channels, dates, post IDs), plus the non-obvious *(per-platform)* marker convention that governs how the preview should be read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each carrying distinct payload: scope, filtering, return shape, and the per-platform reading rule with a routing instruction. Nothing is repeated and the per-platform caveat — the hardest thing to get wrong — is given last as an explicit 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?
There is no output schema, so the description correctly compensates by describing the returned table columns and the preview convention. With annotations covering safety and the schema covering all three parameters, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — limit, offset, and the four status values are all documented in the schema itself. The description restates the status filter but adds no syntax, default, or format detail beyond it, 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?
States a specific verb and resource ('List posts in the workspace') and immediately distinguishes itself from the sibling get_post by naming it as the tool to call for full per-platform variants. An agent can tell this apart from list_media, list_folders, and other list_* siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: filter by status for drafts/scheduled/published/failed, and route to get_post when the *(per-platform)* suffix appears. It names the alternative and the condition that selects it, though it does not explicitly state when not to use this tool (e.g. for a single known post ID).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_webhooksARead-onlyInspect
List all configured webhooks with their status, events, and last trigger time.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered without the description. The description usefully adds what a webhook record contains, but says nothing about pagination, ordering, or whether disabled/inactive hooks are included — gaps that matter for a listing 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?
A single front-loaded sentence with no filler. The verb, resource, scope, and returned payload are all packed in without repetition of the 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?
For a no-parameter, read-only list tool with annotations covering safety and no output schema, the description is nearly complete — it even describes the return fields in lieu of an output schema. The only missing piece is pagination/ordering behavior on large webhook lists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. The mention of returned fields is a small bonus rather than 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?
States a specific verb (List) and resource (webhooks) and adds scope ('all configured') plus the fields returned (status, events, last trigger time). It implicitly separates itself from the singular get_webhook sibling, but never names it explicitly, so the differentiation is left to inference.
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?
Usage is only implied: 'List all configured webhooks' suggests enumeration, but there is no explicit when-to-use, when-not-to-use, or pointer to the alternatives (get_webhook for a single hook, create_webhook/delete_webhook/update_webhook for other lifecycle operations). An agent can guess the context but is not guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workspacesARead-onlyInspect
List all workspaces the user has access to. Workspace selection rule: if only one workspace is available, just use it (no need to ask). If the user has named a workspace in their request (e.g. 'post to my Acme workspace'), proceed with that workspace and remember it for the rest of the conversation. If multiple workspaces exist and the user has NOT named one, call this tool, present the list, and ASK the user which one to use before posting, switching, or fetching analytics. After a successful action, mention the workspace name in your reply for clarity.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds workflow-level behavior beyond that: it tells the agent to surface the list to the user and to mention the workspace name after a successful action. It stops short of describing what a workspace record contains, but the added behavioral context is real.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by an ordered rule set that reads as a decision tree rather than filler. It runs longer than a one-line lister normally would, but every sentence maps to a distinct usage case, so the length is largely justified.
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 no output schema, the description should ideally hint at what the list returns (e.g. workspace identifiers usable with switch_workspace), and it does not. It is otherwise complete: purpose, usage routing, and post-call behavior are all covered for a zero-parameter read 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 tool takes zero parameters, so the baseline is 4; there is no parameter syntax for the description to compensate for, and schema coverage is 100% on an empty object. Nothing further is required here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all workspaces') and scopes it precisely ('the user has access to'), which separates it from siblings like list_accounts, list_folders, and list_hashtag_sets that also list resources. An agent can identify the tool's output domain 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?
Explicitly covers all three decision branches: single workspace (use it, don't ask), user-named workspace (proceed and remember it), and multiple unnamed workspaces (call this tool, present the list, ask before posting/switching/fetching analytics). It also names the downstream actions that require confirmation, which is exactly the routing guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_inbox_readBInspect
Mark all incoming messages in a conversation as read.
| Name | Required | Description | Default |
|---|---|---|---|
| conversation_id | Yes | The conversation ID to mark read |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the mutation/safety profile is covered structurally. The description adds genuine value by stating the operation is bulk ('all incoming messages in a conversation') rather than per-message, but it does not say whether the change is reversible or what permissions are required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler, though its brevity also reflects the missing usage and behavioral detail rather than tight editing of richer 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 one-parameter mutation with full schema coverage and annotations carrying the safety profile, this is minimally adequate. The gaps are the absence of guidance about read-state reversibility and any when-to-use context among the crowded inbox siblings.
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% for the single conversation_id parameter, so the baseline is 3. The description's phrase 'all incoming messages in a conversation' does clarify the blast radius of that ID (bulk vs single message), which is a modest addition over the schema's one-line 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 a specific verb (mark read), resource (incoming messages), and scope (all messages in a conversation), which distinguishes it from get_inbox_conversation and list_inbox_conversations. It does not explicitly name a sibling or an alternative, 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 offers no when-to-use context, no prerequisites, and no routing against the many inbox siblings (hide_inbox_comment, delete_inbox_comment, reply_to_inbox, get_inbox_conversation). Usage is only inferable from the verb itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_postADestructiveInspect
Publish a draft or scheduled post immediately. Only draft and scheduled posts can be published — for a failed or partially failed (warning) post use retry_post instead, which re-publishes only the failed platforms.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The post ID to publish |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, so the mutation and safety profile is covered structurally. The description adds genuinely new behavioral context: only posts in draft or scheduled state are eligible, which constrains invocation. It does not state whether publishing is reversible or what happens to the scheduled time, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, with the eligibility rule front-loaded ahead of the alternative-tool routing. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter action tool with full schema coverage and annotations carrying the safety profile, the description covers purpose, eligibility and routing adequately. It omits any indication of what publishing returns or whether the action is queued versus immediate beyond the word 'immediately', a minor gap given no output schema exists.
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?
There is a single required 'id' parameter whose schema description ('The post ID to publish') already covers it at 100% coverage. The description adds no format, source, or retrieval guidance for the ID beyond the schema, 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?
States a specific verb (publish) plus the resource (post) and an explicit precondition (draft or scheduled, published immediately). It also names the sibling retry_post and the state condition that selects it, so an agent can distinguish it from neighboring post tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives both when-to-use (draft or scheduled posts) and when-not-to-use with a named alternative ('for a failed or partially failed (warning) post use retry_post instead'), including why that alternative exists. Nothing about tool selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reject_postAInspect
Reject a post's approval workflow. Only works on a post with approval_status 'pending' (post status in_approval) — check get_post first. IMPORTANT: only succeeds if the connected user is a listed approver for the workflow's CURRENT step (same requirement as approve_post). Unlike approval, a rejection stops the WHOLE workflow immediately, not just the current step — the post's status becomes rejected and it will not publish. Pass comment to explain why; it's shown to the requester and other approvers in the post's review thread.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The post ID to reject (must have approval_status 'pending') | |
| comment | No | Optional reason for the rejection, shown to the requester and other approvers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety flags (readOnly=false, destructive=false, openWorld=false), but the description adds substantial behavioral context beyond them: the post must be in_approval, only a current-step approver may succeed, and rejection terminates the entire workflow so the post becomes 'rejected' and never publishes. That is exactly the destructive-adjacent consequence 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?
Four dense sentences, front-loaded with the core action and precondition before the divergence from approval. Slightly long, but each sentence carries distinct operational information rather than repeating 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?
With no output schema, the description still tells the agent the resulting state (status becomes 'rejected', no publish) and the permission model. Nothing needed to call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by explaining that the comment is surfaced to the requester and other approvers in the review thread, clarifying its audience and intent.
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 (reject) and resource (a post's approval workflow) and immediately scopes it. An agent can distinguish it from approve_post 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?
Explicit preconditions: only works on approval_status 'pending', instructs to check get_post first, and names the sibling approve_post with the shared approver requirement. The when/when-not conditions are fully spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_to_inboxADestructiveInspect
Reply to an existing inbox conversation (DM, comment, or mention) on Instagram, Facebook, LinkedIn, TikTok, YouTube, X, or Threads. You can only reply to conversations that already exist. For a comment or mention, pass message_id (the #id of the comment being answered): comments on one post share a conversation and without it the reply goes under the newest comment on the post. Meta direct-message replies must be within the platform's 24-hour messaging window: a 422 outside_messaging_window means the window has closed, nothing was sent, and the user must answer that DM from the Instagram or Facebook app (mirrored into the inbox) or skip it with mark_inbox_read; do not retry. TikTok replies are comments only, text-only, and capped at 150 characters; they can take a few minutes to appear on TikTok while they pass spam review. YouTube replies are comments only. Threads replies are on the workspace's posts and mentions; a 401 reauth_required means the Threads connection must be reconnected to grant the reply permission. X replies are DM-only and use credits from the organisation's existing balance (X's API fee passed through); a 402 insufficient_credits error means that balance is too low — tell the user and do not retry. attachment_url/attachment_type let you send media on a Facebook or Instagram DM (text is optional when an attachment is set); other platforms are text-only. Set include_next: true to get the next conversation that needs an answer back in the same call (same as get_next_unanswered), so the inbox can be worked through as: get_next_unanswered → draft → reply_to_inbox(include_next) → draft → repeat. A 409 duplicate_reply means this exact reply already went out to this conversation in the last 10 minutes (an earlier call that looked slow or failed did succeed) or is being sent right now: nothing was sent again, do NOT retry it — continue with get_next_unanswered. A 422 reply_not_allowed means the platform refuses replies to this item for good (Facebook #1705: the comment sits on a share or boosted copy of the post, or the commenter restricts replies; YouTube: the thread's canReply is false because comments are off on the video or the comment was removed or held for review): the item is dropped from get_next_unanswered automatically, tell the user, and do NOT retry.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | The reply text (max 2000 characters; TikTok comments max 150). Optional when attachment_url is set. | |
| message_id | No | For comment/mention threads: the inbox id of the comment you are answering (the 'Message to answer' #id from get_next_unanswered, or a #id from get_inbox_conversation). Every comment on a post shares one conversation, so without it the reply is posted under the newest comment on the post, which can be a different person than the one you drafted for. Always pass it for comments. Ignored for DMs. | |
| include_next | No | After sending, also return the next conversation that needs an answer (full thread + post context), or 'nothing waiting' | |
| attachment_url | No | Media URL to send (Facebook and Instagram DMs only) | |
| attachment_type | No | image, video, audio, or file — required if attachment_url is set | |
| conversation_id | Yes | The conversation ID to reply to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, openWorldHint=true, readOnlyHint=false, and the description adds platform-specific behavior far beyond them: the Meta 24-hour messaging window, TikTok 150-character text-only limit and spam-review delay, YouTube canReply restrictions, X credit-based billing, and the exact semantics of 409 duplicate_reply and 422 reply_not_allowed. This is the kind of disclosure an agent needs to avoid retry loops and misrouted replies.
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 content is valuable but presented as a single dense paragraph with no line breaks or grouping by platform/error code, making it harder to scan than necessary. The first sentence is well front-loaded, but the remainder is a wall of run-on error and platform detail that could be structured into bullets without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, multi-platform mutation tool with no output schema, the description covers success behavior, platform-specific constraints, all important error codes and their required next actions, and the include_next return contract. An agent has everything needed to call this correctly and recover from failures.
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 meaningfully enriches parameter usage by explaining why message_id must always be passed for comments (conversation sharing on a post) and how include_next chains into the inbox workflow. It also restates attachment constraints and platform-specific text limits that the schema only partially captures.
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 first sentence states a specific verb (reply) and resource (existing inbox conversation) and enumerates the exact platforms covered. It distinguishes itself from siblings like get_next_unanswered and get_inbox_conversation by requiring an already-existing conversation.
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 explicit when-to-use guidance, names alternative tools for adjacent actions (mark_inbox_read, get_next_unanswered), and details the exact error-specific routing for 422, 409, 401 and 402 cases, including when not to retry. The get_next_unanswered → draft → reply_to_inbox(include_next) workflow is spelled out step by step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
retry_postADestructiveInspect
Retry the failed platforms of a failed or partially failed post — on the same post, no duplicate created. Use when a post has status failed (every platform failed) or warning (some failed, some published): only the FAILED platforms are re-published; platforms that already succeeded are never posted again. Runs asynchronously (usually within a few minutes) — poll get_post afterwards: on success the status becomes published and published_urls gains the platform's live URL. Max 3 retries per platform; after that, recreate the post. Note publish_post refuses failed posts; this is the tool for them.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The failed or partially failed post ID to retry |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=true, openWorldHint=true), the description discloses that only FAILED platforms are re-published, that succeeded platforms are never reposted, that execution is asynchronous, that the agent must poll get_post, and that there is a max of 3 retries per platform. That is the kind of operational detail annotations cannot express.
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: scope, eligibility, platform-level behavior, async semantics, polling target, retry cap, and sibling contrast. The key constraint (same post, no duplicate) is front-loaded rather than buried.
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?
No output schema exists, yet the description still tells the agent what to expect after the call (status becomes `published`, `published_urls` gains the live URL) and how to observe it via get_post. For a one-parameter async mutation tool, nothing an agent needs to invoke and follow up 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?
Only one parameter, and schema coverage is 100%, so the schema already documents `id` fully; the description adds no format, ID-source, or validation detail. Baseline 3 is appropriate when the schema carries the parameter burden.
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 ('Retry the failed platforms of a failed or partially failed post') and immediately scopes it ('on the same post, no duplicate created'). It explicitly contrasts itself with the sibling publish_post ('publish_post refuses failed posts; this is the tool for them'), so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit triggering conditions (status `failed` or `warning`) plus what happens in each case, names the alternative (publish_post) and its limitation, and states the escalation path after retries are exhausted ('after that, recreate the post'). Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rotate_webhook_secretADestructiveInspect
Rotate the signing secret for a webhook. The new secret will only be shown once.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The webhook ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is partly covered. The description adds a genuinely important behavioral fact beyond that: the new secret is returned only once and is unrecoverable afterward, which changes how the agent must handle the response. It stops short of saying whether the old secret is invalidated immediately and whether existing webhook consumers break.
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 operation and followed by the one critical caveat. Nothing is padded and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive mutation with no output schema, the definition covers the essentials and flags the one-time visibility of the returned secret. The remaining gap is the effect on the previous secret and existing integrations, which matters for a destructive rotation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'id' parameter is already documented as the webhook ID, so the schema carries the load. The description adds no format, prefix, or lookup guidance beyond it; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (rotate) and resource (webhook signing secret), which is immediately separable from the sibling webhook tools (create_webhook, update_webhook, delete_webhook, get_webhook, list_webhooks). No ambiguity about what operation is performed.
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 states what happens but gives no guidance on when to rotate versus using update_webhook, nor any prerequisite or trigger condition (e.g. suspected compromise, scheduled rotation). Usage must be inferred entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_instagram_audioARead-onlyInspect
Search Instagram's licensed music catalog for a track to attach to a REEL. Use this whenever the user wants to post a reel WITH music/a song/a sound (e.g. "post this reel with trending audio", "add that song to it").
Flow: call with a song/artist/keyword (or NO query for currently trending audio) → present the options → once the user picks, pass that result's audio_id as instagram.audio_id on create_post / create_and_publish_post / update_post. Optionally mix with instagram.audio_volume / instagram.video_volume (0-100; set video_volume 0 to fully replace the video's own sound). Instagram Reels only — feed posts, carousels, and Stories can't take music via the API (Meta limitation).
Notes: only tracks Meta licenses for third-party publishing appear, so the selection can differ from the Instagram app. Requires the workspace to have a Facebook account connected whose Page is linked to this Instagram account — if results say Facebook is needed, tell the user to connect it under Settings → Organisation → Workspaces.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Catalog to search: licensed music (default) or original sounds created by Instagram users. | |
| query | No | Song title, artist, or keyword. OMIT for currently trending audio. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already declare readOnlyHint/openWorldHint/destructiveHint, the description adds substantial behavioral context beyond them: the licensing limitation that results differ from the Instagram app, and the prerequisite that the workspace must have a Facebook account connected with a linked Page, including an error-handling instruction. This is exactly the kind of hidden constraint that saves an agent from a failed call.
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 purpose, then organized into a Flow and a Notes block. Despite its length, every sentence carries actionable content (examples, the Reels-only limitation, the Facebook prerequisite), so nothing is wasted.
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 search tool with no output schema, the description supplies the missing pieces: what to do with results (present options, pass audio_id downstream), the return-relevant field name, and the auth/prerequisite conditions. Nothing an agent needs to call it correctly appears to be 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 both parameters (type, query) are already fully documented, including the "OMIT for trending" behavior that the description repeats. The description adds downstream context (audio_id, volume params) but little new meaning about this tool's own parameters, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ("Search Instagram's licensed music catalog for a track") and scopes it to a REEL, which clearly separates it from media/post/list siblings. An agent can identify the tool's function without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly when to use it ("whenever the user wants to post a reel WITH music/a song/a sound") with concrete examples, and it also gives an explicit exclusion ("Instagram Reels only — feed posts, carousels, and Stories can't take music via the API"). It further routes the agent to the downstream tools where the result is consumed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_locationsARead-onlyInspect
Search for a location to tag on a post. Use this whenever the user wants to post WITH a place/location (e.g. "tag my dealership", "post this at the café"). It returns matching real venues with their addresses and a location ID.
Pick the platform with platform: "instagram" (default) or "threads". The two use DIFFERENT ids (a Facebook Place ID is not a Threads location id), so search with the platform you will tag. If the user wants both, search twice.
Flow (Instagram): call with the place name → present the options → once the user picks, pass that result's id as the top-level location_id on create_post / create_and_publish_post / update_post.
Flow (Threads): same, but pass the id as threads.location_id. On a multi-post thread the tag goes on the first post.
Notes: use a SPECIFIC venue name (a broad brand like "Starbucks" returns individual store locations). Instagram: if the user already has a numeric Facebook Place ID, you can pass it straight to create_post; it's validated at publish and a bad one returns a clear error. If results are empty with a permission note, the workspace's Facebook app can't search arbitrary places — tell the user to use their own business Page's ID. Threads: needs the workspace's Threads connection to have the location permission; if the result says to reconnect Threads, tell the user to reconnect it under Settings → Organisation → Workspaces.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Place name to search (min 2 chars) — a dealership, café, venue, etc. | |
| platform | No | Which platform the location will be tagged on. Defaults to instagram. Use threads to get a Threads location id for threads.location_id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnlyHint, openWorldHint, destructiveHint), and the description goes further by disclosing failure modes: empty results with a permission note mean the Facebook app can't search arbitrary places, Threads needs a location permission that may require reconnecting, and bad Place IDs are validated at publish. It stops short of describing pagination or result limits, but the behavioral context is rich.
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?
Well front-loaded (purpose, then platform choice, then per-platform flows, then edge-case notes) and every paragraph carries actionable content. It is long, but the density is justified by the multi-step tagging workflow it has to support.
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?
No output schema exists, so the description carries the return burden and does so ("matching real venues with their addresses and a location ID"), plus error/permission paths and the handoff to post-creation tools. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond it: the two platforms return DIFFERENT id namespaces, so you must search with the platform you'll tag, and it advises using a specific venue name since a broad brand returns individual stores.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Search for a location to tag on a post") and its role in a larger flow, clearly distinct from siblings like search_instagram_audio. An agent knows exactly what it does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger conditions ("whenever the user wants to post WITH a place/location") plus worked examples, then spells out the per-platform flow and how the returned id feeds create_post / create_and_publish_post / update_post. Alternatives and follow-up routing are unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
switch_workspaceAInspect
Switch the active workspace by NAME. All subsequent tool calls (posts, media, analytics, etc.) will operate on the selected workspace. Pass the workspace name exactly as shown in list_workspaces (its id or list position also work, but the name is preferred and unambiguous). Only call this when the user has explicitly named the target workspace, or after the user has picked one from list_workspaces. Never call switch_workspace silently when the user hasn't specified a workspace - ask first.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace | Yes | The workspace to switch to: its name (preferred, e.g. "Daily Edge Sports"), or its id/list number. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses a significant behavioral trait beyond the annotations: that all subsequent tool calls (posts, media, analytics) operate on the selected workspace, i.e. a session-wide state change. Annotations only carry the generic readOnlyHint=false/destructiveHint=false/openWorldHint=false safety profile, so the state-scoping note is genuinely additive. It stops short of describing reversibility or any confirmation/error behavior, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then the side effect, then the parameter format, then the usage rules. Four sentences, each carrying distinct information (what, effect, format, guardrail) 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?
For a single-param tool with 100% schema coverage, annotations, and no output schema, the description covers purpose, session-wide side effect, value format, and a consent guardrail. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so 3 is the baseline, but the description adds useful format guidance beyond the schema: pass the name 'exactly as shown in list_workspaces' and that the name is preferred because it is unambiguous. That cross-reference to the source-of-truth lister is real added meaning, though the name/id/list-number alternatives largely duplicate the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Switch the active workspace') and immediately differentiates itself from the sibling list_workspaces by referencing it as the source of valid values. An agent can distinguish this state-changing tool from read-only listers without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('only when the user has explicitly named the target workspace, or after the user has picked one from list_workspaces') and explicit when-not-to-use ('Never call switch_workspace silently... ask first'). The alternative (list_workspaces) is named and the routing condition is spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_hashtag_setAInspect
Rename a hashtag set and/or replace its tags. 'hashtags' replaces the FULL list — to add or remove tags, pass the complete new list (see list_hashtag_sets for the current tags). Posts that already used the set are unaffected.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New name for the set | |
| set_id | Yes | The hashtag set id (from list_hashtag_sets) | |
| hashtags | No | Full replacement tag list, in order |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-destructive, closed-world, and the description adds behavior beyond them: hashtags is a full replacement, not a merge, and existing posts that used the set are unaffected. It does not cover permissions or error behavior, so it is strong but not exhaustive.
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 front-loaded sentences with zero filler: purpose first, then the critical replacement caveat, then the side-effect note. 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 small mutation tool with no output schema and full schema coverage, the description supplies the essential semantics: optionality ('and/or'), replacement behavior, and non-retroactivity. Remaining minor gaps (empty-list handling, permission requirements) are not 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?
Schema description coverage is 100%, so the baseline is 3, but the description goes further by spelling out the replacement semantics operationally (pass the complete list) and routing the agent to list_hashtag_sets for current values. That adds usable meaning beyond the schema's terse 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?
States a specific verb and resource ('Rename a hashtag set and/or replace its tags'), listing exactly which fields it mutates. This clearly separates it from create_hashtag_set, delete_hashtag_set, and list_hashtag_sets among the 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?
Explains the key operational condition: to add or remove tags you must pass the complete new list, and it points to list_hashtag_sets to obtain the current tags. It gives clear context but stops short of stating when to use this versus other mutation alternatives (e.g. delete/recreate).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_mediaAInspect
Rename an existing media file or move it into a folder (so it's findable later instead of re-uploading it). Only the fields you pass are changed.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The media ID to update | |
| name | No | New human-readable label, e.g. "pp-play5get50". Pass an empty string to clear it. | |
| folder_id | No | Move the file into this folder id (from list_folders). Pass an empty string to move it to the root ("All media"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds a genuinely useful trait beyond that: "Only the fields you pass are changed," disclosing partial-update semantics rather than full overwrite.
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 with the operation front-loaded and the non-clobbering behavior immediately following; nothing is wasted.
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 3-param update with full schema coverage, annotations and no output schema, the description is essentially complete. It could still mention that folder_id comes from list_folders, but the schema covers that.
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 schema already documents id, name and folder_id including the empty-string clear/move-to-root behavior. The description adds no parameter detail beyond what the schema provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (rename/move a media file) with a clear scope, and the parenthetical hints at why. It is readily distinguishable from upload_media and delete_media, though it never names a sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase "instead of re-uploading it" implies the use case (fixing an existing asset rather than re-uploading), but there is no explicit when-to-use/when-not or pointer to an alternative tool such as list_folders for the folder_id lookup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_postAInspect
Update an existing post. Only draft and scheduled posts can be updated.
Per-platform options (youtube, pinterest, instagram, tiktok, google_business) are accepted here, same shape as in create_post. Pass an object — never a JSON-encoded string. For YouTube Shorts, the title lives at youtube.title; the video description lives in content (or content.youtube for a per-platform override). They are not the same field — changing the caption does NOT rename the Short.
X threads: To convert an existing draft into a chained X thread, pass x.thread_parts as a 2–25 entry array of { text } objects (each ≤ 280 chars). Pass x.thread_parts: null to revert to single-tweet mode. Do NOT shove "1/", "2/" into content — that's a single tweet, not a thread.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | X (Twitter) options, including thread mode via `thread_parts`. | |
| id | Yes | The post ID to update | |
| tiktok | No | TikTok options | |
| bluesky | No | Bluesky options, including thread mode via `thread_parts`. | |
| content | No | Updated post caption / body text. For YouTube Shorts this becomes the video description, NOT the title — to rename the Short, use `youtube.title`. String or object with platform keys: { "default": "fallback", "linkedin": "long" }. | |
| threads | No | Threads options: thread mode via `thread_parts`, location tag via `location_id`. | |
| youtube | No | YouTube Shorts options. Only applies when type is 'reel' and youtube is among the selected channels. A custom Shorts thumbnail is set with the top-level `video_cover` (a `youtube` override for a YouTube-only image); it shows on Shorts only on channels where YouTube has enabled custom Shorts thumbnails (Partner Program channels first, since July 2026), other channels show a frame from the video. | |
| channels | No | Updated channel IDs. Note: `linkedin` (personal profile) and `linkedin_page` (company page) are independent channels. | |
| No | Facebook options | ||
| link_url | No | URL to share as a rich preview card on platforms that support link-share posts (LinkedIn and Facebook). Renders as a tile with thumbnail/title/description instead of plain text. Ignored on platforms that don't support link shares, and ignored on posts that already have media attached (media wins). | |
| No | LinkedIn Profile options | ||
| mastodon | No | Mastodon options, including thread mode via `thread_parts`. | |
| No | Instagram options | ||
| media_ids | No | ||
| No | |||
| user_tags | No | Instagram only. Tag public accounts at x/y positions on a PHOTO (not video/reels/stories). For a single image omit image_index; for a carousel, set image_index to the slide each tag belongs to. Private/non-existent usernames are rejected at publish time. Ignored by other platforms. | |
| link_title | No | Optional title for the link-share preview. LinkedIn uses this when set; Facebook ignores it and fetches OG metadata server-side. Omit to let LinkedIn auto-fetch the page title. | |
| media_urls | No | External image/video/PDF URLs — flat array or per-platform object. Max 10 total (Pinterest: max 5 images per carousel pin), each file ≤ 100 MB. Entries are URL strings or { url, alt } objects (alt = accessibility description, delivered to Mastodon/Bluesky/X/Pinterest/Instagram (images)/LinkedIn (images)). For larger files (up to 1 GB): upload_media with method 'url' first, then pass the returned media id in `media`. | |
| location_id | No | Instagram only. Facebook Place ID for a single physical venue (with a street address) to tag the post's location. Find it via the location search in the OmniSocials dashboard. Ignored by other platforms. | |
| video_cover | No | Replaces the stored video cover wholesale; pass null to remove it; omit to leave it untouched. facebook.thumbnail_type / thumb_offset / cover_url merge into overrides.facebook on their own. | |
| scheduled_at | No | Updated scheduled date (ISO 8601) | |
| collaborators | No | Instagram only. Up to 3 public Instagram usernames to invite as co-authors (the 'Collab' feature). Works on image, carousel, and reel posts — NOT Stories. Invited users get an invite in the Instagram app; once they accept, the post also appears on their profile and feed. A leading '@' is stripped; usernames are case-insensitive. Private or non-existent usernames are rejected by Instagram at publish time. Ignored by other platforms. | |
| linkedin_page | No | LinkedIn Company Page options | |
| linkedin_poll | No | Non-sponsored LinkedIn poll(s) — independent per channel, keyed by `linkedin` (personal profile) / `linkedin_page` (company page). A poll is mutually exclusive with media and a link share on that channel's post — a poll takes priority over both at publish time. Still requires `content.linkedin` (or `content.default`) as that channel's caption; the poll itself only carries the question/options/duration. On update_post, set a channel's key to `null` to clear that channel's poll and revert it to a normal post — send the full desired state for both channels, since the whole object replaces wholesale. | |
| google_business | No | Google Business Profile options. Use to publish EVENT or OFFER posts, attach a CTA button, or both. Shape mirrors Google's LocalPost resource (see https://developers.google.com/my-business/reference/rest/v4/accounts.locations.localPosts#LocalPost). Google Business caption rules (enforced at scheduling — text that violates these will return a `validation_error` 400 before the post is saved): • Phone numbers in the caption are rejected — use a CALL button instead. • Inline URLs / bare domains / emails are rejected — use LEARN_MORE / BOOK / SHOP / SIGN_UP / ORDER buttons instead. • Caption max 1500 characters. • Media is optional (text-only posts are allowed). If attached: exactly one JPEG/PNG/WebP image (no video, no carousels). • The workspace must have a Google Business location selected (Settings → Organisation → Workspaces → Google Business) before scheduling — otherwise returns a 400. | |
| link_description | No | Optional description for the link-share preview. LinkedIn uses this when set; Facebook auto-fetches the OG description. | |
| link_thumbnail_url | No | Optional thumbnail image URL for the preview card. Currently applied on Facebook; reserved for LinkedIn. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish it as a non-read-only, non-destructive, non-open-world mutation. The description goes beyond that by disclosing the draft/scheduled-only constraint and the thread ↔ single-post conversion mechanics (including null-to-revert), which are behavior an agent needs. It does not state merge-vs-replace semantics at the top level, leaving some mutation detail 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?
Three tightly scoped, bold-headed blocks front-load the eligibility rule and then cover only the genuinely tricky areas (per-platform shape, YouTube title/content, X threads). For a 27-parameter nested tool this is compact, with little wasted wording.
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 high-complexity, 27-param, deeply nested tool with no output schema, the description covers the highest-risk pitfalls, and the 93%-covered schema handles the rest. Safety is covered by annotations, so nothing critical an agent needs to call it correctly appears missing, though fields like media/collaborators are left entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 93%, so the baseline is 3 and the schema carries most parameter meaning. The description adds real value over the schema by warning to pass objects rather than JSON-encoded strings and by disambiguating youtube.title from content for Shorts ('changing the caption does NOT rename the Short') and the x.thread_parts 2–25 shape.
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 first sentence names a specific verb (update) and resource (existing post), and immediately constrains the eligibility to draft and scheduled posts. It also specifies what the per-platform options and thread fields do, letting an agent distinguish it from create_post/publish_post without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear eligibility rule ('Only draft and scheduled posts can be updated') and explains thread-conversion usage ('pass x.thread_parts to convert a draft, null to revert'). It references create_post for shared option shape, but never explicitly states when to choose update_post over create_post or publish_post, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_webhookCInspect
Update a webhook's URL, events, or active status.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The webhook ID to update | |
| url | No | Updated HTTPS URL | |
| events | No | Updated event list | |
| is_active | No | Enable or disable |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, closed-world write, so the safety profile is covered. The description adds nothing behavioral beyond that: it does not say whether omitted fields are preserved or cleared, whether changes take effect immediately, or what permissions are needed for a 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 with no filler; the verb and resource lead. It is efficient, though the brevity is partly why behavioral and usage detail are absent.
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 four fully documented parameters, annotations covering the safety profile, and no output schema, the essentials are present. The notable gap for a mutation tool is partial-update semantics (what happens to fields not supplied), which neither schema nor description addresses.
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 schema already documents id, url, events and is_active with types and the HTTPS constraint. The description merely restates the mutable fields in prose and adds no format or semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) and resource (webhook) plus the three mutable fields, so an agent can distinguish it from create_webhook, delete_webhook, get_webhook and rotate_webhook_secret. It does not explicitly name a sibling it is not, but the verb+resource pairing 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?
There is no when-to-use guidance, no prerequisites (e.g. that the webhook must already exist, or that the ID comes from list_webhooks), and no mention of alternatives such as rotate_webhook_secret for credential changes. Usage is only implied by the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_mediaAInspect
Upload media to the library. Three methods supported:
url — import from a PUBLIC https URL (e.g. a hosted image link). NEVER pass a local sandbox path — the URL must be reachable from our servers.
base64_data — pass base64-encoded file data directly. ONLY use this for tiny files (≲50 KB). MCP tool inputs are token-capped — anything larger gets silently truncated and uploads a corrupted file. For any user-pasted image, use upload_url instead.
upload_url — PREFERRED for any file the user attached to the chat. Call with method="upload_url" to get a one-time presigned URL plus a ready-to-run snippet. Execute the snippet in your code-execution tool against the actual file path. The response JSON contains the media id you pass to create_post.
Size limits: base64/direct uploads are capped at 100 MB. For anything larger — up to 1 GB — use a public url (fetched server-side, bypasses the cap), OR have the user upload the file in the OmniSocials Library UI at https://app.omnisocials.com/library . IMPORTANT: if the user has a large LOCAL file (over ~100 MB) with no public url, do NOT tell them to compress it — point them to the Library UI link above. Large videos (over 100 MB) are processed in the background — the response status is "processing" and the file is NOT usable in a post until it becomes "ready" (re-check with list_media).
Compatibility: every upload response includes a "compatibility" summary of any CONNECTED platforms that would reject the file (e.g. too large for Instagram). If there are warnings, RELAY them and ask the user whether to continue before posting — the file still uploads and can post to platforms that accept it. To check BEFORE uploading, call check_media_compatibility first.
PDF = carousel: upload a PDF (via a public url, or base64_data with mime_type "application/pdf", or the upload_url snippet) and it is split into one image slide per page (max 20). The response lists a Media ID for EVERY slide — pass ALL of them, in order, as media_ids to create_post to post the deck as a carousel. On LinkedIn the slides post as a native swipeable DOCUMENT made from the ORIGINAL PDF file (the file is kept: text stays sharp, in-document links work, viewers download the real file, and every page is included even past the 20-slide cap) as long as the slides are posted unchanged and in order; on Instagram, TikTok, Threads and Pinterest as an image carousel. Set linkedin.document_source to 'slides' on the post to send a document rebuilt from the slide images instead. This is how a user posts an existing slide deck (Canva/PowerPoint/Figma exported to PDF) as a carousel. Prefer pdf_mode "document" when the user wants ONE library item for the deck (no per-page clutter): the response then has a single Media ID whose media_ids entry expands into every page at post time.
Supported: JPEG, PNG, GIF, WebP, MP4, MOV, AVI, PDF.
For user-attached files: ALWAYS try upload_url first. Call upload_media with method="upload_url", then in your code-execution sandbox run the returned Python (ChatGPT Code Interpreter, file at /mnt/data/) or curl (Claude Code Execution) snippet against the actual file path. Only react to a failure AFTER actually executing the snippet.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Public URL of the media file (method=url). Use this when the user pasted an image link or you generated one via DALL·E. | |
| file | No | OpenAI Apps SDK file reference. Set when the user attached a file in ChatGPT — the platform fills this in automatically. | |
| name | No | Human-readable label so you can find this asset by name later instead of re-uploading it, e.g. "pp-play5get50". Strongly recommended on every upload. | |
| folder | No | Optional folder name to file this asset under (created at the top level if it does not exist), e.g. "win-graphics". Use list_folders to see existing folders. | |
| method | No | Upload method: "file" (ChatGPT user-attached image — preferred), "url", "base64_data", or "upload_url". Auto-detected from which arg you pass. | |
| filename | No | Optional filename with extension | |
| pdf_mode | No | PDF uploads only. "slides" (default): one image media item per page, one Media ID each (pass ALL of media_ids to create_post). "document": ONE media item for the whole PDF (type "document"); pass its single Media ID in media_ids and the post gets every page in order. Both keep the original file, which LinkedIn receives. For method="upload_url", send it as a form field: -F pdf_mode=document. | |
| mime_type | No | MIME type (e.g. 'image/jpeg'). Required for base64_data and upload_url. | |
| base64_data | No | Base64-encoded file data (method=base64_data). Only safe for files <50 KB. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare only readOnlyHint=false, openWorldHint=true, destructiveHint=false. The description adds substantial non-obvious behavior: token-cap truncation on base64, the 100 MB/1 GB size ceilings, background 'processing' status for large videos, compatibility warnings, PDF page-splitting, and LinkedIn document preservation. These are exactly the traits an agent cannot infer from 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?
Front-loaded and well-organized with a numbered method list and labeled sections (size limits, compatibility, PDF, supported formats). It is long but largely justified by the 9-parameter, multi-method surface; the only cost is mild repetition of the 'always try upload_url first' guidance.
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 no output schema, the description carries the burden of describing returns and does so thoroughly: media id, compatibility summary, 'processing' status with list_media re-check, and per-slide media_ids. Given the tool's complexity and nested file object, nothing critical appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine operational semantics beyond the schema: it explains method selection, warns that base64 silently truncates above ~50 KB, and clarifies pdf_mode 'slides' vs 'document' downstream effects. It slightly exceeds the baseline by tying parameter choices to failure modes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a precise verb+resource ('Upload media to the library') and immediately enumerates the three supported input methods with concrete examples. It clearly distinguishes itself from siblings like list_media, delete_media, and update_media, and even names check_media_compatibility and create_post as adjacent steps.
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 to use each method (url for public links, base64 for tiny files, upload_url for user-attached files), gives a clear preference order, and names conditions and alternatives (check_media_compatibility before uploading, Library UI for >1 GB local files, do NOT compress). This is textbook when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
- Changed
create_and_publish_post1 field changed- added
Input schema / properties / pinterest / properties / product_tagsAdded value: +{ + "description": "Products to tag on the Pin, so people can shop the items in the image. Up to 24 product Pins of the connected Pinterest account, each as a Pin ID string or a Pin link (https://www.pinterest.com/pin/<id>/). Get the IDs with list_pinterest_products. Only the account's own product Pins can be tagged (public, with a link on a website the account claimed on Pinterest); products of other merchants cannot. The tags are added right after the Pin is published; a product Pinterest refuses never fails the post, and get_post shows the outcome (product_tags_result). On update_post the pinterest object replaces the stored one, so leave product_tags out to remove the tags.", + "items": { + "type": "string" + }, + "maxItems": 24, + "type": "array" +}
- Changed
create_post1 field changed- added
Input schema / properties / pinterest / properties / product_tagsAdded value: +{ + "description": "Products to tag on the Pin, so people can shop the items in the image. Up to 24 product Pins of the connected Pinterest account, each as a Pin ID string or a Pin link (https://www.pinterest.com/pin/<id>/). Get the IDs with list_pinterest_products. Only the account's own product Pins can be tagged (public, with a link on a website the account claimed on Pinterest); products of other merchants cannot. The tags are added right after the Pin is published; a product Pinterest refuses never fails the post, and get_post shows the outcome (product_tags_result). On update_post the pinterest object replaces the stored one, so leave product_tags out to remove the tags.", + "items": { + "type": "string" + }, + "maxItems": 24, + "type": "array" +}
- Added
list_pinterest_products - Changed
update_post1 field changed- added
Input schema / properties / pinterest / properties / product_tagsAdded value: +{ + "description": "Products to tag on the Pin, so people can shop the items in the image. Up to 24 product Pins of the connected Pinterest account, each as a Pin ID string or a Pin link (https://www.pinterest.com/pin/<id>/). Get the IDs with list_pinterest_products. Only the account's own product Pins can be tagged (public, with a link on a website the account claimed on Pinterest); products of other merchants cannot. The tags are added right after the Pin is published; a product Pinterest refuses never fails the post, and get_post shows the outcome (product_tags_result). On update_post the pinterest object replaces the stored one, so leave product_tags out to remove the tags.", + "items": { + "type": "string" + }, + "maxItems": 24, + "type": "array" +}
1 tool update
- Added
get_post_approval
3 tool updates
- Changed
create_and_publish_post5 fields changed- added
Input schema / properties / facebook / properties / cover_urlAdded value: +{ + "description": "Custom thumbnail image URL (JPEG/PNG, max 10 MB). Used with thumbnail_type 'from-library'.", + "type": "string" +} - added
Input schema / properties / facebook / properties / thumb_offsetAdded value: +{ + "description": "Frame timestamp in MILLISECONDS from the start of the video (e.g. 3000 = 0:03). Used with thumbnail_type 'from-video'.", + "type": "number" +} - added
Input schema / properties / facebook / properties / thumbnail_typeAdded value: +{ + "anyOf": [ + { + "enum": [ + "from-video", + "from-library" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Video thumbnail for Facebook feed videos and reels: 'from-video' uses the frame at thumb_offset, 'from-library' uploads the image at cover_url. Applied after the video is live; a thumbnail failure never fails the post. On update_post, null removes the Facebook override." +} - added
Input schema / properties / video_coverAdded value: +{ + "description": "Video thumbnail for a post whose media is ONE video. Applied on Instagram (feed videos and reels), Facebook (feed videos and reels), LinkedIn Profile and Page, TikTok, Pinterest and YouTube Shorts. YouTube Shorts: the cover shows on Shorts only on channels where YouTube has enabled custom Shorts thumbnails (rolling out since July 2026, Partner Program channels first); on other channels YouTube stores it as the default thumbnail but shows a frame from the video on Shorts. Say that it depends on the channel; do not promise it. TikTok only takes a frame: a 'custom' cover is skipped there, so add a tiktok override with type 'frame' when the user wants a specific TikTok frame. The per-platform reel fields (instagram.thumb_offset / cover_url, tiktok.video_cover_timestamp_ms, pinterest.video_cover) keep working and win over the base cover for their platform. get_post reads it back as `video_cover`.", + "properties": { + "cover_url": { + "description": "Public image URL, JPEG or PNG (type 'custom').", + "type": "string" + }, + "overrides": { + "additionalProperties": { + "anyOf": [ + { + "properties": { + "cover_url": { + "description": "Public image URL, JPEG or PNG (type 'custom').", + "type": "string" + }, + "thumb_offset": { + "description": "Milliseconds into the video (type 'frame'). 3000 = 0:03.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "type": { + "description": "'frame' uses the video frame at thumb_offset; 'custom' uploads the image at cover_url.", + "enum": [ + "frame", + "custom" + ], + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "description": "Per-platform overrides keyed by platform id (instagram, facebook, linkedin, linkedin_page, tiktok, pinterest, youtube). An override wins over the base cover for that platform.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "thumb_offset": { + "description": "Milliseconds into the video (type 'frame'). 3000 = 0:03.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "type": { + "description": "'frame' uses the video frame at thumb_offset; 'custom' uploads the image at cover_url.", + "enum": [ + "frame", + "custom" + ], + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" +} - changed
Input schema / properties / youtube / descriptionPrevious value: -"YouTube Shorts options. Only applies when type is 'reel' and youtube is among the selected channels."New value: +"YouTube Shorts options. Only applies when type is 'reel' and youtube is among the selected channels. A custom Shorts thumbnail is set with the top-level `video_cover` (a `youtube` override for a YouTube-only image); it shows on Shorts only on channels where YouTube has enabled custom Shorts thumbnails (Partner Program channels first, since July 2026), other channels show a frame from the video."
- Changed
create_post5 fields changed- added
Input schema / properties / facebook / properties / cover_urlAdded value: +{ + "description": "Custom thumbnail image URL (JPEG/PNG, max 10 MB). Used with thumbnail_type 'from-library'.", + "type": "string" +} - added
Input schema / properties / facebook / properties / thumb_offsetAdded value: +{ + "description": "Frame timestamp in MILLISECONDS from the start of the video (e.g. 3000 = 0:03). Used with thumbnail_type 'from-video'.", + "type": "number" +} - added
Input schema / properties / facebook / properties / thumbnail_typeAdded value: +{ + "anyOf": [ + { + "enum": [ + "from-video", + "from-library" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Video thumbnail for Facebook feed videos and reels: 'from-video' uses the frame at thumb_offset, 'from-library' uploads the image at cover_url. Applied after the video is live; a thumbnail failure never fails the post. On update_post, null removes the Facebook override." +} - added
Input schema / properties / video_coverAdded value: +{ + "description": "Video thumbnail for a post whose media is ONE video. Applied on Instagram (feed videos and reels), Facebook (feed videos and reels), LinkedIn Profile and Page, TikTok, Pinterest and YouTube Shorts. YouTube Shorts: the cover shows on Shorts only on channels where YouTube has enabled custom Shorts thumbnails (rolling out since July 2026, Partner Program channels first); on other channels YouTube stores it as the default thumbnail but shows a frame from the video on Shorts. Say that it depends on the channel; do not promise it. TikTok only takes a frame: a 'custom' cover is skipped there, so add a tiktok override with type 'frame' when the user wants a specific TikTok frame. The per-platform reel fields (instagram.thumb_offset / cover_url, tiktok.video_cover_timestamp_ms, pinterest.video_cover) keep working and win over the base cover for their platform. get_post reads it back as `video_cover`.", + "properties": { + "cover_url": { + "description": "Public image URL, JPEG or PNG (type 'custom').", + "type": "string" + }, + "overrides": { + "additionalProperties": { + "anyOf": [ + { + "properties": { + "cover_url": { + "description": "Public image URL, JPEG or PNG (type 'custom').", + "type": "string" + }, + "thumb_offset": { + "description": "Milliseconds into the video (type 'frame'). 3000 = 0:03.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "type": { + "description": "'frame' uses the video frame at thumb_offset; 'custom' uploads the image at cover_url.", + "enum": [ + "frame", + "custom" + ], + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "description": "Per-platform overrides keyed by platform id (instagram, facebook, linkedin, linkedin_page, tiktok, pinterest, youtube). An override wins over the base cover for that platform.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "thumb_offset": { + "description": "Milliseconds into the video (type 'frame'). 3000 = 0:03.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "type": { + "description": "'frame' uses the video frame at thumb_offset; 'custom' uploads the image at cover_url.", + "enum": [ + "frame", + "custom" + ], + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" +} - changed
Input schema / properties / youtube / descriptionPrevious value: -"YouTube Shorts options. Only applies when type is 'reel' and youtube is among the selected channels."New value: +"YouTube Shorts options. Only applies when type is 'reel' and youtube is among the selected channels. A custom Shorts thumbnail is set with the top-level `video_cover` (a `youtube` override for a YouTube-only image); it shows on Shorts only on channels where YouTube has enabled custom Shorts thumbnails (Partner Program channels first, since July 2026), other channels show a frame from the video."
- Changed
update_post5 fields changed- added
Input schema / properties / facebook / properties / cover_urlAdded value: +{ + "description": "Custom thumbnail image URL (JPEG/PNG, max 10 MB). Used with thumbnail_type 'from-library'.", + "type": "string" +} - added
Input schema / properties / facebook / properties / thumb_offsetAdded value: +{ + "description": "Frame timestamp in MILLISECONDS from the start of the video (e.g. 3000 = 0:03). Used with thumbnail_type 'from-video'.", + "type": "number" +} - added
Input schema / properties / facebook / properties / thumbnail_typeAdded value: +{ + "anyOf": [ + { + "enum": [ + "from-video", + "from-library" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Video thumbnail for Facebook feed videos and reels: 'from-video' uses the frame at thumb_offset, 'from-library' uploads the image at cover_url. Applied after the video is live; a thumbnail failure never fails the post. On update_post, null removes the Facebook override." +} - added
Input schema / properties / video_coverAdded value: +{ + "anyOf": [ + { + "description": "Video thumbnail for a post whose media is ONE video. Applied on Instagram (feed videos and reels), Facebook (feed videos and reels), LinkedIn Profile and Page, TikTok, Pinterest and YouTube Shorts. YouTube Shorts: the cover shows on Shorts only on channels where YouTube has enabled custom Shorts thumbnails (rolling out since July 2026, Partner Program channels first); on other channels YouTube stores it as the default thumbnail but shows a frame from the video on Shorts. Say that it depends on the channel; do not promise it. TikTok only takes a frame: a 'custom' cover is skipped there, so add a tiktok override with type 'frame' when the user wants a specific TikTok frame. The per-platform reel fields (instagram.thumb_offset / cover_url, tiktok.video_cover_timestamp_ms, pinterest.video_cover) keep working and win over the base cover for their platform. get_post reads it back as `video_cover`.", + "properties": { + "cover_url": { + "description": "Public image URL, JPEG or PNG (type 'custom').", + "type": "string" + }, + "overrides": { + "additionalProperties": { + "anyOf": [ + { + "properties": { + "cover_url": { + "description": "Public image URL, JPEG or PNG (type 'custom').", + "type": "string" + }, + "thumb_offset": { + "description": "Milliseconds into the video (type 'frame'). 3000 = 0:03.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "type": { + "description": "'frame' uses the video frame at thumb_offset; 'custom' uploads the image at cover_url.", + "enum": [ + "frame", + "custom" + ], + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "description": "Per-platform overrides keyed by platform id (instagram, facebook, linkedin, linkedin_page, tiktok, pinterest, youtube). An override wins over the base cover for that platform.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "thumb_offset": { + "description": "Milliseconds into the video (type 'frame'). 3000 = 0:03.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "type": { + "description": "'frame' uses the video frame at thumb_offset; 'custom' uploads the image at cover_url.", + "enum": [ + "frame", + "custom" + ], + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Replaces the stored video cover wholesale; pass null to remove it; omit to leave it untouched. facebook.thumbnail_type / thumb_offset / cover_url merge into overrides.facebook on their own." +} - changed
Input schema / properties / youtube / descriptionPrevious value: -"YouTube Shorts options. Only applies when type is 'reel' and youtube is among the selected channels."New value: +"YouTube Shorts options. Only applies when type is 'reel' and youtube is among the selected channels. A custom Shorts thumbnail is set with the top-level `video_cover` (a `youtube` override for a YouTube-only image); it shows on Shorts only on channels where YouTube has enabled custom Shorts thumbnails (Partner Program channels first, since July 2026), other channels show a frame from the video."
48 tool updates
- First observed
approve_post - First observed
check_media_compatibility - First observed
create_and_publish_post - First observed
create_folder - First observed
create_hashtag_set - First observed
create_post - First observed
create_webhook - First observed
delete_hashtag_set - First observed
delete_inbox_comment - First observed
delete_media - First observed
delete_post - First observed
delete_webhook - First observed
get_account - First observed
get_account_analytics - First observed
get_analytics_overview - First observed
get_best_times - First observed
get_calendar - First observed
get_inbox_conversation - First observed
get_next_unanswered - First observed
get_post - First observed
get_post_analytics - First observed
get_posts_analytics - First observed
get_recent_platform_posts - First observed
get_webhook - First observed
hide_inbox_comment - First observed
list_accounts - First observed
list_approval_workflows - First observed
list_folders - First observed
list_hashtag_sets - First observed
list_inbox_conversations - First observed
list_media - First observed
list_posts - First observed
list_webhooks - First observed
list_workspaces - First observed
mark_inbox_read - First observed
publish_post - First observed
reject_post - First observed
reply_to_inbox - First observed
retry_post - First observed
rotate_webhook_secret - First observed
search_instagram_audio - First observed
search_locations - First observed
switch_workspace - First observed
update_hashtag_set - First observed
update_media - First observed
update_post - First observed
update_webhook - First observed
upload_media
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.1624 npm1MIT
- AlicenseCqualityBmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs1114 npm40 PyPIMIT
- AlicenseAqualityCmaintenanceRevnuvo Company Intelligence tells AI agents what changed at a company, with evidence. It observes company websites, technologies, and DNS over time and returns timestamped, confidence-aware changes, signals, and monitoring.9MIT

industrylens-mcpofficial
AlicenseNot gradedqualityBmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.