news 2026/5/10 2:26:48

基于MCP协议实现Docker容器AI化管理的开源工具docker-mcp详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于MCP协议实现Docker容器AI化管理的开源工具docker-mcp详解

1. 项目概述:一个为Docker容器注入MCP能力的开源工具

最近在折腾AI应用开发,特别是那些需要让大语言模型(LLM)去操作外部系统和工具的场景。相信很多同行都接触过类似的需求:你想让ChatGPT或者Claude去管理你的服务器、查询数据库状态,甚至是控制智能家居。这时候,一个核心的挑战就出现了——如何让AI安全、可控地“动手”?

传统的做法可能是写一堆特定的API接口,然后通过复杂的提示词工程去调用,但这不仅开发量大,而且通用性差。直到我遇到了MCP(Model Context Protocol)这个由Anthropic提出的开放协议。它本质上定义了一套标准,让任何工具或数据源都能以一种LLM能理解的方式“自我介绍”并“被调用”。而今天要聊的这个项目coolbit-in/docker-mcp,就是一个将MCP协议与Docker容器管理深度结合的绝佳范例。

简单来说,docker-mcp是一个开源的MCP服务器实现。它把自己“包装”成一个标准的MCP服务端,任何兼容MCP协议的客户端(比如Claude Desktop、Cursor IDE,或者你自己写的AI应用)都可以通过它来安全地执行Docker命令。你不再需要手动在终端敲docker psdocker run,而是可以直接对你的AI助手说:“帮我看看现在有哪些容器在运行”,或者“请把那个测试用的Nginx服务重启一下”。

这个项目的价值在于,它把Docker这种强大的基础设施管理能力,无缝地“翻译”成了AI能理解和安全使用的“语言”。对于开发者、运维工程师乃至是技术管理者来说,这意味着可以通过自然语言来执行复杂的容器编排和运维任务,极大地提升了效率并降低了操作门槛。接下来,我将从设计思路、核心实现到避坑指南,完整拆解这个项目。

2. 核心设计思路与架构解析

2.1 为什么是MCP?协议层的标准化价值

在深入代码之前,必须先理解MCP协议的核心思想。你可以把它想象成计算机硬件里的“驱动程序”标准。在MCP出现之前,每个AI应用如果想连接一个新工具(比如Git、数据库、Docker),都需要为这个工具单独开发一套连接和调用逻辑。这导致了大量的重复劳动和生态碎片化。

MCP协议规定了两件关键事:

  1. 工具声明(Tools):服务端(Server)必须向客户端(Client)清晰地声明自己提供了哪些“工具”(函数),每个工具需要什么参数(name, description, input schema)。例如,docker-mcp会声明一个叫list_containers的工具,描述是“列出所有容器”,参数可能包括all(是否显示已停止的容器)等。
  2. 调用与执行(Execution):客户端(比如Claude)根据用户的指令,选择匹配的工具,并按照预定格式发起调用请求。服务端接收请求,执行对应的实际操作(比如调用Docker SDK执行docker ps -a),然后将结构化的结果返回给客户端。

docker-mcp项目的核心设计,就是严格遵循这套协议,将Docker Engine丰富的CLI命令或API功能,映射成一个个MCP工具。这种设计带来了几个显著优势:

  • 安全性:AI客户端只能调用服务端明确声明的、参数经过校验的工具。你可以精细控制AI能做什么,比如只允许listinspect,禁止rmexec
  • 可发现性:AI客户端在连接时就能自动获取所有可用工具的列表和用法说明,无需硬编码。
  • 生态互通:任何兼容MCP的客户端都能立即使用docker-mcp,实现了“一次开发,处处可用”。

2.2 项目架构与模块职责

