Available MCP Tools
The Nuelink MCP server exposes seventeen tools, up from eleven in the last release. You rarely need to call them by name, your assistant picks the right one based on what you ask for, and most users never look at this page.
If you do end up here, it’s usually for one of three reasons: you want to know what’s technically possible, you’re debugging an unexpected behavior, or you’re evaluating before adoption. For all three, the structured details (required input, return shape, underlying endpoint) matter. So they’re kept below, skim past them if you don’t need them.
Each tool maps to an underlying REST API endpoint. The API envelopes are preserved inside MCP tool content, while MCP adds its own protocol response and isError signaling.
At a glance
Section titled “At a glance”| Tool | Purpose | Added |
|---|---|---|
nuelink_get_me | Who am I? | |
nuelink_validate_token | Is the connection’s token valid? | 1.3 |
nuelink_list_brands | List brands | |
nuelink_get_schedule | A brand’s weekly queue schedule | 1.3 |
nuelink_list_channels | List a brand’s connected accounts | |
nuelink_list_collections | List a brand’s collections | |
nuelink_create_collection | Create a collection | 1.2 |
nuelink_list_automations | List a brand’s feed automations | 1.2 |
nuelink_create_automation | Create a feed automation | 1.2 |
nuelink_list_media | List a brand’s media library | 1.2 |
nuelink_upload_file | Upload an image, video, or PDF | |
nuelink_list_posts | List posts in a collection | 1.2 |
nuelink_list_brand_posts | List posts across a brand | 1.3 |
nuelink_create_post | Queue, schedule, draft, or publish a post | |
nuelink_update_post | Reschedule, re-queue, or draft a post | 1.3 |
nuelink_delete_post | Delete a post | 1.3 |
nuelink_list_published_posts | What went out, with engagement results | 1.3 |
nuelink_get_me
Section titled “nuelink_get_me”Returns the profile of the connected Nuelink account.
When the assistant calls this: confirming identity, troubleshooting “wrong account” issues, or as a quick health check at the start of a session.
Prompt patterns that trigger it:
- “Which Nuelink account am I connected as?”
- “Am I signed in?”
Input: none.
Structured output fields: id, name, joinedAt, and timezone.
Underlying endpoint: GET /me
nuelink_validate_token
Section titled “nuelink_validate_token”New in 1.3. Checks that the connection’s token is valid, and returns the same profile as nuelink_get_me.
When the assistant calls this: before a longer task, or when a call has just failed with 401 and it needs to know whether the connection itself is the problem.
Prompt patterns that trigger it:
- “Is my Nuelink connection still working?”
- “Check my Nuelink token before we start.”
Input: none.
Structured output fields: id, name, joinedAt, and timezone.
Underlying endpoint: GET /auth
nuelink_list_brands
Section titled “nuelink_list_brands”Lists every brand the connected account has access to.
When the assistant calls this: any time you mention a brand by name, switch brands, or ask “what do I have?” the assistant needs the brand ID (and its timezone) to call anything else.
Prompt patterns that trigger it:
- “List my brands.”
- “Post to Fernwood Botanicals…” (assistant calls this to resolve the name to an ID)
Optional input: page, perPage.
Structured output fields: an array of brands, each with id, title, description, timezone, queueStatus, createdAt, updatedAt. The timezone is the one used to interpret scheduledAt timestamps on that brand. When queueStatus is PAUSED, nothing publishes from the brand’s queues.
Underlying endpoint: GET /brands
nuelink_get_schedule
Section titled “nuelink_get_schedule”New in 1.3. Returns a brand’s weekly queue: every time slot from every collection, grouped by day, in the brand’s timezone.
When the assistant calls this: when you ask when posts go out, want to find a gap in the week, or are planning a new collection’s slots around the existing ones.
Prompt patterns that trigger it:
- “When does Fernwood post during the week?”
- “Which days have no posting slots?”
Required input: brandId.
Structured output fields: timezone, queueStatus, and schedule, keyed MON to SUN. Each slot carries time, queueId, collectionId, collectionTitle, and collectionStatus.
Underlying endpoint: GET /brands/{brandId}/schedule
nuelink_list_channels
Section titled “nuelink_list_channels”Lists the social accounts connected to a specific brand: Instagram handles, X profiles, TikTok accounts, etc.
When the assistant calls this: when you ask which platforms are connected, or want to audit a brand’s setup. Channels aren’t passed to nuelink_create_post directly (the collection determines that), so this is mainly for inspection, and for picking channel IDs when creating a collection.
Prompt patterns that trigger it:
- “Which social accounts are connected to Fernwood?”
- “Do I have TikTok connected on this brand?”
Required input: brandId. Optional: page, perPage.
Structured output fields: an array of channels with id, name, status (ACTIVE or INACTIVE), type, createdAt, updatedAt.
Watch out for: pagination totals are counted before channels in other states are filtered out, so a page can come back short, or empty, while more pages remain.
Underlying endpoint: GET /brands/{brandId}/channels
nuelink_list_collections
Section titled “nuelink_list_collections”Lists collections inside a specific brand. Each collection has its own default channels and weekly queue.
When the assistant calls this: before creating a post, to find the right collection ID. Also when you’re exploring or comparing collections, or copying one collection’s setup into another.
Prompt patterns that trigger it:
- “Show me my collections in Fernwood Botanicals.”
- “Which collections post to Instagram?”
- “Which collections are paused?”
Required input: brandId. Optional: page, perPage.
Structured output fields: an array of collections with id, title, description, status (ACTIVE or PAUSED), evergreen, maxRepublish, timezone, channels[], queues[] (each slot’s id, day, time, date, and status), postsCount, createdAt, updatedAt.
Underlying endpoint: GET /brands/{brandId}/collections
nuelink_create_collection
Section titled “nuelink_create_collection”Creates a collection in a brand, with its default channels and its weekly queue.
When the assistant calls this: when you’re setting up a new campaign or content theme and don’t want to switch to the dashboard.
Prompt patterns that trigger it:
- “Create a ‘Holiday 2026’ collection in Fernwood Botanicals, posting to Instagram and LinkedIn, Monday and Thursday at 9am.”
- “Set up a new collection for customer stories.”
Required input: brandId, title (max 255 characters).
Optional input:
descriptionmaxRepublish: evergreen.0, the default, turns it off;Nre-adds published posts to the queue afterNweekschannels: array of channel IDs. The assistant resolves these fromnuelink_list_channelsfirstqueues: array of weekly slots inMon 09:00format, three-letter day, 24-hour time, in the brand’s timezone
Structured output fields: the created collection, with each queue slot’s own id and status.
Watch out for: verified users can create up to 10 slots per collection per day, unverified users up to 5. Duplicate slots aren’t rejected, so ask the assistant to de-duplicate. Channel IDs must belong to the same brand, and your plan caps how many collections a brand can hold.
Underlying endpoint: POST /brands/{brandId}/collections
nuelink_list_automations
Section titled “nuelink_list_automations”Lists the feed automations configured in a brand.
Prompt patterns that trigger it:
- “What automations are running on Fernwood?”
- “Is my blog feed still importing?”
Required input: brandId. Optional: page, perPage.
Structured output fields: an array of automations with id, name, collectionId, status, type, feedUrl, runCount, importAsType, lastRun, title, caption. title and caption are the import templates, not the automation’s name, and a lastRun of 0 means it hasn’t run yet.
Underlying endpoint: GET /brands/{brandId}/automations
nuelink_create_automation
Section titled “nuelink_create_automation”Points a feed at a collection, so new items become posts automatically.
Prompt patterns that trigger it:
- “Import my Substack into the Newsletter collection as image posts.”
- “Set up an RSS automation for the NASA breaking news feed.”
Required input: brandId, name, collectionId, type (the feed source), feedUrl, importAsType (LINK, IMAGE, VIDEO, or CAROUSEL).
Optional input:
titleandcaption: templates for each imported post, such as{{title}}and{{title}} {{link}}, max 255 characters each.titledefaults to{{title}}loadOldPosts: defaults tofalse;truealso imports what’s already in the feedaddPostsAsDraft: defaults tofalse;trueimports posts as draftsrefreshRate: hours between checks,1,6,12, or24(the default). The tool schema accepts any integer, so stick to these four
Supported type values: YOUTUBE, RSS, ATOM, MEDIUM, SHOPIFY, WORDPRESS, WOOCOMMERCE, ETSY, GHOST, SUBSTACK, ANCHOR, TRANSISTOR, CAPTIVATE, SOUNDCLOUD, BLOGGER, WIX, SQUARESPACEBLOG, SQUARESPACESHOP, WEEBLY, TUMBLR, SHOPIFY2, WOOCOMMERCE2, PRESTASHOP, BUZZSPROUT, RSSCOM, CASTOS, PODCASTCO.
Renamed in 1.3: subType is now type, the name moved from title to name, dynamicTitle and dynamicBody are now title and caption, and description is gone. A saved prompt or client config that names the old fields needs updating.
Tip: on a first run, use addPostsAsDraft: true so imports wait for review, and leave loadOldPosts at false unless you want the feed’s backlog. If you do want it, keep addPostsAsDraft: true so the backlog lands as drafts instead of flooding your queue.
Underlying endpoint: POST /brands/{brandId}/automations
nuelink_list_media
Section titled “nuelink_list_media”Lists what’s in a brand’s media library, for inspection and auditing.
Prompt patterns that trigger it:
- “What images do I have in Fernwood’s library?”
- “How much video have I uploaded to this brand?”
Required input: brandId. Optional: type (IMAGE, VIDEO, GIF, APPLICATION, DOCUMENT, CSV), page, perPage.
Structured output fields: an array of media items with id, name, type (a MIME type such as image/jpeg), size, createdAt, updatedAt.
The returned id is an opaque string accepted by nuelink_create_post. Pass it unchanged; do not convert it to a number or infer storage details from it.
Underlying endpoint: GET /brands/{brandId}/media
nuelink_upload_file
Section titled “nuelink_upload_file”Uploads an image, video, or PDF to a brand’s media library. The returned media ID is passed to nuelink_create_post. These two tools are designed to work together, upload_file rarely runs on its own.
When the assistant calls this: any time your post includes media that isn’t already a public URL, whether you pasted an image into the chat, pointed at a local file, or asked the assistant to generate one.
Prompt patterns that trigger it:
- “Upload
/path/to/photo.jpgto my brand.” - (implicit) “Queue this image with the caption…”, assistant uploads first, then creates the post.
Required input: brandId, fileName, fileContent (base64-encoded bytes). A local path works only when the client can read that file and encode it; the remote Nuelink server cannot open a path on your computer.
Structured output fields: a media object with a string id (use this in nuelink_create_post), type, and size.
Upload limits: jpg, jpeg, png, bmp, mp4, mov, and pdf, up to 100 MiB. webp is no longer accepted. PDF is LinkedIn-only, where it becomes a document post.
Why base64: MCP tool calls carry JSON, so this tool takes the file as base64 and the server converts it into the multipart upload the REST API expects. Base64 makes a file about a third larger, and MCP clients often cap request size well below 100 MiB, so use a small test image first.
Underlying endpoint: POST /brands/{brandId}/media
Tip: you can skip uploading with a stable HTTPS URL that returns the media bytes without login, cookies, an HTML preview page, or short-lived authorization. It’s the better route for large files. Cloud share-page URLs often return redirects or HTML rather than media and may not work. Test the final resolved URL and avoid exposing private media merely to make it fetchable. See Media in Example Prompts for details.
nuelink_list_posts
Section titled “nuelink_list_posts”Lists posts in a collection, whatever their state: queued, scheduled, draft, or published.
When the assistant calls this: when you ask what’s coming up in a collection, want to check a draft before approving it, or need to avoid double-posting.
Prompt patterns that trigger it:
- “What’s queued in Product Launches?”
- “Show me the drafts waiting for review.”
- “Did I already schedule the launch post?”
Required input: brandId, collectionId.
Optional input:
status:PENDING,DRAFT, orPUBLISHEDpostType:TEXT,IMAGE,VIDEO,MULTIMEDIA,SHORT,DOCUMENT,THREAD,SLIDES,REEL,TIKTOK,STORY,POLL, orENGAGE_COMMENTpostingType:NOW,SCHEDULE,QUEUE, orDRAFTcreatedFrom,createdTo: UTC,YYYY-MM-DD HH:mm:sssortBy(id,title,post_date,created_at,updated_at) andsortOrder(asc,desc)page,perPage
This tool has no view shortcut. For one, use nuelink_list_brand_posts with collectionId.
Structured output fields: an array of posts with id, collectionId, title, body, media[], postType, postingType, status, postDate, createdAt, updatedAt, and a poll object when one is attached. postDate is UTC, and a post created with IMMEDIATE reads back as postingType: NOW.
Underlying endpoint: GET /brands/{brandId}/collections/{collectionId}/posts
nuelink_list_brand_posts
Section titled “nuelink_list_brand_posts”New in 1.3. Lists posts across every collection in a brand, with the same filters as nuelink_list_posts plus collectionId and view.
When the assistant calls this: when your question spans the brand, not one collection: what’s scheduled this week, which drafts are waiting, what went out yesterday.
Prompt patterns that trigger it:
- “What’s scheduled across Fernwood this week?”
- “Show me every draft in Fernwood, whatever the collection.”
Required input: brandId.
Optional input: collectionId; view (QUEUE, SCHEDULED, DRAFT, or PUBLISHED); and status, postType, postingType, createdFrom, createdTo, sortBy, sortOrder, page, perPage as for nuelink_list_posts.
Structured output fields: the same post shape as nuelink_list_posts. postDate is UTC, so a careful assistant converts it to the brand’s timezone before showing you a time.
Underlying endpoint: GET /brands/{brandId}/posts
nuelink_create_post
Section titled “nuelink_create_post”Creates a post in a collection. The single tool that handles queuing, scheduling, drafting, and immediate publishing, the publishMode parameter decides which.
When the assistant calls this: the final step of any publishing prompt. Everything else exists to feed this tool the right IDs.
Prompt patterns that trigger it:
- “Add this to the queue for Product Launches.”
- “Schedule this for Friday at 9am.”
- “Save this as a draft.”
- “Post this right now.”
Required input:
brandId,collectionIdpublishMode: one ofQUEUE,SCHEDULE,IMMEDIATE,DRAFTcaption(1–3000 characters) required unlesspollis setscheduledAt(only ifpublishMode = SCHEDULE): timestamp inYYYY-MM-DD HH:mm:ssformat, interpreted in the brand’s timezone, and at least 10 minutes in the future
Optional input:
media: array of items, each with either anidfromnuelink_upload_fileor a publicurl, not bothtitle: used by YouTube, Pinterest, etc.alt: alt text for accessibilitylink: the Google Business Profile LEARN_MORE button and the Pinterest destination linkpostAsStory: publishes as a Story on Instagram and Facebook only. Channels on other platforms in the collection will publish as a regular feed post.autoThreadText: turns on Nuelink’s automatic text splitting. Separately, a caption split by triple newlines becomes a thread of up to 10 segments. See Threads.poll: poll object (question,options,period, and optionallycorrectOptionIndexandexplanationfor a quiz). Supported on LinkedIn, X, Telegram, Threads, Mastodon, Bluesky. Other channels in the collection ignore the poll or fall back to caption-only.comment: an auto-comment posted after publishing, applied globally to every channel that supports comments. Bothcommenttext and adelayin seconds are required; send the pair. There is no per-platform comment customization in the alpha.platforms: platform-specific non-content options. The caption is global, you cannot customize caption text per platform.
Platform options available through MCP:
| Platform | Options |
|---|---|
instagram | collab, location, trialReel, shareToFeed |
facebook | location |
tiktok | sendToInbox, autoAddMusic |
youtube | tags, playlists (each entry needs at least one playlist ID) |
googlemybusiness | uploadToPhotosSection |
sendToInbox and autoAddMusic belong under platforms.tiktok. The REST API, live MCP schema, and CLI 1.4.5 use this nested shape. See Platform-Specific Options.
Structured output fields:
{ "status": "success", "data": { "id": 4364709, "message": "Post created successfully" }}The id is the Nuelink post ID. Per-channel publishing status (whether each platform actually pushed the post successfully) is not returned in the response. Once the post has gone out, nuelink_list_published_posts reports it channel by channel, as long as the assistant asks for every status and not only the default PUBLISHED.
Important: you don’t pick which channels receive the post. That’s determined by the collection’s configuration. If you want the post to go to a different set of channels, post to a different collection.
Underlying endpoint: POST /brands/{brandId}/collections/{collectionId}/posts
nuelink_update_post
Section titled “nuelink_update_post”New in 1.3. Changes when, or whether, a post publishes, without touching its content: reschedule it, put it in its collection’s queue, move it to the front or back of that queue, or turn it into a draft.
When the assistant calls this: when you ask to move, hold back, or prioritize a post that already exists. It needs the post’s ID, so it lists posts first.
Prompt patterns that trigger it:
- “Move the launch post in Product Launches to Friday at 10am.”
- “Make the spring sale post the next one out.”
- “Take Friday’s announcement out of the schedule and keep it as a draft.”
Required input: brandId, postId, and at least one of these two:
publishMode:DRAFT,SCHEDULE, orQUEUE.IMMEDIATEisn’t accepted herequeuePosition:FRONTorBACK
Conditional input: scheduledAt, required when publishMode is SCHEDULE and not allowed otherwise. It’s in the brand’s timezone, at least 10 minutes ahead. On its own, scheduledAt doesn’t count as a change.
The live tool schema only marks brandId and postId as required. The API enforces the rest, and rejects a call that breaks them with 422.
Structured output fields: the updated post, in the nuelink_list_posts shape.
Watch out for: a published post can’t be changed, and the call fails with 409. The caption, media, and options can’t be edited through any tool; use the dashboard for that.
Underlying endpoint: PATCH /brands/{brandId}/posts/{postId}
nuelink_delete_post
Section titled “nuelink_delete_post”New in 1.3. Permanently deletes a post.
When the assistant calls this: only when you explicitly ask for a post to be deleted, after it has shown you which one.
Prompt patterns that trigger it:
- “Delete the duplicate spring sale post in Product Launches.”
Required input: brandId, postId.
Structured output fields: the deleted post’s id and a message.
Underlying endpoint: DELETE /brands/{brandId}/posts/{postId}
nuelink_list_published_posts
Section titled “nuelink_list_published_posts”New in 1.3. Lists what actually went out: one entry per channel, with its delivery status, the link to the post on the platform, and likes, comments, and shares.
When the assistant calls this: to confirm a post reached every channel, find failed deliveries, or compare how posts performed.
Prompt patterns that trigger it:
- “Did the launch post go out on every channel?”
- “Did anything fail to publish this week?”
- “What were our five most-liked posts last month?”
Required input: brandId.
Optional input:
status:PUBLISHED(the default),FAILED,RETRYING,SKIPPED, orSENTcollectionId,channelId,postId(the Nuelink post the entries came from),postTypesearch: case-insensitive match on the published textpublishedFrom,publishedTo: UTC,YYYY-MM-DD HH:mm:sssortBy(id,created_at,likes,comments,shares) andsortOrder(asc,desc)page,perPage
Structured output fields: an array of entries with id, postId, collectionId, channel (id, name, type), postType, body, url, status, message, publishedAt, and results (likes, comments, shares).
Watch out for: status defaults to PUBLISHED, so checking one postId with the defaults shows only the channels where the post succeeded. To answer “did it go out everywhere?”, a careful assistant also asks for FAILED, RETRYING, SKIPPED, and SENT, or compares the results with the collection’s channels.
Underlying endpoint: GET /brands/{brandId}/published-posts
publishMode quick reference
Section titled “publishMode quick reference”| Value | What it does |
|---|---|
QUEUE | Adds the post to the collection’s next available time slot after explicit intent. |
SCHEDULE | Publishes at the exact scheduledAt timestamp (in the brand’s timezone). |
IMMEDIATE | Publishes right now. Reads back as postingType: NOW. |
DRAFT | Saves without publishing or scheduling. Safe default when intent is unclear. |
nuelink_update_post accepts DRAFT, SCHEDULE, and QUEUE, not IMMEDIATE.
Tool permission model
Section titled “Tool permission model”Read tools do not mutate Nuelink state, but they can disclose private profile, brand, post, automation, feed, media, and engagement data. Grant persistent read access only in a client and workspace where that disclosure is acceptable.
Require confirmation for all six write tools:
| Tool group | Recommended permission |
|---|---|
nuelink_get_me, nuelink_validate_token, nuelink_get_schedule, and nuelink_list_* | Allow only according to account/content sensitivity |
nuelink_create_collection | Ask each time |
nuelink_create_automation | Ask each time; it starts a recurring process |
nuelink_upload_file | Ask each time; it writes to the media library |
nuelink_create_post | Ask each time, including DRAFT; always require explicit intent for non-draft modes |
nuelink_update_post | Ask each time; QUEUE and SCHEDULE can put a draft on track to publish |
nuelink_delete_post | Ask each time, naming the exact post; it’s permanent |
The tools publish readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. Clients can use those hints, but users should still review permissions and every write request. Leave Allow AI to perform sensitive actions off unless someone needs nuelink_delete_post.
Errors
Section titled “Errors”MCP failures set CallToolResult.isError: true and can include the underlying API status, message, and field errors in the result content. This is not the same envelope as a raw HTTP response. See Errors for the underlying API meanings. Common cases:
- 400: A business rule rejected the request, e.g. a channel that doesn’t belong to the brand, a feed URL that couldn’t be parsed, or a media URL that couldn’t be downloaded.
- 401: Your connection is missing, invalid, or revoked. See Authentication.
- 403: A plan limit was reached (collections, automations, or scheduled posts), you’re not a member of the brand, or
nuelink_delete_postran without sensitive actions enabled. - 404: Brand, collection, post, or referenced resource doesn’t exist or doesn’t belong to your account.
- 409:
nuelink_update_poston a post that’s already published. - 422: Validation error, e.g. a missing caption with no poll, a malformed
scheduledAt, or a scheduled time under 10 minutes away. - 429: Rate limited. Honor an available retry delay. Retry read-only calls after the delay; for a write, reconcile with the matching list tool before retrying because the mutation may already have succeeded.
Validation failures and downstream API failures both come back with isError: true, alongside the underlying status, message, and errors fields. Keep those fields when logging, they’re what makes a failure diagnosable after the fact.