
7월 28일에 MCP 새 사양이 확정됐다는 소식(그 정리)을 쓰면서, 속으로 뜨끔한 게 하나 있었다. 나한테도 옮겨야 할 서버가 하나 있다는 것. 회사 일감도 아니고, 작년에 재미로 만든 물건이다 — 제 블로그 운영 데이터(글 목록, 발행 상태, 검색 유입 메모)를 Claude Code에서 조회하게 해주는 조그만 MCP 서버. 사용자는 나 하나. 그래도 "서버 제작자는 마이그레이션 대상"이라고 남들에게 써놓고 정작 내 것을 안 옮기는 건 좀 그렇지 않나. 그래서 주말을 썼다.
토요일 오전: SDK 베타부터
Python SDK의 새 사양 지원 베타를 받는 것부터 시작했다. 여기까지는 pip 한 줄이라 5분. 문제는 그다음이었다 — 내 서버가 얼마나 구식 관습에 기대고 있었는지를, 새 SDK가 뱉는 deprecation 경고 목록으로 확인하는 시간이었다. 제일 큰 건 예상대로 세션이었다. 내 서버는 initialize 핸드셰이크 때 블로그 데이터 파일을 통째로 읽어 메모리에 올려두고, 이후 요청들이 그 상태를 참조하는 구조였다. 전형적인 "세션에 기댄 설계". 새 사양에서는 이 전제 자체가 없다 — 모든 요청이 자립적이어야 한다.
토요일 오후: 상태를 어디로 보낼 것인가
처음엔 반발심이 들었다. 사용자가 나 하나인 서버인데 stateless가 무슨 소용인가. 로드밸런서는커녕 인스턴스도 하나인데. 그런데 코드를 뜯다 보니 인정하게 됐다 — 세션에 올려둔 그 상태, 사실 캐시였다. 캐시라고 부르지 않고 세션이라고 불렀을 뿐. 파일 읽기를 요청 시점 캐시로 바꾸는 데 한 시간, "지난 조회 이후 바뀐 글" 같은 진짜 상태가 필요한 기능 하나는 Tasks 패턴으로 옮기는 데 두 시간. 옮기고 나니 코드가 오히려 짧아졌다. 세션 수명 관리하던 코드가 통째로 사라졌으니까.
토요일 밤: server/discover와 헤더의 세계
initialize가 사라진 자리에는 server/discover가 왔다. 클라이언트가 "너 뭐 할 줄 알아?"라고 물으면 능력 목록을 돌려주는, 말하자면 명함 교환이다. 여기에 응답을 캐시 가능하게 만드는 ttl 설정까지 붙이니, 내 서버의 도구 목록은 사실상 정적 파일처럼 서빙된다. 요청마다 붙는 헤더들(프로토콜 버전, 메서드 이름)은 SDK가 알아서 처리해줘서 내가 손댈 건 거의 없었다. 자정쯤 Claude Code에 물려서 첫 요청이 통과했을 때의 기분은, 이사 첫날 밤에 보일러 트는 데 성공한 것과 비슷했다.
일요일: 전환기의 함정 하나
다 됐다고 생각했는데 일요일 아침에 한 방 맞았다. 데스크톱에서는 되는데 노트북에서 안 됐다. 한참 뒤진 결론은 허무했다 — 노트북의 클라이언트가 구버전이라 새 사양 서버와 버전이 안 맞았던 것. 내가 정리 글에 "전환기에는 버전 불일치가 새로운 장애 원인이 된다"라고 써놓고 그대로 밟은 셈이다. 자기가 쓴 글은 자기가 제일 안 읽는다. 클라이언트 업데이트 한 번으로 해결됐고, 디버깅 체크리스트(그 순서) 맨 위에 "양쪽 버전 확인"을 한 줄 추가했다.
주말을 쓰고 남은 것
결산하면 이렇다. 순수 작업 시간 예닐곱 시간, 코드는 줄었고, 서버는 이제 어디에 몇 개를 띄워도 되는 물건이 됐다 — 띄울 일이 없다는 게 함정이지만. 그래도 이 주말이 아깝지 않은 이유는 두 가지다. 하나, 마이그레이션은 미룰수록 비싸진다. 지금은 구사양 클라이언트들이 공존하는 완충기라 천천히 검증하며 옮길 수 있지만, 반년 뒤에는 "안 되니까 급하게"가 됐을 것이다. 둘, 남의 사양 개정을 백 번 요약하는 것보다 내 서버 하나 옮겨보는 게 이해가 깊었다. Tasks 패턴이 왜 필요한지, Extensions가 왜 코어를 얇게 만드는지 — 문서로 읽을 때는 남의 사정이었는데 내 코드에서 만나니 내 사정이 됐다.
서버를 운영하는 분이라면, 규모와 무관하게 이번 완충기 안의 주말 하나를 권한다. 실무 순서는 마이그레이션 체크리스트에 정리돼 있다. 나처럼 자기 글을 안 읽고 버전 함정을 밟는 것까지가 코스일 수 있지만, 그것도 배움이라 치자.
함께 보면 좋은 글
MCP 사상 최대 개정 확정: 2026-07-28 새 사양 정리
MCP 새 사양 마이그레이션 체크리스트
MCP 서버가 안 붙을 때 디버깅 체크리스트
참고 자료
'MCP' 카테고리의 다른 글
| MCP 새 사양 마이그레이션 체크리스트: 서버 제작자가 이번 주에 할 일 (0) | 2026.07.28 |
|---|---|
| MCP 사상 최대 개정 확정: 2026-07-28 새 사양 정리 (stateless 전환) (0) | 2026.07.25 |
| MCP 서버, 어디서 찾아야 안전할까? 공식 레지스트리 활용법 (0) | 2026.07.23 |
| Postgres MCP로 DB를 물려 개발하기: 에이전트가 스키마를 아는 순간 달라지는 것들 (0) | 2026.07.22 |
| 원격 MCP vs 로컬 MCP: 뭐가 다르고 나는 뭘 써야 할까? (0) | 2026.07.21 |