DeepSeek Harness + iHatePosting

Post to social media from DeepSeek Harness

Connect DeepSeek Harness to iHatePosting and ask it to write, schedule and publish posts to 15 social networks. iHatePosting's hosted MCP server gives DeepSeek Harness 16 tools to create, reschedule and check posts, with you approving everything in one calendar. Setup takes about a minute and is included in the free 90-day trial.

Add iHatePosting to DeepSeek Harness as one mcp-client patch block, and ask it to draft, schedule and publish posts to 15 social networks. Free 90-day trial.

Nothing is published unless you ask for it in that message.

Autonomous agentsDeepSeek AI

DeepSeek Harness is an open-source agent harness from DeepSeek AI, and once you connect iHatePosting it can draft, schedule and publish posts to 15 social networks. You run it with npx @deepseek-ai/dsh web, which opens its web interface at http://127.0.0.1:3080 in your browser. No dsh mcp add or list command is documented: you add a server by inserting an @deepseek-ai/dsh-mcp-client plugin into a Cordis patch file, and the shipped hot-reload plugin applies the edit while the harness runs.

How do I connect iHatePosting to DeepSeek Harness?

It takes about a minute. Nothing here needs a download, and the only thing you carry between the two apps is a key you can revoke whenever you like.

  1. 1Step 1

    Create an iHatePosting API key

    Sign in, open Settings → Developers and create a key. It starts with pk_live_, and the same page can show it again whenever you need it.

  2. 2Step 2

    Add iHatePosting to DeepSeek Harness

    Add to ~/.dsh/profiles/web/cordis.patch.yml. On Windows that file is %USERPROFILE%\.dsh\profiles\web\cordis.patch.yml, or under $DSH_HOME instead, if you set it. The file appears after you have started DeepSeek Harness once with npx @deepseek-ai/dsh web — one run is enough. Then look at what is in it. If the only line that is not a # comment is [], replace that line with this block. If it already lists items starting with -, add this block at the end. If it holds anything between [ and ], on one line or several, leave it alone and put this block in ~/.dsh/cordis.patch.yml instead, following the same three rules there — if that file is missing, create it with just this block. That file applies to every profile. It reloads without a restart. Replace YOUR_API_KEY with your key.

    DeepSeek Harness — connector
    - insert:
        - id: mcp-ihateposting
          name: '@deepseek-ai/dsh-mcp-client'
          config:
            serverName: ihateposting
            transport: streamable-http
            url: https://ihateposting.com/mcp?client=dsh
            headers:
              Authorization: 'Bearer YOUR_API_KEY'
            toolCallTimeoutMs: 60000
  3. 3Step 3

    Ask it to post

    Tell DeepSeek Harness 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 DeepSeek Harness

Every client reaches the same server, and then behaves like itself. These are the things that are true here and not somewhere else.

The CLI ships dsh-mcp-client but enables no MCP server by default, because each server command is trusted executable code outside the agent sandbox. Your block is what turns ours on. Each server is one insert row of the @deepseek-ai/dsh-mcp-client plugin, with serverName, transport, url and headers under config. serverName is the namespace for the tool names, so ours arrive as mcp__ihateposting__whoami, mcp__ihateposting__create_post and the rest; it has to match [A-Za-z0-9_-], be 32 characters or fewer, and be unique inside one registration scope.

Put the block in ~/.dsh/profiles/web/cordis.patch.yml. That file appears the first time you run the web profile, because web, headless, sdk, sdk-minimal and acp initialise themselves from shipped templates on first use, and a fresh one holds a single []. Replace that line with the block, because a list item added after [] is not valid YAML. If the file already lists items starting with -, add the block at the end. If it holds anything else between [ and ], leave it alone and put the block in ~/.dsh/cordis.patch.yml instead: that file is shared by every profile and outranks the per-profile layer. Setting DSH_HOME moves both.

Our block writes your key into an Authorization header. The plugin's own README writes that header as a !!js expression that reads an environment variable instead, Authorization: !!js '`Bearer ${process.env.MCP_TOKEN}`'. toolCallTimeoutMs is the per-call timeout, and the 60000 in our block is the plugin's own default, written out so it is easy to find and raise for a long upload.

The shipped dsh-hmr plugin is active while you run a profile. It watches the profile and home patch files and reapplies valid edits transactionally, so there is nothing to restart, and an edit that is not valid YAML is not applied. Editing the configuration entry reloads the server connection in place, and unchanged names stay unchanged. If HMR has been turned off in your composition, an edit needs a restart. You can also keep the block in a file of its own and start the harness with dsh web --patch followed by that file's path, which avoids editing the [] in cordis.patch.yml; --patch is repeatable and each overlay applies in argv order, so you pass it on the command line each time you start the harness.

