Buzzmark

official

Write posts in your brand’s own voice, score each draft 0 to 100, and schedule them to six social networks.

What can you do with Buzzmark MCP?

  • Draft posts in your brand voice — Ask Buzzmark to write 1–5 posts from an idea with write_posts, then save the text you like with save_draft.
  • Schedule without publishing — Put a draft on the calendar with schedule_post using when set to "best_time", "next_slot", or a date and time.
  • Plan a week of content — Generate a 7-day plan with create_weekly_content_plan, optionally saving each post as a draft via save_as_drafts.
  • Check a post against your brand — Score any text or draft 0–100 with check_post and get up to three edits that would raise the score.
  • See what worked — Review recent post performance with get_post_stats, best posting slots with get_best_times, and patterns with get_insights.
  • Add pictures to drafts — Create an image with create_image or pull one in from a link with add_media_from_url, attached to a draft by post_id.

Hosted MCP Server

npx add-mcp 'https://buzzmark.ai/mcp'

Installs into Claude Code, Codex, Cursor and more

Documentation

One server. Any MCP app.

Buzzmark speaks MCP over Streamable HTTP, with OAuth 2.1 sign-in or an API key. 24 tools, the same rules as the app, and no way to post on the spot.

Server URL: https://buzzmark.ai/mcp

How it connects

How it connects
TransportMCP over Streamable HTTP, at the server URL above.
Sign-inOAuth 2.1 with PKCE (S256). Clients register on the fly, or bring their metadata URL. The first request gets a 401 with the resource metadata, so a client finds the authorization server on its own.
Without sign-inAn API key from the AI apps page in Buzzmark, sent as a Bearer token. Shown once; Buzzmark keeps only its fingerprint.
ScopeOne scope, buzz. Scopes an app asks for beyond it are left out, not refused.
TokensAn access token lives 1 hour, a refresh token 90 days and rotates on use. An authorization code lives 10 minutes and works once; a second use closes the grant.
Limits30 calls a minute and 1,000 a day for your account, across every app and key. Writing and pictures also count against the plan's monthly quotas.
AuditEach call logs the tool and its outcome, never the arguments or the answer.

Tools reference

Read from the server's own catalogue at build time, so it matches what the server answers.

List social sets (list_social_sets), reads only

The user's social sets: each is a group of connected social accounts with its own Hive profile (brand voice), time zone and weekly posting slots. Start here: most other tools take a social_set_id and account ids from this answer.

Inputs: Takes no inputs.

List brand profiles (list_brand_profiles), reads only

The user's brand profiles (Buzzmark calls them Hive profiles): what Buzzmark knows about each brand, its voice, tone, audience and products. Writing tools write in a brand profile's voice; pass its id as hive_profile_id, or leave it out to use the social set's own.

Inputs: Takes no inputs.

List posts (list_posts), reads only

Buzzes in Buzzmark, newest first: drafts, scheduled, published or failed. Text is cut to 400 characters; get_post gives the whole Buzz.

InputsType
statusone of "draft", "scheduled", "published", "failed", "all"OptionalDefault "all"
social_set_idnumberOptional
limitnumber, 1 to 50OptionalDefault 20

Get a post (get_post), reads only

One Buzz in full: every part of a thread with its text and pictures, its first comment, the accounts it goes to, its social set and brand profile, its status and its scheduled time. Use it after list_posts, which cuts text to 400 characters, or to read a draft before changing it with save_draft. It carries no likes or other numbers: get_post_stats has those for published posts.

InputsType
post_idnumberRequiredThe Buzz's id, from list_posts or from save_draft's answer.

Write posts in the brand's voice (write_posts)

Buzz writes 1 to 5 new posts from an idea, in a Hive profile's voice, with Buzzmark's writing rules and its after-check. Every answer is kept in the user's Library in Buzzmark. Nothing is saved as a draft: pass the text you want to save_draft. Use it for posts that don't exist yet; to change a post that does, use rewrite_post, and to give a saved draft its own text for each platform, adapt_for_platforms.

