基于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

相关推荐
音符犹如代码6 小时前
Java并发List实战:CopyOnWriteArrayList原理与ArrayList常见面试题
java·开发语言·面试·list
代码or搬砖6 小时前
Docker 部署 Java 项目实践
java·docker·容器
又是忙碌的一天7 小时前
抽象类和接口
java·开发语言
August_._7 小时前
【MySQL】SQL语法详细总结
java·数据库·后端·sql·mysql·oracle
Dxxyyyy7 小时前
零基础学JAVA--Day26(枚举类)
java·开发语言
☼←安于亥时→❦7 小时前
Playwright 安装与使用
python·playwright
黑屋里的马7 小时前
java的设计模式之桥接模式(Bridge)
java·算法·桥接模式
升鲜宝供应链及收银系统源代码服务7 小时前
升鲜宝生鲜配送供应链管理系统---PMS--商品品牌多语言存储与 Redis 缓存同步实现
java·开发语言·数据库·redis·缓存·开源·供应链系统
练习时长一年7 小时前
Spring AoP的切点匹配
java·开发语言
27669582927 小时前
朴朴超市小程序分析
java·python·小程序·node·sign·朴朴超市·sign-v2