GUI绘图代理控制工具

一个通过MCP工具控制无API的GUI绘图应用的代理(LLM),能够自动打开绘图应用、绘制矩形并在矩形内添加文本。

  • by sushant097
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 sushant097/Custom-MCP-server-to-paint-in-Python

使用说明

EAG v2 — 作业4(代理 → MCP → 图形用户界面“绘图”)

制作一个 代理(大型语言模型) 控制一个GUI绘图应用 没有API 通过调用MCP工具。代理必须打开一个类似绘图的应用程序,绘制一个矩形,然后输入文本 里面 矩形——带有 无需手动调用绘图功能 在客户端代码中。

这个仓库包含一个 已准备好连接Mac 使用……的解决方案 Preview.app(预览应用) + 标记 使用其他工具,而不是MS Paint。


这个仓库里有什么

  • server.py – MCP(微型计算机原理/最小系统配置/多点控制单元,具体含义根据上下文确定) 服务器 展示图形用户界面(GUI)工具:

    • open_paint() → 打开 预览 在空白画布上,调整窗口大小,显示标记工具栏
    • draw_rectangle(x1, y1, x2, y2) → 通过 Preview 绘制一个矩形 工具 → 添加注释 → 矩形
    • add_text_in_paint(text) → 插入一个 文本 框选并输入您的文本
    • 所有坐标均为 窗口相对的 (原点 = 预览前端窗口的左上角)
  • talk2mcp.py – MCP(最小成本路径/多协议控制器等,具体含义需根据上下文确定) 客户端代理:

    • 通过标准输入输出启动服务器并列出可用工具

    • 使用Gemini Flash 2.0(通过 google-genai) 带着一个 严格的系统提示 这迫使模型输出 每一步一行:

      • FUNCTION_CALL: <tool_name>|arg1|arg2|...
      • 或者 FINAL_ANSWER: DONE
    • 解析这一行并调用MCP工具。 无手动GUI调用 在这里——代理驱动着一切。

  • requirements.txt – macOS 依赖项(无仅适用于 Windows 的库):

    mcp
    google-genai
    python-dotenv
    pyautogui
    pyobjc
    pillow
    

与(讲师使用的)Windows/MS Paint基线相比,发生了什么变化

  1. 操作系统切换(Windows → macOS)

    • 替换 pywinauto / pywin32 (介词)与……一起;带着 pyautogui + AppleScript(苹果脚本) 控制 Preview.app(预览应用) (适用于 Apple Silicon)。
    • 移除了仅适用于Windows的软件包;已更新 requirements.txt 因此,相应地。
  2. 相对于窗口的坐标

    • 服务器 读取预览窗口的边界 并且将窗口相对(的坐标/位置)转换为 (x, y) 转换为绝对屏幕坐标。
    • 这使得事物具有了抵御(或抵抗)……的能力 多显示器 设置和不同的分辨率。
  3. 客户端无需手动调用绘图功能

    • talk2mcp.py 现在 仅 转发代理的 FUNCTION_CALL: 连接到服务器的线路。
    • 代理本身决定顺序: open_paint → draw_rectangle → add_text_in_paint → FINAL_ANSWER。
  4. 强大的工具激活

    • 预览标记工具栏是通过程序切换的。
    • 工具通过 菜单导航 (AppleScript),其在不同设置中的可靠性高于键盘快捷键。

它是如何工作的(流程)

+--------------------+       MCP (stdio)        +------------------+      mac GUI
|  talk2mcp.py       |  <-------------------->  |    server.py     |   (Preview.app)
|  (Agent client)    |                          |   (MCP server)   |
+--------------------+                          +------------------+
        |  list_tools()                                  |
        |----------------------------------------------->|
        |                                                |
        |  prompt LLM (system prompt lists tools)        |
        |                                                |
        |  LLM: "FUNCTION_CALL: open_paint"              |
        |----------------------------------------------->|  open Preview + Markup toolbar
        |  LLM: "FUNCTION_CALL: draw_rectangle|x1|y1|x2|y2"
        |----------------------------------------------->|  drag to draw rectangle
        |  LLM: "FUNCTION_CALL: add_text_in_paint|Hello" |
        |----------------------------------------------->|  place text box + type
        |  LLM: "FINAL_ANSWER: DONE"                     |
        v
     complete

