Skip to main content
Glama

MCP Local RAG

GitHub stars npm version License: MIT MCP Registry

MCP 클라이언트나 터미널에서 개인 문서를 검색하되, 문서를 임베딩 API로 전송하지 않습니다.

mcp-local-rag는 사용자 컴퓨터의 PDF, DOCX, Markdown, 텍스트 파일을 인덱싱합니다. 검색은 의미적 유사성과 키워드 매칭을 결합하므로, 쿼리가 의도와 API 이름, 클래스 이름, 오류 코드 같은 정확한 기술 용어를 모두 매칭할 수 있습니다.

기능

  • 로컬에서 실행: 문서 파싱, 임베딩, 저장, 검색이 모두 사용자 컴퓨터에서 실행됩니다. 초기 모델 다운로드 이후에는 텍스트 수집과 검색이 오프라인으로 동작합니다.

  • 하이브리드 검색: 의미적 검색이 관련 개념을 찾고, 키워드 매칭이 정확한 기술 용어를 강조합니다.

  • 구성 가능한 임베딩: 문서의 언어와 도메인에 맞는 Hugging Face 임베딩 모델을 선택할 수 있습니다.

  • 의미 기반 청킹: 문서가 고정된 문자 수가 아닌 주제 경계에서 분할됩니다. Markdown 코드 블록은 그대로 유지됩니다.

  • MCP 및 CLI: AI 코딩 도구나 터미널에서 직접 동일한 인덱스를 사용할 수 있습니다.

API 키, Docker, Python, 외부 데이터베이스가 필요 없습니다.

Related MCP server: rag-mcp

빠른 시작

요구 사항

  • Node.js 22 이상

  • npm 패키지와 임베딩 모델 다운로드를 위한 최초 사용 시 인터넷 연결

  • 검색하려는 문서가 들어 있는 디렉터리

BASE_DIR을 해당 디렉터리로 설정하세요. 이 디렉터리는 파일 작업의 보안 경계이기도 합니다. 아래의 /absolute/path/to/your/documents를 디렉터리의 절대 경로로 바꾸세요.

mcp-local-rag는 로컬 stdio 서버를 통해 표준 MCP 프로토콜을 사용하므로, 로컬 MCP 서버를 지원하는 AI 코딩 도구 및 기타 MCP 호스트에서 작동합니다.

아래 예시 중 하나를 사용하거나, npx -y mcp-local-rag를 등록하고 클라이언트의 MCP 구성 형식에 맞춰 BASE_DIR을 설정하세요.

Claude Code의 경우: 다음 명령을 실행하세요:

claude mcp add local-rag --scope user --env BASE_DIR=/absolute/path/to/your/documents -- npx -y mcp-local-rag

Codex의 경우: ~/.codex/config.toml에 추가하세요:

[mcp_servers.local-rag]
command = "npx"
args = ["-y", "mcp-local-rag"]

[mcp_servers.local-rag.env]
BASE_DIR = "/absolute/path/to/your/documents"

OpenCode의 경우: ~/.config/opencode/opencode.json(또는 opencode.jsonc)에 추가하세요:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "local-rag": {
      "type": "local",
      "command": ["npx", "-y", "mcp-local-rag"],
      "environment": {
        "BASE_DIR": "/absolute/path/to/your/documents"
      }
    }
  }
}

Cursor의 경우: ~/.cursor/mcp.json에 추가하세요:

{
  "mcpServers": {
    "local-rag": {
      "command": "npx",
      "args": ["-y", "mcp-local-rag"],
      "env": {
        "BASE_DIR": "/absolute/path/to/your/documents"
      }
    }
  }
}

클라이언트를 다시 시작한 다음, 인덱스 구축을 요청하세요:

Sync all documents in the configured root and wait until it finishes.

첫 번째 동기화는 기본 임베딩 모델(약 90MB)을 다운로드하며, 수집이 시작되기 전에 1~2분이 걸릴 수 있습니다. 이후 실행에서는 로컬 캐시를 사용합니다.

동기화가 완료되면:

What does the API documentation say about authentication?

CLI 빠른 시작

MCP 클라이언트 없이 CLI를 사용하려면:

npx mcp-local-rag ingest ./docs/
npx mcp-local-rag query "authentication API"

CLI는 기본적으로 현재 디렉터리를 문서 루트로 사용합니다. 두 명령을 같은 디렉터리에서 실행하여 동일한 기본 인덱스를 사용하거나, BASE_DIR과 DB_PATH를 명시적으로 설정하세요.

왜 이런 도구가 필요한가

일부 문서 세트는 기밀성이나 조직 정책 때문에 호스팅형 임베딩 서비스로 보낼 수 없습니다. 인덱스를 로컬에 유지하면 쿼리당 API 비용을 추가하지 않고도 검색이 가능해집니다.

의미적 검색만으로는 기술 문서에서 중요한 정확한 식별자를 놓칠 수 있습니다. 키워드 재순위화는 자연어 검색을 포기하지 않으면서도 이러한 용어를 계속 표시되게 합니다.

지원 콘텐츠

입력

수집 방법

PDF, DOCX, TXT, Markdown

파일 수집 또는 디렉터리 동기화

클라이언트가 이미 가져온 HTML

ingest_data; Readability로 정리 후 Markdown으로 변환

메모리에 있는 일반 텍스트 또는 Markdown

안정적인 소스 식별자를 사용한 ingest_data

HTML 가져오기는 서버에 내장되어 있지 않습니다. MCP 클라이언트가 페이지를 가져와 해당 HTML을 ingest_data에 전달할 수 있습니다.

Excel, PowerPoint, 단독 이미지, 소스 코드 파일 확장자는 파일 수집에서 지원되지 않습니다. PDF는 선택적으로 로컬 비전 모델을 사용하여 그림을 설명할 수 있지만, 이는 OCR이나 이미지 검색이 아닙니다.

MCP 도구

