채팅창 안에 앱이 들어오면, 무엇까지 믿어도 될까?

대화창 안에 폼과 차트가 있는 작은 인터랙티브 카드와 아직 연결되지 않은 경계를 표현한 일러스트
Grok Imagine을 사용해 생성한 AI 이미지입니다.

주간 학습 폼에서 복습을 15분에서 25분으로 바꾸자 그래프와 합계가 90분에서 100분으로 바뀌었다. 다만 이 장면은 규격 제작 측이 배포한 시험용 프로그램인 공식 로컬 참조 호스트의 삽입 화면에서 본 것이다. ChatGPT·Claude Desktop·VS Code에서 확인한 장면은 아니다. 화면, 입력 검증, 저장, AI의 다음 답, 다른 서비스에서의 작동은 서로 다른 약속이다.

여기서 호스트란 앱 화면을 띄우고 도구 연결을 중개하는 프로그램을 뜻한다. 이 차이를 확인하려고 가상의 예시 데이터만 쓰는 최소 앱을 시험했다.

이 글의 목차

화면과 AI 도구를 잇는 규격

MCP(Model Context Protocol)는 AI 호스트와 외부 도구를 연결하는 규격이다. MCP Apps는 여기에 삽입형 HTML 화면을 덧붙이는 선택 확장이다. 지원하는 호스트가 화면을 어떻게 표시할지 결정한다. 폼과 차트는 MCP 전용 부품이 아니라 일반 HTML·자바스크립트 화면이다. 구조는 2026-01-26 안정판 규격과 공식 개요에서 확인할 수 있다.

앱에는 계산 도구와 화면용 검증·저장 도구만 넣었다. 기본 데이터는 읽기 30분, 실습 45분, 복습 15분, 합계 90분이다. 기기 권한과 외부 콘텐츠 도메인은 요청하지 않았다.

2026년 9월 7일 Node 24.19.0, @modelcontextprotocol/ext-apps 1.7.5, MCP SDK 1.29.0으로 시험했다. 공식 로컬 참조 호스트 basic-host 1.7.5의 커밋 92f46a5를 사용했다. 빌드 검사 25개는 모두 통과했고 기록된 직접 추가 비용은 0달러였다. 이 25/25는 구현 검사일 뿐, 아래 18개 실제 동작 시험의 합격 수가 아니다.

한영 폼은 작동했지만 결함도 있었다

한·영 기본 합계 90분과 복습/Review를 25분으로 바꾼 합계 100분은 서버 결과·삽입 화면·화면 읽기용 텍스트와 차트에서 일치했다. 화면을 띄울 수 없다고 알린 접속 프로그램도 세 항목과 합계가 담긴 완전한 텍스트를 받았다.

지원하지 않는 언어 코드 zz에서는 서버가 영어 대체 결과와 경고를 보냈지만 화면은 한국어를 표시하고 경고도 숨겼다. 다른 네 오류 입력은 거부했지만, 이 서버·화면 불일치 때문에 오류 입력 시험(표의 I2)은 FAIL이다. 불일치가 앱의 언어 처리와 호스트 동작 중 어디에서 비롯됐는지는 이번 시험으로 특정하지 못했다.

저장과 AI 문맥은 따로 봐야 한다

성공한 복원은 채팅의 기억이 아니었다. 가상의 세션 ID를 이용해 로컬 서버 프로세스 안의 저장소(server_store)에 저장한 뒤, 새 화면이 같은 ID를 보내 합계 100분을 복원했다. 서버 재시작·실제 계정·다른 기기나 호스트의 지속성은 증명하지 않는다.

화면을 그대로 둔 채 값이 유지되는지 보려 했지만, 확인 기준이 될 바뀐 값을 서버에 만들어 두지 못했다. 닫았다 다시 열었을 때는 닫기 전에도 기본값, 다시 열 때도 기본값을 넣어서 값이 초기화된 것인지 같은 값으로 덮어쓴 것인지 구별할 수 없었다. 그래서 V1·V2는 앱 실패가 아니라 INVALID, 즉 시험은 했지만 절차 결함으로 결론을 낼 수 없는 결과다. 저장 실패 시험 S2는 시험 자체를 하지 않아 NOT TESTED다.

화면 값, 서버 결과, 문맥 갱신 요청, AI 답은 서로 다른 통로다. Review 25분, 합계 100분 요청을 보냈다는 사실만 확인했다. 이 범위에서 C1은 PASS지만, AI 답변 성공을 뜻하지 않는다. 호스트의 수락 여부와 AI 수신·답변은 확인하지 못했으며, AI가 이 요청 때문에 값을 알았다고 말할 수 없다.

