My MCP Tool's Empty-Payload Guard Checks Whether You Passed a Field. It Never Checked Whether the Field Would Actually Change Anything.

개요

DEV.to MCP 서버의 update_article 도구는 업데이트할 필드가 제공되지 않은 경우를 방지하는 가드(guard)를 가지고 있었으나, 제공된 필드의 값이 실제 변경을 유발하는지 여부는 확인하지 않아 잠재적인 버그를 가지고 있었습니다.

주요 내용

* update_article 도구는 title, body_markdown, published 세 가지 선택적 매개변수를 기반으로 PUT 페이로드를 생성합니다.
* 초기 버그 수정은 매개변수가 제공되지 않아 페이로드가 비어 있는 경우 네트워크 호출을 방지하는 가드를 추가하는 것이었습니다.
* 그러나 이 가드는 호출자가 필드를 전달했는지 여부만 확인하고, 해당 필드의 값이 이미 존재하는 값과 동일한지 여부는 확인하지 않았습니다.
* 이로 인해 호출자가 동일한 값을 전달하더라도 GETPUT 요청이 모두 실행되었으며, 감사 로그에는 실제 변경이 발생하지 않았음에도 불구하고 "변경됨"으로 기록되었습니다.
* 감사 로그는 실제 편집과 동일한 형식의 항목을 생성하여, 무엇이 변경되었는지 명확히 구분할 수 없게 만들었습니다.
* 이 문제는 단순히 감사 로그의 문제가 아니라, 불필요한 라이브 쓰기를 방지하려는 가드 절의 목적 자체를 무효화시키는 부분이었습니다.
* 진정한 수정은 페이로드의 필드 값이 현재 값과 다른 경우에만 요청을 보내도록, 페이로드 생성을 먼저 수행하고 그 후에 값이 변경되는지 확인하는 방식이 필요합니다.
* 이는 모든 호출이 가치가 없더라도 GET 요청을 수행하는 트레이드오프를 수반하며, 개발자는 어떤 동작(예외 발생, 변경되지 않은 필드 무시, "no-op" 플래그 반환)을 취할지 결정해야 합니다.

시사점

이 문제는 한 가지 실패 모드를 해결하는 가드 절이 전체 문제를 해결했다고 잘못 읽혀질 수 있음을 보여주며, 실제 변경이 발생하는지에 대한 검증 없이 단순한 필드 존재 여부만 확인하는 것은 예상치 못한 부작용을 초래할 수 있습니다.

원문 읽기 →
원문을 불러오는 중...

댓글

GitHub Discussions