도구

용도

sync_start

구성된 모든 루트 또는 하나의 경로와 인덱스를 조정

sync_status

실행 중인 동기화 작업 폴링

ingest_file

파일 하나 수집 또는 교체

ingest_data

클라이언트가 이미 보유한 텍스트, Markdown 또는 HTML 수집

query_documents

의미 매칭과 키워드 부스트로 검색

read_chunk_neighbors

검색 결과에서 주변 청크 읽기

list_files

지원되는 파일과 수집 상태 표시

delete_file

인덱싱된 파일 또는 ingest_data 항목 삭제

status

인덱스 및 검색 상태 표시

문서 루트 동기화

sync_start는 새 파일과 변경된 파일을 수집하고, 바이트 단위로 동일한 파일은 건너뛰며, 더 이상 존재하지 않는 파일의 인덱스 항목을 제거합니다:

Sync everything under the configured document roots and wait for completion.

이 도구는 즉시 jobId를 반환합니다. 클라이언트는 sync_status를 폴링하여 상태가 succeeded 또는 failed가 될 때까지 기다려야 합니다. 동기화는 시각적 캡션을 생성하지 않습니다. MCP 서버 환경에서 STORE_IMAGES=true를 설정하면 동기화가 선택한 새 파일 또는 변경된 파일에 대해 지원되는 PDF 및 DOCX 이미지를 저장합니다. 변경되지 않은 파일은 계속 건너뜁니다.

서버 프로세스에는 하나의 동기화 작업만 유지됩니다. 새 작업이 완료된 레코드를 대체하며, 서버를 다시 시작하면 해당 레코드는 삭제됩니다.

파일 하나 수집

ingest_file은 PDF, DOCX, TXT, Markdown을 허용합니다. MCP 파일 경로는 절대 경로여야 하며 구성된 문서 루트 안에 있어야 합니다:

Ingest the document at /Users/me/docs/api-spec.pdf.

동일한 경로를 다시 수집하면 기존 청크가 대체됩니다.

검색 및 추가 컨텍스트 읽기

What does the API documentation say about authentication?
Find the documented behavior of ERR_CONNECTION_REFUSED.

결과에는 텍스트, 소스 경로, 제목, 청크 인덱스, 관련성 점수, 해당 청크에 저장된 이미지가 포함됩니다. MCP는 각 이미지를 결과 식별자와 쌍을 이루는 이미지 콘텐츠 블록으로 반환합니다. CLI query는 모든 결과에 { imageIndex, mimeType, data } 형식의 images 배열을 포함합니다. 답변에 더 많은 컨텍스트가 필요할 때 결과의 chunkIndex와 filePath 또는 source를 read_chunk_neighbors에 전달하세요:

Read the surrounding chunks for that authentication result.

query_documents와 list_files 모두 선택적 절대 scope 경로 접두사 또는 접두사 목록을 허용합니다. 접두사는 정확한 경로와 그 하위 항목을 매칭합니다.

HTML 수집

MCP 클라이언트가 페이지를 가져온 후 ingest_data를 사용하세요:

Fetch https://example.com/docs and ingest the HTML.

서버는 본문 기사를 추출하여 Markdown으로 변환하고, 제공된 소스 식별자 아래에 저장합니다. 동일한 소스를 재사용하면 기존 콘텐츠가 업데이트됩니다.

외부 콘텐츠를 인덱싱할 때는 소스 사이트의 이용 약관과 저작권을 존중하세요.

PDF 시각적 캡션 및 저장된 이미지

시각 모드는 그림이 많은 PDF 페이지에 생성된 캡션을 추가합니다. 이는 선택 기능이며 일반 수집 중에는 비전 모델을 로드하지 않습니다.

Ingest /Users/me/docs/research-paper.pdf with visual: true.
npx mcp-local-rag ingest ./docs/research-paper.pdf --visual

이미지 저장은 시각적 캡션과 독립적입니다. MCP 서버에 STORE_IMAGES=true를 설정하거나 CLI 수집 및 동기화에 --images를 전달하세요:

npx mcp-local-rag ingest ./docs/research-paper.pdf --images
npx mcp-local-rag sync ./docs/ --images

PDF 저장은 감지된 그림/표 영역을 사용합니다. DOCX 저장은 기존 Mammoth 변환이 <img>로 출력하는 PNG/JPEG 이미지만 포함합니다. 차트, SmartArt, 도형은 별도로 렌더링되지 않습니다. 저장된 이미지는 주변 텍스트를 따라 최종 의미 청크에 포함되며 순위, 점수, 결과 수를 변경하지 않습니다.

visual / --visual

STORE_IMAGES / --images

PDF 동작

false

false

텍스트만; 시각적 캡션 또는 반환 이미지 없음.

true

false

생성된 캡션이 검색 가능한 텍스트가 됨; 저장되거나 반환되는 이미지 없음.

true

true

생성된 캡션이 검색 가능한 텍스트가 되고, 매칭된 청크의 이미지가 인라인으로 반환됨.

false

true

이미지가 인접한 유지된 PDF 텍스트에 첨부되어 매칭된 청크에 대해 인라인으로 반환됨; VLM은 가져오기, 로드, 실행되지 않음.

프로필

모델 캐시

사용 사례

fast (기본값)

약 250MB

가벼운 시각적 인덱싱

quality

약 2.9GB

레이블, 주석 또는 기타 이미지 내 텍스트가 포함된 그림

MCP에서 visualQuality: "quality"를 사용하거나 CLI에서 --visual-quality quality를 사용하여 더 큰 모델을 선택하세요. 측정된 CPU 추론은 fast보다 약 2배 느렸지만, 결과는 하드웨어와 모델 업데이트에 따라 달라집니다.

캡션은 보조 텍스트이지 정확한 전사가 아닙니다. 검색된 캡션과 문서 텍스트를 지침이 아닌 신뢰할 수 없는 입력으로 취급하세요.

