{"slug": "driving-a-real-browser-profile-from-deepseek-s-dsh-over-mcp", "title": "Driving a real browser profile from DeepSeek's dsh over MCP", "summary": "The Nullprint team documented how to connect DeepSeek's dsh agent harness to the Nullprint multi-profile browser over MCP, so a plain-language request can create a browser profile, launch it, open a page, read it and close it. Tested with dsh 0.2.1-rc.2 and nullprint-mcp 0.1.3, the setup requires installing dsh from npm (the PyPI package is not DeepSeek's), adding an MCP client entry wrapped in `- insert:` in the profile's cordis.patch.yml, and passing NULLPRINT_API_KEY explicitly in the config because dsh drops inherited environment variables whose names contain KEY, TOKEN, SECRET or PASSWORD.", "body_md": "DeepSeek has an official agent harness called **dsh** (npm: `@deepseek-ai/dsh`, source at `deepseek-ai/deepseek-harness`). It speaks MCP, which means you can hand it tools. We wired it to Nullprint, a multi-profile browser, so a plain-language request turns into: create a browser profile, launch it, open a page, read it, close it.\n\nThis is the short version of what it took. Tested with dsh `0.2.1-rc.2` and nullprint-mcp `0.1.3`; dsh is still a pre-release, so check its own docs if anything below has moved.\n\nThe `dsh` package on **PyPI is not DeepSeek's**. Install from npm.\n\nYou need Node.js, a DeepSeek API key, and Nullprint running and signed in on the same machine.\n\n```\nnpm install -g @deepseek-ai/dsh\nexport DEEPSEEK_API_KEY=sk-your-key\npipx install nullprint-mcp\n```\n\ndsh has two modes: `web` (a chat page in your browser) and `headless` (one task from the command line, then exit). Each is a separate profile with its own config, and the config folder only appears after the profile has run once, so start the one you want (`dsh web`, or any small headless task) before editing anything.\n\nAdd Nullprint to `~/.dsh/profiles/<web or headless>/cordis.patch.yml`:\n\n```\n- insert:\n    - id: mcp-nullprint\n      name: \"@deepseek-ai/dsh-mcp-client\"\n      config:\n        serverName: nullprint\n        transport: stdio\n        command: nullprint-mcp\n        args: []\n```\n\nIt has to be wrapped in `- insert:`. A bare `- id: mcp-nullprint` only modifies an entry that already exists, so a new entry written that way is ignored, and dsh starts normally without the tools. Check with:\n\n```\ndsh --profile headless --dump-config\n```\n\nIf `mcp-nullprint` is in the output, it loaded. The tools show up as `mcp__nullprint__<tool>`, e.g. `mcp__nullprint__profile_start` and `mcp__nullprint__session_goto`.\n\nNo port or key is needed on the same machine: nullprint-mcp reads Nullprint's local connection file by itself.\n\n```\ndsh --profile headless \"Use Nullprint to create a new profile, open example.com, tell me the page title, then close the profile.\"\n```\n\ndsh creates the profile, starts it, navigates, reads the title through `eval`, and closes it. The new profile appears in the Nullprint app afterwards. After that, requests like \"list my profiles and which are running\" or \"open shop-01 and go to example.com\" work the same way. Profile names are case-sensitive.\n\nSet `NULLPRINT_DAEMON_URL` and `NULLPRINT_API_KEY`. One gotcha: when dsh launches an MCP server it **drops inherited environment variables whose names contain KEY, TOKEN, SECRET or PASSWORD**. Exporting `NULLPRINT_API_KEY` in your shell isn't enough; pass it explicitly in the config:\n\n```\n        env:\n          NULLPRINT_DAEMON_URL: !!js process.env.NULLPRINT_DAEMON_URL\n          NULLPRINT_API_KEY: !!js process.env.NULLPRINT_API_KEY\n```\n\nDon't paste the key itself into the file.\n\nFull guide: [https://nullprint.ai/docs/mcp/dsh/](https://nullprint.ai/docs/mcp/dsh/)\n\n*This post was drafted with AI assistance and reviewed by the Nullprint team.*", "url": "https://wpnews.pro/news/driving-a-real-browser-profile-from-deepseek-s-dsh-over-mcp", "canonical_source": "https://dev.to/nullprintai/driving-a-real-browser-profile-from-deepseeks-dsh-over-mcp-3e84", "published_at": "2026-10-22 00:26:22+00:00", "updated_at": "2026-10-22 00:40:47.764017+00:00", "lang": "en", "topics": ["ai-agents", "agent-protocols", "ai-tools", "developer-tools"], "entities": ["DeepSeek", "dsh", "Nullprint", "nullprint-mcp", "@deepseek-ai/dsh", "@deepseek-ai/dsh-mcp-client", "Node.js"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/driving-a-real-browser-profile-from-deepseek-s-dsh-over-mcp", "markdown": "https://wpnews.pro/news/driving-a-real-browser-profile-from-deepseek-s-dsh-over-mcp.md", "text": "https://wpnews.pro/news/driving-a-real-browser-profile-from-deepseek-s-dsh-over-mcp.txt", "jsonld": "https://wpnews.pro/news/driving-a-real-browser-profile-from-deepseek-s-dsh-over-mcp.jsonld"}}