AI 에이전트에게 도구를 100개 주는 것보다 파일시스템 하나를 주는 게 더 효과적일 수 있습니다. Anthropic, Vercel 같은 기업들이 최근 이 방식으로 전환하고 있죠. 하지만 실무에서 가장 큰 문제는 “우리 데이터베이스와 API를 어떻게 파일시스템으로 만들까?”입니다.

독일 개발자 Jakob Emmerling이 이 문제에 대한 실용적 해법을 제시했습니다. FUSE(Filesystem in Userspace)라는 리눅스 기술을 이용해 데이터베이스, API 등 모든 것을 파일시스템처럼 보이게 만드는 방법이죠. 이메일 플랫폼을 예시로 실제 구현 코드와 동작하는 에이전트까지 보여줍니다.
출처: FUSE is All You Need – Giving agents access to anything via filesystems – Jakob Emmerling
파일시스템 기반 에이전트가 주목받는 이유
Anthropic의 Agent SDK, Vercel의 text-to-SQL 에이전트 재구축, Turso의 AgentFS 등 최근 주요 기업들이 파일시스템 기반으로 에이전트를 설계하고 있습니다. 이유는 명확합니다.
기존 방식은 에이전트에게 search-email, read-email, move-email 같은 도구를 수십 개 제공했습니다. 각 도구마다 사용법을 배워야 하고, 도구 간 조합도 복잡했죠. 파일시스템을 주면 이 모든 게 ls, cat, mv 같은 익숙한 명령어로 통합됩니다.
더 중요한 건 성능입니다. 대형 AI 모델들은 코딩 작업을 학습할 때 파일시스템 환경에서 집중적으로 훈련받습니다. 같은 구조를 다른 도메인에 적용하면 코딩에서 학습한 능력을 무료로 가져올 수 있어요.
파일시스템이 주는 부가적 혜택도 있습니다. 에이전트가 자연스럽게 임시 파일을 만들어 계획을 정리하거나, 긴 대화 내역을 파일로 압축해 컨텍스트를 관리할 수 있죠.
실무의 난제: 우리 데이터를 어떻게 파일로 만들까
이론은 좋은데 실전이 문제입니다. 이메일 플랫폼이나 구글 드라이브처럼 이미 ‘폴더와 파일’ 개념이 있는 서비스도 까다롭습니다. 다음 질문들에 답해야 하거든요.
언제 데이터를 샌드박스로 복사할까? 전체를 다 복사할까? 에이전트가 수정한 내용을 어떻게 원본에 반영할까? 사용자가 동시에 편집하면 어떻게 동기화할까? 점진적으로 폴더를 보여주려면 어떻게 해야 할까?
Vercel이 최근 파일시스템 기반 에이전트 구축에 관한 글을 올렸을 때, 한 개발자가 정확히 이 지점을 짚었습니다. “파일시스템 구조는 잘 설명했는데, 정작 중요한 건 빠졌네요. Postgres, 오브젝트 스토리지, API를 실제로 어떻게 샌드박스 파일시스템으로 만드나요? ‘파일을 미리 로드하세요’라는 건 구체적인 패턴 없이는 공허한 조언이에요.”
FUSE: 모든 걸 파일시스템으로 바꾸는 마법
FUSE(Filesystem in Userspace)는 이 간극을 메우는 해법입니다. 리눅스 커널 기능인데, 일반 프로그램이 파일시스템을 구현할 수 있게 해줍니다. 커널은 이걸 ‘진짜’ 파일시스템처럼 보이게 만들어주죠.
작동 방식은 이렇습니다. ls, cat, mv 같은 파일 작업이 일어나면 운영체제는 이 요청을 여러분이 작성한 프로그램으로 전달합니다. 여러분의 코드가 readdir, read, write 같은 함수를 구현하면 되는 거예요. 이 함수들 안에서 데이터베이스 쿼리를 하든, API를 호출하든 자유입니다.
예를 들어 이메일 플랫폼이라면 이렇게 구현할 수 있습니다.
workspace/
Inbox/
고객 문의 - 사이즈표 ([email protected])
발주 확인 #2026-0038 ([email protected])
Orders/
2026/
Feb/
발주 확인 #2026-0038 ([email protected])
Starred/
도매 문의 - SilverLeaf ([email protected])에이전트가 ls /workspace/Inbox를 실행하면 FUSE가 이를 가로채서 여러분의 데이터베이스 쿼리로 변환합니다. 에이전트 입장에서는 그냥 파일시스템이에요. 실제로는 실시간으로 데이터베이스에서 읽어오는 거죠.
Jakob의 구현 예시를 보면 readdir 함수는 이렇게 생겼습니다.
async function readdir(path: string, cb: (err: number, names?: string[]) => void) {
// 경로로 폴더 찾기
const [folder] = await db.select().from(foldersTable)
.where(eq(foldersTable.path, path));
if (!folder) return cb(Fuse.ENOENT);
// 폴더 안의 이메일 가져오기
const emailsInFolder = await db.select({
email: emailsTable,
sender: contactsTable,
}).from(emailsTable)
.leftJoin(contactsTable, eq(emailsTable.sender, contactsTable.id))
.where(eq(emailsTable.folderId, folder.id));
const entries = new Set<string>();
// 이메일을 파일명으로 변환
for (const {email, sender} of emailsInFolder) {
entries.add(`${email.subject} (${sender.email}).eml`);
}
// 하위 폴더도 추가
const subfolders = await db.select().from(foldersTable)
.where(like(foldersTable.path, sql`${path}/%`));
for (const subfolder of subfolders) {
entries.add(subfolder.path.split("/").pop() || "");
}
cb(0, Array.from(entries));
}경로를 기준으로 데이터베이스에서 폴더를 찾고, 그 안의 이메일과 하위 폴더를 조회해서 파일 목록으로 반환합니다. 에이전트가 ls /workspace/Inbox를 실행하면 이 함수가 호출되는 거죠.
이메일 내용을 읽을 때는 read 함수가 작동합니다.
function emailToContent(email: EmailWithSender): string {
return `From: ${email.senderEmail}
Date: ${email.sentAt.toISOString()}
Subject: ${email.subject}
X-Folder: ${email.folderPath}
X-Starred: ${email.starred}
${email.body}
`;
}데이터베이스에서 이메일을 가져와 표준 .eml 파일 형식으로 포맷팅해줍니다.
TypeScript로 작성할 수 있고, Python이나 Go 같은 언어도 FUSE 라이브러리가 있습니다. C 코드를 만질 필요가 없어요.
실제 동작: 이메일 에이전트와 대화하기
Jakob은 이 파일시스템을 Anthropic Agent SDK와 연결해서 실제 작동하는 이메일 에이전트를 만들었습니다. 시스템 프롬프트에는 파일시스템 구조와 기본 명령어만 간단히 설명했어요.
사용자가 “받은편지함에 어떤 이메일이 있어?”라고 물으면 에이전트는 ls /workspace/Inbox/를 실행하고 결과를 자연어로 정리해서 보여줍니다. “도매 문의 이메일 찾아줘, 나중에 답장해야 하거든”이라고 하면 find 명령어로 검색한 뒤 심볼릭 링크를 만들어 이메일에 별표를 답니다.
가장 인상적인 건 “받은편지함 정리해줘”라는 요청이었습니다. 에이전트는 스스로 이메일을 읽고 내용을 파악한 뒤, 고객 문의는 Customers 폴더로, 발주 관련은 Orders 폴더로 이동시켰어요. 파트너십 제안서는 새로 Business_Opportunities 폴더를 만들어 분류했고, 긴급한 세금 신고 마감이나 관세 서류는 받은편지함에 남기면서 Needs_Action 폴더에 링크를 만들었습니다.
도구 설계에 시간을 쓰지 않았는데도 에이전트는 Unix 명령어를 조합해 복잡한 작업을 수행했습니다. 파일시스템이라는 범용 인터페이스가 직관적인 행동 패턴을 가능하게 만든 거죠.
핵심은 컨텍스트 엔지니어링
도메인을 파일시스템에 매핑하는 건 결국 컨텍스트 엔지니어링 문제입니다. Jakob은 이메일에 starred나 needsAction 플래그가 있으면 가상 폴더에 심볼릭 링크로 보이게 했습니다. 링크를 만들거나 삭제하면 플래그가 토글되죠. 파일시스템 추상화를 최대한 활용한 선택입니다.
물론 모든 작업이 파일시스템으로 표현되진 않습니다. 이메일 발송 같은 건 여전히 별도 도구가 필요해요. 하지만 데이터 탐색, 읽기, 정리 작업은 파일시스템 인터페이스로 충분히 커버됩니다.
중요한 건 동기화 문제가 없다는 점입니다. 미리 데이터를 복사해두는 게 아니라 FUSE가 실시간으로 데이터베이스를 읽습니다. 사용자가 웹 UI에서 이메일을 옮기면 에이전트가 보는 파일시스템에도 즉시 반영돼요. 필요한 데이터만 접근할 때 로드되기 때문에 전체 데이터베이스를 샌드박스에 부어넣을 필요도 없고요.
앞으로의 가능성
이 접근법은 이메일을 넘어 광범위하게 적용될 수 있습니다. 오래된 대화 내역을 파일로 만들어 파일시스템에 놓으면 에이전트가 필요할 때 읽을 수 있습니다. 컨텍스트를 압축한 뒤 도구 호출 결과를 파일로 저장해두는 식으로 긴 대화를 관리할 수도 있죠.
지금은 FUSE를 직접 구현해야 하지만, Jakob은 앞으로 E2B, Modal 같은 샌드박스 서비스 업체들이 이 기능을 간단한 API로 제공할 거라고 예측합니다.
new Agent({
tools: [...]
sandbox: {
filesystem: {
'/emails': (folder) => listEmails(folder),
'/old_conversations': () => listOldConversations(),
}
}
})개발자는 “이 경로에서 이 함수 실행해줘”만 정의하면, 서비스가 알아서 FUSE 구현과 샌드박스 설정을 처리해주는 거죠. 파일시스템 기반 에이전트 개발이 훨씬 쉬워질 겁니다.
코딩 에이전트가 계속 중요한 위치를 차지하는 한, 파일시스템은 모델에게 가장 자연스러운 인터페이스로 남을 것 같습니다. 결국 모델들이 가장 많이 학습한 환경이니까요.
참고자료:
- agent-fuse GitHub Repository – 전체 구현 코드

답글 남기기