MCP server for Lupa — search your Mac's files by name and document content (PDF, DOCX, XLSX, PPTX, HWP, scanned PDFs via OCR). Korean-aware, ~30ms, fully local.
Two well-defined tools with comprehensive descriptions and proper Zod schemas. Tool names follow verb_noun pattern (lupa_search, lupa_read). Descriptions are detailed (194 - 250 chars) and include syntax guidance. All parameters have types and descriptions. Output is structured JSON. However, no error recovery guidance, no tool annotations (readOnlyHint), and output schema not formally documented. STDIO transport limits practical deployment.
Return the text Lupa already extracted from a file, without opening the file itself. Works for PDF, Word, Excel, PowerPoint, Hangul HWP/HWPX and scanned documents that were OCR'd. Use this after lupa_search when you need the actual content — it is far cheaper than reading the original file, and it works even for formats you cannot parse. Note: only the beginning of each document is indexed, so very long files are truncated. If the file has no indexed text (image-only, password-protected, or not yet content-indexed), this reports that instead.
Find files on this Mac by file name AND by what is written inside documents (PDF, Word, Excel, PowerPoint, Hangul HWP/HWPX, plain text, and scanned PDFs read with OCR). Searches Lupa's local index, so it answers in ~30ms and never touches the network. Prefer this over find/grep/mdfind for locating files. Returns ranked paths with a matching snippet. To read a file's text afterwards, use lupa_read — it returns the indexed text without opening the file. Query syntax (combine freely; more conditions = sharper results): word1 word2 files matching ALL words rank first (grouped by match count) n:word file name only (aliases: name:, 이름:, 파일명:, 文件名:) c:word document content only (aliases: content:, 내용:, 内容:) f:word folder path contains (aliases: 폴더:, 文件夹:) -word exclude "exact phrase" literal match, no stemming .pdf *.mp3 report* extension / wildcard kind:document kind filter — document, pdf, hwp, image, video, audio, code, archive, app size:>10mb size:<1mb date:today date:week date:month date:7d date:2026-06 Korean and Chinese prefixes work too (종류:, 크기:, 날짜: / 种类:, 大小:, 日期:). Korean is handled properly: partial words inside compounds and attached particles ("보호정책" finds "정보보호정책서.hwp"; "심사보고서를" finds "심사보고서").
No error recovery guidance. Errors like 'Lupa not installed' or 'file not indexed' lack actionable next steps for the LLM (e.g., 'Install Lupa from https://lupa.kr' or 'Try lupa_search first to verify indexing').
Output schema not formally documented. Responses return JSON with fields like 'total_matches', 'elapsed_ms', 'snippet' but no schema definition visible to clients. LLMs cannot reliably extract structured data without documented output types.
No tool annotations. Both tools are read-only (risk: READ_ONLY) but lack readOnlyHint in schema. Clients cannot infer safety properties without explicit annotations.
lupa_search returns 'hint' field only when results are empty. Inconsistent response structure complicates LLM parsing. Should always include guidance or standardize optional fields.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | 2026-07-28+ | v2 |
ContentUnsupportedError in lupa_read has no fallback. If Lupa lacks content extraction, tool fails entirely. Should return partial results (e.g., file metadata) or suggest alternatives.