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: |arg1|arg2|... - 或者 FINAL_ANSWER: DONE
- 解析这一行并调用MCP工具。 无手动GUI调用 在这里——代理驱动着一切。
requirements.txt– macOS 依赖项(无仅适用于 Windows 的库):
mcp
google-genai
python-dotenv
pyautogui
pyobjc
pillow______________________________________________________________________
与(讲师使用的)Windows/MS Paint基线相比,发生了什么变化
- 操作系统切换(Windows → macOS)
- 替换 pywinauto / pywin32 (介词)与……一起;带着 pyautogui + AppleScript(苹果脚本) 控制 Preview.app(预览应用) (适用于 Apple Silicon)。 - 移除了仅适用于Windows的软件包;已更新 requirements.txt 因此,相应地。
- 相对于窗口的坐标
- 服务器 读取预览窗口的边界 并且将窗口相对(的坐标/位置)转换为 (x, y) 转换为绝对屏幕坐标。 - 这使得事物具有了抵御(或抵抗)……的能力 多显示器 设置和不同的分辨率。
- 客户端无需手动调用绘图功能
- talk2mcp.py 现在 仅 转发代理的 FUNCTION_CALL: 连接到服务器的线路。 - 代理本身决定顺序: open_paint → draw_rectangle → add_text_in_paint → FINAL_ANSWER。
- 强大的工具激活
- 预览标记工具栏是通过程序切换的。 - 工具通过 菜单导航 (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)
- 创建虚拟环境并安装
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt- API密钥
创建一个 .env 项目根目录中的文件:
GEMINI_API_KEY=your_google_api_key_here- 权限(非常重要)
- 系统设置 → 隐私与安全
- 无障碍性 → 允许您的终端/iTerm/Python - 屏幕录制 → 允许同样的(行为/情况)
- 如果更改未生效,请重启您的终端。
______________________________________________________________________
跑
打开两个终端(或标签页):
航站楼A – 服务器
source venv/bin/activate
python server.pyB航站楼 - 客户区
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: 控制台中的命令行和服务器的响应。
