How to do it
- Create an agent key for n8n In https://app.socialhandoff.com, open Connections, add an agent called n8n, and grant draft (and schedule if the workflow should propose times).
- Store it as a credential In n8n, create a Bearer Auth credential (or a Header Auth credential with Authorization set to Bearer and the key). Workflows reference it without exposing the key.
- Option A: MCP Client Tool Add an AI Agent node, attach an MCP Client Tool, set the endpoint to https://app.socialhandoff.com/mcp, Server Transport to HTTP Streamable, and Authentication to your Bearer credential.
- Option B: HTTP Request Add an HTTP Request node: method POST, URL https://app.socialhandoff.com/v1/posts, your credential, and a JSON body like the one below.
- Test and activate Run the workflow once, confirm the draft appears in the SocialHandoff inbox, then activate it.
{
"body": "{{ $json.summary }}",
"networks": ["linkedin", "bluesky"],
"mode": "submit",
"idempotencyKey": "n8n-{{ $execution.id }}"
} Two ways to wire n8n
MCP Client Tool suits workflows where a model decides what to write. The AI Agent node gets the SocialHandoff tools, so it can read brand memory, draft per network, and preview, much like a chat client. Pick which tools to expose in the node; for most flows get_brand_memory, draft_post, and preview_posts are enough.
HTTP Request suits workflows where the text is already decided, for example an RSS item, a form submission, or a row in a sheet. The node posts JSON to /v1/posts and gets the created post back. No model needed.
The request body
body: the post text. Map it from a previous node.networks: which networks to target, such asx,linkedin,bluesky,mastodon.mode:draftsaves a draft,submitsends it to the approval inbox, andscheduleasks for a slot (it still needs approval unless the agent is promoted).idempotencyKey: n8n retries failed executions. Sending the execution id means a retry returns the original post instead of creating a second one.
Workflow ideas
- New blog post in your RSS feed, then a draft for LinkedIn and Bluesky with the link.
- New row in a content sheet, then a submitted draft with the row's date and time.
- An
approval.requestedoutbound webhook from SocialHandoff into an n8n Webhook node, then a Slack or email ping to the reviewer. - A
post.publishedwebhook into n8n, then a row added to your reporting sheet.
Outbound webhooks carry an HMAC-SHA256 signature of the raw body, made with a signing secret that SocialHandoff shows once when you create the webhook. Verify it in a Code node before trusting the payload.
Troubleshooting
- 401: the credential is not attached to the node, or the key lost the needed permission.
- 422: a guardrail rejected the text, for example over the per-network length or a banned topic. The response body names the rule.
- 423: the workspace kill switch is on; scheduling is paused until someone resumes.
- MCP endpoint field labeled SSE: some n8n versions keep the old label. Set the transport to HTTP Streamable and the URL still works.
Per-network recipes: n8n for X, n8n for LinkedIn, n8n for Bluesky, n8n for Mastodon, and n8n for Threads.