这个项目虽然精悍,但结构清晰,遵循了典型的MCP服务器结构。我们来看一下它的核心模块划分:

  1. 协议适配层(MCP Server Implementation): 这是项目的“外壳”,负责与MCP客户端通信。它通常基于某个MCP SDK(如TypeScript的@modelcontextprotocol/sdk)构建,实现了MCP协议要求的initializetools/listtools/call等核心生命周期方法。这一层不关心Docker的具体逻辑,只负责协议的编解码、会话管理和路由——将客户端的工具调用请求,转发给内部的“业务逻辑层”。

  2. 业务逻辑层(Docker Service Layer): 这是项目的“大脑”,包含了所有Docker操作的具体实现。它会将MCP协议中的工具调用,翻译成对Docker Engine API的调用。这一层需要处理:

    • Docker客户端初始化:如何连接到Docker守护进程(本地socket或远程TCP)。
    • 命令映射:将list_containers映射为docker.listContainers({ all: true })(假设使用Dockerode库)。
    • 参数处理与校验:验证客户端传来的参数是否合法,比如容器名称格式、端口映射规则等。
    • 结果格式化:将Docker API返回的原始(通常是JSON)数据,转换成MCP协议要求的、易于LLM理解的文本或结构化数据格式。
  3. 工具注册与配置层(Tool Registry & Config): 这是项目的“菜单”,明确定义了对外暴露哪些工具。一个设计良好的MCP服务器会在这里进行精细的权限控制。docker-mcp可能会提供如下工具组:

    • 查询类list_containers,list_images,container_inspect,image_inspect,view_logs
    • 生命周期管理类run_container,start_container,stop_container,restart_container,remove_container
    • 运维类prune_system(清理资源),stats(查看容器资源使用)。

    项目的配置文件(如config.json或环境变量)允许用户启用或禁用特定工具组,或者配置连接Docker的详细参数。

2.3 技术选型考量:为什么用Node.js/Python?

从项目名称和常见实现看,docker-mcp很可能基于Node.js(使用Dockerode库)或Python(使用Docker SDK)。这两种选型都非常合理:

  • Node.js + Dockerode:优势在于异步非阻塞I/O模型非常适合处理大量并发的、I/O密集型的容器管理请求。Dockerode库成熟且API友好。对于需要构建高并发MCP服务端的场景是优选。
  • Python + docker-py:优势在于生态丰富,易于与现有的Python运维脚本、AI框架(如LangChain)集成。代码对于大多数运维开发者和数据科学家来说更易读易写。

无论哪种实现,关键都在于选用的Docker客户端库必须稳定、功能完整,并且能很好地支持Docker Engine的各种API版本。

3. 核心功能拆解与实操部署

3.1 环境准备与快速启动

假设我们面对的是一个Node.js实现的docker-mcp。要让这个MCP服务器跑起来,你需要以下环境:

  1. 基础环境

    • 一台安装并运行了Docker Daemon的机器(Linux/macOS/Windows WSL2)。
    • Node.js运行环境(建议版本16+)。
    • Git(用于克隆代码)。
  2. 获取项目代码

    git clone https://github.com/coolbit-in/docker-mcp.git cd docker-mcp
  3. 安装依赖

    npm install # 或使用 yarn/pnpm

    这一步会安装@modelcontextprotocol/sdkdockerode以及其他必要的工具库。

  4. 配置连接: 默认情况下,Dockerode会尝试连接本地Unix socket(/var/run/docker.sock)。在Linux或macOS上,你需要确保运行该服务的用户有权限读写这个socket文件。通常需要将用户加入docker用户组:

    sudo usermod -aG docker $USER # 操作后需要重新登录生效

    如果Docker运行在远程主机或使用TCP端口,则需要通过环境变量或配置文件指定:

    export DOCKER_HOST=tcp://192.168.1.100:2375 # 注意:直接暴露2375端口有安全风险,生产环境务必使用TLS加密。
  5. 启动MCP服务器: 查看项目的package.json,通常启动命令是:

    npm start # 或者直接运行主文件 node src/server.js

    服务器启动后,默认会在某个端口(如8080)监听,或者以Stdio方式运行,等待MCP客户端通过标准输入输出进行通信。

注意:首次运行前,务必仔细阅读项目的README.mdconfig.example.json(如果有)。有些项目可能要求你复制一份配置文件并修改,以启用/禁用特定工具或设置权限白名单。

3.2 如何与MCP客户端集成(以Claude Desktop为例)

