Skip to content

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.

ToolPurposeAdded
nuelink_get_meWho am I?
nuelink_validate_tokenIs the connection’s token valid?1.3
nuelink_list_brandsList brands
nuelink_get_scheduleA brand’s weekly queue schedule1.3
nuelink_list_channelsList a brand’s connected accounts
nuelink_list_collectionsList a brand’s collections
nuelink_create_collectionCreate a collection1.2
nuelink_list_automationsList a brand’s feed automations1.2
nuelink_create_automationCreate a feed automation1.2
nuelink_list_mediaList a brand’s media library1.2
nuelink_upload_fileUpload an image, video, or PDF
nuelink_list_postsList posts in a collection1.2
nuelink_list_brand_postsList posts across a brand1.3
nuelink_create_postQueue, schedule, draft, or publish a post
nuelink_update_postReschedule, re-queue, or draft a post1.3
nuelink_delete_postDelete a post1.3
nuelink_list_published_postsWhat went out, with engagement results1.3

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


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


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


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


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


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


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:

  • description
  • maxRepublish: evergreen. 0, the default, turns it off; N re-adds published posts to the queue after N weeks
  • channels: array of channel IDs. The assistant resolves these from nuelink_list_channels first
  • queues: array of weekly slots in Mon 09:00 format, 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


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


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:

  • title and caption: templates for each imported post, such as {{title}} and {{title}} {{link}}, max 255 characters each. title defaults to {{title}}
  • loadOldPosts: defaults to false; true also imports what’s already in the feed
  • addPostsAsDraft: defaults to false; true imports posts as drafts
  • refreshRate: hours between checks, 1, 6, 12, or 24 (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


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


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.jpg to 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.


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, or PUBLISHED
  • postType: TEXT, IMAGE, VIDEO, MULTIMEDIA, SHORT, DOCUMENT, THREAD, SLIDES, REEL, TIKTOK, STORY, POLL, or ENGAGE_COMMENT
  • postingType: NOW, SCHEDULE, QUEUE, or DRAFT
  • createdFrom, createdTo: UTC, YYYY-MM-DD HH:mm:ss
  • sortBy (id, title, post_date, created_at, updated_at) and sortOrder (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


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


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, collectionId
  • publishMode: one of QUEUE, SCHEDULE, IMMEDIATE, DRAFT
  • caption (1–3000 characters) required unless poll is set
  • scheduledAt (only if publishMode = SCHEDULE): timestamp in YYYY-MM-DD HH:mm:ss format, interpreted in the brand’s timezone, and at least 10 minutes in the future

Optional input:

  • media: array of items, each with either an id from nuelink_upload_file or a public url, not both
  • title: used by YouTube, Pinterest, etc.
  • alt: alt text for accessibility
  • link: the Google Business Profile LEARN_MORE button and the Pinterest destination link
  • postAsStory: 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 optionally correctOptionIndex and explanation for 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. Both comment text and a delay in 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:

PlatformOptions
instagramcollab, location, trialReel, shareToFeed
facebooklocation
tiktoksendToInbox, autoAddMusic
youtubetags, playlists (each entry needs at least one playlist ID)
googlemybusinessuploadToPhotosSection

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


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, or QUEUE. IMMEDIATE isn’t accepted here
  • queuePosition: FRONT or BACK

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}


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}


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, or SENT
  • collectionId, channelId, postId (the Nuelink post the entries came from), postType
  • search: case-insensitive match on the published text
  • publishedFrom, publishedTo: UTC, YYYY-MM-DD HH:mm:ss
  • sortBy (id, created_at, likes, comments, shares) and sortOrder (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


ValueWhat it does
QUEUEAdds the post to the collection’s next available time slot after explicit intent.
SCHEDULEPublishes at the exact scheduledAt timestamp (in the brand’s timezone).
IMMEDIATEPublishes right now. Reads back as postingType: NOW.
DRAFTSaves without publishing or scheduling. Safe default when intent is unclear.

nuelink_update_post accepts DRAFT, SCHEDULE, and QUEUE, not IMMEDIATE.


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 groupRecommended permission
nuelink_get_me, nuelink_validate_token, nuelink_get_schedule, and nuelink_list_*Allow only according to account/content sensitivity
nuelink_create_collectionAsk each time
nuelink_create_automationAsk each time; it starts a recurring process
nuelink_upload_fileAsk each time; it writes to the media library
nuelink_create_postAsk each time, including DRAFT; always require explicit intent for non-draft modes
nuelink_update_postAsk each time; QUEUE and SCHEDULE can put a draft on track to publish
nuelink_delete_postAsk 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.

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_post ran without sensitive actions enabled.
  • 404: Brand, collection, post, or referenced resource doesn’t exist or doesn’t belong to your account.
  • 409: nuelink_update_post on 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.