Connect Claude Code or any MCP client to manage your Bullhorn content with AI.
Go to Settings → API Keys in the Bullhorn app and create a new key.
Copy the key immediately — it won't be shown again.
Open SettingsAdd this to your .mcp.json file in your project root:
{
"mcpServers": {
"bullhorn": {
"command": "npx",
"args": ["-y", "@mean-weasel/bullhorn-mcp"],
"env": {
"BULLHORN_API_URL": "https://bullhorn.to"
}
}
}
}Note: Set BULLHORN_API_KEY in your shell environment or .env file. The MCP server reads it automatically at startup.
Ask Claude to list your posts, create a campaign, or draft a blog post. The MCP server handles authentication and API calls automatically.
46 tools across 6 categories. Each tool maps to a Bullhorn API endpoint.
| Tool | Description |
|---|---|
create_post | Create a new social media post for a single platform |
get_post | Get a single post by ID |
update_post | Update an existing post |
delete_post | Permanently delete a post |
archive_post | Archive a post (soft delete, can be restored) |
restore_post | Restore an archived post back to draft |
list_posts | List posts with optional status, platform, and campaign filters |
search_posts | Search posts by content, notes, platform, or campaign name |
create_reddit_crossposts | Create multiple Reddit posts to different subreddits with a shared group |
| Tool | Description |
|---|---|
create_campaign | Create a new campaign to organize related posts |
get_campaign | Get a campaign by ID, including associated posts |
update_campaign | Update a campaign name, description, or status |
delete_campaign | Delete a campaign (posts become unlinked, not deleted) |
list_campaigns | List campaigns with optional status filter |
add_post_to_campaign | Link an existing post to a campaign |
remove_post_from_campaign | Unlink a post from a campaign (does not delete) |
| Tool | Description |
|---|---|
create_project | Create a project with optional brand kit (hashtags, colors, logo) |
get_project | Get a project by ID, including brand kit and settings |
update_project | Update project name, description, or brand kit |
delete_project | Delete a project (campaigns become unassigned) |
list_projects | List all projects with optional pagination |
get_project_campaigns | Get a project with all its campaigns |
get_project_analytics | Get rolled-up analytics (campaign count, post counts by status) |
add_account_to_project | Associate a social account with a project |
remove_account_from_project | Remove a social account association from a project |
get_project_accounts | Get all social accounts linked to a project |
move_campaign_to_project | Move a campaign to a different project or make it unassigned |
list_campaigns_by_project | List campaigns filtered by project or unassigned |
| Tool | Description |
|---|---|
create_blog_draft | Create a new blog post draft with markdown content |
get_blog_draft | Get a blog draft by ID with full content |
update_blog_draft | Update title, content, date, notes, or status |
delete_blog_draft | Permanently delete a blog draft |
archive_blog_draft | Archive a blog draft (can be restored) |
restore_blog_draft | Restore an archived blog draft |
list_blog_drafts | List blog drafts with optional status and campaign filters |
search_blog_drafts | Search blog drafts by content, title, or notes |
add_image_to_draft | Copy an image to blog media and attach it to a draft |
get_draft_images | Get list of images attached to a blog draft |
| Tool | Description |
|---|---|
upload_media | Upload an image or video file (JPG, PNG, GIF, WebP, MP4, MOV, WebM) |
list_media | List all uploaded media files with filename, URL, size, and mimetype |
delete_media | Delete an uploaded media file by filename |
| Tool | Description |
|---|---|
create_launch_post | Create a launch post for Product Hunt, Hacker News, or other platforms |
get_launch_post | Get a single launch post by ID |
update_launch_post | Update an existing launch post |
delete_launch_post | Delete a launch post |
list_launch_posts | List launch posts with optional platform and status filters |
Configure the MCP server with these environment variables.
| Variable | Required | Description |
|---|---|---|
BULLHORN_API_KEY | Required | Your API key from Settings → API Keys |
BULLHORN_API_URL | Optional | API base URL. Defaults to https://bullhorn.to |
API requests are rate-limited to 10 requests per 10 seconds per API key using a sliding window algorithm. If exceeded, requests return HTTP 429 with a Retry-After header.
Resource creation is subject to plan limits. When a limit is reached, creation tools return an error with the current usage.
| Resource | Free Plan | Pro Plan |
|---|---|---|
| Posts | 50 | 500 |
| Campaigns | 5 | 50 |
| Projects | 3 | 20 |
| Blog Drafts | 10 | 100 |
| Launch Posts | 10 | 100 |
| Storage | 50 MB | 2 GB |
Example tool calls showing the JSON arguments for common operations.
{
"tool": "create_post",
"arguments": {
"platform": "twitter",
"content": { "text": "Launching our new feature today!" },
"status": "draft"
}
}{
"tool": "create_post",
"arguments": {
"platform": "linkedin",
"content": {
"text": "Excited to announce our Series A funding!",
"visibility": "public"
},
"status": "scheduled",
"scheduledAt": "2026-03-01T09:00:00Z"
}
}{
"tool": "create_post",
"arguments": {
"platform": "reddit",
"content": {
"subreddit": "SideProject",
"title": "Show r/SideProject: I built a social media scheduler",
"body": "After 6 months of development..."
},
"status": "draft"
}
}{
"tool": "create_reddit_crossposts",
"arguments": {
"subreddits": ["SideProject", "startups", "webdev"],
"title": "Show: I built Bullhorn",
"body": "A social media post scheduler...",
"status": "draft"
}
}Create an account, grab an API key, and start managing your content with AI.
Get started free