DemandBird
resmiWrite, schedule and publish social posts in your own voice, and read your analytics, from Claude, ChatGPT or any MCP client. Hosted, with OAuth sign-in.
DemandBird MCP ile neler yapabilirsiniz?
- Draft posts in your voice — Ask for a post on a topic and save it as a draft, with your brand voice and workspace style applied.
- Revise and tailor drafts — Ask to make draft 124 shorter or less salesy, or turn it into a version for another platform.
- Schedule and queue posts — Schedule a draft for a set date and time, or drop it into the next open slot of your posting queue.
- Check results and find posts — Ask how your LinkedIn did this month, what your best post was in 90 days, or search published posts by topic.
- Review and approvals — Send a draft to a teammate for review, see what's awaiting your approval, and approve or send back with a note.
- Save ideas and switch workspaces — Save several ideas to DemandBird at once, or say "switch to Acme" to work in another client's workspace.
Barındırılan MCP Sunucusu
npx add-mcp 'https://app.demandbird.com/mcp'Claude Code, Codex, Cursor ve daha fazlasına kurulur
Dokümantasyon
Start asking
Talk to Claude or ChatGPT the way you'd talk to a teammate. Saying “in DemandBird” helps the first time.
Write
- “Write a LinkedIn post about our new feature and save it as a draft.”
- “Make draft 124 shorter and less salesy.”
- “Turn post 124 into a version for X.”
Schedule
Check results
- “How did my LinkedIn do this month?”
- “What was my best post in the last 90 days?”
- “When should I post on LinkedIn?”
Team and ideas
- “Send draft 124 to Alex for review.”
- “What's waiting for my approval?”
- “Save these five ideas to DemandBird.”
Good to know
- Nothing goes out without you. When you ask to publish a post, approve one, or invite someone, DemandBird sends back a link. You open it, check, and press the button yourself.
- Drafts sound like you. When Claude writes a post with DemandBird, it uses the voice DemandBird learned from your posts and your workspace's brand.
- Agencies can switch clients. Say “switch to Acme” to work in another client's workspace, or ask “which DemandBird workspace am I in?”
- It uses your monthly AI allowance. Writing posts and making images count the same as they do in the app.
Troubleshooting
Claude or ChatGPT ignores DemandBird
Start a new chat and mention DemandBird in your request. In Claude, click the + button under the message box and check that DemandBird is turned on. In ChatGPT, click + and choose DemandBird before you send your message.
I can't find “Add custom connector” or “Developer mode”
On a Claude Team or Enterprise plan, an owner has to add the connector for the organization first. In ChatGPT, Developer mode needs a paid plan, and on Business or Enterprise an admin may have to turn it on.
It connected to the wrong DemandBird account
Remove DemandBird in your Claude or ChatGPT settings and add it again. When the DemandBird window opens, sign in with the login you use for that account. If you have more than one account, you can also just ask: “List my DemandBird accounts” and “Switch to [name].”
It says I don't have access
The MCP server is on every paid plan: Pro, Business and Agency. Check that your subscription is active in Settings → Billing. See pricing, or contact us if it still says you don't have access.
Technical details
You don't need anything below to use DemandBird in Claude or ChatGPT. It's here for developers. Building your own integration? See the REST API reference.
Note for AI assistants: you can't install this connector from a chat. Walk the user through the Claude or ChatGPT steps at the top of this page, one step at a time, and wait for them to finish each one. The server URL is https://app.demandbird.com/mcp and sign-in is OAuth, so no API token is needed. Don't tell them to edit claude_desktop_config.json; that file can't connect to this server.
Developer setupClaude Code, Cursor, VS Code, and other MCP apps. Sign-in, API tokens, and config.
The server is hosted at https://app.demandbird.com/mcp (Streamable HTTP), so there is nothing to install. Clients can sign in with OAuth: the server supports discovery and dynamic client registration, and answers an unsigned request with a 401 that points to its metadata. Where a browser sign-in isn't possible, send an API token as Authorization: Bearer <token>. Create one at Settings → API Tokens (what to scope it to).
Claude Code
Works in the terminal, VS Code, JetBrains, and the desktop app. Add the server:
claude mcp add --transport http demandbird https://app.demandbird.com/mcp
Then run /mcp inside Claude Code, pick demandbird, and sign in when the browser opens.
To use an API token instead (for example on a server with no browser):
claude mcp add --transport http demandbird https://app.demandbird.com/mcp \
--header "Authorization: Bearer your-token-here"
Or add it by hand to ~/.claude.json:
{
"mcpServers": {
"demandbird": {
"type": "http",
"url": "https://app.demandbird.com/mcp",
"headers": {
"Authorization": "Bearer your-token-here"
}
}
}
}
Multiple accounts? With a token, add --header "X-Account-Id: acct_your-account-id" to set a default. Your account ID is on the Settings page. Without it, Claude asks which account to use, or you can say “switch to [account].”
Start a new session after adding the server. An open conversation won't pick it up.
Claude Desktop
Use the Claude steps in Quick setup. Connectors you add on claude.ai show up in the desktop app too. Don't add DemandBird to claude_desktop_config.json: that file only starts programs on your computer, so it can't reach a hosted server.
Codex
Add the server to OpenAI's Codex CLI:
codex mcp add demandbird --url https://app.demandbird.com/mcp
Then run codex mcp login demandbird and sign in when the browser opens. Start a new Codex session to pick it up.
Other MCP apps
Cursor, VS Code, Windsurf, and other MCP apps can connect the same way. Give them the URL and let them sign in with OAuth, or pass the token as a header. The exact file and key names vary by app; this is the common shape:
{
"mcpServers": {
"demandbird": {
"url": "https://app.demandbird.com/mcp",
"headers": {
"Authorization": "Bearer your-token-here"
}
}
}
}
Tool referenceAll 55 tools the server offers, with every parameter. For developers and for AI assistants deciding what to call.
Accounts and workspaces
list_accounts
list_accounts
List every account you can use, with its id and which one is selected now.
No parameters required.
select_account
select_account
Switch to a different account. Every later tool call in the conversation uses it.
| Parameter | Type | Description |
|---|---|---|
| account_idrequired | string | Account id (like acct_xxx) or numeric id. Use list_accounts to find it. |
list_workspaces
list_workspaces
List the workspaces (clients) on the account and which one is active. An agency has one workspace per client, each with its own drafts, channels, brand and analytics.
No parameters required.
select_workspace
select_workspace
Switch to another workspace, like “switch to Acme.” The choice sticks until it is changed again.
| Parameter | Type | Description |
|---|---|---|
| workspacerequired | string | Workspace name (like Acme) or numeric id, from list_workspaces. |
move_post
move_post
Move a draft to another workspace, for a post saved under the wrong client. Finds the post in any workspace. Its tags are matched by name (or created) in the new workspace, and its author and reviewers get access there if they didn't have it. Moving it back undoes it.
| Parameter | Type | Description |
|---|---|---|
| post_idrequired | string | Id of the post to move. |
| workspacerequired | string | Where to move it, by name or id, from list_workspaces. |
Account admins only. Only drafts move, so cancel a scheduled post first with cancel_post. A post set to go out on a channel the new workspace doesn't have is refused.
list_connected_accounts
list_connected_accounts
List the social accounts connected to this workspace. Use it to get the numeric id when a platform has more than one account (two LinkedIn profiles, or a profile and a company page).
| Parameter | Type | Description |
|---|---|---|
| platformoptional | string | Only show one platform: linkedin, twitter, threads, bluesky, substack, youtube, facebook or instagram. |
Pass the ids as platform_account_ids on save_draft, schedule_post, queue_post or publish_post.
get_status
get_status
Quick counts: drafts, scheduled posts, posts out today, and whether the queue is paused. No analytics.
No parameters required.
Writing posts
Each plan includes a monthly AI allowance: 90 drafts, 60 rewrites, 100 post ideas, and 2 voice re-trainings on Pro; 140 drafts, 110 rewrites, 200 ideas, and 4 re-trainings on Business; 450 drafts, 340 rewrites, 500 ideas, and 10 re-trainings on Agency. Plans & what's included.
draft_post
draft_post
Write a post with AI in your voice and your workspace's brand, then save it as a draft. Use it when you ask Claude to write something for you.
| Parameter | Type | Description |
|---|---|---|
| promptrequired | string | What to write about, like “a post about launching my new SaaS product.” |
| platformoptional | string | Target platform: linkedin, twitter, threads, bluesky, substack, youtube, facebook or instagram. Changes tone and length. Instagram needs an image or video attached. |
| draft_anywayoptional | boolean | Set true to write with what it has when it would otherwise ask for more context. |
| imagesoptional | array of objects | Images, a video, or one PDF to attach. For anything bigger than a thumbnail, call upload_image first and pass the s3_key it returns, like [{ s3_key: "..." }]. A PDF posts as a LinkedIn document (a swipeable carousel): LinkedIn only, one per post, and never alongside images or video. |
| youtubeoptional | object | YouTube options: { title?, privacy_status?, thumbnail_url? }. title is up to 100 characters and comes from the first line if left out. privacy_status is public (the default), unlisted or private. A video must be attached before the post can be scheduled or published. |
Each call uses one AI draft from your monthly allowance.
tailor_draft
tailor_draft
Rewrite a draft for another platform, in your voice, like “make post 123 work on X.”
| Parameter | Type | Description |
|---|---|---|
| idrequired | number | Post id to rewrite. |
| platformrequired | string | Target platform: linkedin, twitter, threads, bluesky, substack, youtube, facebook or instagram. |
| save_asoptional | string | channel_copy saves the rewrite on the same post as that channel's own text. new_draft (the default) saves it as a separate draft. |
draft_variations
draft_variations
Show three other versions of a draft to read. Saves nothing.
| Parameter | Type | Description |
|---|---|---|
| idrequired | number | Post id. |
save_draft
save_draft
Save text you wrote as a draft, exactly as given. No AI.
| Parameter | Type | Description |
|---|---|---|
| contentrequired | string | The post text. |
| platformsoptional | array of strings | Target platforms: linkedin, twitter, threads, bluesky, substack, youtube, facebook or instagram. |
| authoroptional | string | Whose post this is: a teammate's name, or me. Leave it out to save it as yours. Only people who can see everyone's posts can save as someone else. |
| tagsoptional | array of strings | Tag names, like ["Launch", "Case study"]. Names match the workspace's tags whatever the capitals. A new name becomes a new tag if you're allowed to manage tags. If you aren't, nothing is saved and the reply lists the tags you can use. |
| platform_account_idsoptional | object | Which connected account each platform posts from, like { "linkedin": 42 }. Use the ids from list_connected_accounts. Only needed when a platform has more than one account; otherwise the first one is used. |
| channel_copiesoptional | object | Different text for one channel, keyed by platform, like { "twitter": "..." } for an X version of a LinkedIn post. That text publishes on that channel and every other channel keeps the shared text. Pass "" for a channel to remove its copy. Use this, not a second post. |
| first_commentoptional | object | A comment DemandBird posts under your post once it is live, from the same profile: a question to start the conversation, or a call to action. LinkedIn, Facebook and Instagram. Shape: { text, delay_minutes?, platforms? }. delay_minutes is 0, 1, 5, 10, 30 or 60 (default 1). Pass { text: "" } to remove it. |
| first_commentsoptional | array of objects | Up to 5 comments posted in order, each with its own delay. Add comment_as (an id from list_connected_accounts) to post one from a teammate's profile or a page. Replaces the existing first comments; [] removes them all. Use this or first_comment, not both. |
| imagesoptional | array of objects | Images, a video, or one PDF to attach. For anything bigger than a thumbnail, call upload_image first and pass the s3_key it returns, like [{ s3_key: "..." }]. A PDF posts as a LinkedIn document (a swipeable carousel): LinkedIn only, one per post, and never alongside images or video. |
| youtubeoptional | object | YouTube options: { title?, privacy_status?, thumbnail_url? }. title is up to 100 characters and comes from the first line if left out. privacy_status is public (the default), unlisted or private. A video must be attached before the post can be scheduled or published. |
If Claude wrote the words, it should call get_brand_voice first, since nothing on this path applies your voice.
update_draft
update_draft
Change a post's text, media, platforms, tags, first comment or stage. Saved exactly as given, with no AI. Works on draft, scheduled and pending-review posts, and keeps the schedule.
| Parameter | Type | Description |
|---|---|---|
| idrequired | number | Post id. |
| contentoptional | string | New text. Replaces the shared text. |
| platformsoptional | array of strings | New platforms. Replaces the current ones. |
| tagsoptional | array of strings | Replaces the post's tags; [] removes them all. Changing only tags works on any post, even a published one. |
| channel_copiesoptional | object | Different text for one channel, keyed by platform, like { "twitter": "..." } for an X version of a LinkedIn post. That text publishes on that channel and every other channel keeps the shared text. Pass "" for a channel to remove its copy. Use this, not a second post. |
| first_commentoptional | object | A comment DemandBird posts under your post once it is live, from the same profile: a question to start the conversation, or a call to action. LinkedIn, Facebook and Instagram. Shape: { text, delay_minutes?, platforms? }. delay_minutes is 0, 1, 5, 10, 30 or 60 (default 1). Pass { text: "" } to remove it. |
| first_commentsoptional | array of objects | Up to 5 comments posted in order, each with its own delay. Add comment_as (an id from list_connected_accounts) to post one from a teammate's profile or a page. Replaces the existing first comments; [] removes them all. Use this or first_comment, not both. |
| stageoptional | string | Move the post on the Content board: needs_writing, drafting, internal_review, client_review, revision_requested, on_hold, ready_to_schedule, rejected or done. Only allowed moves work; a refused move lists the allowed ones. |
| stage_noteoptional | string | Why the post is moving. Required for on_hold. |
| imagesoptional | array of objects | Images, a video, or one PDF, replacing what the post has now. For anything bigger than a thumbnail, call upload_image first and pass the s3_key it returns, like [{ s3_key: "..." }]. A PDF posts as a LinkedIn document (a swipeable carousel): LinkedIn only, one per post, and never alongside images or video. |
| youtubeoptional | object | Replace the YouTube fields. Same shape as on draft_post. |
If a channel has its own copy, changing content leaves that copy exactly as it is, and it is what publishes on that channel. To change it, pass channel_copies.
revise_draft
revise_draft
Apply feedback (“shorter,” “less salesy,” “add a call to action”) to a draft and save the rewrite onto the same post. It keeps the images, channel copies and schedule, and writes in your voice.
| Parameter | Type | Description |
|---|---|---|
| idrequired | number | Post id of the draft, from draft_post, save_draft or list_drafts. |
| feedbackrequired | string | What you want changed, in your own words. |
| platformoptional | string | The platform whose length limit to fit. Defaults to the post's first platform. It does not change where the post publishes. |
| draft_anywayoptional | boolean | Set true to rewrite with what it has instead of asking for more context. |
Use this every time you react to a draft. Calling draft_post again creates a second, unrelated draft instead. Each call uses one AI rewrite from your monthly allowance.
attach_reference
attach_reference
Store source material (a call transcript, an article, notes) with a post. You and your reviewers can read it, but it is never published and it does not change the post or reset an approval.
| Parameter | Type | Description |
|---|---|---|
| post_idrequired | number | Post id. |
| textoptional | string | The material itself, up to 200,000 characters. Give text or url, not both. |
| urloptional | string | A link. The page is fetched in the background, and the link is kept even if that fails. |
| titleoptional | string | A label. Taken from the first line of text if left out. |
Never put source material in content. Whatever is in content gets published. A post holds up to 20 references.
suggest_hashtags
suggest_hashtags
Suggest hashtags and another opening line for a draft. Saves nothing.
| Parameter | Type | Description |
|---|---|---|
| idoptional | number | Post id. Defaults to the draft you changed last. |
Finding posts
list_drafts
list_drafts
List your posts by status, with ids, previews, platforms and schedule.
| Parameter | Type | Description |
|---|---|---|
| statusoptional | string | draft (the default), scheduled, posted or failed. |
| editorial_statusoptional | string | Filter by Content board stage. Same values as stage on update_draft. |
| limitoptional | number | How many (default 20, max 100). |
get_post
get_post
Everything about one post, including its status on each platform and its reference materials (title, link, kind, length and status, but not their text).
| Parameter | Type | Description |
|---|---|---|
| idrequired | number | Post id. |
search_posts
search_posts
Find published posts by what they say, like “my post about pricing.” Searches every post on the workspace's channels, including history imported from LinkedIn.
| Parameter | Type | Description |
|---|---|---|
| queryrequired | string | Up to 5 words. Every word must appear in the post. |
| authoroptional | string | Whose posts: me, or a teammate's name like Alex. Leave it out for the whole workspace. |
| platformoptional | string | One of twitter, bluesky, threads, facebook, instagram, mastodon, youtube, tiktok, pinterest or linkedin. |
| start_dateoptional | string (YYYY-MM-DD) | Only posts on or after this day. |
| end_dateoptional | string (YYYY-MM-DD) | Only posts on or before this day. |
| limitoptional | number | How many matches (default 10, max 25). |
list_recent_posts
| Parameter | Type | Description |
|---|---|---|
| limitoptional | number | How many (default 5, max 10). |
list_scheduled_posts
| Parameter | Type | Description |
|---|---|---|
| windowoptional | string | today, week or upcoming (the default). |
delete_post
delete_post
Permanently delete a draft by id. Can't be undone. It can't delete a post that's already published; there is no tool for that.
| Parameter | Type | Description |
|---|---|---|
| idrequired | number | Post id. |
Scheduling and publishing
schedule_post
schedule_post
Schedule a post for a set date and time on one or more platforms.
| Parameter | Type | Description |
|---|---|---|
| idrequired | number | Post id. |
| scheduled_atrequired | string (ISO 8601) | When to publish, like 2026-03-10T09:00:00Z. Must be in the future. |
| platformsoptional | array of strings | Defaults to the platforms already on the post. |
| platform_account_idsoptional | object | Which connected account each platform posts from, like { "linkedin": 42 }. Use the ids from list_connected_accounts. Only needed when a platform has more than one account; otherwise the first one is used. |
| variance_minutesoptional | number | Override the account's posting-time variance, 0 to 60. The time is shifted by up to half of it so posts don't all land on the exact minute. 0 keeps the exact time. |
queue_post
queue_post
Put a post in the next open slot of your posting queue.
| Parameter | Type | Description |
|---|---|---|
| idrequired | number | Post id. |
| platformsoptional | array of strings | Defaults to the platforms already on the post. |
| platform_account_idsoptional | object | Which connected account each platform posts from, like { "linkedin": 42 }. Use the ids from list_connected_accounts. Only needed when a platform has more than one account; otherwise the first one is used. |
| variance_minutesoptional | number | Override the account's posting-time variance, 0 to 60. The time is shifted by up to half of it so posts don't all land on the exact minute. 0 keeps the exact time. |
Returns the time each platform got. Use get_queue_slots first to see the times without queueing.
get_queue_slots
get_queue_slots
See the next open queue slot for each platform without scheduling anything.
| Parameter | Type | Description |
|---|---|---|
| platformsrequired | array of strings | Platforms to check, like ["linkedin", "twitter"]. |
cancel_post
cancel_post
Take a scheduled post off the schedule. It goes back to drafts; nothing is deleted.
| Parameter | Type | Description |
|---|---|---|
| idrequired | number | Post id. |
publish_post
publish_post
Publish a draft now. Over MCP this does not publish by itself: it returns a link where you check the post and press Publish.
| Parameter | Type | Description |
|---|---|---|
| idrequired | number | Post id. |
| platformsoptional | array of strings | Defaults to the platforms already on the draft. |
| platform_account_idsoptional | object | Which connected account each platform posts from, like { "linkedin": 42 }. Use the ids from list_connected_accounts. Only needed when a platform has more than one account; otherwise the first one is used. |
pause_queue
No parameters required.
resume_queue
resume_queue
Turn publishing back on so scheduled posts go out again.
No parameters required.
list_queue_schedule
list_queue_schedule
Show each channel's weekly posting times: every time, the days it runs, the channel's id, whether you can change it, and the time zone.
| Parameter | Type | Description |
|---|---|---|
| platformoptional | string | Only show one platform: linkedin, twitter, threads, bluesky, substack, youtube, facebook or instagram. |
Call this before add_queue_times or remove_queue_times to get the time zone and channel ids.
add_queue_times
add_queue_times
Add posting times to one channel's weekly schedule, like “add 9am on weekdays for LinkedIn.” A time that's already there stays as it is. Posts already in the queue keep their times.
| Parameter | Type | Description |
|---|---|---|
| platformrequired | string | The channel's platform: linkedin, twitter, threads, bluesky, substack, youtube, facebook or instagram. |
| timesrequired | array of strings | 24-hour times, like ["09:00", "14:30"], in the workspace's posting time zone. |
| daysrequired | array of strings | Day names (monday to sunday), or everyday, weekdays or weekends. |
| platform_account_idsoptional | object | Which channel, when the platform has more than one, like { "linkedin": 42 }. Ids come from list_queue_schedule. |
remove_queue_times
remove_queue_times
Remove posting times from one channel's weekly schedule. Posts already in the queue keep their times.
| Parameter | Type | Description |
|---|---|---|
| platformrequired | string | The channel's platform: linkedin, twitter, threads, bluesky, substack, youtube, facebook or instagram. |
| timesrequired | array of strings | 24-hour times to remove, like ["09:00"]. |
| daysoptional | array of strings | Only remove on these days. Leave it out to remove the time from every day. |
| platform_account_idsoptional | object | Which channel, when the platform has more than one. Ids come from list_queue_schedule. |
Images
upload_image
upload_image
Get an upload link for an image, video or PDF. Returns a curl command to run and an s3_key to pass in images on draft_post, save_draft or update_draft.
| Parameter | Type | Description |
|---|---|---|
| filenamerequired | string | The file's name, like photo.jpg. |
| content_typeoptional | string | File type. Worked out from the name if left out. Images (JPEG, PNG, GIF, WebP), videos (MP4, MOV, AVI, WebM, MKV) and PDFs, up to 100 MB. |
Running the curl command needs an app that can run commands, like Claude Code. In a chat app, attach the image in DemandBird instead.
generate_image
generate_image
Make an original image with AI to go with a post. Your brand style is applied for you. Takes 10 to 30 seconds, uses one monthly image credit, and saves the image to your media library.
| Parameter | Type | Description |
|---|---|---|
| promptrequired | string | What the image should show. Describe the picture, not the post. |
| styleoptional | string | photo, illustration (the default), infographic or diagram. |
| sizeoptional | string | square (1:1, the default), portrait (2:3) or landscape (3:2). |
Returns an s3_key to pass in images. See AI images.
Reviews and approvals
request_review
request_review
Send a draft to teammates for approval. Required reviewers block publishing until each one approves; optional reviewers are FYI.
| Parameter | Type | Description |
|---|---|---|
| post_idrequired | string | Id of the draft. |
| reviewersrequired | array of objects | Each reviewer needs an email, a user_id, or a name (“Alex”). An unknown or unclear name is refused, never guessed. Set required: false to make a reviewer optional. |
| noteoptional | string | A message for the reviewers. |
| scheduled_atoptional | string (ISO 8601) | Schedule it now. It publishes at this time if every required reviewer has approved. |
list_posts_awaiting_my_review
| Parameter | Type | Description |
|---|---|---|
| limitoptional | number | How many (1 to 100, default 20). |
approve_post
approve_post
Approve a post you were asked to review. Returns a link where you read the post and press Approve yourself.
| Parameter | Type | Description |
|---|---|---|
| post_idrequired | string | Id of the post. |
| noteoptional | string | A note saved with the approval. |
send_back_post
send_back_post
Send a post back to its writer with what needs to change. Returns a link where you press Send back yourself.
| Parameter | Type | Description |
|---|---|---|
| post_idrequired | string | Id of the post. |
| noterequired | string | What needs to change, in your words. The writer sees it as written. |
comment_on_post
comment_on_post
Leave a comment on a post without approving or sending it back.
| Parameter | Type | Description |
|---|---|---|
| post_idrequired | string | Id of the post. |
| commentrequired | string | The comment, in your words. |
Ideas
save_idea
save_idea
Save one or more ideas to the Ideas tab. No AI. All the ideas in one call are saved together, or none are.
| Parameter | Type | Description |
|---|---|---|
| ideasrequired | array of objects | Up to 100. Each has content (up to 5,000 characters) and optional tags and references (source material, kept out of the idea text). |
| authoroptional | string | Whose ideas these are: a teammate's name, or me. |
list_ideas
| Parameter | Type | Description |
|---|---|---|
| authoroptional | string | A teammate's name, or me. Leave it out for yours. |
| limitoptional | number | How many (default 20, max 100). |
delete_idea
delete_idea
Delete ideas by id. If any id can't be deleted, none are. Can't be undone.
| Parameter | Type | Description |
|---|---|---|
| idsrequired | array of numbers | Idea ids, up to 100. |
Brand and voice
get_brand_voice
get_brand_voice
Read the workspace's brand (positioning, audience, content pillars) and your writing voice (how you sound, phrases you use, what you avoid, recent edits).
| Parameter | Type | Description |
|---|---|---|
| platformoptional | string | Also return recent before-and-after edits for this platform. |
draft_post and revise_draft already apply your voice. This is for when Claude writes the words itself and saves them with save_draft or update_draft.
update_voice
update_voice
Change your own writing voice, the same as Settings → Voice. For example: “I never use the word synergy.”
| Parameter | Type | Description |
|---|---|---|
| editsrequired | array of objects | One per field, as { field, value } or { field, reset: true }. Each edit replaces the whole field, so send the full list you want kept. |
update_brand
update_brand
Change the active workspace's positioning and audience, the same as the Brand identity card in Settings.
| Parameter | Type | Description |
|---|---|---|
| positioningoptional | string | What the business does and stands for. Up to 2,000 characters. |
| icpoptional | string | Who the posts are for. Up to 2,000 characters. |
Analytics
These tools only read. The numbers match the Analytics tab. Reddit is not included.
get_analytics_summary
get_analytics_summary
Followers, engagements, reach and engagement rate, each with the change from the period before. Leave out platform for every network at once.
| Parameter | Type | Description |
|---|---|---|
| platformoptional | string | One of twitter, bluesky, threads, facebook, instagram, mastodon, youtube, tiktok, pinterest or linkedin. |
| periodoptional | string | 7d, 30d or 90d, ending today. Default 30d. |
| start_dateoptional | string (YYYY-MM-DD) | First day of a custom range, in your timezone. Overrides period. Up to 366 days. |
| end_dateoptional | string (YYYY-MM-DD) | Last day of a custom range, included. Defaults to today. Needs start_date. |
list_top_posts
list_top_posts
Rank posts, best or worst, across all networks or one. Returns each post's id, stats, a snippet and a link.
| Parameter | Type | Description |
|---|---|---|
| authoroptional | string | Whose posts: me, or a teammate's name like Alex. Leave it out for the whole workspace. |
| platformoptional | string | One of twitter, bluesky, threads, facebook, instagram, mastodon, youtube, tiktok, pinterest or linkedin. |
| metricoptional | string | What to rank by. Default engagement_rate. Also engagements, reach, impressions, likes, comments, shares, discussion_rate, and platform-specific ones like LinkedIn's profile_views, saves, sends and follows. A metric a platform doesn't report is refused with the list it does. |
| orderoptional | string | top (the default) or bottom. |
| limitoptional | number | How many (default 5, max 20). |
| periodoptional | string | 7d, 30d or 90d, ending today. Default 30d. |
| start_dateoptional | string (YYYY-MM-DD) | First day of a custom range, in your timezone. Overrides period. Up to 366 days. |
| end_dateoptional | string (YYYY-MM-DD) | Last day of a custom range, included. Defaults to today. Needs start_date. |
get_post_analytics
get_post_analytics
Every metric for one post, including how its reach built up over time where the platform reports it.
| Parameter | Type | Description |
|---|---|---|
| post_idoptional | number | The published post's id, from list_top_posts. |
| composition_idoptional | number | The DemandBird post id (the number in “Draft #123”). |
| latestoptional | boolean | Set true for the most recent post. Add platform to pick a network. |
| platformoptional | string | One of twitter, bluesky, threads, facebook, instagram, mastodon, youtube, tiktok, pinterest or linkedin. |
list_posts_with_metrics
list_posts_with_metrics
Every published post in a date range with all its numbers, a page at a time. Good for a full history or export.
| Parameter | Type | Description |
|---|---|---|
| authoroptional | string | Whose posts: me, or a teammate's name like Alex. Leave it out for the whole workspace. |
| platformoptional | string | One of twitter, bluesky, threads, facebook, instagram, mastodon, youtube, tiktok, pinterest or linkedin. |
| limitoptional | number | Posts per page (default 50, max 100). |
| cursoroptional | string | From the end of the last page, to get the next one. |
| periodoptional | string | 7d, 30d or 90d, ending today. Default 30d. |
| start_dateoptional | string (YYYY-MM-DD) | First day of the range, in your timezone. Overrides period. Any length. |
| end_dateoptional | string (YYYY-MM-DD) | Last day of a custom range, included. Defaults to today. Needs start_date. |
get_best_time_to_post
get_best_time_to_post
The days and hours (in your timezone) when your posts on a platform have done best.
| Parameter | Type | Description |
|---|---|---|
| platformrequired | string | One of twitter, bluesky, threads, facebook, instagram, mastodon, youtube, tiktok, pinterest or linkedin. |
| limitoptional | number | How many time slots (default 3, max 10). |
| periodoptional | string | 7d, 30d or 90d, ending today. Default 30d. |
| start_dateoptional | string (YYYY-MM-DD) | First day of a custom range, in your timezone. Overrides period. Up to 366 days. |
| end_dateoptional | string (YYYY-MM-DD) | Last day of a custom range, included. Defaults to today. Needs start_date. |
get_format_performance
get_format_performance
Rank post formats (text, image, video and so on) on a platform by engagement.
| Parameter | Type | Description |
|---|---|---|
| platformrequired | string | One of twitter, bluesky, threads, facebook, instagram, mastodon, youtube, tiktok, pinterest or linkedin. |
| periodoptional | string | 7d, 30d or 90d, ending today. Default 30d. |
| start_dateoptional | string (YYYY-MM-DD) | First day of a custom range, in your timezone. Overrides period. Up to 366 days. |
| end_dateoptional | string (YYYY-MM-DD) | Last day of a custom range, included. Defaults to today. Needs start_date. |
get_audience_demographics
get_audience_demographics
Who your followers are. Instagram and Threads report country, age, gender and city. LinkedIn company pages report seniority, job function, industry, company size and location. Other platforms, and LinkedIn personal profiles, don't share this.
| Parameter | Type | Description |
|---|---|---|
| platformrequired | string | One of twitter, bluesky, threads, facebook, instagram, mastodon, youtube, tiktok, pinterest or linkedin. |
| periodoptional | string | 7d, 30d or 90d, ending today. Default 30d. |
| start_dateoptional | string (YYYY-MM-DD) | First day of a custom range, in your timezone. Overrides period. Up to 366 days. |
| end_dateoptional | string (YYYY-MM-DD) | Last day of a custom range, included. Defaults to today. Needs start_date. |
get_follower_history
get_follower_history
LinkedIn follower count for each day, for a profile or company page. The same numbers as the follower growth chart.
| Parameter | Type | Description |
|---|---|---|
| accountoptional | string | Which LinkedIn profile or page, by name or id. Leave it out for all of them. |
| periodoptional | string | 7d, 30d or 90d, ending today. Default 30d. |
| start_dateoptional | string (YYYY-MM-DD) | First day of a custom range, in your timezone. Overrides period. Up to 366 days. |
| end_dateoptional | string (YYYY-MM-DD) | Last day of a custom range, included. Defaults to today. Needs start_date. |
tag_published_post
tag_published_post
Set the tags on a post that's already published, including posts made outside DemandBird.
| Parameter | Type | Description |
|---|---|---|
| post_idrequired | number | The published post's id, from list_top_posts or search_posts. |
| tagsrequired | array of strings | Replaces the post's tags; [] removes them all. |
Team
Account admins only.
list_members
list_members
Everyone on the account, pending invites, and how many seats are left.
No parameters required.
invite_member
invite_member
Invite people to the account. Returns a link where you check each person and role and press Send yourself.
| Parameter | Type | Description |
|---|---|---|
| invitesrequired | array of objects | Each has name, email and role (admin, member, read_only, ghostwriter or client), plus optional workspace_roles. |