카카오맵 승인 상태를 확인하러 개발자 콘솔에 들어갔다가, 우연히 눈에 띈 광고 하나를 이제서야 발견했다. 그 순간 하던 일을 다 미뤄두고, 기존에 만들어둔 앱을 재료 삼아 재미있는 MCP를 하나 만들어보기로 했다. 마치 오래된 서랍을 뒤지다 옛날 라디오를 다시 켜보는 기분이었달까.
MCP는 예전에 한 번 만들어본 경험이 있어 큰 걱정은 없었다. 게다가 PlayMCP에 등록된 점심 관련 봇이 아직 두 개뿐이라니, 낡은 다방에 새 메뉴판 하나 거는 셈 치고 시작해봤다.

사용자의 위치와 날씨를 살피고, 최근 먹은 메뉴는 슬쩍 피해가며 텐션 200%로 점심을 추천해주는 '점심어때' 봇. 처음엔 프롬프트 좀 다듬고 작은 기록장 하나 얹으면 뚝딱 끝날 줄 알았다.
하지만 역시나, 실전은 늘 예상보다 삐걱거렸다. 오늘 하루 마주했던 멘붕과 그 안에서 건진 몇 가지 짜릿한 순간을 편지 쓰듯 솔직하게 남겨본다.
1. 매일 아침 필름을 새로 갈아 끼우는 카메라
처음엔 가볍게 작은 수첩(로컬 파일)을 컨테이너 안에 만들어 유저의 식사 기록을 적어두었다. 마치 스프링노트에 연필로 끄적여둔 메모 같았다. 테스트는 순조로웠고, 봇은 어제 내가 돈까스를 먹었다는 사실을 기억하고 다른 메뉴를 권했다.

문제는 우리가 배포한 곳이 거대한 인터넷 세상의 임시 대여 공간(서버리스 환경)이었다는 점이다. 트래픽이 없으면 인스턴스가 조용히 내려가고, 몰리면 여러 개로 복제된다. 마치 매일 아침 필름을 새로 갈아 끼우는 카메라처럼, 컨테이너 속 노트는 인스턴스가 내려가는 순간 통째로 사라져버렸다. 어제의 기록이 오늘 아침이면 새하얀 종이로 돌아가 있는, 시한부 메모장이었던 셈이다.
이대로 서비스했다면 유저들은 매일 "나 어제 이거 먹었다고 했는데 왜 또 추천해?"라며 화를 냈을 것이다. 우리는 곧장 임시 수첩을 걷어내고, 마치 도서관의 낡았지만 절대 사라지지 않는 튼튼한 카드 목록함(완전 관리형 DB)으로 옮겨 심었다. 단 한 줄의 기록도 잃지 않는 첫 번째 안도의 순간이었다.
2. 전화 통화와 손편지의 차이
표준 MCP 클라이언트들은 실시간 회선(SSE)으로 서버와 전화 통화하듯 연결을 계속 붙잡고 대화한다. 그런데 카카오 PlayMCP는 달랐다. 거대한 트래픽을 감당하기 위해 카카오는 손편지 한 통 보내듯, 요청 하나에 응답 하나로 끝나는 상태 없는(Stateless) 방식을 요구했다. 우리가 만들어둔 통화 회선으로는 심사팀이 보낸 편지를 단 한 통도 받아볼 수 없었다.

코드를 전부 뜯어고치기보다 유연한 '어댑터'를 하나 끼워 넣기로 했다. 하나의 서버가 요청을 살펴서, 고유 번호(sessionId)가 있으면 기존 전화 회선으로 응대하고, 순수한 편지 한 통(단일 POST 요청)이 오면 즉석에서 뜯어보고 바로 답장을 써 보내는 이중 창구를 만든 것이다. 이제 우리 서버는 전화도 받고 편지도 받는, 옛날 우체국 겸 전화국 같은 존재가 되었다.
3. 추천에서 다방 오락기로
인프라를 다 다져놓고 봇과 이야기를 나눠봤다. "오늘 판교 날씨가 맑네요, 냉소바 어때요?" "아니 다른 거." "그럼 제육볶음은요?" "음… 다른 거." 단순 추천은 금세 시들해졌다.

