Skip to content
SocialsForAI
Menu

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.

json
{
  "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, then create_post with dry_run: true and platform_options.bluesky.text. After your yes, the same call without dry_run.
  • "What did we post this week, and did anything fail?" Calls list_posts, then get_post for any post whose status isn't published, and reads you the error.fix for 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.

text
// 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 npx works in a terminal, and read the logs. The MCP guide puts them in ~/Library/Logs/Claude on macOS (mcp*.log) and %APPDATA%\Claude\logs on Windows.
  • Connection fails only on Windows: you probably have a space after Authorization: inside args. Move the Bearer sk_... value into env as 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_HEADER value is wrong or the key was revoked. It must read Bearer sk_..., with the word Bearer and one space.

Set up Claude Desktop in five steps

  1. 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.

  2. 02

    Open the config file

    In Claude Desktop, open Settings, then the Developer tab, then Edit Config.

  3. 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.

  4. 04

    Restart Claude Desktop

    Quit the app fully and reopen it. The socials tools appear under connectors.

  5. 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.

Get an API key and send your first post in five minutes.