InputsType
ideatext, up to 2,000 charactersRequiredWhat the posts are about, in the user's words.
hive_profile_idnumberOptional
social_set_idnumberOptionalSocial set whose Hive profile writes the posts, when hive_profile_id is left out. Optional when the account has one set.
platformtextOptionalBuzzmark platform id (x, linkedin, instagram, threads, facebook, tiktok, bluesky) to write for.
formatone of "post", "thread"OptionalDefault "post"
countnumber, 1 to 5OptionalDefault 3
with_picture_briefyes or noOptionalAdd a brief for a picture to each post, for create_image. Default false

Save a draft (save_draft)

Creates a Buzz draft, or updates one (post_id). A draft stays a draft: nothing is posted or scheduled. Give text for one post, or thread for several. Says what a platform would refuse (length, a missing picture, a LinkedIn tag LinkedIn can't find) so it can be fixed before schedule_post. Tagging: on X, Threads, Instagram and TikTok write @handle. On LinkedIn write the profile or page link in brackets, @[https://www.linkedin.com/company/] or @[https://www.linkedin.com/in/], and LinkedIn shows its own name for it; every other platform gets that name as plain text. On Facebook a mention stays plain text. A brand profile with accounts (list_brand_profiles shows them) needs none of that: write its name, and when the post is scheduled its first mention is tagged on each platform it has an account on. first_comment adds a comment posted under the post the moment it goes out, on LinkedIn, Instagram, Facebook and Threads: the place for a link or the hashtags, so the post itself stays clean.

InputsType
post_idnumberOptionalUpdate this draft instead of making a new one.
texttext, up to 10,000 charactersOptional
threadlist of text, up to 25OptionalA thread: one string per post. Replaces text.
social_set_idnumberOptionalSocial set id from list_social_sets. Optional when the account has one set.
hive_profile_idnumberOptional
account_idslist of number, up to 20OptionalAccounts it goes to, first one leading. Default: the set's default accounts.
first_commenttext, up to 5,000 charactersOptionalA comment posted under the post right after it goes out, on LinkedIn, Instagram (not a story), Facebook and Threads; other platforms leave it out. At most 500 characters on Threads, 1,250 on LinkedIn, 2,200 on Instagram, 5,000 on Facebook. An empty string removes it; leave it out to keep the draft's comment as it is.

Schedule a post (schedule_post)

Schedules a draft for a time, at the best time, or in the social set's next free posting slot. Never posts right away. With "best_time", Buzzmark picks the soonest free hour when posts on these accounts do best, from numbers it keeps to itself (LinkedIn doesn't allow its numbers in AI apps), and answers the time it picked. Times are on the set's clock unless they carry an offset. When the set has natural times on (list_social_sets says), the post goes out a few minutes either way of the time named; the answer says the real time. When the person's role in their organization needs an approval first, the draft is sent for approval instead (sent_for_approval in the answer) and goes out once a teammate approves it. For several drafts at once, use schedule_posts.

InputsType
post_idnumberRequired
whentextRequired"best_time" (Buzzmark picks the soonest free best time for these accounts), "next_slot", or a date and time: "2026-10-02T09:00" on the set's clock, or ISO 8601 with an offset.
account_idslist of number, up to 20OptionalDefault: the accounts saved on the draft, else the set's default accounts.

Schedule several posts (schedule_posts)

