← ジャーナルに戻る
· 4 分で読了

DeepSeek Harness (DSH): A Hands-On Setup Guide with MCP Integration

DeepSeek just shipped DSH, an open-source agent harness with a plugin system and built-in MCP client. Here's a real setup walkthrough — installing it, wiring an MCP server into a profile, and calling custom SEO tools from the chat UI.

TL;DR

TL;DR — DSH (npm @deepseek-ai/dsh) is DeepSeek's open-source agent harness: a web UI, a plugin-bundle profile system, and a built-in MCP client. Setup takes about 10 minutes. This guide shows the full path: install, boot the web UI, then wire a custom MCP tool server into a profile so the model can call your own Python tools natively — with real output from a working integration.

Every new agent harness faces the same cold-start question: why not just keep using Claude Code? DSH, DeepSeek’s answer, arrived quietly on npm as @deepseek-ai/dsh and the honest pitch is not “better chat.” It’s a composable harness where everything — the terminal tool, the web UI, even the model route — is a plugin in a stack, and anything you can’t find as a plugin you can bolt on through MCP.

That last part is what this article actually tests. We installed DSH, ran its web UI, and connected one of our own MCP servers — the ZensInk SEO toolkit — so the model could call 22 SEO tools (keyword_research, kd, geo_score, …) directly from a chat message. Everything below is real output from that session, not a mockup.

What DSH actually is

Strip the branding and DSH is three things stacked on the Cordis plugin kernel:

  • A boot CLI. dsh --profile <name> composes an ordered stack of plugin bundles — base layer, mode layer (web/headless/tui), then your personal patch file. Later layers override earlier ones per config row.
  • A web UI. dsh web serves a local chat interface with sessions, plan mode, a terminal view, and markdown rendering. It runs on loopback by default.
  • An MCP client. The @deepseek-ai/dsh-mcp-client plugin connects external MCP servers over stdio or streamable-http and registers their tools as native model tools, using the same mcp__<server>__<tool> naming convention Claude Code and Codex use.

The profile system is the interesting bit. Your customizations don’t edit any installed code — they live in a cordis.patch.yml overlay file that gets applied on every boot. Upgrading the harness never clobbers your config, and HMR hot-reloads the file the moment you save it.

Install and first boot

You need Node 18+ and a DeepSeek API key.

npm install -g @deepseek-ai/dsh
export DEEPSEEK_API_KEY=sk-your-key
dsh web

That’s the whole install. dsh web boots the default web profile and prints a localhost URL. Opening it lands on a chat interface — new session, type a prompt, the model runs with tool access to bash, file edits, and web search.

One detail worth knowing: the model credentials live in ~/.dsh/settings.yaml, not in the profile. The web UI’s Models page writes there. If you see MISSING_CREDENTIAL on your first prompt, that’s the missing key.

The part that matters: adding an MCP server

Here’s the workflow that justifies switching anything. Say you have a tool server — ours is a Python MCP server exposing SEO CLI tools, but it could be a database client, a deployment tool, anything that speaks MCP over stdio.

DSH’s MCP bridge takes one config entry. Edit ~/.dsh/profiles/web/cordis.patch.yml:

- insert:
    - id: mcp-zensink
      name: '@deepseek-ai/dsh-mcp-client'
      config:
        serverName: zensink
        transport: stdio
        command: python3
        args: ['-m', 'zens_ink.mcp']
        cwd: /path/to/your/mcp-server
        toolCallTimeoutMs: 300000

Save the file. No restart — HMR disconnects and reconnects the server, and the tools appear. The model now sees mcp__zensink__keyword_research, mcp__zensink__kd, and twenty more, exactly as if they were built in.

Real session: calling SEO tools from chat

With the server wired in, we asked the session one plain-language question: “classify the search intent for ‘best astro seo plugin’ and ‘buy seo audit tool’.”

The model picked mcp__zensink__search_intent on its own and returned:

"best astro seo tool"    → commercial      (0.85, ranked-list content type)
"buy seo audit tool"     → transactional   (0.85, buyer flag set)

Two seconds, one tool call, zero commands typed. The same session then scored a local HTML file with geo_score (46/100, grade D, with a five-layer breakdown) — again from a single sentence.

That’s the shape of the win: your scripts stop being things you remember how to invoke and become things the model composes for you. “Find long-tail keywords for my niche, cluster them, and score the winners” becomes one message that chains keyword_researchkeyword_clusterkgr_auto.

Timeout tuning for long tools

One gotcha we hit: the default per-call timeout is 60 seconds, which is tight for batch tools. A full audit pipeline can run minutes. Set toolCallTimeoutMs per server — we use 3,600,000 (one hour) for the audit-heavy profile. The timeout is per tool call, not per session, so chatty tools aren’t affected.

Also note cwd in the config above: stdio servers spawn with that working directory, which matters if your server resolves relative paths (.env files, data caches). Without it you get the ambient shell’s cwd and confusing “file not found” errors at 2am.

Who should care

Three honest assessments after a week of daily use:

  • If you live in Claude Code and it’s working: the MCP naming is compatible, but there’s no compelling reason to migrate a working setup today. Watch this space instead.
  • If you’re building agent tooling: the plugin-bundle architecture is genuinely clean. Profiles as ordered patch layers solve the “my config vs upstream updates” problem better than most dotfile schemes.
  • If you run DeepSeek as your primary model: this is the native harness, and the model-route adapter layer means the same profiles work across providers.

The MCP client alone changes the economics of custom tooling. Writing a stdio MCP server in pure Python takes an afternoon; after that, every chat session has your tools as first-class citizens.

Verify it yourself

The SEO toolkit we connected is open source — 16 free tools, zero pip dependencies, and the same MCP server documented here. Clone it, run python3 -m zens_ink.mcp, paste the config block above, and you’ll have a reference integration to poke at while evaluating DSH.

For keyword discovery workflows on top of it, see how we mine autocomplete data with Python and auditing an Astro site’s SEO with a free CLI. The full tool reference lives in the docs.

FAQ

What is DeepSeek Harness (DSH)?

DSH is DeepSeek's open-source agent harness (npm package @deepseek-ai/dsh). It boots ordered stacks of plugin bundles called profiles, ships a web UI on localhost, and includes an MCP client so external tool servers become native model tools.

How do I add an MCP server to DSH?

Edit the cordis.patch.yml file in your profile directory (~/.dsh/profiles/web/) and insert an entry using @deepseek-ai/dsh-mcp-client with transport stdio, your server's command, and a toolCallTimeoutMs. HMR picks it up without a restart.

Does DSH cost money to use?

The harness itself is MIT-licensed and free. You need a DeepSeek API key for the model calls, or you can point it at other providers through its LLM adapter layer.

Can DSH replace Claude Code or Codex?

It is a different shape of tool: a composable harness built on the Cordis plugin system rather than a monolithic CLI. It speaks the same MCP tool naming convention (mcp__server__tool), so existing MCP servers work in both.

Want to run this analysis on your own site?

ZensInk Pro automates this pipeline. One command, from seed keywords to content plan.

Get Pro →