Buzzmark
officialWrite 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 withsave_draft. - Schedule without publishing — Put a draft on the calendar with
schedule_postusingwhenset 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 viasave_as_drafts. - Check a post against your brand — Score any text or draft 0–100 with
check_postand get up to three edits that would raise the score. - See what worked — Review recent post performance with
get_post_stats, best posting slots withget_best_times, and patterns withget_insights. - Add pictures to drafts — Create an image with
create_imageor pull one in from a link withadd_media_from_url, attached to a draft bypost_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 | |
|---|---|
| Transport | MCP over Streamable HTTP, at the server URL above. |
| Sign-in | OAuth 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-in | An API key from the AI apps page in Buzzmark, sent as a Bearer token. Shown once; Buzzmark keeps only its fingerprint. |
| Scope | One scope, buzz. Scopes an app asks for beyond it are left out, not refused. |
| Tokens | An 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. |
| Limits | 30 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. |
| Audit | Each 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.
| Inputs | Type | ||
|---|---|---|---|
status | one of "draft", "scheduled", "published", "failed", "all" | Optional | Default "all" |
social_set_id | number | Optional | |
limit | number, 1 to 50 | Optional | Default 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.
| Inputs | Type | ||
|---|---|---|---|
post_id | number | Required | The 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.
| Inputs | Type | ||
|---|---|---|---|
idea | text, up to 2,000 characters | Required | What the posts are about, in the user's words. |
hive_profile_id | number | Optional | |
social_set_id | number | Optional | Social set whose Hive profile writes the posts, when hive_profile_id is left out. Optional when the account has one set. |
platform | text | Optional | Buzzmark platform id (x, linkedin, instagram, threads, facebook, tiktok, bluesky) to write for. |
format | one of "post", "thread" | Optional | Default "post" |
count | number, 1 to 5 | Optional | Default 3 |
with_picture_brief | yes or no | Optional | Add 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.
| Inputs | Type | ||
|---|---|---|---|
post_id | number | Optional | Update this draft instead of making a new one. |
text | text, up to 10,000 characters | Optional | |
thread | list of text, up to 25 | Optional | A thread: one string per post. Replaces text. |
social_set_id | number | Optional | Social set id from list_social_sets. Optional when the account has one set. |
hive_profile_id | number | Optional | |
account_ids | list of number, up to 20 | Optional | Accounts it goes to, first one leading. Default: the set's default accounts. |
first_comment | text, up to 5,000 characters | Optional | A 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.
| Inputs | Type | ||
|---|---|---|---|
post_id | number | Required | |
when | text | Required | "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_ids | list of number, up to 20 | Optional | Default: 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.
| Inputs | Type | ||
|---|---|---|---|
posts | list of object, up to 25 | Required | Each 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.
| Inputs | Type | ||
|---|---|---|---|
post_id | number | Required | |
when | text | Required | A 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.
| Inputs | Type | ||
|---|---|---|---|
post_id | number | Required |
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.
| Inputs | Type | ||
|---|---|---|---|
post_id | number | Required |
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.
| Inputs | Type | ||
|---|---|---|---|
text | text, up to 10,000 characters | Optional | The post to check. Leave out to check the draft named by post_id. |
post_id | number | Optional | |
platform | text | Optional | Buzzmark platform id the post is for. Default: the draft's first account. |
hive_profile_id | number | Optional | Brand profile id from list_brand_profiles. Default: the social set's own. |
social_set_id | number | Optional | Social 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).
| Inputs | Type | ||
|---|---|---|---|
action | one of "match_hive", "fix_grammar", "sharpen", "sting", "trim", "remix", "expand", "structure", "warmer", "thread_hook", "emoji", "emoji_bullets", "announcement", "for_platform", "custom" | Required | |
text | text, up to 10,000 characters | Optional | The post to rewrite. Leave out to rewrite a draft's part (post_id, part). |
post_id | number | Optional | |
part | number, 0 to 24 | Optional | Which post of a thread, from 0. Default 0 |
platform | text | Optional | Buzzmark platform id. Needed for for_platform; otherwise it sets the length the rewrite keeps to. |
instruction | text, up to 600 characters | Optional | For custom: how to rewrite it, in the user's words. |
hive_profile_id | number | Optional | Brand profile id from list_brand_profiles. Default: the social set's own. |
social_set_id | number | Optional | Social 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.
| Inputs | Type | ||
|---|---|---|---|
post_id | number | Required | |
platforms | list of text, up to 8 | Optional | Buzzmark 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.
| Inputs | Type | ||
|---|---|---|---|
social_set_id | number | Optional | Social set id from list_social_sets. Optional when the account has one set. |
hive_profile_id | number | Optional | Brand profile id from list_brand_profiles. Default: the social set's own. |
refresh | yes or no | Optional | Default 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.
| Inputs | Type | ||
|---|---|---|---|
social_set_id | number | Optional | Social set whose brand profile is read, when hive_profile_id is left out. Optional when the account has one set. |
hive_profile_id | number | Optional | Brand 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.
| Inputs | Type | ||
|---|---|---|---|
social_set_id | number | Optional | Social set id from list_social_sets. Optional when the account has one set. |
days | number, 14 to 180 | Optional | How 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.
| Inputs | Type | ||
|---|---|---|---|
social_set_id | number | Optional | Social set id from list_social_sets. Optional when the account has one set. |
days | number, 1 to 180 | Optional | How many days of published posts to read, counted back from now. 1 to 180, default 30. |
limit | number, 1 to 30 | Optional | How 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.
| Inputs | Type | ||
|---|---|---|---|
prompt | text, up to 3,000 characters | Required | What the picture shows. A photograph by default. |
hive_profile_id | number | Optional | |
product | text, up to 200 characters | Optional | A product name exactly as the Hive profile lists it, to use its photo. |
platforms | list of text, up to 8 | Optional | Where it goes, for the shape (Instagram and Threads 4:5, TikTok 2:3, else square). Default: the draft's platforms. |
post_id | number | Optional | A draft to add the picture to. |
part | number, 0 to 24 | Optional | Which 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.
| Inputs | Type | ||
|---|---|---|---|
url | text, up to 2,000 characters | Required | A public https link straight to the file, not to a page that shows it. |
post_id | number | Optional | A draft to add it to. Without one it goes to the Library only. |
part | number, 0 to 24 | Optional | Which 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.
| Inputs | Type | ||
|---|---|---|---|
file_name | text, up to 120 characters | Optional | The 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_id | number | Optional | A draft to add the file to. Without one it goes to the Library only. |
part | number, 0 to 24 | Optional | Which 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.
| Inputs | Type | ||
|---|---|---|---|
upload_id | text, up to 2,000 characters | Required | upload_id from create_upload_link. |
post_id | number | Optional | A draft to add it to. Without one it goes to the Library only. |
part | number, 0 to 24 | Optional | Which 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.
| Inputs | Type | ||
|---|---|---|---|
file | object | Required | The file the user attached in the chat. |
post_id | number | Optional | A draft to add it to. Without one it goes to the Library only. |
part | number, 0 to 24 | Optional | Which 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.
| Inputs | Type | ||
|---|---|---|---|
social_set_id | number | Optional | Social set id from list_social_sets. Optional when the account has one set. |
goal | text, up to 600 characters | Optional | What the week should do, in the user's words: a launch, an event, more bookings. |
start | text | Optional | First day, YYYY-MM-DD on the set's clock. Default: tomorrow. |
save_as_drafts | yes or no | Optional | Default 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.
- Best social media MCP servers: What each tool says about its MCP server: the plan, the AI apps it names and its API.
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
- Buzzmark in Claude: One press in Claude's directory, or one command in Claude Code.
- Buzzmark in ChatGPT: One press in ChatGPT's plugins.
- Buzzmark in Grok: One custom connector at grok.com, with sign-in.
- Buzzmark in Cursor: One block of config, with sign-in or an API key.