Roots는 MCP 서버가 로컬 머신의 특정 파일과 폴더에 접근할 수 있도록 권한을 부여하는 방법입니다. "이봐, MCP 서버야, 너는 이 파일들에 접근할 수 있어"라고 말하는 권한 시스템이라고 생각하면 되지만, 실제로는 단순히 권한을 부여하는 것보다 훨씬 더 많은 역할을 합니다.
Roots가 해결하는 문제
Roots가 없다면 흔히 발생하는 문제에 부딪히게 됩니다. 파일 경로를 받아 MP4를 MOV 형식으로 변환하는 비디오 변환 도구를 가진 MCP 서버가 있다고 상상해 보세요.

사용자가 Claude에게 "biking.mp4를 mov 형식으로 변환해줘"라고 요청하면, Claude는 파일명만으로 도구를 호출하게 됩니다. 하지만 여기서 문제가 발생합니다 - Claude는 전체 파일 시스템을 검색해서 그 파일이 실제로 어디에 있는지 찾을 방법이 없습니다.

파일 시스템은 여러 디렉터리에 파일이 흩어져 있어 복잡할 수 있습니다. 사용자는 biking.mp4 파일이 Movies 폴더에 있다는 것을 알고 있지만, Claude는 그 맥락을 알지 못합니다.
사용자에게 항상 전체 경로를 제공하도록 요구함으로써 이 문제를 해결할 수도 있지만, 이는 사용자 친화적이지 않습니다. 매번 전체 파일 경로를 입력하고 싶어하는 사람은 없습니다.
실제로 작동하는 Roots
Roots를 사용하면 워크플로우가 다음과 같이 바뀝니다:
- 사용자가 비디오 파일 변환을 요청합니다
- Claude가
list_roots를 호출하여 접근 가능한 디렉터리를 확인합니다 - Claude가 접근 가능한 디렉터리에서
read_dir을 호출하여 파일을 찾습니다 - 파일을 찾으면, Claude가 전체 경로와 함께 변환 도구를 호출합니다
이 과정은 자동으로 이루어지므로 - 사용자는 전체 경로를 제공하지 않고도 그냥 "biking.mp4 변환해줘"라고 말할 수 있습니다.
보안과 경계
Roots는 접근을 제한함으로써 보안도 제공합니다. Desktop 폴더에만 접근 권한을 부여한 경우, MCP 서버는 Documents나 Downloads 같은 다른 위치의 파일에 접근할 수 없습니다.
Claude가 승인된 roots 밖의 파일에 접근하려고 하면 오류가 발생하며, 현재 서버 구성에서는 해당 파일에 접근할 수 없다는 것을 사용자에게 알릴 수 있습니다.
구현 세부사항
MCP SDK는 root 제한을 자동으로 강제하지 않으므로 - 직접 구현해야 합니다. 일반적인 패턴은 다음과 같은 작업을 수행하는 is_path_allowed()와 같은 헬퍼 함수를 만드는 것입니다:
- 요청된 파일 경로를 받습니다
- 승인된 roots 목록을 가져옵니다
- 요청된 경로가 해당 roots 중 하나에 속하는지 확인합니다
- 접근 권한에 대해 true/false를 반환합니다
그런 다음 실제 파일 작업을 수행하기 전에 파일이나 디렉터리에 접근하는 모든 도구에서 이 함수를 호출합니다.
주요 이점
- 사용자 친화적 - 사용자가 전체 파일 경로를 제공할 필요가 없습니다
- 집중된 검색 - Claude가 승인된 디렉터리에서만 검색하므로 파일 검색이 더 빨라집니다
- 보안 - 승인된 영역 밖의 민감한 파일에 대한 우발적인 접근을 방지합니다
- 유연성 - 도구를 통해 roots를 제공하거나 프롬프트에 직접 주입할 수 있습니다
Roots는 Claude에게 파일을 찾는 데 필요한 맥락을 제공하면서도 접근할 수 있는 범위에 대한 명확한 경계를 유지함으로써 MCP 서버를 더 강력하고 더 안전하게 만들어줍니다.