MCP roots를 설정해도 파일이 안 읽힐 때: 경로 안내와 접근 권한 진단

MCP의 roots에 폴더를 넣었다고 파일 접근 권한이 생기거나 그 밖의 접근이 자동 차단되지는 않습니다. 파일이 안 읽히면 먼저 서버가 실행되는 위치와 실제 접근 정책을 확인하세요. 반대로 범위 밖 파일이 읽힌다면 roots 목록을 고치는 것만으로 보안 문제가 해결됐다고 볼 수 없습니다.

적용 범위는 기존 roots 구현을 점검하는 개발자와 운영자입니다. MCP 2026-07-28에서 Roots는 deprecated, 즉 신규 도입을 권장하지 않는 기능입니다. 공식 문서는 도구 인자·리소스 URI·서버 설정으로 파일과 디렉터리를 전달하도록 이전을 권고합니다. 이 글의 확인일은 2026년 10월 10일입니다. 현재 Roots 규격

1. 폴더 선택, 경로 전달, 접근 허용을 나누기

문제를 좁힐 때는 세 질문을 따로 적는 편이 좋습니다. 사용자가 어떤 폴더를 골랐는가. 서버는 어떤 위치를 전달받았는가. 그 서버 프로세스는 무엇을 읽을 수 있는가. 아래는 이 구분을 실무에 적용한 진단 틀입니다.

확인할 층확인할 내용
화면의 선택현재 작업 폴더가 맞는지, 이전 프로젝트 이름이 남아 있지 않은지
전달된 정보클라이언트·서버가 쓰는 규격과 실제 경로 값이 일치하는지
실행 환경로컬 프로세스인지 원격 서버인지, 파일이 그 환경에 존재하는지
접근 통제서버의 허용 경로, 운영체제 권한, 격리 환경 정책이 허용하는지

현재 규격은 roots를 작업 범위에 대한 안내 정보로 설명하며, 서버를 그 안에 가두는 기능은 아니라고 명시합니다. 접근 통제는 별도로 구현해야 합니다. 로컬 서버의 최소 권한과 격리 실행은 공식 보안 가이드에서도 권고합니다.

2. 예전 로그와 현재 로그를 섞지 않기

2025-11-25 방식의 로그를 최신 규격에 그대로 대입하면 정상적인 동작도 누락처럼 보일 수 있습니다. 아래는 해당 두 규격의 비교이며, 모든 제품이 최신 규격으로 이전했다는 뜻은 아닙니다.

항목2025-11-252026-07-28
roots 지원 표시초기화 때 클라이언트 capabilities요청별 클라이언트 capabilities 메타데이터
목록 요청 흐름서버가 roots/list 요청InputRequiredResult의 inputRequests에 roots/list
목록 결과 전달JSON-RPC 응답의 result재요청의 inputResponses
신규 도입 판단당시 규격의 기능deprecated: 대체 전달 방식 검토

이전 규격에는 listChanged와 notifications/roots/list_changed도 정의돼 있습니다. 현재 규격의 요청 흐름을 점검하면서 이 알림이 없다는 이유만으로 장애를 단정하지 마세요. 먼저 양쪽 구현의 프로토콜 버전을 확인해야 합니다. 2025-11-25 Roots 규격 · 2026-07-28 Roots 규격

3. 파일이 안 읽히는 경우의 진단 순서

먼저 파일 내용 대신 환경 정보를 확인합니다. 비밀 파일을 읽어 접근 여부를 시험하지 말고, 본인이 관리하는 테스트 환경에 둔 무해한 샘플 파일을 사용하세요. 아래 절차는 권장 점검 순서이며 특정 클라이언트에서 재현한 장애 보고가 아닙니다.

① 클라이언트와 서버의 제품명·버전, 사용 중인 MCP 규격을 기록합니다. SDK를 쓰면 그 버전도 따로 적습니다. 제품 버전과 프로토콜 날짜를 같은 값으로 취급하지 않습니다.

② 서버가 실제로 실행되는 환경을 확인합니다. 예를 들어 내 컴퓨터에 있는 폴더 이름을 원격 서버에 전달했다고 그 서버에 파일이 복사되는 것은 아닙니다. 원격 서버의 저장소나 마운트에 대응 파일이 있는지 운영 설정에서 확인합니다.

③ 전달 값을 비교합니다. 화면의 프로젝트 이름만 비교하지 말고, 의도한 경로와 서버가 받아들인 경로가 같은 대상을 가리키는지 확인합니다. 외부 문의에는 실제 사용자명·프로젝트명·전체 경로를 제거하고 필요한 형태만 남깁니다.

