mcpField
A
Assertify

Assertify

本地服务
github.com浏览器自动化0今天更新

关于 Assertify

Assertify 是一款 MCP 服务,让 AI Agent 通过用户自行登录的浏览器会话操作网站。会话在本机加密保存,并提供域名限制和重要操作确认等保护。

主要功能

  1. 01本地加密登录会话
  2. 02浏览网页并读取内容
  3. 03查看操作截图
  4. 04按域名限制会话
  5. 05重要操作前请求确认
  6. 06管理同站点多个账户

适用场景

  1. 01读取已登录网站的消息
  2. 02搜索并操作网页内容
  3. 03通过网站表单上传文件
  4. 04遇到 CAPTCHA 或 2FA 时接管会话

MCP 相关

它向 MCP 客户端提供浏览器会话工具,包括登录管理、页面检查、导航和交互。服务可作为本地 stdio 服务运行;可选的托管中继会将调用转发给用户电脑上的配套程序。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库
安装包
mcpbassertify.mcpb0.6.3

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

原文在翻译后有更新,译文可能不是最新。

Assertify 标志

Assertify

让你的 AI Agent 使用你已登录的任何网站。
只需登录一次。你的会话会加密后保存在本机。Claude、Codex、Cursor 和任何 MCP 客户端都可以代你浏览、点击、输入和阅读。

CI License: MIT Python 3.10+ MCP Playwright

快速开始 · 连接你的客户端 · 工具 · 安全性 · 常见问题


You:    Check my LinkedIn messages and summarize anything from recruiters.
Agent:  open_session("linkedin") → click "Messaging" → read_text …
        You have 3 recruiter messages. The most recent is from Dana at Acme, about a Senior QA role …

✨ 为什么选择 Assertify

大多数网站没有 API,或者现有 API 无法满足你的需求。Assertify 为你的 Agent 提供一个已用你的身份登录的真实浏览器,而且绝不会把你的密码交给它。

  • 🔐 手动登录一次。 系统会打开一个普通浏览器窗口;你登录即可(2FA、通行密钥和 SSO 均可使用)。Agent 永远不会看到你的密码。
  • 🧳 加密存储在本地,由你掌控。 会话使用 AES-256-GCM 加密,密钥保存在操作系统的钥匙串中。Assertify 本身不会向任何地方发送任何内容。它没有服务端,也无需账户。
  • 🤖 适用于所有 MCP 客户端。 Claude Code、Claude Desktop、Codex、Cursor、VS Code、Gemini CLI、Grok、Windsurf……
  • 👀 查看 Agent 所见。 每个步骤都可以附带截图,在聊天中显示并保存到磁盘。
  • 🛡️ 限制访问范围。 每次登录都仅限访问各自的域名,因此页面上的提示注入无法将已登录的浏览器带到其他地方。
  • 👥 每个网站支持多个账户。 有 5 个 Gmail 账户?分别登录后,它们会以各自的邮箱地址命名。你可以使用其中一个,也可以同时打开所有账户。
  • ✋ 操作前先征求你的同意。 发送、发布、购买、删除或连接等按钮会暂停操作,直到你确认。登录也可以设为只读。
  • 🧍 行为贴近真人。 使用真实的 Chrome、你自己的浏览器指纹、弧线式鼠标移动、不均匀的输入节奏和自然停顿。没有 navigator.webdriver 标志。
  • 📎 上传文件和文件夹。 无论是要发布到 Facebook 的照片,还是要附在邮件中的 PDF,Agent 都会像你一样点击上传按钮并选择文件。密钥文件和密码文件一律拒绝。
  • 🪟 处理弹出窗口。 系统会替你拒绝 Cookie 横幅;对于“分享你的联系信息”之类的弹出窗口,系统会标记出来,由 Agent 决定是否处理或关闭。
  • 🔁 需要时交还给你。 遇到 CAPTCHA、2FA 提示或登录过期时,系统会在窗口中打开页面供你完成操作;之后 Agent 会继续执行。
  • 🪶 快速且节省 Token。 Agent 读取的是精简的大纲([e12] button "Send"),而不是原始 HTML。

⚙️ 工作原理

