使用说明
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基线相比,发生了什么变化
-
操作系统切换(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.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: 控制台中的命令行和服务器的响应。