칩을 만드는 회사는 칩만 팔지 않는다. 칩과 함께 평가보드를 낸다. "우리 칩은 이런 걸 할 수 있습니다" 하고 손에 쥐여 주는 작은 기판이다.
그 보드에 화면을 붙이는 순간 일이 커진다. 그래픽 라이브러리를 올리고, 폰트를 넣고, 터치 드라이버를 붙이고, 레이아웃을 짜고, 그 전부를 플래시에 굽는다. 버튼 위치 하나 바꾸려면 다시 굽는다. 그래서 대부분의 평가보드는 화면 없이 나가고, 화면이 필요한 고객은 다른 회사를 찾는다.
이 편은 그걸 다르게 한다. 보드에 GUI를 얹지 않는다. 대신 보드가 두 가지를 내준다 — 자기가 할 수 있는 일의 목록과, 그 일을 보여줄 화면의 정의. 그리면 밖에서 그린다.
책상 위 WeAct STM32H723 보드로 실제로 했다.
보드가 내주는 것
USB 시리얼로 붙어서 물어보면 이렇게 답한다.
[serial] connected via serial_bridge /dev/cu.usbmodem365D395E33331 115200
[serial] tools: led.set, sys.info
[serial] resources: ui://app, ui://app/info, bundle://manifest.json
도구 둘, 리소스 셋. 이게 이 보드의 표면 전부다.
도구는 이렇게 생겼다.
{"tools":[
{"name":"led.set","description":"Turn the on-board LED on or off",
"inputSchema":{"type":"object","properties":{"on":{"type":"boolean"}},"required":["on"]}},
{"name":"sys.info","description":"Report LED state and uptime",
"inputSchema":{"type":"object","properties":{}}}]}
led.set 과 sys.info. 이 보드는 그 밖에도 할 수 있는 게 많다 — 플래시를 지우고, 클럭을 바꾸고, 부트로더로 넘어갈 수 있다. 그 능력들은 목록에 없고, 목록에 없으면 부를 이름이 없다.
화면도 보드가 갖고 있다
ui://app 을 읽으면 화면 정의가 나온다.
[serial] ui://app — 656 B, type "page", title "WeAct H723 MCP Node"
656 바이트. 한 화면이 그 정도다. 클라이언트에는 이 보드용 UI 코드가 한 줄도 없다 — 받아서 그린다.

눌러 보면 보드가 반응한다
화면의 버튼이 led.set 을 부른다. 실제 왕복이다.
[serial] led.set({"on":true}) -> "LED on" (1 ms)
[serial] sys.info({}) -> "LED=on uptime=205491208ms" (10 ms)
[serial] led.set({"on":false}) -> "LED off" (10 ms)
[serial] sys.info({}) -> "LED=off uptime=205491232ms" (11 ms)
[serial] uptime advanced 205491208 -> 205491232 ms
책상 위 보드의 LED가 켜지고 꺼졌다. 그리고 마지막 줄을 봐 달라 — uptime 이 205491208에서 205491232로 24밀리초 전진했다. 미리 넣어 둔 답이 아니라 그 순간 보드가 세고 있던 값이다. 녹화된 응답이면 두 번 물었을 때 같은 숫자가 나온다.
왕복은 1~11밀리초다. UART 위라서 그렇다.
같은 클라이언트가 다른 칩에도 붙는다
이게 이 구조의 값어치다. 같은 코드로 Wi-Fi 너머 ESP32에 붙었다.
[tcp] connected via tcp_bridge mcp-esp32.local 6270
[tcp] tools: led.set, sys.info
[tcp] ui://app — 158 B, type "application", title "ESP32 MCP Node"
[tcp] application — initialRoute "/" -> ui://page/main
[tcp] ui://page/main — 1894 B
[tcp] led.set({"on":true}) -> "LED on" (89 ms)
[tcp] uptime advanced 67004328 -> 67004391 ms

다른 회사 칩, 다른 전송, 같은 클라이언트. 바뀐 것은 브리지 프로그램 하나다.
그리고 두 보드의 화면 구조가 다르다. STM32는 페이지 하나(type: "page", 656 B)를, ESP32는 라우트를 가진 애플리케이션(type: "application", 158 B + 페이지 1894 B)을 내준다. 보드가 자기 화면의 모양을 스스로 정한다.
지연은 다르다. UART가 1~11ms, Wi-Fi TCP가 17~89ms. 자릿수가 다르고 그 차이가 UI 설계를 가른다 — 한 자릿수 쪽은 "누르면 바로"를 기대해도 되고, 수십 밀리초 쪽은 대기 상태를 화면에 그려야 한다.