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

相关推荐
写后端的胖头鱼4 小时前
【高频面试题】面试题里常出现的Bitmap是什么(附源码和多种场景)
java·开发语言·面试·位图·bitmap
benbenAItalk12 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
sunshine22 girl13 小时前
Java学习二 基本语法2, 算术运算符
java·学习
niucloud-admin13 小时前
JAVA V6 多商户商城 开发文档——插件目录结构
java·开发语言
2601_9628857213 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
滕州市燕猫虎计算机科技工作室个体工商户13 小时前
Java锁
java·开发语言
shehuiyuelaiyuehao15 小时前
1计算机是如何工作的
java·计算机网络
letisgo516 小时前
JAVA 高级进阶07篇《@Transactional失效的8个场景:代理机制到传播行为》
java·面试·transactional·spring事务·aop动态代理
水域安全老周16 小时前
水趣钓鱼救生衣专利拆解:两级锁紧如何解决落水人衣分离
java·前端·网络
三84416 小时前
Java 模板注入(FreeMarker) · 02 · 模板引擎与 FreeMarker 语法
java·开发语言·web安全·freemarker