Install
openclaw skills install @usama-gh/contentdripsAutomate your social media graphics and carousels. Publish them directly to LinkedIn, Instagram and Tiktok using Contentdrips. Use AI Design agent to create AI designs in your style, or use any existing carousel or graphic. There are also repurposing tools like topic/youtube/blog link to graphics.
openclaw skills install @usama-gh/contentdripsContentDrips MCP connects your agent to ContentDrips — create designs, generate AI carousels/graphics, run the AI Design Agent, manage posts, and publish to LinkedIn and Instagram through conversation.
MCP URL: https://mcp.contentdrips.com/mcp
Triggers: contentdrips, carousel, graphic, design, template, social post, LinkedIn, Instagram, schedule post, publish post, AI design agent, my designs, my templates, template categories
Export your key, then register the server. Use your actual key in the header (single-quoted JSON does not expand shell variables):
export CONTENTDRIPS_API_KEY=your_api_key_here
openclaw mcp set contentdrips "{
\"type\": \"streamable-http\",
\"url\": \"https://mcp.contentdrips.com/mcp\",
\"headers\": { \"Authorization\": \"Bearer $CONTENTDRIPS_API_KEY\" }
}"
Or paste the key directly: "Authorization": "Bearer cd_xxxx..."
openclaw mcp list
You should see contentdrips with status active. All tools below are then available via MCP.
Copy this folder into your OpenClaw workspace:
mkdir -p ~/.openclaw/workspace/skills/contentdrips
cp -r /path/to/contentdrips-mcp/skills/contentdrips/* ~/.openclaw/workspace/skills/contentdrips/
| Resource | URL pattern |
|---|---|
| Edit design | https://app.contentdrips.com/canvas?template={TEMPLATE_ID} |
| Edit post | https://app.contentdrips.com/make-post?id={POST_UUID} |
| Connect social accounts | https://app.contentdrips.com/social-accounts |
Always share these links with the user after creating a design or post.
get_profiles before create_graphic, create_post, generate_*, render_template, schedule, or publish. If 2+ workspaces, ASK which. Always pass profile_id. Never tell the user you lack a profile_id — fetch it.get_profiles → create_graphic(profile_id) → get_brand_styles (if 2+ ASK which) → run_ai_design_agent (pass reference_image if they uploaded a picture) → share the editor link and STOP.get_template → get_template_structure → generate_ai_carousel / generate_ai_graphic → check_job_status.delete_graphic or delete_post.linkedin_publish=true, instagram_publish=false. Instagram-only → opposite. Ask if unclear.edit_url only. Call render_template → check_job_status only if they ask to preview, download PNG/PDF, attach to a post, or publish. Never say export is unavailable.get_brand_styles before every run_ai_design_agent. If 2+ saved styles, ASK which to use (or none) — never auto-pick. If exactly 1, use it unless they declined. If Pro is available (can_use_pro_model), ASK Basic vs Pro (default Basic). Pass style_id and model.run_ai_design_agent as reference_image (https URL preferred, or data URI). Claude typically cannot pass chat images to MCP.set_post_images with export_urls from check_job_statusupload_images_to_post with image_urls (prefer URLs over base64; base64 fails above ~4 MB)get_social_accounts for the profile. If the requested platform is not connected, tell the user to connect at the social-accounts URL above. Do not publish to a different connected platform as a substitute.create_graphic with format: "custom", width, and height (100–3000 px). Do not fall back to a preset.| Tool | Use when |
|---|---|
get_template_categories | List public template categories (carousel, quote, LinkedIn, etc.) |
search_templates | Browse/search public templates by category and/or query keyword |
get_my_templates | List user's designs when they ask to show/pick; never auto-pick for creation |
get_template | Look up one design by ID or name (markdown details + editor link) |
get_template_structure | Required before AI maker or manual JSON fill (generate_carousel / generate_graphic) |
create_graphic | New blank design — first step when creating without a template ID |
delete_graphic | Permanently delete a design |
create_graphic formats:
| Format | Dimensions |
|---|---|
square | 1080 × 1080 |
portrait | 1080 × 1350 |
tiktok | 1080 × 1920 |
landscape | 1920 × 1080 |
custom | any width × height (100–3000 px each) |
For custom, always pass format: "custom" plus both width and height. Carousels: set slides (default 3).
| Tool | Use when |
|---|---|
get_brand_styles | Required before run_ai_design_agent — list saved styles + Pro eligibility; ask if 2+ styles or Pro is available |
run_ai_design_agent | New blank layout, or override existing design (ask + warn first). Pass style_id and model. |
generate_ai_carousel | Template ID + new topic/URL — keep carousel layout (after get_template_structure) |
generate_ai_graphic | Template ID + new topic/URL — keep graphic layout (after get_template_structure) |
generate_carousel | Template ID + manual/LLM carousel_content JSON (after get_template_structure) |
generate_graphic | Template ID + manual/LLM content_update array (after get_template_structure) |
render_template | Export current design as PNG/PDF by template_id (after Design Agent or any saved design) |
check_job_status | Poll render job → get export_url(s) |
| Tool | Use when |
|---|---|
get_profiles | List workspaces (profiles) |
get_social_accounts | LinkedIn/Instagram connected for a profile |
| Tool | Use when |
|---|---|
list_posts | List by status: draft, scheduled, published, etc. |
get_post | Single post details |
create_post | New draft with caption |
update_post | Edit caption or platform flags |
delete_post | Delete post |
| Tool | Use when |
|---|---|
set_post_images | Attach ContentDrips export_urls to a post |
upload_images_to_post | Upload external images (URLs or base64) |
remove_images_from_post | Remove all images from a post |
| Tool | Use when |
|---|---|
schedule_post | Schedule for future (timezone + platforms) |
unschedule_post | Move scheduled post back to draft |
publish_post | Publish now (requires user confirmation) |
get_template_categories() → carousel, quote, LinkedIn, etc.
search_templates(category="carousel") → browse a category
search_templates(query="motivational") → keyword search
search_templates(category="quote", query="sale") → combine both
get_template(template_id) → details + editor link
No template yet?
Ask: A) AI Design Agent on NEW blank, OR B) Choose existing template (name/ID)?
Has / chose a template ID?
Ask explicitly:
1) AI Design Agent — OVERRIDES existing design with a new AI layout, OR
2) AI carousel/graphic maker — KEEP layout, fill topic/URL/YouTube/TikTok (recommend for content-fill)
── Path A (Design Agent — no template ID/name) ──
get_profiles → create_graphic(profile_id) → get_brand_styles (ASK if 2+ styles; ask Pro if available)
→ run_ai_design_agent(style_id?, model, reference_image if uploaded) → share edit_url (STOP)
→ render_template only if they ask to preview/download
── Path B maker (template ID or name) ──
get_template → get_template_structure
generate_ai_carousel OR generate_ai_graphic (method=topic|blog|youtube|tiktok_reel)
check_job_status → export_url(s)
── Path B Design Agent (only if they explicitly asked to override/recreate) ──
get_brand_styles → run_ai_design_agent(template_id, style_id?, model, reference_image?) → share edit_url
── Path B manual JSON (full control) ──
get_template → get_template_structure
generate_carousel(carousel_content) OR generate_graphic(content_update)
check_job_status
carousel_content / content_update)Labels/element keys must match get_template_structure. Do not use the legacy carousel key.
generate_carousel with carousel_content. Full example: examples/carousel_content.jsongenerate_graphic with content_update. Full example: examples/content_update.jsonCarousel elements use { "type": "text"|"image", "value": "..." }. Graphic items use { "type": "textbox"|"image"|"shape", "label": "...", ... }.
check_job_status → export_urls
create_post(caption, profile_id) → uuid
set_post_images(uuid, export_urls)
get_social_accounts(profile_id)
# LinkedIn only:
publish_post(..., linkedin_publish=true, instagram_publish=false)
# Instagram only:
publish_post(..., linkedin_publish=false, instagram_publish=true)
Ask: "Publish to LinkedIn only?" / "Publish to Instagram only?" — name platforms
get_template_structure → generate_ai_*generate_ai_carousellinkedin_publish=true, instagram_publish=falselinkedin_publish=false, instagram_publish=trueCONTENTDRIPS_MCP_OVERVIEW.md in the contentdrips-mcp repo.