프로젝트 소개

Context (supa-media/context)는 ChatGPT, Claude, Codex, Notion AI 등의 AI 클라이언트가 개인 지식 베이스를 읽고 쓸 수 있는 단일 엔드포인트를 제공하는 MCP 게이트웨이입니다. 지식 베이스는 사용자가 제어하는 계정(Dropbox, Cloudflare R2, AWS S3, Backblaze B2 또는 기타 S3 호환 스토리지)에 저장되는 일반 Markdown 파일로 구성됩니다. README에서는 세 가지 관련 단위를 설명합니다. **brain**(사용자 이름으로 지정된 개인 컨텍스트), **workspace**(타인과 공유하는 컨텍스트), 그리고 이들의 합집합인 **context**입니다. 하나의 엔드포인트를 연결함으로써 새로운 어시스턴트가 나타날 때마다 프로젝트, 결정 사항, 이력을 다시 가르쳐야 하는 번거로움을 줄일 수 있습니다. ## 두 개의 평면 (Two planes) 설계상 제어 평면(control plane)과 데이터 평면(data plane)이 분리되어 있으며, README는 이 분리를 프로젝트의 핵심으로 다룹니다. - **제어 평면** (`apps/convex`) — 계정, 워크스페이스, OAuth 권한 부여 및 스토리지 바인딩을 관리합니다. 메타데이터만 보유하며, 노트나 복사본을 저장하지 않습니다. - **데이터 평면** — 사용자의 Dropbox 폴더 또는 오브젝트 스토리지 버킷입니다. Context 계정을 삭제하면 제어 평면은 삭제되지만 데이터 평면은 그대로 유지됩니다. MCP 게이트웨이 (`apps/mcp`)는 독립형 Cloudflare Worker로 설명되며, 호스팅 서비스가 중단되더라도 사용자가 직접 배포하여 버킷을 계속 사용할 수 있습니다. ## 스토리지 및 이식성 주장 - 일반 파일이 표준입니다: Obsidian에서 읽을 수 있고, grep 가능하며, `rclone`으로 제거할 수 있는 Markdown 형식을 사용합니다. 독점 데이터베이스를 유일한 복사본으로 사용하지 않습니다. - 스토리지는 기본 형태를 유지합니다. Dropbox의 일반 폴더나 오브젝트 스토리지의 버킷 수준 테넌시를 유지하며, 키를 재작성하거나 경로에 네임스페이스를 추가하지 않습니다. 기존의 brain은 마이그레이션 없이 연결 가능합니다. - 인덱스(검색 캐시, 임베딩)는 파일로부터 다시 생성할 수 있는 일회성 파생물로 설명됩니다. ## 도구 및 컨벤션 **`orient`**는 연결된 클라이언트가 가장 먼저 호출하도록 안내되는 도구입니다. 메인 페이지, 최근 수정된 노트, 노트 수가 포함된 폴더 맵을 반환합니다. 출력값의 대부분은 버킷에서 파생되어 호출 시마다 재구축됩니다. README에 따르면 이 지침은 클라이언트가 아닌 연결 설정에 포함되므로, 지속성을 위해 클라이언트 측의 커스텀 지침, 시스템 프롬프트 또는 규칙 파일 사용을 권장합니다. **`index.md`**는 버킷 루트에 위치한 사용 소유의 일반 Markdown 파일입니다. 설정 시 초기 버전이 작성되며, 에이전트는 이를 교체하는 대신 내용을 추가하고 변경 사항을 먼저 명시하도록 안내받습니다. 개인 연결 전용 콘텐츠를 위한 선택적 `index-private.md` 파일을 함께 둘 수 있습니다. 이미 노트가 있는 버킷을 연결해도 덮어쓰지 않으므로, 가져온 brain에는 `index.md`가 없을 수 있으며 이 경우 `orient`가 이를 알립니다. **`save_context`**는 세션 종료 시 에이전트가 호출하는 도구입니다. 동작 방식은 `index.md` 내의 `## Save context` 섹션에서 `destination:` 라인과 사용자가 원하는 절차를 통해 정의됩니다. **세션 종료 훅 (Session-end hook)** — `npx -y @supa-media/context-hook install`을 통해 한 번 로그인하면 Claude Code에 `SessionEnd` 훅이 추가되어, 세션의 사용자 가시적 메시지가 자동으로 `0-inbox/`에 저장됩니다. README에 따르면 이는 캡처 권한만 요청하며 노트를 읽을 수 없고, 연결(Connections) 목록에 표시되며 개별적으로 취소 가능합니다. 소스는 `packages/hook`에 있습니다. ## 조직화 설정 시 PARA 스타일 구조(`0-inbox/`, `1-projects/`, `2-areas/`, `3-resources/`, `4-archive/`)를 생성하지만, 이는 스키마가 아닌 제안 사항입니다. 도구들이 경로 기반으로 작동하므로 사용자가 정의한 구조에서도 동일하게 작동합니다. ## 개인정보 보호 모든 노트는 `private` 또는 `team`으로 설정됩니다. 폴더 기본값은 버킷 루트의 `privacy.md` 매니페스트에 선언되며, 소유자에게 보이고 서버 측에서 강제됩니다. 개별 노트는 폴더 설정을 오버라이드할 수 있습니다. `team`은 지정된 사람들을 의미하며, 공개 인터넷을 의미하지 않습니다. 익명 계층은 존재하지 않습니다. ## 리포지토리 레이아웃 | 경로 | 목적 | | --- | --- | | `apps/convex/` | 제어 평면 — 계정, 워크스페이스, 스토리지 바인딩, 권한 | | `apps/mobile/` | Expo 앱 (iOS, Android, web) — 온보딩 및 대시보드 | | `apps/mcp/` | MCP 게이트웨이 Worker — 도구, 프라이버시 엔진, 스토리지 어댑터 | | `packages/shared/` | 앱 간 공유되는 타입 및 상수 | | `packages/hook/` | `npx`로 설치 가능한 세션 종료 훅 | ## 개발 ```sh pnpm install npx convex dev # Convex 배포 생성 pnpm dev # Convex + Expo 동시 실행 cd apps/mcp && pnpm test # README 기준 442개 체크, 의존성 없음, 네트워크 없음 ``` 이 프로젝트는 supa-framework를 기반으로 구축되었습니다.