Nullprint

io.github.nullprintaiv0.1.2更新于 Oct 10, 2026

Create, launch, check and drive Nullprint multi-profile browser profiles from any MCP agent.

已验证STDIO仅桌面Developer ToolsBrowser Automation

概览

AI 生成的概览

让助手通过本地 Nullprint 桌面守护进程创建、启动、体检并驱动 Nullprint 多身份浏览器配置文件。

功能
这是本地 Nullprint 守护进程 HTTP 接口上的薄层,每个工具对应一个守护进程端点。配置文件工具可列出、创建、启动、停止、体检、软删除、恢复配置文件并查看回收站,另有一次性代理检测。会话工具可导航、获取无障碍树快照、按 CSS 选择器点击和填写、按键、执行 JavaScript,以及列出和切换标签页。
适用场景
当助手需要在同一台机器上管理和驱动多个隔离的浏览器配置文件时使用,例如创建配置文件、做一致性体检、测试代理,或在已启动的配置文件内自动化网页。
运行要求
需在 Windows 或 macOS 上安装、运行并登录 Nullprint 桌面应用,同一台机器需有 Python 3.11+,推荐使用 uv。服务从 ~/.nullprint/daemon.json 读取守护进程端口和 API Key;连接其他位置的守护进程可传 --daemon-url/--port 并设置 NULLPRINT_API_KEY。本地默认无需配置端口或密钥。
安装前请注意
它会驱动真实浏览器会话,并可创建、停止、软删除和恢复配置文件,因此配置文件状态和登录信息可能改变。profile_start 会返回 cdp_endpoint;外部工具接入会绕过 Nullprint 的一致性保护,可能使配置文件被识别。永久删除配置文件被有意不暴露。连接远程守护进程需要 NULLPRINT_API_KEY。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Nullprint,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

nullprint-mcp

An MCP server for Nullprint, the multi-profile browser. It lets any MCP-capable AI agent (Claude Code, Claude Desktop, OpenAI Codex, Kimi, …) create browser profiles, launch them, run consistency check-ups and drive the pages inside a running profile.

The server is a thin layer over the local Nullprint daemon's HTTP API: every tool maps to one daemon endpoint. The daemon, the browser kernels and the fingerprint engine ship with the Nullprint desktop app and are not part of this package.

Requirements

  • Nullprint desktop app installed and running (Windows or macOS), signed in. Download: https://nullprint.ai
  • Python 3.11+ on the same machine. The easiest way to run the server is uv, which installs the package on first use.

Install

bash
# Claude Codeclaude mcp add nullprint -- uvx nullprint-mcp
# OpenAI Codexcodex mcp add nullprint -- uvx nullprint-mcp

Claude Desktop, Kimi and other clients that use an mcpServers config file:

json
{  "mcpServers": {    "nullprint": {      "command": "uvx",      "args": ["nullprint-mcp"]    }  }}

Without uv: pip install nullprint-mcp, then use nullprint-mcp as the command (no args).

No port or key to configure: the server reads the running daemon's port and API key from ~/.nullprint/daemon.json, which the desktop app writes on start-up. To point at a daemon elsewhere, pass --daemon-url http://host:port (or --port 7801 for localhost) and set NULLPRINT_API_KEY. Resolution order, most explicit first:

  1. --daemon-url / --port
  2. NULLPRINT_DAEMON_URL
  3. NULLPRINT_PORT
  4. ~/.nullprint/daemon.json (NULLPRINT_HOME changes the directory)

If the daemon is not running the tools say so plainly instead of throwing a connection trace.

Tools

ToolWhat it doesDaemon endpoint
profiles_listList every profile with status (running / idle), exit and ledger metadataGET /profiles
profile_startOpen a browser session for a profile; returns the driving endpointsPOST /sessions/{name}
profile_stopStop that profile's browser (session or app-launched window)DELETE /sessions/{name} → falls back to POST /profiles/{name}/stop
profile_createCreate a profile (fingerprint generated and frozen), optionally with proxy, ledger and start pagesPOST /profiles
profile_checkupConsistency check-up, returns {summary, checks}GET /profiles/{name}/checkup?live=
proxy_checkStateless proxy test: exit IP, country, latencyPOST /proxy-check
profile_deleteSoft delete to the recycle bin (recoverable); refused while runningDELETE /profiles/{name}
trash_listRead-only list of recoverable profiles in the recycle binGET /trash
profile_restoreRestore from the recycle bin with fingerprint, proxy and logins intactPOST /trash/{name}/restore
session_gotoNavigate the session's current pagePOST /sessions/{name}/goto
session_snapshotAccessibility tree of the current page (find selectors, read state)GET /sessions/{name}/snapshot
session_click_selectorClick an element by CSS selectorPOST /sessions/{name}/click_selector
session_fill_selectorFill an input by CSS selectorPOST /sessions/{name}/fill_selector
session_pressSend a key (e.g. Enter)POST /sessions/{name}/press
session_evalRun JavaScript on the page, returns {ok, result}POST /sessions/{name}/eval
session_tabsList the session's tabs and the active oneGET /sessions/{name}/tabs
session_switch_tabBring a tab to the frontPOST /sessions/{name}/switch_tab