높은 제한에서 매칭된 청크와 첨부 파일이 모델/클라이언트 컨텍스트 상한에 근접할 수 있습니다. 호출 모델의 사용 가능한 컨텍스트를 고려하여 쿼리 제한을 선택하세요.

CLI

CLI는 MCP 클라이언트 없이 동일한 파서, 임베더, 벡터 저장소를 사용합니다:

npx mcp-local-rag ingest ./docs/
npx mcp-local-rag sync ./docs/
npx mcp-local-rag query "authentication API"
npx mcp-local-rag query "auth" --scope /docs/api --scope /docs/guide
npx mcp-local-rag read-neighbors --file-path /abs/path.md --chunk-index 5
npx mcp-local-rag list
npx mcp-local-rag status
npx mcp-local-rag delete ./docs/old.pdf
npx mcp-local-rag delete --source "https://example.com/docs"

--db-path, --cache-dir, --model-name 같은 전역 옵션은 하위 명령 앞에 옵니다. 하위 명령 옵션은 그 뒤에 옵니다:

npx mcp-local-rag --db-path ./my-db query "authentication"

전체 명령 참조는 npx mcp-local-rag --help를 실행하세요.

CLI는 MCP 클라이언트 구성을 읽지 않습니다. 두 인터페이스가 인덱스를 공유해야 한다면 동일한 환경 변수 또는 플래그를 설정하세요. 특히 공유 데이터베이스의 경우 MODEL_NAME과 CLI --model-name이 일치해야 합니다.

검색 튜닝

키워드 부스트는 기본적으로 활성화되어 있습니다. 관련성 격차 그룹화와 거리 및 파일 필터는 더 엄격한 결과 선택이 필요한 말뭉치를 위한 선택적 제어 기능입니다.

변수

기본값

설명

RAG_HYBRID_WEIGHT

0.6

키워드 부스트 계수(0.0–1.0). 0은 키워드 재순위화를 비활성화하고, 1은 최대 부스트를 적용합니다.

RAG_GROUPING

(설정 안 됨)

similar는 첫 번째 관련성 그룹을 유지하고, related는 유의미한 벡터 거리 격차를 경계로 최대 두 그룹을 유지합니다.

RAG_MAX_DISTANCE

(설정 안 됨)

낮은 관련성 결과 필터링(예: 0.5).

RAG_MAX_FILES

(설정 안 됨)

결과를 상위 N개 파일로 제한(예: 단일 최적 파일의 경우 1).

많은 식별자가 포함된 API 사양 및 기타 문서의 경우, 더 강한 키워드 가중치가 정확한 용어 순위를 개선할 수 있습니다:

"env": {
  "RAG_HYBRID_WEIGHT": "0.7"
}
  • 0.7: 기본값보다 약간 더 강한 정확 용어 재순위화

  • 1.0: 최대 키워드 가중치

작동 방식

수집(ingestion) 중:

  1. 파서가 입력 형식에서 텍스트를 추출합니다.

  2. 의미론적 청커(semantic chunker)가 주제 경계를 찾고 Markdown 코드 블록을 보존합니다.

  3. Transformers.js가 로컬에서 임베딩을 생성합니다.

  4. LanceDB가 청크, 메타데이터, 벡터, 전체 텍스트 인덱스를 저장합니다.

검색 중:

  1. 쿼리가 동일한 모델로 임베딩됩니다.

  2. 벡터 검색이 의미론적으로 관련된 청크를 검색합니다.

  3. 구성된 경우 선택적 거리 및 관련성 그룹 필터가 후보를 좁힙니다.

  4. 전체 텍스트 일치가 정확한 쿼리 용어를 강화합니다.

에이전트 스킬

Agent Skills는 AI 어시스턴트에게 쿼리 및 수집 지침을 제공합니다:

npx mcp-local-rag skills install --claude-code
npx mcp-local-rag skills install --claude-code --global
npx mcp-local-rag skills install --codex

설치된 스킬은 쿼리 구성, 결과 정제, HTML 수집을 다룹니다. 자동으로 활성화되지 않으면 어시스턴트에게 mcp-local-rag 스킬을 명시적으로 사용하도록 요청하세요.

구성

MCP 서버는 환경 변수를 읽습니다. CLI는 나열된 전역 환경 변수와 플래그를 허용합니다. CLI 수집 및 동기화 시 이미지 저장은 --images로만 활성화됩니다.

환경 변수

CLI 플래그

기본값

설명

BASE_DIR

--base-dir

현재 디렉터리

문서 루트 하나; CLI 플래그는 ingest, list, sync에서 반복 가능

BASE_DIRS

해당 없음

(설정 안 됨)

문서 루트의 JSON 배열; BASE_DIR보다 우선함

DB_PATH

--db-path

./lancedb/

벡터 데이터베이스 위치

CACHE_DIR

--cache-dir

./models/

모델 캐시 디렉터리

MODEL_NAME

--model-name

Xenova/all-MiniLM-L6-v2

Hugging Face 임베딩 모델

MAX_FILE_SIZE

--max-file-size

104857600 (100MB)

최대 파일 크기(바이트)

CHUNK_MIN_LENGTH

--chunk-min-length

50

최소 청크 길이(문자, 1–10000)

STORE_IMAGES

해당 없음

false

MCP 서버 전용: 지원되는 PDF/DOCX 이미지를 저장하고 일치하는 청크와 함께 반환합니다. CLI는 --images를 사용합니다.

RAG_DEVICE

해당 없음

cpu

ONNX Runtime 실행 장치

RAG_DTYPE

해당 없음

fp32

선택한 모델에 전달되는 임베딩 데이터 타입

문서 루트 (BASE_DIR 및 BASE_DIRS)

mcp-local-rag는 구성된 루트 내에서만 파일 작업을 허용합니다. 여러 루트의 경우 BASE_DIRS는 비어 있지 않은 경로의 JSON 배열이어야 합니다:

