Post to social media from Devin Desktop
Devin Desktop is Cognition's editor, the new name for Windsurf, and once you connect iHatePosting its Devin Local agent can post to your social accounts. It reads MCP servers from mcp_config.json, so a url and an Authorization header are enough to reach our hosted server. Devin asks before it calls any of our tools, and what it writes is saved as a draft unless you ask for the post to go out now or at a set time.
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 Devin Desktop
Add to ~/.config/devin/mcp_config.json. On Windows that is %APPDATA%\devin\mcp_config.json. Devin Desktop is the new name for Windsurf, and its Devin Local agent reads this file. On Linux the folder is lowercase devin: ~/.config/Devin, with a capital D, is the app's own folder. Working in a WSL, SSH or dev-container window? Edit the file on that remote machine. If you added iHatePosting to ~/.codeium/windsurf/mcp_config.json before, delete that entry: Devin still imports that file, and two entries can clash. On an older build that still uses the Cascade agent, paste the block into the file that Cascade's Open MCP config file opens, and rename url to serverUrl. 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 Devin Desktop 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 Devin Desktop
- Put the block in ~/.config/devin/mcp_config.json to have it in every project. On Windows that file is %APPDATA%\devin\mcp_config.json. Devin uses mcpServers as the root key in every one of these files, and its field table marks url as the only required field for a remote server: transport defaults to http and headers is optional. The project file, .devin/mcp_config.json, is shared through version control, so your key does not belong in it — to keep your key out of a shared file, use .devin/mcp_config.local.json, which Devin gitignores.
- Keep the field name url. Devin Local requires it, and the Cascade MCP page says an HTTP server requires a serverUrl or url field, so url is the one spelling that works on both. Cognition's changelog entry for 8 September 2026 reads: “Cascade has been removed. Devin Local is now the only agent available in Devin Desktop.” On a Cascade build from 2025, whose docs named only serverUrl, rename url to serverUrl.
- Devin asks before it runs an iHatePosting tool. Its docs say the Devin Local agent prompts for approval before calling any MCP tool by default, and the prompt offers to allow that one tool or every tool on the server, for the session or permanently. To stop the prompts up front, add mcp__ihateposting__* to the allow list under permissions — that block lives in config.json, not mcp_config.json, at ~/.config/devin/config.json or .devin/config.json in a project.
- Working in a WSL, SSH or dev-container window? Edit the file on that machine. Cognition's changelog entry for 10 August 2026 reads: “Codemaps and MCP configuration files now open from the remote machine when connected over WSL, SSH, or a dev container.”
- See what Devin loaded under Open customizations, from the new-tab menu in an agent space or the right-click menu on a Devin Local session in the agent sidebar: it lists the rules, skills, hooks, MCP servers and plugins a session has. Appearing there does not prove your key works. Our server answers before it checks anything, so a wrong key shows up only when a tool runs, as iHatePosting API 401. Ask Devin to run whoami — it names the tool mcp__ihateposting__whoami — and it comes back with the account your key belongs to.
- Use the Devin CLI for a one-command route, if you have it: it writes the same files Devin Local reads. Keep --scope user, because devin mcp add defaults to local, meaning this project only: devin mcp add --scope user --transport http --header "Authorization: Bearer YOUR_API_KEY" ihateposting https://ihateposting.com/mcp
Limits. Devin's pricing page lists Free, Pro, Max, Teams and Enterprise plans and names no MCP limit on any of them. Admins can restrict MCP, though: Cognition's local agent controls let an organisation set MCP servers, allowlisted MCP servers and MCP registry URLs for both Devin Desktop and the Devin CLI, enterprise-enforced rules take precedence over your own config, and an organisation's list replaces the root-level list rather than merging with it. Ask your admin to add our server address to the allowlist: https://ihateposting.com/mcp
Cognition's own documentation: MCP configuration in Devin
Nothing goes out unless you say so
Every post Devin Desktop 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 ~/.config/devin/mcp_config.json to have it in every project, or %APPDATA%\devin\mcp_config.json on Windows. If the file already exists, add the ihateposting entry inside its mcpServers object rather than pasting a second one. Devin uses mcpServers as the root key in every one of these files. Avoid the project file .devin/mcp_config.json while the block holds your key, because that file is shared through version control — .devin/mcp_config.local.json is the gitignored one.
Should I write url or serverUrl?
Write url. Devin's field table marks url as the only required field for a remote server, and the Cascade MCP page says an HTTP server requires a serverUrl or url field, so url works on both. Cascade was removed on 8 September 2026 and Devin Local is now the only agent in Devin Desktop. Rename url to serverUrl only on a Cascade build from 2025, whose docs named only serverUrl.
Why does Devin ask before every iHatePosting tool?
Because the Devin Local agent prompts for approval before calling any MCP tool by default. The prompt offers to allow that one tool or every tool on the server, for the session or permanently. To stop the prompts, add mcp__ihateposting__* to the allow list under permissions in config.json, which is a different file from mcp_config.json.
How do I check that my key works?
Ask Devin to run the whoami tool, which it names mcp__ihateposting__whoami. It returns the iHatePosting account your key belongs to. Seeing our server under Open customizations only means Devin read your config: our server answers even when the key is wrong, and every tool then returns iHatePosting API 401.
Ready to post everywhere from Devin Desktop?
Start your 90-day free trial — no credit card, about a minute to your first post.
Sign Up