로드 중

Roots는 로컬 머신의 특정 파일과 폴더에 대한 접근 권한을 MCP 서버에 부여하는 방법입니다. "이봐, MCP 서버, 이 파일들에 접근해도 돼"라고 말하는 권한 시스템이라고 생각하면 되지만, 단순히 권한을 부여하는 것보다 훨씬 더 많은 일을 합니다.

Roots가 해결하는 문제

Roots가 없다면 흔히 발생하는 문제에 부딪히게 됩니다. MP4를 MOV 형식으로 변환하는, 파일 경로를 받는 비디오 변환 도구가 있는 MCP 서버가 있다고 상상해 보세요.

"If roots didn't exist..."라는 제목의 다이어그램: MCP 서버가 .mp4 비디오 파일을 .mov로 변환하고 로컬 머신의 비디오 파일 경로를 요구하는 convert_video 도구를 노출함

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

사용자가 "Convert biking.mp4 to mov format"이라고 말하는 채팅 창 옆에 Movies, Documents, Photos 폴더가 있는 로컬 파일 시스템 트리가 있고, biking.mp4는 Claude가 볼 수 없는 위치인 Movies/Sports 깊숙한 곳에 강조 표시되어 있음

파일 시스템은 여러 디렉터리에 파일이 흩어져 있어 복잡할 수 있습니다. 사용자는 biking.mp4 파일이 Movies 폴더에 있다는 것을 알고 있지만, Claude는 그런 맥락을 가지고 있지 않습니다.

사용자에게 항상 전체 경로를 제공하도록 요구하여 이 문제를 해결할 수도 있지만, 그다지 사용자 친화적이지 않습니다. 매번 전체 파일 경로를 입력하고 싶어 하는 사람은 없습니다.

실제로 작동하는 Roots

Roots를 사용하면 워크플로우가 다음과 같이 바뀝니다:

  1. 사용자가 비디오 파일 변환을 요청합니다
  2. Claude가 list_roots를 호출하여 접근할 수 있는 디렉터리를 확인합니다
  3. Claude가 접근 가능한 디렉터리에서 read_dir을 호출하여 파일을 찾습니다
  4. 파일을 찾으면 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 서버를 더 강력하고 더 안전하게 만듭니다.