flowchart LR
    U(["👤 You"]) -- "log in once<br/>per account" --> L["Login window<br/><small>real browser, 2FA works</small>"]
    L -- "named by<br/>email" --> V
    K[["🔑 OS keychain<br/><small>macOS · Windows · Linux</small>"]] -. key .-> V

    subgraph V["🔒 Encrypted vault"]
        direction LR
        P1["[email protected]"]
        P2["[email protected]"]
        P3["[email protected]"]
        P4["[email protected]<br/><small>LinkedIn</small>"]
    end

    V -- decrypt --> S["⚙️ Assertify server<br/><small>asks before send · buy · delete</small>"]
    A(["🤖 AI agent"]) <-- "pick one account<br/>or all at once" --> S
    S -- "side by side" --> B

    subgraph B["Headless browsers, logged in"]
        direction LR
        H1["Gmail · personal@"]
        H2["Gmail · work@"]
        H3["Gmail · shop@"]
    end

    classDef person fill:#eef2ff,stroke:#6366f1,color:#1e1b4b
    classDef safe fill:#ecfdf5,stroke:#10b981,color:#064e3b
    classDef live fill:#fff7ed,stroke:#f97316,color:#7c2d12
    class U,A,L,S person
    class P1,P2,P3,P4,K safe
    class H1,H2,H3 live
    style V fill:#f0fdf4,stroke:#10b981
    style B fill:#fffbeb,stroke:#f59e0b

每个账户只需登录一次;每个账户都会按其邮箱地址保存。之后,你的 Agent 可以按名称打开某个账户,也可以一次打开某个网站的所有账户,每个账户都在各自已登录的浏览器中运行。以上所有操作都在你的电脑上完成,支持 macOS、Windows 和 Linux。

🚀 快速开始

你需要安装 uv:

  • macOS / Linux: curl -LsSf https://astral.sh/uv/install.sh | sh
  • Windows(PowerShell): powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
git clone https://github.com/romaklym/assertify.git
cd assertify
uv sync
uv run assertify setup

setup 会下载浏览器(Chromium,约 300 MB,仅需下载一次)、检查你的密钥链,并打印连接 AI 客户端所需的确切命令。如果你跳过此步骤,Assertify 会在首次使用时下载浏览器,或改用已安装的 Chrome 或 Edge。

Linux 注意事项
  • 如果浏览器无法启动,请安装其系统库:sudo uv run playwright install-deps chromium。
  • 密钥会存入 Secret Service(GNOME Keyring 或 KWallet)。在没有密钥链的服务端上,请改为设置 ASSERTIFY_PASSPHRASE。
  • 登录需要为浏览器窗口提供屏幕。在服务端上,请在桌面端登录并复制 ~/.assertify-mcp(使用相同的密码短语),或使用 ssh -X。

然后保存你的首次登录:

uv run assertify login github https://github.com/login

浏览器窗口会打开。登录后,关闭窗口(或在终端中按 Enter)。完成。你的 Agent 现在可以像你一样使用 GitHub。

提示

你也可以直接对 Agent 说:“帮我登录 Notion”。它会调用 start_login,窗口随即打开,并在你关闭窗口时保存会话。

🔌 连接 AI 客户端

将 /path/to/assertify 替换为你克隆项目的位置(assertify setup 会为你打印确切的配置行)。

Claude Code
claude mcp add -s user assertify -- uv --directory /path/to/assertify run assertify serve
Claude Desktop

**最简单的方法:**下载 assertify.mcpb 并双击。Claude Desktop 会使用其图标安装,并为你处理 Python。

也可以手动将其添加到 claude_desktop_config.json:

{
  "mcpServers": {
    "assertify": {
      "command": "uv",
      "args": ["--directory", "/path/to/assertify", "run", "assertify", "serve"]
    }
  }
}
Codex
codex mcp add assertify -- uv --directory /path/to/assertify run assertify serve

或添加到 ~/.codex/config.toml:

[mcp_servers.assertify]
command = "uv"
args = ["--directory", "/path/to/assertify", "run", "assertify", "serve"]
Cursor

~/.cursor/mcp.json:

{
  "mcpServers": {
    "assertify": {
      "command": "uv",
      "args": ["--directory", "/path/to/assertify", "run", "assertify", "serve"]
    }
  }
}
VS Code(Copilot)

.vscode/mcp.json:

{
  "servers": {
    "assertify": {
      "type": "stdio",
      "command": "uv",
      "args": ["--directory", "/path/to/assertify", "run", "assertify", "serve"]
    }
  }
}
Gemini CLI、Grok、Windsurf、Zed 等

任何可运行本地(stdio)MCP 服务的客户端都能使用。请使用以下命令:

uv --directory /path/to/assertify run assertify serve

对于 JSON 配置,请使用 Cursor 部分中的 mcpServers 配置块。

## 🧰 工具
工具功能
list_profiles(site?)查看已保存的登录信息(名称、账户邮箱、站点),也可仅查看某个站点的登录信息
start_login(url, profile?) / complete_login打开一个窗口供你登录,然后加密并保存会话。不指定名称时,会使用账户邮箱作为名称
rename_profile · delete_profile重命名或删除已保存的登录信息
open_session(profile, url?, screenshots?)启动已登录的无头浏览器;返回 session_id 和页面大纲
open_sessions(site? | profiles?)同时打开多个登录会话(例如所有 Gmail 账户),每个会话各有一个 session_id
snapshot获取 URL、标题和交互元素,如 [e12] button "Save";优先显示弹出窗口,并对 CAPTCHA 和登录页面发出警告
find(query)按标签搜索整个页面中的元素
click · type_text · select_option · press_key · scroll · back · navigate · wait_for通过引用或可见文本操作(click(text="Messages")),因此小幅改版不会破坏工作流;每项操作都会返回新的大纲
upload_files(paths, ref? | text?)附加文件或整个文件夹:通过站点的文件对话框(text="Photo/video")、上传字段或拖放操作。只会附加文件;发布操作需单独点击并确认
dismiss_popup点击顶部弹出窗口中的关闭或“Not now”按钮,将其关闭
handoff(reason?)在一个窗口中打开当前页面供你操作(CAPTCHA、双重身份验证、登录过期);会话会接续你刚完成的登录
read_text获取页面上的可见文本,并将其标记为不可信的站点内容
screenshot(ref?, full_page?)截取页面或某个元素的屏幕截图,展示给 Agent 并保存到文件
set_screenshots(enabled)为每个步骤附加屏幕截图(方便观察运行过程)
switch_tab弹出窗口会自动成为活动标签页;此工具可切换回来
save_session / close_session将更新后的 Cookie 写回保险库(默认在关闭时保存)
evaluate在页面中运行 JavaScript。除非设置 ASSERTIFY_ALLOW_EVAL=1,否则关闭
👀 查看 Agent 看到的内容

你可以说 “给我看看屏幕截图”,或 “打开我的 GitHub 会话并启用屏幕截图,这样我就能跟着看”。在支持显示图片的客户端中,图片会显示在聊天中;每张图片也都会保存到 ~/.assertify-mcp/screenshots/<session>/NNN-<step>.jpg。此文件夹仅你可访问,并会在 7 天后清空。

👥 在同一站点使用多个账户

每个账户登录一次。省略名称时,Assertify 会使用它在页面上找到的邮箱地址作为登录名称(如果站点未显示邮箱,则使用 google.com-1、google.com-2……):

assertify login https://mail.google.com   # sign in as [email protected]   -> saved as "[email protected]"
assertify login https://mail.google.com   # sign in as [email protected]  -> saved as "[email protected]"
assertify login work https://mail.google.com   # or pick the name yourself
assertify list google.com                 # just the Google logins
assertify rename google.com-1 side-project

然后只需提出要求:

  • “检查我的 [email protected] 收件箱”:Agent 会打开该登录会话。
  • “我的 Gmail 账户中有没有未读邮件?”:Agent 会调用 open_sessions(site="google.com"),为每个账户创建一个会话,然后可以并行处理。

每个账户都存储在独立的加密文件中,并使用隔离的浏览器,因此 Cookie 不会混用。对于限制自动化的站点,请避免同时对多个账户执行相同操作。

📎 上传文件

告诉你的 Agent 要上传什么以及上传到哪里:

“将 ~/Pictures/trip 中的照片发布到我的 Facebook,并配上说明文字‘Back home’”

Agent 会打开编辑器,调用 upload_files(paths=["~/Pictures/trip"], text="Photo/video"),填写说明文字,然后在点击 发布 前询问你。其底层流程如下:

  1. 先打开文件对话框。 它会通过自然的鼠标移动点击上传按钮,并在浏览器的文件对话框中选择文件,触发的事件与用户手动操作时网站看到的相同。
  2. 接着使用隐藏的上传字段。 大多数网站会把真正的 <input type="file"> 隐藏在按钮后面;Assertify 会找到 Agent 指向位置附近的字段,或找到接受这些文件类型的字段。
  3. 最后使用拖放。 对于仅支持拖放的区域,它会像从桌面拖动一样放入文件(最多 50 MB)。

