关于 Assertify
Assertify 是一款 MCP 服务,让 AI Agent 通过用户自行登录的浏览器会话操作网站。会话在本机加密保存,并提供域名限制和重要操作确认等保护。
主要功能
- 01本地加密登录会话
- 02浏览网页并读取内容
- 03查看操作截图
- 04按域名限制会话
- 05重要操作前请求确认
- 06管理同站点多个账户
适用场景
- 01读取已登录网站的消息
- 02搜索并操作网页内容
- 03通过网站表单上传文件
- 04遇到 CAPTCHA 或 2FA 时接管会话
MCP 相关
它向 MCP 客户端提供浏览器会话工具,包括登录管理、页面检查、导航和交互。服务可作为本地 stdio 服务运行;可选的托管中继会将调用转发给用户电脑上的配套程序。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
原文在翻译后有更新,译文可能不是最新。
Assertify
让你的 AI Agent 使用你已登录的任何网站。
只需登录一次。你的会话会加密后保存在本机。Claude、Codex、Cursor 和任何 MCP 客户端都可以代你浏览、点击、输入和阅读。
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"),填写说明文字,然后在点击 发布 前询问你。其底层流程如下:
- 先打开文件对话框。 它会通过自然的鼠标移动点击上传按钮,并在浏览器的文件对话框中选择文件,触发的事件与用户手动操作时网站看到的相同。
- 接着使用隐藏的上传字段。 大多数网站会把真正的
<input type="file">隐藏在按钮后面;Assertify 会找到 Agent 指向位置附近的字段,或找到接受这些文件类型的字段。 - 最后使用拖放。 对于仅支持拖放的区域,它会像从桌面拖动一样放入文件(最多 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_BROWSER | chrome、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
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。