export BASE_DIRS='["/Users/me/Documents/work","/Users/me/Projects/specs"]'

루트 구성은 다음 순서로 해석됩니다:

  1. CLI --base-dir <path> 플래그 (ingest, list, sync에서 반복 가능)

  2. BASE_DIRS

  3. BASE_DIR

  4. 현재 디렉터리

각 소스는 병합하는 대신 우선순위가 낮은 소스를 대체합니다. 잘못된 BASE_DIRS 구성은 BASE_DIR 또는 현재 디렉터리로 대체되지 않고 실패합니다. status는 MCP에서 계속 사용할 수 있으므로 클라이언트가 구성 오류를 보고할 수 있습니다.

npx mcp-local-rag ingest --base-dir /Users/me/work --base-dir /Users/me/specs /Users/me/work/readme.md
npx mcp-local-rag list --base-dir /Users/me/work --base-dir /Users/me/specs
npx mcp-local-rag sync --base-dir /Users/me/work --base-dir /Users/me/specs
BASE_DIRS='["/Users/me/work","/Users/me/specs"]' npx mcp-local-rag list

저장소 및 모델

DB_PATH와 CACHE_DIR는 기본적으로 프로세스 작업 디렉터리를 기준으로 합니다. MCP 클라이언트가 다른 프로젝트 디렉터리에서 서버를 시작할 수 있는 경우 절대 경로를 설정하세요.

문서의 언어와 도메인에 맞는 Hugging Face 임베딩 모델을 선택하려면 MODEL_NAME을 설정하거나 --model-name을 전달하세요.

mcp-local-rag는 평균 풀링(mean pooling)과 L2 정규화로 임베딩을 생성합니다. 모델을 선택할 때 풀링 방식이 검색 품질에 영향을 줄 수 있으므로 이러한 설정이 권장 추론 설정과 일치하는지 확인하세요.

MODEL_NAME, RAG_DEVICE 또는 RAG_DTYPE을 변경하면 기존 벡터가 호환되지 않을 수 있습니다. 임베딩 구성을 변경한 후 새 DB_PATH를 사용하거나 기존 인덱스를 삭제하고 다시 수집하세요.

영어 문서용 모델 예시는 Xenova/bge-small-en-v1.5입니다.

보안 및 운영

  • 파일 접근은 BASE_DIR, BASE_DIRS 또는 CLI --base-dir 루트로 제한됩니다.

  • 구성된 모든 루트 외부로 확인되는 심볼릭 링크는 거부됩니다.

  • 문서 처리 및 검색은 필수 모델이 캐시된 후에는 네트워크 요청을 하지 않습니다.

  • 서버는 단일 로컬 사용자를 위해 설계되었으며 인증이나 접근 제어를 제공하지 않습니다.

  • 동일한 DB_PATH에 대해 여러 CLI 또는 MCP 작성자를 실행하지 마세요. 동기화가 활성화된 동안 읽기 전용 쿼리는 실행할 수 있습니다.

  • 작성자가 활성화되지 않은 동안 DB_PATH 디렉터리를 복사하여 인덱스를 백업하세요.

"결과 없음"

문서를 먼저 수집해야 합니다. "List all ingested files"를 실행하여 확인하세요.

모델 다운로드 실패

인터넷 연결을 확인하세요. 프록시 뒤에 있는 경우 네트워크 설정을 구성하세요. 모델은 수동으로 다운로드할 수도 있습니다.

"파일이 너무 큼"

기본 제한은 100MB입니다. 큰 파일을 분할하거나 MAX_FILE_SIZE를 늘리세요.

쿼리 속도 저하

status로 청크 수를 확인하세요. 청크가 많은 대용량 문서는 쿼리를 느리게 할 수 있습니다. 매우 큰 파일은 분할하는 것을 고려하세요.

"BASE_DIR 외부 경로"

파일 경로가 구성된 루트(BASE_DIR, BASE_DIRS 항목 또는 CLI --base-dir) 중 하나 내에 있는지 확인하세요. 절대 경로를 사용하세요.

"BASE_DIRS는 JSON 배열이어야 합니다..."

BASE_DIRS는 하나 이상의 비어 있지 않은 경로 문자열의 JSON 배열을 허용합니다:

  • 유효: BASE_DIRS='["/Users/me/work","/Users/me/specs"]'

  • 무효: BASE_DIRS=/a:/b (구분자 구문은 지원되지 않음)

  • 무효: BASE_DIRS='[]' (빈 배열)

MCP 클라이언트가 도구를 인식하지 못함

  1. 구성 파일 구문 확인

  2. 클라이언트를 완전히 다시 시작 (Mac의 Cursor는 Cmd+Q)

  3. 직접 테스트: npx mcp-local-rag가 오류 없이 실행되어야 함

기여

기여를 환영합니다! 설정 및 지침은 CONTRIBUTING.md를 참조하세요.

라이선스

MIT 라이선스. 개인 및 상업적 사용에 무료입니다.

블로그 게시물

감사의 말

Anthropic의 Model Context Protocol, LanceDB, Transformers.js로 구축되었습니다.

Available Tools

9 tools
delete_fileA

Delete a previously ingested file or data from the vector database. Use filePath for files ingested via ingest_file, or source for data ingested via ingest_data. Either filePath or source must be provided. Returns deleted (operation succeeded), removedChunks, and existed (whether anything was actually present).

