Connect once. Publish from your tools.
Your first post, step by step.
Connect an account, validate a post without sending it, then publish when you are ready. Start in the dashboard to set up your publishing key and connections. Then authorize a hosted OAuth connector, or use the API-key paths for private GPT Actions, local MCP, and REST.
Prefer the raw guide? Markdown version
Start here
Start in the dashboard
-
Start for $0 and sign in
Choose Start for $0. Create your account or sign in. Complete any email verification your sign-in screen requests.
-
Keep your key and connections together
Open Publishing setup. A new account's first Free key is created and selected automatically. Use Copy key to save it in your password manager before choosing I saved it; it is shown only until you dismiss or reload. Never paste the key into chat.
The Publishing key dropdown shows the selected key and its connection count. Each key owns its connections and receipts. You do not need another key to connect another destination.
-
Connect one destination
Under Connect destinations for your selected key, choose an available destination. For OAuth, confirm the selected key in Social Fanout, then complete the provider's login and permission screens. Bluesky uses an App Password; Discord can use a webhook. Check the handle under Connected accounts for that same key when you return.
For the guided first post, choose Threads, Bluesky, a Facebook Page, X, or Discord. Instagram and other media-specific flows use Quick publish instead. See destination requirements below.
-
Validate without posting
In Overview → Guided first publish, choose Open the private validator. Select one connected account, write a short link-free post, and choose Validate privately.
This checks API authentication, routing, and plan access without sending to a social provider or consuming publish quota. It records a dry-run job; it is not proof of provider acceptance or native delivery.
-
Approve the real post, then inspect it
Review the exact account and text. Only when the account owner approves the real post, choose Publish to 1 destination and confirm the public publish. Changing the text or destinations requires validation again.
Inspect each result in Posts, then open the native post link when available. Check the actual account and content on the destination. A queued, scheduled, or provider-accepted receipt is not verified native delivery.
Per-user OAuth
Use the hosted OAuth connector
After dashboard setup, add https://socialfanout.com/mcp
as a custom connector in a compatible MCP client and sign in to
Social Fanout. Select one active key you own and approve the named
OAuth client. The client is limited to that key's connected accounts
and plan. It does not receive your API key or social-platform credentials.
Follow the hosted connector guide for the exact dry run, confirmation token, and approval steps before publishing. Review or revoke access in Dashboard → Authorized assistants.
OpenAI and Anthropic control their directories; listing availability remains subject to their review.
Your content, inside ChatGPT
Publish from ChatGPT
This section covers the legacy/private custom GPT with Actions path, not an ordinary ChatGPT chat. Actions must be available in your account and workspace. For the per-user OAuth MCP path intended for the shared ChatGPT/Codex directory, see the hosted connector guide; directory availability remains subject to OpenAI review.
-
Create a private GPT
Open the GPT editor, create or edit a GPT, and open Configure. Paste the secret-free GPT instructions into its Instructions field.
-
Import the Action and set its key
Under Actions → Create new action → Import from URL, import this Action schema:
https://socialfanout.com/downloads/socialfanout-chatgpt-action.openapi.jsonSet Authentication → API Key → Bearer. Enter the saved key from Publishing setup in that authentication field, never in Instructions or chat. Keep this GPT private; anyone allowed to use it can act through that key.
-
Check the account, then validate
In the Action editor, test
listSocialFanoutPublishingConnections. Confirm the returned handle is the account connected to your selected key. An empty list means you should check the key and connection in Publishing setup.In the GPT preview, try:
List my connected publishing accounts. Help me validate a short post to one account. Do not publish it.
The GPT should show the account and call
publishWithSocialFanoutwithdryRun: true. Inspect the result. Only then approve the exact final content, destination accounts, and timing for a live request withdryRun: false. Verify its receipt and native post as described above.
OpenAI controls Action availability and workspace restrictions. Official GPT Actions setup guide.
Local MCP, hosted publishing
Publish from Claude Desktop
Install Social Fanout as a Claude Desktop extension. It runs on your computer and publishes through the accounts connected to your key. There is no configuration file to edit and no separate Node.js install.
Social Fanout extension 0.1.6 for Claude Desktop on macOS and Windows.
SHA-256 2b32d64f481602683a8fbc206d8b4aa14850d1d03587ec31886975d9508e77b4
-
Open the downloaded file
Open
socialfanout.mcpb. Claude Desktop shows an install screen for Social Fanout and runs the extension with the Node.js it ships with. -
Paste your key into the masked field
Claude Desktop asks for your Social Fanout API key in a field marked sensitive, so the key never goes into chat or a file you edit. Use the key your accounts are connected to. The extension only connects to
https://socialfanout.com, so there is no address to set. No key yet? Start for $0 and connect an account in the dashboard first. -
List, dry-run, then approve
Ask Claude to list your connections, then dry-run the post with
dryRun: true. Approve the exact text, account and time before any live publish. A dry-run receipt is not proof of native publication.
To check the download before you open it, compare its SHA-256 with
the one above: run shasum -a 256 socialfanout.mcpb on
macOS or Get-FileHash socialfanout.mcpb in Windows
PowerShell. If you added Social Fanout to
claude_desktop_config.json by hand earlier, remove that
entry after installing so the tools do not appear twice. The
extension works in Claude Desktop only. It does not add a connector
to claude.ai on the web or on mobile.
Manual setup for Claude Desktop
This is a local mcpServers configuration, not a remote
connector URL for claude.ai or ChatGPT. With Node.js 18 or newer and
npm installed on your computer,
add this entry to Claude Desktop's local MCP configuration:
{
"mcpServers": {
"socialfanout": {
"command": "npx",
"args": [
"-y",
"--package=https://socialfanout.com/downloads/socialfanout-mcp-0.1.6.tgz",
"socialfanout-mcp"
],
"env": {
"FANOUT_API_KEY": "your-fanout-api-key"
}
}
}
}
-
Add your key; preserve your other tools
Replace
your-fanout-api-keywith your saved key. Merge only thesocialfanoutentry into your existingmcpServers; do not overwrite other servers. Keep the key in private configuration, never in chat or source control. -
Restart Claude Desktop and list your connections
Save the configuration and restart Claude Desktop. Ask it to use
fanout_list_connectionsand show your connected accounts. This package connects tohttps://socialfanout.comby default; no local API server or source checkout is needed. -
Validate before approving a publish
Check that the installed
fanout_publish_posttool schema includes a booleandryRun. UsedryRun: truefor a no-send preflight. Omitted orfalsekeeps live-publish behavior, so first obtain explicit approval of the exact content, account, and schedule. A dry-run receipt is not proof of native publication.
socialfanout-mcp
version 0.1.1) for a no-send test:
it does not support dryRun. The versioned 0.1.6 download
above includes the fix and is also available on npm as
socialfanout-mcp@0.1.6.
If the field is absent, use only read tools or the REST/GPT Action
dry-run flow, not the MCP publish tool.
Download the same MCP 0.1.6 package.
Use the --package command on this page, or install the
pinned npm version with npx -y socialfanout-mcp@0.1.6.
Call fanout_publishing_capabilities before composing to read
implemented formats, media limits, selectors and receipt behavior for
your owned connections. It makes no provider requests; configuration
readiness and stored health do not prove live account permission.
Other local MCP clients can use the same command, arguments, and
environment settings. A dashboard key switch does not update their
configured key.
Claude Code and Cursor
Claude Code adds the same local server with one command. Replace
your-fanout-api-key with your saved key before you run it:
claude mcp add --env FANOUT_API_KEY=your-fanout-api-key --transport stdio socialfanout \
-- npx -y --package=https://socialfanout.com/downloads/socialfanout-mcp-0.1.6.tgz socialfanout-mcp
In Cursor,
add Social Fanout to Cursor,
then open Cursor's MCP settings and replace
your-fanout-api-key with your saved key. The link carries
only that placeholder, never a real key.
Already installed an older version?
Your MCP client keeps running the package version it was first set up with, so an earlier setup (0.1.4, for example) stays on that version until you replace it. To move to 0.1.6:
-
Claude Code: run
claude mcp remove socialfanout, then run theclaude mcp addcommand above again. Run both in the project folder where you first added Social Fanout: Claude Code saves servers per project by default. If remove says there is no server named socialfanout, switch to that folder first. If you added it with--scope user, runclaude mcp remove socialfanout -s userinstead.claude mcp listshows the package URL each server runs; it should end insocialfanout-mcp-0.1.6.tgz. -
Claude Desktop: install the extension above, then
delete the old
socialfanoutentry fromclaude_desktop_config.json, or replace that entry with the 0.1.6 configuration above. Restart Claude Desktop either way. -
Cursor: remove the
socialfanoutserver in Cursor's MCP settings, then use the add link above.
A direct API request
Use the REST API
Send your API key as x-api-key or
Authorization: Bearer. Replace the placeholders below
with your private key and the exact connected account's ID. This
example validates without posting:
curl https://socialfanout.com/v1/publish \
-H "content-type: application/json" \
-H "x-api-key: spk_..." \
-d '{
"accountId": "conn_...",
"platform": "bluesky",
"connectionId": "conn_...",
"text": "Hello from Social Fanout",
"mediaUrls": [],
"dryRun": true
}'
To fan out, use a targets array with up to 20 destinations.
Pin each exact account with an object such as
{"platform":"bluesky","accountId":"conn_..."}.
Inspect each target's results entry and the
summary; top-level ok is true only when every
target succeeds.
Private validation records a job without calling a provider or
consuming publish quota. Set dryRun to false
only after the owner approves the exact content, accounts, and
schedule. Never retry successful targets or treat a dry run as native proof.
If you send an Idempotency-Key, use a separate key for
validation and the approved live attempt. A cached key cannot switch
between validation and live mode; the API rejects that conflict. Keep the live key and body
unchanged while checking an unclear outcome; do not create a new attempt.
Destination availability
Connect only accounts you own or are authorized to use. Availability depends on provider approval, OAuth scopes, and account permissions. Check the live capability matrix before choosing a destination.
- Publishing and engagement are separate. TikTok, Facebook Page, standalone Instagram, and Threads publishing are approved and live for eligible accounts. Facebook Page Comments and Messenger are independently approved, Published, and available to eligible Page admins after separate per-Page authorization. Comments replies are sent only on an explicit request, and the dashboard requires a human click. Messenger remains customer-initiated, text-only, and inside 24 hours. Instagram Comments and Messages are available for eligible Professional accounts after separate authorization for each. Comments supports explicit replies, hide/unhide, and deletion of app-created replies. Messages supports customer-initiated, text-only replies inside 24 hours; automatic replies and media replies are not offered.
- LinkedIn accounts. LinkedIn member publishing is available for eligible connected profiles, with periodic reconnect when LinkedIn does not issue refresh access. LinkedIn Page publishing works for Pages administered by the connected member under Development Tier, and refreshable Page connections renew on publish; Standard Tier review is pending for unrestricted customer Page access. LinkedIn uses the dashboard, REST API, or local MCP; the current ChatGPT Action excludes it.
- Pinterest and YouTube are limited. Pinterest Standard access is active, and production OAuth/public-Board lookup are verified. Publishing remains limited while final publishing verification is completed. YouTube remains Limited pending required Google/YouTube reviews and live upload verification.
- Comments and replies on TikTok are unavailable for production use. That feature needs its own TikTok app, which requires provider approval, an eligible account grant, and native comment/reply verification before activation.
Limits are scoped to API keys. Paid checkout upgrades the exact customer-owned Free key selected before payment; the signed Stripe webhook completes the upgrade even if the browser never returns.