Use Nullprint in DeepSeek dsh
Let dsh, DeepSeek's agent harness, drive Nullprint over MCP: create a profile, launch its browser, open a page, read it and close it. Using Claude Code or Codex instead? See the Claude Code / Codex guide. Every tool is described in the MCP docs.
0.2.1-rc.2 and nullprint-mcp 0.1.3. dsh is still a pre-release; configuration may change in later versions, so follow dsh's own documentation if it differs.About dsh
dsh is DeepSeek's official agent harness: npm package @deepseek-ai/dsh, source at deepseek-ai/deepseek-harness on GitHub. Note that the dsh package on PyPI is not DeepSeek's — don't install that one.
This version has two ways to run: web (a chat page in your browser, dsh web) and headless (run one task from the command line and exit, dsh --profile headless "task"). There is no terminal UI. Both can use Nullprint; each keeps its own configuration.
Prepare
1. Install Nullprint and keep it running
Install Nullprint from the download page (Windows / macOS), open it and sign in. Keep it open while dsh works (minimized is fine).
2. Install dsh
Install Node.js (it includes npm), then:
npm install -g @deepseek-ai/dsh
dsh uses the DeepSeek API. Put your API key from the DeepSeek platform in the DEEPSEEK_API_KEY environment variable:
# macOS / Linux
export DEEPSEEK_API_KEY=sk-your-key
# Windows (PowerShell)
$env:DEEPSEEK_API_KEY = "sk-your-key"
3. Install nullprint-mcp
pip, pipx or a venv all work; afterwards you should be able to run nullprint-mcp from a terminal:
pipx install nullprint-mcp
pip install nullprint-mcp
If you installed it in a venv, set command below to the full path of nullprint-mcp inside the venv (for example /Users/you/nullprint-venv/bin/nullprint-mcp).
4. Run dsh once
dsh creates a profile's configuration folder the first time that profile starts. Start the one you plan to use once (dsh web — close it once it opens — or any small headless task) and check that ~/.dsh/profiles/web/ or ~/.dsh/profiles/headless/ exists.
Connect Nullprint
Edit ~/.dsh/profiles/<web or headless>/cordis.patch.yml and add:
- insert:
- id: mcp-nullprint
name: "@deepseek-ai/dsh-mcp-client"
config:
serverName: nullprint
transport: stdio
command: nullprint-mcp
args: []
insert. A bare - id: mcp-nullprint can only change an entry that already exists; a new entry has to go under - insert: or it is ignored. If the file already has content, append this block.When dsh and Nullprint run on the same computer, no port or key is needed: nullprint-mcp reads Nullprint's local connection file (daemon.json) by itself.
web and headless are separate profiles; to use both, add the block to both files.
Verify it loaded
dsh --profile web --dump-config
Use headless instead of web for the headless profile. If the output contains the mcp-nullprint entry, it loaded. Once dsh starts, Nullprint's tools are named mcp__nullprint__<tool> — for example mcp__nullprint__profiles_list, mcp__nullprint__profile_start, mcp__nullprint__session_goto.
Try it
Headless, in one command:
dsh --profile headless "Use Nullprint to create a new profile, open example.com, tell me the page title, then close the profile."
Web: run dsh web and type the same request on the page that opens.
dsh creates the profile, starts it, opens the page (goto), reads the title (eval) and closes it. The new profile shows up in the Nullprint app; delete it if you don't need it.
| You say | dsh does |
|---|---|
| List my Nullprint profiles and which are running | Shows profiles and their state |
| Open shop-01 and go to example.com | Launches the browser window and navigates |
| Read the title and the price on this page | Reads the page |
| Close shop-01 | Closes the browser |
dsh and Nullprint on different computers
Tell nullprint-mcp where Nullprint is: set NULLPRINT_DAEMON_URL (address and port) and NULLPRINT_API_KEY (the API key from Nullprint's settings).
Note: when dsh starts an MCP program it drops inherited variables whose names contain KEY, TOKEN, SECRET or PASSWORD, so exporting NULLPRINT_API_KEY in your shell is not enough — pass it explicitly with env:
- insert:
- id: mcp-nullprint
name: "@deepseek-ai/dsh-mcp-client"
config:
serverName: nullprint
transport: stdio
command: nullprint-mcp
args: []
env:
NULLPRINT_DAEMON_URL: !!js process.env.NULLPRINT_DAEMON_URL
NULLPRINT_API_KEY: !!js process.env.NULLPRINT_API_KEY
Then set both variables in the terminal you start dsh from. Don't write the key itself into the file.
Tested as of 2026-10 with dsh and Nullprint on two computers connected through an SSH tunnel: creating, starting, opening a page, reading it and closing all worked.
FAQ
mcp-nullprint isn't in the --dump-config output. Usually the block isn't under - insert:, or it went into the other profile's file (web and headless each have one).
dsh starts, but there are no Nullprint tools. If the connection fails, dsh still starts without that server. Run nullprint-mcp --help in a terminal to make sure the command is found; for a venv install, use the full path.
"Nullprint daemon is not running". Open Nullprint, sign in and try again.
dsh says a session must be opened first. A profile has to be started before pages can be opened or scripts run — ask it to start the profile first.
Safety
- Your requests, profile names and the page content dsh reads all go through DeepSeek's servers. Don't hand sensitive profiles to an AI.
- The AI works in signed-in profiles. Check payments, password changes and deletions yourself.
- Ask it to close profiles when done.
- Permanent deletion (emptying the trash) is not available to the AI.
nullprint-mcpruns only on your computer and connects only to the Nullprint you point it at.