Post to social media from your AI agent
Your agent can already write the post. What it usually cannot do is send it — so you copy the text out, open a scheduler, pick the accounts, and set a time by hand. iHatePosting speaks the Model Context Protocol, so any MCP client can do that part itself: check what a platform will accept, attach a picture, schedule it, and tell you afterwards how it did.
What MCP actually is
The Model Context Protocol is a standard way for an AI agent to borrow tools from another program. You point your agent at a server, it discovers what that server can do, and those abilities become things it can use in conversation. There is no plugin to build and nothing to keep updated — the agent asks the server what it offers each time it connects.
iHatePosting runs one over HTTPS, so most clients need a URL and an API key and nothing else. Claude, Claude Cowork, Cursor and Grok Build can also be added by signing in, with no key to carry — Claude in one click from its connector directory. There is also an npm package for the handful of clients that spawn a local process instead.
What your agent can do once it is connected
- See which accounts you have connected, and which of them are healthy.
- Ask what each network will accept before writing anything — character limits, whether a picture is required, which options are mandatory.
- Check a draft against every platform you plan to send it to, without creating anything.
- Upload an image or video, or reuse one already in your library.
- Create a post as a draft, schedule it for a date and time, or publish it now.
- Read a post back, rewrite it, move it to a different time, or delete it.
- Retry a send that failed, without touching the ones that worked.
- Read how the posts performed — per network, with the top ones named.
Set it up
Create an API key
In iHatePosting, open Settings → Developers and create a key. You can show it again from that screen whenever you need it. Using Claude? Skip this — add iHatePosting from https://claude.ai/directory/ihateposting instead, sign in, and there is no key at all. Cursor and Grok Build can sign in without a key too; their pages under /ai-agents show how.
Pick your client
The same screen has a ready-made config block for each client below. Choose yours and copy it.
Paste it into that client's config file
The table below says which file, and the block itself carries the key.
Restart the client
Most read their MCP config at startup. Your agent should then be able to list your connected accounts.
Ask it to check before it posts
A good first instruction is “list my accounts, then validate this post for the ones I named” — it will tell you what each network makes of it before anything is created.
Where each client keeps its MCP config
Clients agree on the protocol and on very little else. These are the files they actually read, and the key each one nests its servers under — worth checking against your own client, because a block pasted into the right file under the wrong key fails silently.
| Client | Config file | Root key |
|---|---|---|
| Claude Code | ~/.claude.json (written by: claude mcp add --transport http --scope user) | mcpServers |
| Claude Desktop | claude_desktop_config.json | mcpServers |
| Claude (web) | One click from claude.ai/directory/ihateposting (no key), or Customize → Connectors | — |
| ChatGPT | Developer mode, then chatgpt.com/plugins → + | — |
| Dots | Connected in ChatGPT, under Plugins — a dot shares it | — |
| Cursor | ~/.cursor/mcp.json | mcpServers |
| VS Code / Copilot | .vscode/mcp.json | servers |
| Cline | ~/.cline/data/settings/cline_mcp_settings.json | mcpServers |
| Windsurf / Devin Desktop | ~/.config/devin/mcp_config.json | mcpServers (with url) |
| Zed | ~/.config/zed/settings.json | context_servers |
| Hermes Agent | ~/.hermes/config.yaml (YAML) | mcp_servers |
| OpenClaw | ~/.openclaw/openclaw.json | mcp.servers |
| Kilo Code | ~/.config/kilo/kilo.jsonc | mcp |
| OpenHands CLI | ~/.openhands/mcp.json | mcpServers |
| Codex | ~/.codex/config.toml (TOML) | mcp_servers |
| Gemini CLI | ~/.gemini/settings.json | mcpServers |
| Amp | Amp settings.json | amp.mcpServers |
| omp | ~/.omp/agent/mcp.json or .omp/mcp.json | mcpServers |
| Freebuff CLI | ~/.agents/mcp.json or .agents/mcp.json | mcpServers |
| DeepSeek Harness | ~/.dsh/profiles/web/cordis.patch.yml (YAML) | insert (an item in a top-level YAML list) |
| Warp | Settings → Agents → MCP servers → + Add | — |
| Grok Build | ~/.grok/config.toml (TOML), or run: grok mcp add --transport http | mcp_servers |
| Antigravity CLI | ~/.gemini/config/mcp_config.json | mcpServers (with serverUrl) |
| NanoClaw | run: ncl groups config add-mcp-server | — |
| Kimi Code | ~/.kimi-code/mcp.json | mcpServers |
| Perplexity | Account settings → Connectors | — |
| Paperclip | Connectors → Connect your own tool | — |
| Muse | a message asking Muse to build the connector | — |
Two things that catch people out
Transport names differ. The same connection is called streamable-http by one client, streamableHttp by another and plain http by a third, and one or two default to the older SSE transport if you do not say otherwise — which this server does not serve. Where that matters, the config block in Settings already sets it.
Times are read in your account's timezone, not your computer's. If you tell an agent “schedule this for nine in the morning”, nine means nine where your iHatePosting profile says you are. Set that under Settings → Scheduling before you let an agent book anything.
Frequently asked questions
Do I need a paid plan to use the MCP server?
No. The API, the MCP server and webhooks are on every plan. You only need an API key, which you create in Settings → Developers.
Can an agent publish without asking me?
Only if you tell it to. Creating a post defaults to a draft, and publishing immediately is a separate, explicit instruction. Most clients also ask you to approve a tool the first time it is used.
What happens if the agent writes something a platform will not accept?
It is told before anything is created. The same checks the publisher runs seconds before it posts are available to the agent up front — so it learns that X counts a post as 600 of 280 characters, or that a Pin needs a board, while it can still fix it.
Can an agent see my other accounts, or anyone else's data?
No. An API key is scoped to the one iHatePosting account that created it. Every request is checked against that account, and anything belonging to another user simply is not there.
What if my client only supports a local process, not a URL?
Use the npm package instead — npx ihateposting-mcp, with your key in the IHATEPOSTING_API_KEY environment variable. Settings → Developers gives you that block too.
Can I stop an agent using my account later?
Yes, and how depends on the route. For an agent using a key: regenerate it in Settings → Developers — the old one stops working immediately, everywhere it was configured. For one you added by signing in there is no key to regenerate, so a new key changes nothing: open Settings → Developers → Connected apps and press Disconnect, which closes that one agent and leaves the rest alone.
Ready to post everywhere in one click?
Start your 90-day free trial — no credit card, about a minute to your first post.
Sign Up