最近,draw.io MCP 被公開。
結合這個與 Playwright MCP,
……感覺可以相當自動化,因此在假日時試了一下,留下這篇筆記。
所有提示與技能後文會詳述。
若有“這樣做會更好”的改善建議,期待收到您的評論。
npx)本地 MCP 伺服器可以在本地執行任意程式碼,因此前提是只能使用可信的內容。
此外,處理 .env 的憑證時,請 禁止錯誤提交(.gitignore),並在共享時需小心處理。
基本方針如下:
準備的文件大致分為兩類。
mcp.jsonSKILL.md(Agent Skills).vscode/mcp.json在 .vscode/mcp.json 中,列出此次使用的 draw.io MCP 和 Playwright MCP。
{
"servers": {
"playwright": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@playwright/mcp@latest"]
},
"drawio": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@drawio/mcp@latest"]
}
}
}
SKILL.md(Agent Skills)畫面設計書的創建由兩個 MCP 組成的多步驟構成。
由於每個步驟所需的 MCP 是確定的,因此判斷在 SKILL.md 中嚴格記載步驟和使用工具可以使成果物更穩定,因此此次將基於 SKILL.md 進行。
準備了兩個 SKILL。
原因是,畫面操作部分可能在其他用途上也可以重複使用,而如果全部集中在一起,則內容過於龐大。
這裡將詳細寫出畫面設計書創建時的步驟。
「請製作文件」可能會導致在失敗的情況下也未發現而繼續進行。因此,加上 PowerShell 的 存在檢查 或 嵌入驗證後穩定性會提高。
<details><summary>SKILL.md 記載內容</summary>
---
name: screen-design-doc-generator
description: 製作畫面設計書(Markdown)。使用 Playwright 獲取目標畫面的螢幕截圖,使用 drawio 在全螢幕截圖上新增項號(正方形+數字)的佈局圖(PNG),然後根據畫面項目・輸入規則・轉移・訊息沿用模板撰寫。當被要求創建畫面設計書時使用。
---
# 目的
以一定質量、粒度、格式製作 Web 應用的畫面設計書。
# 使用此技能的時機
- 當要求創建畫面設計書時
# 前提(需要的輸入)
用戶如有不足,請在作業開始前詢問並補充(不要依賴推測)。
- 目標畫面名稱(包含 <screen-name> 的命名)
- 畫面的 URL(如需登錄則提供步驟)
- 畫面的目的(誰的/誰在什麼時候使用的畫面)
- 主要用例(最多 3~5 個)
- 若存在現有的模板/資料夾結構請提供路徑
# 成果物(輸出)
下面的內容會創建/更新(路徑必須統一)。
- `documents/design/ui-design/<screen-name>.md`(畫面設計書)
- `documents/design/ui-design/assets/screens/<screen-name>_full.png`(全螢幕截圖)
- `documents/design/ui-design/assets/screens/<screen-name>_<n>.png`(額外截圖:選擇性)
- `documents/design/ui-design/assets/layouts/<screen-name>.png`(drawio 創建的佈局圖:全螢幕截圖+項號)
- `documents/design/ui-design/assets/layouts/<screen-name>.drawio`(可編輯的源文件)
# 作業步驟
## 1. 理解目標畫面
- 整理畫面的目的、使用者及前提條件(登錄/權限/預先數據)
- 列出畫面的主要用例(最多 3~5 個)
## 2. 使用 Playwright 獲取畫面截圖
- 打開畫面,拍攝初始顯示的全螢幕截圖
- 如果可能,以下內容也應拍攝(基於需求範圍)
- 畫面內的模式視圖
- 驗證錯誤顯示
- 成功提示/失敗訊息
- 將獲取的圖片保存到 `documents/design/ui-design/assets/screens/` 中
- 全螢幕截圖:`<screen-name>_full.png`
- 其他:`<screen-name>_<n>.png`(n 從 1 開始的連號)
## 3. 使用 drawio 創建佈局圖(格式化版本)(在全螢幕截圖上附上項號)
### 3.0 目的
- 確保 `documents/design/ui-design/assets/layouts/<screen-name>.drawio` 中 **嵌入了全螢幕截圖**
- 確保 `documents/design/ui-design/assets/layouts/<screen-name>.png` 被 **確實導出**
- `<screen-name>.png` 是「以全螢幕截圖為底」和「項號(正方形)在最前面」合成的單幅圖片
- 項號的背景色需 **有透明度(Opacity)**
### 3.1 輸入圖片(底圖)的路徑(固定)
- 底圖圖片:`documents/design/ui-design/assets/screens/<screen-name>_full.png`
### 3.2 drawio 資源的創建和保存位置(固定)
- 資源:`documents/design/ui-design/assets/layouts/<screen-name>.drawio`
### 3.3 drawio 的操作(必需:圖片要“嵌入”)
1. 新建或打開 `documents/design/ui-design/assets/layouts/<screen-name>.drawio`
2. **嵌入圖片**以插入
- 將 `documents/design/ui-design/assets/screens/<screen-name>_full.png` 插入到 drawio
- 插入時若可選“鏈接”或“嵌入”,必須選擇 **嵌入(Embed)**
3. 將插入的圖片作為底圖格式化
- 將圖片放置於頁面的左上角(原點)
- 調整頁面尺寸以符合圖片,讓圖片做為整個頁面的底圖(如使用“適合內容 / Fit to content”等)
- 將圖片移至 **最背面(Send to back)** 並鎖定(Lock)以防止後續移動
### 3.4 附加項號(正方形+數字)(必需:最前面・有透明度)
1. 項號使用 **正方形(square)**(禁止使用圓形或對話框)
2. 在正方形中間寫上數字(`1, 2, 3...`)
- 文本需置中對齊
- 正方形大小在所有項目中統一
3. 項號背景色需 **設置透明度(Opacity)**
- 例如:Opacity 40〜60%(數值任意但必需有透明度)
4. 所有項號需統一為 **最前面(Bring to front)**
- 底圖為最背面,項號為最前面
5. 項號需與“畫面項目表”中的項號一致
### 3.5 (選擇性)主要區域的邊框
- 可視需要為主要區域(標頭/搜索條件/列表/底部等)劃定邊框(選擇性)
### 3.6 保存(必需:.drawio 中包含圖片狀態的保存)
- 保存為 `documents/design/ui-design/assets/layouts/<screen-name>.drawio`
- 保存後,**一次關閉該 drawio 文件再重新打開**,確保顯示全螢幕截圖
- 若未顯示,可能是因為選擇了“鏈接保存”,請務必重新以“嵌入”方式插入
### 3.7 PNG 輸出(必需:合成的單幅圖片)
- PNG 輸出路徑:`documents/design/ui-design/assets/layouts/<screen-name>.png`
- 導出的 PNG 需是 **“全螢幕截圖 + 正方形項號”合成的單幅圖片**
- 輸出時需針對整個頁面(Page)進行輸出(禁止僅輸出圖片/選擇範圍)
### 3.8 輸出/嵌入的驗證(必需:若失敗則重新操作)
使用以下 PowerShell 指令檢查成果物,若不符合需重做 3.6〜3.7。
```powershell
# 1) 確保 PNG 存在且不為 0 字節
$png = "documents/design/ui-design/assets/layouts/<screen-name>.png"
if (!(Test-Path $png)) { throw "PNG not exported: $png" }
if ((Get-Item $png).Length -le 0) { throw "PNG is empty: $png" }
# 2) 確保 drawio 存在
$drawio = "documents/design/ui-design/assets/layouts/<screen-name>.drawio"
if (!(Test-Path $drawio)) { throw "DRAWIO not saved: $drawio" }
# 3) 確認 drawio 中是否嵌入圖片(必須包含 data:image)
# ※ 嵌入圖片通常以 data:image 格式存在於 drawio (XML) 中
if (!(Select-String -Path $drawio -Pattern "data:image" -Quiet)) {
throw "Screenshot is likely NOT embedded in drawio: $drawio"
}
"OK: layout png exported and screenshot embedded"
.drawio → 保存 → PNG 輸出 → 再驗證## <畫面名> 畫面設計書
### 1. 概要
- 目的:
- 目標用戶:
- 前提條件:
### 2. 畫面佈局
<!-- 以全螢幕截圖為底加上正方形項號的佈局圖 -->
<img src="./assets/layouts/<screen-name>.png">
### 3. 畫面項目
| 項號 | 項目名稱 | 類型 | 顯示/輸入 | 必填 | 型別/形式 | 位數 | 初始值 | 輸入規則 | 備註 |
|---:|---|---|---|:--:|---|---:|---|---|---|
| 1 | | 文本 | 輸入 | | | | | | |
### 4. 操作・事件
| 畫面項號 | 操作 | 觸發器 | 條件 | 處理內容 | 成功時 | 失敗時 |
|---|---|---|---|---|---|---|
| 1 | 搜索 | 點擊搜索按鈕 | | | | |
### 5. 補充
- 權限/角色:
- 性能/限制:
- 需確認事項:
這裡將確保 Playwright 能夠順利操作的狀態。(啟動確認→如有必要則啟動→登錄→操作→登出)
沒有這一步,Copilot 可能會陷入困境。
<details><summary>SKILL.md 記載內容</summary>
---
name: app-operation-playwright
description: 確保使用 Playwright(Playwright MCP)順利啟動、登錄、操作與登出本地 Web 應用(http://localhost:8080)所需的步驟
---
# 使用 Playwright 進行應用操作(畫面操作步驟)
## 此 SKILL 的前提(重要)
- 目標 URL:`http://localhost:8080`
- 應用啟動需以 **Windows PowerShell** 為前提(命令也以 PowerShell 記載)。
- 數據庫需 **存在 docker-compose.yml**,並啟動 MySQL(`todo-chat` / `todo-chat-test`)。
- 不過 **不需要等候測試容器(todo-chat-test)的 health**(作為要求不必要)。
- 應用的啟動命令如下。
- `cd .\webapp\`
- `.\mvnw.cmd spring-boot:run`
- Java 的版本指定必須以下執行(固定 JDK 21)。
- `$env:JAVA_HOME="C:\Program Files\Java\jdk-21"`
- `$env:Path="$env:JAVA_HOME\bin;$env:Path"`
## 目的
- 讓 Copilot 使用 Playwright(Playwright MCP),能夠 **確認啟動狀態 → 如有必要則啟動 → 登錄 → 畫面操作 → 登出** 至少能夠準確執行。
## 禁止事項
- **禁止推測資格資料(ID/密碼)**(若找不到應停止並確認用戶)
- **禁止破壞性操作**(例如:刪除、退會、收費、管理者操作、數據更改等)
## Playwright 的元素特定規則(本應用前提)
此應用的 HTML 中沒有 `data-testid` 等測試用屬性,故按照以下順序進行特定。
1. 與標籤相關的輸入(`label` → `input`)
2. **placeholder**(輸入欄的提示文字)
3. **name / id** 屬性(如表單部件有持有的情況下)
4. **按鈕或鏈接的顯示文本**(例如:`Login` / `登出`)
不使用 `nth-child` 或過於長的 CSS 選擇器
---
# 作業步驟
## 1. 事前確認“是否已啟動”(確保檢查)
### 1.1 HTTP 疏通檢查(最優先)
如 **返回 HTTP 200/3xx 則表明已啟動**。
```powershell
try {
$r = Invoke-WebRequest -UseBasicParsing http://localhost:8080/ -TimeoutSec 3
$r.StatusCode
} catch {
"NOT_RUNNING"
}
NOT_RUNNING → 請進入「2. 啟動步驟」netstat -ano | Select-String ":8080"
docker-compose.yml 是用於數據庫的。
docker compose -f .\docker-compose.yml ps
$env:JAVA_HOME="C:\Program Files\Java\jdk-21"
$env:Path="$env:JAVA_HOME\bin;$env:Path"
java -version
java -version 的輸出中必須包含 21。docker compose -f .\docker-compose.yml up -d
docker compose -f .\docker-compose.yml ps
todo-chat-test 為測試用途,故 不等待其 health。docker compose ps 中確認到類似生產的數據庫 todo-chat 正在啟動即可。cd .\webapp\
.\mvnw.cmd spring-boot:run
啟動應用後,等待 http://localhost:8080/ 的回應。
for ($i=0; $i -lt 120; $i++) {
try {
$r = Invoke-WebRequest -UseBasicParsing http://localhost:8080/ -TimeoutSec 2
if ($r.StatusCode -ge 200 -and $r.StatusCode -lt 400) { "OK: app is up"; break }
} catch {}
Start-Sleep -Seconds 1
}
http://localhost:8080透過以下來決定是否為登錄畫面
http://localhost:8080/login 一致憑證從 .env 的以下鍵中獲取(確定)。
| 憑證 | 來源 | 鍵 |
|---|---|---|
| username | .env |
APP_USERNAME |
| password | .env |
APP_PASSWORD |
#username 特定使用者名稱輸入欄並輸入 username#password 特定密碼輸入欄並輸入 passwordLogin 的元素http://localhost:8080/home 或Logout)若點擊後仍顯示登錄畫面:
.env 的 APP_USERNAME / APP_PASSWORD 是否正確Logout 的元素。根據以下判定。
http://localhost:8080/loginhttp://localhost:8080docker compose ps).\mvnw.cmd spring-boot:run) 是否仍運行(檢查啟動終端的日誌)docker compose -f .\docker-compose.yml logs --tail=200,確認環境變數(MYSQL_*, TZ)是否正確解決| 憑證 | 來源 | 鍵 |
|---|---|---|
| MYSQL_ROOT_PASSWORD | .env |
MYSQL_ROOT_PASSWORD |
| MYSQL_DATABASE | .env |
MYSQL_DATABASE |
| MYSQL_USER | .env |
MYSQL_USER |
| MYSQL_PASSWORD | .env |
MYSQL_PASSWORD |
java -version 中含有 21)docker compose -f .\docker-compose.yml ps 中 todo-chat 狀態為 runninghttp://localhost:8080/ 返回 200/3xx 回應
</details>儘管 Copilot 透過讀取 .env 獲取憑證,但將其分離為類似 .env.copilot 的 供 Copilot 使用 是較理想的選擇。
此次以 Windows 為前提,因此若考慮 Mac/Linux,則需要將命令部分的記載獨立出來。
創建 SKILL 後,接下來只需將希望創建的畫面信息丟給 Chat。
# 依頼內容
請製作任務列表的畫面設計書。
# 前提
- 畫面名稱: 任務列表
- URL: http://localhost:8080/task
- 畫面的目的: 列出登錄用戶創建的任務,並提供搜索功能
- 主要用例
- 搜索任務
- 搜索項目包括標題、狀態、開始時間的 From~To、結束時間的 From~To
- 除標題外,其他項目為詳細搜索項目
- 當前顯示的任務可以轉至參考畫面
- HTML 路徑: webapp/src/main/resources/templates/task/index.html
約 20 分鐘後,生成了以下 5 個文件。
| 文件 | 路徑 |
|---|---|
| 畫面設計書 | documents/design/ui-design/task-list.md |
| 全螢幕截圖 | documents/design/ui-design/assets/screens/task-list_full.png |
| 詳細搜索展開時的截圖 | documents/design/ui-design/assets/screens/task-list_1.png |
| 佈局圖(PNG) | documents/design/ui-design/assets/layouts/task-list.png |
| 佈局圖(drawio) | documents/design/ui-design/assets/layouts/task-list.drawio |
task-list.md 大約是這樣的格式。

總之,由於 Playwright 的畫面操作成立且文句(規格記載)穩定正確,從沒有畫面設計書的狀態來 0 → 1 的創造用途相當有效。
即使佈局圖未完成,只要手動修正生成的 documents/design/ui-design/assets/layouts/<screen-name>.drawio,即可把設計書完成。
如果仍然存在這兩點,則 在已有畫面設計書的“更新(維護)目標”下尚嫌早。
在已有設計書的情況下,這次的“文句面正確記載”經常已符合要求,更新的難點反而是 畫面佈局(截圖/項號/位置)的跟隨,因此若那部分不穩定使用上會有所不便。
儘管如此,目前在提示側仍有改善空間,也將著手進行改進。
感謝您閱讀到最後!!