文件夹表示其中的所有文件,包括子文件夹中的文件,但会跳过 .DS_Store 等隐藏文件。系统会遵守单文件字段、文件类型限制(accept="image/*")和文件夹选择器的要求。

**绝不会上传的内容:**隐藏文件夹(~/.ssh、~/.aws 等)中的任何内容,以及密钥、证书、密码管理器和 .env 文件、浏览器 Cookie 存储和 Assertify 自己的保险库。路径必须是用户提供的完整路径;Agent 会被告知,绝不能因为网页或电子邮件提出要求就上传文件。限制:每次调用最多 100 个文件,总计 2 GB。如需限制为仅允许某些文件夹,请设置 ASSERTIFY_UPLOAD_DIRS。

🧍 避免引人注意

网站会标记表现得像机器人的浏览器。Assertify 会尽力避免这种情况:

  • 使用真正的 Chrome(如果已安装;否则回退到 Chromium),不带“由自动化软件控制”标记,也不设置 navigator.webdriver。
  • 使用你的指纹。 Agent 的浏览器会沿用登录窗口中的用户代理、语言和时区,因此网站看到的仍是同一个“设备”。
  • 模拟真人操作。 鼠标沿曲线移动到每个按钮内的随机位置,按键以不均匀的速度逐个输入,滚动时一段段滑动,操作之间和页面加载之间还会随机短暂停顿。
  • 限制速度。 每次登录每小时的页面加载次数设有上限(默认为 400;会封禁自动化的网站为 60)。

设置 ASSERTIFY_HUMANIZE=0 可关闭真人操作模拟(速度更快;用于你自己的工具和测试网站时没问题)。

🪟 弹窗、对话框和登录过期

  • Cookie 横幅会自动选择“全部拒绝”/“仅必要”(设置 ASSERTIFY_AUTO_CONSENT=0 可关闭)。
  • 其他弹窗(新闻简报、“分享你的联系信息”、应用推广等)会先在快照中的 ## Pop-up 下列出,并附带警告。Agent 会根据你的请求决定如何处理,或调用 dismiss_popup。如果弹窗遮挡了某个项目,系统会拒绝点击并给出提示,而不会悄悄点到覆盖层上。
  • 浏览器对话框(alert、confirm、“确定吗?”)会被取消并报告;如果确实要确认,Agent 会通过 accept_dialog=true 再次点击。
  • CAPTCHA、双重身份验证和会话过期会在快照中显示警告。Agent 绝不会尝试解决这些问题:它会调用 handoff,在你的屏幕上打开一个停留在同一页面的窗口;你完成操作并关闭窗口后,Agent 会使用新的 Cookie 继续操作。

⚖️ 负责任地使用

许多网站的条款禁止自动化访问。LinkedIn、Facebook、Instagram、Threads、X 和 TikTok 都明确规定了这一点,并会对违规账号采取限制措施。Assertify 能识别这些网站,会放慢操作速度、进一步限制页面加载次数,并告知 Agent 将任务控制在较小范围内且仅用于个人用途。轻度个人使用(查看自己的消息、更新自己的个人资料)通常没问题;抓取数据、批量发送消息或大量添加联系人则可能导致账号受限。你有责任遵守所用网站的条款。

🔒 安全

  • 存储: ~/.assertify-mcp/profiles/<name>.enc,采用 AES-256-GCM 加密,文件权限为 0600,文件夹权限为 0700。配置文件名称会绑定到密文中,因此无法替换或重命名文件。
  • 密钥: 在操作系统密钥链中保存一个随机的 256 位密钥(macOS Keychain、Windows Credential Locker、Linux Secret Service)。如果设备没有密钥链,请设置 ASSERTIFY_PASSPHRASE,改用 scrypt 派生密钥。
  • 域名保护: 阻止导航到登录信息 allowed_domains 之外的域名。默认允许登录 URL 的域名及其子域名;可使用 --domain 添加更多域名(例如,用于 SSO)。
  • 上下文中不含密码: 快照中的密码字段显示为 value=<hidden>。
  • 无遥测、无服务、无账户。 除了你自己的浏览器访问所用网站产生的流量外,任何内容都不会离开你的设备。
  • 操作前先询问: 标有发送、发布、购买、付款、删除、连接、关注、申请等含义的按钮,以及在消息框中按 Enter,都会暂停操作,直到 Agent 再次调用并传入 confirmed=true;系统会告知 Agent,只有在你批准后才能这样做。
  • 只读登录: assertify login <name> <url> --read-only(或在 start_login 中设置 read_only=true)允许 Agent 浏览和阅读,但绝不允许输入、提交、发送或购买。
  • 上传: 仅允许完整路径,不允许上传机密内容(隐藏文件夹、密钥、.env、Cookie 存储、保险库);会先解析符号链接;可选设置文件夹允许列表(ASSERTIFY_UPLOAD_DIRS)。只读登录无法上传。
  • 不可信页面: 返回的页面文本会被包裹并标记为网站内容,并会告知 Agent 绝不要遵循页面、电子邮件或消息中的指示。只能打开 http(s) 页面,并且已禁用下载。