failOnStartupError defaults to false, so a server that fails when it starts does not stop the harness: it starts, no tools from that server appear, and an error is logged. Set it to true if you would rather the plugin refuse to activate. If the connection drops after it has been made, the plugin reconnects on its own, with delays that double from 500 ms up to 30 s, and after ten consecutive failed attempts the server's tools are removed and it stops trying until you reload the configuration or restart the harness. Those three numbers are the reconnect defaults, and our block does not change them.

dsh --profile web --dump-config prints the composed configuration with the profile patch, the home patch and any --patch overlays applied, and both dumps print comments naming the file that supplied each row, so you can see whether your block was read. --dump-default-config prints the bundle layers only and will never show it. That proves the config, not your key. Ask the harness to call mcp__ihateposting__whoami, which names the iHatePosting account your key belongs to. Our server does not check the key when the connection opens, so a wrong key still connects and every tool answers iHatePosting API 401.

Limits. DeepSeek Harness is in developer preview. Its README says it is iterating rapidly and that there will be compatibility-breaking changes, so if the block stops loading after an update, check it against the dsh-mcp-client reference before you change anything else.

DeepSeek AI's own documentation: The dsh-mcp-client configuration reference

Nothing goes out unless you say so

Every post DeepSeek Harness 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 DeepSeek Harness as tools, so it can draft, check and schedule without you opening a dashboard.

How DeepSeek Harness uses it

  • You add the connector once — by signing in, or with a key you create
  • DeepSeek Harness 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 DeepSeek Harness already has
tools DeepSeek Harness can call
# read and check (9)
whoami              list_accounts
list_posts          get_post
get_analytics       get_platform_rules
list_media          list_pinterest_boards
validate_post

# write (7)
create_post         update_post
reschedule_post     delete_post
retry_post          upload_media
open_upload_widget

Cost, access and what to do when it breaks

What does it cost?

The connector costs nothing on top of iHatePosting. iHatePosting has one plan: $15/month billed annually, or $19/month billed monthly, with unlimited social accounts. It is free for 90 days, no credit card needed, and everything is included during the trial: unlimited accounts, unlimited posts, every feature.

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

Where does the iHatePosting block go?

In ~/.dsh/profiles/web/cordis.patch.yml. Run the web profile once first, so the file exists. If it holds a single [], replace that line with the block, because a list item added after [] is not valid YAML; if it already lists items starting with -, add the block at the end. If it holds anything else between [ and ], leave it alone and put the block in ~/.dsh/cordis.patch.yml, which is shared by every profile and outranks the per-profile layer.

No iHatePosting tools have appeared. What do I check?

failOnStartupError defaults to false, so a server that fails when it starts does not stop the harness: it starts, no tools from that server appear, and an error is logged. Run dsh --profile web --dump-config to see whether your block was read, since the dump prints comments naming the file that supplied each row.

Do I have to restart after editing the file?

No, as long as the shipped dsh-hmr plugin is active, which it is while you run a profile. It watches the profile and home patch files and reapplies valid edits transactionally. An edit that is not valid YAML is not applied, so check that you replaced the [] rather than adding a line after it. If HMR has been turned off in your composition, an edit needs a restart.

How do I check that my key works?

Ask the harness to call mcp__ihateposting__whoami, which names the iHatePosting account your key belongs to. Our server does not check the key when the connection opens, so a wrong key still connects and every tool answers iHatePosting API 401.

Is the DeepSeek Harness connector free?

Yes. The connector costs nothing on top of iHatePosting, and iHatePosting is free for 90 days, no credit card needed. After that it is $15/month billed annually, or $19 month-to-month, with unlimited accounts.

Which networks can DeepSeek Harness post to?

Any account you have connected in iHatePosting, across 15 networks: Instagram, Facebook, LinkedIn, X, Threads, TikTok, YouTube, Pinterest, Bluesky, Mastodon, Telegram, Discord, Slack, Tumblr and Google Business Profile.

Can DeepSeek Harness schedule posts for a specific date and time?

Yes. Put the date and time in the prompt — for example "schedule this for Friday at 9:00 AM" — and DeepSeek Harness schedules the post for then. iHatePosting reads the time in your account's timezone, and you can ask DeepSeek Harness to move a scheduled post to a new time.

One connection reaches every network

Connect your accounts in iHatePosting once. From then on DeepSeek Harness can post to any of them, and we publish at the time you set — even after you close the chat.

  • Bluesky
  • X
  • LinkedIn
  • Facebook
  • Instagram
  • Threads
  • Pinterest
  • TikTok
  • YouTube
  • Mastodon
  • Telegram
  • Discord
  • Tumblr
  • Google Business
  • Slack

Ready to post everywhere from DeepSeek Harness?

Start your 90-day free trial — no credit card, about a minute to your first post.

Sign Up