Python 코드로 UI를 짠다, JSON이 70% 더 무겁다는 걸 알기 전까지는
MCP 앱은 툴 결과가 에이전트를 거치지 않고 사용자에게 HTML·CSS·JS로 직접 도달하게 해주는 프로토콜 확장이다. 문제는 FastMCP 사용자 대부분이 Python 엔지니어라는 것. Prefect 창업자이자 FastMCP 저자인 Jeremiah Lowin은 React를 Python에서 흉내 내는 대신, 컨텍스트 매니저로 UI 구조를 쌓는 Python DSL "Prefab"을 만들었다고 발표했다.
- MCP 앱의 구조 — 기존 MCP 툴 요청은 항상 에이전트의 컨텍스트 창을 거치지만, MCP 앱은 툴 결과를 에이전트 대신 사용자에게 직접 HTML·CSS·JavaScript로 보낸다.
- 7월 확장 예고 — 7월 MCP 릴리스에서는 에이전트도 앱과 직접 상호작용할 수 있게 되어, 예컨대 체스처럼 에이전트와 사람이 번갈아 앱을 조작하는 시나리오가 가능해진다.
- 사용자 제약 — FastMCP 사용자는 대부분 기업 소속 Python 엔지니어이며 브랜드형 소비자 UI가 아니라 테이블·폼·차트로 정보를 공유하고 수집하는 것이 목적이다.
- Prefab 공개 — 이 제약을 바탕으로 몇 달 전 오픈소스로 공개한 Prefab은 컨텍스트 매니저를 중첩해 UI 구조를 쌓는 Python DSL이며, 각 컴포넌트는 인스턴스화하는 클래스로 130~140개를 제공한다.
- 파이프라인의 핵심 — Prefab은 Python DSL을 선언적 표현으로, 이를 JSON 프로토콜로 직렬화하고, 이 JSON을 React 앱이 렌더링하는 파이프라인이며, Lowin은 Python DSL은 사후에 발견한 우연이고 핵심은 직렬화 가능한 JSON이라고 말한다.
- 문서도 Prefab으로 — Prefab 문서의 데이터 테이블 컴포넌트 설명은 100% Prefab으로 렌더링되며, 플레이그라운드에서 Python 코드를 실시간으로 수정하면 UI가 바로 갱신된다.
- 인터랙티브 툴 — FastMCP 툴 함수가 딕셔너리 대신 Prefab의 데이터 테이블 컴포넌트를 반환하도록 한 줄만 바꾸면 FastMCP가 자동으로 HTML·JS·CSS 렌더링까지 처리해 검색·필터·정렬·페이지네이션이 되는 테이블이 생긴다.
- 그리드 조합 — 데이터 테이블 옆에 파이 차트를 붙이는 것도 grid와 pie chart 클래스를 임포트해 컨텍스트 매니저로 조합하는 것만으로 가능하다.
- 반응형 변수 — RX라는 반응형 변수 클래스를 컴포넌트에 공유 속성으로 지정하면 JavaScript를 한 줄도 쓰지 않고 클라이언트 사이드 상호작용이 자동으로 연결된다.
- 업로드 문제 — 에이전트만 MCP 서버에 접근할 수 있기 때문에 순진한 업로드 툴은 에이전트가 파일을 한 글자씩 다시 타이핑해 넣는 '세상에서 가장 비싼 복사·붙여넣기'가 되며, Prefab의 업로드 컴포넌트는 파일이 에이전트를 우회해 서버로 바로 가게 한다.
- 완전 생성형 UI — 에이전트가 Prefab의 JSON 프로토콜을 스트리밍하면 서버가 실시간으로 그 JSON을 치유하며 렌더링해, 사람이 UI를 정의하지 않아도 에이전트가 즉석에서 화면을 만들어낸다.
- JSON 대신 Python 전송 — Python으로 표현한 UI가 JSON 표현보다 약 70% 더 작다는 것을 발견한 뒤, 지금은 에이전트가 JSON 대신 Python을 스트리밍해 서버 샌드박스에서 실행 후 JSON으로 변환·렌더링하는 방식으로 바꿨다.
그가 한 말
파이썬은 사실 나중에 발견한 우연이었습니다. 제가 원했던 건 좀 특이한 것이었을 뿐이고, 이 작업의 핵심은 UI를 직렬화 가능한 표현으로 만들 수 있느냐는 것이었고, 그게 바로 JSON 프로토콜입니다.The Python is actually an accident that I discovered after the fact because it was a weird idiosyncratic thing that I wanted. The point of this was can we create a serializable representation of a UI and that's the JSON protocol again.7분 54초

오직 에이전트만이 MCP 서버에 접근할 수 있기 때문에 파일을 MCP 서버에 그냥 업로드할 수는 없습니다. 반드시 에이전트의 두뇌를 거쳐야 하죠. 그래서 많은 사람들이 MCP 서버에 업로드 툴을 만들면서 에이전트가 실제로 그걸 호출해야 한다는 걸 잊어버립니다. 결국 세상에서 가장 비싼 복사-붙여넣기 작업을 하게 되는 겁니다. 에이전트에게 1메가바이트의 텍스트를 주면, 에이전트가 그걸 한 글자씩 MCP에 다시 타이핑해 넣는 거예요. 업로드는 된 게 맞지만 극도로, 극도로 비효율적입니다.So as you can see because only the agent has access to an MCP server you can't simply upload a file to an MCP server. It has to go through the brain of the agent. And so what ends up happening is a lot of people create basically an upload tool on their MCP server forget that the agent has to actually call it. And what you end up doing is the world's most expensive copy paste operation. You give the agent a megabyte of text. the agent retypes it character by character into the MCP and now yes in fact you have uploaded it but it's extremely extremely inefficient.13분 28초
결국 우리가 발견한 것은 UI의 파이썬 표현이 JSON 표현보다 약 70% 더 작다는 사실이었습니다.What we ended up discovering is that the Python representation of a UI is about 70% smaller than the JSON representation.15분 59초

이해관계 · 발화자는 Prefect의 창업자·CEO이자 FastMCP 저자로, 이번 발표에서 소개한 오픈소스 Prefab과 FastMCP는 그의 회사가 만들고 유지하는 제품이다.
덧붙임 — 여기에 하나 덧붙이면, "Python 코드가 UI를 만든다"는 표면적 신기함보다 중요한 건 JSON이라는 직렬화 가능한 중간 표현 자체다. 사람이 짜든 에이전트가 실시간 생성하든 같은 파이프라인을 타게 만든 설계가, Python이 JSON보다 70% 가볍다는 뒤늦은 발견으로 이어진 셈이다.
오늘 밤 해볼 수 있는 한 가지
FastMCP 최신 버전을 설치해 Prefab의 데이터 테이블 컴포넌트를 임포트하고, 기존 툴 함수의 반환값을 딕셔너리에서 데이터 테이블 컴포넌트 한 줄로 바꿔 goose 같은 MCP 앱 지원 클라이언트에서 결과가 어떻게 렌더링되는지 직접 확인해본다.