基于Java开发的浏览器自动化Playwright-MCP服务器

基于Java开发的浏览器自动化MCP服务器

这是使用 Java 语言开发的一个简单的浏览器自动化 MCP 服务器,并通过 Cherry Studio 进行测试。

功能概述

  • 支持导航到指定 URL
  • 提供截图功能以捕获页面状态
  • 支持点击、选择、填写表单字段等常见浏览器操作
  • 集成日志记录和异常处理机制

安装依赖

将以下 Maven 依赖添加到你的项目中:

添加playwright依赖

xml 复制代码
<dependency>
	<groupId>com.microsoft.playwright</groupId>
    <artifactId>playwright</artifactId>
    <version>1.41.2</version>
</dependency>

使用 MCP 官方的 Java SDK

xml 复制代码
<dependency>
    <groupId>io.modelcontextprotocol.sdk</groupId>
    <artifactId>mcp</artifactId>
    <version>0.10.0</version>
</dependency>

对于 HTTP SSE 传输实现,添加以下依赖之一:

基于 Spring WebFlux 的 SSE 客户端和服务器传输

xml 复制代码
<dependency>
    <groupId>io.modelcontextprotocol.sdk</groupId>
    <artifactId>mcp-spring-webflux</artifactId>
</dependency>

基于 Spring WebMVC 的 SSE 服务器传输

xml 复制代码
<dependency>
    <groupId>io.modelcontextprotocol.sdk</groupId>
    <artifactId>mcp-spring-webmvc</artifactId>
</dependency>

代码实现

初始化Playwright

  • 创建 Playwright 实例并启动一个无头 Edge 浏览器。
  • 打开一个新的页面对象 (Page) 用于后续操作。
java 复制代码
private Playwright playwright;
private Browser browser;
private Page page;

/**
 * 初始化Playwright
 */
private void initializePlaywright() {
    if (playwright == null) {
        playwright = Playwright.create();
    }
    if (browser == null) {
        browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setChannel("msedge").setHeadless(false));
    }
    if (page == null) {
        page = browser.newPage();
    }
}

工具方法

创建MCP服务中的工具,这里只展示navigate导航到指定 URL。

java 复制代码
/**
 * 创建一个工具,用于导航到指定URL
 * @return 工具结果
 */
private McpServerFeatures.SyncToolSpecification navigate(){
    String desc = """
            navigate to a URL
            """;
    String schema = """
            {
              "type" : "object",
              "properties" : {
                "url" : {
                  "type" : "string"
                }
              }
            }
            """;
    return new McpServerFeatures.SyncToolSpecification(
            new McpSchema.Tool("navigate", desc, schema),
            (exchange, arguments) -> {
                List<McpSchema.Content> result = new ArrayList<>();
                try {
                    String url = (String) arguments.get("url");
                    initializePlaywright();
                    page.navigate(url);
                    result.add(new McpSchema.TextContent("Navigated to " + url));
                    return new McpSchema.CallToolResult(result, false);
                }catch (Exception e){
                    // 处理异常
                    result.add(new McpSchema.TextContent(e.getMessage()));
                    return new McpSchema.CallToolResult(result, true);
                }
            }
    );
}

启动MCP服务

  • 在 Spring 的 @PostConstruct 注解下启动 MCP 同步服务器。
  • 配置了服务器信息(名称、版本)和能力(支持工具、日志等)。
  • 添加多个工具到服务器中,每个工具都对应一种网页操作,如导航、截图、点击等。
java 复制代码
@PostConstruct
public void start() {
    // 创建并配置MCP同步服务器
    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(parseThePage());
        syncServer.addTool(screenshot());
        syncServer.addTool(click());
        syncServer.addTool(iframeClick());
        syncServer.addTool(select());
        syncServer.addTool(fill());
        syncServer.addTool(hover());
        syncServer.addTool(evaluate());
        syncServer.addTool(consoleLogs());
        syncServer.addTool(closePage());


        // 发送日志通知
        syncServer.loggingNotification(McpSchema.LoggingMessageNotification.builder()
                .level(McpSchema.LoggingLevel.DEBUG)
                .logger("custom-logger")
                .data("Server initialized")
                .build());
    }catch (Exception e){
        // 处理异常,例如打印错误信息
        log.error("创建JSON Schema时发生错误: {}" , e.getMessage());
        e.printStackTrace();
    }
}

关闭资源

  • 使用 @PreDestroy 注解确保在 Bean 销毁前释放 Playwright 资源(关闭页面、浏览器、Playwright 实例)。
java 复制代码
@PreDestroy
public void close() {
    if (page != null) {
        page.close();
        page = null;
    }
    if (browser != null) {
        browser.close();
        browser = null;
    }
    if (playwright != null) {
        playwright.close();
        playwright = null;
    }
}

驱动安装

PlayWright需要浏览器驱动,程序自动检测是否存在驱动,不存在就会自动安装,但安装取决于网路,经常会失败,所以还是手动安装的好。

bash 复制代码
mvn exec:java -e -D exec.mainClass=com.microsoft.playwright.CLI -D exec.args="install"

默认安装三大浏览器驱动webkit、chromium、firefox。

你还可以通过提供参数来安装特定的浏览器:

bash 复制代码
mvn exec:java -e -D exec.mainClass=com.microsoft.playwright.CLI -D exec.args="install chromium"

客户端测试

  1. 配置mcp服务
  1. 提问

代码地址

https://github.com/daydayup-zyn/Playwright-MCP

相关推荐
ONLYOFFICE13 小时前
【技术教程】如何将文档编辑器集成至基于Java的Web应用程序
java·编辑器·onlyoffice
lbwxxc13 小时前
手写 Tomcat
java·tomcat
CHEN5_0213 小时前
【CouponHub项目开发】使用RocketMQ5.x实现延时修改优惠券状态,并通过使用模板方法模式重构消息队列发送功能
java·重构·模板方法模式·项目
杨杨杨大侠13 小时前
实战案例:商品详情页数据聚合服务的技术实现
java·spring·github
杨杨杨大侠13 小时前
实战案例:保险理赔线上审核系统的技术实现
java·spring·github
计算机毕设定制辅导-无忧学长13 小时前
MQTT 与 Java 框架集成:Spring Boot 实战(一)
java·网络·spring boot
叫我阿柒啊13 小时前
从Java全栈到Vue3实战:一次真实面试的深度复盘
java·spring boot·微服务·vue3·响应式编程·前后端分离·restful api
快乐非自愿13 小时前
掌握设计模式--模板方法模式
java·设计模式·模板方法模式
云飞云共享云桌面13 小时前
SolidWorks对电脑的硬件配置要求具体有哪些
java·服务器·前端·网络·数据库
塔子终结者13 小时前
网络安全A模块专项练习任务十解析
java·服务器·网络安全