Post to social media from Cursor
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.
Set it up
1. Create an iHatePosting API key
Sign in, open Settings → Developers and create a key. It starts with pk_live_ and is shown in full only once, so copy it before you leave the page.
2. Add iHatePosting to Cursor
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", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } }3. 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.
What is different about Cursor
- 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.
- Save the file and restart Cursor, then turn the server on under Customize, then MCPs. A project .cursor/mcp.json holding your key should not be committed — the global file keeps it out of your repository.
- 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.
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
Anysphere's own documentation: Model Context Protocol in Cursor
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.
Frequently asked questions
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?
Not while it holds your key. The global file in your home folder keeps the key out of your repository.
Why does every tool answer iHatePosting API 401?
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.
Ready to post everywhere from Cursor?
Start your 90-day free trial — no credit card, about a minute to your first post.
Sign Up