Schedules up to 25 drafts in one go, each at its own time, at the best time or in the next free slot, for example the drafts create_weekly_content_plan saved (each one's date and time is its slot). Never posts right away. Each draft is checked on its own: one that can't go out is reported and the others are still scheduled. When the person's role needs an approval first, the drafts are sent for approval instead.

InputsType
postslist of object, up to 25RequiredEach draft with its time (post_id, when, optional account_ids).

Move a scheduled post (reschedule_post)

Moves a scheduled post to a new date and time on the set's clock, kept exactly. Never posts right away. The words, pictures and accounts stay as they are.

InputsType
post_idnumberRequired
whentextRequiredA date and time: "2026-10-02T09:00" on the set's clock, or ISO 8601 with an offset.

Take a post off the schedule (unschedule_post)

Takes a scheduled post off the calendar and back to the drafts, with its text, pictures and accounts, so it can be edited or scheduled again. Nothing is deleted. Pictures the posting queue held are copied into Buzzmark first; if one can't be, the post stays scheduled.

InputsType
post_idnumberRequired

Delete a draft (delete_draft)

Deletes a draft for good. A scheduled or published post can't be deleted here: take a scheduled one back to drafts with unschedule_post first.

InputsType
post_idnumberRequired

Check a post against the brand voice (check_post)

Scores a post 0 to 100 on how much it sounds like the brand, with a short verdict, the one thing that works or drifts, and up to three edits that would raise the score, each as the whole post rewritten. Checks any text, including text written in this chat, or a draft (post_id), whose score is kept beside it in Buzzmark. Changes nothing in the post. Use it to judge one post before it goes out; for how published posts did, use get_post_stats, and for what they have in common, get_insights.

InputsType
texttext, up to 10,000 charactersOptionalThe post to check. Leave out to check the draft named by post_id.
post_idnumberOptional
platformtextOptionalBuzzmark platform id the post is for. Default: the draft's first account.
hive_profile_idnumberOptionalBrand profile id from list_brand_profiles. Default: the social set's own.
social_set_idnumberOptionalSocial set id from list_social_sets. Optional when the account has one set.

Rewrite a post (rewrite_post), reads only

Buzz rewrites a post one way and answers up to three versions to pick from, in the brand's voice and with Buzzmark's writing rules. Nothing is saved: pass the version the user picks to save_draft. Use it to change one post that already exists, in one way; for new posts from an idea, use write_posts, and to rewrite a saved draft for every platform it goes to and keep those versions on it, adapt_for_platforms. Actions: match_hive (sound like the brand), fix_grammar (spelling and grammar only), sharpen (clearer, tighter), sting (more punch), trim (about half the length), remix (fresh words), expand (one concrete detail more), structure (short lines, easy to scan), warmer, thread_hook (the opening post of a thread), emoji, emoji_bullets, announcement (framed as news), for_platform (rewritten the way the platform reads), custom (follow the user's instruction).

InputsType
actionone of "match_hive", "fix_grammar", "sharpen", "sting", "trim", "remix", "expand", "structure", "warmer", "thread_hook", "emoji", "emoji_bullets", "announcement", "for_platform", "custom"Required
texttext, up to 10,000 charactersOptionalThe post to rewrite. Leave out to rewrite a draft's part (post_id, part).
post_idnumberOptional
partnumber, 0 to 24OptionalWhich post of a thread, from 0. Default 0
platformtextOptionalBuzzmark platform id. Needed for for_platform; otherwise it sets the length the rewrite keeps to.
instructiontext, up to 600 charactersOptionalFor custom: how to rewrite it, in the user's words.
hive_profile_idnumberOptionalBrand profile id from list_brand_profiles. Default: the social set's own.
social_set_idnumberOptionalSocial set id from list_social_sets. Optional when the account has one set.

Give a draft a version per platform (adapt_for_platforms)

Rewrites a draft the way each platform it goes to reads it (or the platforms named), and saves those versions on the draft, as Spread does in the app: the draft's first account keeps the post itself, every other platform gets its own text, with the same pictures. A version saved before for one of those platforms is replaced. Works on a single post, not a thread. A LinkedIn version keeps LinkedIn tags as @[link]; the answer warns about any LinkedIn can't find. Use it once a draft is written and has its accounts; to change the post itself, use rewrite_post (its for_platform action rewrites for one platform without saving), and for new posts, write_posts.

InputsType
post_idnumberRequired
platformslist of text, up to 8OptionalBuzzmark platform ids among the draft's accounts. Default: every platform after the first account's.

Post ideas from the news and competitors (get_post_ideas)

Post ideas for a brand from Buzzmark's Scout: this week's news in its sector, each topic with why it matters now, its sources and two or three angles to post, plus angles from its competitors when Scout has read them. Answers Scout's latest read with its date. With refresh, or when Scout has never read the news for this brand, it reads the news again first (up to a minute, counted as one Scout run). Ideas only: write them up with write_posts.

InputsType
social_set_idnumberOptionalSocial set id from list_social_sets. Optional when the account has one set.
hive_profile_idnumberOptionalBrand profile id from list_brand_profiles. Default: the social set's own.
refreshyes or noOptionalDefault false

What worked this month (get_insights)

What a brand's posts from the last 30 days have in common when they do better or worse than its average post, as at most one finding and two moves in plain sentences. LinkedIn posts are read apart and their finding stays in Buzzmark, since LinkedIn doesn't allow its numbers in AI apps. Each says the number it stands on (for example, posts that open with a question got 2.3x the average post's engagement, from 5 of 19 measured posts) and an idea to act on. Posts are compared by platform, whether they open with a number or a question, length, post type, weekday and time of day. Read at most once a day: the same answer comes back until the numbers move. Needs 8 posts with numbers in the 30 days, and says how many it has when there are fewer. Use it to learn what to do more of; for each post and its numbers, use get_post_stats, for the best weekday and hour, get_best_times, and to judge a draft before it goes out, check_post.

InputsType
social_set_idnumberOptionalSocial set whose brand profile is read, when hive_profile_id is left out. Optional when the account has one set.
hive_profile_idnumberOptionalBrand profile id from list_brand_profiles. Default: the social set's own, else the account's default brand profile.

Best times to post (get_best_times), reads only

When a social set's own published posts have done best: the 6 strongest weekday and hour slots on the set's clock, best first, each with how many posts it holds and their average engagement (likes + comments + shares or reposts, whichever is larger, + saves) per post. A slot whose posts earned nothing is left out, so a set with no engagement yet gets no slots. Says the set's time zone and how many posts were read. LinkedIn posts aren't counted, since LinkedIn doesn't allow its numbers in AI apps; a set that posts only to LinkedIn gets starter times from a public study and its own posting slots. To post at the best time on any platform, LinkedIn included, schedule_post with when "best_time" lets Buzzmark pick. For how single posts did, use get_post_stats, and for what the posts have in common, get_insights.

InputsType
social_set_idnumberOptionalSocial set id from list_social_sets. Optional when the account has one set.
daysnumber, 14 to 180OptionalHow many days of published posts to read, counted back from now. 14 to 180, default 90.

How recent posts did (get_post_stats), reads only

A social set's published posts from the last days, ranked by engagement (likes + comments + shares or reposts, whichever is larger, + saves), best first. Each post comes with its platform, when it went out on the set's clock, its text, its link, its engagement, whether it went out from Buzzmark, and its numbers; the answer also sums the numbers over every post in the window. LinkedIn doesn't allow its numbers in AI apps, so LinkedIn posts come apart in numbers_in_buzzmark_only, newest first, with when they went out, their link and where to see the numbers in Buzzmark, and are left out of the totals. The numbers are impressions, reach, views, likes, comments, shares, saves and clicks, under the platform's own word where it has one (replies, reposts, bookmarks, videoViews and upvotes). A number a platform doesn't report is left out, never shown as 0. Use it to see which posts did best and by how much; for what they have in common, use get_insights, for the best weekday and hour, get_best_times, for drafts and scheduled posts, list_posts, and for one Buzz in full, get_post.

InputsType
social_set_idnumberOptionalSocial set id from list_social_sets. Optional when the account has one set.
daysnumber, 1 to 180OptionalHow many days of published posts to read, counted back from now. 1 to 180, default 30.
limitnumber, 1 to 30OptionalHow many posts to return, best first. 1 to 30, default 10. The totals still count every post in the window.

Make a picture (create_image)

Makes a picture with Buzzmark's image model and keeps it in the user's Library. With post_id it's also added to that draft. The picture takes the Hive profile's colours, and a named Hive product brings its real photo as the reference. Uses one of the month's picture credits; a failed or refused picture isn't counted. Takes about a minute.

InputsType
prompttext, up to 3,000 charactersRequiredWhat the picture shows. A photograph by default.
hive_profile_idnumberOptional
producttext, up to 200 charactersOptionalA product name exactly as the Hive profile lists it, to use its photo.
platformslist of text, up to 8OptionalWhere it goes, for the shape (Instagram and Threads 4:5, TikTok 2:3, else square). Default: the draft's platforms.
post_idnumberOptionalA draft to add the picture to.
partnumber, 0 to 24OptionalWhich post of a thread, from 0. Default 0

Add a picture or video from a link (add_media_from_url)

Copies a picture or video from a public https link into the user's Library in Buzzmark, and with post_id adds it to that draft. Buzzmark keeps its own copy, so the post never depends on the link staying up. Takes JPG, PNG, WebP, GIF, MP4 or MOV: pictures up to 10 MB, videos up to 200 MB. Says what a platform would refuse, like create_image does.

InputsType
urltext, up to 2,000 charactersRequiredA public https link straight to the file, not to a page that shows it.
post_idnumberOptionalA draft to add it to. Without one it goes to the Library only.
partnumber, 0 to 24OptionalWhich post of a thread, from 0. Default 0

Get an upload link (create_upload_link)

For a picture or video the user has on their own computer or phone, not at a public link. Answers two ways in, both good for one file: upload_page, a Buzzmark page to send the user, where they pick the file and it goes straight onto the draft (pass post_id); and, with file_name, upload_url, for an app that can read the file itself (a terminal or a file system): PUT the file's bytes there with the Content-Type header the answer gives, then call add_uploaded_media with upload_id. Takes JPG, PNG, WebP, GIF, MP4 or MOV: pictures up to 10 MB, videos up to 200 MB.

InputsType
file_nametext, up to 120 charactersOptionalThe file's name with its ending, like "launch.png", when this app uploads the file itself. Leave it out to only get the page for the user.
post_idnumberOptionalA draft to add the file to. Without one it goes to the Library only.
partnumber, 0 to 24OptionalWhich post of a thread, from 0. Default 0

Add an uploaded picture or video (add_uploaded_media)

After the file was PUT to create_upload_link's upload_url: copies it into the user's Library in Buzzmark, and with post_id adds it to that draft. Says what a platform would refuse, like add_media_from_url does. An upload_id works for 55 minutes.

InputsType
upload_idtext, up to 2,000 charactersRequiredupload_id from create_upload_link.
post_idnumberOptionalA draft to add it to. Without one it goes to the Library only.
partnumber, 0 to 24OptionalWhich post of a thread, from 0. Default 0

Add a picture or video from this chat (add_media_from_chat)

A picture or video the user attached in this chat: copies it into their Library in Buzzmark, and with post_id adds it to that draft. Says what a platform would refuse. Takes JPG, PNG, WebP, GIF, MP4 or MOV: pictures up to 10 MB, videos up to 200 MB.

InputsType
fileobjectRequiredThe file the user attached in the chat.
post_idnumberOptionalA draft to add it to. Without one it goes to the Library only.
partnumber, 0 to 24OptionalWhich post of a thread, from 0. Default 0

Plan the week (create_weekly_content_plan)

A plan for a social set's next 7 days: what the week is for, 2 to 4 content pillars, and one ready-to-edit post per posting slot, each with its day, time, platform, a picture idea and why it's there. Built from the set's Hive profile, its posting slots, its best times and how recent posts did, and what's already scheduled. LinkedIn's numbers aren't used to write it: Buzzmark moves each LinkedIn-only post to LinkedIn's best slot of its day afterwards. Needs a connected account; with fewer than 8 published posts with numbers it leans on the brand's voice and the platforms' norms, and says so. Kept in the Library. Ask the user first whether they want the posts as drafts: with save_as_drafts every post also becomes a draft, and schedule_posts then puts them all on their slots in one go. Each planned post counts as one Buzz written for you. Takes up to a minute.

InputsType
social_set_idnumberOptionalSocial set id from list_social_sets. Optional when the account has one set.
goaltext, up to 600 charactersOptionalWhat the week should do, in the user's words: a launch, an event, more bookings.
starttextOptionalFirst day, YYYY-MM-DD on the set's clock. Default: tomorrow.
save_as_draftsyes or noOptionalDefault false

Guides we publish

Each guide compares the tools on the facts each one publishes. Buzzmark is one of them, and every page says who made it.

Questions about the server

Which clients have been tried?

Claude, ChatGPT, Grok and Cursor have pages of their own. Any client that does MCP over Streamable HTTP with OAuth 2.1 or a Bearer header should work; an app that only speaks stdio needs a bridge.

Why is there no publish-now tool?

So the owner keeps the last word. schedule_post needs a time at least 5 minutes out, or the next free posting slot, and a scheduled Buzz can be pulled back in the app.

Where do errors come from?

Every refusal is a sentence Buzzmark wrote, with the reason and what to do: a platform's limit, a missing picture, a set without a queue. No provider's message reaches the app.

Is there a REST API too?

Not yet. The MCP server is the way in for AI apps today, and it's on every plan.

Set it up in