python-docs-mcp-server 0.1.4__py3-none-any.whl → 0.1.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -27,6 +27,7 @@ def _close_saved_stdout_fd() -> None:
27
27
  try:
28
28
  os.close(_saved_stdout_fd)
29
29
  except OSError:
30
+ # Best-effort cleanup; the fd may already be closed during interpreter shutdown.
30
31
  pass
31
32
  finally:
32
33
  _saved_stdout_fd = None
@@ -515,6 +516,7 @@ def doctor() -> None:
515
516
  test_file.unlink()
516
517
  cache_writable = True
517
518
  except OSError:
519
+ # Doctor reports the cache as not writable below.
518
520
  pass
519
521
  cache_ok = True # Not existing yet is OK (will be created on first build)
520
522
  cache_detail = str(cache_dir)
@@ -44,6 +44,7 @@ def detect_python_version() -> tuple[str, str]:
44
44
  logger.info("Detected Python %s from .python-version", version)
45
45
  return version, ".python-version file"
46
46
  except Exception:
47
+ # The version file is optional; fall through to active interpreter probing.
47
48
  pass
48
49
 
49
50
  # 2. python3 --version in PATH
@@ -60,6 +61,7 @@ def detect_python_version() -> tuple[str, str]:
60
61
  logger.info("Detected Python %s from python3 in PATH", version)
61
62
  return version, "python3 in PATH"
62
63
  except (FileNotFoundError, subprocess.TimeoutExpired, OSError):
64
+ # python3 may be absent or too slow; fall through to the server runtime.
63
65
  pass
64
66
 
65
67
  # 3. Server's own runtime
