내 MCP 어댑터가 단순히 배관에 불과하던 날
Source: Dev.to
TL;DR: Remote MCP Adapter 는 원격 MCP 워크플로를 위한 사용성 레이어로 시작했지만, 최근 MCP 도구 독극물 연구를 통해 한 가지가 명확해졌습니다: 경로에 있는 미들웨어도 보안 경계의 일부라는 점입니다. v0.3.0에서는 도구 정의 고정, 드리프트 감지, 메타데이터 정제, 설명 최소화, 그리고 더 엄격한 세션 바인딩을 추가해 위험한 업스트림 메타데이터와 세션 오용이 할 수 있는 일을 줄였습니다.
Remote MCP Adapter의 핵심 작업을 마친 뒤, 저는 대부분이 무언가가 제대로 동작한다는 것을 배포한 뒤에 하는 일을 했습니다: 한 걸음 물러서서 주변을 살펴보았습니다.
다른 사람들은 같은 종류의 문제를 어떻게 다루는지 보고 싶었습니다. Remote MCP는 유용하지만, 클라이언트와 서버가 파일 시스템을 공유하지 않게 되면 상황이 급격히 복잡해집니다. 업로드가 어색해지고, 생성된 파일이 어색해지며, 스크린샷, PDF, 아티팩트 또는 세션 범위 상태와 관련된 모든 것이 어색해집니다. 이것이 제가 처음에 어댑터를 만든 이유였습니다.
그 이야기에 대해서는 이전에 이 작업에 영감을 준 블로그에서 더 자세히 다루었습니다.
그 후 DEV에서 다음 글을 발견했습니다: Your MCP server’s tool descriptions are an attack surface.
그 글과 그 글이 가리키는 기본 연구는 불편한 깨달음을 강요했습니다.
제가 원격 MCP를 사용 가능하게 만들기 위해 만든 어댑터는 이미 신뢰 경계의 중간에 자리하고 있었습니다.
그리고 신뢰 경계의 중간에 무언가가 있다면, 이제는 단순히 배관 역할만 할 수 없습니다.
깨달음
내 어댑터는 이미 중요한 작업을 수행하고 있었다. 클라이언트와 상위 MCP 서버 사이에 위치해 있었고, 모델에 보이는 도구 메타데이터를 전달하고 있었다. 업로드, 아티팩트, 세션별 상태를 관리하고 있었으며, 로컬 전용 설정에서는 존재하지 않는 경계 사이의 동작을 변환하고 있었다.
그것은 사람들 사이에서 흔히 얇은 릴레이라고 생각되는 종류의 구성 요소였다.
그것은 아니다.
게이트웨이 또는 어댑터가 도구 카탈로그, 스키마 텍스트, 설명, 세션 식별자, 업로드, 인증 컨텍스트, 반환된 아티팩트를 보게 되면, 유지 관리자가 의도했든 아니든 이미 시스템 보안 태세의 일부가 된다.
그 순간 나는 프로젝트에 대한 생각이 바뀌었다.
Remote MCP Adapter는 더 이상 원격 파일 및 아티팩트 처리를 위한 편리한 레이어에 불과하지 않았다. 이제 자연스러운 강제 시행 지점이 되었다.
- 은탄환이 아니다.
- AI 방화벽이 아니다.
- MCP 보안에 대한 마법 같은 해결책도 아니다.
하지만 확실히 강제 시행 지점이다.
Source:
v0.3.0에서 바뀐 점
v0.3.0은 어댑터를 명시적으로 그렇게 다루기 시작한 첫 번째 릴리스입니다.
목표는 모든 MCP 보안 문제를 해결하는 것이 아니었습니다—그것은 부정직한 접근이기 때문입니다.
목표는 더 좁고 훨씬 실용적이었습니다:
- 모델에 노출되는 도구 메타데이터를 무차별적으로 전달하지 않기
- 세션 중에 도구 정의가 변동되는 경우 감지하기
- 모델에 도달하는 불안전하거나 불필요한 설명 텍스트를 줄이기
- 상태 기반 기능과 인증이 포함될 때 어댑터 자체의 세션 의미론을 강화하기
- 구현된 내용과 아직 범위에 포함되지 않은 내용을 문서화하기
이로 인해 다섯 가지 구체적인 변화가 생겼습니다.
1) 모델에 노출되는 도구 메타데이터에 대한 더 안전한 기본값
어댑터는 이제 도구 메타데이터에 대해 더 엄격한 기본 설정을 사용합니다.
core.tool_metadata_sanitization.mode = "sanitize"
core.tool_definition_pinning.mode = "warn"
이 기본값은 중요합니다. 이전에는 사용자가 사전에 보안 엔지니어처럼 생각하고 올바른 동작을 선택해야 했습니다. 이제 어댑터는 더 안전한 위치에서 시작하고, 환경이 요구하면 그곳에서 더 엄격해집니다.
저는 이 트레이드‑오프를 선호합니다. 많은 보안 기능이 현장에서 사라지는 이유는 단지 옵션으로만 존재하고 아무도 활성화하지 않기 때문입니다.
2) 도구 정의 고정(pin) 및 변동 감지
이 항목은 일부 사람들이 “러그 풀(rug pull)” 문제라고 부르는 상황을 다룹니다.
서버가 세션 시작 시 하나의 도구 카탈로그를 제공하고 이후에 도구 제목, 설명, 스키마 등을 변경한다면, 이는 더 이상 무해한 외관상의 업데이트가 아닙니다. 이미 확립된 신뢰 관계 하에서 모델에 보이는 동작이 바뀌는 것입니다.
어댑터는 이제 세션의 첫 번째 가시 도구 카탈로그를 기준선으로 삼고, 이후 카탈로그를 비교할 수 있습니다. 변동이 감지되면 정책에 따라 다음과 같이 처리됩니다:
warn– 경고 로그 기록block– 변경된 도구 전달 중단invalidate– 세션 전체 종료
이는 영리하게 만들기 위한 것이 아니라, 지루하고 신뢰할 수 있게 만들기 위한 것입니다. 모델이 보는 것이 바뀌었다면, 그 변화가 조용히 통과돼서는 안 됩니다.
3) 도구 스키마 전달 전 메타데이터 정화
도구 중독은 최상위 도구 설명에만 국한되지 않습니다. 이는 최근 연구에서 가장 중요한 교훈 중 하나입니다. 도구 메타데이터가 모델 컨텍스트에 들어가면, 모델에 보이는 모든 텍스트는 명령 표면이 될 수 있습니다: 제목, 설명, 스키마 텍스트, 주석 제목, 중첩된 설명, 그리고 일반 소프트웨어 메타데이터처럼 보이는 다른 필드들까지 말이죠.
v0.3.0은 다음 항목에 대해 모델에 보이는 메타데이터 정화를 추가합니다:
- 도구 제목
- 도구 설명
- 주석 제목
- 스키마 텍스트
더 엄격한 모드에서는 어댑터가 더러운 메타데이터를 가진 도구를 전혀 전달하지 않고 차단할 수 있습니다. 이것이 보수적으로 접근해야 할 올바른 위치입니다. 미들웨어가 이미 경로에 있다면, 기본적으로 모든 업스트림 스키마가 무죄라고 가정하지 않아야 합니다.
4) 도구 설명 최소화 및 제거
이제 tool_description_policy라는 통합 정책이 도입되어 최상위 도구 설명과 중첩 스키마 설명 모두에 적용됩니다. 세 가지 모드를 지원합니다:
preserve– 설명을 그대로 유지truncate– 설정 가능한 길이로 잘라냄strip– 완전히 제거
이 기능은 특히 편집증적이거나 엄격히 통제된 환경에서 유용합니다. 때때로 정답은 “…을 시도하기보다”가 아니라는 점을 기억하세요.
(원본 텍스트가 여기서 갑자기 끝납니다; 내용은 그대로 보존됩니다.)
자유 형식 설명 텍스트에서 모든 교묘한 중독 트릭 감지
때때로 정답은: 왜 이렇게 많은 산문이 모델에 도달하는가?
이 정책이 바로 그 목적을 위해 존재합니다.
설명 텍스트가 풍부할 필요가 없는 환경이라면, 이를 최소화하거나 완전히 제거할 수 있어야 합니다.
5) 어댑터 인증이 활성화된 경우 더 엄격한 세션 바인딩
이 항목은 눈에 띄지는 않지만 중요합니다.
어댑터가 업로드, 아티팩트, 취소 상태 또는 기타 세션별 데이터를 저장하기 시작하면, 세션 무결성은 더 이상 단순히 MCP 트랙에만 의존하지 않게 됩니다.
전송 문제—이는 제품 자체 보안 모델의 일부가 됩니다.
어댑터 인증이 활성화되면, 세션은 이제 이를 설정한 인증된 컨텍스트에 바인딩됩니다.
- 재사용된
Mcp-Session-Id는 다른 인증된 컨텍스트에서 단순히 사용할 수 없습니다. - 어댑터가 상태를 소유한다면, 그 상태가 오용될 경우의 결과도 책임져야 합니다.
왜 나는 이것을 과대 포장하고 싶지 않았는가
“원격 MCP 어댑터가 이제 MCP 중독으로부터 당신을 보호합니다.”
그것은 게으르고 거짓된 주장일 것입니다.
What v0.3.0 does is much more specific. It gives the adapter enough awareness and policy surface to stop being a blind forwarder of model‑visible tool metadata and state. That helps, but it does not magically solve:
- 시맨틱하게 정당해 보이는 최초 발견 중독
- 모든 새로운 인코딩 기법
- 모든 스키마 수준 조작 패턴
- 허용된 다운스트림 도구를 통한 모든 탈취 경로
- 스택 다른 부분에서 이루어진 모든 잘못된 신뢰 결정
These limits matter, and pretending otherwise would make the release less trustworthy, not more.
Evidence and Implementation Trail
이 릴리스를 단순히 보안 게시물처럼 꾸민 변경 로그에 불과하게 만들고 싶지 않아, 지원 자료도 작성하고 링크했습니다.
GitHub 저장소:
보안 스냅샷:
전용 보안 문서:
Issue 22 — 도구 정의 고정 및 드리프트 감지:
Issue 23 — 전달하기 전에 도구 스키마를 정규화하고 정제:
Issue 24 — 도구 설명 최소화 / 제거:
Issue 25 — 어댑터 관리 세션 의미론 강화:
증거 블로그:
공로를 인정하며
이 릴리스는 갑자기 나온 것이 아닙니다.
즉각적인 동기는 Your MCP server’s tool descriptions are an attack surface 를 읽은 것이며, MCP 도구 중독 및 스키마 조작에 관한 연구와 가이드라인도 큰 역할을 했습니다. 해당 게시물은 읽어볼 가치가 있으며, 그 뒤에 있는 작업도 마찬가지로 가치가 있습니다.
MCP 보안을 진지하게 탐구하고 있다면 Pipelock 도 확인해 보세요. 전용 제어 지점으로서 보다 보안‑중심적인 접근 방식을 취하고 있으며, 같은 종류의 문제에 대해 다른 사람들이 어떻게 접근하고 있는지 살펴볼 수 있습니다.
팀이나 조직에서 원격 MCP 환경을 운영하면서 중독, 스키마 이상, 혹은 세션 중 도구 변동 현상을 실제로 목격한 경우, 꼭 알려주셨으면 합니다. 실제 공격 샘플과 난처한 엣지 케이스는 다음에 무엇을 강화할지 결정할 때, 깔끔한 장난감 예제보다 훨씬 더 유용합니다.