How to post to Facebook from Claude Desktop
For someone who runs a Page and never opens a terminal this is the simplest setup. Describe the post in a chat and it lands on the Page at the time you asked for.
How do I post to Facebook from Claude Desktop?
Add the planpo.st MCP server to Claude Desktop, connect Facebook once in the dashboard, then ask. The first three steps are one-time.
- 1
Create an API key and add planpo.st to Claude Desktop
Make a scoped key in planpo.st under Settings. Open Settings, then Connectors, then Add custom connector, and enter the planpo.st URL with an Authorization header. Or add the local npx entry to claude_desktop_config.json and restart the app, since it reads that file only on launch.
- 2
Confirm the server is connected
Start a new chat and check that the planpost tools appear in the tools menu.
- 3
Connect Facebook
Connect a Facebook Page in the dashboard under Connections. planpo.st publishes to Pages; each Page is one connection, and the agent can produce the connect URL with get_connection_link.
- 4
Know what the post needs
A Facebook post needs text and nothing else. The limit is 63,206 characters, media is optional and no platformSettings are required.
- 5
Ask in a chat window
Say what to post and when. Claude Desktop finds the Facebook connection, creates the post, and tells you whether it was scheduled or kept as a draft, with the reason.
Settings -> Connectors -> Add custom connector
Name: PlanPost
URL: https://mcp.planpo.st/mcp
Then add the header:
Authorization: Bearer pk_live_xxx{
"mcpServers": {
"planpost": {
"command": "npx",
"args": ["-y", "planpost-mcp"],
"env": { "PLANPOST_API_KEY": "pk_live_xxx" }
}
}
}Config location: macOS: ~/Library/Application Support/Claude/claude_desktop_config.json · Windows: %APPDATA%\Claude\claude_desktop_config.json. Replace pk_live_xxx with your own key.
Hosted or local for Claude Desktop?
For Claude Desktop the custom connector is the easy route: two fields in Settings and no file to edit. Choose the local config when you want the key in a file on your own disk, and remember the app reads that file only when it starts.
- Restart Claude Desktop after editing the config file. It only reads it on launch.
The full walkthrough is on the Claude Desktop setup page.
What can Claude Desktop do on Facebook?
It can publish text posts with a link preview, single photos, multi-photo posts, videos and Reels to a Page, and it can leave a post unpublished as a draft on the Page. It cannot post to a personal profile or publish Facebook Stories.
Text and link
A text post. The first URL in it is attached as the link, which is what makes Facebook draw the preview card.
Photos
One image is a photo post, several are a multi-photo post.
Video or Reel
postType "reel" publishes a Reel. A portrait video of 180 seconds or less is routed to Reels as well.
Draft on the Page
optionalpublishAsDraft creates the post unpublished, for someone to review and publish inside Facebook.
Attachments are optional on Facebook. When a post should carry one, that is the one awkward part of this pairing. Claude Desktop reaches planpo.st through the connector and has no shell to PUT a file from your disk to an upload URL. Two routes work: upload the file in the planpo.st dashboard and let Claude Desktop pick it with list_media, or ask for a carousel rendered from text with render_carousel.
Which settings does a Facebook post take?
Facebook reads two settings, both optional. Which Page receives the post is decided by the connection, not by a setting.
| Field | Allowed values | If you leave it out | Worth knowing |
|---|---|---|---|
| platformSettings.facebook.publishAsDraft | true or false | false, published live | true creates the post unpublished on the Page. It stays there until someone publishes it in Facebook. |
| platformSettings.facebook.isReel | true or false | Set from postType | postType "reel" or "short" sets it. A portrait video up to 180 seconds becomes a Reel without it. |
| postType | "post" or "reel" | "post" | "story" is accepted with a Facebook connection and has no Story publisher behind it, so do not use it for Facebook. |
| platformSettings.facebook.pageId | Not read | The connection's Page | Pick the Page with connectionIds. One connection is one Page. |
| platformContent.facebook | Text, 63,206 characters or fewer | The shared content | In practice the limit is never the problem. |
| media, platformMedia.facebook | Images, or one video | Text post | The first attachment decides the kind of post. With a video first, only that video is used. |
What do I type to post to Facebook from Claude Desktop?
Plain requests work. Each example lists the tool calls Claude Desktop makes in response.
1. Page post with a preview card
You say
Use the draft we wrote above in this chat. Write a short Facebook Page post about it with the link to the full write-up, and schedule it for tomorrow 08:30.
Tool calls
create_post({ content: "<two or three sentences> https://...", connectionIds: ["<page id>"], schedule: "tomorrow 08:30" })A scheduled text post. At publish the first URL is attached as the link, so the Page shows the preview card and the link is tracked.
2. Leave it as a draft on the Page
You say
Read the document I attached. Prepare a Facebook post from it for the client's Page, but as an unpublished draft there. They want to press publish themselves.
Tool calls
create_post({ content: "<post text>", platformSettings: { facebook: { publishAsDraft: true } }, connectionIds: ["<client page id>"], schedule: "today 15:00" })At 15:00 the post is created on the Page as a draft, not shown to followers. The client finds it in the Page's own tools.
3. A photo set
You say
Use the newest image in my planpo.st media library. Add the three other photos from the same shoot in my library and publish them together on the Page on Saturday 10:00.
Tool calls
list_media({ type: "image" })
list_media({ type: "image" })
create_post({ content: "<caption>", media: [<4 images>], connectionIds: ["<page id>"], schedule: "saturday 10:00" })One multi-photo post. list_media returns items already shaped for the media array, so they pass straight through.
What stops a Facebook post from Claude Desktop?
The tag on a card is the code that comes back in the tool result.
Pages only
The publisher posts to the Page behind the connection. Personal profiles and groups are not targets.
No Facebook Stories
Stories are published for Instagram. A Facebook connection has no Story path, so a "story" post would go out as an ordinary photo or video.
The first URL becomes the card
In a text post the first link is the one Facebook previews. Put the link you care about first, or keep it to one.
Vertical video goes to Reels
Portrait video of 180 seconds or less is sent as a Reel even with post type "post". Landscape video stays a regular video post.
One video per post
When the first attachment is a video, the rest are ignored. Photos and video do not mix in one post.
63,206 characters
char_limitThe check exists and you will not hit it by accident.
Restart after editing the config
Claude DesktopClaude Desktop reads claude_desktop_config.json when it starts. An edit made while it is open does nothing until you quit and reopen it.
Can Claude Desktop tell me what a Facebook post earned?
Yes. Links in Facebook posts are clickable and the first one becomes the preview card, so a tracked link gets clicks that payments can be matched to. get_revenue_overview returns the totals and recent transactions. Pages that sell physical products tend to have Shopify behind them, and that is the integration I would connect first.
Claude Desktop and Facebook: questions people ask
- Can Claude Desktop upload an image from my machine for Facebook?
- Not directly. Claude Desktop reaches planpo.st through the connector and has no shell to PUT a file from your disk to an upload URL. Upload the file in the dashboard and Claude Desktop finds it with list_media, or have it render one: render_carousel makes branded images from text.
- Can it post to my personal Facebook profile?
- No. It publishes to Facebook Pages. Each connected Page has its own connection ID.
- What does publishAsDraft do?
- It creates the post on the Page unpublished. Nobody sees it until someone publishes it from Facebook's own tools, which suits a client who wants the last click.
- What happens when Claude Desktop sends a Facebook post that breaks a rule?
- It is told at once. The usual case on Facebook is a Page whose connection has lapsed: the post is kept as a draft and the tool result carries connection_inactive plus the fix, which Claude Desktop applies with update_post.
- Do I have to edit a config file?
- No. The custom connector in Settings takes the URL and the key and needs no file. The config file route exists for the local server, if you would rather the key stayed on your machine while you post to Facebook.
- Will it post without showing me the text?
- Claude Desktop asks before it uses a tool unless you have allowed it for the session, so you see the Facebook post in the tool call first. Asking for drafts gives you a second look in the dashboard.
Keep going
Facebook from other agents
Other networks from Claude Desktop