MemoryLake
모든 글로 돌아가기
News2026년 7월 30일·9 분 소요

MCP가 무상태(Stateless)로 전환되었습니다: 세션 간 에이전트 메모리를 유지하는 방법 (2026)

2026년 7월 28일, Model Context Protocol은 출시 이후 사양에 대한 가장 큰 개정안을 확정했습니다. 가장 핵심적인 변화는 프로토콜 코어가 이제 무상태(stateless)가 되었다는 점입니다. `initialize`/`initialized` 핸드셰이크는 폐기되었고, `Mcp-Session-Id` 헤더는 사라졌으며, 이제 각 요청은 프로토콜 버전, 클라이언트 식별자, 클라이언트 기능을 `_meta`에 담아 독립적으로 전송됩니다.

MCP에서 에이전트를 실행하고 있다면 가장 먼저 실질적인 질문이 떠오를 것입니다. '내 에이전트가 여전히 무언가를 기억할 수 있을까?'

솔직한 답변은 지난주와 정확히 같은 만큼만 기억한다는 것입니다. 대부분의 설정에서 이는 '아무것도 기억하지 못함'을 의미합니다. MCP 세션은 에이전트의 메모리를 유지한 적이 없습니다. 단지 연결을 유지했을 뿐입니다. 7월 28일에 변경된 점은, 호출 간에 상태를 유지하는 것은 전송 계층이 아니라 애플리케이션의 몫이라는 점을 사양에서 명시적으로 선언했다는 것입니다. 이는 기능의 퇴보가 아닙니다. 그동안 누락되었던 레이어를 더 이상 무시할 수 없도록 명확히 짚고 넘어간 것입니다.

이 가이드에서는 실제로 무엇이 변경되었고, 무엇이 작동하지 않으며, 무엇이 그대로 유지되는지, 그리고 단일 세션보다 오래 지속되는 메모리를 MCP 에이전트에 부여하는 방법을 다룹니다.

2026-07-28 사양에서 실제로 변경된 사항

프로토콜 레이어에서 세션 제거

initialize/initialized 교환이 폐기되었습니다. 서버는 기능 탐색을 위해 새로운 server/discover RPC를 선택적으로 구현할 수 있지만 필수 사항은 아닙니다. 요청 경로의 그 어떤 것도 사전 핸드셰이크를 전제하지 않으며, 네트워크상에서 이전 요청과 다음 요청을 연결하는 고리도 없습니다.

사양은 이것이 의미하는 바와 의미하지 않는 바를 직접적으로 설명합니다. "프로토콜 수준의 세션을 제거한다고 해서 애플리케이션이 무상태가 되어야 하는 것은 아닙니다. 서버가 호출 간에 상태를 유지해야 하는 경우, 도구에서 명시적인 핸들(handle)을 생성하고 모델이 이를 인수로 다시 전달하도록 하십시오."

이 문장을 두 번 읽어보세요. 프로토콜은 상태 관리의 책임을 여러분에게 돌려주었으며, 그 메커니즘으로 '모델이 전달하고 애플리케이션이 이해하는 명시적인 핸들'을 제시했습니다. 핸들은 포인터입니다. 그 포인터가 가리키는 대상이 무엇이든, 그것을 구축하는 것은 여전히 여러분의 몫입니다.

무상태성과 관련하여 추가된 사항

이번 릴리스가 단순히 기능을 뺀 것만은 아닙니다:

  • 다중 왕복 요청(Multi Round-Trip Requests, MRTR)을 통해 서버는 지속적인 연결 없이도 실행 도중에 클라이언트로 다시 요청을 보낼 수 있습니다.
  • Mcp-MethodMcp-Name을 통한 헤더 기반 라우팅 덕분에 게이트웨이는 JSON 본문을 파싱하지 않고도 필터링 및 라우팅을 수행할 수 있습니다.
  • 캐시 가능한 목록 결과는 목록 및 읽기 응답에 ttlMscacheScope를 추가하여, 클라이언트가 서버가 허용하는 기간 동안 tools/list를 캐시할 수 있도록 합니다.
  • 태스크(Tasks)는 실험적 코어에서 벗어나 AWS의 기여로 폴링 기반 작업을 통한 안정적인 장기 실행 작업을 지원하는 공식 확장 기능으로 승격되었습니다.
  • MCP Apps도 동일한 공식 확장 프레임워크에 합류했습니다.
  • 이제 최소 12개월의 지원 중단(deprecation) 유예 기간이 적용되며, Roots, Sampling, Logging, Dynamic Client Registration이 지원 중단 절차에 들어갔습니다.
  • TypeScript, Python, Go, C# 등 티어 1 SDK가 업데이트되어 출시되었으며, Rust SDK는 베타 버전입니다.