④ 서버 설정과 실행 계정의 권한을 읽기로 확인합니다. 접근 거부를 없애려고 전체 홈 디렉터리를 허용하거나 관리자 권한으로 실행하는 방법을 먼저 택하지 않습니다. 필요한 경로 하나에 대한 정책이 맞는지부터 검토합니다.

⑤ 같은 샘플로 다시 확인합니다. 읽기 결과와 대상 파일을 대조하고, 실패하면 오류가 발생한 층을 기록합니다. 연결 표시만 정상이라고 파일 접근까지 정상이라고 결론 내리지 않습니다.

4. 복사해서 쓸 점검 기록

다음은 문서나 이슈에 붙여 쓰는 가상 진단 기록 양식입니다. MCP 요청 본문이나 실행 코드가 아니며, 예시 이름은 실제 서비스와 무관합니다. 공유 전에 민감한 값을 지웠는지도 확인하세요.

클라이언트 제품 / 버전: <기입>
서버 제품 / 버전: <기입>
SDK 버전 또는 미사용: <기입>
MCP 프로토콜 버전: <기입>
서버 실행 위치: 로컬 / 원격 / 격리 환경
전달 방식: 기존 roots / 도구 인자 / 리소스 URI / 서버 설정
샘플 파일 식별명: demo-note.txt
기대 결과: 허용된 샘플 읽기
실제 결과: <성공 또는 오류 종류>
경로 대응 확인: <동일 대상인지>
권한 정책 확인: <허용된 범위인지>
다음 조치: <확인되지 않은 한 항목>

가령 화면에는 프로젝트 A가 선택됐는데 원격 서버에는 샘플 파일이 없다면, roots 지원 여부만 조사해서는 해결되지 않습니다. 파일 전달 또는 저장 위치 설계를 확인해야 합니다. 이 사례는 진단 분기를 설명하기 위한 가상 상황입니다.

5. 범위 밖 파일이 읽힌다면

이 경우에는 편의 기능의 문제가 아니라 접근 정책을 점검해야 합니다. 해당 경로가 정말 금지 대상으로 정의돼 있는지, 서버가 그 정책을 적용하는지부터 확인하세요. 정책을 모른 채 다른 폴더를 무작위로 읽는 시험은 하지 않습니다.

허가된 격리 테스트 환경에서는 허용 샘플과 차단 대상으로 지정한 별도 샘플을 준비해 기대 결과를 나눌 수 있습니다. 경로 해석이나 링크 처리까지 포함한 검토가 필요할 수 있으므로 단순 문자열 비교 한 줄을 완전한 보안 대책처럼 쓰지 마세요. 실제 차단은 서버·운영체제·격리 계층에서 보장해야 한다는 설계상의 권고입니다.

6. 새 구현에서는 무엇으로 바꿀까

새 도구를 만든다면 호출마다 필요한 대상이 달라지는지, 고정된 작업 공간만 다루는지부터 결정하세요. 공식 이전 방향을 실무에 적용하면 다음처럼 선택할 수 있습니다. 아래 선택 기준은 설계 제안이며 MCP가 강제하는 제품 구조는 아닙니다.

업무 조건검토할 전달 방식
호출마다 대상이 달라짐도구 인자에 명시적인 대상 식별자를 전달
서버가 제공하는 문서·데이터를 읽음서버가 정의한 리소스 URI 사용
서버가 고정 작업 공간만 처리함관리자가 통제하는 서버 설정으로 범위 지정

어느 방식을 골라도 대상 지정과 접근 허용은 따로 판단해야 합니다. 경로나 URI를 받았다는 사실만으로 호출자가 그 대상을 읽을 권한을 갖는 것은 아닙니다. 이전할 때는 기존 작업이 계속 되는지와 금지된 작업이 계속 차단되는지를 함께 살펴야 합니다.

함께 읽기와 공식 출처

읽기 전용이라는 표시의 의미가 궁금하다면 도구 annotations의 네 가지 힌트를, 최신 요청 흐름이 낯설다면 initialize 없는 discovery 모델을 함께 읽으세요. 리소스 목록과 실제 읽기의 차이는 resources/list와 URI 템플릿 진단에 정리했습니다.

공식 근거: Roots 2026-07-28, Roots 2025-11-25, SEP-2577, 로컬 MCP 서버 보안 고려사항. 2026년 10월 10일 확인. 특정 SDK의 동작이나 제품별 메뉴 위치를 검증한 글은 아닙니다.


다른 글 보기 · 주제 탐색 · 작성자와 편집 기준 · 문의·정정 요청

RUDA DIRECTOR에서 더 알아보기

지금 구독하여 계속 읽고 전체 아카이브에 액세스하세요.

계속 읽기