设置(macOS)

  1. 创建虚拟环境并安装

    python -m venv venv
    source venv/bin/activate
    pip install -r requirements.txt
    
  2. API密钥 创建一个 .env 项目根目录中的文件:

    GEMINI_API_KEY=your_google_api_key_here
    
  3. 权限(非常重要)

    • 系统设置 → 隐私与安全

      • 无障碍性 → 允许您的终端/iTerm/Python
      • 屏幕录制 → 允许同样的(行为/情况)
    • 如果更改未生效,请重启您的终端。


跑

打开两个终端(或标签页):

航站楼A – 服务器

source venv/bin/activate
python server.py

B航站楼 - 客户区

source venv/bin/activate
python talk2mcp.py

你应该看到代理发出类似这样的调用:

FUNCTION_CALL: open_paint
FUNCTION_CALL: draw_rectangle|400|250|1100|650
FUNCTION_CALL: add_text_in_paint|What is the capital of Nepal?
FINAL_ANSWER: DONE

在预览中,你会看到一个矩形框,里面是你输入的文本。


调整智能体的行为

  • 在 talk2mcp.py:

    • 在矩形框内设置您想要书写的内容:

      user_text = "Hello from the Agent!"
      query = f'Task: Draw a rectangle and write the following text inside it: "{user_text}".'
      
    • 这个(或“它”) 系统提示 已经采用了单行回复格式,并提到了三种工具。

  • 如果代理(或代表)移出画布范围:

    • 调整您建议的矩形坐标(代理通常会在首次运行成功后选择合理的值)。
    • 你也可以添加一个提示到 query例如,“使用窗口大致中心的坐标。”

坐标与多显示器笔记

  • 所有工具坐标均相对于窗口 in server.py。

    • (0,0) 是的 预览窗口的左上角。
    • 如果你的矩形不可见,请尝试使用更小的值(例如。, x1=200, y1=150, x2=1000, y2=600)。
  • 服务器将窗口调整为已知的矩形尺寸(默认值: left=100, top=80, width=1400, height=900) 以使此过程可重复。你可以更改这些(内部设置) open_paint()。


故障排除

  • 预览无响应/点击无效果

    • 检查 无障碍性 + 屏幕录制 权限。
    • 确保“预览”处于最前面(服务器调用时) activate_app("Preview"),但请尝试手动点击一次“预览”)。
  • “文本”工具未插入

    • 菜单可以本地化。在 server.py菜单点击是:

      Tools → Annotate → Text
      

      如果您的系统语言不同,请更改 "Text" 到您当地的菜单标签。

  • 双子座错误(认证/模型)

    • 确认 .env 具有有效性 GEMINI_API_KEY。
    • 需要互联网 google-genai.
  • 代理一直说着“完成”却不进行绘制

    • 系统提示强制要求调用工具,但如果仍然发生(这种情况),请增加循环迭代次数 talk2mcp.py 或者在其中加入更明确的提示 query 就像“先调用open_paint,然后draw_rectangle,接着add_text_in_paint。”

快速常见问题解答

问:如果我以后换用Windows系统,还能继续使用MS Paint吗?

A: 是的。交换 server.py 翻译为中文是:“对于使用(某功能/技术)的Windows版本” pywinauto 并保持 talk2mcp.py 未更改(工具名称保持不变)。

问:代理可以自行选择坐标吗?

A: 是的;提示语会鼓励这样做。如果选择不佳,可以在提示语中添加坐标提示或提供一个“安全默认矩形”。

问:我如何验证代理确实调用了工具?

A: 两者都是 talk2mcp.py 并且 server.py 为每个工具调用打印日志——你会看到 FUNCTION_CALL: 控制台中的命令行和服务器的响应。