Nacre について
Nacreは、ユーザーが閲覧を許可された文書だけをエージェントが検索できる、組織向けのセルフホスト型ナレッジインデックスです。検索中に権限を適用し、MCPとRESTのインターフェースおよび文書アクセス監査記録を提供します。
主な機能
- 01ワークスペースとレイヤーの権限継承
- 02ベクトル検索中の権限フィルタリング
- 03密ベクトルとBM25のハイブリッド検索
- 04オプションのクロスエンコーダー再ランキング
- 05レイヤーごとの埋め込みエンドポイント設定
- 06文書アクセス監査ログ
活用シーン
- 01権限管理された社内情報をエージェントに提供
- 02セマンティック検索と併せて識別子を検索
- 03ユーザーが閲覧した文書を監査
- 04埋め込みモデル変更時にレイヤーを再インデックス
MCP 対応
Streamable HTTPとローカルSTDIOを通じて、ナレッジインデックスをMCPクライアントに公開します。エージェントはサービスアカウントキーで認証し、検索結果は権限チェックによって制限されます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y @nacre.work/mcpNACRE_SERVICE_KEYシークレットService-account key for STDIO mode. The server also needs the deployment's full environment (database and backend configuration) - see docs/mcp.md; the key alone is not enough to start it.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Nacre
あなたのインデックス。あなたのアクセスルール。あなたの境界。
エージェントには、許可された情報だけが正確に表示されます。
nacre.work · ドキュメント · クイックスタート · ディスカッション
Nacre は、きめ細かなアクセス制御を備えたセルフホスト可能なナレッジインデックスです。 エージェントは MCP 経由で、アプリケーションは REST API 経由でアクセスします。チャットインターフェースも、 企業向けアシスタントもありません。そこにあるのは、その基盤となるコンテキストレイヤーだけです。
なぜ
ベクトル検索は解決済みの問題です。まだ解決されていないのは、企業インデックスを検索するエージェントに、 リクエストしたユーザーが閲覧を許可されているドキュメントだけを正確に表示し、それを監査担当者に証明できるようにすることです。
- 権限は継承されます。 ワークスペースからレイヤーへ、
read/write/adminが上位から下位へ継承されます。writeにreadは含まれませんが、adminには両方が含まれます。 ドキュメント単位の権限付与と拒否ルールは商用機能です。このビルドでは対応していないことを明示し、 伝播できないルールを受け入れることはありません。 - フィルタリングはインデックス内で行われます。 アクセスフィルターはランキング後ではなく、
HNSW の走査中に適用されます。そのため、
top_kは除外された結果を差し引いた k 件ではなく、 許可された結果を k 件返します。 - MCP を主要なインターフェースとして提供します。 2026-07-28 仕様に準拠した Streamable HTTP と、 開発者向けエージェント用のローカル STDIO に対応しています。エージェントはサービスアカウントキーで認証します。 OAuth ディスカバリー(RFC 9728)を提供し、クライアント登録は当社ではなく認可サーバーの役割です。
- エージェントは識別子を検索するため、ハイブリッド検索を採用しています。 密ベクトルと BM25 を
Reciprocal Rank Fusion で統合し、デプロイ環境で設定されている場合はクロスエンコーダーで再ランキングします。
これを差別化要因として売り込むつもりはありません。正直に言うべきことは上記のとおりです。
ただし、
SQLSTATE 23505、請求書番号、変数名を検索するエージェントには文字列の完全一致が必要であり、 密ベクトルだけのインデックスでは確実に検索できません。 - モデルは自由に選べます。 OpenAI 互換エンドポイントを通じた埋め込みに対応し、レイヤーごとに設定できます。 既存レイヤーのモデルを変更する際は再インデックスが行われますが、その間も検索は継続して利用できます。 切り替え前には、用意したクエリセットに対する再現率の確認が必須です。
- コマンドラインクライアントを提供します。
npx @nacre.work/cliでサインインし、レイヤーを作成して、 ディレクトリを取り込んで検索できます。クイックスタートに記載されている 4 つのcurlコマンドを、 手順の確認よりも結果を優先したい場合に置き換えられます。インデックス作成に失敗したドキュメントがあると ゼロ以外の終了コードを返すため、夜間の取り込み処理が何もインデックス化していないのに成功を報告することはありません。 - ネットワーク内にとどまります。 Docker Compose を使用し、外部への通信は行いません。
クイックスタート
git clone https://github.com/nacre-work/nacre && cd nacre
cp .env.example .env
docker compose --profile minimal up -d
詳しい手順については、docs/quickstart.md をご覧ください。
Apple Silicon 搭載の Mac では、まず docs/apple-silicon.md をお読みください。イメージは arm64 で、 スタックはネイティブに動作しますが、埋め込み処理だけはホスト上で実行する必要があります。
ディレクトリ構成
packages/api REST API and authorization service
packages/mcp MCP server (Streamable HTTP + STDIO)
packages/worker indexing pipeline: parse, chunk, embed
packages/core data model, permission resolver, shared types
packages/sdk TypeScript SDK
packages/admin community admin UI
services/parser Python sidecar: bytes → {text, blocks, metadata}
docs/ specifications — normative, and ahead of the code
状態
まだ初期段階ですが、動作しています。ループは一連の流れを端から端まで実行でき、実際の PostgreSQL と Qdrant を使って手動で確認済みです。組織を作成し、レイヤーを作成し、誰かに read を許可し、ドキュメントを取り込み、ジョブを indexed になるまでポーリングし、検索してチャンクを取得します。付与されていないユーザーとして検索すると、ベクトルがインデックス内に残っていても何も返りません。REST と、Streamable HTTP および STDIO 経由の MCP の両方で動作します。許可を取り消すと、次のリクエストから検索結果にそのドキュメントが含まれなくなります。許可される集合は検索のたびに許可情報から計算されるため、インデックス内のキャッシュが古くなることはありません。
検索は組織ごとにレート制限され、変更を伴うメソッドでは Idempotency-Key が必須です。コレクションはカーソルでページネーションされ、デプロイ時にリランカーを設定している場合は、検索処理で再ランキングが実行されます。削除済みベクトルは回収され、SDK と管理 UI も実装されています。
サインインは動作します。メールアドレスとパスワードを使用し、更新トークンはローテーションされ、再利用されるとセッションが終了します。init は最初の管理者を作成し、生成したパスワードを一度だけ表示します。SSO は商用モジュールです。
アクセスログは参照可能です。GET /v1/audit で取得でき、新しい順に並び、カーソルでページネーションされ、JSON、JSONL、CSV 形式に対応しています。org_admin は、監査ログの目的である「どのドキュメントが読まれたか」を確認できます。一方、platform_admin は管理操作を確認できますが、ドキュメントの閲覧状況は確認できません。これはルール 2 をログに適用したものです。
レイヤーを別の埋め込みモデルに移行できます。Qdrant は既存のコレクションに名前付きベクトルを追加できないため、コレクションは変更ではなく置き換えられます。すべてのポイントを埋め込みの再計算なしでコピーし、ポインターを切り替えるステートメントを 1 つ実行してから、レイヤーを 1 つずつ再埋め込みします。検索は利用可能なまま維持され、常に 1 回のクエリで完了します。レイヤーを切り替える前に、参照クエリーセットを使って新しいモデルを評価します。再現率が低下する移行は、本番環境に反映されず停止します。このゲートは、セットを作成するまで無効です。セットには、あなたにしか選べないドキュメントが必要だからです。
ドキュメントは JSON だけでなくフォームとしてもアップロードでき、PDF、Office または OpenDocument ファイル(テキスト、プレゼンテーション、またはスプレッドシート)、EPUB、RTF はパーサーサイドカーによって抽出されます。形式を示す宣言とバイト列のシグネチャが一致する必要があります。宣言された形式とバイト列が食い違うのは不一致であり、シグネチャだけで判定すると宣言された形式が飾りになってしまうためです。それ以外のバイナリ形式は引き続き入口で拒否され、テキストレイヤーのないスキャン PDF は、何もないものとしてインデックス化するのではなく拒否されます。
トークンは共有シークレットの代わりに Ed25519 キーで署名できます。その場合、公開鍵は /.well-known/jwks.json で公開され、秘密鍵を保持するのはトークンを発行するプロセスだけです。
クリーンなクローンから docker compose --profile minimal up を実行済みで、全体のループもそれを通じて実行しています。
未実装の機能は商用ライセンスの対象であり、docs/licensing.md に記載されています。マルチテナンシー、SSO、ドキュメント単位の権限と拒否ルール、ID-JAG、SIEM エクスポート、グローバル管理者、クォータが含まれます。
docs/ は仕様書で、まだ一部はコードより先行しています。まずは、ほかのすべてが依存する docs/authz.md から確認してください。
不変条件
ルールは 6 つあります。いずれかに違反すると、バグではなくセキュリティインシデントになります。 詳細は docs/authz.md を参照してください。
- 組織はトークンからのみ取得し、それ以外から取得してはなりません。
- アクセスのフィルタリングは事前フィルターとし、事後フィルターにしてはなりません。
- 権限を評価できない場合は、アクセスを拒否します。
- 「権限がない」と「そのオブジェクトが存在しない」には、同一のレスポンスを返します。
- 削除済みのドキュメントは、ガベージコレクション前であっても返してはなりません。
writeはreadを意味しません。
ライセンス
すべて Apache 2.0 です。上記の内容はすべてこのリポジトリにあり、今後もこのリポジトリにとどまります。
テナント管理(一時停止、利用終了処理、クォータ)、SCIM グループ同期を伴う OIDC による SSO、ドキュメント単位の許可ルールと拒否ルールの発行、EMA、SIEM への転送、グローバル管理者、バックアップ、必須の第 2 要素認証、フィルタリング機能付きディレクトリ管理は商用モジュールです。これらは別のライセンスのもと、別の非公開リポジトリに置かれており、このリポジトリとともに配布されることはありません。両者の境界と、それを決める唯一の質問については、docs/licensing.md をご覧ください。
このビルドがそのいずれかに該当する場合は、その理由を明示して拒否します。deny ルールやドキュメントに限定した許可ルールに対しては、受け入れたうえで黙って適用しないのではなく、理由とともに 400 を返します。
Nacre の名称とマークは商標です。TRADEMARK.md をご覧ください。
このプロジェクトを支援する
ホステッド版のプランも、ユーザー数に応じた料金も、従量課金もないため、オープンソース部分は使われても収益を得ません。それが狙いですが、誰が費用を負担しているのかを伝える価値がある理由でもあります。費用を負担しているのは商用モジュールであり、それらを必要とする組織のためのものです。ノートパソコンでこれを実行する開発者が支援を求められることは決してありません。
これによって 1 週間分の作業が節約できたなら、このリポジトリの上部にある Sponsor ボタンから支援することもできます。このリポジトリの内容でその支援がないと利用できないものはなく、今後もありません。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。