{"id":27876,"plugin_id":"plugin_asdk_app_6aa944d20a3081919d9f65692616ff4d","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-10-08T06:23:45.255Z","digest":"d772b79f5d019ae28bfa4cc6af2a7a30f8556cabb50f30c9944e4f79e235ba72","against":null,"payload":{"description":"Connect Meta, Google, TikTok, LinkedIn, Reddit, Pinterest, or X ad accounts for a brand via OAuth URL and link_ad_channel_account. Keywords: connect ads, link ad account, Facebook page, channel OAuth, Pinterest, twitter, TikTok ads connect.","included_files":[],"name":"omneky-channel-connect","skill_md_contents":"---\nname: omneky-channel-connect\ndescription: >-\n  Connect Meta, Google, TikTok, LinkedIn, Reddit, Pinterest, or X ad\n  accounts for a brand via OAuth URL and link_ad_channel_account. Keywords:\n  connect ads, link ad account, Facebook page, channel OAuth, Pinterest,\n  twitter, TikTok ads connect.\n---\n\n# Connect ad channels\n\n## Activation analytics\n\nIf the host exposes a skill-activation / analytics hook, call it once per new user request with this skill name; otherwise skip silently. Never invent a tracking tool. Omneky MCP does **not** expose `track_skill_activation`.\n\n## Purpose\n\nFocused paid-media channel attachment (OAuth URL → authorized accounts →\nlink). Prefer `omneky-self-connect` when OpenAI Ads / PostHog / Drive are\nalso in scope.\n\n## When to use\n\n- User asks to connect Meta / Google / TikTok / LinkedIn / Reddit /\n  Pinterest / X Ads only\n- Launch blocked by disconnected channel\n\n## When not to use\n\n- OpenAI Ads / PostHog / Drive → `omneky-self-connect`\n- HubSpot / Semrush / Ahrefs / GSC connect (not on this surface)\n- Launch / pause / budget mutations → launch-manage / pause-budget skills\n\n## OpenAI runtime contract\n\n- Use only tools from the current OpenAI host + Omneky MCP (`https://mcp.omneky.com/mcp`). Never invent tools.\n- Prefer native ChatGPT / host widgets and question UI for decisions. Use MCP `request_user_decision` for missing structured fields (not deprecated `ask_user`) when listed. Else follow `omneky-failure-modes` § Approval / plain-chat fallback.\n- When intake is incomplete, ask **one** concise chat question. Never invent a question tool.\n- Approval / Generate turns: end the turn after Approve / Deny (or Generate / Cancel) via host UI or plain chat; mutate only after affirmative Approve / Generate. Never invent a fake widget tool.\n- Never invent tokens; OAuth is host-managed. Never ask the user to paste a JWT or API key into chat.\n\n## Non-negotiable output / safety contract\n\n- X Ads wire name is `twitter`, never `x`.\n- Do not claim connected until status re-check succeeds.\n- Never invent API keys for paid-media channels — use\n  `get_channel_connect_url` OAuth.\n\n## Staged workflow\n\n### Stage 1 — Brand + status\n\n1. Resolve brand (`list_brands` / picker) if needed.\n2. `get_channel_connection_status` (and `get_pinterest_connection_status`\n   when Pinterest). Optional snapshot: `list_connector_statuses`.\n\n### Stage 2 — OAuth\n\n1. `get_channel_connect_url` for the channel.\n2. Hand URL to user; end turn while they complete browser OAuth.\n\n### Stage 3 — Link\n\n1. `list_authorized_ad_accounts`.\n2. Meta: also `list_authorized_facebook_pages` when needed.\n3. Confirm selection → `link_ad_channel_account`.\n4. Re-check status.\n\n### Stage 4 — Next\n\nOffer launch via `omneky-launch-manage` (paused by default) or Meta path\n`omneky-meta-launch`.\n\n## Failure boundaries\n\n| Failure | Required response |\n| --- | --- |\n| Still disconnected after OAuth | Re-check once; ask user to retry OAuth; do not invent tokens. |\n| Wrong wire name `x` | Use `twitter`. |\n| Multiple accounts | Confirm before `link_ad_channel_account`. |\n| Non–paid-media connector | Hand off to `omneky-self-connect` or analytics (reads-only). |\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}