All workflows

Workflow · Claude

Post from Claude — design there, ship here

Make it in the chat. Ship it on a calendar.

6 min read Claude Claude Code MCP Scheduling

You already make things with Claude. A caption you rewrote six times until it stopped sounding like marketing. A product shot you designed in an artifact and kept nudging. A batch of hooks Claude Code generated while you were doing something else. The making part has quietly stopped being the bottleneck.

What's missing is the last inch. Claude can't reach your accounts, so the work ends in a chat window and you finish it by hand — download, switch apps, retype the caption, pick a time, do it again for the second platform. That's the part that doesn't scale, and it's the only part that's still manual.

Post Ripple's MCP server is the publishing arm. You connect it once, then “schedule this for tomorrow at 9” is a thing that actually happens — to real accounts, against your plan's credits, through your team's approval workflow, with every call written to an audit log you can read.

The shape

Three moves, and only one is new

You already do the first. The third already happens without you. The middle one is what connecting the MCP server adds.

Make it

In Claude

Wherever you already work — a chat, Claude Code in a repo, an artifact you iterated on until it looked right. The taste and the output stay where they are. Nothing about your process changes.

Hand it over

To Post Ripple

The MCP server is the publishing arm Claude doesn't have. It takes the image or video, files it in your library, and composes the actual post — carousel, caption, TikTok settings, target accounts.

Let it go out

On schedule

A time, an account, an idempotency key. It lands on your calendar, or in your review queue if your team approves posts first, and publishes itself when the time arrives.

Step one

Connect it once

Create a key in Post Ripple under Settings → API Keys — check the scopes you want, and leave publish off until you're ready for Claude to reach a real account. The key is shown once, so paste it straight into the command.

That's the entire installation. The server runs locally over stdio and reads the key from the environment; there's nothing to host and no OAuth flow. Claude Desktop, Cursor, Codex, and opencode use a config file instead of a command — the docs have all of them.

terminal · one time
claude mcp add postripple \
  -e POSTRIPPLE_API_KEY=pr_... \
  -- npx -y @post-ripple/mcp@latest

Restart Claude Code and ask it what's in your workspace.

Step two

Ask for it in a sentence

You don't name tools and you don't look up ids. You say what you want done with the thing you just made, the way you'd say it to someone who works with you. Claude has the tool list and the workspace; it figures out the route.

Be specific about the parts that are decisions rather than mechanics — which accounts, what time, whether the caption differs per platform, whether TikTok should be public. Those are the things it can't infer, and the things you'd regret it guessing.

claude — what you type
> Here's the product shot I just designed —
  post it to our IG and TikTok tomorrow
  morning. Same caption on both, and keep
  the hook line from the artifact.

Step three

Watch it do the mechanics

The sentence becomes a chain of tool calls. Orient with whoami, get the image into the library, compose the carousel, wait for it to render, resolve the accounts, schedule it. Every step is visible while it happens, so you can stop it mid-chain if it's heading somewhere you didn't mean.

The rendering wait is real, not padding: template slides are composed server-side, so create_slideshow returns "rendering" and the publish only fires once get_slideshow reports "ready". If what you made is a finished video rather than an image, the chain is shorter.

the video path
# when it's a video instead of an image
get_video_upload_url     → uploadUrl, fileId
PUT the bytes to uploadUrl
register_uploaded_video  → videoId
schedule_post            → postId, deduped
claude — the tool trace
⏺ postripple · whoami
  My Brand · scopes: read, content:write,
  publish

⏺ postripple · import_image_from_url
  → imageId: img_4c81…

⏺ postripple · create_slideshow
  → slideshowId: sld_9f2a… status "rendering"

⏺ postripple · get_slideshow  ×3
  → status: "ready"

⏺ postripple · list_social_accounts
  → instagram @mybrand · tiktok @mybrand

⏺ postripple · publish_slideshow
  scheduledFor: 2026-07-30T09:00-07:00
  idempotencyKey: shot-launch-ig-tt
  → 2 posts scheduled

One sentence in. Two scheduled posts out.

Step four

It shows up in the normal places

