How to let Claude schedule your social media posts (MCP, step by step) A developer who builds PostWire, an MCP server for social media scheduling, published a step-by-step walkthrough showing how Claude can schedule and plan posts through MCP connectors. The tutorial covers connecting accounts via OAuth, calling tools such as create_connect_link, generate_posts, schedule_post and plan_week, and notes that scheduling requires ISO 8601 times with offsets and that X, Threads, Reddit and Pinterest are unsupported. The author says the same approach works with any MCP server that exposes scheduling tools. Disclosure: I'm Renzo, and I build PostWire, the MCP server used here. It has a free plan. The same steps work with any MCP server that exposes scheduling tools; the tool names will differ. Claude can't post to LinkedIn or Bluesky on its own. It has no access to your accounts. It can once you connect an MCP server Anthropic calls these connectors that holds those connections and exposes tools like "schedule this post". This tutorial sets that up, schedules a post, plans a week of posts, and cancels one. Along the way it shows the actual tool calls Claude makes, so you can do the same from your own agent. Everything below was run on Oct 1, 2026 against PostWire's hosted server with a test account. In Claude web, desktop, mobile : PostWire is in Claude's connector directory. Search for "PostWire", press Connect , and sign in with your email. You get a 6-digit code; there's no password and no card. In Claude Code , one command: claude mcp add --transport http postwire https://postwire.io/api/mcp Without a key, Claude Code signs you in with OAuth: run /mcp inside Claude Code and pick postwire . To use an API key instead dashboard → API & MCP → Copy key : claude mcp add --transport http postwire https://postwire.io/api/mcp \ --header "Authorization: Bearer pw live your key" Check it: bash $ claude mcp list postwire: https://postwire.io/api/mcp HTTP - ✔ Connected The hosted server has 15 tools. The ones this tutorial uses are create connect link , generate posts , schedule post , plan week , list scheduled posts and cancel scheduled post . Ask: "Connect my LinkedIn." Claude calls create connect link : { "name": "create connect link", "arguments": { "platform": "linkedin" } } and gets back a link that's valid for one hour: { "url": "https://postwire.io/connect/ …", "expires in": 3600, "platform": "linkedin" } You open it and sign in on LinkedIn itself. Claude never sees a password. The networks you can connect are TikTok, Instagram, YouTube, LinkedIn personal profiles , Facebook Pages, Bluesky, Mastodon, Telegram and Discord. X, Threads, Reddit and Pinterest aren't available. Scheduling needs an exact time with an offset run at , ISO 8601, up to 365 days ahead . Say "I'm in New York" once and Claude will turn "Friday at 9" into 2026-10-09T09:00:00-04:00 . "Write a short post announcing our autumn menu for LinkedIn and Bluesky and schedule it for Friday 9:00." Claude first calls generate posts , which returns one draft per network and publishes nothing. It shows you the drafts. After you approve, it calls: { "name": "schedule post", "arguments": { "run at": "2026-10-09T09:00:00-04:00", "platforms": "linkedin", "bluesky" , "per platform": { "linkedin": { "text": "…" }, "bluesky": { "text": "…" } }, "label": "Menu launch" } } The answer trimmed, from my run against a test channel : { "ok": true, "scheduled": { "id": "0f8b4368-…", "run at": "2026-10-09T13:00:00+00:00", "status": "queued", "label": "Menu launch" }, "message": "Scheduled for 2026-10-09T13:00:00.000Z to …" } Two details matter here: schedule post refuses immediately with a not connected or media required code. You find out while you're still in the conversation. "Plan the next 5 days of posts about our autumn menu and the farmers behind it, LinkedIn and Bluesky, 9 am New York time." Claude calls plan week : { "name": "plan week", "arguments": { "topic": "our new autumn menu and the farmers behind it", "platforms": "linkedin", "bluesky" , "days": 5, "hour": 9, "timezone": "America/New York" } } It writes one post per day, each from a different angle and each in the format of its network, and queues them starting tomorrow. In my run with "days": 2 to a test Discord channel it queued 2026-10-02T13:00:00Z and 2026-10-03T13:00:00Z 9:00 in New York . Day one opened with a lesson "building our autumn menu taught us something we didn't expect…" and day two with an opinion "hot take 🍂 most people scroll past a new menu…" . Limits you should know about: plan week is for "What's scheduled?" → list scheduled posts returns each post's id, time, networks and status queued , done , failed , canceled … . "Cancel Friday's post." → { "name": "cancel scheduled post", "arguments": { "id": "0f8b4368-…" } } → { "ok": true } A post can be cancelled until it starts publishing. The same queue shows up in the dashboard, with Reschedule and Cancel buttons. If you attach a video in the chat, it never reaches an MCP server. Claude can't hand it over. Instead it calls create upload link : { "url": "https://postwire.io/upload/ …", "expires in": 86400, "max bytes": 1073741824 } You open that link on the device that has the file and upload it up to 1 GB . Claude then calls get uploaded file to get its media url and uses that as video url . One caveat I found while writing this: schedule post has no privacy field today. A TikTok or YouTube video scheduled through it goes out private with no privacy value, PostWire posts to TikTok as private, and YouTube uploads default to private unless the connected account's default visibility is set to public. For YouTube you can set that in the dashboard under Accounts. For a public video now, post to social accepts "privacy": "public" . For a public video later, use the REST call below, which passes privacy through. Any agent framework or a cron job can do the same with one HTTP call: curl -X POST https://postwire.io/api/schedule \ -H "Authorization: Bearer $POSTWIRE API KEY" -H "Content-Type: application/json" \ -d '{"run at":"2026-10-09T09:00:00-05:00","platforms": "linkedin","bluesky" ,"text":"Launch day.","label":"Launch"}' GET /api/schedule lists the queue and DELETE /api/schedule/