MCP tools
All 79 tools the SkedCast MCP server exposes: 44 that only read and 35 that change something, each with its scope and a description.
Read tools (44)
| Tool | Description | Scope |
|---|---|---|
list_scheduled_posts | List the workspace's posts (queue, drafts, published) newest-first, with optional status / client / platform filters and free-text search (`q`) over captions, per-platform overrides, client names and account handles. | posts.read |
list_post_targets | List individual post DESTINATIONS (one row per platform account), filtered by status, client, account, platform, free text and a SCHEDULE-time window: the tool for "what publishes on this date". The page carries `total` and `totalPosts`, so you can tell a full page from a complete set. A published destination also carries `coverIssue`, `firstCommentIssue`, `captionIssue` and `playlistIssue` (a sentence or null each), and `firstCommentUrl` for a posted YouTube first comment. | posts.read |
get_post | Get one post with its per-platform variants and its destinations. A published target carries `coverIssue`, `firstCommentIssue`, `captionIssue`, `playlistIssue` and `firstCommentUrl`, so a YouTube post whose subtitles, playlist add or first comment did not go through says so. | posts.read |
list_clients | List the workspace's client groups (brands / influencers). | clients.read |
list_accounts | List connected social accounts, optionally filtered by client or platform. | accounts.read |
get_analytics_overview | Reach / impressions / engagement plus a per-platform rollup over a date window. | analytics.read |
get_post_analytics | Per-post performance (complements get_analytics_overview): one post’s lifetime per-target breakdown by postId, or a cursor-paged list of per-post rows with filters. | analytics.read |
get_account_analytics | One channel’s totals and daily series, plus profile-level activity (profile views, link taps, video plays) and follower demographics. | analytics.read |
get_top_posts | The window’s top posts by one figure (views, engagements, likes, comments, shares, saves, reach or engagement rate) — the ranking the console’s Insights, Home and client report show. | analytics.read |
list_account_analytics | Every connected channel’s analytics in one paged call: what get_account_analytics returns, for each channel, with its name, handle and client. | analytics.read |
get_search_keywords | The search terms people used to find a Google Business Profile location, month by month. | analytics.read |
get_pinterest_top_pins | A Pinterest account’s best Pins over the last 7, 30 or 90 days, ranked by Pinterest itself — including Pins made outside SkedCast — with impressions, saves, Pin clicks, outbound clicks and engagements. | analytics.read |
list_library_assets | List content-library assets with optional kind / folder / label / client / status / search filters. Filter `status: "transcoded"` for assets that are actually publishable; every row also carries `status`, `publishable` and `ready`. | media.read |
get_capabilities | The per-platform composing rulebook: caption and hashtag limits, media rules per kind, post types, native-scheduling window, default per-account pacing, first-comment support, and the `variants[].overrides` keys each platform requires or accepts. Read it before composing instead of discovering a limit by failing a publish. | posts.read |
get_agency | The current workspace profile — name, plan, settings, and the caller’s role. | agency.read |
list_reports | List the workspace's saved analytics report definitions. | reports.read |
get_best_times | Best posting times, strongest first, optionally by client / platform. | besttimes.read |
list_approvals | List the workspace's approval queue (pending and decided requests), newest-first, with optional status / post filters. | approvals.read |
get_posting_limits | Per-account pacing limits: one account by socialAccountId, or every active channel when omitted. | accounts.read |
get_quota | Your workspace’s remaining posting capacity today on platforms that limit daily posting, and when it resets — read before planning a batch. | accounts.read |
list_campaigns | List the workspace's campaigns (named post groupings), optionally filtered by client / status. | campaigns.read |
validate_post | Dry-run a compose request without writing anything. It takes the same arguments as create_post and returns `{ valid, platforms[] }` with the issues that would block each platform. `warnings` names an unknown, misplaced or deprecated YouTube override key, and a YouTube option create_post would refuse is refused here too, with the field path. It does not check per-account pacing, so `valid: true` means the shape is acceptable, not that a publish cannot later be deferred. | posts.compose |
list_webhooks | List the workspace's outbound webhook endpoints (url, subscribed events, active flag; secret masked). | webhooks.read |
list_pinterest_boards | List the boards a connected Pinterest account can pin to (its own and the group boards it collaborates on), each as { id, name }, for a Pin’s boardId (send the numeric id; a board name is accepted only for a post to exactly one Pinterest account). | accounts.read |
list_pinterest_board_sections | List the sections of one board on a connected Pinterest account, each as { id, name }, for a Pin’s optional boardSectionId. | accounts.read |
get_webhook | Read one webhook endpoint — URL, subscribed events, active state, consecutive failures, and when/why it was auto-disabled. The signing secret is never returned here. | webhooks.read |
list_webhook_deliveries | The delivery log for one endpoint — each attempt with its event type, response status, error and timing. How you find out WHY an endpoint stopped receiving. | webhooks.read |
get_campaign | Read one campaign in full — name, description, status, colour, date range, owning client and post counts. | campaigns.read |
get_client | Read one client group in full — name, type, approval policy, posting rules, brand voice and default timezone. | clients.read |
get_post_target | Read a single destination in full — status, scheduled time, platform, account, published permalink and platform post id, its failure reason when it failed, and for a published one the outcome of the steps after the publish (`coverIssue`, `firstCommentIssue`, `captionIssue`, `playlistIssue`; each a sentence or null) and `firstCommentUrl`. | posts.read |
get_post_recycle | Read one post’s evergreen re-posting configuration and its progress. Returns null when the post is not enrolled. | posts.read |
get_account | Read one connected social account in full — platform, handle, display name, avatar, status (including whether it needs re-authorization) and owning client. | accounts.read |
get_approval | Read one approval request with the gated post’s preview and roll-up, so a reviewer can see what they are deciding on before calling decide_approval. | approvals.read |
get_media_asset | Read one content-library asset in full — filename, kind, size, dimensions, duration, folder, labels, alt text, processing status, and the publishable/ready flags plus the per-platform readiness map. | media.read |
get_client_analytics | One client group’s analytics — totals, a per-platform breakdown and a time series. A different projection from get_analytics_overview filtered by client. | analytics.read |
get_report | Read one report definition with its run history — each run’s status, window, and whether an export is available. | reports.read |
download_report_export | Get a time-limited download URL for one completed report run’s export file. The URL expires — fetch it when you are ready to use it. | reports.read |
list_inbox_conversations | List comments, direct messages, mentions and reviews waiting in the inbox, newest activity first, with filters (status, kind, platform, client, account, assignee, unread, archived, includeArchived, search). Archived conversations are left out unless asked for (archived: only those; includeArchived: together with the rest). | inbox.read |
get_inbox_conversation | Read one conversation with its messages, notes, contact and post context. | inbox.read |
get_inbox_report | Reply times against target, conversations handled, sentiment, Google reviews, topics and the team for a date range, each against the previous period. | inbox.read |
get_reviews_summary | Average rating, the 1–5 star distribution, the share replied, the median reply time and each location’s rating. | inbox.read |
get_inbox_counts | The numbers behind the inbox views: open, unread, assigned to you, unassigned, pending, held, negative, questions, requests, snoozed, archived and by kind, for the workspace, a client or one account. | inbox.read |
list_inbox_labels | Every label of the workspace, with its id, name and colour: the ids `update_inbox_conversation` takes in `labelIds`. | inbox.read |
list_inbox_saved_replies | The saved replies a teammate can send: the workspace’s own, and a client’s with `clientId`. | inbox.read |
Write tools (35)
| Tool | Description | Scope |
|---|---|---|
decide_approval | Approve, reject, or request changes on a pending approval request (approve releases the gated post for publishing). A write action — confirm with the user before calling. | approvals.decide |
revise_post | Change the content of an already-scheduled post (caption, media, cover, alt text, per-platform overrides) without touching its destinations. Send only what you are changing. It refuses, naming them, any destination that has already published or is about to. A live YouTube video, or the text of a post already on LinkedIn, Facebook, Pinterest, Telegram or Google Business Profile, is changed with edit_published_post. Editing an approved post returns it to review. The result carries `warnings` for the revised overrides. A write action: confirm with the user before calling. | posts.compose |
edit_published_post | Change a post that is already published, without republishing it. YouTube: a live or scheduled video's title, description, tags, category, privacy, kids and embedding settings, languages and translations, thumbnail and subtitle tracks (the privacy of a natively scheduled video cannot change). Text: the post's `text` only, on LinkedIn (an account connected through LinkedIn's Community Management app), Facebook Pages (a live post, or one Facebook's own scheduler holds), Pinterest (a Pin's description; Pinterest offers Pin update to apps as a beta), Telegram (a message's text or caption) and Google Business Profile (a post's summary). Send only what you are changing. A YouTube edit can answer 429 youtube_units_exhausted with a Retry-After header: retry after that wait. A write action: confirm with the user before calling. | posts.compose |
create_post | Compose a post and publish it to the selected accounts, or save it as a draft. Identical arguments replay the original result instead of creating a duplicate, and two publish-now calls with the same content and targets count as one post: vary the content or the times to post twice. Platform settings (YouTube privacy, subtitles and chapters, TikTok privacy level, Pinterest board) go in `variants[].overrides`. The same object carries `firstComment`, a reply posted once the destination is live, on X, LinkedIn, YouTube, Instagram, Facebook, Threads, Telegram and Bluesky (not TikTok, Pinterest or Google Business Profile). If it fails the post still publishes, and the target reports `firstCommentIssue`; `firstCommentUrl` links a posted YouTube comment. YouTube overrides are checked: an unknown, misplaced or deprecated key is accepted and named in `warnings` (`{ code, path, message }`), and a wrong `captions`, `chapters` or `localizations` value is refused with the field path. A write action: confirm with the user before calling. | posts.compose |
create_posts_bulk | Create up to 50 posts in one call. Each item takes exactly the arguments of create_post, including every override and its own `warnings`. Items are created one after another and independently: one failing never rolls back the others, and the result lists every item in order with its post id or its error. Identical arguments create nothing twice. Pass validateOnly:true to check every item without writing. Each item counts as one request toward your rate limit. This creates real outbound content: confirm with the user before calling. Requires the posts.compose scope. | posts.compose |
update_post | Replace a draft post in place — its content, media, targets, and schedule. Only draft posts can be updated, and this never publishes (use publish_draft for that). Platform-specific settings live in `variants[].overrides`, same as create_post, including `firstComment`. A write action — confirm with the user before calling. | posts.compose |
publish_draft | Publish or schedule an existing DRAFT post in place: same arguments as update_post plus the draft id; `schedule` decides now or later. It runs the same checks as create_post, and a client that requires approval gets the post submitted for review instead. The post keeps its id. This puts real content on connected accounts: confirm with the user before calling. | posts.compose |
import_media | Ingest an external image / video into the content library by URL — the file must already be reachable at a public URL. For bytes you already hold (an image you just rendered, or a local file) use `upload_media` instead. A write action — confirm with the user before calling. | media.manage |
upload_media | Upload a LOCAL image / video into the content library and get back a media id for create_post. Sends the file inline (≤18 MiB) or returns a presigned URL for larger files. Refused with 403 rbac_scope_denied when the upload’s client is outside the caller’s clients. A write action — confirm with the user before calling. | media.manage |
reschedule_post | Move a pending post target to a new time (absolute scheduledAt or relative shiftMinutes). A write action — confirm with the user before calling. | posts.compose |
bulk_post_target_actiondestructive | Reschedule, retry, cancel or delete up to 5000 post targets in one call: the batch form of reschedule_post / retry_post / cancel_post. `cancel` keeps the row, listed as Canceled. `delete` removes only a target that was never attempted, and skips and reports the rest. Returns `{ jobId, accepted, skipped, skippedReasons? }`. A write action: confirm with the user before calling. | posts.compose |
cancel_postdestructive | Cancel a still-pending post target before it publishes. A write action — confirm with the user before calling. | posts.compose |
retry_post | Re-queue a failed post target, or one on hold whose wait can be cut short, so it publishes again. A write action — confirm with the user before calling. | posts.compose |
set_post_recycle | Set, update, or disable a post's evergreen recycle settings (interval / times / end date / max recycles). A write action — confirm with the user before calling. | posts.compose |
shift_campaign | Move a whole campaign's pending schedule by a relative number of minutes. A write action — confirm with the user before calling. | campaigns.manage |
create_webhook | Register an outbound webhook endpoint for HMAC-signed event deliveries. Subscribe to any subset of the full 44-event catalog (the list and payload fields are on /developers/webhooks). Returns the signing secret once. A write action — confirm with the user before calling. | webhooks.manage |
delete_webhookdestructive | Delete an outbound webhook endpoint by id; its delivery log is deleted with it. A write action — confirm with the user before calling. | webhooks.delete |
create_client | Create a new client group (a brand or influencer whose accounts are managed together). A write action — confirm with the user before calling. | clients.manage |
create_pinterest_board | Create a board (PUBLIC or SECRET) on a connected Pinterest account and return its { id, name }. A write action — confirm with the user before calling. | posts.compose |
create_pinterest_board_section | Create a section on one board of a connected Pinterest account and return its { id, name }. A write action — confirm with the user before calling. | posts.compose |
create_connect_invite | Create a shareable self-connect link so a client can connect the requested platforms themselves; returns the link and its expiry. A write action — confirm with the user before calling. | accounts.connect |
update_webhook | Change an endpoint’s URL, event list, or active state — including re-enabling one auto-disabled after repeated failures. The event list REPLACES the previous one. A write action — confirm with the user before calling. | webhooks.manage |
test_webhook | Send a `webhook.test` delivery and report the outcome, proving an endpoint is reachable and verifying signatures without waiting for a real event. Performs a real outbound request — confirm with the user before calling. | webhooks.manage |
rotate_webhook_secret | Create a new signing secret and return it ONCE; it is not readable again. The previous secret keeps verifying for 24 hours so you can redeploy without dropping deliveries. A write action — confirm with the user before calling. | webhooks.manage |
create_campaign | Create a campaign — a named group of posts with an optional client, colour and date range. Posts are added with assign_to_campaign. A write action — confirm with the user before calling. | campaigns.manage |
update_campaign | Change a campaign’s name, description, status, colour or date range. A write action — confirm with the user before calling. | campaigns.manage |
delete_campaigndestructive | Delete a campaign. The posts in it are NOT deleted — they lose the grouping and keep their own schedules. A write action — confirm with the user before calling. | campaigns.manage |
assign_to_campaign | Add up to 500 existing posts to a campaign. Grouping only — no post’s content or schedule changes. A write action — confirm with the user before calling. | campaigns.manage |
unassign_from_campaign | Remove posts from a campaign. Grouping only — the posts and their schedules are untouched. A write action — confirm with the user before calling. | campaigns.manage |
update_client | Change a client’s name, type, approval policy, posting rules, brand voice or default timezone. A write action — confirm with the user before calling. | clients.manage |
delete_clientdestructive | Archive a client group. OWNER ONLY — a Manager holding the clients.manage scope cannot do this. A write action — confirm with the user before calling. | clients.manage |
clear_post_recycle | Turn OFF evergreen re-posting for a post. Idempotent. Already-scheduled recycled copies are not retracted — cancel those separately. A write action — confirm with the user before calling. | posts.compose |
update_inbox_conversation | Change a conversation’s status, assignee, labels, snooze or read state. An assignee must be a teammate who can reply and has the conversation’s client in scope (400 engagement_assignee_cannot_reply). | inbox.reply |
reply_to_inbox_conversation | Send a reply on the platform (public or private, as the platform allows), or hold it for approval. | inbox.reply |
moderate_inbox_messagedestructive | Hide, unhide, like, delete or block on the platform, where the platform allows it. | inbox.moderate |
Frequently asked questions
- Does this page list every tool?
- Yes. It lists all 79 tools that the remote MCP server exposes.
- What does "write" mean for a tool?
- A write tool changes something: it creates, updates, reschedules or cancels. An MCP client should ask you to confirm before it calls a write tool. A read tool runs within the scopes you granted.
- What does "destructive" mean?
- Delete and cancel tools, and the bulk action that can cancel or delete many targets in one call, are marked destructive. They have a lower rate limit than other write tools.
- Can an agent call a tool outside my role’s permissions?
- No. Every tool call is checked against the permissions of the member who connected the client. A tool on this list still cannot do more than that person can do in the console.
- How do I connect a client?
- Point an MCP client at https://api.skedcast.com/mcp and sign in with OAuth 2.1. The MCP config generator shows the exact steps for each client.
Ready to broadcast everywhere?
Sign up free — no credit card. You land on the Free plan, and you can start a one-time 7-day Studio trial from your workspace whenever you are ready. Connect your first accounts, import a batch, and watch one post fan out across every platform.