Claude에는 이미 적용되었습니다

Anthropic은 같은 날 Claude 앱, Claude 플랫폼 및 API, Claude Code 전반에 걸쳐 새 사양에 대한 지원을 출시했습니다. 이와 함께 대화형 UI를 위한 MCP Apps, Entra 및 Okta 같은 ID 제공업체와 연동되는 OAuth 2.0/OIDC 기반의 기업 관리형 인증, 게시된 커넥터용 관측 가능성 대시보드, 연구 프리뷰 단계인 MCP 터널도 함께 공개되었습니다. Claude의 커넥터 디렉터리에는 이제 950개 이상의 MCP 서버가 등록되어 있습니다.

즉, 이 사양은 그냥 지나가기를 기다릴 수 있는 것이 아닙니다. 에이전트가 Claude Code나 커넥터와 통신하고 있다면, 무상태 코어는 이미 에이전트가 발을 딛고 있는 현실입니다.

무상태성이 에이전트의 기억 상실을 유발하지도, 해결하지도 못하는 이유

세션은 결코 메모리가 아니었습니다

MCP 세션은 연결이 유지되는 동안(몇 분, 때로는 몇 초)만 지속되었습니다. 에이전트의 기억 상실은 완전히 다른 시간 단위로 작동합니다. 내일 아침, 다음 스프린트, 혹은 팀원이 동일한 고객에 대해 세 번째로 질문할 때처럼 말이죠. 과거의 상태 유지 방식에서도 클라이언트를 닫으면 세션이 알고 있던 모든 정보가 사라졌습니다.

세션 상태는 전송 계층의 장부 기록에 불과했습니다. 메모리는 작업의 누적된 결론입니다. 이 둘을 혼동했기 때문에 많은 팀이 애초에 보장된 적이 없는 레이어에서 지속성을 기대했던 것입니다.

실제로 작동이 중단되는 부분

세션 상태에 진정으로 의존했던 패턴은 우려하는 것보다 범위가 좁습니다. 도구 호출 사이에 메모리에 중간 상태를 누적하던 서버, 세션 ID를 키로 사용하는 핸드셰이크 기반 캐시, 클라이언트를 특정 워커에 고정하기 위해 고정 세션(sticky sessions)이 필요했던 게이트웨이 등이 이에 해당합니다. 이러한 패턴은 재작업이 필요합니다. 이제 원격 서버는 단순한 라운드 로빈 로드 밸런싱 뒤에 위치할 수 있게 되었는데, 이는 장점이기도 합니다.

작동이 중단되지 않는 부분: 연결 외부의 영구 저장소에 이미 상태를 저장하고 있던 모든 것들입니다. 지식이 데이터베이스, 파일 저장소 또는 메모리 서비스에 있었다면, 7월 28일의 변경 사항은 회복력에 아무런 영향을 미치지 않으며 오히려 배포를 더 단순하게 만들었습니다.

이제 메모리가 위치해야 할 곳

'핸들을 생성하고 모델이 이를 다시 전달하게 하라'는 사양의 답변은 정확하지만 불완전합니다. 이는 상태를 참조하는 방법을 알려줄 뿐, 상태가 어디에 살아야 하는지, 어떤 형태를 취해야 하는지, 혹은 서로 다른 세 가지 모델을 사용하는 다섯 개의 에이전트가 이를 어떻게 공유해야 하는지는 알려주지 않습니다. 이 레이어는 이제 여러분이 직접 구축해야 하는 영역이며, 우연히 해결하기보다는 의도적으로 설계할 가치가 있습니다.

팀들이 시도하는 임시방편들

더 커진 컨텍스트 창

최신 프론티어 모델들은 수백만 토큰에 달하는 컨텍스트 창을 광고하며, 이를 메모리로 취급하고 싶은 유혹을 불러일으킵니다. 하지만 이는 메모리가 아닙니다. 컨텍스트 창은 모델이 이번 턴에 읽을 수 있는 분량일 뿐입니다. 매 턴마다 무엇을 넣을지 결정해야 하고, 매번 토큰 비용을 지불해야 하며, 다음번에는 다시 빈 상태로 시작해야 합니다. 검색(retrieval)에 적용되는 동일한 차이점에 대해서는 왜 RAG가 메모리가 아닌가를 참조하세요.

각 도구의 내장 메모