NameRequiredDescriptionDefault
sourceNoSource identifier used in ingest_data. Examples: "https://example.com/page", "clipboard://2024-12-30"
filePathNoAbsolute path to the file (for ingest_file). Example: "/Users/user/documents/manual.pdf"

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses return values (deleted, removedChunks, existed) and the conditional requirement, which goes beyond the schema. It does not explicitly state irreversibility, but the term 'delete' implies it, and chunk removal is mentioned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, front-loaded with the action, and every sentence adds value. It is concise without sacrificing important details like return values and parameter selection.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the moderate complexity of the tool, the description covers the essential decision (filePath vs source), the required parameter constraint, and the return values. It lacks edge-case details like what happens if both parameters are provided, but this is minor given the overall clarity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds critical semantic context by mapping parameters to ingestion methods and clarifying the 'either/or' requirement. This goes beyond the schema's examples and helps the agent choose correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool deletes a previously ingested file or data from the vector database, using specific verbs and resource. It distinguishes itself from sibling tools like ingest_file and query_documents, as deletion is a unique operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly explains when to use each parameter: filePath for files ingested via ingest_file, source for data ingested via ingest_data. It also states that either must be provided, guiding the agent on parameter selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ingest_dataA

Ingest in-memory content as a string (use ingest_file for files on disk). The source identifier enables re-ingestion to update existing content. Returns { filePath, chunkCount, timestamp, fileTitle }.

NameRequiredDescriptionDefault
contentYesThe content to ingest (text, HTML, or Markdown)
metadataYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure. It reveals a key behavioral trait—re-ingestion with the same source identifier updates existing content—and specifies the return shape. While it does not mention auth, permissions, or side effects, it covers the main behavioral consequences for the typical use case.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences long and front-loaded with the tool's core purpose. It efficiently packs the alternative tool reference, the re-ingestion behavior, and the return value into a compact, well-structured format with zero filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 2 parameters (one nested), no annotations, and no output schema, the description provides a complete picture: what it does, when to use it, how the source identifier behaves, and what it returns. It lacks explicit error scenarios or prerequisites, but these are not critical for a simple ingestion tool. The return value statement covers the output side.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50% (content and format described in schema, metadata partially). The description adds significant value by explaining the 'source' identifier protocol with examples (e.g., 'clipboard://2024-12-30', 'chat://2024-12-30/project-discussion'), which is essential for correct invocation. This compensates well for the moderate schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Ingest' and clearly specifies the resource: 'in-memory content as a string'. It further distinguishes itself from a sibling tool by explicitly pointing to 'ingest_file' for disk files, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool (in-memory string content) and when not to (files on disk, via 'use ingest_file for files on disk'). This provides clear alternatives and context for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ingest_fileA

Ingest a document file (PDF, DOCX, TXT, MD) into the vector database. Path must be absolute; re-ingesting the same path replaces its existing data. Returns { filePath, chunkCount, timestamp, fileTitle }.

NameRequiredDescriptionDefault
visualNoRun VLM captioning on figure pages (PDF only; default false).
filePathYesAbsolute path to the file to ingest. Example: "/Users/user/documents/manual.pdf"
visualQualityNoVLM profile when visual is true (default "fast"). "quality" is more accurate on figures with in-image text but much heavier and slower. Ignored when visual is false.fast

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of disclosing behavior. It explicitly states that re-ingesting replaces existing data, revealing a destructive side effect, and also specifies the return object structure. It does not cover other potential behaviors like long-running VLM processing, but the key destructive behavior is disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero waste. First sentence front-loads action and resource, second sentence covers constraints and return value. Highly scannable and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and no annotations, the description covers essential operational context: supported file types, absolute path requirement, replacement behavior, and return format. It lacks explicit separation from sibling ingest tools (ingest_data, ingest_directory) but otherwise provides a complete picture for a single-file ingestion tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds value by listing allowed file extensions (PDF, DOCX, TXT, MD) for filePath, which the schema does not specify. It also clarifies replacement semantics tied to the file path. It does not add extra detail for visual or visualQuality beyond what the schema provides, so a slight uplift is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly specifies the verb 'Ingest' and resource 'document file (PDF, DOCX, TXT, MD) into the vector database'. It implicitly distinguishes itself from sibling tools like ingest_directory by focusing on a single document file with an absolute path, and from ingest_data by specifying file formats.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states clear context: use for ingesting a document file, path must be absolute, and re-ingesting the same path replaces existing data. It does not explicitly name alternatives or exclusions, but the singular 'file' and mention of supported extensions imply single-file use, differentiating from ingest_directory.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_filesA

List supported files (PDF, DOCX, TXT, MD) under the configured base directories and whether each is ingested. Returns { baseDirs, files, sources }; sources lists ingested items reported apart from the file scan, chiefly ingest_data content (web pages, clipboard, etc.).

NameRequiredDescriptionDefault
scopeNoOptional absolute path prefix(es) — one string or a list (unioned) — restricting the listing to files reachable at a path equal to or under a prefix within the base directories. "/docs/api" matches "/docs/api/x.md" but not "/docs/apiv2". Must be absolute (server OS style); a relative prefix matches nothing. A prefix outside every base directory yields an empty files list, so compare it against the baseDirs in the response before concluding no files exist. Scope filters files by their scan path; ingest_data sources, which have no base-directory path, are always listed.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the return structure ({ baseDirs, files, sources }), explains that sources lists non-file ingested items, and the scope parameter details behavior for relative/out-of-base prefixes. It does not explicitly state read-only intent or mention recursion depth/sorting, but for a list tool the essentials are covered. Edge cases for scope are thoroughly disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences: first states the core function and return object, second clarifies what 'sources' contains. No filler, front-loaded with the verb 'List'. The parameter schema is detailed but that is separate. The main description earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a list tool with no output schema, the description explains the return object and the meaning of sources. The scope parameter covers traversal/filtering behavior. It could additionally disclose recursion depth or permission requirements, but these are less critical for a read-only list operation. Overall, sufficiently complete for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single optional parameter 'scope', and its description is detailed (absolute path, prefix matching, union for arrays, behavior for relative/out-of-base). The tool description adds no extra parameter semantics beyond the schema. Per guidelines, high schema coverage yields a baseline of 3, which is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states what the tool does: 'List supported files (PDF, DOCX, TXT, MD) under the configured base directories and whether each is ingested.' This is a specific verb+resource combination with scope (supported extensions, base directories, ingestion status). It distinguishes from siblings: query_documents and status focus on querying, ingest_* on adding content, delete_file on removal. The tool is unambiguously the file-listing utility.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: use this when you need to see files and their ingestion status, and it notes that sources include non-file ingest_data content (web pages, clipboard). The scope parameter description adds clear guidance about absolute path prefixes and how to interpret empty results (compare against baseDirs). However, it does not explicitly contrast with alternative tools such as query_documents or status, nor state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_documentsA