警告

已保存的会话拥有与登录状态相同的权限。任何能在你的密钥链解锁时以你的用户身份运行代码的人,都能使用该会话,就像使用你浏览器自身的 Cookie 一样。只连接你信任的 Agent。

发现漏洞?请参阅 SECURITY.md。

🎛️ 配置

变量作用
ASSERTIFY_HOME保险库位置(默认 ~/.assertify-mcp)
ASSERTIFY_PASSPHRASE使用密码短语代替操作系统密钥链
ASSERTIFY_HEADED=1显示 Agent 的浏览器窗口(用于调试或访问会阻止无头浏览器的网站)
ASSERTIFY_SCREENSHOTS=1默认对每个步骤截图
ASSERTIFY_NO_AUTO_INSTALL=1永不自动下载 Chromium
ASSERTIFY_ALLOW_EVAL=1启用 evaluate 工具
ASSERTIFY_ALLOW_ANY_DOMAIN=1关闭域名保护
ASSERTIFY_HUMANIZE=0关闭模拟真人的鼠标操作、输入和停顿
ASSERTIFY_BROWSERchrome、chromium 或 msedge(默认:如果已安装则使用 Chrome,否则使用 Chromium)
ASSERTIFY_MAX_PAGES_PER_HOUR每个登录信息的页面加载上限(默认 400;严格网站上为 60)
ASSERTIFY_AUTO_CONSENT=0不自动拒绝 Cookie 横幅
ASSERTIFY_UPLOAD_DIRS只允许从这些文件夹上传(macOS/Linux 上以 : 分隔,Windows 上以 ; 分隔)
ASSERTIFY_MAX_UPLOAD_MB每次调用的上传大小上限(默认 2048)

CLI:assertify setup | login [name] <url> [--domain d] [--read-only] | list [site] | rename <name> <new> | delete <name> | serve。

❓ 常见问题

它支持双重身份验证、通行密钥和“使用 Google 登录”吗? 支持。你可以在真实的浏览器窗口中自行登录,因此你在那里能做的操作都可以完成。如果网站会跳转到 SSO 域名,请使用 --domain 添加该域名。

为什么网站把我登出了? 会话会按照网站自己的时间安排过期,有些网站也会时不时要求再次完成 CAPTCHA 或双重身份验证。发生这种情况时,Agent 会调用 handoff,并打开一个窗口供你重新登录;除此之外无需进行任何操作。Assertify 也会在会话关闭时保存更新后的 Cookie,让滚动会话保持有效。如果网站一直拒绝无头浏览器,请设置 ASSERTIFY_HEADED=1。

网站重新设计会导致我的 Agent 出问题吗? 影响比你想象的要小。Agent 每一步都会重新读取页面,并且可以根据可见文本点击(click(text="Messages")),而不是使用固定选择器,因此它能像人一样适应变化。全面重新设计仍可能让它感到困惑;它会告诉你自己看到的内容。

我可以通过手机或服务器使用它吗? 目前还不行。Assertify 在设计上优先支持本地运行:你的会话不会离开你的电脑。

已知限制 登录只会保存 Cookie 和 localStorage,不会保存 IndexedDB,因此有些只在 IndexedDB 中保存令牌的应用无法保持登录状态。反检测并非万无一失:决心识别自动化操作的网站仍可能做到。快照目前还无法查看 iframe 或已关闭的 shadow root。

🤝 参与贡献

欢迎提交问题和 PR。请参阅 CONTRIBUTING.md。简而言之:

uv sync && uv run assertify setup
uv run pytest && uv run ruff check .

📄 许可证

MIT © Roman Klym

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。