Cursor's agent can reach iHatePosting's hosted server from a few lines in mcp.json. Finish a feature, ask the agent to announce it, and it can check the post against each network's rules before saving it.
How do I connect iHatePosting to Cursor?
It takes about a minute. You can sign in and approve, or carry an API key instead — whichever you prefer.
- 1Step 1
Add iHatePosting to Cursor and sign in
Press Add to Cursor at the top of this page, let your browser open Cursor, and confirm the install there; if Cursor opens on its log-in screen, log in and press Add to Cursor again. Or paste this into ~/.cursor/mcp.json to have it in every project (on Windows, %USERPROFILE%\.cursor\mcp.json), or into .cursor/mcp.json in one project; if the file already has an mcpServers object, add only the ihateposting entry inside it, then save the file and restart Cursor. Either way, turn ihateposting on under Customize, then MCPs, and press Connect. Cursor opens your browser: sign in to iHatePosting and press Allow. There is no API key to create, paste or keep.
~/.cursor/mcp.json{ "mcpServers": { "ihateposting": { "url": "https://ihateposting.com/mcp/oauth" } } } - 2Step 2
Ask it to post
Tell Cursor what you want to say and where. It saves a draft in iHatePosting unless you ask for the post to go out now or at a set time.
Advanced: use an API key
Create a key in Settings → Developers first. Add to .cursor/mcp.json in your project root, or ~/.cursor/mcp.json for every project. Replace YOUR_API_KEY with your key.
{
"mcpServers": {
"ihateposting": {
"url": "https://ihateposting.com/mcp?client=cursor",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}What is different about Cursor
Every client reaches the same server, and then behaves like itself. These are the things that are true here and not somewhere else.
Put it in ~/.cursor/mcp.json to have it in every project (on Windows, %USERPROFILE%\.cursor\mcp.json), or in .cursor/mcp.json in one project. Cursor reads both; if a server has the same name in each, the project file wins.
If mcp.json already exists, add the ihateposting entry inside its existing mcpServers object rather than pasting a second one — two top-level objects in one file is not valid JSON.
The sign-in block holds no key. If you use the API key route instead, a project .cursor/mcp.json holding your key should not be committed — the global file keeps it out of your repository.
On the API key route: if the server shows as connected but every tool answers iHatePosting API 401, the key is wrong or has been replaced — create a new one in Settings → Developers. Cursor supports ${env:NAME} in headers, but a variable that is not set is sent as literal text and fails the same way, which is why writing the key is the reliable option.
Cloud Agents do not read your local mcp.json. Add the server for them from the MCP menu at cursor.com/agents, with your key typed into the Authorization header; ${env:NAME} does not work there.
To take a sign-in back, open Settings → Developers → Connected apps in iHatePosting and press Disconnect. It ends Cursor's access and nothing else, and no key changes.
Limits. On Enterprise plans an admin's MCP allowlist can block servers that are not approved; ask them to add our server address to the allowlist: https://ihateposting.com/mcp/oauth for the sign-in, or https://ihateposting.com/mcp for an API key
Anysphere's own documentation: Model Context Protocol in Cursor
Source on GitHub: github.com/iHatePostingOrg/agent-skill
Nothing goes out unless you say so
Every post Cursor writes is saved as a draft in iHatePosting unless you ask for it to be published now or at a set time. Publishing, rescheduling, retrying and deleting are marked as actions that change things, so clients that honour those markings ask you before they run them. Deleting a post in iHatePosting never removes one that is already live on a network.
What is the iHatePosting MCP?
MCP — the Model Context Protocol — is the standard way an assistant plugs into an app it does not own. Our server exposes the accounts you have connected to Cursor as tools, so it can draft, check and schedule without you opening a dashboard.
How Cursor uses it
- You add the connector once — by signing in, or with a key you create
- Cursor reads which accounts you have connected, and each network's rules
- It writes a version per network and checks it against those rules before sending
- It saves a draft, schedules it, or publishes — exactly as your message said
- It works alongside whatever other tools Cursor already has
# reads — nothing changes
whoami list_accounts
list_posts get_post
get_platform_rules get_analytics
list_media list_pinterest_boards
# writes — marked as changing things,
# so you are asked first
create_post update_post
validate_post reschedule_post
retry_post delete_post
upload_mediaCost, access and what to do when it breaks
What does it cost?
The connector costs nothing on top of iHatePosting. New accounts get a 90-day free trial with no credit card, and every network on this page is included in it. Paid plans are coming — you will be told what changes before it does.
How is access secured?
Either you sign in to iHatePosting and approve access, or you create an API key in Settings → Developers. That page can show your key again whenever you need it. Whichever route you take, it reaches only the accounts you have already connected, and you can revoke it at any time without touching the accounts themselves.
Something not working?
- It cannot see any accounts: connect them in iHatePosting first, then ask it to list them again.
- You regenerated your key and it still fails: Regenerate revokes the old key the moment you press it, and a client that is already running keeps sending the old one until you genuinely restart it.
- A post failed: open it in iHatePosting — the failure names the network and repeats what that network actually said.
Frequently asked questions
Do I need an API key to use iHatePosting in Cursor?
No. Add the sign-in block to mcp.json, restart Cursor, press Connect and sign in to iHatePosting in your browser. The API key route is still on this page, under Advanced, if you would rather keep a credential in the file.
Where does the iHatePosting entry go?
In the mcp.json file inside the .cursor folder in your home folder, to have it in every project, or in .cursor/mcp.json inside one project. If the file already exists, add the entry inside its existing mcpServers object instead of pasting a second one.
Should I commit .cursor/mcp.json?
The sign-in block holds no key. A block with your API key in it should not be committed; keep that one in the global file in your home folder.
Why does every tool answer iHatePosting API 401?
On the API key route: the key is wrong or has been replaced, or it comes from an ${env:NAME} variable that is not set, which Cursor sends as literal text. Create a new key in Settings → Developers and write it into the file.
Do Cursor's Cloud Agents use my mcp.json?
No. Add the server for them from the MCP menu at cursor.com/agents, with your key typed into the Authorization header; ${env:NAME} does not work there.
One connection reaches every network
Connect your accounts in iHatePosting once. From then on Cursor can post to any of them, and we publish at the time you set — even after you close the chat.
- Bluesky
- X
- Threads
- TikTok
- YouTube
- Mastodon
- Telegram
- Discord
- Tumblr
- Slack
Ready to post everywhere from Cursor?
Start your 90-day free trial — no credit card, about a minute to your first post.
Sign Up