What is MCP?
The Model Context Protocol (MCP) lets Claude connect to external tools and services. With the DemandBird MCP server installed, Claude can read your drafts, generate AI-written posts in your voice, schedule content, and manage your queue — all through natural conversation.
Installation
-
Clone the DemandBird repositoryYou need a local copy of the MCP server code.
git clone https://github.com/demandbird/demandbird.git ~/demandbird cd ~/demandbird/mcp -
Install dependencies and buildRequires Node.js 18+.
npm install npm run buildThis produces the runnable server atdist/index.js. -
Get your API token and account IDIn DemandBird, go to Settings → API Tokens to create a token. Your account ID is shown in account settings.
-
Configure your Claude appFollow the Claude Desktop or Claude Code instructions below.
Configuration
The MCP server reads credentials from three environment variables:
| Variable | Required | Description |
|---|---|---|
| DEMANDBIRD_API_TOKEN | required | Your API token from Settings → API Tokens. |
| DEMANDBIRD_ACCOUNT_ID | required | Your numeric account ID from account settings. |
| DEMANDBIRD_API_URL | optional | Defaults to https://app.demandbird.com. Override for self-hosted installs. |
Claude Desktop
Open (or create) ~/Library/Application Support/Claude/claude_desktop_config.json
and add the demandbird server under mcpServers:
{
"mcpServers": {
"demandbird": {
"command": "node",
"args": ["/Users/YOUR_USERNAME/demandbird/mcp/dist/index.js"],
"type": "stdio",
"env": {
"DEMANDBIRD_API_TOKEN": "your-token-here",
"DEMANDBIRD_ACCOUNT_ID": "your-account-id"
}
}
}
}
Restart Claude Desktop after saving. You should see a DemandBird tool indicator in the toolbar when starting a new conversation.
%APPDATA%\Claude\claude_desktop_config.json. Use forward slashes or escaped backslashes in the args path.
Claude Code
Add the server to ~/.claude/mcp.json (create the file if it doesn't exist):
{
"mcpServers": {
"demandbird": {
"command": "node",
"args": ["/Users/YOUR_USERNAME/demandbird/mcp/dist/index.js"],
"type": "stdio",
"env": {
"DEMANDBIRD_API_TOKEN": "your-token-here",
"DEMANDBIRD_ACCOUNT_ID": "your-account-id"
}
}
}
}
Or install via the CLI:
claude mcp add demandbird \
--command "node /Users/YOUR_USERNAME/demandbird/mcp/dist/index.js" \
--env DEMANDBIRD_API_TOKEN=your-token \
--env DEMANDBIRD_ACCOUNT_ID=your-account-id
Restart Claude Code (or open a new session) for the server to be picked up.
Example prompts
Once connected, you can talk to DemandBird in plain English:
Done! Draft saved (post #124). Here's what I wrote: "We just shipped something that's been..."
You have 3 drafts:
• Post #124 — LinkedIn: "We just shipped something..."
• Post #121 — Twitter, Threads: "The one thing I wish I knew..."
• Post #118 — LinkedIn: "Hot take on AI in marketing..."
Post #124 scheduled for 2026-03-03T09:00:00Z on LinkedIn.
Post #121 queued on Twitter and Threads.
Scheduled times:
• twitter: 2026-03-03T08:00:00Z
• threads: 2026-03-03T10:00:00Z
Tool reference
draft_post
| Parameter | Type | Description |
|---|---|---|
| promptrequired | string | What to write about. E.g., "a post about launching my new SaaS product" |
| platformoptional | string | Target platform: linkedin, twitter, threads, bluesky, substack, reddit. Influences tone and length. |
save_draft
| Parameter | Type | Description |
|---|---|---|
| contentrequired | string | The post text to save. |
| platformsoptional | array of strings | Target platforms. Same values as draft_post. |
list_drafts
| Parameter | Type | Description |
|---|---|---|
| statusoptional | string | One of: draft, scheduled, posted, failed. Defaults to draft. |
| limitoptional | number | Max posts to return (default 20, max 100). |
get_post
| Parameter | Type | Description |
|---|---|---|
| idrequired | number | Post ID. |
delete_post
| Parameter | Type | Description |
|---|---|---|
| idrequired | number | Post ID to delete. |
schedule_post
| Parameter | Type | Description |
|---|---|---|
| idrequired | number | Post ID to schedule. |
| scheduled_atrequired | string (ISO 8601) | When to publish. E.g., 2026-03-10T09:00:00Z. Must be in the future. |
| platformsoptional | array of strings | Platforms to schedule on. If omitted, uses platforms already set on the post. |
queue_post
| Parameter | Type | Description |
|---|---|---|
| idrequired | number | Post ID to queue. |
| platformsoptional | array of strings | Platforms to queue for. If omitted, uses platforms already set on the post. |
Returns the exact scheduled time for each platform based on your posting queue. Use get_queue_slots first if you want to see available times before queueing.
get_queue_slots
| Parameter | Type | Description |
|---|---|---|
| platformsrequired | array of strings | Platforms to check. E.g., ["linkedin", "twitter"]. |