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.
- mcp_server_python_docs/__main__.py +2 -0
- mcp_server_python_docs/detection.py +2 -0
- mcp_server_python_docs/ingestion/sphinx_json.py +1 -0
- mcp_server_python_docs/server.py +2 -0
- mcp_server_python_docs/services/package_docs.py +8 -3
- {python_docs_mcp_server-0.1.4.dist-info → python_docs_mcp_server-0.1.6.dist-info}/METADATA +67 -195
- {python_docs_mcp_server-0.1.4.dist-info → python_docs_mcp_server-0.1.6.dist-info}/RECORD +10 -10
- {python_docs_mcp_server-0.1.4.dist-info → python_docs_mcp_server-0.1.6.dist-info}/WHEEL +0 -0
- {python_docs_mcp_server-0.1.4.dist-info → python_docs_mcp_server-0.1.6.dist-info}/entry_points.txt +0 -0
- {python_docs_mcp_server-0.1.4.dist-info → python_docs_mcp_server-0.1.6.dist-info}/licenses/LICENSE +0 -0
|
@@ -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
|
mcp_server_python_docs/server.py
CHANGED
|
@@ -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
|
-
|
|
39
|
-
|
|
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
|
-
Summary:
|
|
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
|
[](https://github.com/ayhammouda/python-docs-mcp-server/actions/workflows/ci.yml)
|
|
36
|
+
[](https://github.com/ayhammouda/python-docs-mcp-server/actions/workflows/security.yml)
|
|
37
|
+
[](https://github.com/ayhammouda/python-docs-mcp-server/actions/workflows/codeql.yml)
|
|
38
|
+
[](https://scorecard.dev/viewer/?uri=github.com/ayhammouda/python-docs-mcp-server)
|
|
34
39
|
[](https://glama.ai/mcp/servers/ayhammouda/python-docs-mcp-server)
|
|
40
|
+
[](https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.ayhammouda%2Fpython-docs-mcp-server)
|
|
35
41
|
[](LICENSE)
|
|
36
42
|
[](https://www.python.org/)
|
|
37
|
-
[](#why-
|
|
43
|
+
[](#why-use-it)
|
|
38
44
|
[](https://docs.python.org/3/)
|
|
39
45
|
|
|
40
|
-
|
|
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
|
-
|
|
50
|
+
Generic docs retrieval is a rough fit for Python stdlib questions:
|
|
50
51
|
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
-
|
|
54
|
-
- official
|
|
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
|
|
58
|
-
|
|
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
|
|
60
|
+
## Why use it
|
|
61
61
|
|
|
62
|
-
- no API keys to
|
|
63
|
-
-
|
|
64
|
-
-
|
|
65
|
-
- read-only
|
|
66
|
-
-
|
|
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
|
-
-
|
|
71
|
-
- section
|
|
72
|
-
- local SQLite + FTS5 index
|
|
73
|
-
-
|
|
74
|
-
-
|
|
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
|
|
90
|
-
|
|
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
|
-
|
|
99
|
-
matching section. Instead of generic web results or an
|
|
100
|
-
|
|
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
|
|
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
|
-
|
|
171
|
-
`sphinx-build -b json`, and writes an SQLite index to your local
|
|
172
|
-
|
|
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
|
-
##
|
|
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
|
|
281
|
-
- packaging tests
|
|
282
|
-
-
|
|
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
|
|
199
|
+
- manual MCP QA lives in
|
|
285
200
|
[`.github/INTEGRATION-TEST.md`](.github/INTEGRATION-TEST.md), with MCP
|
|
286
|
-
Inspector
|
|
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
|
|
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
|
|
223
|
+
- official Python docs, not scraped mirrors or summaries
|
|
309
224
|
- exact symbol resolution from `objects.inv`
|
|
310
|
-
-
|
|
311
|
-
-
|
|
312
|
-
-
|
|
313
|
-
|
|
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
|
|
317
|
-
|
|
318
|
-
|
|
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
|
|
331
|
-
|
|
332
|
-
`
|
|
333
|
-
|
|
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
|
|
338
|
-
|
|
339
|
-
|
|
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
|
|
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
|
|
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`
|
|
417
|
-
|
|
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
|
-
|
|
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
|
|
507
|
-
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
33
|
-
python_docs_mcp_server-0.1.
|
|
34
|
-
python_docs_mcp_server-0.1.
|
|
35
|
-
python_docs_mcp_server-0.1.
|
|
36
|
-
python_docs_mcp_server-0.1.
|
|
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,,
|
|
File without changes
|
{python_docs_mcp_server-0.1.4.dist-info → python_docs_mcp_server-0.1.6.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{python_docs_mcp_server-0.1.4.dist-info → python_docs_mcp_server-0.1.6.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|