{
  "name": "Draft social posts from RSS with OpenAI and send them to Yaybird for approval",
  "nodes": [
    {
      "parameters": {
        "content": "## Draft social posts from RSS with OpenAI and send them to Yaybird for approval\n\n**Who it's for:** anyone who wants n8n to draft social posts from their blog, without letting anything go live before a person has seen it.\n\n**How it works**\n1. The RSS trigger fires when a new article appears in your feed.\n2. **Your settings** holds the platforms, the posting time and an optional brand id.\n3. The AI Agent reads your brand and its rules from Yaybird, writes one post per platform, checks it, fixes what the check finds and saves it with `create_post`.\n4. The post waits in Yaybird. You get an email (and a push on your phone, if you turned push on) and approve it there. Nothing publishes until a person approves it. If nobody does, it waits: a timeout never posts.\n\n**Set up (5 minutes)**\n1. In Yaybird open **Settings > AI apps > API keys**, name the key `n8n`, set What it may do to **Drafts need my approval** and click **Create key**. Copy the key (it starts with `sk_yb_` and is shown once).\n2. Open the **Yaybird** node, Credential: **Bearer Auth**, paste the key as the token.\n3. Add your OpenAI credential to **OpenAI Chat Model** (any chat model works).\n4. Put your feed URL in the RSS trigger and your platforms in **Your settings**.\n5. Run it once with **Execute workflow** (it takes the newest article), then turn the workflow on.\n\n**Requirements:** a Yaybird workspace with the social accounts connected, an OpenAI (or other model) credential, n8n with the MCP Client Tool node (Server Transport: HTTP Streamable).\n\nGuide: https://yaybird.com/blog/n8n-social-media-approval-workflow",
        "height": 760,
        "width": 520,
        "color": 1
      },
      "id": "4fbebda1-3d2b-55d6-89d9-64d9481edafc",
      "name": "About this template",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -620,
        -260
      ]
    },
    {
      "parameters": {
        "content": "### 1. New article\nPolls your feed every hour. When the workflow is on, it only passes articles published after the last check, so turning it on does not post your back catalogue.\n\nA manual test run takes the newest article.\n\n**Change:** the Feed URL.",
        "height": 360,
        "width": 260,
        "color": 7
      },
      "id": "f95d7015-e70f-509e-8a55-5218c32bfe09",
      "name": "Step 1 note",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -60,
        -260
      ]
    },
    {
      "parameters": {
        "content": "### 2. Your settings\n**Change these.**\n- `platforms`: any of linkedin, x, threads, facebook, bluesky (they take text posts). Instagram, TikTok, YouTube and Pinterest need a photo or video, which this template does not add.\n- `when`: `next_slot` takes your next free posting time in Yaybird, or an exact time with its offset, like `2026-11-03T09:00:00-05:00` (a time without one is read as UTC).\n- `brand`: leave empty if your workspace has one brand.",
        "height": 360,
        "width": 300,
        "color": 2
      },
      "id": "cb7fe1da-7272-5ca4-b3d3-0d390bb4c9c8",
      "name": "Step 2 note",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        220,
        -260
      ]
    },
    {
      "parameters": {
        "content": "### 3. Draft, check, save\nThe agent can use 4 Yaybird tools only: `get_workspace`, `get_brand`, `check_post`, `create_post`. It has no tool to approve or publish, and the API key can't do either.\n\n`check_post` returns every problem (length, links, your brand rules) with its fix, so the agent fixes them before it saves.\n\n`idempotency_key` is the article link, so a re-run returns the same post instead of a second one.",
        "height": 360,
        "width": 340,
        "color": 7
      },
      "id": "c149e80c-3cc5-585b-8231-4fe5043dfb5f",
      "name": "Step 3 note",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        540,
        -260
      ]
    },
    {
      "parameters": {
        "content": "### 4. A person approves\nn8n is done once the post is saved. The post waits in Yaybird with a preview per platform. Approvers get an email (and a push on a device where they turned push on) and approve it on their phone or computer.\n\nThe agent's last message has the post's `approval_url`.\n\n**Yaybird node:** Endpoint `https://yaybird.com/mcp`, Server Transport **HTTP Streamable**, Authentication **Bearer Auth** with your `sk_yb_` key.",
        "height": 360,
        "width": 320,
        "color": 7
      },
      "id": "0c7ca06e-4c61-5959-8d40-212c9fa0d080",
      "name": "Step 4 note",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        900,
        -260
      ]
    },
    {
      "parameters": {
        "pollTimes": {
          "item": [
            {
              "mode": "everyHour"
            }
          ]
        },
        "feedUrl": "https://example.com/feed.xml"
      },
      "id": "cd6c3cdd-c33f-57d7-a059-8481302bd5bc",
      "name": "When a new article is published",
      "type": "n8n-nodes-base.rssFeedReadTrigger",
      "typeVersion": 1,
      "position": [
        20,
        160
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "3b5d8b87-df46-5f72-b814-90b2a914fbc1",
              "name": "platforms",
              "value": "linkedin, x",
              "type": "string"
            },
            {
              "id": "462f16a1-5bf7-51fe-a70f-6d01b2d08005",
              "name": "when",
              "value": "next_slot",
              "type": "string"
            },
            {
              "id": "39c39d98-e092-56f0-98c9-a8b1eea781bb",
              "name": "brand",
              "value": "",
              "type": "string"
            }
          ]
        },
        "includeOtherFields": true,
        "options": {}
      },
      "id": "0fd8480d-256e-538a-9d66-467ae4df4cfc",
      "name": "Your settings",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        300,
        160
      ]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=A new article is up on our site.\n\nTitle: {{ $json.title }}\nLink: {{ $json.link }}\nSummary: {{ $json.contentSnippet }}\n\nWrite one post for each of these platforms: {{ $json.platforms }}.\nSchedule it for: {{ $json.when }}\nBrand id: {{ $json.brand || \"none set, leave brand out\" }}\nUse this idempotency_key: rss:{{ $json.link }}",
        "options": {
          "systemMessage": "You draft social posts in Yaybird for a small business. You cannot publish or approve anything: every post you save waits for a person to approve it.\n\n1. Call get_workspace once to find the brand and the time zone.\n2. Call get_brand for that brand's rules and each platform's playbook. Follow the rules.\n3. Write one target per platform, in plain words, each one written for its platform. Put the article link in the caption.\n4. Call check_post. If it returns problems, apply each fix and call check_post again, at most 3 times.\n5. When check_post says ok, call create_post once with the same targets, the scheduled_at you were given and the idempotency_key you were given. Leave submit out.\n6. Reply with the post_id, the approval_url and one line per platform. Never say a post is published: it waits for approval.\n\nIf create_post or check_post refuses with continue_url, stop and reply with that link.",
          "maxIterations": 10
        }
      },
      "id": "b38c9687-8210-5635-bd64-e64d63cf711e",
      "name": "Draft the posts and send them to Yaybird",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 2.2,
      "position": [
        620,
        160
      ]
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-5-mini"
        },
        "options": {}
      },
      "id": "584075dc-4ffc-5e0b-a4f1-fb052d23f21c",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [
        560,
        400
      ]
    },
    {
      "parameters": {
        "endpointUrl": "https://yaybird.com/mcp",
        "serverTransport": "httpStreamable",
        "authentication": "bearerAuth",
        "include": "selected",
        "includeTools": [
          "get_workspace",
          "get_brand",
          "check_post",
          "create_post"
        ],
        "options": {}
      },
      "id": "540838b1-3b73-5d6a-849a-f28d4823fb7e",
      "name": "Yaybird",
      "type": "@n8n/n8n-nodes-langchain.mcpClientTool",
      "typeVersion": 1.2,
      "position": [
        780,
        400
      ]
    }
  ],
  "connections": {
    "When a new article is published": {
      "main": [
        [
          {
            "node": "Your settings",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Your settings": {
      "main": [
        [
          {
            "node": "Draft the posts and send them to Yaybird",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Draft the posts and send them to Yaybird",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Yaybird": {
      "ai_tool": [
        [
          {
            "node": "Draft the posts and send them to Yaybird",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "tags": []
}