
人工智能AI Agent浏览器控制GUI 自动化MCP 服务【免费下载链接】invisible_playwright_mcpPlaywright MCP server undetected by anti-bots and captchas: AI agent browses the web on anti-detect stealth Firefox, Python, undetected browser automation, scraping, computer use.项目地址https://gitcode.com/GitHub_Trending/jo/invisible_playwright_mcp点击查看免费下载本文围绕 invisible_playwright_mcp 中如何把 AI 浏览器 Agent 挡在不可逆操作之外这一核心问题展开。文章以项目自身 MCP 服务器在工具边界的逐字拒绝信息为主线剖析提示词、工具边界、账号权限三层防御各自的作用边界并结合 actions.py 的源码实现与 test_no_interaction_by_script.py 的测试验证说明一条可复制的防护路线从写提示词到把墙砌进代码再到把真正的保险放在浏览器之外。问题登录态浏览器里没有撤销键一个驱动着已登录浏览器的 Agent能做你在那个浏览器里能做的一切——包括所有没有撤销的操作。面对这种情况本能的反应是在任务里写一句不要删除任何东西。但这恰恰是最弱的一道防线因为它和页面本身生活在同一段文本里页面完全有能力反驳你。防御措施按在哪里被强制可以分成三层而真正靠得住的只有外层两层提示词层Layer 1——只是建议工具边界层Layer 2——是一堵墙账号层Layer 3——唯一真正兜底的防线。Layer 1提示词只是建议不是控制绝对不要点击 Delete是一个写进上下文窗口的句子而上下文窗口里同时还装着整个页面。如果页面里出现一段读起来像指令的文字两者处于同一种介质模型会对它们分别权衡。这正是提示注入prompt injection的全部机制也是为什么一条指令只是偏好而不是控制。但这不意味着应该停止写提示词。它确实会改变模型的行为倾向——只是不能把它当作阻止事故的那个东西。Layer 2工具边界是一堵模型没有投票权的墙这是最值得理解的一层因为它的强制力来自代码而模型对代码没有投票权。命名工具 vs 裸脚本边界是否存在一个对外暴露运行这段 JavaScript的浏览器服务器实际上没有边界因为脚本能做页面能做的任何事它上面的所有限制都退化为建议。而一个只暴露命名动作的服务器拥有真正的边界——一个不存在的工具根本不可能被调用。invisible_playwright_mcp 明确拒绝了明显的脚本路径并把原因写进错误信息里而不是静默失败。逐字原文如下refused: this changes the page from script, which produces an untrusted event and is exactly what this browser exists to avoid. Use browser_click, or browser_click_at when no selector describes the target. Reading is fine - it is assigning and calling that is refused. If no tool fits, say so in your answer rather than working around it.这是针对脚本化click()的拒绝信息。如果是对字段value赋值会返回同样的句子只是中段换成Use browser_type for a text field, browser_select_option for a dropdown, browser_click for a checkbox or a radio.源码中的模式检查表这条信息不是手写在某个工具描述里的装饰而是由 actions.py 中的_BY_SCRIPT模式表驱动生成的。从源码结构看这张表覆盖了模型实际会写出的典型动作模式正则拦截的脚本动作指引的替代工具\.(?:value\|checked\|selected)\s*\?(?!)直接给属性赋值browser_type / browser_select_option / browser_click\...\...下标式赋值el[value]x同上\.click\s*\(脚本 clickbrowser_click 或 browser_click_at\.dispatchEvent\s*\(合成事件browser_click / browser_type / browser_press_key\.(?:submit\|requestSubmit)\s*\(提交表单browser_click 提交按钮\.setAttribute\s*\(\s*[]setAttribute 改值browser_type / browser_select_option / browser_clickObject\s*\.\s*assign\s*\(Object.assign 改属性同上Reflect\s*\.\s*set\s*\(Reflect.set 改属性同上\.execCommand\s*\(execCommand 插入文本browser_type通过键盘输入_refuse_script_interaction在 actions.py 中遍历这张表命中即抛出带完整指引的ValueError而evaluateactions.py在真正执行前先调用它。注意它被刻意做得很窄检查的是赋值与调用所以el.value的读取、el.value x的比较都能通过只有el.value x不行。边界守卫在动作上而不在工具上一个关键设计是守卫放在actions.evaluate里而不是放在 MCP 工具包装函数里。原因在源码注释与测试 test_the_guard_is_on_the_action_not_on_the_tool 中写得很清楚——如果只放在工具函数里任何绕开该函数的路径都会漏过守卫墙就会变成一行注释那么脆弱。server.py里的browser_evaluateserver.py只是薄薄一层包装实际执行路径仍然是work.acting(actions.evaluate, ...)与内置聊天、测试脚本共用同一份实现。这条信息的三处设计关于这条拒绝信息有三点属于设计而非措辞它指名了替代工具并且针对每种情况指名正确的那个赋值给文本框说 browser_type、下拉框说 browser_select_option、复选框说 browser_click所以拒绝是一次改道而不是死胡同。测试 test_every_tool_a_refusal_names_actually_exists 甚至专门验证了拒绝信息里出现的每个browser_*工具都必须真实存在防止把模型指向一个不存在的东西。分界线划在赋值与调用而不是读取上所以检查页面状态仍然自由。测试 test_reading_the_page_is_not_refused 用一整组读取表达式验证了这一点——一个连读取都拒绝的守卫会把模型直接推回它本要阻止的绕行路径。最后一句告诉模型没有工具合适时该怎么办——If no tool fits, say so in your answer rather than working around it.——正是这句话阻止了创造性的绕行。诚实的边界这是对明显路径的护栏不是沙箱这个项目对自己护栏的局限讲得很直白那次拒绝抓得住明显的路不是每条路。JavaScript 有无限种方式表达同一件事。测试文件里专门保留了一个KNOWN_TO_PASS列表test_no_interaction_by_script.py里面如实记录着目前确实拦不住的写法例如HTMLElement.prototype.click.call(el)和el.removeAttribute(disabled)。注释明确说This is a pattern check on the obvious road, not a sandbox——它是值得抓的那些路径上的护栏一次静默放行绝不等于授权。配套测试 test_the_model_is_not_told_the_guard_is_complete 检查的正是诚实这个半边服务器对外文案绝不能宣称守卫是完整的墙而必须说明它是部分的、并要求模型遇到漏网之路时报告而不是使用。因为一个以为门锁着的模型没有理由不去碰门把手。同样的诚实也写进了模型可见的指令块server.pyThat refusal is a guardrail on the obvious road, not a wall around the field... DO NOT read a silent pass as permission: if you find a way to change the page through browser_evaluate, that is the bug, and saying so in your answer is worth more than using it.该拒绝是明显路径上的护栏而非包围整块田地的墙……不要把一个静默通过读作许可如果你找到了通过 browser_evaluate 改变页面的方法那就是一个 bug在回答里说出来比用它更有价值。Layer 3账号才是唯一真正兜底的防线上面所有内容都在你的浏览器内部。唯一能扛住Agent 完全按指示做事、却做在了错误对象上的防御在浏览器之外一个只拥有任务所需权限、不多不少的独立账号。一个只读的 API 用户无论被怎样指示都无法删除。一个独立浏览器配置profile只登录那个账号、别的都不碰。这样爆炸半径被限制在一个服务而不是你拥有的每一个标签页。服务本身提供的任何机制保留三十天的回收站、确认步骤、审计日志、沙箱租户。Should you log your AI agent into your accounts 讨论的是到底要不要给它会话这个问题包括答案是否定的那些情形本文的讨论假定你已经决定给它会话了。实战形态不可逆操作的三件套提议-再确认propose, then confirm对任何不可逆的操作真正有效的模式是Agent 找到目标并报告它将做什么然后由一个人或第二个进程完成最后一次点击。代价只是一次往返却能把一次无法挽回的错误转化成一条你可以直接忽略的消息。没有人工时的替代对副本做干跑当没有人在场时替代方案是针对副本做干跑把同一任务跑在暂存环境或测试账号上先比对输出再对真实环境重复执行。便宜但有效的一招停止条件还有一个便宜的做法——它算不上真正的护栏却能挡住相当大比例的损害给 Agent 一个停止条件。一个由产出物和页面预算限定的运行不会游荡到足够远的地方去碰到那个危险按钮。详见 Giving an AI agent a stopping condition。破坏性里人们常忘记的几项删除是最显而易见的。但真正咬人的清单更长而且每一项都曾通过一次误读页面被触达发送。一条消息、一封邮件、一个会通知到人的表单。没有撤销损害的是一段关系而不是数据。购买。一张已保存的卡加一键结账就是一次误点的事。发布。一篇草稿被贴出去、一个可见性开关被翻转。覆盖。一份表单被保存时里面是 Agent 读得到的字段加上它读不到的位置上的空白——这会在无声中抹掉原本的内容。最后一项是最安静的它在任何时间点看起来都不像破坏性操作却是四种里最可能发生的。它对应的正是 test_the_snapshot_reports_what_the_controls_are_set_to 想解决的另一半问题——快照必须如实报告控件当前状态下拉框的选中值、复选框的勾选与否否则模型连读不到和本来就是空都分不清于是保存时把空白当成原文写回去。会把你引到这里的问题的简短回答怎样阻止 AI Agent 删除东西不靠提示词。用一个没有该权限的账号或一个表面上看不到 delete 的工具面并在一切不可逆操作前保留确认步骤。系统提示词足够让 Agent 保持安全吗不够。提示词和页面是同一介质页面可以反驳你的指令。提示词改变行为倾向但它们不强制。让 Agent 在我的账号上行动最安全的方式是什么一个最小权限的专用账号放在专用配置里在所有没有撤销的操作前加一道提议-再确认步骤。拒绝 JavaScript 就能让 Agent 安全吗它移除了绕过命名工具的最容易的路径而且这个服务器在自己的拒绝信息里把这点说得很直白。它是明显路径上的护栏不是包围田地的墙。最常见的不可逆错误是什么在一个 Agent 读不到现有值的位置保存表单并留下空白。它在发生的过程中看起来永远不像破坏性操作。相关阅读Why did the agent click the wrong thing——本页防范的大部分事故背后的机制How the tools are shaped, and why——为什么小而命名的工具表面是一种安全属性而不只是人体工学属性。依据说明拒绝信息逐字引自本项目自己的 MCP 服务器源码actions.py并得到 test_no_interaction_by_script.py 中以click()、value赋值、submit()调用为代表的多组表达式实测验证三层防御按搭建成本从低到高排列同时与它们能帮多少成反比——这正是大多数人只拥有第一层的原因。赞分享人工智能AI Agent浏览器控制GUI 自动化MCP 服务【免费下载链接】invisible_playwright_mcpPlaywright MCP server undetected by anti-bots and captchas: AI agent browses the web on anti-detect stealth Firefox, Python, undetected browser automation, scraping, computer use.项目地址https://gitcode.com/GitHub_Trending/jo/invisible_playwright_mcp点击查看免费下载相关推荐用 invisible_playwright_mcp 通过 AI Agent 发帖到 XTwitterAPI 与浏览器 Agent 的成本算术与合规边界用 invisible_playwright_mcp 通过 AI Agent 发帖到 XTwitterAPI 与浏览器 Agent 的成本算术与合规边界人工智能AI Agent浏览器控制GUI 自动化MCP 服务BrowserSkill 操作审计为 AI 浏览器操作提供任务级回看与隐私边界BrowserSkill 操作审计为 AI 浏览器操作提供任务级回看与隐私边界 操作审计Operation Audit是 BrowserSkill 面向个人工智能AI 应用AI 技能浏览器控制dsh-pluginMidscene.js模块化设计让AI成为你的浏览器操作者Midscene.js模块化设计让AI成为你的浏览器操作者 Midscene.js是一款革命性的开源框架它通过智能AI技术实现跨平台的浏览器自动化和设备控制人工智能AI Agent测试GUI 自动化浏览器控制测试智能体上一篇如何在5分钟内掌握英雄联盟终极自动化工具箱新手快速入门指南下一篇三步终极指南让经典DirectX游戏在现代Windows上完美运行创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考