Search ingested documents with hybrid keyword + semantic matching. Use the returned order as the ranking; score may disagree with it. Each has filePath, chunkIndex, text, fileTitle, score (lower is closer), and source (for ingest_data items). Optional sourceContext provides heading paths and original line or physical PDF page ranges; multiple heading paths mean the chunk crosses sections.

NameRequiredDescriptionDefault
limitNoMax results (default 10, range 1-100). Lower favors precision, higher recall.
queryYesSearch query. Preserve specific user terms (for keyword match); add context when the query is vague (for semantic match).
scopeNoOptional absolute path prefix(es) — one string or a list (unioned) — restricting results to a filePath equal to or under a prefix. "/docs/api" matches "/docs/api/auth.md" but not "/docs/apiv2". Must be absolute (server OS style); a relative prefix matches nothing — derive one from a filePath returned by an earlier query, or omit scope.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose non-obvious behavior: result ordering is authoritative over score, score is lower-is-closer, source is only populated for ingest_data items, and multiple heading paths signal a cross-section chunk. It omits any statement of read-only safety, rate limits, or empty-result behavior, keeping it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then dense but load-bearing detail about result fields and sourceContext semantics. Every sentence carries information, though the back half packs several distinct facts into long clauses that could be slightly tighter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates well by enumerating the return fields (filePath, chunkIndex, text, fileTitle, score, source) and explaining sourceContext. With no annotations, it should also cover the read-only nature and any scope-omission fallback, which it leaves implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents query, limit, and scope thoroughly (including the absolute-path prefix rule). The description's detail is almost entirely about returned fields, not input parameters, so it adds little beyond the schema; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Search ingested documents') and specifies the retrieval mechanism ('hybrid keyword + semantic matching'), so the agent knows exactly what capability this is. It does not name or contrast any sibling (e.g. read_chunk_neighbors or list_files), so it falls short of the sibling-differentiating 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides real guidance on interpreting output ('use the returned order as the ranking; score may disagree with it') and on query construction, which implies the tool's role. However, it never says when to prefer this over siblings like read_chunk_neighbors or list_files, and gives no exclusions or prerequisites, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_chunk_neighborsA

Read the chunks immediately before and after a query_documents result, in the same document, for more surrounding context. Pass chunkIndex from the result plus exactly one of filePath (ingest_file) or source (ingest_data). Returns the target chunk (isTarget: true) and its neighbors, ascending by chunkIndex; an out-of-range chunkIndex returns []. Optional sourceContext provides heading paths and original line or physical PDF page ranges; multiple heading paths mean the chunk crosses sections. Defaults: before=2, after=2 (max 50 each).

NameRequiredDescriptionDefault
afterNoNumber of chunks to retrieve after the target (0–50, default 2).
beforeNoNumber of chunks to retrieve before the target (0–50, default 2).
sourceNoSource identifier (for ingest_data documents). Provide exactly one of filePath or source. Examples: "https://example.com/page", "clipboard://2024-12-30".
filePathNoAbsolute path to the file (for ingest_file documents). Provide exactly one of filePath or source. Example: "/Users/user/documents/manual.pdf".
chunkIndexYesZero-based target chunk index (non-negative integer).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full behavioral burden and does so: it discloses the return shape (target chunk flagged isTarget: true plus neighbors, ascending by chunkIndex), the edge case (out-of-range chunkIndex returns []), and the defaults/limits (before=2, after=2, max 50 each). Optional sourceContext is explained, including that multiple heading paths signal a section-crossing chunk.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then how to call it, then return behavior, then the optional sourceContext detail, then defaults. Every sentence contributes, though it is a dense single block rather than cleanly separated clauses.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must explain returns, and it does (target + neighbors, ordering, empty result). Combined with the documented defaults, limits, and input constraints, an agent has everything needed to call this correctly against a 5-parameter schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is already 100%, so the baseline is 3. The description adds genuine meaning beyond the schema by stating that chunkIndex originates from a query_documents result and by restating the mutual-exclusion rule for filePath/source, plus the semantics of sourceContext's heading paths.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (read the chunks immediately before/after a query_documents result) and ties itself directly to the sibling query_documents, so an agent can distinguish it from a plain search. The scope constraint 'in the same document' further narrows what it returns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the triggering context clearly: use it after a query_documents result when you need more surrounding context, and it names the exact input to carry over (chunkIndex plus one of filePath/source). It gives no explicit 'when not to use it' or alternative (e.g., re-running query_documents with a wider window), so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

statusA

Get index status: { documentCount, chunkCount, memoryUsage (MB), uptime (s), ftsIndexEnabled, searchMode }.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the burden of behavioral disclosure. It communicates the output fields and implies a read-only operation via 'Get', but it does not explicitly state safety, side effects, or any operational conditions. The field list adds context, but some behavioral aspects remain implicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that immediately states the tool's purpose and then lists the output fields in a structured way. There is no redundancy or wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple status tool with no parameters and no output schema, the description adequately covers the return values and purpose. It does not mention potential delays or whether the status is a snapshot, but for its simplicity, the information provided is sufficient for basic invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters and an empty input schema, so parameter semantics are not needed. The description adds value by enumerating the output fields, which helps the agent understand what to expect, thus justifying a baseline score of 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (Get) and resource (index status), and the listed field names specify exactly what the tool returns. This distinguishes it from sibling tools like query_documents or sync_status, which have different purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus alternatives such as sync_status, which may also report on index state. There is no mention of exclusions or typical use cases, leaving the agent to infer when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sync_startA