우리는 단방향 추천을 접어두고, 오래된 다방 한켠에 놓인 오락기처럼 사람을 붙잡아두는 장치를 만들기로 했다. 바로 '점심 메뉴 이상형 월드컵'이다. "점심 추천 시작!"을 외치면 서버가 기록함을 뒤져 8강 대진표를 짜고, 텐션 높은 AI 진행자가 결승까지 함께 걸어간다. 결과는 대성공이었다. 정보만 던져주던 챗봇이 점심시간마다 켜보고 싶은 작은 오락거리로 바뀌었다.
4. 거절과 탈락은 다른 서랍에
월드컵을 만들고 나니 새 고민이 생겼다. 우승한 메뉴는 '오늘 먹은 메뉴'로 적으면 되지만, 8강에서 떨어진 일곱 메뉴는 어떻게 할까. 전부 '거절'로 적어버리면 며칠 만에 추천 서랍이 텅 비어버릴 게 뻔했다. 짜장면 대신 짬뽕을 골랐다고 짜장면을 미워하는 건 아니니까.

그래서 우리는 옛날 문서 서랍처럼 상태를 세밀하게 나누기로 했다. 탈락한 메뉴는 거절(REJECTED) 서랍이 아니라 토너먼트 탈락(TOURNAMENT_LOSS)이라는 별도 서랍에, 각각 독립된 카드로 정리해 넣었다. 이렇게 해두면 추천 서랍은 마르지 않고, 나중에는 "비 오는 날 판교 직장인들이 결승에서 가장 많이 떨어뜨린 메뉴 TOP 5" 같은 재미난 통계도 뽑아낼 수 있는 소중한 자료가 쌓인다.
5. 가장 큰 복병, 그리고 어쩌면 불가능한 미션
모든 기술적 난관을 돌파하고 드디어 공모전 제출 버튼을 누르려던 순간, 가장 치명적인 규칙 하나를 뒤늦게 발견했다. 공모전 제출을 위해서는 MCP 서버를 반드시 '카카오 클라우드(PlayMCP in KC)'에 배포해야 한다는 규정이었다. 구글 클라우드 환경에 예쁘게 올려두고 안심했던 우리는, 부랴부랴 짐을 싸서 카카오 클라우드 환경으로 서버를 이사시키는 한바탕 소동을 치러야 했다.
하지만 진짜 절망적인 사실은 따로 있었다. 카카오 측의 MCP 서버 심사에 보통 일주일 정도가 소요된다고 하는데, 하필 공모전 마감일이 바로 내일인 것이다. 오늘 밤 간신히 콘솔에 '임시 등록'을 마친 상태라, 마감 전에 심사가 통과되어 '전체 공개' 상태로 전환될 확률은 기적에 가깝다. 이번 공모전 출품은 어쩌면 심사 대기줄에서 쓸쓸히 마감될지도 모르겠다. ㅜㅜ
마치며
비록 내일 마감되는 공모전 심사를 제때 통과하지 못해 출품조차 못 할 위기에 처했지만, 작은 점심 봇 하나를 만드는 과정은 그 자체로 꽤 즐거운 모험이었다. 임시 대여 서버의 습성을 이해하고, 손편지 같은 통신 방식을 받아들이고, 유저의 한마디 너머 숨은 취향까지 서랍 속에 곱게 정리해 넣은 오늘의 삽질이 결코 헛되지는 않았다.
머지않아 심사를 무사히 마치고 카카오톡 스토어에서 텐션 200%의 봇이 "🔥 8강 월드컵을 시작하겠습니다!"라고 외치는 걸 본다면, 이 아날로그스럽고도 눈물겨운 뒷이야기를 한 번쯤 떠올려주면 좋겠다.