Notes that matter when writing prompts:

  • session_* tools need an open session. They drive the warm session opened by profile_start; calling them on a profile without one returns 409. Selectors are CSS, not XPath or role/name; call session_snapshot first when you do not know a selector.
  • session_eval returns an envelope. A page-side JavaScript error comes back as data ({ok: false, error, error_type}), not as a tool failure; result follows the expression's type.
  • profile_stop has two levels. A profile can be "running" as a warm session or as a window launched from the app. The tool tries the session first and falls back to the app-level stop, which is idempotent for idle profiles. It returns {name, stopped, closed}.
  • profile_create does not hard-code a kernel. Leave engine empty to use the app's default; unknown values come back as a 422 listing the options.
  • proxy_check failures are data. An unreachable proxy returns {ok: false, error}; only an unreachable daemon raises.
  • profile_start returns cdp_endpoint (a ws:// DevTools address) for Chrome kernels, so external tools can attach. A session driven from outside bypasses Nullprint's consistency guards: an outside tool can set a viewport, language or time zone that contradicts the profile's frozen fingerprint and make it detectable. Prefer the session_* tools; if you must attach, do not change anything the profile has not declared.

What is deliberately not exposed

Permanently deleting a profile (DELETE /trash/{name}) destroys its logins and cannot be undone. It is not a tool on purpose: emptying the recycle bin is a human action in the desktop app. profile_delete's description tells the agent to say so instead of working around it, and a test scans every tool's source to keep the purge endpoint out. Screenshot-to-disk and file-writing tools are left out for the same reason (local path safety).

Development

bash
pip install -e ".[dev]"pytest testsnullprint-mcp --help

Tools live in nullprint_mcp/tools.py (the TOOLS tuple); server.py and __main__.py do not change when a tool is added. Nothing may be printed to stdout: stdout is the MCP channel.

License

MIT. Copyright (c) 2026 HENGCHENG LLC.


中文说明

这是 Nullprint(多身份指纹浏览器)的 MCP 服务:Claude Code、Claude Desktop、OpenAI Codex、Kimi 等任何支持 MCP 的 AI 都可以用它建身份、启动浏览器、做一致性体检、驱动身份里的网页。它只是本地 daemon HTTP 接口上的薄薄一层,每个工具对应 daemon 的一个端点;daemon、浏览器内核和指纹引擎随 Nullprint 桌面应用发布,不在本包内。

前提:本机装好并登录 Nullprint 桌面应用;本机有 Python 3.11+,推荐用 uv(首次运行自动装包)。

接入:

bash
claude mcp add nullprint -- uvx nullprint-mcp      # Claude Codecodex mcp add nullprint -- uvx nullprint-mcp       # OpenAI Codex

Claude Desktop、Kimi 等走配置文件的客户端,在 mcpServers 里加 {"command": "uvx", "args": ["nullprint-mcp"]}。没有 uv 就 pip install nullprint-mcp,命令改为 nullprint-mcp。

不用配端口和密钥:服务自动读桌面应用写在 ~/.nullprint/daemon.json 里的端口和 API Key。要连别的机器上的 daemon,传 --daemon-url 并设 NULLPRINT_API_KEY。

17 个工具:profiles_list、profile_start、profile_stop、profile_create、profile_checkup、proxy_check、profile_delete、trash_list、profile_restore,以及 8 个会话工具 session_goto / snapshot / click_selector / fill_selector / press / eval / tabs / switch_tab(先 profile_start 再用)。彻底删除身份故意不做成工具:清空回收站只能在桌面应用里由人操作。

来源:README.md,提交 717191d

工具

0
工具元数据尚未被收录。

版本历史

1
  1. v0.1.2最新Oct 10, 2026