Reconcile the index with the files on disk: ingest new and changed files, leave unchanged files alone, and remove index entries for files that are gone. Each changed PDF is re-ingested with the visual profile ("fast" or "quality") already recorded for it, so a PDF indexed with VLM captions keeps them; a PDF with no recorded profile stays text-only. There is no option to change a profile here — use the CLI (mcp-local-rag sync --visual) to set one, or ingest_file to replace the file, where a normal ingest clears the recorded profile. Stored images are unrelated: STORE_IMAGES applies to whatever this run re-ingests and never makes a file changed. Returns { jobId } without waiting for the run to finish; poll sync_status with that jobId for progress and the final outcome. Only one job is kept, and it is lost when the server process exits.

NameRequiredDescriptionDefault
pathNoOptional absolute path to a file or directory inside a configured base directory; list_files returns those directories as baseDirs. A file synchronizes only itself and a directory only its own subtree, leaving every path outside it untouched. Omit it to synchronize every configured base directory.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses side effects (index updates/removals), non-blocking execution, job retention, and process-exit loss. It also clarifies the behavior regarding visual profiles and STORE_IMAGES, ensuring the agent understands the tool's operational nuances.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is overly verbose and repetitive. Phrases like 'visual profile' and 'only one job is kept' are repeated, and the whole text could be condensed to a few sentences without losing meaning. The single-paragraph structure lacks scannable clarity, and the redundancy detracts from conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main operational aspects: return value, polling mechanism, job limitations, and process-exit behavior. It is slightly incomplete regarding error cases or permission requirements, but given the moderate complexity and the absence of an output schema, it provides sufficient context for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description for 'path' is already highly detailed, covering optionality, file/directory semantics, baseDirs, and omission behavior. The tool description repeats this verbatim without adding new semantic information, so the value beyond the schema is minimal, resulting in the baseline score of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Reconcile the index with the files on disk: ingest new and changed files, leave unchanged files alone, and remove index entries for files that are gone.' It also specifies the non-blocking return of a jobId, making the tool's primary function unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly mentions alternatives and complementary tools: 'use the CLI (mcp-local-rag sync --visual) to set one, or ingest_file to replace the file' and 'poll sync_status with that jobId'. Also clarifies scope behavior and omission of path to sync all base directories, providing clear guidance on when and how to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sync_statusA

Get the current or latest sync job record: { jobId, state ("running" | "succeeded" | "failed"), total (null until scanning has counted the files on disk), completed (upserted + skipped + empty; pruned is counted separately), summary { upserted, skipped, empty, pruned }, warnings, error (null unless the job failed) }. An unknown jobId means the job was replaced by a newer one or lost with a previous server process.