docker-mcp本身只是一个服务端,它的价值需要通过MCP客户端来体现。这里以目前最流行的客户端之一Claude Desktop为例,展示集成步骤。

  1. 配置Claude Desktop: 在Claude Desktop中,MCP服务器的配置通常放在一个特定的配置文件中。对于macOS,路径可能是~/Library/Application Support/Claude/claude_desktop_config.json。你需要在此文件中添加docker-mcp服务器的配置。

  2. 配置示例(Stdio模式): 如果docker-mcp设计为通过标准输入输出通信,配置可能如下所示:

    { "mcpServers": { "docker-manager": { "command": "node", "args": ["/absolute/path/to/docker-mcp/src/server.js"], "env": { "DOCKER_HOST": "unix:///var/run/docker.sock" } } } }
    • command: 启动服务器的命令,这里是node
    • args: 命令的参数,指向你克隆的项目中的主服务器文件。
    • env: 设置必要的环境变量,这里指定了Docker连接方式。
  3. 配置示例(HTTP模式): 如果docker-mcp是一个HTTP服务器,配置则不同:

    { "mcpServers": { "docker-manager": { "url": "http://localhost:8080" } } }
  4. 重启与验证: 保存配置文件后,完全重启Claude Desktop应用。重启后,在Claude的聊天界面,你应该能看到新的工具可用。通常Claude会主动说“我获得了新的能力”,或者你可以尝试输入“你能用Docker做什么?”来触发它列举工具。

  5. 开始使用: 集成成功后,你就可以进行自然语言交互了:

    • “请列出所有正在运行的容器。”
    • “帮我启动一个名为my-redis的容器。”
    • “查看容器web-app最近50行的日志。” AI会理解你的意图,调用对应的MCP工具,并将执行结果清晰地返回给你。

3.3 核心工具的实现细节与安全考量

让我们深入一个核心工具,比如run_container,看看docker-mcp在实现时需要考虑哪些细节。

1. 工具声明(Server Side): 在代码中,这个工具会被这样定义并注册到MCP服务器:

// 伪代码示例 server.setRequestHandler(ToolsListRequest, async () => { return { tools: [ { name: "run_container", description: "拉取并运行一个新的Docker容器。", inputSchema: { type: "object", properties: { image: { type: "string", description: "容器镜像名称,例如: nginx:latest, redis:alpine" }, name: { type: "string", description: "为容器指定一个名称(可选)" }, ports: { type: "array", items: { type: "string" }, description: "端口映射,格式为 '主机端口:容器端口',例如: ['8080:80', '8443:443']" }, env: { type: "object", description: "环境变量键值对,例如: {\"MYSQL_ROOT_PASSWORD\": \"secret\"}" }, // ... 其他参数如 volumes, restart policy 等 }, required: ["image"] // 镜像名是必填项 } }, // ... 其他工具 ] }; });

这个声明清晰地告诉了AI客户端:有一个叫run_container的工具,它需要哪些参数,每个参数是什么类型和含义。

2. 工具执行与安全拦截(Server Side): 当AI客户端发起调用时,服务端收到请求并执行:

