Tool reference
Every tool of the FeedHorizon MCP server with its parameters and the permission it needs, generated from the server's code.
Assistants discover these tools on their own; you do not need to name them in your prompts. This page helps when you check what an assistant can do, set up an API key with limited scopes, or debug a tool call.
Tools marked asks first act in public or for good (publishing, retrying, deleting). They are flagged as destructive, so clients like Claude ask you before they run them.
| Tool | What it does | Needs scope |
|---|---|---|
get_context | Get context | any key |
get_platform_rules | Get platform rules | any key |
search_docs | Search docs | any key |
list_posts | List posts | posts:read |
get_post | Get post | posts:read |
validate_post | Validate post | posts:read |
get_queue | Get queue | profiles:read |
list_pinterest_boards | List Pinterest boards | accounts:read |
get_tiktok_creator | Get TikTok creator settings | accounts:read |
create_post | Create post | posts:write |
update_post | Update post | posts:write |
publish_post_now | Publish post now | posts:write |
cancel_post | Cancel scheduled post | posts:write |
retry_post | Retry failed post | posts:write |
duplicate_post | Duplicate post | posts:write |
delete_post | Delete post | posts:write |
set_queue_slots | Set queue slots | profiles:write |
import_media_from_url | Import media from URL | posts:write |
create_upload_link | Create upload link | posts:write |
create_connect_link | Create connect link | platform_invites:write |
get_context
Start here. Returns the organization, permissions, every profile with its time zone, current local time, queue state and connected accounts (ids, platform, status), and which platforms can publish. Call once per conversation before working with posts.
Reads only. Scope: any valid key.
No parameters.
get_platform_rules
Text length, media count and accepted file types per platform, plus rules such as "Instagram needs media". Use it to write text that fits before calling validate_post. Leave platforms empty for all.
Reads only. Scope: any valid key.
| Parameter | Type | Required | Description |
|---|---|---|---|
platforms | ("twitter" | "linkedin" | "instagram" | "facebook" | "tiktok" | "youtube" | "threads" | "bluesky" | "pinterest")[] | No | Only these platforms |
search_docs
Searches the FeedHorizon documentation (guides and API reference) by keywords and returns the best pages with an excerpt. Set fullText to get the whole text of the top page. Use it when unsure how something works.
Reads only. Scope: any valid key.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | Yes | Keywords, e.g. "queue reshuffle" or "instagram video" |
limit | integer | No | Default: 5 |
fullText | boolean | No | Include the full text of the best page. Default: false |
list_posts
Lists posts with a short preview, newest first. With from or to it lists a calendar range by publish time, oldest first. Filter by profile, status or platform. Pass nextCursor back as cursor for more. Use get_post for the full text.
Reads only. Scope: posts:read.
| Parameter | Type | Required | Description |
|---|---|---|---|
profileId | string | No | profile id (prof_…) |
status | "draft" | "scheduled" | "publishing" | "published" | "partially_failed" | "failed" | No | |
platform | "twitter" | "linkedin" | "instagram" | "facebook" | "tiktok" | "youtube" | "threads" | "bluesky" | "pinterest" | No | |
from | string | No | Range start, ISO with offset |
to | string | No | Range end (exclusive) |
limit | integer | No | Default: 20 |
cursor | string | No | nextCursor of the previous call |
get_post
The full post: text, own text per account, media, schedule in UTC and local time, and per account the status, link to the published post or the error.
Reads only. Scope: posts:read.
| Parameter | Type | Required | Description |
|---|---|---|---|
postId | string | Yes | post id (post_…) |
validate_post
Checks a post against every platform (text length, media, accounts, time, queue) without saving it. Returns all errors and warnings at once. Times: when=at with date + time in the profile time zone, or at as ISO. Fix every error, then create the post.
Reads only. Scope: posts:read.
| Parameter | Type | Required | Description |
|---|---|---|---|
profileId | string | Yes | profile id (prof_…) |
content | string | No | Post text, used for every account without own text |
targets | object[] | Yes | Accounts to publish to (ids from get_context), each with optional own text |
mediaIds | string[] | No | Uploaded files, in display order |
when | "draft" | "at" | "queue" | No | draft = no time; at = fixed time (give at, or date + time); queue = the profile's next free queue slot. Default: "draft" |
at | string | No | Exact time with offset, e.g. 2026-11-05T09:30:00+01:00 |
date | string | No | Local date YYYY-MM-DD in the profile's time zone (with time) |
time | string | No | Local time HH:MM in the profile's time zone (with date) |
get_queue
A profile's posting queue: weekly slots in its time zone, whether it is on, and the next slots with the post that holds each (postId null = free). when=queue in validate_post takes the first free slot.
Reads only. Scope: profiles:read.
| Parameter | Type | Required | Description |
|---|---|---|---|
profileId | string | Yes | profile id (prof_…) |
upcoming | integer | No | How many upcoming slots to list. Default: 10 |
list_pinterest_boards
The boards of a connected Pinterest account. Pass a board id as options.pinterest.boardId on that account's target in create_post or update_post.
Reads only. Scope: accounts:read.
| Parameter | Type | Required | Description |
|---|---|---|---|
accountId | string | Yes | account id (acc_…) |
get_tiktok_creator
Before every TikTok post: the creator's name (tell the user which account it goes to), the privacy levels they may choose and which interactions are switched off. Ask the user for the privacy level and the comment, duet and stitch settings; never pick them yourself.
Reads only. Scope: accounts:read.
| Parameter | Type | Required | Description |
|---|---|---|---|
accountId | string | Yes | account id (acc_…) |
create_post
Saves a post as draft, schedules it (when=at with date + time in the profile time zone) or puts it in the queue (when=queue). Runs the same checks as validate_post and fails with all problems at once. To publish right away, create a draft and call publish_post_now.
Changes data. Scope: posts:write.
| Parameter | Type | Required | Description |
|---|---|---|---|
profileId | string | Yes | profile id (prof_…) |
content | string | No | Post text, used for every account without own text |
targets | object[] | Yes | Accounts to publish to (ids from get_context), each with optional own text |
mediaIds | string[] | No | Uploaded files, in display order |
when | "draft" | "at" | "queue" | No | draft = no time; at = fixed time (give at, or date + time); queue = the profile's next free queue slot. Default: "draft" |
at | string | No | Exact time with offset, e.g. 2026-11-05T09:30:00+01:00 |
date | string | No | Local date YYYY-MM-DD in the profile's time zone (with time) |
time | string | No | Local time HH:MM in the profile's time zone (with date) |
update_post
Changes a post that has not started publishing: text, accounts (targets replaces all), media (mediaIds replaces all, [] removes) or time (when=draft unschedules, at, or queue). Leave a field out to keep it.
Changes data. Scope: posts:write.
| Parameter | Type | Required | Description |
|---|---|---|---|
postId | string | Yes | post id (post_…) |
content | string | No | New post text; null clears it |
targets | object[] | No | Accounts to publish to (ids from get_context), each with optional own text |
mediaIds | string[] | No | |
when | "draft" | "at" | "queue" | No | Leave out to keep the current time. draft = no time; at = fixed time (give at, or date + time); queue = the profile's next free queue slot |
at | string | No | Exact time with offset, e.g. 2026-11-05T09:30:00+01:00 |
date | string | No | Local date YYYY-MM-DD in the profile's time zone (with time) |
time | string | No | Local time HH:MM in the profile's time zone (with date) |
publish_post_now
Publishes a draft or scheduled post immediately to all its accounts. This is public and cannot be undone, so confirm with the user first. Returns at once with status scheduled; check the outcome with get_post after a few seconds.
Changes data, asks first. Scope: posts:write.
| Parameter | Type | Required | Description |
|---|---|---|---|
postId | string | Yes | post id (post_…) |
cancel_post
Takes a scheduled or queued post off the schedule. It stays as a draft and can be scheduled again with update_post.
Changes data. Scope: posts:write.
| Parameter | Type | Required | Description |
|---|---|---|---|
postId | string | Yes | post id (post_…) |
retry_post
Publishes the failed accounts of a post again, right away. Read the error in get_post first: a disconnected account fails again until the user reconnects it. Public, so confirm with the user.
Changes data, asks first. Scope: posts:write.
| Parameter | Type | Required | Description |
|---|---|---|---|
postId | string | Yes | post id (post_…) |
duplicate_post
Copies a post (also a published one) as a new draft with the same text, own texts, accounts and media. Then change or schedule the copy with update_post.
Changes data. Scope: posts:write.
| Parameter | Type | Required | Description |
|---|---|---|---|
postId | string | Yes | post id (post_…) |
delete_post
Deletes a post in FeedHorizon for good. Posts already live on a platform stay there. Confirm with the user first; to only stop a scheduled post, use cancel_post.
Changes data, asks first. Scope: posts:write.
| Parameter | Type | Required | Description |
|---|---|---|---|
postId | string | Yes | post id (post_…) |
set_queue_slots
Replaces all weekly queue slots of a profile, e.g. Mon-Fri 09:00. Times are local in the profile's time zone (or the new timezone you pass). reshuffle moves posts already waiting in the queue to the new slots. slots: [] clears the queue.
Changes data. Scope: profiles:write.
| Parameter | Type | Required | Description |
|---|---|---|---|
profileId | string | Yes | profile id (prof_…) |
slots | object[] | Yes | |
timezone | string | No | Changes the profile's time zone |
enabled | boolean | No | Turn the queue on or off |
reshuffle | boolean | No | Default: false |
import_media_from_url
Downloads an image, video or PDF from a public https URL (up to 100 MB) and stores it. Returns the media id to pass in mediaIds. Use the direct file URL, not a web page that shows it.
Changes data. Scope: posts:write.
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | Yes | Public https link to the file itself |
filename | string | No |
create_upload_link
For a local file you cannot share by URL: returns a media id and a link valid for two hours. The user or a script PUTs the raw bytes to uploadUrl with the given Content-Type; after that the media id works in mediaIds. Up to 5 GB.
Changes data. Scope: posts:write.
| Parameter | Type | Required | Description |
|---|---|---|---|
filename | string | Yes | |
mimeType | "image/jpeg" | "image/png" | "image/gif" | "image/webp" | "video/mp4" | "video/quicktime" | "video/webm" | "application/pdf" | Yes | |
sizeBytes | integer | Yes |
create_connect_link
A link to connect a social account to a profile, for the user or their client to open in a browser (valid 7 days, usable once). Accounts cannot be connected without that sign-in on the platform.
Changes data. Scope: platform_invites:write.
| Parameter | Type | Required | Description |
|---|---|---|---|
profileId | string | Yes | profile id (prof_…) |
platform | "twitter" | "linkedin" | "instagram" | "facebook" | "tiktok" | "youtube" | "threads" | "bluesky" | "pinterest" | Yes |