Post to social media from Claude Desktop
Post from Claude Desktop without leaving the chat.
Add one entry to Claude Desktop's config. Claude drafts, dry runs and publishes, and asks before each action.
The short answer · Updated Nov 1, 2026
To post to social media from Claude Desktop, add SocialsForAI's MCP server to claude_desktop_config.json through mcp-remote, which connects to https://socialsforai.com/api/mcp and sends your API key as an Authorization header. Restart Claude Desktop, then ask Claude to list your accounts; if none are connected it gives you a connect link.
What Claude Desktop is
Claude Desktop is Anthropic's app for macOS, Windows and Linux. The MCP project's guide to connecting servers uses it as the example client: servers are declared in a JSON config file, and each tool call needs your approval before it runs.
The config file starts local servers as commands. Our server is remote, so mcp-remote, a small npm package, runs locally and forwards each request to our URL with your key in the header. It needs Node.js, since Claude Desktop starts it with npx.
Config file entry
Open the file from Claude Desktop's Settings, Developer tab, Edit Config. Per the MCP guide it lives at ~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %APPDATA%\Claude\claude_desktop_config.json on Windows and ~/.config/Claude/claude_desktop_config.json on Linux. Add the socials entry inside mcpServers, keeping any servers you already have:
Two details from the mcp-remote README. The header is written Authorization:${AUTH_HEADER} with no space, because some clients, Claude Desktop on Windows among them, don't escape spaces inside args; the space goes in the env value instead. And after saving, quit Claude Desktop completely and reopen it, since the config is only read at startup.
{
"mcpServers": {
"socials": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://socialsforai.com/api/mcp",
"--header", "Authorization:${AUTH_HEADER}"],
"env": { "AUTH_HEADER": "Bearer sk_..." }
}
}
}What Claude Desktop can call
After the restart, the socials server's eight tools appear under connectors: list_accounts, create_post, get_post and the rest. Claude picks them from what you ask for in the chat. Each one's inputs are documented on the hub under every tool and its inputs; the two you'll see most in a writing session are create_post and get_post.
Three prompts to start with
Claude Desktop is where you already write, so these lean on pasting text into the chat.
- "Here's my blog post. Turn it into a LinkedIn post under 1,500 characters and a Bluesky post under 300, dry run both, and show me the previews." Calls
list_accounts, thencreate_postwithdry_run: trueandplatform_options.bluesky.text. After your yes, the same call withoutdry_run. - "What did we post this week, and did anything fail?" Calls
list_posts, thenget_postfor any post whose status isn'tpublished, and reads you theerror.fixfor each failed account. - "How many accounts are active this month and what would that cost?" Calls
get_usage. An account counts as active once it publishes in a month; see pricing.
From a pasted draft to a published post
The first prompt in practice. You paste the article; Claude writes a LinkedIn version and a shorter Bluesky version, and sends both in one dry-run call, with the Bluesky wording in platform_options. Claude Desktop shows you the call's arguments in its approval prompt, and the preview comes back in the chat. When you say it's good, Claude sends the same body without dry_run and with an idempotency_key, so a dropped connection that leads Claude to try again can't post twice.
The result has one target per account. A Bluesky target links to bsky.app; if a LinkedIn account had an expired token, its target would show account_needs_reauth while the Bluesky post still goes out. Ids are left out here for brevity.
// You paste a blog post; Claude proposes two versions
create_post({
"accounts": ["acc_Li4nKd8Qp2Zr7TmX", "acc_Bs2rTq8Lm5Wn1KdP"],
"text": "<1,400-character LinkedIn version>",
"platform_options": { "bluesky": { "text": "<280-grapheme Bluesky version>" } },
"dry_run": true
})
→ { "object": "preflight", "ok": true, "issues": [], "preview": [ ... ] }
// After you approve in the chat and on the tool prompt
create_post({ ...same body without dry_run..., "idempotency_key": "blog-2026-11-01" })
→ { "status": "published", "targets": [ { "platform": "bluesky", "url": "https://bsky.app/profile/...", ... }, ... ] }Approving tool calls in Claude Desktop
Claude Desktop asks for approval before running a tool, per the MCP guide. Read the create_post arguments in that prompt, including dry_run, before you allow it. Approve the read-only tools freely and slow down on the publish. A prompt with dry_run: true is safe to allow; one without it publishes. The other safeguards, which run on our side whatever the client does, are under keeping a human in the loop.
When Claude Desktop can't reach the server
Problems specific to Claude Desktop are almost always in the config file or in starting mcp-remote. Once a tool runs, any error it returns has a code and a fix; each code is explained in the error reference.
- The socials tools don't appear after restart: check the JSON syntax, confirm
npxworks in a terminal, and read the logs. The MCP guide puts them in~/Library/Logs/Claudeon macOS (mcp*.log) and%APPDATA%\Claude\logson Windows. - Connection fails only on Windows: you probably have a space after
Authorization:insideargs. Move theBearer sk_...value intoenvas shown. - You edited the file but nothing changed: the config is read at startup only, so quit Claude Desktop completely and reopen it.
- The server starts but every call is refused: the
AUTH_HEADERvalue is wrong or the key was revoked. It must readBearer sk_..., with the word Bearer and one space.
Set up Claude Desktop in five steps
- 01
Get a key and check Node.js
Create a workspace at /signup for an sk_ key. Run npx --version in a terminal; Claude Desktop needs it to start mcp-remote.
- 02
Open the config file
In Claude Desktop, open Settings, then the Developer tab, then Edit Config.
- 03
Add the socials server
Add an entry that runs npx -y mcp-remote https://socialsforai.com/api/mcp --header Authorization:${AUTH_HEADER}, with AUTH_HEADER set to Bearer sk_... in env. Save the file.
- 04
Restart Claude Desktop
Quit the app fully and reopen it. The socials tools appear under connectors.
- 05
Ask Claude for a connect link
In a new chat, ask which social accounts are connected. With none, Claude offers a link; open it in your browser, approve, and come back to the chat.
Questions
What developers ask
Why does Claude Desktop need mcp-remote?
The config file launches servers as local commands. mcp-remote is a local command that forwards to our remote server and adds your Authorization header.
Can I add the server as a custom connector instead?
Our server authenticates with a bearer API key, so use the mcp-remote config, which lets you set the header.
Where is claude_desktop_config.json?
macOS: ~/Library/Application Support/Claude/. Windows: %APPDATA%\Claude\. Linux: ~/.config/Claude/. Settings, Developer, Edit Config opens it.
Can I post to LinkedIn from Claude Desktop?
Yes, to personal profiles; Company Pages aren't supported. X, Bluesky, Mastodon and Telegram work too.
Is my API key stored safely?
It sits in your local config file in plain text, like any key in a config file. Keep the file private and revoke the key if it leaks.
Where are Claude Desktop's MCP logs?
Per the MCP guide, ~/Library/Logs/Claude on macOS, in files named mcp*.log, and %APPDATA%\Claude\logs on Windows.
Keep reading
Get an API key and send your first post in five minutes.