
Nacre
work.nacre由 nacre.work 发布v0.41.0更新于 Nov 1, 2026
Self-hosted permission-aware context layer. Search returns only what the caller may read.
概览
自托管的权限感知知识索引,让助手只检索到请求者有权阅读的文档。
- 可以做什么
- 在自托管知识索引中做混合检索(稠密向量加 BM25),只返回有权限的片段
- 把文档导入到层中,支持 PDF、Office/OpenDocument、EPUB 和 RTF 经解析侧车提取
- 在继承的工作区与层权限(read、write、admin)下工作,权限过滤在索引内部预先执行
- 以 JSON、JSONL 或 CSV 读取记录了哪些文档被读取的审计日志
- 把某个层迁移到其他嵌入模型,切换前先做召回率校验
- 适用场景
- 适合团队自建文档索引、又需要智能体遵守按用户的访问规则,并且结果能向审计人员证明的场景。面向开发者智能体和内部应用,而非通用聊天助手。
- 运行要求
- 以 npm 包形式作为本地 STDIO 进程运行,也提供 Streamable HTTP。需要 NACRE_SERVICE_KEY 中的服务账号密钥,以及部署的完整环境(数据库与后端配置);仅有密钥不足以启动。还需自托管部署(Docker Compose、PostgreSQL、Qdrant)和兼容 OpenAI 的嵌入端点。
安装
在 SourceWeft 中
- 打开 控制台中的 Nacre,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
Nacre
Your index. Your access rules. Your perimeter.
Agents see exactly what they're allowed to see.
nacre.work · Docs · Quickstart · Discussions
Nacre is a self-hosted knowledge index with fine-grained access control. Agents reach it over MCP, applications over a REST API. No chat interface, no company assistant — just the context layer underneath them.
Why
Vector search is a solved problem. What isn't solved: making sure an agent querying a company index sees exactly the documents the requesting user is cleared for — and being able to prove it to an auditor.
- Permissions that inherit. Workspaces → layers, with
read/write/admininherited top-down.writedoes not implyread;adminimplies both. Document-level grants and deny rules are commercial — this build refuses them and says so, rather than accepting a rule it cannot propagate. - Filtering happens inside the index. Access filters are applied during
HNSW traversal, not after ranking, so
top_kreturns k permitted results rather than k minus whatever got stripped out. - MCP as a first-class surface. Streamable HTTP per the 2026-07-28 spec, and local STDIO for developer agents. Agents authenticate with a service account key; OAuth discovery is served (RFC 9728), and client registration is the authorization server's business rather than ours.
- Hybrid retrieval, because agents ask for identifiers. Dense vectors and
BM25 fused with reciprocal rank fusion, plus a cross-encoder rerank where a
deployment configures one. Not offered as a differentiator — the line above
is the honest one — but an agent searching for
SQLSTATE 23505, an invoice number or a variable name needs the literal match, and a dense-only index does not reliably return it. - Bring your own models. Embeddings through any OpenAI-compatible endpoint, bound per layer. Changing the model on an existing layer is a reindex that keeps search answering throughout, and it is gated on recall against a query set you supply before it switches over.
- A command line client.
npx @nacre.work/clisigns in, creates a layer, walks a directory into it and searches — the fourcurlinvocations the quickstart spells out, for when you want the result rather than the contract. A document that fails to index is a non-zero exit, so a nightly ingest cannot report success having indexed nothing. - Stays inside your network. Docker Compose, no phone-home.
Quickstart
Full walkthrough: docs/quickstart.md.
On an Apple Silicon Mac, read docs/apple-silicon.md first — the images are arm64 and the stack is native, but the embedder is the one piece you run on the host.
Layout
State
Early, and it runs. The loop works end to end and has been driven by hand
against a real PostgreSQL and a real Qdrant: create an organization, create a
layer, grant someone read, ingest a document, poll the job to indexed,
search and get the chunk back — and search as someone without the grant and get
nothing while the vectors are still sitting in the index. Both surfaces work,
REST and MCP over Streamable HTTP and STDIO alike. Revoking a grant removes the
document from results on the next request: the permitted set is computed from
the grants on every search, so there is no cache in the index to fall behind.
Search is rate limited per organization, unsafe methods take an
Idempotency-Key, collections page by cursor, and reranking runs on the search
path when a deployment configures a reranker. Tombstoned vectors are collected,
and the SDK and the admin UI are written.
Signing in works: email and password, with rotating refresh tokens that end the
session if one is replayed. init creates the first administrator and prints a
generated password once. SSO is a commercial module.
The access log is readable: GET /v1/audit, newest first, cursor-paged, as
JSON, JSONL or CSV. org_admin sees which documents were read — the question
an audit log exists to answer — and platform_admin sees administrative actions
and never that, which is rule 2 applied to the journal.
A layer can be moved onto a different embedding model. Qdrant will not add a named vector to a collection that exists, so the collection is replaced rather than altered: every point copied across with no embeddings computed, one statement to switch the pointer, then re-embedding one layer at a time. Search stays available and stays one query throughout. Before a layer switches, its reference query set is scored against the new model and a migration that lost recall stops instead of going live — that gate is off until you write a set, because it needs documents only you can pick.
A document can be uploaded as a form as well as sent as JSON, and a PDF, an Office or OpenDocument file (text, presentation or spreadsheet), an EPUB or an RTF is extracted by the parser sidecar. Both signals have to agree — the part declares the format's type and the bytes begin with its signature — because a declared type the bytes contradict is a disagreement, and sniffing alone would make the declared type decoration. Any other binary format is still refused at the edge, and a scanned PDF with no text layer is refused rather than indexed as nothing.
Tokens can be signed with an Ed25519 key instead of a shared secret, in which
case the public half is published at /.well-known/jwks.json and only the
process issuing tokens holds the private one.
docker compose --profile minimal up has been run from a clean clone, and
the whole loop driven through it.
What is not built is what a commercial licence covers, and docs/licensing.md
lists it: multi-tenancy, SSO, document-level permissions and deny rules,
ID-JAG, SIEM export, a global admin, and quotas.
docs/ is the specification, and it still runs ahead of the code in places —
start with docs/authz.md, which everything else depends on.
Invariants
Six rules. Breaking any of them is a security incident, not a bug. Details in docs/authz.md.
- The organization comes from the token and nowhere else.
- Access filtering is a pre-filter, never a post-filter.
- A failure to evaluate permissions denies access.
- "No permission" and "no such object" return identical responses.
- A deleted document is never returned, including before garbage collection.
writedoes not implyread.
License
Apache 2.0 — all of it. Everything above is in this repository and stays there.
Tenancy (suspension, offboarding, quotas), SSO over OIDC with SCIM group sync, issuing document-level grants and deny rules, EMA, SIEM forwarding, global admin, backup, a required second factor and filtered directory administration are commercial modules. They live in a separate private repository under a separate license and are not distributed with this one — see docs/licensing.md for the line between the two and the one question that decides it.
Where this build meets one of them it refuses in the open: a deny rule or a
document-scoped grant is answered 400 with the reason, rather than accepted
and silently not enforced.
The Nacre name and mark are trademarks; see TRADEMARK.md.
Supporting this
There is no hosted tier, no seat count and nothing metered here, so the open half earns nothing by being used — which is the point, and also why it is worth saying who pays for it. The commercial modules do, and they are for the organizations that need them; a developer running this on a laptop is never the person being asked.
If it saved you a week, the Sponsor button at the top of this repository is the other way to say so. Nothing in this repository is behind it, and nothing will be.
来源:README.md,提交 5b1fd3e
工具
0版本历史
2- v0.41.0最新Oct 25, 2026
- v0.26.4Sep 26, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分