From a finished demo to a reviewed post
Post to Social Media from Claude Code
To post to social media from Claude Code, connect Postdom's MCP tools, supply a finished video, then review the exact destination and settings before submitting. Postdom supports TikTok, Instagram Reels, YouTube Shorts, LinkedIn, Facebook Reels, X, Snapchat Spotlight, Threads and Bluesky. It publishes the video you provide; it does not generate one.
Already recorded a product walkthrough? Start with one YouTube account and a private upload, with approval required for each post. You will know exactly what Claude submitted and whether it reached the destination.
How to post to social media from Claude Code
1. Prepare the workspace and video
A human connects the destination in Postdom Accounts, selects per-post review (L1), and loads the workspace key into the terminal environment as POSTDOM_API_KEY. Start with a finished video at an accepted URL or a workspace media handle already marked stored.
Have Claude Code and Node.js 22 or newer installed; that Node requirement belongs to the released MCP package. In Postdom Accounts, a human connects the social account and creates the workspace key. Do not share social passwords with Claude.
Load the key through your approved secret manager or private terminal setup before starting Claude. Keep it out of shell-history commands, chat, CLAUDE.md and source control. This guide's command contains no key. If Accounts supplies a custom API URL, set POSTDOM_API_URL to that value in the same private environment.
2. Connect Claude Code and check its status
From your project terminal, run the local-scope stdio command below for @postdom/mcp@0.3.0, then claude mcp get postdom. Continue only when the connection reports Connected. Launch Claude Code from the same prepared terminal; /mcp shows its connection status.
claude mcp add --transport stdio --scope local postdom -- npx -y @postdom/mcp@0.3.0
claude mcp get postdomAdded confirms a configuration write, not a connection. Local scope is private to you for this project; it is not the team-shared .mcp.json file. If Postdom already exists in your configuration, inspect it before replacing anything. Claude Code's MCP setup reference explains scopes and connection checks, and Postdom as a Claude Code MCP server covers both transports, every tool the connection exposes, and what to check when it does not connect.
Connected, but the first call fails?
Check that the terminal launching Claude has POSTDOM_API_KEY and can run node and npx. Restart Claude after changing its environment. A connected local process does not prove the workspace key is valid: let get_workspace_status check access. Return a locked gate or account error to the human instead of changing credentials or policy.
Give Claude a video, an account and a stopping point
3. Ask Claude to read before it writes
Use the prepared-video prompt below. Claude reads workspace status, connected accounts and the operating brief, then shows the exact destination, video, caption and settings. Confirm the video review and the applicable audience, disclosure and consent choices before allowing submission.
Here is a first request for a private YouTube walkthrough. Replace the example URL with your accepted media source. Claude must obtain the account's providerAccountId from list_accounts, not guess it from a channel name or use the internal id.
Use Postdom to prepare one YouTube post, not a public release.
First call get_workspace_status, list_accounts and get_brief.
Show me the connected YouTube account and its providerAccountId.
Stop if the connection is locked, the account is missing, or its policy
does not require human approval for each post (L1).
Video: https://media.example.com/finished-demo.mp4
Caption: A closer look at our new workspace
A finished walkthrough for the team.
This is an example URL: ask me for my accepted video URL or stored
media handle before submitting. Do not generate or upload a new video.
Show me the exact video, account, caption and tool settings for review.
Ask me to confirm I watched the video and that private visibility,
not-made-for-kids and synthetic-media disclosure are correct.
Stop if I have not confirmed, or any setting is wrong.
After that confirmation, submit exactly once with publish_video and a
stable idempotency_key for this request. Return the post ID and status.
If requires_approval, wait for my separate approval in Postdom.
Then read get_publish with that same post ID. Report its actual status
and destination result; do not call it publicly live or retry blindly.For repeated work, place the review and stop rules in CLAUDE.md. That file provides working context, not enforced controls. Postdom's account policy—not the prompt—must require human approval. Claude's permission to call a tool does not establish consent to the content.
See the exact tool request and illustrative receipt
This example assumes the human has already reviewed the supplied video and confirmed the settings. The account ID comes from the illustrative account below. None of these identifiers are real, and the URL is not a working video.
{
"id": "internal-example-id",
"providerAccountId": "example-youtube-channel",
"platform": "youtube",
"status": "connected"
}{
"account_ids": [
"example-youtube-channel"
],
"video_url": "https://media.example.com/finished-demo.mp4",
"caption": "A closer look at our new workspace\nA finished walkthrough for the team.",
"intent": "Submit the human-reviewed supplied video to the selected L1 YouTube account as a private, AI-disclosed, not-made-for-kids upload.",
"idempotency_key": "claude-demo-review-001"
}{
"id": "11111111-1111-4111-8111-111111111111",
"status": "requires_approval",
"message": "Approve this exact request in Postdom."
}Keep the idempotency_key stable for the same unchanged request. A timeout is not evidence that nothing happened; read the known post before considering another submission.
Read the outcome without posting twice
4. Approve the post, then read the outcome
Claude submits once and returns the post ID. On the L1 account used here, requires_approval means the post is waiting for a human in Postdom. After human approval, Claude reads get_publish for the same ID and reports the returned post and destination states. Approval is not publication.
get_publish({
"post_id": "11111111-1111-4111-8111-111111111111"
})A tool permission prompt, approval of a plan, and approval of an individual post are different decisions. This example does not need a plan. Claude cannot grant itself approval or expand its account policy.
draft
Not submitted for publication. Review the prepared work before taking action.
requires_approval
Waiting for a human in Postdom. Claude must not approve its own request.
changes_requested
Read the human's requested changes; do not resubmit the unchanged work.
rejected
The human declined this request. Stop and return control.
missed_approval
Approval did not arrive in time. Ask the human how to proceed.
missed_schedule
The scheduled opportunity was missed. Review the cause and choose a new time with the human.
scheduled
Queued for a future provider handoff, not published yet.
publishing
In progress. Read the same post again; do not create a replacement.
published
Read the destination result and link. A private YouTube upload is still private.
partial
Some destinations succeeded. Check each result before retrying any failed destination.
failed
Read the reported error and hand off recovery; do not blindly replay the request.
blocked
Status unresolved here. Preserve the returned value and ask the human to review it; do not retry blindly.
unknown
Status unresolved here. Preserve the returned value and ask the human to review it; do not retry blindly.
If a result is missing or unfamiliar, show it as unresolved and hand it back to the human. Do not guess success. For a published post, inspect each destination's result; YouTube's private visibility has not become public just because the post says published.
For scheduled work, agree on the local time and timezone, then use the YouTube scheduling guide to distinguish a UTC provider handoff from a public release. If you later read performance, preserve missing values as missing: a null is not zero.
What was tested for this walkthrough?
Claude Code 2.1.251 registered the pinned local command and reported Connected in an isolated configuration with a fake key. Separately, the released package exposed its 13 tools and exercised the displayed request, target defaults and same-ID read against local fixtures. That checks connection and message handling—not Claude's judgment, a valid customer key, provider authorization, video acceptance or a real publication. No authenticated model or social-account call was made.
Questions before you connect
Can Claude Code publish directly to my social accounts?
Through Postdom's MCP tools, Claude Code can submit supplied finished videos to TikTok, Instagram Reels, YouTube Shorts, LinkedIn, Facebook Reels, X, Snapchat Spotlight, Threads and Bluesky inside your workspace policy. You connect the accounts and set approval requirements. Postdom does not generate the video. A connected tool is not permission to skip your review.
Does this make a public YouTube or TikTok post?
Not with the released MCP tool's current defaults: YouTube uses private visibility and TikTok uses SELF_ONLY. YouTube also submits madeForKids: false and containsSyntheticMedia: true. TikTok submits content_preview_confirmed: true and express_consent_given: true, disables comments, Duet and Stitch, and marks the video as AI-made. These assertions do not prove that review or consent happened. Stop unless the actual human review, express consent and settings fit. Instagram Reels is marked AI-generated; there is no equivalent private setting in this tool. LinkedIn receives no settings at all: it sets its own required visibility value, which Postdom neither chooses nor reads, and it exposes no AI-disclosure field, so none is sent for it. Facebook Reels receives only the fixed Reel format; X, Snapchat Spotlight and Threads receive nothing at all. None of the four carries an AI-disclosure field on this path, Snapchat needs a Public Profile on the account before it can publish, Threads takes its audience from whether the profile is public or private, and every Bluesky post is public because the post record carries no visibility field.
Is CLAUDE.md enough to connect Postdom or enforce approval?
No. MCP configuration connects the tool; CLAUDE.md supplies working instructions. Keep secrets out of both the prompt and committed files. Use Postdom's human-owned account policy to require approval, and let the human approve in Postdom. Claude must not treat tool permission or an approved plan as approval of every post.
Can I schedule the video from Claude Code?
The released publish_video tool accepts publish_at as a UTC timestamp. Agree on the time and timezone with the human, convert it to UTC, and inspect the returned state. This schedules Postdom's provider handoff, not a public YouTube release. A missed schedule needs review and a new human-approved time.
What if I only have a video on my laptop?
This walkthrough needs an accepted video URL or a workspace media handle that get_media reports as stored. The released MCP upload tool does not yet send the metadata required by the current upload endpoint, so fresh uploads are not a verified path here. Arrange the media handoff first; do not ask Claude to invent a URL or treat a local path as an uploaded video.
Start with one reviewed video
Connect the destination, select per-post review, and prepare the media source. Then use the command and first request above. Expand the workflow only after you can trace one request to its actual outcome.