NameRequiredDescriptionDefault
jobIdYesIdentifier returned by sync_start.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It clearly states the return shape (jobId, state, total, completed, summary, warnings, error) and explains null/unknown meanings. It does not mention side effects, but 'Get' implies a read-only operation, and no side effects are likely. The level of detail is strong for a status tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than a typical one-liner, but it is dense and structured with the return object in braces, using spaces and parentheses for clarity. Every sentence adds value, though it could be slightly trimmed without loss. It is front-loaded with the core action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter status tool with no output schema, the description is remarkably complete. It details all possible state values, null semantics, and the meaning of an unknown jobId. There is no obvious missing behavior; the tool's functionality is fully described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers jobId with 'Identifier returned by sync_start.' The description adds meaning by explaining that an unknown jobId indicates replacement/loss, and by showing jobId in the return structure. This goes beyond the schema's basic parameter comment.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with 'Get the current or latest sync job record' — a specific verb and resource. It clearly distinguishes itself from siblings like sync_start (which creates a job) and status (which likely relates to something else) by focusing on sync job state retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the intended context: to poll or inspect a previously started sync job. It does not explicitly name alternatives, but the mention of 'unknown jobId means the job was replaced by a newer one or lost with a previous server process' gives practical guidance on interpreting results, which helps decide when this tool is useful.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev0.19.0
    • Changedquery_documents2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (default 10, range 1-20). Lower favors precision, higher recall."New value: +"Max results (default 10, range 1-100). Lower favors precision, higher recall."
      • changedInput schema / properties / limit / maximum
        Previous value: -20New value: +100
  2. 3 tool updatesv0.17.3
    • Changedlist_files1 field changed
      • changedInput schema / properties / scope / description
        Previous value: -"Optional absolute path prefix(es) — one string or a list (unioned) — restricting the listing to files reachable at a path equal to or under a prefix within the base directories. \"/docs/api\" matches \"/docs/api/x.md\" but not \"/docs/apiv2\". Must be absolute (server OS style); a relative prefix matches nothing. Scope filters files by their scan path; ingest_data sources, which have no base-directory path, are always listed."New value: +"Optional absolute path prefix(es) — one string or a list (unioned) — restricting the listing to files reachable at a path equal to or under a prefix within the base directories. \"/docs/api\" matches \"/docs/api/x.md\" but not \"/docs/apiv2\". Must be absolute (server OS style); a relative prefix matches nothing. A prefix outside every base directory yields an empty files list, so compare it against the baseDirs in the response before concluding no files exist. Scope filters files by their scan path; ingest_data sources, which have no base-directory path, are always listed."
    • Addedsync_start
    • Addedsync_status
  3. 1 tool updatev0.16.1
    • Changedlist_files1 field changed
      • addedInput schema / properties / scope
        Added value: +{
        +  "description": "Optional absolute path prefix(es) — one string or a list (unioned) — restricting the listing to files reachable at a path equal to or under a prefix within the base directories. \"/docs/api\" matches \"/docs/api/x.md\" but not \"/docs/apiv2\". Must be absolute (server OS style); a relative prefix matches nothing. Scope filters files by their scan path; ingest_data sources, which have no base-directory path, are always listed.",
        +  "oneOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  ]
        +}
  4. 4 tool updatesv0.15.3
    • Changedingest_data1 field changed
      • changedInput schema / properties / metadata / properties / format / description
        Previous value: -"Content format: \"text\", \"html\", or \"markdown\""New value: +"Content format: text (plain/copied text), html (fetched web pages), or markdown."
    • Changedingest_file2 fields changed
      • changedInput schema / properties / visual / description
        Previous value: -"If true and the file is a PDF, run VLM captioning on figure pages. No effect on non-PDF files."New value: +"Run VLM captioning on figure pages (PDF only; default false)."
      • changedInput schema / properties / visualQuality / description
        Previous value: -"VLM profile to use when visual is true. \"fast\" (default) is the lightweight SmolVLM-256M; \"quality\" is Qwen2.5-VL-3B-Instruct-ONNX with higher fidelity on figures with in-image text (~10x model-cache footprint, ~2x per-page inference). The server also accepts an empty string as a synonym for omitted (normalized to \"fast\"). Silently ignored when visual is false."New value: +"VLM profile when visual is true (default \"fast\"). \"quality\" is more accurate on figures with in-image text but much heavier and slower. Ignored when visual is false."
    • Changedquery_documents3 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of results to return (default: 10, range: 1-20). Recommended: 5 for precision, 10 for balance, 20 for broad exploration."New value: +"Max results (default 10, range 1-20). Lower favors precision, higher recall."
      • changedInput schema / properties / query / description
        Previous value: -"Search query. Include specific terms and add context if needed."New value: +"Search query. Preserve specific user terms (for keyword match); add context when the query is vague (for semantic match)."
      • addedInput schema / properties / scope
        Added value: +{
        +  "description": "Optional absolute path prefix(es) — one string or a list (unioned) — restricting results to a filePath equal to or under a prefix. \"/docs/api\" matches \"/docs/api/auth.md\" but not \"/docs/apiv2\". Must be absolute (server OS style); a relative prefix matches nothing — derive one from a filePath returned by an earlier query, or omit scope.",
        +  "oneOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  ]
        +}
    • Changedread_chunk_neighbors2 fields changed
      • changedInput schema / properties / filePath / description
        Previous value: -"Absolute path to the file (for documents ingested via ingest_file). Example: \"/Users/user/documents/manual.pdf\". Provide either filePath or source, not both."New value: +"Absolute path to the file (for ingest_file documents). Provide exactly one of filePath or source. Example: \"/Users/user/documents/manual.pdf\"."
      • changedInput schema / properties / source / description
        Previous value: -"Source identifier used in ingest_data (for data ingested via ingest_data). Examples: \"https://example.com/page\", \"clipboard://2024-12-30\". Provide either filePath or source, not both."New value: +"Source identifier (for ingest_data documents). Provide exactly one of filePath or source. Examples: \"https://example.com/page\", \"clipboard://2024-12-30\"."
  5. 1 tool updatev0.15.0
    • Changedquery_documents3 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of results to return (default: 10). Recommended: 5 for precision, 10 for balance, 20 for broad exploration."New value: +"Maximum number of results to return (default: 10, range: 1-20). Recommended: 5 for precision, 10 for balance, 20 for broad exploration."
      • addedInput schema / properties / limit / maximum
        Added value: +20
      • addedInput schema / properties / limit / minimum
        Added value: +1
  6. 1 tool updatev0.14.1
    • Changedingest_file1 field changed
      • addedInput schema / properties / visualQuality
        Added value: +{
        +  "default": "fast",
        +  "description": "VLM profile to use when visual is true. \"fast\" (default) is the lightweight SmolVLM-256M; \"quality\" is Qwen2.5-VL-3B-Instruct-ONNX with higher fidelity on figures with in-image text (~10x model-cache footprint, ~2x per-page inference). The server also accepts an empty string as a synonym for omitted (normalized to \"fast\"). Silently ignored when visual is false.",
        +  "enum": [
        +    "fast",
        +    "quality"
        +  ],
        +  "type": "string"
        +}

TDQS

A4.2/5.0

Scored across 9 tools

Disambiguation4/5

Most tools have clearly distinct purposes: ingest_file vs ingest_data split by source type, query_documents vs read_chunk_neighbors split by search vs context, and delete_file/list_files/sync_start are unique. The only mild overlap is status (index state) vs sync_status (sync job record), but descriptions disambiguate them well.

Naming Consistency4/5

Seven of nine tools follow a clean verb_noun pattern (query_documents, read_chunk_neighbors, delete_file, ingest_data, ingest_file, list_files, sync_start). The two noun-only names (status, sync_status) are minor deviations but still readable and consistent with each other.

Tool Count5/5

Nine tools is well-scoped for a local RAG server, with each tool earning its place across ingest, query, context, delete, list, sync, and status concerns. No redundant or filler tools.

Completeness4/5

The lifecycle is well covered: ingest (file/data), query, context retrieval, list, delete, sync, and status. The main gap is that changing a PDF's visual profile is only possible via the CLI, not through an MCP tool, though re-ingest provides a workaround.

Maintenance

ActivityActive
ResponsivenessUsually handled

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Local offline semantic search over documents (txt, md, pdf, docx, pptx, csv). Indexes folders into a LanceDB vector database with multilingual embeddings and supports hybrid vector + keyword search via Reciprocal Rank Fusion. No API keys, no cloud, no Docker required.
    4
    30
    AGPL 3.0
  • F
    license
    A
    quality
    D
    maintenance
    Enables indexing local documents (PDF, Markdown, text, code) into a knowledge base and querying them via semantic search using local embeddings, all running privately on your machine.
    4
    -