{"id":6704,"plugin_id":"plugin_asdk_app_69dff98d3f78819180890780108a737d","kind":"skill","collection_source":null,"comparison_source":null,"observed_at":"2026-09-30T22:48:54.823Z","digest":"9416f24f48752699b8f710d73cbfeff9890d7e68855717c4aeb15fed04c6216c","against":null,"payload":{"name":"constant-contact-social","description":"Create, preview, and manage Constant Contact social media post campaigns using this plugin's MCP tools. Use whenever the user asks to create a social post or update social campaigns. Do not use for email campaigns, contact management, or general social content outside Constant Contact.","included_files":[],"skill_md_contents":"---\nname: constant-contact-social\ndescription: Create, preview, and manage Constant Contact social media post campaigns using this plugin's MCP tools. Use whenever the user asks to create a social post or update social campaigns. Do not use for email campaigns, contact management, or general social content outside Constant Contact.\n---\n\n# Social Post Campaign Management\n\nQuick reference for creating, previewing, and updating social media post campaigns in Constant Contact.\n\n## Social Preview Widget — CRITICAL REQUIREMENT\n\nThe **Social Preview Widget** (`ui://public-api/social-preview.html`) is an interactive MCP UI component that displays the social post visually before it goes live. It is automatically triggered by the MCP client whenever a tool returns a successful response.\n\n**Which tools trigger the widget automatically:**\n- `create_social_post` — widget fires after successful creation; wait for it to render before confirming\n- `update_social_post` — widget fires after successful update; wait for it to render before confirming\n\nThe widget renders the post visually across multiple social platforms (Facebook, Instagram, LinkedIn, etc.) with proper formatting, images, and text. Do not attempt to describe the post manually — always rely on the widget.\n\n### Scheduling via the Widget\n\n**Posts are always created as `DRAFT`.** Scheduling is handled entirely through the social-preview widget UI, not through tool parameters.\n\nNever pass `status=\"SCHEDULED\"` or `scheduled_time` to the tools. Always create `DRAFT` and let the widget button handle the scheduling handoff.\n\n## Campaign Creation Workflow\n\n### 1. Create Social Post (DRAFT)\n\nCreate a new social media post in draft status (not yet published).\n\n```json\n{\n  \"profile_posts\": [{\n    \"profiles\": [],\n    \"text\": \"Check out our latest updates! 🎉\",\n    \"images\": [{\"url\": \"https://imgur.com/abc123.jpg\"}]\n  }],\n  \"status\": \"DRAFT\"\n}\n```\n\n**Key Fields:**\n- `profile_posts`: Required — list of post objects\n  - `profiles`: List of `{profile_id: \"...\"}` objects — can be empty for DRAFT posts\n  - `text`: Optional caption/text content (required for effective posts; use 2-3 sentences)\n  - `images`: Optional list of image objects — **must use `[{\"url\": \"...\"}]` format, NOT flat strings or `media_urls`**\n- `status`: Default `\"DRAFT\"` — post is not published\n- `name`: Optional campaign name; auto-generated if omitted\n\n**Image URLs:**\n- Use fully qualified public URLs (e.g., `https://example.com/photo.jpg`)\n- URL-encode each path component\n- Supported: Social platform CDNs, imgur.com\n- Not all CDN domains support CSP; if images don't load in preview, upload to Constant Contact or imgur\n\n**Returns:** dict with `campaign_id`, `user_cta`, and widget metadata. **The social-preview widget renders automatically.** Wait for it to display before confirming creation.\n\n### 2. Update Social Post\n\nModify an existing draft post.\n\n```json\n{\n  \"campaign_id\": \"camp_abc123\",\n  \"profile_posts\": [{\n    \"profiles\": [],\n    \"text\": \"Updated post text goes here\",\n    \"images\": [{\"url\": \"https://imgur.com/new_image.jpg\"}]\n  }]\n}\n```\n\n**Fields:**\n- `campaign_id`: Required — the ID from the creation response\n- `profile_posts`: Optional — update post content and profiles\n- `name`: Optional — rename the campaign\n\n**All fields except `campaign_id` are optional.** Only specify fields to change.\n\n**Returns:** dict with updated campaign data. **The social-preview widget renders automatically.** Verify the changes appear in the preview.\n\n## Core Workflows\n\n### Full Workflow: Create → Preview → Schedule\n\n1. **Create** with `create_social_post` (always `DRAFT`)\n2. **Wait for social-preview widget to render** — do not report completion until it appears\n3. User reviews the preview — request edits if needed\n4. When satisfied, user clicks the **Send button** in the widget to open the Constant Contact UI and schedule or publish\n\n### Quick Edit: Modify a Draft\n\n1. **Update** with new text, images, or profiles via `update_social_post`\n2. **Wait for social-preview widget to render** — verify the changes\n3. User clicks the **Send button** in the widget to proceed to scheduling\n\n## Image Handling\n\n### Best Practices\n\n- **Prefer Constant Contact or imgur**. Images from these sources always render in preview.\n- **For user-uploaded images**: For a chat-uploaded image, use a data URL with upload_my_library_file when available. If the image cannot be passed to the tool, call user_image_upload and let the user upload through the widget. Never pass a local filepath as the URL.\n- **Test in preview**: The social-preview widget shows exactly how the post will appear on each platform (Facebook, Instagram, LinkedIn, etc.). If an image fails to load in preview, it will fail when published.\n\nIf the upload returns HTTP 400 or rejects a large PNG:\n  - preserve the original file;\n  - create an email-optimized copy;\n  - convert it to JPEG unless transparency or animation is required;\n  - resize it to a maximum dimension of approximately 1000–1200 pixels;\n  - remove unnecessary metadata;\n  - use JPEG quality around 80–85;\n  - retry the upload using a `.jpg` filename, `file_type: \"JPG\"`, and a\n     `data:image/jpeg;base64,...` URL.\n\n### Format\n\nImages **must** use the `images` array format with `url` objects:\n\n```json\n\"images\": [\n  {\"url\": \"https://imgur.com/photo1.jpg\"},\n  {\"url\": \"https://imgur.com/photo2.jpg\"}\n]\n```\n\n**Incorrect formats** (these will cause errors):\n```json\n\"images\": [\"https://imgur.com/photo1.jpg\"]  // ❌ flat array\n\"media_urls\": [\"...\"]  // ❌ wrong field name\n```\n\n## Response Format\n\nBoth `create_social_post` and `update_social_post` return a `dict` containing:\n\n- `campaign_id`: Unique identifier for the campaign — **verify this is present before confirming success**\n- `status`: Always `DRAFT` when created via this skill\n- `profile_posts`: Current post content and profiles\n- `user_cta`: `\"send\"` (authenticated — widget shows Send button) or `\"signUp\"` (unauthenticated — widget shows sign-up CTA)\n- `name`: Campaign name\n- Widget metadata (automatically triggers social-preview rendering)\n\n## Common Issues & Solutions\n\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| **Preview widget doesn't appear** | Network delay or widget not registered | Creation and update tools should return the social-preview UI resource. Do not create a second textual preview. If the response reports success, confirm creation and state that the preview should appear. If the tool returns no UI resource or reports an error, explain that the campaign may exist but its preview could not be displayed. |\n| **Image fails to load in preview** | Unsupported CDN or CSP blocked | Use imgur or Constant Contact instead; upload via `upload_my_library_file` if needed |\n| **\"Campaign not found\"** | Wrong `campaign_id` in update | Verify the ID from the creation response and use exact match |\n| **Image upload returns HTTP 400** | Image may be too large or inefficiently encoded | Resize it, strip metadata, convert a non-transparent image to JPEG at roughly 80–85 quality, and retry once |\n\n## Best Practices\n\n### Effective Post Content\n\nBefore generating a substantive social post, ask for or infer:\n\n* Goal\n* Audience\n* Desired action\n* Target network/profile\n* Brand tone\n* Image or visual direction\n\n## Error Handling — Widget Not Rendering\n\nIf the social-preview widget does not render after calling `create_social_post` or `update_social_post`:\n\n1. **Do not report success** — the preview must be visible to confirm the post\n2. Check the response for errors in the JSON-RPC result\n3. If the response contains `campaign_id`, the campaign was created but the preview widget failed to render — try refreshing the client\n4. If the response contains an error code (e.g., `400`, `401`, `404`), address the root cause:\n   - `400 Bad Request`: Invalid `profile_posts` format or missing required field\n   - `401 Unauthorized`: Authentication failed; user must sign in\n   - `404 Not Found`: Campaign ID not found (for updates)\n   - `-32603 Internal Error`: Transient server error; retry once with the same parameters\n\n**Never skip the preview widget verification.** It is the user's visual confirmation that the post is ready for publication.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}