Overview
The Content Rabbit MCP server exposes your team through the Model Context Protocol. An AI assistant that speaks MCP can list and manage posts, schedule and publish content, generate text and hashtags, and read analytics — all scoped to the team that owns the API key.
The server uses Streamable HTTP transport in stateless mode:
POST /api/v1/mcp— JSON-RPC messages (initialize,tools/list,tools/call, …)GET /api/v1/mcp— Server-Sent Events stream for server-initiated messagesDELETE /api/v1/mcp— Close the session
Every tool call runs under the same tenant scope and authorization checks as the public REST API. See the Content Rabbit API for REST equivalents and the Terminology glossary for team and platform terms.
API keys are team-scoped. A key can only read or mutate data in the team it was issued for. Rotate keys regularly and delete unused keys immediately.
Endpoint
https://<your-domain>/api/v1/mcp
https://<your-domain>/api/v1/mcp
In production this is https://contentrabbitai.com/api/v1/mcp. The server handles MCP over Streamable HTTP with enableJsonResponse: true and no server-persisted session.
Authentication
All requests must include a Bearer API key:
Authorization: Bearer YOUR_API_KEY
Authorization: Bearer YOUR_API_KEY
The server authenticates with the same Authorization: Bearer <key> mechanism as the public REST API, and rejects a missing or invalid key with 401 Unauthorized. Your API key scopes every tool call to its team and plan.
Getting an API key
- Open Settings > Team.
- Choose the team you want to automate.
- Go to the API & Integrations tab and press Generate API key.
- Copy the value immediately — you can always rotate to get a fresh key.
Sandbox keys (metadata.sandbox === true) simulate mutating tools and never write to the database or call external services. Read tools run normally against the sandbox team's data.
Rate limiting
The MCP endpoint shares the same plan-tiered, per-team rate limit as the public REST API. Inspect response headers to track usage:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests allowed per window |
X-RateLimit-Remaining | Requests remaining in current window |
X-RateLimit-Reset | Unix timestamp when the window resets |
Exceeding limits returns 429 Too Many Requests. Retry with exponential backoff.
Connect an MCP client
Any MCP client that supports Streamable HTTP works. Configure the server URL plus an Authorization header with your API key. The shape varies by client — the fields below are the portable part:
{
"mcpServers": {
"content-rabbit": {
"url": "https://contentrabbitai.com/api/v1/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
{
"mcpServers": {
"content-rabbit": {
"url": "https://contentrabbitai.com/api/v1/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
For clients that split transport options, use:
- Transport:
http/streamable-http - URL:
https://contentrabbitai.com/api/v1/mcp - Header:
Authorization: Bearer YOUR_API_KEY
Test the connection by listing tools (tools/list) — you should see 39 tools. A 401 means the key is missing, revoked, or pasted with extra whitespace.
Available tools
Both MCP servers — this hosted server and the stdio npm package @contentrabbit/mcp-server — mount one shared tool registry, so the same 39 tools exist on both. All tools are scoped to the caller's team. Only these tools exist — the server exposes no other names.
Posts
| Tool | What it does | Key parameters |
|---|---|---|
posts_list | List posts with optional filtering by status, platform, or search query. | status (draft, scheduled, published, error), platform (e.g. twitter, linkedin), search (title search, max 200), limit (1–100), page, sortBy (createdAt, updatedAt, scheduledAt), sortOrder (asc, desc) |
posts_get | Get a single post by id, including platform settings and publish results. | postId (required) |
posts_create | Create a post. Draft by default; scheduled when scheduledAt is set. | platformType (required, e.g. twitter), content (max 100,000, nullable), title (max 500, nullable), status (draft or scheduled), scheduledAt (ISO datetime), tags (up to 50, each max 100), category (max 200) |
posts_update | Update a post's content, title, status, schedule, or tags. | postId (required), content (max 100,000, nullable), title (max 500, nullable), status (post status enum), scheduledAt (ISO datetime, nullable to clear), tags (up to 50) |
posts_delete | Delete a post permanently. | postId (required) |
posts_schedule | Schedule a post for future publishing, optionally overriding the selected platforms. | postId (required), scheduledAt (required, ISO datetime), selectedPlatforms (string array) |
posts_unschedule | Remove the schedule from a post, reverting it to draft. | postId (required) |
posts_publish | Publish a draft or scheduled post to its connected social accounts now. This posts to real external accounts. | postId (required), platforms (string array override), firstComment (max 3,000, supported on some platforms) |
posts_retry | Retry publishing a failed or partially-failed post. | postId (required) |
posts_status | Get the publish status of a post including per-platform results. | postId (required) |
Teams
| Tool | What it does | Key parameters |
|---|---|---|
teams_list | List all teams accessible with the current API key. | none |
teams_create | Create a new team. | name (required) |
teams_get | Get a specific team by ID. | teamId (required) |
teams_update | Update a team's name or avatar. | teamId (required), name, avatarUrl (nullable to clear) |
teams_delete | Delete a team (only the owner can do this). | teamId (required) |
Accounts
| Tool | What it does | Key parameters |
|---|---|---|
accounts_list | List connected social media accounts with optional platform filter. | platform (max 40, e.g. twitter, linkedin) |
accounts_get | Get details of a specific connected account. | accountId (required) |
accounts_health | Check the health and token status of a connected account. | accountId (required) |
accounts_disconnect | Disconnect a social media account from the team (owner only). | accountId (required) |
Queue
| Tool | What it does | Key parameters |
|---|---|---|
queue_list_slots | List all schedule slots configured for the team. | none |
queue_create_slot | Create a new schedule slot for automated posting. | day (required, day of week), time (required, HH:MM) |
queue_update_slot | Update an existing schedule slot. | slotId (required), day, time |
queue_delete_slot | Delete a schedule slot. | slotId (required) |
queue_next_slot | Get the next available schedule slot for posting. | none |
Webhooks
| Tool | What it does | Key parameters |
|---|---|---|
webhooks_list | List all webhook subscriptions for the team. | none |
webhooks_create | Create a new webhook subscription. | targetUrl (required, URL), eventTypes (string array), description |
webhooks_get | Get a specific webhook subscription by ID. | webhookId (required) |
webhooks_delete | Delete a webhook subscription. | webhookId (required) |
webhooks_test | Send a test event to a webhook endpoint to verify it works. | webhookId (required) |
Utility
| Tool | What it does | Key parameters |
|---|---|---|
usage_stats | Get usage statistics for the team (posts this month, connected accounts, etc.). | none |
validate_post | Validate post content against platform character limits. | content (required), platforms (required string array) |
validate_media | Validate media file requirements for specific platforms. | mediaType (required, image or video), platforms (required string array), fileSize (bytes), mimeType |
Generate
| Tool | What it does | Key parameters |
|---|---|---|
generate_text | Generate text content with an AI model (e.g. a post draft, caption, or idea). | prompt (required, 1–50,000), system (max 10,000), model (e.g. google/gemini-3.1-pro-preview or openai/gpt-4o, max 200; default google/gemini-3.1-pro-preview) |
generate_hashtags | Generate hashtags for a piece of content, tuned to a platform. | content (required, 1–50,000), platform (general | linkedin | twitter, default general), count (1–50, default 10) |
Media
| Tool | What it does | Key parameters |
|---|---|---|
media_list_images | List images owned by this account, newest first. | search (max 200, over title/description/alt text), limit (1–100, default 25) |
media_list_videos | List videos owned by this account, newest first. | search (max 200, over title/description), limit (1–100, default 25) |
Analytics
| Tool | What it does | Key parameters |
|---|---|---|
analytics_get_calendar | Get scheduled and published posts grouped by day for a date range. | start (ISO datetime), end (ISO datetime), timezone (IANA, max 80), statuses (array of scheduled, publishing, published, error) |
analytics_get_activity | Get the team's post activity feed for a date range (created/scheduled/published events). Cursor-paginated. | start (ISO datetime), end (ISO datetime), timezone, limit (1–100, default 50), cursor |
analytics_get_posts | Get a summary of post counts by status and platform for a date range. | start (ISO datetime), end (ISO datetime), timezone |
Tool responses are JSON text payloads. Mutating tools called with a sandbox key return a simulated success with sandbox: true and a synthetic id (<prefix>_sandbox_<uuid>) without touching the database or external accounts.
Related articles
- Content Rabbit API — REST base URL, pagination, error format, and quick-start examples.
- Terminology — Team and platform definitions.
- Connecting Social Accounts — Connect and reconnect the accounts that
posts_publishtargets.