Exact-version library docs from your lockfile — local, offline, no rate limits.
- ✓Open-source license (MIT)
- ✓Actively maintained (<30d)
- ✓Clear description
- ✓Topics declared
- ✓Documented (README)
claude mcp add lockdocs -- npx -y @sylphx/lockdocs{
"mcpServers": {
"lockdocs": {
"command": "npx",
"args": ["-y", "@sylphx/lockdocs"]
}
}
}MCP Servers overview
<div align="center">
# lockdocs
**Exact-version library docs from your lockfile — local, offline, no rate limits.**
Reads your lockfile. Answers from the docs and type declarations of the exact version you installed.<br>
npm · PyPI · crates.io · Go. MCP server + CLI in one Rust binary. No account, no API key. MIT.
[](https://www.npmjs.com/package/@sylphx/lockdocs)
[](https://github.com/SylphxAI/lockdocs/actions/workflows/ci.yml)
[](https://registry.modelcontextprotocol.io/)
[](LICENSE)
[Docs](https://sylphxai.github.io/lockdocs/) · [Quickstart](#quickstart) · [Tools](#what-your-agent-gets) · [Benchmarks](#benchmarks) · [Compare](#how-it-compares) · [How it works](#how-it-works)
<img src="docs/public/img/demo.gif" alt="lockdocs demo: the same question about zod in a zod 3 project and a zod 4 project gets .strict() and z.strictObject() respectively, each cited to the installed file and line" width="100%">
<sub>A real terminal: one question, two projects. The zod 3 project gets `.strict()`, the zod 4 project gets `z.strictObject()`, each cited to `package@version file:line`.</sub>
</div>
## Quickstart
```bash
npx -y @sylphx/lockdocs setup # add lockdocs to Claude Code, Codex, Cursor, VS Code, Claude Desktop, Windsurf, Gemini CLI
```
That's it. `setup` detects the clients you have, writes their MCP config, and prints every change. Run it again and nothing changes. Then ask your agent something like *"Use lockdocs: how do I reject unknown keys with the zod we use?"*
From a terminal, inside any project:
```bash
npx -y @sylphx/lockdocs zod "reject unknown keys" # docs for the zod version in your lockfile
npx -y @sylphx/lockdocs api axum::Router::route # exact signature + doc comment
npx -y @sylphx/lockdocs resolve # every pinned version, and whether its docs are here
npx -y @sylphx/lockdocs fetch # once: add upstream docs at each version's git tag
```
<details>
<summary>Manual MCP config</summary>
```json
{
"mcpServers": {
"lockdocs": { "command": "npx", "args": ["-y", "@sylphx/lockdocs", "mcp"] }
}
}
```
Claude Code: `claude mcp add lockdocs -- npx -y @sylphx/lockdocs mcp`
Claude Code plugin: `/plugin marketplace add SylphxAI/lockdocs`, then `/plugin install lockdocs@lockdocs`
Codex (`~/.codex/config.toml`):
```toml
[mcp_servers.lockdocs]
command = "npx"
args = ["-y", "@sylphx/lockdocs", "mcp"]
```
The server answers for the client's workspace root (or its working directory, or `LOCKDOCS_ROOT`). Every tool also takes `root`.
</details>
## Why
Your agent writes code against the library version it remembers, not the one you installed. So it calls `.dict()` on a pydantic 2 model, `cookies()` without `await` on Next.js 15, and `/:id` routes on axum 0.8. Hosted doc servers help, but they guess the version from the prompt, cap free usage, and cannot see your private packages.
lockdocs takes the version question off the table:
- **Exact version, zero config.** It reads `package-lock.json`, `pnpm-lock.yaml`, `yarn.lock`, `bun.lock`, `Cargo.lock`, `uv.lock`, `poetry.lock`, `Pipfile.lock`, `requirements*.txt` and `go.mod`. No library IDs, no "use v14" in the prompt.
- **Docs that ship with the code.** READMEs, changelogs and `docs/` folders, plus the API reference in the package itself: `.d.ts` declarations with JSDoc, Python docstrings and stubs, rustdoc comments, Go doc comments. If it is installed, it is documented, including your private and internal packages.
- **Offline and unlimited.** Everything is read from `node_modules`, your virtualenv, `~/.cargo/registry` and the Go module cache. Offline after a one-time model download (129 MB, kept as 32 MB); keyword-only mode (`LOCKDOCS_EMBED=0`) needs no network at all. No account, no rate limit, and nothing about your dependencies leaves your machine.
- **Upstream docs at the exact tag, when you want them.** Packages like Next.js, Django and FastAPI ship no docs. `lockdocs fetch` pulls their docs folders from GitHub at the git tag of your pinned version, once, then stays offline.
- **Meaning, not just words.** Hybrid retrieval: BM25 fused with a small local embedding model (downloaded once, 32 MB on disk), plus API redirects from deprecation notes ("use `model_validate` instead").
- **Small, cited answers.** Packed into a token budget (1,200 by default), every section cited as `package@version path:line`.
## What your agent gets
Three tools, cheap enough to call before every unfamiliar API:
| Tool | Ask it | Returns |
|---|---|---|
| `resolve` | "Which zod do we use?" | Pinned versions from every lockfile, direct vs transitive, and where their docs are (or what to install) |
| `docs` | "How do I reject unknown keys?" (optionally `package: "zod"`) | The most relevant README, changelog and API sections of the installed version, within budget, each cited `zod@4.1.5 v4/classic/schemas.d.ts:453` |
| `api` | `z.object`, `tokio::spawn`, `BaseModel.model_dump`, `gin.Context.JSON` | The exact signature and doc comment, overloads, members of a class/interface/struct/trait, and other matches |
Example, in a pydantic 2 project:
```text
$ lockdocs api BaseModel.model_dump --tokens 300
pydantic@2.9.2 · pypi · .venv/lib/python3.12/site-packages · pinned in uv.lock
### pydantic.main.BaseModel.model_dump (method) — pydantic@2.9.2 pydantic/main.py:352
def model_dump(self, *, mode: Literal['json', 'python'] | str = 'python', include: IncEx | None = None, …) -> dict[str, Any]
Usage docs: https://docs.pydantic.dev/2.9/concepts/serialization/#modelmodel_dump
Generate a dictionary representation of the model, optionally specifying which fields to include or exclude.
```
The same call in a pydantic 1 project answers that pydantic 1.10.18 has no `model_dump`, and shows the closest documentation instead.
## Ecosystems
| Ecosystem | Versions from | Docs read from | API reference |
|---|---|---|---|
| npm | `package-lock.json`, `npm-shrinkwrap.json`, `pnpm-lock.yaml` (v5-v9), `yarn.lock` (v1 and Berry), `bun.lock`; else `package.json` + `node_modules` | `node_modules` (including pnpm's `.pnpm` store and monorepo roots), Yarn PnP zip cache (`.yarn/cache`, global Berry cache) | `.d.ts`/`.d.mts`/`.d.cts` with JSDoc; `@types/*` when the package ships none; JSDoc'd JS otherwise |
| PyPI | `uv.lock`, `poetry.lock`, `pdm.lock`, `Pipfile.lock`, `requirements*.txt`; else the virtualenv | `.venv`, `venv`, `$VIRTUAL_ENV`, `$CONDA_PREFIX`, then the system interpreter | Docstrings and signatures from `.py`, `.pyi` stubs; README from the wheel's METADATA |
| crates.io | `Cargo.lock` | `~/.cargo/registry/src` (or `$CARGO_HOME`), git dependencies from `~/.cargo/git/checkouts`, `vendor/` | Public items with rustdoc (`///`, `//!`), including items declared inside macros such as tokio's `cfg_rt!` |
| Go | `go.mod` (with `replace`) | `$GOMODCACHE`/`~/go/pkg/mod`, `vendor/` | Exported funcs, methods, types, interface methods with doc comments; package docs |
Legacy copies bundled inside a package (`zod/v3` inside zod 4, `pydantic/v1` inside pydantic 2) rank below the current API.
### Upstream docs and missing packages (opt-in)
`lockdocs fetch` adds, once, each direct dependency's upstream docs: it finds the GitHub repository in the package's own metadata and the git tag of your pinned version, and downloads only the docs folders at that tag (Markdown, MDX, reStructuredText, docs examples). Answers then cite `next@15.1.0 upstream:docs/01-app/.../cookies.mdx:12`. See [Upstream docs and fetching](https://sylphxai.github.io/lockdocs/guide/fetch).
### Not installed? Fetch the exact version (opt-in)
Out of the box lockdocs reads only your disk (plus the one-time embedding model download). If a pinned package is not installed (a fresh clone, CI, a lockfile you are reviewing), it says so and tells you how to install it. Pass `--fetch` (or set `LOCKDOCS_FETCH=1`, or `lockdocs setup --fetch`) to let it download exactly that version from the registry (npm tarball, PyPI wheel or sdist, crates.io `.crate`, Go module proxy zip) into its cache. Fetched answers say `fetched from registry.npmjs.org`. You can also ask for a version you do not use: `lockdocs npm:zod@4.1.5 "strict object" --fetch`.
## Benchmarks
<!-- bench:start -->
105 questions whose correct answer depends on the version, over 15 libraries (zod, Next.js, React Router, pydantic, axum, tokio, Tailwind CSS, ESLint, Prisma, React, Vite, Express, SQLAlchemy, Django, FastAPI), each asked in a real project with that version installed. An answer passes when it contains the version-correct API and none of the other version's. Same questions and grader against Context7's anonymous API, on a GitHub-hosted runner ([run](https://github.com/SylphxAI/lockdocs/actions/runs/36204404336)):
| | correct | older majors | newer majors | tokio | held-out | median tokens | median latency |
|---|---|---|---|---|---|---|---|
| lockdocs + `lockdocs fetch` | 96/105 | 38/45 | 53/55 | 5/5 | 16/18 | 866 | 97 ms |
| lockdocs, package files only | 60/105 | 27/45 | 29/55 | 4/5 | 6/18 | 903 | 52 ms |
| Context7 (anonymous) | 77/105 | 19/45 | 53/55 | 5/5 | 15/18 | 908 | 2,583 ms |
<!-- bench:end -->
- **Where versions matter most, lockdocs wins by 2x** (38/45 vs 19/45 on older majors). Context7 often answers with the newest API (pydantic 1 questions get pydantic 2 answers).
- **Tied on the newest majors (53/55 each) and on tokio (5/5 each); ahead on held-out questions (16/18 vs 15/18)**, which were written before the ranking changes they measure and not used for tuning.
- **~27x faster, fewer tokens, no quota.** lockdocs latency is a fresh CLI process per question; `lockdocWhat people ask about lockdocs
What is SylphxAI/lockdocs?
+
SylphxAI/lockdocs is mcp servers for the Claude AI ecosystem. Exact-version library docs from your lockfile — local, offline, no rate limits. It has 0 GitHub stars and its last recorded update is dated 2026-09-26.
How do I install lockdocs?
+
You can install lockdocs by cloning the repository (https://github.com/SylphxAI/lockdocs) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.
Is SylphxAI/lockdocs safe to use?
+
Our security agent has analyzed SylphxAI/lockdocs and assigned a Trust Score of 95/100 (tier: Verified). See the full breakdown of passed checks and flags on this page.
Who maintains SylphxAI/lockdocs?
+
SylphxAI/lockdocs is maintained by SylphxAI. The last recorded GitHub activity is dated 2026-09-26, with 0 open issues.
Are there alternatives to lockdocs?
+
Yes. On ClaudeWave you can browse similar mcp servers at /categories/mcp, sorted by popularity or recent activity.
Deploy lockdocs to your cloud
Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.
Maintain this repo? Add a badge to your README
Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.
[](https://claudewave.com/repo/sylphxai-lockdocs)<a href="https://claudewave.com/repo/sylphxai-lockdocs"><img src="https://claudewave.com/api/badge/sylphxai-lockdocs" alt="Featured on ClaudeWave: SylphxAI/lockdocs" width="320" height="64" /></a>More MCP Servers
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scrapling_dev
The fastest path to AI-powered full stack observability, even for lean teams.