Nothing about an agent-scheduled post is special. It's a row on the same calendar, editable and cancelable the same way, and it publishes through the same pipeline as one you queued by hand. Your teammates can't tell which is which except by the attribution.

If your workspace requires approval, the posts don't land on the calendar at all — they land in the review queue, submitted by the key that made them, waiting for an owner or admin. And either way the call sequence is in the audit log on the API Keys page, so you can reconstruct exactly what Claude did and when.

post ripple — three screens
Calendar · Thu Jul 30
  09:00  @mybrand · instagram   scheduled
  09:00  @mybrand · tiktok      scheduled

Review queue      (if approval is on)
  2 items · submitted by
  "AI agent (Claude on my laptop)"

Recent agent activity
  ok  publish_slideshow
  ok  get_slideshow
  ok  create_slideshow
  ok  import_image_from_url
  ok  whoami

Works with your guardrails

Handing over the keys, not the wheel.

Letting an agent touch real accounts is only reasonable if you can bound what it reaches and see what it did. Four things make that true here, and none of them require you to trust the model.

The key only does what you checked

Three scopes, picked per key. A read-only key can answer every question about the workspace and change nothing. Anything outside a key's scopes fails with insufficient_scope — it doesn't partially run.

Publishing a post is off until you turn it on

publish is unchecked by default, and without it Claude can't put a post on an account or wire a rotation to one — not a single post, and not a rotation group. Standing up or re-pointing an auto-publishing rotation needs publish too. What content:write can still do is add videos to a rotation you wired up yourself — which re-rolls which videos that rotation will publish, and when.

Approval mode still applies

If your team requires approval, a publish call doesn't schedule — it creates an in-review item and returns submittedForReview: true. An owner or admin approves it from the Review page, exactly like a human submission.

Every call is on the record

Each authenticated call is logged with the tool, an argument summary, its status, and the member whose key it was. You read it in-app under Recent agent activity, and revoking the key cuts access on the next call.

Common questions

Claude, with a publish button

Can Claude post to my social accounts?

Yes, once you connect Post Ripple's MCP server and give the key the publish scope. Claude then schedules to your real TikTok, Instagram, and YouTube accounts the same way you would in the app. Without that scope it can't put a post on an account or wire a rotation to one: posting a specific piece of content and attaching a rotation group to an account both require publish. A content:write key can still add videos to an existing rotation, which re-rolls which videos that rotation will publish, and when.

Does this work with Claude Desktop, or claude.ai in the browser?

Claude Code and Claude Desktop both work — anything that can launch a local stdio MCP server can run this one, which also covers Cursor, Codex, and opencode. There is no hosted or remote endpoint, so claude.ai in the browser can't connect to it; the server runs on your machine.

Can I design the post in Claude itself?

That's the point of the workflow. Whatever you end up with — an image, a set of captions, an artifact you refined over a few turns — is the input. Post Ripple takes images by public URL with import_image_from_url, or by presigned upload with get_image_upload_url plus register_uploaded_image, so it doesn't matter whether the file lives on your disk or on the web.

How do I set it up?

Create a key in Post Ripple under Settings → API Keys, then run one command: claude mcp add postripple -e POSTRIPPLE_API_KEY=pr_... -- npx -y @post-ripple/mcp@latest. Restart Claude Code and ask it what's in your workspace. Claude Desktop and Cursor use a config file instead of a command; the docs have both.

What stops a retry from double-posting?

An idempotencyKey on schedule_post and publish_slideshow. Any unique string works. If the same call runs twice — a dropped connection, an over-eager retry — the second one resolves to the same post and comes back with deduped: true instead of creating a second one.

What if I run more than one brand?

Keys are personal, so one key works in every workspace you belong to. Claude calls whoami to see them and passes organizationId per call, or you pin a default with the POSTRIPPLE_ORG environment variable — useful when a repo maps to one brand. If a call is ambiguous, the API returns ambiguous_org rather than guessing.

Do I need to know how to code?

No. Setup is one command or one pasted config block, and after that you talk to Claude in plain language. The tool traces on this page are what Claude runs on its own — you never write them.