Claude, ChatGPT 및 대부분의 에이전트 프레임워크는 이제 자체 메모리 기능을 제공합니다. 각각은 정말 유용하지만, 철저히 격리되어 있습니다. 코딩 에이전트가 배포 파이프라인에 대해 학습한 내용은 장애 보고서를 작성하는 어시스턴트에게 전달되지 않으며, 작업을 더 저렴한 모델로 라우팅할 때 그 어떤 정보도 따라오지 않습니다.

핸들과 직접 구축한 데이터베이스의 조합

이것이 사양이 가리키는 경로이며, 일부 팀에게는 올바른 선택일 수 있습니다. 하지만 이는 추출, 저장, 검색 순위 지정, 범위 지정, 만료, 다중 에이전트 액세스 제어를 직접 개발하고, 주변 프로토콜이 계속 발전하는 동안 이를 유지 관리해야 함을 의미합니다. 메모리 자체가 제품이라면 가치 있는 일입니다. 하지만 메모리가 제품으로 가는 길목의 배관 작업에 불과하다면 비용이 많이 드는 일입니다.

해결책: 세션보다 오래 지속되는 에이전트 메모리 레이어 구축하기

사양이 권장하는 방식을 영구적으로 구현하는 방법은 세션, 재시작, 모델 교체에 영향을 받지 않는 서비스에 메모리를 두는 것입니다. MemoryLake는 정확히 이 역할을 위해 구축되었습니다. 현재 어떤 클라이언트가 연결되어 있는지와 관계없이, 에이전트가 MCP 또는 API를 통해 읽고 쓸 수 있는 단일 메모리 레이어입니다.

1단계: API 키 생성

키를 생성하고 약 30초 만에 첫 번째 요청을 보낼 수 있습니다. 이 단계의 그 어떤 것도 세션에 의존하지 않으며, 이것이 바로 핵심입니다.

MemoryLake API 키 생성
MemoryLake API 키 생성

2단계: 첫 번째 메모리 업로드

아키텍처 노트, 런북, 고객 컨텍스트, 이전 결정 사항 등 에이전트가 계속해서 필요로 하는 문서, 이미지, 파일을 업로드하세요. 이것이 바로 핸들이 가리켜야 할 상태입니다.

MemoryLake에 첫 번째 메모리 업로드
MemoryLake에 첫 번째 메모리 업로드

3단계: AI 및 에이전트 연결

Claude, Codex, OpenClaw 및 기타 에이전트가 MCP 또는 API를 통해 해당 메모리에 액세스할 수 있도록 하세요. 2026-07-28 코어 사양에서는 각 호출이 자체 식별자를 전달하고 동일한 메모리에 도달하므로, 고정 라우팅이나 세션을 유지할 필요가 없습니다. 클라이언트별 가이드는 Claude Code에 메모리를 추가하는 방법을 참조하세요. 서버를 직접 작성하는 개발자라면 무상태 MCP 서버를 위한 메모리에서 구현 측면을 다루고 있으며, MCP Tasks를 위한 메모리에서는 장기 실행 작업을 다룹니다.

MCP를 통해 AI 및 에이전트 연결
MCP를 통해 AI 및 에이전트 연결

실무에서 달라지는 점

반복 설명에 드는 비용을 계산해 보겠습니다. 기술 스택, 컨벤션, 현재 우선순위, 이미 내려진 결정 등 고정 컨텍스트가 2,000토큰이고, 사용자나 에이전트가 이를 하루에 20번 다시 전송한다고 가정해 보겠습니다. 이는 매일 40,000토큰, 한 달에 약 120만 토큰을 이미 했던 말을 반복하는 데 소비하는 것입니다. 토큰 비용은 사소한 부분에 불과합니다. 실제로 체감하는 비용은 매 세션이 시작될 때마다 4~5분 동안 다시 브리핑해야 하는 번거로움과, 아무도 브리핑하지 않았을 때 에이전트가 저지르는 실수입니다.

영구 메모리 레이어는 이러한 매 세션마다 지불해야 하는 세금을 일회성 쓰기 비용으로 전환합니다. 또한 다중 에이전트 작업을 일관되게 만듭니다. 두 에이전트가 대화 기록 대신 메모리를 공유하면, 두 번째 에이전트는 첫 번째 에이전트의 결론에서부터 작업을 시작할 수 있습니다. 이 문제는 다중 에이전트 메모리에서 별도로 읽어볼 가치가 있습니다.

무상태 MCP 환경에서의 메모리 모범 사례

대화 기록이 아닌 결론을 저장하세요

원시 로그는 한계 없이 늘어나며 검색 효율도 떨어집니다. "대기열 모드가 인프로세스 메모리를 손상시켰기 때문에 채팅 기록용으로 Redis 대신 Postgres를 선택했습니다"라는 결론은 보관할 가치가 있습니다. 하지만 그 결론에 도달하기까지 오간 40개의 메시지는 그렇지 않습니다.

