Local RAG
MCP Local RAG
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は標準のMCPプロトコルをローカルstdioサーバー経由で使用するため、ローカル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-ragCodexの場合: ~/.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.最初の同期ではデフォルトの埋め込みモデル(約90 MB)をダウンロードし、取り込みが始まるまでに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 |
|
メモリ内のプレーンテキストまたはMarkdown | 安定したソース識別子を持つ |
HTMLの取得はサーバーに組み込まれていません。MCPクライアントがページを取得し、そのHTMLをingest_dataに渡すことができます。
Excel、PowerPoint、スタンドアロン画像、ソースコードのファイル拡張子は、ファイル取り込みではサポートされていません。PDFはオプションでローカルのビジョンモデルを使用して図を説明できますが、これはOCRや画像検索ではありません。
MCPツール
ツール | 目的 |
| 設定されたすべてのルートまたは1つのパスとインデックスを調整 |
| 実行中の同期ジョブをポーリング |
| 1つのファイルを取り込むか置き換える |
| クライアントがすでに保持しているテキスト、Markdown、またはHTMLを取り込む |
| セマンティックマッチングとキーワードブーストで検索 |
| 検索結果から周囲のチャンクを読み取る |
| サポートされているファイルとその取り込み状態を表示 |
| インデックス化されたファイルまたは |
| インデックスと検索の状態を表示 |
文書ルートの同期
sync_startは新規および変更されたファイルを取り込み、バイト単位で同一のファイルをスキップし、存在しなくなったファイルのインデックスエントリを削除します:
Sync everything under the configured document roots and wait for completion.このツールは即座にjobIdを返します。クライアントはsync_statusをポーリングして、状態がsucceededまたはfailedになるまで待機する必要があります。同期は視覚的なキャプションを生成しません。MCPサーバー環境でSTORE_IMAGES=trueを設定すると、同期によって選択された新規または変更されたファイルのサポートされているPDFおよびDOCX画像が保存されます。変更されていないファイルはスキップされたままです。
サーバープロセスによって保持される同期ジョブは1つだけです。新しいジョブは完了したレコードを置き換え、サーバーを再起動すると破棄されます。
1つのファイルの取り込み
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は各画像を、その結果IDとペアになった画像コンテンツブロックとして返します。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/ --imagesPDFの保存では、検出された図/表の領域を使用します。DOCXの保存には、既存のMammoth変換が<img>として出力するPNG/JPEG画像のみが含まれます。グラフ、SmartArt、シェイプは個別にレンダリングされません。保存された画像は周囲のテキストに従って最終的なセマンティックチャンクに入り、ランキング、スコア、結果数は変更されません。
|
| PDFの動作 |
false | false | テキストのみ。ビジュアルキャプションや返される画像はありません。 |
true | false | 生成されたキャプションが検索可能なテキストになります。画像は保存も返却もされません。 |
true | true | 生成されたキャプションが検索可能なテキストになり、マッチしたチャンクの画像がインラインで返されます。 |
false | true | 画像は近くの保持されたPDFテキストに添付され、マッチしたチャンクに対してインラインで返されます。VLMはインポート、ロード、実行されません。 |
プロファイル | モデルキャッシュ | ユースケース |
| 約250 MB | 軽量なビジュアルインデックス作成 |
| 約2.9 GB | ラベル、注釈、その他の画像内テキストを含む図 |
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が一致している必要があります。
検索チューニング
キーワードブーストはデフォルトで有効です。関連性ギャップのグループ化、距離フィルター、ファイルフィルターは、より厳密な結果選択が必要なコーパス向けのオプションコントロールです。
変数 | デフォルト | 説明 |
|
| キーワードブースト係数(0.0〜1.0)。0はキーワード再ランキングを無効にし、1は最大ブーストを適用します。 |
| (未設定) |
|
| (未設定) | 低関連性の結果をフィルタリングします(例: |
| (未設定) | 結果を上位Nファイルに制限します(例: 単一の最良ファイルには |
多くの識別子を含むAPI仕様やその他の文書では、より強いキーワード重みが正確な用語のランキングを改善できます:
"env": {
"RAG_HYBRID_WEIGHT": "0.7"
}0.7: デフォルトよりわずかに強い完全一致リランキング1.0: 最大のキーワードブースト
動作の仕組み
取り込み時:
パーサーが入力形式のテキストを抽出します。
セマンティックチャンカーがトピックの境界を見つけ、Markdown コードブロックを保持します。
Transformers.js がローカルで埋め込みを生成します。
LanceDB がチャンク、メタデータ、ベクトル、全文インデックスを保存します。
検索時:
クエリは同じモデルで埋め込みされます。
ベクトル検索が意味的に関連するチャンクを取得します。
設定されている場合、オプションの距離フィルターと関連グループフィルターが候補を絞り込みます。
全文一致が完全一致のクエリ用語を強調します。
Agent Skills
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 フラグ | デフォルト | 説明 |
|
| 現在のディレクトリ | 1 つのドキュメントルート。CLI フラグは |
| N/A | (未設定) | ドキュメントルートの JSON 配列。 |
|
|
| ベクトルデータベースの場所 |
|
|
| モデルキャッシュディレクトリ |
|
|
| Hugging Face 埋め込みモデル |
|
|
| 最大ファイルサイズ(バイト単位) |
|
|
| 最小チャンク長(文字数、1〜10000) |
| N/A |
| MCP サーバーのみ: サポートされている PDF/DOCX 画像を保存し、一致したチャンクとともに返します。CLI は |
| N/A |
| ONNX Runtime 実行デバイス |
| N/A |
| 選択したモデルに渡される埋め込み dtype |
ドキュメントルート (BASE_DIR と BASE_DIRS)
mcp-local-rag は、設定されたルート内でのみファイル操作を許可します。複数のルートの場合、BASE_DIRS は空でないパスの JSON 配列である必要があります:
export BASE_DIRS='["/Users/me/Documents/work","/Users/me/Projects/specs"]'ルート設定は次の順序で解決されます:
CLI
--base-dir <path>フラグ (ingest、list、syncで繰り返し指定可能)BASE_DIRSBASE_DIR現在のディレクトリ
各ソースは、マージするのではなく、優先度の低いソースを置き換えます。無効な 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 クライアントが異なるプロジェクトディレクトリからサーバーを起動する可能性がある場合は、絶対パスを設定してください。
MODEL_NAME を設定するか、--model-name を渡して、ドキュメントの言語とドメインに合った Hugging Face 埋め込みモデルを選択します。
mcp-local-rag は、平均プーリングと L2 正規化で埋め込みを生成します。モデルを選択するときは、プーリング方法が検索品質に影響を与える可能性があるため、これらの設定が推奨される推論設定と一致するかどうかを確認してください。
MODEL_NAME、RAG_DEVICE、または RAG_DTYPE を変更すると、既存のベクトルと互換性がなくなる可能性があります。埋め込み設定を変更した後は、新しい DB_PATH を使用するか、既存のインデックスを削除して再取り込みしてください。
英語ドキュメントのモデル例は Xenova/bge-small-en-v1.5 です。
セキュリティと運用
ファイルアクセスは
BASE_DIR、BASE_DIRS、または CLI--base-dirルートに制限されます。設定されたすべてのルートの外側に解決されるシンボリックリンクは拒否されます。
ドキュメント処理と検索は、必要なモデルがキャッシュされた後はネットワークリクエストを行いません。
サーバーは 1 人のローカルユーザー向けに設計されており、認証やアクセス制御は提供しません。
同じ
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 は、1 つ以上の空でないパス文字列の JSON 配列を受け入れます:
有効:
BASE_DIRS='["/Users/me/work","/Users/me/specs"]'無効:
BASE_DIRS=/a:/b(区切り文字構文はサポートされていません)無効:
BASE_DIRS='[]'(空の配列)
MCP クライアントがツールを認識しない
設定ファイルの構文を確認します
クライアントを完全に再起動します (Mac の Cursor では Cmd+Q)
直接テストします:
npx mcp-local-ragがエラーなく実行されるはずです
貢献
貢献を歓迎します! セットアップとガイドラインについては CONTRIBUTING.md を参照してください。
ライセンス
MIT ライセンス。個人利用および商用利用は無料です。
ブログ記事
エージェンティックコーディングのためのローカル RAG の構築: セマンティックチャンキングとハイブリッド検索設計の技術的な詳細。
謝辞
Anthropic の Model Context Protocol、LanceDB、Transformers.js を使用して構築されています。
Available Tools
9 toolsdelete_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).
| Name | Required | Description | Default |
|---|---|---|---|
| source | No | Source identifier used in ingest_data. Examples: "https://example.com/page", "clipboard://2024-12-30" | |
| filePath | No | Absolute path to the file (for ingest_file). Example: "/Users/user/documents/manual.pdf" |
TDQS
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.
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.
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.
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.
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.
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 }.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | The content to ingest (text, HTML, or Markdown) | |
| metadata | Yes |
TDQS
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.
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.
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.
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.
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.
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 }.
| Name | Required | Description | Default |
|---|---|---|---|
| visual | No | Run VLM captioning on figure pages (PDF only; default false). | |
| filePath | Yes | Absolute path to the file to ingest. Example: "/Users/user/documents/manual.pdf" | |
| visualQuality | No | 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. | fast |
TDQS
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.
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.
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.
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.
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.
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.).
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | 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. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 10, range 1-100). Lower favors precision, higher recall. | |
| query | Yes | Search query. Preserve specific user terms (for keyword match); add context when the query is vague (for semantic match). | |
| scope | No | 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. |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Number of chunks to retrieve after the target (0–50, default 2). | |
| before | No | Number of chunks to retrieve before the target (0–50, default 2). | |
| source | No | Source identifier (for ingest_data documents). Provide exactly one of filePath or source. Examples: "https://example.com/page", "clipboard://2024-12-30". | |
| filePath | No | Absolute path to the file (for ingest_file documents). Provide exactly one of filePath or source. Example: "/Users/user/documents/manual.pdf". | |
| chunkIndex | Yes | Zero-based target chunk index (non-negative integer). |
TDQS
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.
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.
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.
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.
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.
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 }.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Optional 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | Identifier returned by sync_start. |
TDQS
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.
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.
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.
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.
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.
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 tool update
v0.19.0- Changed
query_documents2 fields changed- changed
Input schema / properties / limit / descriptionPrevious 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." - changed
Input schema / properties / limit / maximumPrevious value: -20New value: +100
3 tool updates
v0.17.3- Changed
list_files1 field changed- changed
Input schema / properties / scope / descriptionPrevious 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."
- Added
sync_start - Added
sync_status
1 tool update
v0.16.1- Changed
list_files1 field changed- added
Input schema / properties / scopeAdded 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 tool updates
v0.15.3- Changed
ingest_data1 field changed- changed
Input schema / properties / metadata / properties / format / descriptionPrevious value: -"Content format: \"text\", \"html\", or \"markdown\""New value: +"Content format: text (plain/copied text), html (fetched web pages), or markdown."
- Changed
ingest_file2 fields changed- changed
Input schema / properties / visual / descriptionPrevious 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)." - changed
Input schema / properties / visualQuality / descriptionPrevious 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."
- Changed
query_documents3 fields changed- changed
Input schema / properties / limit / descriptionPrevious 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." - changed
Input schema / properties / query / descriptionPrevious 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)." - added
Input schema / properties / scopeAdded 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" + } + ] +}
- Changed
read_chunk_neighbors2 fields changed- changed
Input schema / properties / filePath / descriptionPrevious 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\"." - changed
Input schema / properties / source / descriptionPrevious 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\"."
1 tool update
v0.15.0- Changed
query_documents3 fields changed- changed
Input schema / properties / limit / descriptionPrevious 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." - added
Input schema / properties / limit / maximumAdded value: +20 - added
Input schema / properties / limit / minimumAdded value: +1
1 tool update
v0.14.1- Changed
ingest_file1 field changed- added
Input schema / properties / visualQualityAdded 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
Scored across 9 tools
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.
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.
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.
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
Related MCP Connectors
Read and search folders on your own computer with explicit consent. Files are never uploaded.
Convert PDFs, Office docs, websites and audio into AI-ready Markdown, then search and ask your docs.
Self-hosted AI workspace: semantic RAG document search, long-term memory, and AI chat via MCP.
Ingest, manage, and retrieve documents for RAG-powered AI applications
Related MCP Servers
- AlicenseAqualityCmaintenanceLocal 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.430AGPL 3.0
- FlicenseAqualityDmaintenanceEnables 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-
- AlicenseNot gradedqualityAmaintenanceSemantic search and retrieval system for local documents using vector embeddings, enabling AI-powered search across your document collections with support for multiple embedding providers.9MIT
- FlicenseNot gradedqualityDmaintenanceEnables semantic search over personal files using natural language, with optional AI summarization, all running locally.-