MCP Server

DemandBird for Claude

Connect DemandBird to Claude Desktop or Claude Code and manage your social posts with plain English — no API calls needed.

← Also available: REST API Reference

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.

MCP is available in Claude Desktop and Claude Code. Make sure you're running a recent version of either app before starting.

Installation

  1. Clone the DemandBird repository
    You need a local copy of the MCP server code.
    git clone https://github.com/demandbird/demandbird.git ~/demandbird
    cd ~/demandbird/mcp
  2. Install dependencies and build
    Requires Node.js 18+.
    npm install
    npm run build
    This produces the runnable server at dist/index.js.
  3. Get your API token and account ID
    In DemandBird, go to Settings → API Tokens to create a token. Your account ID is shown in account settings.
  4. Configure your Claude app
    Follow the Claude Desktop or Claude Code instructions below.

Configuration

The MCP server reads credentials from three environment variables:

VariableRequiredDescription
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.

On Windows, the config path is %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:

You Write a LinkedIn post about our new feature launch and save it as a draft.
Claude I'll generate a LinkedIn post in your voice and save it as a draft... [uses draft_post]

Done! Draft saved (post #124). Here's what I wrote: "We just shipped something that's been..."
You Show me my current drafts.
Claude [uses list_drafts]

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..."
You Schedule post 124 for LinkedIn at 9am tomorrow.
Claude [uses schedule_post]

Post #124 scheduled for 2026-03-03T09:00:00Z on LinkedIn.
You Add post 121 to the queue for Twitter and Threads.
Claude [uses queue_post]

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

draft_post
Generate an AI-written social post using your writing style and voice, then save it as a draft. Uses your stored comments and posts to match your tone.
ParameterTypeDescription
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

save_draft
Save a piece of content you've written as a draft — no AI generation involved.
ParameterTypeDescription
contentrequired string The post text to save.
platformsoptional array of strings Target platforms. Same values as draft_post.

list_drafts

list_drafts
List your posts filtered by status. Returns post IDs, content previews, platforms, and schedule info.
ParameterTypeDescription
statusoptional string One of: draft, scheduled, posted, failed. Defaults to draft.
limitoptional number Max posts to return (default 20, max 100).

get_post

get_post
Fetch full details of a specific post by ID, including all schedule statuses per platform.
ParameterTypeDescription
idrequired number Post ID.

delete_post

delete_post
Permanently delete a draft post by ID. Cannot be undone.
ParameterTypeDescription
idrequired number Post ID to delete.

schedule_post

schedule_post
Schedule a draft for a specific date and time on one or more platforms.
ParameterTypeDescription
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

queue_post
Add a post to the next available time slot in your posting queue. Uses the schedule you've configured in DemandBird.
ParameterTypeDescription
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

get_queue_slots
Check the next available queue slot for one or more platforms without scheduling anything.
ParameterTypeDescription
platformsrequired array of strings Platforms to check. E.g., ["linkedin", "twitter"].