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

相关推荐
双力臂4045 分钟前
MyBatis动态SQL进阶:复杂查询与性能优化实战
java·sql·性能优化·mybatis
六毛的毛36 分钟前
Springboot开发常见注解一览
java·spring boot·后端
程序漫游人1 小时前
centos8.5安装jdk21详细安装教程
java·linux
超级码.里奥.农1 小时前
零基础 “入坑” Java--- 七、数组(二)
java·开发语言
hqxstudying2 小时前
Java创建型模式---单例模式
java·数据结构·设计模式·代码规范
挺菜的2 小时前
【算法刷题记录(简单题)002】字符串字符匹配(java代码实现)
java·开发语言·算法
A__tao2 小时前
一键将 SQL 转为 Java 实体类,全面支持 MySQL / PostgreSQL / Oracle!
java·sql·mysql
堆栈future2 小时前
揭秘 Google A2A 协议:赋能智能体协作的未来
llm·agent·mcp
一只叫煤球的猫2 小时前
真实事故复盘:Redis分布式锁居然失效了?公司十年老程序员踩的坑
java·redis·后端
猴哥源码2 小时前
基于Java+SpringBoot的农事管理系统
java·spring boot