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

相关推荐
还是鼠鼠25 分钟前
tlias智能学习辅助系统--Maven 高级-私服介绍与资源上传下载
java·spring boot·后端·spring·maven
程序员小潘1 小时前
Java开发MCP服务器
mcp
Xiaokai丶1 小时前
Java 8 新特性深度剖析:核心要点与代码实战
java
灵魂猎手1 小时前
3. MyBatis Executor:SQL 执行的核心引擎
java·后端·源码
Galaxy在掘金1 小时前
从业8年,谈谈我认知的后端架构之路-1
java·架构
努力努力再努力wz1 小时前
【c++深入系列】:万字详解模版(下)
java·c++·redis
瓦特what?3 小时前
关于C++的#include的超超超详细讲解
java·开发语言·数据结构·c++·算法·信息可视化·数据挖掘
是乐谷3 小时前
阿里云杭州 AI 产品法务岗位信息分享(2025 年 8 月)
java·人工智能·阿里云·面试·职场和发展·机器人·云计算
CodeDevMaster3 小时前
从零到一:打包并发布你的第一个MCP AI工具服务
mcp
逍岚子3 小时前
以官网计算器为例:手把手教你用 TypeScript SDK 开发 MCP Server
llm·agent·mcp