{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_6d7hvj4zqkha","handle":"seojae-mcp","url":"https://wellknown.network/agents/seojae-mcp","links":{"self":"https://wellknown.network/agents/seojae-mcp/record.json","html":"https://wellknown.network/agents/seojae-mcp","markdown":"https://wellknown.network/agents/seojae-mcp/record.md","api":"https://wellknown.network/api/v1/agents/seojae-mcp","status":"https://wellknown.network/api/v1/agents/seojae-mcp/status","claim":"https://wellknown.network/agents/seojae-mcp/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/seojae-mcp/claim.json","badge":"https://wellknown.network/agents/seojae-mcp/badge.svg","openapi":"https://wellknown.network/openapi.json"},"ard":{"identifier":"urn:air::server:seojae-mcp","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"seojae-mcp","summary":"폴더에 문서를 꽂아두면 Claude가 꺼내 읽는 로컬 RAG MCP 서버 (한국어 형태소 검색)","description":"# 서재 (Seojae)\n\n**폴더에 문서를 꽂아두면 Claude가 꺼내 읽는 로컬 RAG MCP 서버.**\n\n문서를 폴더에 정리해두면 자동으로 색인해서 MCP로 노출한다.\nClaude가 질문에 맞는 책장을 골라 검색하고, **출처(파일·위치)를 붙여** 답한다.\n\n```\n질문: \"예외 처리 규약이 어떻게 되지?\"\n\nClaude → search(query=\"예외 처리 규약\", collection=\"개발가이드\")\n       ← 3건, 각각 출처 포함\n\n답변: 업무예외는 DefaultApplicationException으로 던진다.\n      (출처: 개발가이드/아키텍처.md · \"예외 처리\" 절)\n```\n\n문서는 **PC를 떠나지 않는다.** 네트워크 전송 없음, 외부 API 호출 없음, 계정 없음.\n\n> [!NOTE]\n> 개발 중이다. 6단계 중 5단계까지 동작한다. 아래 [진행 상태](#진행-상태) 참고.\n\n---\n\n## 이 프로젝트가 LLM을 부르지 않는 이유\n\nRAG는 **R**etrieval(검색)과 **G**eneration(생성)으로 나뉜다.\n보통은 도구가 둘 다 하지만, 서재는 **검색만 한다.**\n\n| | 하는 일 | 누가 |\n|---|---|---|\n| **R** | 색인·검색·출처 | 서재 (로컬) |\n| **G** | 답변 생성 | 사용자의 Claude |\n\n생성을 사용자의 LLM에 맡기면 세 가지가 따라온다.\n\n- **비용 0** — 내가 낼 API 요금이 없다. 사용자도 이미 내고 있는 구독을 그대로 쓴다\n- **유출 0** — 문서가 내 서버로 갈 일이 없다. 애초에 서버가 없다\n- **모델 선택 자유** — 사용자가 쓰는 모델이 곧 이 도구의 성능이다\n\n같은 원리를 **분류**에도 적용한다. 미분류 파일을 어느 책장에 꽂을지 판단하는 것도\nLLM의 일이지만, 서재는 판단하지 않는다. **읽을 재료(본문 발췌)와 옮기는 손(파일 이동)만 제공하고,\n판단은 사용자의 Claude가 한다.**\n\n---\n\n## 도서관 비유\n\n| 도서관 | 서재 |\n|---|---|\n| 반납대·미정리 도서 | `_inbox\\` 미분류 파일 |\n| 사서가 분류해 배가 | Claude가 판단 → `file_document`가 실제 이동 |\n| 서가·청구기호 | 컬렉션 폴더 + `README.md` 프론트매터 |\n| 열람 요청 | `search` / `get_document` (출처 포함) |\n| **도서관 이용자** | **AI (사용자의 Claude)** |\n\n사서도 손님도 AI지만, **서고와 목록은 로컬에 있다.**\n\n---\n\n## 폴더 구조가 곧 지식베이스 설계다\n\n루트 폴더 하나를 지정한다. 그 **바깥은 어떤 경우에도 읽지 않는다.**\n\n```\n내서재\\\n├── 업무규정\\              ← 컬렉션 (책장)\n│   ├── README.md             ← 이 책장이 무엇인지 (라우팅 근거)\n│   ├── 취업규칙.pdf\n│   └── 경비\\\n│       └── 출장비지침.docx   ← 하위 폴더도 같은 책장으로 색인\n├── 개발가이드\\\n│   ├── README.md\n│   └── 아키텍처.md\n└── _inbox\\                ← 미분류 투입구. 일단 여기 던져둔다\n    └── 어제받은문서.pdf\n```\n\n각 책장의 `README.md` 프론트매터가 그 책장의 정의다.\n\n```markdown\n---\nname: 업무규정\ndescription: 회사 취업규칙과 경비 지침. 휴가·출장비·근무시간 질문에 사용.\ntags: [규정, 총무]\n---\n\n# 업무규정\n- 취업규칙.pdf — 근로조건 정본\n```\n\n`description`은 \"**어떤 질문에 이 책장을 써야 하는지**\"를 적는다.\n이 문장이 서버 instructions로 주입돼서, Claude가 검색 전에 **어느 서랍을 열지 먼저 고른다.**\nREADME가 없으면 폴더명·파일명·헤딩으로 자동 생성한다 (동작은 항상 되게).\n\n---\n\n## 다른 로컬 RAG MCP 서버와 뭐가 다른가\n\n\"로컬 폴더를 RAG로 색인해 M…","publisher":{"name":"Jonghoon5922","url":null},"homepage":"https://github.com/Jonghoon5922/seojae","repository":"https://github.com/Jonghoon5922/seojae","version":"0.1.0","license":null,"protocols":["mcp"],"tags":["bm25","claude","korean","local","mcp","rag","search","sqlite"],"pricing":null,"endpoints":[{"url":"pypi:seojae-mcp","type":"package_pypi","auth":null,"probeable":false}],"skills":null,"tools":null,"extra":null,"attribution":{"kind":"pypi","name":"pypi","repoUrl":"pypi","summary":"pypi","version":"pypi","description":"pypi","homepageUrl":"pypi","publisherName":"pypi"}},"derived":{"capabilities":[{"slug":"data.database","name":"Databases","confidence":1,"provenance":"declared"},{"slug":"data.vector-search","name":"Vector Search","confidence":1,"provenance":"declared"}],"categories":["data"],"language":"ko"},"observed":{"status":"unknown","statusReason":"Distributed as a package to run locally; no network endpoint to check.","lastOkAt":null,"lastProbedAt":null,"statusComputedAt":null,"reliability30d":null,"latestObservations":[],"tools":null,"package":{"name":"seojae-mcp","registry":"pypi","observedAt":"2026-09-10T12:23:20.698Z","publishedAt":"2026-09-08T07:52:06.112383Z","latestVersion":"0.1.0"}},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"pypi","key":"seojae-mcp","url":"https://pypi.org/project/seojae-mcp/","firstSeenAt":"2026-09-10T12:21:35.169Z","fetchedAt":"2026-09-10T12:21:35.169Z","normalizedAt":"2026-09-10T12:21:35.169Z"}]},"firstSeenAt":"2026-09-10T12:21:35.169Z","updatedAt":"2026-09-10T12:23:20.698Z"}