Schedule social media posts with Windsurf
Add Postozo to Windsurf's MCP config. Then ask its agent to write and schedule posts from your project.

How to connect Postozo to Windsurf
You need a Postozo account with at least 1 connected channel. Windsurf connects to Postozo's MCP server at https://app.postozo.com/mcp using an API key header.
- In Postozo, open Settings, Developers and copy your API key. It starts with
pz_live_. Treat it like a password. - In the agent panel, open the ... menu and choose Open MCP config file. This opens
mcp_config.json. The current docs place it at~/.config/devin/mcp_config.jsonon macOS and Linux and%APPDATA%\devin\mcp_config.jsonon Windows. - Add Postozo:
{
"mcpServers": {
"postozo": {
"serverUrl": "https://app.postozo.com/mcp",
"headers": { "Authorization": "Bearer ${env:POSTOZO_API_KEY}" }
}
}
}- Set
POSTOZO_API_KEYin your environment and save the file. Restart the app if the server does not appear. Then ask: "List my Postozo channels".
Windsurf's MCP documentation now lives on docs.devin.ai. It supports OAuth for remote servers too. On Enterprise plans an admin must turn MCP on, and Teams can limit which servers are allowed.
Check it works
Ask the agent: "List my Postozo channels."
What Windsurf can do with Postozo
Postozo gives Windsurf up to 30 tools. A normal flow is: list your channels, read the rules of each network, check the post, find a free slot, then schedule it once you say yes.
| Tool | What it does | Changes data |
|---|---|---|
list_channels | List the connected social channels (accounts, pages) with their id, network, name and status. Call this first to get channel ids. | No |
list_networks | List every network this server supports and whether it can be connected. Useful to explain what is possible. | No |
list_customers | List customers. A customer groups channels (agencies use 1 per client). | No |
get_channel_rules | Get the posting rules for 1 channel: max length, media needs, whether comments are supported, and the settings schema (some settings are required, for example a title on YouTube or a board on Pinterest). Read before scheduling to that channel. | No |
find_free_slot | Find free posting times for these channels. Give count to get several times, each on a different day (use it to plan a week). Give after to start from a date, for example next Monday. Uses each channel's posting times (times of day in the user's local time). Returns an ISO date in UTC, or dates when count is given. | No |
check_post | Check a post against every channel's rules without saving it. Returns a list of problems (empty means it is fine). | No |
schedule_post | Create or edit a post for 1 or more channels. Supports drafts, scheduling, posting now, client review, threads with delays, per-channel text, network settings, tags and repeats. Returns the post id, its status and a preview link. | Yes |
list_posts | List posts on the calendar between 2 dates (default: last 7 days to next 30 days). | No |
get_post | Get 1 post with its text per channel, state per channel (queued, published, error...), links to the live posts, errors with a fix, comments and history. | No |
change_post_date | Move a post to a new date and time. | Yes |
schedule_draft | Schedule a saved draft at the time it already has (or right away if that time has passed). Keeps its text, channels and settings. Use the post id from schedule_post or list_posts. Only after the user says yes. | Yes |
list_businesses | List the businesses in this workspace (each client of an agency is 1 business; channels without a client belong to the workspace itself), with their channels, how complete each business profile is, and whether the client approves posts. Call this before planning or writing for businesses. | No |
get_business_profile | Read 1 business profile: what it does, audience, area, website, what to promote now, topics, tone, words to use and avoid, hashtags, language, posts per week. | No |
update_business_profile | Save facts about a business so every future post uses them, for example a new offer, an event, opening hours, a new product, the tone, or how many posts per week. Only the fields you send change. | Yes |
fill_profile_from_website | Read a business website and fill the empty fields of its profile (what it does, audience, area, tone, offers, topics, hashtags, language). Fields that already have text are kept. | Yes |
plan_posts | Plan and write posts for 1 or many businesses at once and save them as DRAFTS (nothing goes live). Uses each business profile, its channels, its posting times and its recent posts; the user does not need to give ideas. Runs in the background; the app shows the progress and a summary with Schedule buttons. Use it for a week, a month, several posts, or more than 1 business. | Yes |
get_plan | Progress and summary of a plan: per business, how many posts, how many still drafts, scheduled or waiting for the client, and problems such as posts that need a photo. | No |
schedule_plan | Schedule the drafts of a plan at their planned times (all businesses, or 1). Clients that approve posts get them for approval. Only after the user says yes. | Yes |
add_plan_photos | Make an AI photo for every draft of a plan that needs one (Instagram and other photo networks) and attach it, using the photo idea written for each post. Uses 1 image credit per photo. Runs in the background. | Yes |
discard_plan | Delete the drafts of a plan that were not scheduled (all businesses, or 1). Only after the user says yes. | Yes |
retry_post | Retry the channels of a post that failed or could not be confirmed. Only use after the user confirms the post is not already live. | Yes |
delete_post | Delete a post from the calendar. Posts already live on a network stay live there. | Yes |
upload_media_from_url | Import an image or video from a public URL into the media library. Returns a media id to use in schedule_post. | Yes |
list_media | List files in the media library. | No |
list_tags | List tags used to label posts. | No |
get_analytics | Get account statistics for 1 channel from its network (7, 30 or 90 days). Some networks do not share statistics. | No |
get_post_analytics | Get statistics for 1 published post on 1 channel. Use the per-channel post id from get_post (channels[].root.id). | No |
get_workspace_stats | Counts from this workspace: posts by state, published posts per channel, and short link clicks. | No |
run_channel_tool | Run a network helper for 1 channel, for example list Pinterest boards, Reddit flairs or YouTube playlists, to fill a setting. get_channel_rules lists the tools for each channel. | No |
generate_image | Create an image with AI from a description and save it to the media library. Uses 1 image credit. Returns a media id. Only when AI images are turned on for your workspace. | Yes |
The server also offers 2 ready prompts: plan_week (plan 5 posts for the next 7 days about a topic) and repurpose (turn a link or text into 1 post per channel).
Example prompts
- "Summarise this week's merged pull requests as a LinkedIn post and save it as a draft."
- "Write a Mastodon and Bluesky post about the new release, each within its limit."
- "Schedule the draft for tomorrow at a free time."
- "Which of my channels need to be reconnected?"
- "Check this post against every channel's rules."
- "Show me what is on the calendar for the next 7 days."
Safety and control
- 17 of the tools only read. The 13 that change data (schedule_post, change_post_date, schedule_draft, update_business_profile, fill_profile_from_website, plan_posts, schedule_plan, add_plan_photos, discard_plan, retry_post, delete_post, upload_media_from_url and generate_image) are marked as write tools, so Windsurf can ask you before it runs them.
- The server tells the AI to confirm the text, channels and time with you before it schedules or publishes.
- Ask for drafts ("save as drafts") or for client review ("send for approval") when you want a human to check first.
- A post is never sent twice. If Postozo cannot confirm a post went live, it marks it "could not confirm" instead of retrying on its own.
- Remove access any time in Postozo under Settings, Approved Apps, or by creating a new API key.
Technical details: MCP server reference, with every tool and its inputs, and the developer docs.
Sources
Can Windsurf schedule posts with Postozo?
Yes. After you add Postozo's MCP server, Windsurf can list your channels, check each network's rules, find free times and create drafts, scheduled posts or posts for client approval.
Is it serverUrl or url?
Windsurf's docs accept serverUrl or url for remote servers. The example uses serverUrl.
My older Windsurf install uses a different path. What now?
Use the Open MCP config file menu. It always opens the file your version reads.
Can I use OAuth instead of a key?
Windsurf's docs say OAuth is supported for remote servers. We document the key header because it needs no extra steps.
Does it cost extra?
No. The API and MCP server are included in every Postozo plan. Windsurf has its own plans and limits.
Connect Windsurf to Postozo
Start a 7-day free trial, connect your channels, then add the server.
7 day free trial. No card needed.