server.setRequestHandler(ToolCallRequest, async (request) => { if (request.params.name === "run_container") { const { image, name, ports, env } = request.params.arguments; // !!! 关键安全步骤:输入验证与过滤 !!! // 1. 镜像名安全校验:防止注入恶意镜像名 if (!isValidImageName(image)) { throw new Error(`无效的镜像名称: ${image}`); } // 2. 端口映射校验:防止绑定危险端口或冲突 const validatedPorts = validateAndParsePorts(ports); // 3. 环境变量过滤:可能过滤掉某些敏感键名 const filteredEnv = filterSensitiveEnvVars(env); // 连接Docker引擎并创建容器 const docker = new Docker(); const container = await docker.createContainer({ Image: image, name: name, HostConfig: { PortBindings: validatedPorts, }, Env: Object.entries(filteredEnv).map(([k, v]) => `${k}=${v}`), }); await container.start(); return { content: [{ type: "text", text: `容器 '${name || container.id}' 已成功启动,镜像: ${image}。` }] }; } });

3. 安全考量是重中之重

  • 权限最小化:运行docker-mcp服务的进程本身不应具有root权限。应该使用非root用户,并仅授予其必要的Docker socket访问权。
  • 工具白名单:在配置中,应允许管理员禁用高风险工具(如exec_containercommit),仅开放只读或低风险操作。
  • 输入净化:对所有来自客户端的参数(容器名、镜像名、命令)进行严格的验证和转义,防止命令注入攻击。例如,镜像名应只允许字母、数字、斜线、冒号、点、横线等有限字符。
  • 资源限制:可以考虑在工具实现中,对容器运行的资源(CPU、内存)进行默认限制,防止AI意外启动一个资源黑洞。
  • 审计日志:所有通过MCP执行的Docker操作,都应该被详细记录(谁、何时、执行了什么、结果如何),便于事后追溯和审计。

4. 高级应用场景与扩展思路

4.1 场景一:自动化开发测试环境管理

对于开发团队,每天可能需要多次搭建和销毁复杂的多服务测试环境(例如,一个由Web前端、API后端、数据库、消息队列组成的完整应用栈)。传统方式需要编写和维护复杂的docker-compose.yml脚本,并手动执行命令。

使用docker-mcp的智能化流程

  1. 环境描述:开发者直接对AI说:“请为我搭建一个测试环境,包含最新版的PostgreSQL 16、Redis 7,以及一个连接到它们的Node.js API服务,API服务使用我本地./app目录的代码进行热重载。”
  2. AI理解与规划:AI(通过MCP客户端)识别出需要调用多个工具:pull_image(拉取镜像)、run_container(运行容器)、inspect_container(检查网络以便连接)。
  3. 有序执行:AI会按依赖顺序调用工具:先启动PostgreSQL和Redis,获取它们的容器IP;然后启动Node.js容器,并通过环境变量将数据库连接信息传递进去。
  4. 状态反馈:AI最终会汇总报告:“环境已就绪。PostgreSQL运行在172.18.0.2:5432,Redis在172.18.0.3:6379,Node.js API在localhost:3000。API容器日志已关联,以下是启动日志...”

这种方式将环境管理的认知负荷从开发者转移到了AI,开发者只需关注“想要什么”,而不是“如何做到”。

4.2 场景二:智能运维监控与自愈

在运维监控场景,docker-mcp可以与其他监控工具(如Prometheus Exporter)结合,实现初步的智能自愈。

扩展实现思路

  1. 创建自定义监控工具:在docker-mcp的基础上,新增一个check_container_health工具。这个工具内部会调用Docker API检查容器的状态(Running, Exited, Restarting),并可以进一步调用容器内预置的健康检查端点,或查询集成的监控系统API。
  2. AI驱动决策:在Claude等客户端中,你可以设置一个定时任务或触发式提示:“每隔5分钟,检查所有标记为‘关键服务’的容器健康状态。”
  3. 执行自愈动作:当AI通过check_container_health发现某个容器异常退出时,它可以自动决策并调用restart_container工具尝试重启。如果重启失败,则可以调用view_logs获取最新错误日志,并发送告警通知给人类运维人员。

实操心得:在这个场景下,务必为AI设置清晰的决策边界。例如,只能重启特定标签的容器,连续重启失败超过3次则停止并告警,绝对不允许自动删除容器或卷。这需要在工具的实现逻辑和客户端的提示词中双重约束。

4.3 扩展项目:构建专属的MCP工具集

docker-mcp提供了一个完美的范本。你可以借鉴其架构,为其他系统构建MCP服务器,打造一个属于你个人或团队的“AI可操控工具矩阵”。

例如,你可以创建

  • git-mcp:让AI执行git clone, pull, commit, push,甚至基于代码变更生成commit message。
  • cloud-mcp:封装AWS CLI或Azure SDK,让AI管理云资源(启停EC2实例、创建S3存储桶)。
  • internal-api-mcp:将公司内部的管理系统、CRM、工单系统的API封装成安全的MCP工具,让AI成为跨系统操作的统一助手。

扩展的关键步骤

  1. 选择合适的MCP SDK:根据你的主力语言,选择@modelcontextprotocol/sdk(JS/TS) 或mcp(Python) 等官方或社区SDK。
  2. 定义工具集:像docker-mcp一样,仔细规划要暴露哪些操作,设计好每个工具的输入输出schema。
  3. 实现业务逻辑:在工具调用处理函数中,接入目标系统(Git、云平台API)的客户端库。
  4. 强化安全与错误处理:这是比功能实现更重要的部分。必须对输入进行验证,对操作进行鉴权,对异常进行友好处理并反馈给AI。
  5. 配置与集成:编写清晰的配置文件,并测试与Claude Desktop、Cursor等客户端的集成。

5. 常见问题、故障排查与性能优化

5.1 连接与权限问题

这是初次使用docker-mcp时最常遇到的问题。

问题现象可能原因排查步骤与解决方案
启动服务器时报错Cannot connect to Docker1. Docker守护进程未运行。
2. 当前用户无权访问Docker socket。
1. 运行systemctl status dockerdocker info确认Docker服务状态。
2. 将当前用户加入docker组:sudo usermod -aG docker $USER注销并重新登录使组生效。
3. 检查/var/run/docker.sock的权限:ls -l /var/run/docker.sock
Claude Desktop无法发现docker-mcp工具1. MCP服务器配置错误。
2. 服务器进程启动失败。
3. Claude Desktop配置路径或格式错误。
1. 检查docker-mcp服务器是否独立运行成功:node src/server.js应无报错并开始监听或等待输入。
2.仔细核对Claude Desktop配置文件的路径和JSON格式,一个多余的逗号都会导致解析失败。可以使用JSON验证工具检查。
3. 查看Claude Desktop的日志文件(位置因系统而异),里面通常有加载MCP服务器失败的具体原因。
执行Docker命令时提示“权限被拒绝”即使加入了docker组,在某些系统上,通过某些方式(如systemd服务)启动的进程可能无法继承用户组。1. 最直接的方法:以root权限运行(不推荐,仅用于测试)。
2. 修改Docker socket权限(临时方案):sudo chmod 666 /var/run/docker.sock(有安全风险)
3.推荐方案:确保运行docker-mcp的服务进程是以已加入docker组的用户身份启动的。对于systemd服务,需要在Service单元文件中设置User=Group=

5.2 工具调用失败与错误处理

当AI客户端显示工具调用失败时,需要层层排查。

  1. 检查服务器日志:首先查看docker-mcp服务进程输出的日志。这里会有最详细的错误信息,比如“镜像不存在”、“端口已被占用”、“参数验证失败”等。
  2. 理解MCP错误返回:MCP协议要求工具调用返回标准的结构。在docker-mcp的代码中,错误应该被捕获并包装成ToolCall的 error 信息返回给客户端。确保你的实现没有让未处理的异常导致整个服务器崩溃。
  3. 模拟客户端调用进行测试:你可以编写一个简单的测试脚本,直接模拟MCP客户端向你的服务器发送工具调用请求,这能帮你隔离问题,确定是服务器逻辑错误还是客户端交互问题。
    # 示例:使用netcat (stdio模式) 或 curl (http模式) 进行简单测试 # 假设服务器通过stdio通信,发送一个简单的JSON-RPC请求 echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}' | node src/server.js

5.3 性能优化与最佳实践

当管理的容器数量众多或操作频繁时,性能需要考虑。

  1. 连接池与Docker客户端复用:不要在每次工具调用时都创建新的Docker客户端连接。应该在服务器初始化时创建一个全局的、可复用的Docker客户端实例,并确保其连接是持久化的。对于Node.js的Dockerode,它内部会管理连接;对于Python的docker-py,也应注意客户端实例的复用。
  2. 异步非阻塞操作:所有Docker API调用(如列出容器、拉取镜像)都是I/O操作,必须使用异步模式(Async/Await, Promises),避免阻塞服务器的主线程,影响其他并发请求的处理。
  3. 实现结果缓存:对于一些频繁调用且结果变化不快的只读操作,比如list_images(镜像列表),可以考虑在服务端添加一个短期缓存(例如,缓存5秒)。这能显著减少对Docker Engine的直接请求,提升响应速度。
  4. 限制并发与超时:为工具执行设置超时限制,防止某个长时间运行的Docker命令(如构建镜像)挂起整个请求线程。同时,可以根据服务器资源情况,限制并发工具调用的数量。
  5. 使用轻量级镜像:如果docker-mcp本身被容器化部署,确保使用Node.js或Python的Alpine等轻量级基础镜像,减少资源占用和启动时间。

5.4 安全性加固 checklist

在将docker-mcp用于任何接近生产环境或团队共享环境前,请务必完成以下安全检查:

  • [ ]非root用户运行:确保进程以非root的专用用户运行。
  • [ ]网络隔离:如果以HTTP服务器模式运行,将其部署在内网,或通过反向代理(如Nginx)添加HTTPS和身份验证。
  • [ ]工具白名单:在配置中显式禁用exec,commit,prune system等高风险命令,仅开放必要的最小权限集。
  • [ ]输入验证:对所有从AI客户端传入的字符串参数(容器名、镜像名、命令)进行严格的格式校验和净化,防止shell注入或参数注入。
  • [ ]资源配额:考虑在工具实现中,为run_container等操作添加默认的CPU和内存限制。
  • [ ]审计日志:实现详细的日志记录,记录每个工具调用的来源(客户端ID)、参数、执行结果和时间戳。日志应输出到文件或日志收集系统,便于审计。
  • [ ]客户端访问控制:如果可能,在MCP服务器层实现简单的API密钥认证,只允许受信任的客户端连接。

6. 总结与个人实践体会

折腾完docker-mcp这个项目,我最深的体会是:MCP协议正在为AI与工具生态的融合铺平一条非常实用的道路。它不像一些过于宏大的Agent框架,而是从“协议”这个轻量但关键的角度切入,解决了互操作性的核心痛点。

在实际集成到Claude Desktop使用的几周里,它确实改变了我与开发环境交互的方式。一些琐碎的、需要上下文切换的操作变得无比自然——“把那个失败的测试容器日志发我看看”、“给所有开发环境的容器打上今天日期的标签”、“清理掉所有上周的临时镜像”。这些想法可以直接用语言表达并立刻执行,思维流不再被命令行语法所打断。

对于想要借鉴此项目构建自己MCP服务器的朋友,我的建议是:从一个小而具体的痛点工具开始。不要试图一口气封装一个系统的所有API。先做一个能解决你每天重复三次操作的那个工具,比如jira-mcp只实现“创建任务”和“更新状态”,log-mcp只实现“按服务名搜索最近错误”。这样你能快速跑通MCP的开发、部署、集成全流程,获得正反馈,然后再逐步迭代增加功能。

最后,docker-mcp的代码本身也是一个很好的学习范本。它的结构清晰地展示了如何将一套复杂的操作(Docker CLI)分解、建模成一个个独立的、可描述的“工具”,并通过一个标准的协议暴露出去。这种设计思路,对于构建任何面向AI的、可组合的工具服务,都具有很高的参考价值。随着MCP生态的成熟,我相信这类项目会像当年的Homebrew公式或Docker镜像一样,成为一个丰富的、即插即用的AI能力仓库。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 2:25:21

AI赋能Web 3.0内容治理:构建检测-感知-治理的智能闭环

1. 项目概述:当Web 3.0内容遇上AI治理最近和几个做内容平台和社区的朋友聊天,大家普遍头疼一个问题:现在的Web 3.0应用,无论是去中心化社交、DAO治理论坛,还是NFT社区,内容产生的速度和复杂度远超传统Web 2…

作者头像 李华
网站建设 2026/5/10 2:22:12

CANN/hcomm:获取组内rank ID

get_group_rank_from_world_rank 【免费下载链接】hcomm HCOMM(Huawei Communication)是HCCL的通信基础库,提供通信域以及通信资源的管理能力。 项目地址: https://gitcode.com/cann/hcomm 产品支持情况 Ascend 950PR/Ascend 950DT&a…

作者头像 李华
网站建设 2026/5/10 2:17:49

CANN/ascend-transformer-boost自定义算子开发指南

ATB加速库外部开发者自定义算子目录 【免费下载链接】ascend-transformer-boost 本项目是CANN提供的是一款高效、可靠的Transformer加速库,基于华为Ascend AI处理器,提供Transformer定制化场景的高性能融合算子。 项目地址: https://gitcode.com/cann/…

作者头像 李华
网站建设 2026/5/10 2:11:51

A2ASearch MCP Server:AI智能体生态的统一搜索引擎与黄页

1. 项目概述:A2ASearch MCP Server,你的AI智能体生态“黄页” 如果你和我一样,每天都在和Claude、Cursor这些AI助手打交道,那你肯定遇到过这个痛点:想找一个能帮你自动化浏览器操作的MCP服务器,或者一个能…

作者头像 李华