Skip to content
Content Rabbit

Overview

The Content Rabbit MCP server exposes your workspace 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 workspace 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 messages
  • DELETE /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 workspace, profile, and platform terms.

API keys are workspace-scoped. A key can only read or mutate data in the workspace it was issued for. Rotate keys regularly and delete unused keys immediately.

Endpoint

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

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 workspace and plan.

Getting an API key

  1. Open Settings > Workspaces.
  2. Choose the workspace you want to automate.
  3. Go to the API & Integrations tab and press Generate API key.
  4. 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-workspace rate limit as the public REST API. Inspect response headers to track usage:

HeaderDescription
X-RateLimit-LimitMaximum requests allowed per window
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetUnix 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"
      }
    }
  }
}

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 16 tools. A 401 means the key is missing, revoked, or pasted with extra whitespace.

Available tools

All 16 tools are registered by createMcpServer and scoped to the caller's workspace. Only these tools exist — the server exposes no other names.

ToolWhat it doesKey parameters
list_postsList posts in this workspace, newest first. Supports cursor pagination and optional filters.status (post status enum), platform (e.g. twitter, linkedin), search (title search, max 200), limit (1–100, default 25), cursor (post id)
get_postGet a single post by id, including platform settings and publish results.id (required)
create_postCreate a post. Draft by default; scheduled when scheduledAt is set. Content is stored in the platform-specific settings the publish handlers read.platformType (required, e.g. twitter), content (max 100,000), title (max 500), tags (up to 50, each max 100), category (max 200), scheduledAt (ISO datetime)
update_postUpdate a post's title, content, tags, category, or status. When content is given it replaces the platform-specific content for the post's platform.id (required), title (max 500, nullable), content (max 100,000), tags (up to 50), category (max 200, nullable), status (post status enum)
delete_postDelete a post permanently.id (required)
schedule_postSchedule a draft post for a future time, optionally overriding the selected platforms.id (required), scheduledAt (required, ISO datetime), selectedPlatforms (string array)
unschedule_postMove a scheduled post back to draft and clear its schedule.id (required)
publish_postPublish a draft or scheduled post to its connected social accounts now. Reuses the product publish pipeline including per-platform rate limits. This posts to real external accounts.id (required), platforms (string array override), firstComment (max 3,000, LinkedIn)
generate_textGenerate 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_hashtagsGenerate 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)
list_imagesList images owned by the API key's user, newest first.search (max 200, over title/description/alt text), limit (1–100, default 25)
list_videosList videos owned by the API key's user, newest first.search (max 200, over title/description), limit (1–100, default 25)
get_calendarGet scheduled and published posts grouped by day for a date range.start (required, ISO datetime), end (required, ISO datetime), timezone (IANA, max 80, default UTC), statuses (array of scheduled, publishing, published, error)
get_activityGet the team's post activity feed for a date range (created/scheduled/published events).start (required, ISO datetime), end (required, ISO datetime), timezone (default UTC), limit (1–100, default 50), cursor
get_post_analyticsGet a summary of post counts by status and platform for a date range.start (required, ISO datetime), end (required, ISO datetime), timezone (default UTC)
list_accountsList the social accounts connected to this workspace.platform (max 40, e.g. twitter, linkedin)

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.

Was this helpful?