한 번의 차단은 안전 인증이 아니다

권한·도메인 선언은 비어 있었고, 캡처된 통신은 시험용 로컬 주소 안에 있었다. 별도로 보낸 대조 요청은 시험용 수신 지점에 도착했다. 반면 삽입 화면이 미리 허용하지 않은 같은 주소로 보낸 요청은 이 시험 환경의 콘텐츠 보안 정책(CSP, 브라우저가 화면의 외부 통신을 제한하는 규칙)에 막혀 도착하지 않았다. 이는 한 로컬 환경에서 캡처한 관찰일 뿐 안전이나 무유출 인증이 아니다. 사용자 동의 처리도 시험하지 않았다.

18개 시험의 결과

PASS는 적힌 범위의 기준을 충족했다는 뜻이다. FAIL은 시험했고 기준을 충족하지 못한 결과다. INVALID는 시험했지만 절차 결함으로 결론을 낼 수 없는 결과다. NOT TESTED는 시험 자체를 하지 않은 것이다. 한 행에 묶인 코드는 각각 별도 시험이다.

표 1 · 18개 시험의 결과
시험 결과 확인 범위
I1 — 값 일치
PASS
한·영 기본값 90과 수정값 100이 서버·화면·화면 읽기용 표현에서 일치
I2 — 오류 입력
FAIL
네 오류는 거부했지만 zz의 서버·화면 언어와 경고가 불일치
V1, V2 — 화면 상태
INVALID
변경 상태 미생성, 기준값 재호출이라는 절차 결함으로 각각 결론 불가
S1 — 명시적 복원
PASS
같은 가상 세션 ID로 프로세스 내부 서버 저장소에서 복원
S2 — 저장 실패
NOT TESTED
시험 자체를 하지 않음
C1 — 문맥 요청
PASS(전송만)
문맥 요청 전송만 확인; 호스트 판정과 AI 수신은 모름
C2–C4 — AI 답과 비교
NOT TESTED
AI 후속 답·대조군·네 통로 전체 비교를 실행하지 않음
P1, P2 — 권한·통신
PASS
빈 선언과 한 로컬 참조 환경의 CSP 차단 확인
P3 — 사용자 동의
NOT TESTED
시험 자체를 하지 않음
H0 — 참조 호스트
PASS
고정한 공식 로컬 참조 호스트 실행
H1 — 실제 제품
NOT TESTED
실제 대화형 제품을 실행하지 않음
A1 — 도구 노출
PASS
이 호스트의 호출 목록에서 화면 전용 도구가 보이지 않음
T1 — 텍스트 대체
PASS
화면 기능이 없는 접속 프로그램에 완전한 한·영 텍스트 반환
T2 — 화면 차단 대체
INVALID
비교 입력이 달랐다는 절차 결함으로 대체 동작 결론 불가

합계는 PASS 8, FAIL 1, INVALID 3, NOT TESTED 6이다. C1의 PASS는 전송에만 해당한다. 앱 전용 도구가 한 호출 목록에 보이지 않았다고 해서 모든 호스트에서 권한 제한이 지켜진다는 뜻도 아니다.

데모를 볼 때 물어볼 네 가지

정확히 이 로컬 참조 환경에서는 양언어 상호작용, 명시적 서버 복원, 텍스트 대체가 작동했다. 언어 불일치는 이 환경에서 관찰된 실제 실패였다. 같은 화면과 닫기·재열기는 절차상 판정할 수 없었고, 저장 실패·AI 답·동의·실제 제품 호환성은 실행하지 않았다.

화면 없이도 읽을 결과가 있는가? 누가 어디에 저장하고 어떤 ID로 복원하는가? 화면과 답이 다를 때 서버 결과를 확인할 수 있는가? 하지 않은 시험을 NOT TESTED로 남겼는가? 신뢰성은 멋진 한 번의 동작보다 서로 다른 약속을 각각 증명했는지에 달려 있다.

이 글은 AI를 활용해 자료 조사와 초안 작성을 보조하고, 작성자가 직접 검증·편집했습니다.

댓글

“채팅창 안에 앱이 들어오면, 무엇까지 믿어도 될까?”에 대한 2개 응답

  1. […] EXPERIMENT NOTES · 13한국어로 읽기 →This image was generated using Grok […]

    좋아요

  2. […] 선행 글채팅창 안에 진짜 작동하는 앱이 들어온다면? […]

    좋아요

답글 남기기