본문 바로가기
카테고리 없음

MCP Go SDK v1.8.0에서 바뀐 서버 옵션과 업그레이드 전에 확인할 MCPGODEBUG 플래그

by Juelria 2026. 10. 19.
728x90
반응형
SMALL

MCP 공식 Go SDK가 2026년 9월 14일에 v1.8.0을 냈습니다. 릴리스 노트에 따르면 새 프로토콜 개정은 없고, SDK가 협상하는 가장 높은 버전은 그대로 2026-07-28입니다. 대신 서버 옵션이 두 개 늘었고, 입력 크기 상한이 여러 곳에 생겼고, 동작이 바뀐 두 군데는 v1.9.0에서 사라질 MCPGODEBUG 플래그 뒤에 남아 있습니다. go get을 치기 전에 이 부분만 읽어 두면 됩니다.

v1.7.0과 v1.8.0은 무엇이 다른가

v1.7.0은 2026년 7월 28일에 나왔고 프로토콜 2026-07-28 지원을 완성한 버전입니다. initialize 핸드셰이크가 없어지고, 요청마다 _meta에 프로토콜 버전과 클라이언트 정보를 실어 보내는 무상태 방식이 됐습니다. 서버의 지원 버전은 새 server/discover 호출로 알려 줍니다.

HTTP 쪽에는 조건이 하나 붙습니다. streamable HTTP 핸들러는 StreamableHTTPOptions의 Stateless가 true일 때만 2026-07-28 요청을 받습니다. 상태 유지 세션을 그대로 두면 클라이언트가 2025-11-25로 내려가서 협상합니다.

v1.8.0은 그 위에 얹은 보강판입니다. 릴리스 노트는 대규모로 돌려 본 사용자들이 찾은 세션 누수, 교착, 종료 시 멈춤을 고친 일이 작업의 큰 몫이었다고 설명하고, 사전 배포판 v1.8.0-pre.2(2026년 9월 4일)와 같은 내용이라고 적습니다.

서버 옵션 두 개

ServerOptions.SupportedProtocolVersions는 서버가 광고하고 협상할 버전을 줄이는 옵션입니다. 넓힐 수는 없습니다. SDK가 구현하지 않은 버전 문자열을 넣으면 NewServer를 부르는 순간 panic이 납니다. 소스 주석에는 목록에서 뺀 버전으로 2026-07-28 이후 요청이 오면 CodeUnsupportedProtocolVersion 오류로 거절한다고 적혀 있습니다. 새 프로토콜을 받을 준비가 안 된 서버라면 2025-11-25 이하만 적어 두는 쓰임이 떠오릅니다.

ServerOptions.SetCacheable은 func(ctx context.Context, req Request, c *Cacheable) 형태의 훅입니다. server/discover, 목록 조회 네 가지, resources/read 결과에 붙는 ttlMs와 cacheScope를 정합니다. 핸들러가 값을 만든 뒤 결과마다 한 번 불리고, 비워 두면 범위는 public이 됩니다. 소스 주석은 public을 어떤 클라이언트나 중간 장치든 캐시해도 되는 것, private을 요청한 사용자의 클라이언트만 캐시해도 되는 것으로 풀이합니다. 사용자 권한에 따라 도구 목록이 달라지는 서버라면 private이 맞는지 따져 볼 만합니다. 이 부분은 제 판단입니다.

입력 크기 상한

릴리스 노트의 하드닝 항목은 들어오는 입력을 담는 곳마다 한도를 둔 것입니다.

  • JSON은 중첩이 1000단계를 넘으면 파서가 들어가기 전에 거절합니다.
  • SSE 이벤트 하나가 버퍼에 쌓일 수 있는 크기는 SSEClientTransport와 StreamableClientTransport의 MaxEventSize로 조절합니다.
  • stdio에서는 JSON-RPC 프레임 하나의 상한을 StdioTransport.MaxLineLength가 정합니다. v1.8.0 소스에서 0이면 기본값 16MB, 음수면 제한 없음입니다.
  • OAuth 동적 클라이언트 등록 응답은 1MB까지만 읽습니다.

파일 내용을 도구 인자나 결과에 통째로 싣는 서버라면 stdio 한도부터 확인하세요. 16MB가 넉넉해 보여도 이미지를 base64로 넣으면 금방 가까워집니다.

MCPGODEBUG 플래그 두 개와 제거된 옵션

동작이 바뀐 곳은 두 군데이고, 이전 동작으로 되돌리는 플래그는 모두 v1.9.0에서 없어집니다.

plaintextstatefulrejection=1은 상태 유지 StreamableHTTPHandler가 요청별 메타데이터가 붙은 요청에 일반 텍스트 400을 돌려주던 옛 동작입니다. 지금 기본값은 JSON-RPC -32022 CodeUnsupportedProtocolVersion 오류이고, 서버가 지원하는 이전 버전 목록이 함께 실립니다. 클라이언트가 연결을 끊지 않고 낮은 버전으로 다시 협상할 수 있게 한 변경입니다.

blockingcancelnotify=1은 취소한 호출이 notifications/cancelled 전달을 최대 5초 기다린 뒤 돌아오던 옛 동작입니다. 기본값은 호출을 바로 정리하고 알림을 비동기로 보냅니다.

릴리스 노트가 계획대로 제거했다고 적은 옵션은 seterroroverwrite, enableoriginverification, disablecontenttypecheck, disablelocalhostprotection 네 개입니다. 배포 환경 변수에 이 이름이 남아 있다면 지금 정리해 두세요.

업그레이드 순서

  1. v1.8.0의 go.mod는 go 1.25.0을 요구합니다. 빌드 이미지의 Go 버전부터 맞춥니다.
  2. go get github.com/modelcontextprotocol/go-sdk@v1.8.0을 실행하고 go mod tidy를 돌립니다.
  3. 위 네 옵션 이름이 배포 설정에 있는지 찾아 지웁니다.
  4. 상태 유지 서버라면 2026-07-28 클라이언트로 접속해 -32022 응답과 재협상이 이어지는지 봅니다.
  5. 플래그로 옛 동작을 되살렸다면 v1.9.0 전에 호출부를 새 동작에 맞춥니다.

릴리스 노트는 이번 변경이 새 프로토콜 개정이 아니라고 분명히 적습니다. 그러니 기능을 새로 쓰려는 것이 아니면 바꿀 코드는 많지 않을 겁니다. 플래그에 기대고 있던 곳이 있는지가 관건입니다.

참고한 자료

728x90
반응형
LIST