
Deadzone
io.github.laradji由 GitHub 账号 laradji 发布v0.7.4更新于 Oct 24, 2026
Local-first MCP server: semantic search over library docs. No cloud, no API key, no telemetry.
概览
本地优先的 MCP 服务器,让助手对内置的库文档索引做语义搜索,无需云端、API 密钥或遥测。
- 可以做什么
- 搜索库:把自由文本转换为本地索引中排序后的库与版本匹配结果。
- 搜索文档:用自然语言查询获取受 token 预算限制的片段,可按库和版本过滤。
- 保持数据留在本机:向量与 Turso 数据库文件均在本地,索引通过拉取新版本更新。
- 适用场景
- 适合让助手依据真实文档而非猜测来回答第三方库 API 问题,也适合必须离线或不愿使用外部账号的场景。适用于需要某个库和版本对应文档片段的编码过程。
- 运行要求
- 以本地 stdio 进程运行:Linux 或 macOS 上的单个二进制文件(Windows 需通过 WSL),或使用已发布的容器镜像。首次启动会下载数据库、ONNX 运行时库和模型权重,并逐一校验哈希;之后启动无需网络。可选环境变量可覆盖缓存路径或强制离线模式。
安装
在 SourceWeft 中
- 打开 控制台中的 Deadzone,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
Status. Vector search wired end-to-end. MCP over stdio. One binary, Linux + macOS, zero telemetry. See releases for the latest tag and the roadmap for in-flight work. The scraper is still the messy half — #64 is honest about it.
The pitch, in one paragraph
Your AI client says "how do I register a tool?". The doc says AddTool. A grep-based index shrugs; a vector index doesn't. Deadzone is the vector index — nomic-embed-text-v1.5 over Turso's native cosine distance, wrapped in a Go binary that speaks MCP over stdio and keeps every byte on your laptop. It is, roughly, Context7 with the internet turned off.
Rules of the deadzone
- One binary.
deadzone. Subcommands for everything. Nopip install, nonpm i, nodocker compose up. - The index never leaves. Local Turso file. No account. No API key. No egress on the hot path.
- Natural language first. Embeddings over cosine.
FTS5is not invited. - The binary is the version. The DB is pinned to the binary. Upgrade the binary, the DB follows; don't, and it won't.
- Fail loudly or not at all.
DEADZONE_DB_OFFLINE=1refuses to guess. Verification failures in the scraper drop the doc, not the run.
Install (pick one; they all converge on the same binary)
Both flavors land a deadzone executable in your current directory, so the ./deadzone server snippet below works as-is.
The image bakes the binary, libonnxruntime, deadzone.db, and the nomic-embed-text-v1.5 ONNX weights (~230 MB total), and runs as a non-root user out of distroless (no shell, no package manager). DEADZONE_DB_OFFLINE=1 is set in the image so first launch is instant — no download, no volume mount, no --network access required. To refresh the index, pull a newer tag.
Windows is blocked upstream — no libtokenizers.a. Use WSL.
Verify checksums (optional but cheap):
AppImage needs FUSE v2. Most desktops ship it; minimal servers don't. If you get dlopen(): libfuse.so.2, either apt-get install libfuse2 (or dnf install fuse-libs) or pass --appimage-extract-and-run to bypass FUSE entirely.
Run
That's the quick-start. On first launch it fetches deadzone.db matched to this binary's version, SHA256-verifies, caches it under the platform data dir, and serves. Second launch onwards: zero network. Upgrade the binary and the DB re-fetches on next launch; don't, and the cache is served forever.
MCP client wire-up — native binary (Brew tap, tarball, or AppImage):
MCP client wire-up — container (multi-arch on ghcr.io). The image ships with deadzone.db baked, so no volume mount is needed and every container start is offline-instant:
Then, from the client:
The two tools
Under the hood
The binary itself is CGO-linked (hugot ORT backend + static libtokenizers.a). At runtime the only native surface is libonnxruntime, loaded via dlopen after a SHA256-verified auto-download. Everything else — Go stdlib, tursogo, the model weights — is either statically linked or fetched on first launch against a pinned hash. No system installs. No sudo. If a download drifts from its pinned hash, the run aborts; there is no fallback to an unverified fetch.
Escape hatches for air-gapped boxes:
Default cache paths per platform:
A sibling deadzone.db.release JSON manifest records {tag, sha256, fetched_at}. Startup compares the cached tag against the binary's compiled-in version: match → fire a 3-second freshness probe against deadzone.db.sha256 on the matching GitHub Release, atomic-swap if the remote sha differs (soft-fail to the cache on any network error); differs → fetch the new tag's release and atomic-swap; dev build → fall back to /releases/latest with a server.db_version_dev_fallback WARN. Pre-#197 binaries wrote a single-line tag-only sidecar; the JSON reader still accepts that format and rewrites it to v1 on first probe.
Add a library
Contributor path. End users don't touch this — they just get what ships in deadzone.db.
Not editing YAML yourself? Open an issue via the New issue page and pick Add a library or Refresh a library. The template collects exactly what a registry entry needs.
Editing YAML yourself? Append to libraries_sources.yaml:
Pre-1.0: no Go editing, no recompile. Just edit YAML and re-scrape.
Scrape-via-agent (experimental)
⚠️ The messy half. Works today for non-markdown sources (Terraform providers, mkdocs, GitBook, …), but the LLM→verifier loop is sensitive to input truncation (48 KiB cap), HTML→markdown skill, and verbatim-code matching. Real-world hit rate on dense doc sites ≈ 50%/URL — see #64. Prefer
github-mdwhenever the project ships committed markdown.
Bring your own LLM runtime — Ollama, llama.cpp, vLLM, LocalAI, LM Studio, Groq, OpenAI, anything that speaks POST /v1/chat/completions:
Then add a kind: scrape-via-agent entry to libraries_sources.yaml with a list of page URLs. The downstream pipeline (parse → chunk → embed → store) is identical to github-md; only the markdown source changes.
Guardrails. Every fenced code block in the LLM output is verified verbatim against the source — invented examples drop the doc (scraper.agent_verification_failed), not the run. Missing/unreachable endpoint aborts at startup; no silent fallback.
Local pipeline (contributors)
Two-step bootstrap: toolchain first, then the CGO native dep — kept separate so air-gapped / CI runners with vendored libtokenizers.a can skip step 2 by overriding DEADZONE_TOKENIZERS_LIB.
just with no args lists every recipe. Each scrape rewrites artifacts/<slug>/artifact.db + state.yaml in place; consolidate merges all artifact DBs atomically under deadzone.db. Per-lib folders are gitignored; the committed artifacts/manifest.yaml records release history only.
Full registry via CI. gh workflow run scrape-pack.yml -f tag=vX.Y.Z fans out the matrix, consolidates, and uploads deadzone.db to the tagged release. Omit -f tag=… to stop at a consolidated-db cache.
Release flow
Two-phase as of #101 — CI ships binaries, operator ships the DB.
A stable-tag push fans out fully through CI: release.yml -> chain-release.yml dispatches scrape-pack.yml -> chain-image.yml dispatches docker-publish.yml (one workflow per concern, chained via workflow_run).
Manual Homebrew fallback. The tap auto-bump fires on release.published (#148). If RELEASE_PUBLISH_TOKEN expires and the chain breaks, run it by hand:
Logs
Structured JSON on stderr via log/slog. Stdout is reserved for MCP JSON-RPC on deadzone server.
--verbose on any subcommand adds debug-level detail. On server it logs the raw query (off by default — queries may carry user data). On scrape it adds per-doc scraper.doc_indexed.
MCP client log paths: Claude Code on macOS writes to ~/Library/Logs/Claude/mcp-server-deadzone.log; other clients vary.
Roadmap & contributing
Issues: laradji/deadzone/issues. Scope via milestones. Category via feature / research labels; priority via P1 / P2 / P3.
New library or refresh: use the New issue page and pick the matching form.
Why bother with vectors
Because "how to register a tool" should find the doc that says AddTool, and no FTS5 query will get you there without the human already knowing the answer. Embeddings-first retrieval is the point; everything else is plumbing.
Long-form: docs/research/context7-analysis.md.
License
Apache License, Version 2.0. Third-party attributions in NOTICE.
One important asterisk. Apache 2.0 covers the Deadzone source code, and only that. It does not cover the third-party documentation the scraper indexes — those docs belong to their original authors under their own licenses. Running deadzone scrape is subject to each source's ToS. A pre-built pack is bound by the original content's license, not Apache 2.0. Personal local indexing: fine. Public redistribution: do the homework first.
来源:README.md,提交 f8261a3
工具
0版本历史
1- v0.7.4最新Sep 16, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分