@@ -508,6 +508,7 @@ def ingest_fjson_file(
508
508
  try:
509
509
  conn.rollback()
510
510
  except Exception:
511
+ # Keep reporting the original ingestion failure if rollback also fails.
511
512
  pass
512
513
  return False
513
514
 
@@ -197,6 +197,7 @@ async def app_lifespan(server: FastMCP) -> AsyncIterator[AppContext]:
197
197
  error_log = cache_dir / "last-error.log"
198
198
  error_log.write_text(error_msg)
199
199
  except Exception:
200
+ # Best-effort diagnostic write; preserve the original lifespan error.
200
201
  pass
201
202
  raise
202
203
  finally:
@@ -204,6 +205,7 @@ async def app_lifespan(server: FastMCP) -> AsyncIterator[AppContext]:
204
205
  try:
205
206
  persistent_docs_cache.close()
206
207
  except Exception:
208
+ # Best-effort cleanup during shutdown.
207
209
  pass
208
210
  db.close()
209
211
 
@@ -34,9 +34,14 @@ _PYPI_METADATA_MAX_BYTES = 5 * 1024 * 1024
34
34
 
35
35
 
36
36
  class _HTTPResponse(Protocol):
37
- def read(self, size: int = -1) -> bytes: ...
38
- def __enter__(self) -> "_HTTPResponse": ...
39
- def __exit__(self, exc_type: object, exc: object, tb: object) -> bool | None: ...
37
+ def read(self, size: int = -1) -> bytes:
38
+ raise NotImplementedError
39
+
40
+ def __enter__(self) -> "_HTTPResponse":
41
+ raise NotImplementedError
42
+
43
+ def __exit__(self, exc_type: object, exc: object, tb: object) -> bool | None:
44
+ raise NotImplementedError
40
45
 
41
46
 
42
47
  Fetcher = Callable[[str, float], _HTTPResponse]
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-docs-mcp-server
3
- Version: 0.1.4
4
- Summary: A read-only, version-aware MCP retrieval server over Python standard library documentation
3
+ Version: 0.1.6
4
+ Summary: The canonical Python stdlib oracle for AI coding agents — exact symbols, exact sections, exact versions, offline, always free, always MIT, token-frugal.
5
5
  Author-email: Aymen Hammouda <hammouda.aymen@gmail.com>
6
6
  License-Expression: MIT
7
7
  License-File: LICENSE
@@ -30,48 +30,48 @@ Description-Content-Type: text/markdown
30
30
 
31
31
  <!-- mcp-name: io.github.ayhammouda/python-docs-mcp-server -->
32
32
 
33
+ **For AI coding agents writing Python, `python-docs-mcp-server` is the canonical Python stdlib oracle: exact symbols, exact sections, exact versions — offline, *always free, always MIT*, token-frugal.**
34
+
33
35
  [![CI](https://github.com/ayhammouda/python-docs-mcp-server/actions/workflows/ci.yml/badge.svg)](https://github.com/ayhammouda/python-docs-mcp-server/actions/workflows/ci.yml)
36
+ [![Security Audit](https://github.com/ayhammouda/python-docs-mcp-server/actions/workflows/security.yml/badge.svg)](https://github.com/ayhammouda/python-docs-mcp-server/actions/workflows/security.yml)
37
+ [![CodeQL](https://github.com/ayhammouda/python-docs-mcp-server/actions/workflows/codeql.yml/badge.svg)](https://github.com/ayhammouda/python-docs-mcp-server/actions/workflows/codeql.yml)
38
+ [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/ayhammouda/python-docs-mcp-server/badge)](https://scorecard.dev/viewer/?uri=github.com/ayhammouda/python-docs-mcp-server)
34
39
  [![python-docs-mcp-server MCP server](https://glama.ai/mcp/servers/ayhammouda/python-docs-mcp-server/badges/score.svg)](https://glama.ai/mcp/servers/ayhammouda/python-docs-mcp-server)
40
+ [![MCP Registry](https://img.shields.io/badge/MCP%20Registry-v0.1.4-0f766e)](https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.ayhammouda%2Fpython-docs-mcp-server)
35
41
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
36
42
  [![Python 3.12+](https://img.shields.io/badge/python-3.12%2B-blue)](https://www.python.org/)
37
- [![No API Keys](https://img.shields.io/badge/API%20keys-none-success)](#why-teams-like-this)
43
+ [![No API Keys](https://img.shields.io/badge/API%20keys-none-success)](#why-use-it)
38
44
  [![Official Python Docs](https://img.shields.io/badge/source-official%20python%20docs-informational)](https://docs.python.org/3/)
39
45
 
40
- A read-only, version-aware MCP server for Python standard library
41
- documentation, optimized for low-token, section-level retrieval.
42
-
43
- It gives Claude, Cursor, Codex, and other MCP clients precise stdlib answers
44
- without dumping whole documentation pages into the context window, without API
45
- keys, and without depending on a hosted docs provider at query time.
46
+ Built for the moment your agent needs `asyncio.TaskGroup` signatures, `pathlib.Path` semantics, or what changed in 3.12 — *not* a web fetch, *not* a hosted API, *not* a vector store hallucinating section anchors. Just an indexed slice of `docs.python.org`, returned by symbol or by query, scoped to the version you actually ship on.
46
47
 
47
48
  ## Why this exists
48
49
 
49
- General-purpose docs retrieval is often noisy for Python stdlib questions:
50
+ Generic docs retrieval is a rough fit for Python stdlib questions:
50
51
 
51
- - symbol lookups like `asyncio.TaskGroup` need exact resolution
52
- - answers should be version-aware (`3.12` vs `3.13`)
53
- - full-page fetches waste tokens when one section is enough
54
- - official Python docs are the source of truth, but they are not packaged for
55
- MCP out of the box
52
+ - `asyncio.TaskGroup` should resolve to the actual symbol, not a fuzzy page hit
53
+ - Python version matters (`3.12` and `3.13` do not always say the same thing)
54
+ - fetching a whole page burns tokens when one section answers the question
55
+ - the official docs are canonical, but they do not ship as an MCP server
56
56
 
57
- This server builds a local index from the official Python documentation and
58
- exposes a small MCP tool surface tuned for high-signal retrieval.
57
+ This server indexes the official docs locally and exposes a small set of MCP
58
+ tools for lookup and section retrieval.
59
59
 
60
- ## Why teams like this
60
+ ## Why use it
61
61
 
62
- - no API keys to provision, rotate, or justify
63
- - official Python docs are the source of truth
64
- - local index, so runtime retrieval does not depend on a third-party hosted API
65
- - read-only behavior with a simple security story
66
- - easy to explain in environments where external dependencies raise friction
62
+ - no API keys to manage
63
+ - queries run against a local index, not a hosted docs API
64
+ - results come from the official Python docs
65
+ - the server is read-only at runtime
66
+ - fewer dependencies to review in strict environments
67
67
 
68
68
  ## What you get
69
69
 
70
- - exact symbol lookup from Python `objects.inv`
71
- - section-level retrieval with truncation and pagination
72
- - local SQLite + FTS5 index with no runtime web scraping
73
- - version-aware results across indexed Python versions
74
- - a deliberately small, read-only MCP tool surface
70
+ - symbol lookup through Python `objects.inv`
71
+ - page and section retrieval with truncation and pagination
72
+ - a local SQLite + FTS5 index; no runtime web scraping
73
+ - results for each Python version you index
74
+ - five read-only MCP tools
75
75
 
76
76
  ## Quick example
77
77
 
@@ -86,8 +86,8 @@ exposes a small MCP tool surface tuned for high-signal retrieval.
86
86
 
87
87
  **Result**
88
88
 
89
- The model gets the exact symbol match and the relevant documentation section
90
- instead of a full-page dump.
89
+ The model gets the matching symbol and the relevant docs section, not a
90
+ full-page dump.
91
91
 
92
92
  ## 30-second demo
93
93
 
@@ -95,42 +95,20 @@ Ask your MCP client:
95
95
 
96
96
  > In Python 3.13, how should I use `asyncio.TaskGroup` and what changed from older asyncio patterns?
97
97
 
98
- The agent should use `search_docs` for the exact symbol, then `get_docs` for the
99
- matching section. Instead of generic web results or an entire docs page, it gets
100
- the official stdlib text for the requested Python version, trimmed to the useful
101
- section.
102
-
103
- <!-- PRE-PYPI: replace this temporary GitHub-source smoke test after the first PyPI publish -->
104
- Local source smoke test until the PyPI package is published:
105
-
106
- ```bash
107
- uvx --from git+https://github.com/ayhammouda/python-docs-mcp-server.git python-docs-mcp-server --version
108
- ```
109
- <!-- /PRE-PYPI -->
98
+ If setup is working, the client should use `search_docs` for the exact symbol,
99
+ then `get_docs` for the matching section. Instead of generic web results or an
100
+ entire docs page, it gets official stdlib text for the requested Python version,
101
+ trimmed to the section that matters.
110
102
 
111
103
  ## Install
112
104
 
113
- <!-- PRE-PYPI: remove this entire "Before PyPI publishing" block (heading + prose + code) after the first PyPI publish -->
114
- ### Before PyPI publishing (install from GitHub source)
115
-
116
- Until the first PyPI release is published, run from GitHub:
117
-
118
- ```bash
119
- uvx --from git+https://github.com/ayhammouda/python-docs-mcp-server.git python-docs-mcp-server --version
120
- ```
121
- <!-- /PRE-PYPI -->
122
-
123
- <!-- PRE-PYPI: after the first PyPI publish, drop this "After PyPI publishing" heading so the section reads simply as "## Install" -->
124
- ### After PyPI publishing
125
- <!-- /PRE-PYPI -->
126
-
127
105
  Run directly with `uvx`:
128
106
 
129
107
  ```bash
130
108
  uvx python-docs-mcp-server --version
131
109
  ```
132
110
 
133
- Or install it persistently:
111
+ Or install it once with `pipx`:
134
112
 
135
113
  ```bash
136
114
  pipx install python-docs-mcp-server
@@ -145,18 +123,6 @@ shell or use `python -m uv ...` as a fallback for local contributor commands.
145
123
 
146
124
  Build the local documentation index:
147
125
 
148
- <!-- PRE-PYPI: remove the GitHub-source build-index command and the "After PyPI publishing" lead-in after the first PyPI publish; the post-PyPI code fence below survives -->
149
- ```bash
150
- uvx --from git+https://github.com/ayhammouda/python-docs-mcp-server.git python-docs-mcp-server build-index --versions 3.10,3.11,3.12,3.13,3.14
151
- ```
152
-
153
- After PyPI publishing, `uvx python-docs-mcp-server build-index ...` is enough.
154
- <!-- /PRE-PYPI -->
155
-
156
- <!-- PRE-PYPI: after the first PyPI publish, drop this "After PyPI publishing" heading so the section reads simply as "## First run" -->
157
- ### After PyPI publishing
158
- <!-- /PRE-PYPI -->
159
-
160
126
  ```bash
161
127
  uvx python-docs-mcp-server build-index --versions 3.10,3.11,3.12,3.13,3.14
162
128
  ```
@@ -167,9 +133,9 @@ If you installed the package persistently, you can drop the `uvx` prefix:
167
133
  python-docs-mcp-server build-index --versions 3.10,3.11,3.12,3.13,3.14
168
134
  ```
169
135
 
170
- This downloads Python's `objects.inv` files, clones CPython docs sources, runs
171
- `sphinx-build -b json`, and writes an SQLite index to your local cache. Expect
172
- the first build to take several minutes.
136
+ The first build downloads Python's `objects.inv` files, clones CPython docs
137
+ sources, runs `sphinx-build -b json`, and writes an SQLite index to your local
138
+ cache. It can take several minutes.
173
139
 
174
140
  ## Configure your MCP client
175
141
 
@@ -183,25 +149,6 @@ Add this to your Claude Desktop configuration file:
183
149
 
184
150
  **Windows:** `%APPDATA%\\Claude\\claude_desktop_config.json`
185
151
 
186
- <!-- PRE-PYPI: remove the GitHub-source config and the "After PyPI publishing, use:" lead-in after the first PyPI publish; the post-PyPI config fence below survives -->
187
- ```json
188
- {
189
- "mcpServers": {
190
- "python-docs": {
191
- "command": "uvx",
192
- "args": [
193
- "--from",
194
- "git+https://github.com/ayhammouda/python-docs-mcp-server.git",
195
- "python-docs-mcp-server"
196
- ]
197
- }
198
- }
199
- }
200
- ```
201
-
202
- After PyPI publishing, use:
203
- <!-- /PRE-PYPI -->
204
-
205
152
  ```json
206
153
  {
207
154
  "mcpServers": {
@@ -220,25 +167,6 @@ Restart Claude Desktop after editing the config file.
220
167
  Add this to your Cursor MCP settings (`.cursor/mcp.json` in your project or
221
168
  global settings):
222
169
 
223
- <!-- PRE-PYPI: remove the GitHub-source config and the "After PyPI publishing, use:" lead-in after the first PyPI publish; the post-PyPI config fence below survives -->
224
- ```json
225
- {
226
- "mcpServers": {
227
- "python-docs": {
228
- "command": "uvx",
229
- "args": [
230
- "--from",
231
- "git+https://github.com/ayhammouda/python-docs-mcp-server.git",
232
- "python-docs-mcp-server"
233
- ]
234
- }
235
- }
236
- }
237
- ```
238
-
239
- After PyPI publishing, use:
240
- <!-- /PRE-PYPI -->
241
-
242
170
  ```json
243
171
  {
244
172
  "mcpServers": {
@@ -254,36 +182,23 @@ After PyPI publishing, use:
254
182
 
255
183
  Add this to `.codex/config.toml`:
256
184
 
257
- <!-- PRE-PYPI: remove the GitHub-source config and the "After PyPI publishing, use:" lead-in after the first PyPI publish; the post-PyPI config fence below survives -->
258
- ```toml
259
- [mcp_servers.python-docs]
260
- command = "uvx"
261
- args = ["--from", "git+https://github.com/ayhammouda/python-docs-mcp-server.git", "python-docs-mcp-server"]
262
- ```
263
-
264
- After PyPI publishing, use:
265
- <!-- /PRE-PYPI -->
266
-
267
185
  ```toml
268
186
  [mcp_servers.python-docs]
269
187
  command = "uvx"
270
188
  args = ["python-docs-mcp-server"]
271
189
  ```
272
190
 
273
- ## How quality is verified
274
-
275
- The repo makes quality visible with reproducible checks instead of relying on
276
- marketing claims.
191
+ ## Quality checks
277
192
 
278
193
  - CI runs `ruff`, `pyright`, and `pytest` on macOS and Linux for Python 3.12
279
194
  and 3.13
280
- - subprocess-based stdio hygiene and smoke tests protect the MCP protocol pipe
281
- - packaging tests verify the wheel contents and CLI entry points
282
- - curated retrieval regression tests cover exact symbol hits, version behavior,
195
+ - subprocess-based stdio and smoke tests cover the MCP protocol pipe
196
+ - packaging tests check the wheel contents and CLI entry points
197
+ - retrieval regression tests cover exact symbol hits, version behavior,
283
198
  missing symbols, truncation, and local-version defaults
284
- - manual MCP QA is documented in
199
+ - manual MCP QA lives in
285
200
  [`.github/INTEGRATION-TEST.md`](.github/INTEGRATION-TEST.md), with MCP
286
- Inspector as the fast-feedback loop and Claude/Cursor as real-client checks
201
+ Inspector for local checks and Claude/Cursor for real-client checks
287
202
 
288
203
  Contributor commands and validation steps live in
289
204
  [`CONTRIBUTING.md`](CONTRIBUTING.md).
@@ -298,25 +213,23 @@ The server currently exposes five MCP tools:
298
213
  | `get_docs` | Retrieve a specific documentation page or section by slug and optional anchor. Returns markdown content with budget-enforced truncation and pagination. Retrieved results are cached on disk by Python docs version and request identity. |
299
214
  | `lookup_package_docs` | Look up official PyPI package metadata and return package-declared documentation/homepage/source URLs. This is a controlled PyPI metadata lookup, not generic web search. |
300
215
  | `list_versions` | List all indexed Python versions with metadata. |
301
- | `detect_python_version` | Detect the user's local Python version and report whether it matches an indexed documentation version. |
216
+ | `detect_python_version` | Detect the user's local Python version and report whether that version has been indexed. |
302
217
 
303
218
  ## Why not Context7 or generic docs retrieval?
304
219
 
305
220
  Use this server when you want precise local Python docs retrieval rather than
306
221
  broad web search:
307
222
 
308
- - official Python docs, not scraped mirrors or mixed-source summaries
223
+ - official Python docs, not scraped mirrors or summaries
309
224
  - exact symbol resolution from `objects.inv`
310
- - Python-version-aware results across 3.10 through 3.14
311
- - token-efficient section retrieval instead of full-page dumps
312
- - package-declared PyPI metadata lookup via `lookup_package_docs` for
313
- documentation, homepage, and source URLs
314
- - local, read-only runtime behavior with no API keys
225
+ - version-aware results for Python 3.10 through 3.14
226
+ - section retrieval instead of full-page dumps
227
+ - PyPI-declared docs, homepage, and source links through `lookup_package_docs`
228
+ - local read-only runtime with no API keys
315
229
 
316
- Use Context7 or a generic docs fetcher when you need broader third-party library
317
- coverage, arbitrary web pages, or cross-framework research. This server is not a
318
- universal docs search engine. It is a precise stdlib retrieval tool for AI
319
- coding agents.
230
+ Use Context7 or a generic docs fetcher for third-party libraries, arbitrary web
231
+ pages, or framework research. This server is not a universal docs search engine;
232
+ it is a focused stdlib retrieval tool for AI coding agents.
320
233
 
321
234
  ## Retrieved docs cache
322
235
 
@@ -327,16 +240,16 @@ platform cache directory:
327
240
  <platform cache dir>/mcp-python-docs/retrieved-docs-cache.sqlite3
328
241
  ```
329
242
 
330
- The cache stores completed `get_docs` results, including page/section content,
331
- for the resolved Python docs version plus request identity (`slug`, optional
332
- `anchor`, `max_chars`, and `start_index`). Cache misses fall back to the normal
333
- local index retrieval path and then write the retrieved result.
243
+ The cache stores completed `get_docs` results for the resolved Python docs
244
+ version plus request identity (`slug`, optional `anchor`, `max_chars`, and
245
+ `start_index`). Cache misses use the normal local index retrieval path and then
246
+ write the result.
334
247
 
335
248
  Cache entries are also scoped to a fingerprint of the local `index.db` file
336
249
  (path, size, and modification timestamp). If you rebuild or replace the local
337
- docs index, older entries are ignored automatically instead of being returned
338
- for the new index generation. Deleting `retrieved-docs-cache.sqlite3` is safe;
339
- it only removes cached retrieval results, not the docs index.
250
+ docs index, older entries are ignored automatically. Deleting
251
+ `retrieved-docs-cache.sqlite3` is safe; it removes cached retrieval results, not
252
+ the docs index.
340
253
 
341
254
  ## PyPI package docs lookup
342
255
 
@@ -352,16 +265,6 @@ search, or silently fall back to unofficial community mirrors.
352
265
 
353
266
  ## Diagnostics
354
267
 
355
- <!-- PRE-PYPI: remove the GitHub-source doctor invocation and "After PyPI publishing:" lead-in after the first PyPI publish; the post-PyPI code fence below survives -->
356
- Before PyPI publishing, run `doctor` from the GitHub source package:
357
-
358
- ```bash
359
- uvx --from git+https://github.com/ayhammouda/python-docs-mcp-server.git python-docs-mcp-server doctor
360
- ```
361
-
362
- After PyPI publishing:
363
- <!-- /PRE-PYPI -->
364
-
365
268
  Check the local environment:
366
269
 
367
270
  ```bash
@@ -369,19 +272,7 @@ uvx python-docs-mcp-server doctor
369
272
  ```
370
273
 
371
274
  This checks the runtime Python version, SQLite FTS5, cache/index paths, disk
372
- space, and whether the current interpreter has the `venv`/`ensurepip` support
373
- needed by `build-index`.
374
-
375
- <!-- PRE-PYPI: remove the GitHub-source validate-corpus invocation and "After PyPI publishing:" lead-in after the first PyPI publish; the post-PyPI code fence below survives -->
376
- Before PyPI publishing, validate an existing index from the GitHub source
377
- package:
378
-
379
- ```bash
380
- uvx --from git+https://github.com/ayhammouda/python-docs-mcp-server.git python-docs-mcp-server validate-corpus
381
- ```
382
-
383
- After PyPI publishing:
384
- <!-- /PRE-PYPI -->
275
+ space, and the `venv`/`ensurepip` support needed by `build-index`.
385
276
 
386
277
  Validate an existing index:
387
278
 
@@ -393,7 +284,7 @@ uvx python-docs-mcp-server validate-corpus
393
284
 
394
285
  ### FTS5 unavailable
395
286
 
396
- If you see an error about SQLite FTS5 not being available:
287
+ If your Python build does not include SQLite FTS5:
397
288
 
398
289
  **Linux x86-64**
399
290
 
@@ -413,8 +304,8 @@ uv python install
413
304
 
414
305
  ### Missing `pythonX.Y-venv` on Debian/Ubuntu
415
306
 
416
- If `doctor` reports that build venv support is unavailable, install the venv
417
- package for the same Python minor version that runs the server:
307
+ If `doctor` says build venv support is unavailable, install the venv package
308
+ for the same Python minor version that runs the server:
418
309
 
419
310
  ```bash
420
311
  sudo apt install python3.12-venv
@@ -432,7 +323,7 @@ Earlier development snapshots of this project used the PyPI name
432
323
  the old name via `uvx`, you will see a `Package not found` error,
433
324
  because `uvx` resolves projects by PyPI name.
434
325
 
435
- Update your config's `args` from:
326
+ Change your config `args` from:
436
327
 
437
328
  ```json
438
329
  "args": ["mcp-server-python-docs"]
@@ -468,25 +359,6 @@ uv cache clean python-docs-mcp-server
468
359
  The MSIX-packaged version of Claude Desktop on Windows may have restricted PATH
469
360
  access. If `uvx` is not found, specify the full path in your config:
470
361
 
471
- <!-- PRE-PYPI: remove the GitHub-source config and the "After PyPI publishing, use:" lead-in after the first PyPI publish; the post-PyPI config fence below survives -->
472
- ```json
473
- {
474
- "mcpServers": {
475
- "python-docs": {
476
- "command": "C:\\Users\\YOU\\.local\\bin\\uvx.exe",
477
- "args": [
478
- "--from",
479
- "git+https://github.com/ayhammouda/python-docs-mcp-server.git",
480
- "python-docs-mcp-server"
481
- ]
482
- }
483
- }
484
- }
485
- ```
486
-
487
- After PyPI publishing, use:
488
- <!-- /PRE-PYPI -->
489
-
490
362
  ```json
491
363
  {
492
364
  "mcpServers": {
@@ -503,8 +375,8 @@ Replace `YOU` with your Windows username. Find the exact path with `where uvx`.
503
375
  ### Restart after rebuild
504
376
 
505
377
  After running `build-index`, restart your MCP client so it picks up the new
506
- database file. The server opens the index read-only at startup and does not
507
- hot-reload an updated database.
378
+ database file. The server opens the index read-only on startup and does not
379
+ reload it while running.
508
380
 
509
381
  On Windows, close the MCP client before rebuilding if the index file is locked.
510
382
 
@@ -1,18 +1,18 @@
1
1
  mcp_server_python_docs/__init__.py,sha256=sUtQT81momSAPMywIkgnR7BZxJHn53rpcjSE3CTAUws,499
2
- mcp_server_python_docs/__main__.py,sha256=e8O15uUQ6GmnR80hQdRUHJM1aXgY4US_fCqGOXp2_uE,21045
2
+ mcp_server_python_docs/__main__.py,sha256=_LmCa1p3O1gSnOcOC7UXoNbqmIo2LBha3FDsfUUkJ_8,21196
3
3
  mcp_server_python_docs/app_context.py,sha256=0HpzQjKjFcbgYhZUvJYuZw9F3xbAckvfYCMKQlWHfZo,1300
4
- mcp_server_python_docs/detection.py,sha256=JJZ5L90ehxTyS8ebndILpztA960qXCZVO2bgsmz-j-M,2691
4
+ mcp_server_python_docs/detection.py,sha256=bYYSfpMymHk9wehNW66oItX6yFUoCC2JXDRZLYpM0Vw,2860
5
5
  mcp_server_python_docs/diagnostics.py,sha256=FyC6QDFLvozARpYuMnaKfJwaN6BCzVycME_SkNs2YIs,2370
6
6
  mcp_server_python_docs/errors.py,sha256=XTOm1raJfxS2adaOPZdwj0SuhpMAXAdjBsF2-zTv_1E,827
7
7
  mcp_server_python_docs/models.py,sha256=jtC1TEAOZHBDEfFf8uqsSzC5FKmY06zRrHWzw3HSmsg,6966
8
8
  mcp_server_python_docs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- mcp_server_python_docs/server.py,sha256=z1FwWz6ivJVbvN4CYugCKABYTY2Bg_QCuBqZRjdxAVk,13835
9
+ mcp_server_python_docs/server.py,sha256=ZsGLMkOlI3ok3LrF2hWUZhgW_5d_lolA7jFcIRfMrCY,13976
10
10
  mcp_server_python_docs/data/synonyms.yaml,sha256=LgJxamZ9QT6Pykva7M1uM8juSd9ybHuv3vUOKrUFMg4,10696
11
11
  mcp_server_python_docs/ingestion/__init__.py,sha256=Yd7Jk7hD7XG3eoBVQpYiG94EwJGfI3qXxVCpA8JszYg,66
12
12
  mcp_server_python_docs/ingestion/cpython_versions.py,sha256=mEhjuT7q8Bo1aZ-zj6PSqmbq2Bz64g4xj50ttqA4QUU,977
13
13
  mcp_server_python_docs/ingestion/inventory.py,sha256=5gQCWOo1tBiQgv-e_A9KR9n2xfP4YAnJrSmb0pFbzwY,5672
14
14
  mcp_server_python_docs/ingestion/publish.py,sha256=gra87NgH1i4T92nSwf3sqp4AnKuuzQfrcE7ySnDgcSQ,17247
15
- mcp_server_python_docs/ingestion/sphinx_json.py,sha256=iXcdBoccY0TcDBC80qa8Zt5LvaSW4NNEFsZgYjHHriE,19252
15
+ mcp_server_python_docs/ingestion/sphinx_json.py,sha256=yvWzZ0T0Bk3JosyXbPxiE9Rmvc5gCU1iIL5w7zFby8w,19336
16
16
  mcp_server_python_docs/retrieval/__init__.py,sha256=xSH2dWrIun_Q980ElcoXWBIobTqz0am66-AkEvRo_ck,779
17
17
  mcp_server_python_docs/retrieval/budget.py,sha256=kORd1Pt6IxLH95vRE7WBwdwezxvk98deYBgeNLEmyOw,2098
18
18
  mcp_server_python_docs/retrieval/query.py,sha256=9rWBvWQG3KwVjCqEqCYKMFgKqswU-O4a1SyJiTzQrjk,6116
@@ -21,7 +21,7 @@ mcp_server_python_docs/services/__init__.py,sha256=UKlaRQYo_cnLOUVf_QieXnHlcnH9e
21
21
  mcp_server_python_docs/services/cache.py,sha256=ADqg89johOJRYZysbes1bEs6nLFrmzS9L5c-Njt1mrU,3199
22
22
  mcp_server_python_docs/services/content.py,sha256=7O5XGbR9QWICMxYAd-cp_pPF86tNLcYAMIwyCP_i8dk,5342
23
23
  mcp_server_python_docs/services/observability.py,sha256=rwnkIDelNkclHzuwsktGUoU2fzYCuiR1niVRmOwJHJg,4839
24
- mcp_server_python_docs/services/package_docs.py,sha256=k4yxkWuZEq2aS-w2kIw0Bhl8zzj88AdYGf4xXqW9aKY,5513
24
+ mcp_server_python_docs/services/package_docs.py,sha256=0Qq8PtRL_KdiTFUtllaj4KFHz6u9L903zcORVpYmR1U,5605
25
25
  mcp_server_python_docs/services/persistent_cache.py,sha256=KpjutXAVhFPXB-QhgtShxWuTTG0mZWc7j-st7LglfL8,5747
26
26
  mcp_server_python_docs/services/search.py,sha256=Pjt4IDfnogWTGYKFJ_4ODbq1xbUZ0ybceD6yj7Ep6lw,4545
27
27
  mcp_server_python_docs/services/version.py,sha256=nPkWhksZo7B4QIp-knlSEvVXFmKIcVUq6tWRTJAe5aA,1467
@@ -29,8 +29,8 @@ mcp_server_python_docs/services/version_resolution.py,sha256=rULBoqq97t0ZfSWSy-e
29
29
  mcp_server_python_docs/storage/__init__.py,sha256=YNeNr7FW9Vgvo79oXgKXE3eGP0WwWDqRgTZ7lg7MFW4,62
30
30
  mcp_server_python_docs/storage/db.py,sha256=Lys8HN3IvgmNpr_qyocUQghcZnwHf2lz9eq_BFmwi54,5634
31
31
  mcp_server_python_docs/storage/schema.sql,sha256=4cXPktPQSLfbjkSjirpf0dA2CphlO9UCIKUxnLiIm_g,5637
32
- python_docs_mcp_server-0.1.4.dist-info/METADATA,sha256=_IEk2lB9fCubnkyK8N4ky1QNRrrm--r5cHB2hUcf0wM,17161
33
- python_docs_mcp_server-0.1.4.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
34
- python_docs_mcp_server-0.1.4.dist-info/entry_points.txt,sha256=-1arbtjZhF5mtnJNAh_90UBr1f4AqJxT3Tmfy9p7NMI,142
35
- python_docs_mcp_server-0.1.4.dist-info/licenses/LICENSE,sha256=-AHGWRwcvoeP4bkY1W2ok_qaI1Mg0Zx2qYgR1k-3CHY,1071
36
- python_docs_mcp_server-0.1.4.dist-info/RECORD,,
32
+ python_docs_mcp_server-0.1.6.dist-info/METADATA,sha256=k-EWmidaKAmIMJElpLcQo-LNh93g0zFAS9xejQJ4jaY,13532
33
+ python_docs_mcp_server-0.1.6.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
34
+ python_docs_mcp_server-0.1.6.dist-info/entry_points.txt,sha256=-1arbtjZhF5mtnJNAh_90UBr1f4AqJxT3Tmfy9p7NMI,142
35
+ python_docs_mcp_server-0.1.6.dist-info/licenses/LICENSE,sha256=-AHGWRwcvoeP4bkY1W2ok_qaI1Mg0Zx2qYgR1k-3CHY,1071
36
+ python_docs_mcp_server-0.1.6.dist-info/RECORD,,