Nullprint

在 DeepSeek dsh 里使用 Nullprint

让 DeepSeek 的 agent 框架 dsh 通过 MCP 调用 Nullprint:建身份、启动浏览器、打开网页、读取内容、关闭。用 TRAE、Cherry Studio 请看国内 AI 接入教程;完整工具说明见 MCP 文档。只想照着做一遍的,看dsh 六步上手教程(每段命令都能一键复制)。

截至 2026-10,本页按 dsh 0.2.1-rc.2 和 nullprint-mcp 0.1.3 实测。dsh 还在预发布,后续版本的配置方式可能变化,以 dsh 官方说明为准。

关于 dsh

dsh 是 DeepSeek 官方的 agent 框架,npm 包 @deepseek-ai/dsh,源码在 GitHub deepseek-ai/deepseek-harness。注意:PyPI 上有同名的 dsh 包,不是 DeepSeek 官方的,别装错。

这个版本有两种用法:web(浏览器里的对话界面,dsh web)和 headless(命令行跑一个任务后退出,dsh --profile headless "任务"),没有终端界面(TUI)。下面两种都能接 Nullprint,配置分别写在各自的 profile 里。

准备

1. 装好 Nullprint 并保持运行

从下载页安装 Nullprint(Windows / macOS),打开并登录。dsh 干活期间保持开着(可以最小化)。

2. 装 dsh

需要先装好 Node.js(自带 npm),然后:

npm install -g @deepseek-ai/dsh

dsh 用 DeepSeek API,把 DeepSeek 开放平台的 API Key 设到环境变量 DEEPSEEK_API_KEY:

# macOS / Linux
export DEEPSEEK_API_KEY=sk-你的密钥
# Windows(PowerShell)
$env:DEEPSEEK_API_KEY = "sk-你的密钥"

3. 装 nullprint-mcp

pip、pipx、venv 三种方式都行,装好后要能在终端里直接运行 nullprint-mcp:

pipx install nullprint-mcp
pip install nullprint-mcp

用 venv 装的,下面配置里的 command 要写 venv 里 nullprint-mcp 的完整路径(例如 /Users/你/nullprint-venv/bin/nullprint-mcp)。

4. 先跑一次 dsh

dsh 第一次启动某个 profile 时才会生成它的配置目录。先启动一次你要用的那个(web 用 dsh web,看到能打开再关掉;headless 随便跑一个小任务),确认 ~/.dsh/profiles/web/ 或 ~/.dsh/profiles/headless/ 已经出现。

连上 Nullprint

编辑 ~/.dsh/profiles/<web 或 headless>/cordis.patch.yml。dsh 新生成的这个文件只有一行 [](表示空列表),先删掉这一行,再粘贴下面这一段。不删的话 YAML 解析会报错 end of the stream or a document separator is expected,dsh 起不来。

- insert:
    - id: mcp-nullprint
      name: "@deepseek-ai/dsh-mcp-client"
      config:
        serverName: nullprint
        transport: stdio
        command: nullprint-mcp
        args: []
        env: {}
照这 9 行原样复制。transport 和 args 一定要写(没有参数也写 args: []):少了,dsh 网页版会悄悄不启动这个插件,也不报错。env: {} 实测不写也能启动,写上更稳妥。
一定要包在 insert 里。直接写 - id: mcp-nullprint 只能修改已有的条目,新增条目必须写在 - insert: 下面,否则不会生效。文件里已经有别的内容时,把这一段追加在后面即可。

dsh 和 Nullprint 在同一台电脑上时,不用填端口和密钥:nullprint-mcp 会自动读取 Nullprint 的本机连接信息(daemon.json)。

web 和 headless 是两个独立的 profile,两种都要用的话,两个文件各加一次。

检查有没有连上

先打开 Nullprint,再启动 dsh(dsh web 或 headless),在 dsh 里问一句:

调用 nullprint 的 profiles_list

能列出你的身份才算连上。--dump-config 的输出里有 mcp-nullprint 只说明配置文件读进去了,不代表插件真的启动了,不能拿来判断。Nullprint 的工具在 dsh 里叫 mcp__nullprint__<工具名>,例如 mcp__nullprint__profiles_list、mcp__nullprint__profile_start、mcp__nullprint__session_goto。

试一下

headless 方式,一条命令跑完:

dsh --profile headless "用 Nullprint 新建一个身份,打开 example.com,读出网页标题告诉我,然后关闭这个身份。"

web 方式:运行 dsh web,在打开的页面里输入同样的话。

dsh 会依次调用建身份、启动、打开网页(goto)、执行脚本读标题(eval)、关闭。完成后在 Nullprint 客户端里能看到新建的身份;不需要的话可以删掉。

你这样说dsh 会做什么
列出我的 Nullprint 身份,哪些在运行查看身份和状态
打开 shop-01,进 example.com启动浏览器窗口并跳转
读一下这个页面的标题和价格读页面内容
把 shop-01 关掉关闭浏览器
身份名字要准确(区分大小写)。需要登录的网站,密码和验证码自己在浏览器窗口里输,登好再交给 dsh。

dsh 和 Nullprint 不在同一台电脑

需要告诉 nullprint-mcp 去哪台电脑找 Nullprint:设 NULLPRINT_DAEMON_URL(地址和端口)和 NULLPRINT_API_KEY(Nullprint 设置里的 API Key)。

注意:dsh 启动 MCP 程序时,会把环境里名字带 KEY、TOKEN、SECRET、PASSWORD 的变量过滤掉,所以只在终端里 export NULLPRINT_API_KEY 是传不过去的,必须在配置里用 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

然后在启动 dsh 的终端里设好这两个变量。不要把密钥直接写进配置文件。

这种写法已实测(截至 2026-10):dsh 和 Nullprint 在两台电脑上,经 ssh 隧道连接,建身份、启动、打开网页、读取、关闭都正常。

常见问题

dsh 起不来,报 end of the stream or a document separator is expected。 cordis.patch.yml 里原来的 [] 没删,删掉那一行再启动。

问 profiles_list 没有反应,或者 dsh 说没有这个工具。 先核对配置:要包在 - insert: 里,transport、args、env 三项都要写,改的是你在用的那个 profile 的文件(web 和 headless 各有一份)。

dsh 启动了,但没有 Nullprint 的工具。 连接失败时 dsh 照样启动、只是不加载这个服务。在终端运行 nullprint-mcp --help 确认能找到这个命令;用 venv 装的要写完整路径。

提示 Nullprint daemon 没在运行。 打开 Nullprint 并登录,再试。

dsh 说要先打开会话。 打开网页、执行脚本之前要先启动身份,先让它启动。

安全提醒

  • 你发给 dsh 的指令、身份名,以及 dsh 读到的网页内容,都会经过 DeepSeek 的服务器。敏感的身份不要交给 AI 操作。
  • AI 操作的是已登录的身份。付款、改密、删除类操作请自己把关。
  • 用完让它关掉身份。
  • 彻底删除(清空回收站)不开放给 AI。
  • nullprint-mcp 只在你电脑上运行、只连你指定的 Nullprint。