check_job_status
ChatGPTPoll a render job and get export_url(s) (PNG/PDF download links) when complete. Use after render_template, generate_ai_carousel, generate_ai_graphic, generate_carousel, generate_graphic, or edit_template.
create_graphic
ChatGPTCreate a new blank design (graphic, carousel, quote) in the user's ContentDrips account. Use when the user did NOT give an existing template/design ID or name. REQUIRED first: call get_profiles. If 2+ workspaces, ASK which one. ALWAYS pass profile_id — never omit it. Then get_brand_styles (if 2+ styles ASK which; if 1 use it unless declined; ask Pro if available) then run_ai_design_agent. If they uploaded a reference image, pass it to run_ai_design_agent as reference_image. After Design Agent: share the editor link. Do NOT call render_template unless they ask to preview/download. Do NOT substitute an existing template from get_my_templates/search_templates. Infer type/format/slides when clear (e.g. infographic → type=graphic; 3 slides → type=carousel). Custom sizes: format='custom' plus width + height (100–3000 px). Do NOT fall back to a preset.
create_post
ChatGPTCreate a new draft post with a caption and optional images. REQUIRED: call get_profiles first and ALWAYS pass profile_id — scheduling/publishing will fail without it. Do not say you lack profile_id; fetch it with get_profiles. For ContentDrips PNG exports, prefer create_post then set_post_images with export_urls (only after the user asked to post).
delete_graphic
ChatGPTPermanently delete a design/graphic/template from the user's ContentDrips account. Removes the canvas JSON and thumbnail from S3 and cleans up all related records. Ask the user to confirm before calling this — deletion cannot be undone.
delete_post
ChatGPTDelete a post
edit_template
ChatGPTSurgically edit an EXISTING template/design/graphic/carousel and SAVE it. Use for 'make headings a bit bigger', 'change this image URL', 'change text color to #…', or small text tweaks. KEEPS every object — does NOT redesign. Do NOT use run_ai_design_agent for these edits. REQUIRED: get_profiles then get_template_structure. Build content_update from exact labels. value is optional for style-only patches (fontSize, fontColor, fill, opacity). Relative size: 'a bit bigger' ≈ current fontSize * 1.15. Optional slide (0-based, or 'intro'/'ending') targets one carousel slide; omit to change all matching labels. Starts a job that saves the canvas. Share edit_url when done. Do NOT auto-render unless they ask to preview.
generate_ai_carousel
ChatGPTAI carousel maker: fill an EXISTING carousel template (user gave ID or name) with new topic/blog/YouTube/TikTok while KEEPING the layout. If they only gave a name, call get_template first. Do NOT use when they gave no template/design — that is create_graphic + run_ai_design_agent. REQUIRES template_id and profile_id from get_profiles. This starts a render job. Order: get_template → get_template_structure → this tool → check_job_status. Never auto-pick a template.
generate_ai_graphic
ChatGPTAI graphic maker: fill an EXISTING graphic/quote/infographic template (user gave ID or name) with new topic/blog/YouTube/TikTok while KEEPING the layout. If they only gave a name, call get_template first. Do NOT use when they gave no template/design — that is create_graphic + run_ai_design_agent. REQUIRES template_id and profile_id from get_profiles. This starts a render job. Order: get_template → get_template_structure → this tool → check_job_status. Never auto-pick a template.
generate_carousel
ChatGPTFill an EXISTING carousel template with manual/LLM-written JSON (carousel_content). template_id is required. Use when the user (or you) wants full control over slide text/images based on get_template_structure — not the AI carousel maker (generate_ai_carousel) and not Design Agent. REQUIRED order: get_template → get_template_structure → build carousel_content matching field labels → this tool → check_job_status. carousel_content shape: { carousel_topic?, intro_slide?: { elements: { [label]: { type, value, via?, image_query? } } }, slides: [{ elements: {...} }], ending_slide?: { elements: {...} } }. Element types are typically 'text' or 'image'. For Unsplash images use via='unsplash' and image_query.
generate_graphic
ChatGPTFill an EXISTING graphic/quote template with a manual/LLM-written content_update array. template_id is required. Use when the user (or you) wants full control over field values based on get_template_structure — not the AI graphic maker (generate_ai_graphic) and not Design Agent. REQUIRED order: get_template → get_template_structure → build content_update using exact field labels → this tool → check_job_status. Each item: { type: 'textbox'|'image', label: '<field label from structure>', value: '...', fontSize?, fontColor?, textboxMaxHeight? }.
get_brand_styles
ChatGPTREQUIRED before run_ai_design_agent. Lists the profile's saved visual styles and whether Pro model is available. If 2+ styles: ASK which style to use (or none) — never auto-pick. If exactly 1 style: use it unless the user declined. If 0 styles: proceed with no style. If can_use_pro_model is true: ASK Basic vs Pro (default Basic). Then pass the chosen style_id and model into run_ai_design_agent.
get_my_templates
ChatGPTGet the user's own saved templates/designs/graphics/carousels from their ContentDrips account. Use ONLY when the user says 'show me my designs', 'my templates', 'list my creatives', or explicitly wants to pick one of their templates. Do NOT call this to auto-pick a template when the user asks to create a new carousel/graphic — for creation without a template ID, use create_graphic + run_ai_design_agent instead. Returns a markdown table with an Open in editor link for each design. Optionally filter by type or by profile/workspace using profile_id.
get_post
ChatGPTGet details of a specific post by UUID
get_profiles
ChatGPTGet the user's ContentDrips workspaces (profiles). REQUIRED before create_graphic, create_post, generate_ai_*, edit_template, render_template, schedule_post, or publish_post. If 2+ profiles: ASK which workspace to use — never guess. If 1: use that profile_id. Always pass the chosen profile_id into later tools. Posts and scheduling fail without it.
get_social_accounts
ChatGPTGet connected LinkedIn and Instagram accounts for a profile. Check this before scheduling/publishing posts.
get_template
ChatGPTLook up a single template/design/graphic/carousel by ID or name. REQUIRED before AI maker when the user named a design but you only have a name (or need to confirm ID). Returns details and an Open in editor link. Searches the user's designs first, then public templates.
get_template_categories
ChatGPTList available ContentDrips template categories (carousel, quote, LinkedIn, motivational, etc.). Use when the user asks 'what template categories do you have', 'show me carousel templates', 'quote templates', or any category of designs. Then call search_templates with the matching category.
get_template_structure
ChatGPTREQUIRED before generate_ai_carousel, generate_ai_graphic, generate_carousel, generate_graphic, or edit_template. Inspects editable field labels/types and current fontSize/fontColor so you can build carousel_content, content_update, or surgical edit patches. For style edits: get_template → get_template_structure → edit_template. For manual JSON fill: get_template → get_template_structure → generate_carousel (carousel_content) or generate_graphic (content_update).
list_posts
ChatGPTList your posts by status (draft, scheduled, published, or all)
publish_post
ChatGPTPublish a post immediately. ONLY enable platforms the user EXPLICITLY named — no LinkedIn bias. Instagram-only request → instagram_publish=true, linkedin_publish=false. Never publish to an extra platform. Before calling: confirm with platforms named, e.g. 'Publish to Instagram only right now? Reply yes to confirm.' Only call after the user confirms yes/ok/go ahead. Both linkedin_publish and instagram_publish are required booleans.
remove_images_from_post
ChatGPTRemove ALL images from a post. Each file is deleted from S3, then images_url and graphic_id are cleared. Use this when the user wants to replace or discard the visuals on a post.
render_template
ChatGPTExport PNG/PDF of an already-saved design (render job → export_url). Does NOT rewrite content. ONLY call this when the user asks to preview, download, export, attach images to a post, or publish/schedule. Do NOT call automatically after run_ai_design_agent, create_graphic, or edit_template — those are done when you share the editor link. REQUIRED: pass profile_id from get_profiles (same workspace as the design). Set type to 'carousel' or 'graphic'. Then check_job_status for export_url(s).
run_ai_design_agent
ChatGPTAI Design Agent — builds a NEW layout with AI. Use when the user did NOT name an existing template/design (ID or name), or they uploaded a reference image to recreate in their style. Call create_graphic first (with profile_id). If they DID name an existing template, use generate_ai_carousel/generate_ai_graphic instead unless they explicitly asked to override/recreate the layout. REQUIRED: get_profiles then get_brand_styles. If 2+ styles, ASK which (or none) — never auto-pick. If Pro available, ASK Basic vs Pro. If the user uploaded an image in ChatGPT, pass it as reference_image (https URL preferred, or data URI). Overwrites the canvas on that template_id (hard to undo). May fetch reference_image from an https URL the user supplies. When finished: share edit_url and STOP. Do NOT render unless they ask to preview, download, or publish.
schedule_post
ChatGPTSchedule a post for future publishing. ONLY enable platforms the user explicitly named. If they said Instagram only → instagram_publish=true, linkedin_publish=false. Never add LinkedIn (or Instagram) just because it is connected. Ask if unclear. Both linkedin_publish and instagram_publish are required explicit booleans.
search_templates
ChatGPTBrowse or search public ContentDrips templates (designs, graphics, creatives, carousels, quote cards). Use ONLY when the user asks to show, find, browse, or pick a template — not as a silent step before creating content. Do NOT call this to auto-select a template for generate_ai_carousel / generate_ai_graphic. For category browsing, pass category (e.g. 'carousel', 'quote', or a topic category name). Call get_template_categories first if you are unsure which categories exist. Returns a markdown table with an Open in editor link for each template.
set_post_images
ChatGPTCASE 1 — Attach ContentDrips-generated images to a post. Use this after render_template, generate_ai_carousel, generate_ai_graphic, generate_carousel, or generate_graphic + check_job_status. Pass the export_url values exactly as returned (full S3 URLs, full CDN URLs, or relative paths — all are handled). The server strips any prefix and stores only the relative path. No re-uploading.
unschedule_post
ChatGPTUnschedule a post and move it back to drafts
update_post
ChatGPTUpdate a post's caption or platform flags. Only set linkedin_publish/instagram_publish true for platforms the user explicitly requested. Do not enable LinkedIn by default when the user asked for Instagram (or vice versa).
upload_images_to_post
ChatGPTCASE 2 — Upload external images to ContentDrips S3 and attach them to a post. Use this for ANY image not from ContentDrips: user-uploaded images in the chat, Facebook, Instagram, Twitter, or any external URL. The server downloads each URL and re-hosts it permanently. Supports multiple images at once. Prefer image_urls over images_base64 — base64 fails for images larger than ~4 MB.