ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基于Java开发的Playwright-MCP服务器:把浏览器自动化能力接入TaoToken统一通道

基于Java开发的Playwright-MCP服务器:把浏览器自动化能力接入TaoToken统一通道 1. 为什么要把 Playwright 塞进 MCPJava 浏览器自动化服务器的真实场景浏览器自动化这件事写过爬虫或者做过端到端测试的朋友都不陌生。Playwright 作为微软开源的自动化框架在 Java 生态里已经相当成熟启动一个无头浏览器、点按钮、填表单、截图几行代码就能跑起来。但问题在于当你想让 AI 工具比如 Claude、Cursor、Cherry Studio 这类支持 MCP 协议的客户端去驱动浏览器时直接暴露 Playwright 的 Java API 是不现实的——AI 客户端不认识你的 Java 方法签名它只认 MCP 协议定义的工具调用格式。MCPModel Context Protocol就是干这个的它把「能力」抽象成一个个 tool客户端通过 JSON-RPC 风格的请求来调用。你要做的是用 Java 写一个 MCP 服务器把 Playwright 的导航、截图、点击、填表这些动作包装成 MCP tool然后让 AI 客户端连上来。这样 AI 就能说「帮我打开某个页面并截图」你的 Java 服务收到请求后调 Playwright 执行把结果返回去。这个场景适合谁我总结了三类一是需要批量网页操作又要和 AI 联动的开发者比如让 AI 自动填一批表单、抓一批页面状态二是做自动化测试的团队想把测试动作通过统一通道暴露给 AI 助手三是自己在折腾 MCP 生态想用 Java 而不是 Node/Python 来实现服务端的人。Java 的优势在于工程化成熟、依赖管理清晰、和现有 Spring 项目集成方便尤其你如果本来就有 Spring Boot 服务加一个 MCP 模块比另起一个 Node 进程省心得多。但这里有个绕不开的环节MCP 服务器本身要调用大模型能力比如让模型决定下一步点哪里或者你的 AI 客户端要通过一个统一的 API 通道来访问模型。如果每个工具、每个客户端都各自配一套 Key 和 endpoint管理起来会很乱。所以这篇的核心思路是Java 侧负责 Playwright 的浏览器能力模型调用和统一通道走 TaoToken把 endpoint 收敛到一处。下面我会从依赖、配置、代码、验证到排错一步步把这条链路搭起来。2. 前置准备TaoToken 统一通道与 Java MCP 工程骨架在写代码之前先把两件事理清楚一是模型通道怎么配二是 Java 工程需要哪些依赖。先说通道。TaoToken 提供的是统一的 API 入口官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 。它的作用是让你不用在多个模型供应商之间来回切换配置一个 Key 就能走通。对于 MCP 服务器来说这意味着你的 Java 服务在需要调用模型做决策时Base URL 指向 TaoToken 的 API 地址即可不用改一堆环境变量。你需要先去控制台拿一个 API Key。地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 登录后在 API Keys 页面创建一个。创建完记得复制保存页面上通常只显示一次。如果你还没决定用哪个模型可以先去模型对话页面 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 看看有哪些可选选一个适合工具调用的一般选支持 function calling 的模型。再说 Java 工程。我用的是 Maven 项目核心依赖两块Playwright 和 MCP 官方 Java SDK。Playwright 版本我用的 1.41.2MCP SDK 用的 0.10.0。如果你要做 HTTP SSE 传输让远程客户端能连还需要加 Spring WebFlux 或 WebMVC 的传输依赖。下面是完整的 pom 片段dependencies !-- Playwright 浏览器自动化 -- dependency groupIdcom.microsoft.playwright/groupId artifactIdplaywright/artifactId version1.41.2/version /dependency !-- MCP 官方 Java SDK -- dependency groupIdio.modelcontextprotocol.sdk/groupId artifactIdmcp/artifactId version0.10.0/version /dependency !-- HTTP SSE 传输基于 Spring WebFlux -- dependency groupIdio.modelcontextprotocol.sdk/groupId artifactIdmcp-spring-webflux/artifactId version0.10.0/version /dependency !-- Spring Boot 基础如果你用 Spring 管理生命周期 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter/artifactId /dependency /dependencies这里有个坑我踩过MCP SDK 的版本要和传输模块版本对齐0.10.0 的 mcp 配 0.10.0 的 mcp-spring-webflux混用版本会出现类找不到或者方法签名不匹配。另外 Playwright 的驱动不是 Maven 依赖自动带的需要单独安装这个后面第 4 节会讲。工程结构上我建议至少分三层一个 PlaywrightManager 负责浏览器实例的生命周期初始化、关闭一个 ToolRegistry 负责注册各个 MCP tool一个 ServerBootstrap 负责启动 MCP 服务器。这样职责清晰后面加工具不会乱。如果你只是快速验证也可以全塞一个类里但工具一多就会很难维护。关于模型通道的配置我建议单独放一个配置文件比如 application.yml 或者一个 properties 文件把 Base URL 和 Key 抽出来taotoken: base-url: https://taotoken.net/api api-key: ${TAOTOKEN_API_KEY} model: your-preferred-model-id用环境变量注入 Key 是基本的安全习惯别把 Key 硬编码进代码提交到仓库。后面第 3 节我会给出更完整的配置片段包括 MCP 客户端侧的 settings 写法。3. 可复制配置Java MCP 服务端、Playwright 启动参数与客户端 settings这一节是整篇的核心我会把三份配置都给全Java 服务端的 MCP 初始化、Playwright 的启动参数、以及客户端以支持 MCP 的编辑器为例的 settings 片段。你照着改路径和 Key 就能跑。先看 Java 服务端的 MCP 初始化。核心是用 McpServer.sync(transportProvider) 构建同步服务器声明 serverInfo 和 capabilities然后把各个 tool 注册进去。transportProvider 根据你选的传输方式不同而不同如果用 WebFlux SSE大概是这样的Configuration public class McpServerConfig { private final McpTransportProvider transportProvider; public McpServerConfig(McpTransportProvider transportProvider) { this.transportProvider transportProvider; } PostConstruct public void start() { McpSyncServer syncServer McpServer.sync(transportProvider) .serverInfo(Playwright-Mcp-Server, 1.0.0) .capabilities(McpSchema.ServerCapabilities.builder() .tools(true) .logging() .build()) .build(); try { syncServer.addTool(navigate()); syncServer.addTool(screenshot()); syncServer.addTool(click()); syncServer.addTool(fill()); syncServer.addTool(select()); syncServer.addTool(hover()); syncServer.addTool(evaluate()); syncServer.addTool(closePage()); syncServer.loggingNotification(McpSchema.LoggingMessageNotification.builder() .level(McpSchema.LoggingLevel.DEBUG) .logger(playwright-mcp) .data(Server initialized) .build()); } catch (Exception e) { log.error(注册工具失败: {}, e.getMessage(), e); } } }Playwright 的启动参数是另一个关键点。默认情况下 Playwright 会下载自己的 Chromium但如果你机器上已经有 Edge 或者想用系统浏览器可以指定 channel。下面这段是初始化逻辑注意 headless 参数——调试阶段建议设 false能看到浏览器窗口方便确认操作对不对上线再改 true。private Playwright playwright; private Browser browser; private Page page; private void initializePlaywright() { if (playwright null) { playwright Playwright.create(); } if (browser null) { browser playwright.chromium().launch( new BrowserType.LaunchOptions() .setChannel(msedge) // 用系统 Edge避免重复下载 .setHeadless(false) // 调试期开窗口 .setSlowMo(100) // 每步慢 100ms方便观察 ); } if (page null) { page browser.newPage(); } }如果你不想用 Edge把 setChannel 去掉就会用 Playwright 自带的 Chromium。setSlowMo 这个参数在调试时特别有用能让每个动作之间有间隔肉眼能跟上。接下来是客户端侧的 settings。以支持 MCP 的编辑器为例通常是在配置文件里声明一个 mcpServers 节点指定命令、参数和环境变量。如果你用的是 SSE 传输配置的是 URL如果是 stdio 传输配置的是启动命令。下面给一个 SSE 方式的 JSON 片段{ mcpServers: { playwright-java: { url: http://localhost:8080/sse, env: { TAOTOKEN_BASE_URL: https://taotoken.net/api, TAOTOKEN_API_KEY: 你的Key, TAOTOKEN_MODEL: 你的模型ID } } } }如果你用的是 Cline 或者 Claude Code 这类工具配置文件的路径和字段名会略有不同但核心三件套是一样的Base URL、Key、Model ID。Base URL 填 https://taotoken.net/api Key 填你在控制台创建的那个Model ID 填你选的模型标识。这三样对齐了客户端才能正确路由请求。这里要提醒一句MCP 服务器本身不一定要调模型它只是暴露工具。真正调模型的是客户端。所以 TaoToken 的配置主要影响的是客户端侧以及你的 Java 服务如果内部有模型调用逻辑的话。把 endpoint 统一到 TaoToken好处是你换模型、换供应商时只改一处不用动 Java 代码。4. 端到端验证从驱动安装到一次 navigate screenshot 成功返回配置写完了接下来是验证。这一步我建议按顺序来先装驱动再启动服务最后用客户端发一次真实请求。第一步安装 Playwright 驱动。虽然程序会自动检测并安装但自动安装依赖网络经常失败。手动装更稳mvn exec:java -e -D exec.mainClasscom.microsoft.playwright.CLI -D exec.argsinstall这条命令默认装 webkit、chromium、firefox 三个。如果你只用 Chromium可以指定mvn exec:java -e -D exec.mainClasscom.microsoft.playwright.CLI -D exec.argsinstall chromium装完之后驱动会放在用户目录下的缓存里比如~/.cache/ms-playwrightLinux/Mac或者%USERPROFILE%\AppData\Local\ms-playwrightWindows。你可以去这个目录确认一下有没有对应的文件夹。第二步启动你的 Java MCP 服务。如果是 Spring Boot 项目直接 run 主类如果是普通 Java 项目用 mvn exec 启动。启动后看日志应该能看到「Server initialized」这条 DEBUG 日志说明 MCP 服务器起来了工具也注册成功了。如果日志里报「创建 JSON Schema 时发生错误」多半是某个 tool 的 schema 字符串格式有问题检查一下 JSON 是否合法。第三步在客户端里发一次请求。我用的是 navigate 加 screenshot 的组合先打开一个页面再截图确认。在客户端的对话里输入类似这样的指令请调用 navigate 工具打开 https://example.com 然后调用 screenshot 工具截图。客户端会把这两个请求转成 MCP tool call 发到你的 Java 服务。你的服务收到后navigate 会调 page.navigate(url)screenshot 会调 page.screenshot() 并把图片数据返回。如果一切正常客户端会显示「Navigated to https://example.com」和一张截图。这里有个细节screenshot 返回的是二进制数据MCP 协议里通常用 base64 编码的 ImageContent 来传。你的 tool 实现里要把它包装成 McpSchema.ImageContent而不是 TextContent。如果客户端显示的是乱码或者报「reading choices」之类的错多半是内容类型没对上。验证成功的标志有三个一是客户端收到了 navigate 的成功返回二是截图能正常显示三是你的 Java 服务日志里没有异常堆栈。三个都满足说明整条链路通了。这时候你可以再试一个复杂点的动作比如 fill 填表单加 click 点按钮确认交互类工具也正常。如果验证失败别急着改代码先看第 5 节的排错对照表大部分问题都能在那里找到答案。5. 常见报错排查401、local proxy failed、reading choices、OAuth 逐条对照这一节我把实际遇到过的几类报错整理出来每条给出原因和解决方向。你对照自己的日志看。401 Unauthorized。这个最常见基本是 Key 的问题。三种可能Key 没填、Key 填错、Key 过期。先检查客户端 settings 里的 TAOTOKEN_API_KEY 是不是完整复制了有没有多余空格。如果 Key 是对的检查 Base URL 是不是 https://taotoken.net/api 路径写错也会导致鉴权失败。还有一种情况是你用了环境变量但没生效可以在 Java 里打印一下 System.getenv 确认。local proxy failed。这个报错通常出现在客户端尝试连接 MCP 服务器时。原因可能是你的 Java 服务没启动、端口不对、或者防火墙拦了。先确认服务在监听netstat 或 lsof 看端口再确认客户端配置的 URL 和实际端口一致。如果是 SSE 传输URL 一般是 http://localhost:8080/sse别漏了 /sse 后缀。reading choices 相关错误。这个多半是模型返回格式和客户端预期不一致。如果你在 Java 服务里调了模型检查一下请求体里的 model 字段是不是填了正确的 Model ID。有些客户端对返回的 JSON 结构有要求如果模型返回的是流式但客户端按非流式解析也会报这个。解决方法是确认 Model ID 和客户端支持的调用方式匹配。OAuth 相关报错。如果你用的是 Claude Code 这类需要 OAuth 的工具报 OAuth 错误通常是认证流程没走完或者 token 过期。这种情况建议检查你的认证配置确认 token 有效。如果是在 MCP 服务器侧一般不会涉及 OAuth除非你的服务本身做了鉴权。除了这四类还有几个小坑Playwright 驱动没装会报「Executable doesnt exist」回去跑第 4 节的安装命令端口被占用会报「Address already in use」换个端口或者杀掉占用进程MCP SDK 版本不匹配会报「NoSuchMethodError」检查 pom 里 mcp 和 mcp-spring-webflux 版本是否一致。排查的时候有个通用技巧先把日志级别调到 DEBUG看完整的请求和响应。MCP 的交互是 JSON-RPC请求和响应都能在日志里看到对照着看哪一步断了比猜要快得多。6. 把通道收敛到 TaoToken长期编码与 Agent 场景的接入建议链路跑通之后最后聊聊怎么把它用得更顺。核心思路是把模型通道收敛到 TaoToken让你的 Java MCP 服务和客户端都指向同一个 endpoint。对于长期做编码或者 Agent 场景的朋友我建议关注 Coding Plan。地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。它的定位是给需要持续调用模型的开发场景用的比按次调用更适合高频使用。如果你的 MCP 服务每天要处理大量浏览器自动化任务每次都要调模型做决策用 Coding Plan 会比零散调用省心。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有完整的 API 说明和示例。API Keys 管理在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 你可以在这里创建多个 Key按项目或者环境分开方便管理和轮换。如果你用的是 Claude Code 这类工具它有自己的接入方式可以参考 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentClaudeCodeAnthropicutm_campaignrewrite 里的说明。核心还是那三件套Base URL、Key、Model ID配对了就能用。最后给一个实用建议把 Playwright 的浏览器实例做成可复用的别每次 tool 调用都重新 launch。我的做法是在 PlaywrightManager 里维护单例第一次调用时初始化后续复用服务关闭时统一释放。这样批量操作时性能会好很多。另外截图和页面内容这类大返回注意控制大小必要时压缩或者只返回关键区域避免把客户端撑爆。这套东西我实测下来从零搭到跑通大概半天主要时间花在驱动安装和版本对齐上。你把第 3 节的配置抄过去改改路径和 Key应该能更快。
返回列表