Claude에 내 서버를 붙여서 법인 비서를 만들었다

명세서 자동 읽기까지 만들고 나니 도구가 여러 개가 됐다. 메일에서 첨부를 꺼내는 것, 거래 원장에 적재하는 것, 월별로 집계하는 것. 각각은 되는데 쓰려면 매번 내가 순서를 기억해서 불러야 했다.

그래서 이것들을 한 서버에 묶고, 그 서버를 챗봇에 도구로 연결했다. 이제 "이번 달 결산 해줘"라고 말하면 순서는 저쪽이 정한다.

권한을 어디까지 줄 것인가

만들기 전에 정한 게 이거였다. 데이터를 사람이 날라야 AI에 닿는다면 그건 자동화가 아니다. 그렇다고 다 열어주면 사고가 났을 때 되돌릴 수가 없다.

그래서 도구를 역할별로 나누고 각각에 다른 등급을 매겼다.

읽는 도구는 넓게 열었다. 메모와 문서, 보관한 파일, 메일, 거래 원장. 대신 이쪽은 읽기만 된다. 메일을 예로 들면 보내거나 지우는 도구를 아예 만들지 않았다. 만들지 않은 기능은 잘못 불릴 일이 없다.

밖으로 나가는 행동은 사람 승인 뒤에만 하게 했다. 글을 게시하거나 알림을 발송하는 것들이다. 한 번 나가면 주워 담을 수 없으니 자동으로 흘러가면 안 된다.

돈이 움직이는 일은 서버가 기록만 하고, 실행은 내 기기에서 따로 한다. 서버가 판단은 해도 마지막 버튼은 사람이 누른다.

서버가 인터넷에 열려 있다는 전제

이 서버는 폰에서도 써야 해서 바깥에서 닿는다. 그러면 설계가 달라진다. 집에서만 도는 프로그램이라면 넘어갔을 것들이 전부 공격면이 된다.

제일 크게 바꾼 건 파일을 들이는 도구다. 처음엔 경로를 받게 만들었는데, 그러면 인터넷에서 내 맥의 아무 파일이나 읽어가는 통로가 된다. 그래서 폴더는 서버가 고정하고, 호출하는 쪽은 그 안의 파일명만 지목하게 바꿨다. 이렇게 하니 부수 효과도 하나 생겼다. 챗봇이 나르는 게 파일명 문자열뿐이라 파일이 커도 상관이 없어졌다.

알림을 보내는 도구도 손봤다. 알림은 주소를 받아서 그리로 쏘는 구조인데, 아무 주소나 받으면 서버가 남의 서버를 두드리는 도구가 된다. 그래서 알려진 푸시 서비스 주소만 허용하는 목록을 뒀다. 목록을 검사할 때도 끝부분만 대충 맞춰보면 비슷한 이름을 붙인 주소로 뚫린다. 정확히 그 도메인이거나 그 도메인의 하위인 경우만 통과시킨다.

판단하는 쪽과 손을 대는 쪽을 나눴다

또 하나 나눈 게 있다. 무엇을 할지 판단하는 세션과, 파일을 실제로 고치고 배포하는 세션을 분리했다.

판단하는 쪽은 실제 데이터에 손이 닿지 않는다. 대신 맥락을 안다. 손을 대는 쪽은 저장소를 직접 만지지만 판단은 하지 않고 시킨 것만 한다. 둘 사이는 짧은 지시문으로 오간다.

이 블로그도 그 구조로 돌아간다. 글을 쓰는 쪽과 배포하는 쪽이 다르고, 배포하는 쪽은 정해진 순서만 밟는다.

정리

핵심은 AI가 하는 일과 사람이 누르는 버튼을 나눈 것이다. 읽는 건 넓게, 쓰는 건 좁게, 밖으로 나가는 건 승인 뒤에. 그리고 서버가 열려 있다는 전제를 처음부터 깔고 만드는 것.

편해진 건 분명하다. 다만 편해진 만큼 사고 범위도 같이 커졌을 것이라서, 도구를 하나 더할 때마다 "이게 잘못 불리면 무슨 일이 벌어지나"를 먼저 적어보고 시작한다.