연결이 아닌 작업에 메모리를 매핑하세요

세션은 사라졌습니다. 실수로 세션을 다시 만들지 마세요. 호출하는 클라이언트가 무엇이든 관계없이 다음 달에도 동일한 의미를 갖는 프로젝트, 리포지토리, 고객 또는 태스크 단위로 메모리 범위를 지정하세요.

의도적으로 정리하고 버전을 관리하세요

오래된 메모리는 메모리가 없는 것보다 나쁩니다. 에이전트가 이를 신뢰하기 때문입니다. 사실 정보에 소유자와 만료일을 지정하고, 새로운 결정이 이전 결정을 대체한 시점을 기록하여 두 정보가 풀에 동시에 남아 혼선을 주지 않도록 하세요.

결론

2026년 7월 28일 MCP가 무상태로 전환되었다고 해서 에이전트의 메모리가 삭제된 것은 아닙니다. 프로토콜이 메모리를 유지하고 있다는 환상이 끝났을 뿐입니다. 세션은 전송 수단이었을 뿐 기억 장치가 아니었으며, 이제 사양은 명시적인 핸들이라는 메커니즘을 제공하면서 실질적인 내용은 여러분에게 맡김으로써 이를 명확히 하고 있습니다.

이 변화를 업그레이드로 받아들일 팀은 이미 연결 외부에서 메모리를 관리하고 있던 팀들입니다. 더 단순해진 배포, 동일한 기억력, 그리고 이전 에이전트가 멈춘 지점부터 이어서 작업하는 에이전트를 경험하게 될 것입니다. 반면 이를 손실로 느낄 팀은 세션이 대신 기억해 주기를 바랐던 팀들입니다. 이 레이어를 한 번 구축하는 것이 평생 반복 설명 세금을 내는 것보다 저렴합니다.

자주 묻는 질문

2026-07-28 MCP 사양 변경으로 에이전트의 메모리가 삭제되었나요?

아닙니다. 프로토콜 수준의 세션(initialize/initialized 교환 및 Mcp-Session-Id 헤더)이 제거되었습니다. 세션은 지속적인 메모리가 아니라 연결을 유지하는 역할만 했습니다. 이전에도 에이전트가 날짜가 바뀌면 기억을 잃었다면 그 동작은 그대로 유지되며, 연결 외부의 저장소에 메모리를 보관하고 있었다면 기억력에 아무런 영향을 받지 않습니다.

"명시적인 핸들을 생성한다"는 것은 실무적으로 무엇을 의미하나요?

도구가 유지하려는 상태의 식별자(태스크 ID, 워크스페이스 참조, 메모리 키 등)를 반환하면, 모델이 이후 호출에서 해당 식별자를 다시 전달하는 것을 의미합니다. 핸들은 모델이 상태를 가리키는 방법입니다. 해당 상태가 어디에 저장되고 어떻게 검색될지는 여전히 여러분이 결정합니다.

이번 릴리스에서 지원 중단(deprecated)된 MCP 기능은 무엇인가요?

Roots, Sampling, Logging, Dynamic Client Registration이 지원 중단 절차에 들어갔으며, 이제 제거 전 최소 12개월의 유예 기간을 보장하는 공식 정책의 적용을 받습니다. Tasks와 MCP Apps는 코어에 머무르는 대신 공식 확장 프레임워크로 이동했습니다.

Claude Code를 MCP 커넥터와 함께 사용하는 경우 변경해야 할 사항이 있나요?

Anthropic은 2026년 7월 28일에 Claude 앱, 플랫폼/API, Claude Code 전반에 걸쳐 새 코어에 대한 지원을 출시했으므로 전송 계층의 변경 사항은 자동으로 처리됩니다. 여전히 여러분이 결정해야 할 사항은 에이전트에 메모리를 부여할지 여부입니다. 커넥터는 에이전트에게 도구를 제공할 뿐, 기억력을 제공하지는 않습니다.

하나의 메모리 레이어로 서로 다른 모델을 사용하는 여러 에이전트를 지원할 수 있나요?

네, 그렇습니다. 이것이 바로 메모리를 단일 클라이언트 외부에 두어야 하는 가장 큰 이유입니다. MCP 또는 API를 통해 메모리에 접근하면, 메모리를 읽는 에이전트가 메모리를 쓴 에이전트와 같을 필요가 없으며, 모델을 교체하더라도 팀이 이미 구축해 놓은 정보가 초기화되지 않습니다.