python-docs-mcp-server 0.3.0__tar.gz → 0.3.1__tar.gz

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.
Files changed (134) hide show
  1. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/workflows/ci.yml +2 -2
  2. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/workflows/codeql.yml +1 -1
  3. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/workflows/e2e.yml +2 -2
  4. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/workflows/release.yml +3 -3
  5. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/workflows/scorecard.yml +1 -1
  6. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/workflows/security.yml +2 -2
  7. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.gitignore +3 -0
  8. python_docs_mcp_server-0.3.1/.mcp.json +9 -0
  9. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/CHANGELOG.md +12 -0
  10. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/PKG-INFO +28 -1
  11. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/README.md +27 -0
  12. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/STRATEGIC-ROADMAP-2026-05-29.md +23 -0
  13. python_docs_mcp_server-0.3.1/docs/benchmarks/PUBLIC-BENCHMARK-METHODOLOGY.md +221 -0
  14. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/pyproject.toml +1 -1
  15. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/server.json +2 -2
  16. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/uv.lock +88 -91
  17. python_docs_mcp_server-0.3.0/.planning/POSITIONING.md +0 -20
  18. python_docs_mcp_server-0.3.0/.planning/ROADMAP.md +0 -23
  19. python_docs_mcp_server-0.3.0/.planning/agent-context/adr-001-source-adapters.md +0 -49
  20. python_docs_mcp_server-0.3.0/.planning/agent-context/adr-006-serialization.md +0 -55
  21. python_docs_mcp_server-0.3.0/.planning/agent-context/cpython-source-sha-pin.md +0 -78
  22. python_docs_mcp_server-0.3.0/.planning/agent-context/pyyaml-safe-loader-audit.md +0 -52
  23. python_docs_mcp_server-0.3.0/.planning/agent-context/readme-glama-six-tool-refresh.md +0 -54
  24. python_docs_mcp_server-0.3.0/.planning/agent-context/zstd-cache-codec.md +0 -71
  25. python_docs_mcp_server-0.3.0/.planning/issues/v0.3.0/00-README.md +0 -63
  26. python_docs_mcp_server-0.3.0/.planning/issues/v0.3.0/01-zstd-cache-codec.md +0 -83
  27. python_docs_mcp_server-0.3.0/.planning/issues/v0.3.0/02-readme-glama-six-tool-refresh.md +0 -59
  28. python_docs_mcp_server-0.3.0/.planning/issues/v0.3.0/03-pyyaml-safe-loader-audit.md +0 -50
  29. python_docs_mcp_server-0.3.0/.planning/issues/v0.3.0/04-adr-006-serialization.md +0 -91
  30. python_docs_mcp_server-0.3.0/.planning/issues/v0.3.0/05-adr-001-source-adapters.md +0 -76
  31. python_docs_mcp_server-0.3.0/.planning/issues/v0.3.0/06-cpython-source-sha-pin.md +0 -61
  32. python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-01-data-shape-spike-PLAN.md +0 -205
  33. python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-01-data-shape-spike-SUMMARY.md +0 -181
  34. python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-02-result-models-PLAN.md +0 -183
  35. python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-02-result-models-SUMMARY.md +0 -97
  36. python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-03-compare-service-PLAN.md +0 -403
  37. python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-03-compare-service-SUMMARY.md +0 -158
  38. python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-04-mcp-tool-wiring-PLAN.md +0 -405
  39. python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-04-mcp-tool-wiring-SUMMARY.md +0 -157
  40. python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-05-user-facing-docs-PLAN.md +0 -254
  41. python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-05-user-facing-docs-SUMMARY.md +0 -95
  42. python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-CONTEXT.md +0 -40
  43. python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-REVIEW.md +0 -240
  44. python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-VERIFICATION.md +0 -120
  45. python_docs_mcp_server-0.3.0/.planning/phases/10-whatsnew/10-CONTEXT.md +0 -40
  46. python_docs_mcp_server-0.3.0/.planning/phases/11-detect-venv/11-CONTEXT.md +0 -43
  47. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.coderabbit.yaml +0 -0
  48. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.cursorignore +0 -0
  49. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/CODEOWNERS +0 -0
  50. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/INTEGRATION-TEST.md +0 -0
  51. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/ISSUE_TEMPLATE/autonomous-agent.yml +0 -0
  52. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/PULL_REQUEST_TEMPLATE/agent.md +0 -0
  53. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/RELEASE.md +0 -0
  54. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/TEST-STRATEGY.md +0 -0
  55. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/dependabot.yml +0 -0
  56. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/AGENT-EXECUTION-PIPELINE.md +0 -0
  57. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/AGENTS.md +0 -0
  58. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/CLAUDE.md +0 -0
  59. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/CONTRIBUTING.md +0 -0
  60. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/LICENSE +0 -0
  61. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/OPENCLAW-FORGE-PROTOCOL.md +0 -0
  62. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/SECURITY.md +0 -0
  63. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/docs/architecture/ADR-001-source-adapters.md +0 -0
  64. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/docs/architecture/ADR-006-serialization.md +0 -0
  65. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/docs/architecture/YAML-TRUST-BOUNDARY.md +0 -0
  66. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/glama.json +0 -0
  67. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/__init__.py +0 -0
  68. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/__main__.py +0 -0
  69. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/app_context.py +0 -0
  70. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/cache/__init__.py +0 -0
  71. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/cache/codec.py +0 -0
  72. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/data/synonyms.yaml +0 -0
  73. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/detection.py +0 -0
  74. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/diagnostics.py +0 -0
  75. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/errors.py +0 -0
  76. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/ingestion/__init__.py +0 -0
  77. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/ingestion/cpython_versions.py +0 -0
  78. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/ingestion/inventory.py +0 -0
  79. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/ingestion/publish.py +0 -0
  80. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/ingestion/sphinx_json.py +0 -0
  81. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/models.py +0 -0
  82. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/py.typed +0 -0
  83. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/retrieval/__init__.py +0 -0
  84. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/retrieval/budget.py +0 -0
  85. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/retrieval/query.py +0 -0
  86. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/retrieval/ranker.py +0 -0
  87. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/server.py +0 -0
  88. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/services/__init__.py +0 -0
  89. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/services/cache.py +0 -0
  90. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/services/compare.py +0 -0
  91. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/services/content.py +0 -0
  92. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/services/observability.py +0 -0
  93. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/services/package_docs.py +0 -0
  94. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/services/persistent_cache.py +0 -0
  95. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/services/search.py +0 -0
  96. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/services/version.py +0 -0
  97. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/services/version_resolution.py +0 -0
  98. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/storage/__init__.py +0 -0
  99. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/storage/db.py +0 -0
  100. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/storage/schema.sql +0 -0
  101. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/__init__.py +0 -0
  102. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/cache/__init__.py +0 -0
  103. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/cache/test_codec.py +0 -0
  104. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/conftest.py +0 -0
  105. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/fixtures/retrieval_regression_cases.json +0 -0
  106. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/fixtures/sample_broken.fjson +0 -0
  107. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/fixtures/sample_library.fjson +0 -0
  108. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/fixtures/schema-get_docs-input.json +0 -0
  109. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/fixtures/schema-get_docs-output.json +0 -0
  110. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/fixtures/schema-list_versions-output.json +0 -0
  111. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/fixtures/schema-search_docs-input.json +0 -0
  112. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/fixtures/schema-search_docs-output.json +0 -0
  113. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_ci_workflows.py +0 -0
  114. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_compare_versions.py +0 -0
  115. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_compare_versions_spike.py +0 -0
  116. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_detection.py +0 -0
  117. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_doctor.py +0 -0
  118. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_ingestion.py +0 -0
  119. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_mcp_get_docs_cache_smoke.py +0 -0
  120. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_multi_version.py +0 -0
  121. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_package_docs.py +0 -0
  122. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_packaging.py +0 -0
  123. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_persistent_docs_cache.py +0 -0
  124. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_phase1_integration.py +0 -0
  125. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_publish.py +0 -0
  126. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_retrieval.py +0 -0
  127. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_retrieval_regression.py +0 -0
  128. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_schema.py +0 -0
  129. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_schema_snapshot.py +0 -0
  130. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_services.py +0 -0
  131. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_stability.py +0 -0
  132. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_stdio_hygiene.py +0 -0
  133. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_stdio_smoke.py +0 -0
  134. {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_synonyms.py +0 -0
@@ -18,10 +18,10 @@ jobs:
18
18
  name: Test (Python ${{ matrix.python-version }}, ${{ matrix.os }})
19
19
 
20
20
  steps:
21
- - uses: actions/checkout@v6
21
+ - uses: actions/checkout@v7
22
22
 
23
23
  - name: Install uv
24
- uses: astral-sh/setup-uv@v8.1.0
24
+ uses: astral-sh/setup-uv@v8.2.0
25
25
  with:
26
26
  cache-suffix: py${{ matrix.python-version }}
27
27
 
@@ -22,7 +22,7 @@ jobs:
22
22
 
23
23
  steps:
24
24
  - name: Checkout repository
25
- uses: actions/checkout@v6
25
+ uses: actions/checkout@v7
26
26
 
27
27
  - name: Initialize CodeQL
28
28
  uses: github/codeql-action/init@v4
@@ -17,10 +17,10 @@ jobs:
17
17
  python-version: ["3.13", "3.14"]
18
18
 
19
19
  steps:
20
- - uses: actions/checkout@v6
20
+ - uses: actions/checkout@v7
21
21
 
22
22
  - name: Install uv
23
- uses: astral-sh/setup-uv@v8.1.0
23
+ uses: astral-sh/setup-uv@v8.2.0
24
24
  with:
25
25
  cache-suffix: py${{ matrix.python-version }}
26
26
 
@@ -16,10 +16,10 @@ jobs:
16
16
  timeout-minutes: 15
17
17
 
18
18
  steps:
19
- - uses: actions/checkout@v6
19
+ - uses: actions/checkout@v7
20
20
 
21
21
  - name: Install uv
22
- uses: astral-sh/setup-uv@v8.1.0
22
+ uses: astral-sh/setup-uv@v8.2.0
23
23
 
24
24
  - name: Set up Python 3.13
25
25
  run: uv python install 3.13
@@ -117,7 +117,7 @@ jobs:
117
117
  contents: read
118
118
 
119
119
  steps:
120
- - uses: actions/checkout@v6
120
+ - uses: actions/checkout@v7
121
121
 
122
122
  - name: Install mcp-publisher
123
123
  run: |
@@ -21,7 +21,7 @@ jobs:
21
21
 
22
22
  steps:
23
23
  - name: Checkout repository
24
- uses: actions/checkout@v6
24
+ uses: actions/checkout@v7
25
25
  with:
26
26
  persist-credentials: false
27
27
 
@@ -20,10 +20,10 @@ jobs:
20
20
 
21
21
  steps:
22
22
  - name: Checkout repository
23
- uses: actions/checkout@v6
23
+ uses: actions/checkout@v7
24
24
 
25
25
  - name: Install uv
26
- uses: astral-sh/setup-uv@v8.1.0
26
+ uses: astral-sh/setup-uv@v8.2.0
27
27
 
28
28
  - name: Export locked dependencies
29
29
  run: |
@@ -194,6 +194,9 @@ cython_debug/
194
194
  # PyPI configuration file
195
195
  .pypirc
196
196
 
197
+ # Local planning / agent workspace
198
+ .planning/
199
+
197
200
  # Cursor
198
201
  # Keep repo-local Cursor context files tracked when present so the repository
199
202
  # can define its own indexing boundaries.
@@ -0,0 +1,9 @@
1
+ {
2
+ "mcpServers": {
3
+ "python-docs": {
4
+ "type": "stdio",
5
+ "command": "uvx",
6
+ "args": ["python-docs-mcp-server"]
7
+ }
8
+ }
9
+ }
@@ -4,6 +4,18 @@ All notable changes to `python-docs-mcp-server` are documented here.
4
4
  Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/);
5
5
  this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [0.3.1] — 2026-06-01
8
+
9
+ ### Added
10
+
11
+ - Added a checked-in `.mcp.json` project configuration for MCP clients that
12
+ support project-scoped server config. It starts the published server with
13
+ `uvx python-docs-mcp-server`.
14
+
15
+ ### Changed
16
+
17
+ - Bumped package and MCP Registry metadata to `0.3.1`.
18
+
7
19
  ## [0.3.0] — 2026-05-31
8
20
 
9
21
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-docs-mcp-server
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
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
@@ -48,6 +48,13 @@ Built for the moment your agent needs `asyncio.TaskGroup` signatures, `pathlib.P
48
48
 
49
49
  ## Why this exists
50
50
 
51
+ There is a difference between long context and usable context. Research like the
52
+ [*Lost in the Middle*](https://arxiv.org/abs/2307.03172) study (Liu et al., 2023)
53
+ found that models struggle to use relevant information buried in the middle of a
54
+ long input. Pasting an entire documentation page into the model invites that
55
+ failure. Returning the exact symbol, section, and version keeps the answer in a
56
+ short, high-signal context instead.
57
+
51
58
  Generic docs retrieval is a rough fit for Python stdlib questions:
52
59
 
53
60
  - `asyncio.TaskGroup` should resolve to the actual symbol, not a fuzzy page hit
@@ -140,6 +147,26 @@ cache. It can take several minutes.
140
147
 
141
148
  ## Configure your MCP client
142
149
 
150
+ ### Claude Code
151
+
152
+ This repository includes a project-scoped `.mcp.json` for clients that support
153
+ checked-in MCP server configuration. It points at the published package:
154
+
155
+ ```json
156
+ {
157
+ "mcpServers": {
158
+ "python-docs": {
159
+ "type": "stdio",
160
+ "command": "uvx",
161
+ "args": ["python-docs-mcp-server"]
162
+ }
163
+ }
164
+ }
165
+ ```
166
+
167
+ Build the local documentation index with the first-run command above before
168
+ expecting docs queries to return corpus-backed results.
169
+
143
170
  ### Claude Desktop
144
171
 
145
172
  Add this to your Claude Desktop configuration file:
@@ -19,6 +19,13 @@ Built for the moment your agent needs `asyncio.TaskGroup` signatures, `pathlib.P
19
19
 
20
20
  ## Why this exists
21
21
 
22
+ There is a difference between long context and usable context. Research like the
23
+ [*Lost in the Middle*](https://arxiv.org/abs/2307.03172) study (Liu et al., 2023)
24
+ found that models struggle to use relevant information buried in the middle of a
25
+ long input. Pasting an entire documentation page into the model invites that
26
+ failure. Returning the exact symbol, section, and version keeps the answer in a
27
+ short, high-signal context instead.
28
+
22
29
  Generic docs retrieval is a rough fit for Python stdlib questions:
23
30
 
24
31
  - `asyncio.TaskGroup` should resolve to the actual symbol, not a fuzzy page hit
@@ -111,6 +118,26 @@ cache. It can take several minutes.
111
118
 
112
119
  ## Configure your MCP client
113
120
 
121
+ ### Claude Code
122
+
123
+ This repository includes a project-scoped `.mcp.json` for clients that support
124
+ checked-in MCP server configuration. It points at the published package:
125
+
126
+ ```json
127
+ {
128
+ "mcpServers": {
129
+ "python-docs": {
130
+ "type": "stdio",
131
+ "command": "uvx",
132
+ "args": ["python-docs-mcp-server"]
133
+ }
134
+ }
135
+ }
136
+ ```
137
+
138
+ Build the local documentation index with the first-run command above before
139
+ expecting docs queries to return corpus-backed results.
140
+
114
141
  ### Claude Desktop
115
142
 
116
143
  Add this to your Claude Desktop configuration file:
@@ -161,6 +161,9 @@ Consolidated from prior artifacts and this consolidation.
161
161
  | 5.12 | Autonomous agents work only via the issue-and-PR flow defined in `AGENT-EXECUTION-PIPELINE.md`. Direct commits to `main` are forbidden; Vision-owned merge is required. | Agent-pipeline addition (2026-05-29) |
162
162
  | 5.13 | Forbidden-territory list in `AGENT-EXECUTION-PIPELINE.md` §2 is binding on all agents. | Agent-pipeline addition (2026-05-29) |
163
163
  | 5.14 | Every agent-targetable issue must have a per-issue context file under `.planning/agent-context/<issue-slug>.md`. | Agent-pipeline addition (2026-05-29) |
164
+ | 5.15 | *Lost in the Middle* (Liu et al., 2023, arXiv:2307.03172) is the canonical external citation for the "long context is unreliable; precise retrieval is the antidote" framing. Used as motivation only (README / positioning / launch); never presented as this project's own benchmark. | Amendment 2026-06-01 |
165
+ | 5.16 | Positioning discipline: **tokens are the business problem; bytes are an implementation detail.** Public-facing copy leads with precise retrieval, version-accuracy, and token economy. Byte-level compression (zstd cache, decision 5.7) is an engineering footnote, never a headline. Reinforces 2.4, 2.5, 5.7. | Amendment 2026-06-01 |
166
+ | 5.17 | Evidence ladder: no comparative or benchmark claim ships in public copy until the v0.5.0 public benchmark harness produces reproducible data with methodology disclosure. The v0.3.0 empirical token study (Study A) stays internal and only gates the `format="toon"` decision. | Amendment 2026-06-01 |
164
167
 
165
168
  ---
166
169
 
@@ -269,3 +272,23 @@ This roadmap is reviewed at:
269
272
  - Owner's discretion when new external information arrives (e.g., another deep-research report; a sufficiently sharp critique from the community).
270
273
 
271
274
  Out-of-cycle amendments are tracked at the bottom of this file as `## Amendment YYYY-MM-DD` sections, preserving the original text. The locked-decisions table (§5) is the authoritative current state.
275
+
276
+ ---
277
+
278
+ ## Amendment 2026-06-01
279
+
280
+ **Trigger:** Owner's discretion (§10) — advisory review of how the project frames *evidence* in public-facing copy.
281
+
282
+ This amendment records a three-layer separation of evidence that public and internal materials must respect, plus the positioning discipline that follows from it. It adds locked decisions 5.15–5.17 (see §5).
283
+
284
+ ### Three layers of evidence (do not conflate)
285
+
286
+ 1. **External citation — use now.** *Lost in the Middle* (Liu et al., 2023, arXiv:2307.03172) is research about a failure mode: models use information poorly when it is buried in a long context. It motivates the *problem* — long context is not automatically usable context — and is cited as motivation only, never as our own measurement. (Decision 5.15.)
287
+ 2. **Internal study (Study A) — gates an engineering choice.** The v0.3.0 empirical token study measures real token cost and latency after client-side rewrap (decision 5.8) and gates whether `format="toon"` ships (decisions 5.4, 5.5; ADR-006). It stays internal and produces no public comparative claim. (Decision 5.17.)
288
+ 3. **Public benchmark (Study B) — sells the project later.** The v0.5.0 public benchmark harness (§4 v0.5.0) compares this server against eligible docs MCPs and a no-MCP baseline on correctness, tokens, and latency — reproducible from a clean clone, with mandatory methodology disclosure. It is the only artifact licensed to make a comparative claim, and only once it has data. (Decision 5.17; tracked as a GitHub issue.)
289
+
290
+ ### Positioning discipline
291
+
292
+ Tokens are the business problem; bytes are an implementation detail. Public copy (README / PyPI / glama / launch) leads with precise retrieval, version-accuracy, and token economy. The zstd retrieved-docs cache (decision 5.7) is cache-at-rest only and stays an engineering footnote — it never becomes a headline selling point. (Decision 5.16.)
293
+
294
+ This discipline also supersedes the need for a separate note in the now-local-only `.planning/POSITIONING.md`: `.planning/` is no longer tracked on `main` (see `chore: ignore local planning workspace`), so the discipline lives here, in the tracked roadmap, rather than in the planning workspace.
@@ -0,0 +1,221 @@
1
+ # Public Benchmark Methodology
2
+
3
+ **Status:** Draft methodology for issue
4
+ [#63](https://github.com/ayhammouda/python-docs-mcp-server/issues/63).
5
+ Do not publish comparative claims until the harness has produced reproducible
6
+ data from this methodology.
7
+
8
+ ## Purpose
9
+
10
+ The v0.5.0 public benchmark compares `python-docs-mcp-server` with eligible
11
+ Python documentation MCPs and a no-MCP baseline on a fixed 50-question Python
12
+ documentation evaluation. The benchmark reports correctness, token cost, and
13
+ latency, with enough detail for a clean clone to reproduce the run.
14
+
15
+ This is an evidence artifact, not marketing copy. If the data is boring or
16
+ unfavorable, publish the data honestly and adjust the product claims.
17
+
18
+ ## Evidence Flow
19
+
20
+ ```mermaid
21
+ flowchart LR
22
+ Corpus[50-question corpus] --> Runner[Benchmark runner]
23
+ Competitors[Pinned MCP competitors] --> Runner
24
+ Baseline[No-MCP baseline] --> Runner
25
+ Runner --> Transcripts[Raw transcripts]
26
+ Transcripts --> Tokens[Token counting after client rewrap]
27
+ Transcripts --> Rubric[Correctness scoring]
28
+ Transcripts --> Latency[Latency summary]
29
+ Tokens --> Report[Public report]
30
+ Rubric --> Report
31
+ Latency --> Report
32
+ ```
33
+
34
+ ## Systems Under Test
35
+
36
+ The final competitor set is locked at execution time. A competitor is eligible
37
+ only if all of these are true:
38
+
39
+ - It exposes Python standard library documentation retrieval or search.
40
+ - It can be run or queried reproducibly from a clean clone.
41
+ - Its version, package, image, endpoint, or commit can be pinned.
42
+ - Its terms allow benchmark use.
43
+ - It does not require private, undocumented access.
44
+
45
+ The initial candidate matrix is:
46
+
47
+ - `python-docs-mcp-server`
48
+ - Context7
49
+ - GitMCP
50
+ - DeepWiki
51
+ - Ref.tools
52
+ - no-MCP baseline
53
+
54
+ The no-MCP baseline uses the same model and question prompts, but no retrieved
55
+ documentation context. It measures parametric model behavior, not another docs
56
+ tool.
57
+
58
+ ## Corpus Design
59
+
60
+ The corpus contains exactly 50 questions. Each question must include:
61
+
62
+ - Stable question ID.
63
+ - Category.
64
+ - Python version or version pair.
65
+ - Prompt shown to the model.
66
+ - Official-docs answer key.
67
+ - Required citations or source sections.
68
+ - Expected answer properties.
69
+ - Known ambiguity notes, if any.
70
+
71
+ Distribution:
72
+
73
+ - 15 exact-symbol questions.
74
+ - 10 concept or API-usage questions.
75
+ - 15 cross-version questions, led by `compare_versions`-style diffs.
76
+ - 5 PEP-adjacent questions where the official stdlib docs or "What's New"
77
+ pages contain the required answer.
78
+ - 5 applied questions that require selecting the right stdlib API from the
79
+ documentation.
80
+
81
+ The corpus must avoid questions whose answer requires private knowledge,
82
+ external package documentation, non-stdlib behavior, or unreleased CPython
83
+ changes.
84
+
85
+ ## Source Of Truth
86
+
87
+ Correctness is scored against official Python documentation generated from
88
+ CPython source at pinned tags. When a question concerns version behavior, the
89
+ answer key must cite the exact relevant version or version pair.
90
+
91
+ Allowed truth sources:
92
+
93
+ - CPython documentation source at pinned commit or tag.
94
+ - Generated official docs for the same Python version.
95
+ - Official "What's New" pages for PEP-adjacent behavior.
96
+
97
+ Disallowed truth sources:
98
+
99
+ - Blog posts.
100
+ - Search snippets.
101
+ - LLM-generated explanations.
102
+ - Third-party mirrors unless used only as a convenience link and verified
103
+ against CPython source.
104
+
105
+ ## Prompting Rules
106
+
107
+ Every system under test receives the same user question. The only allowed
108
+ difference is the documentation context supplied by that system.
109
+
110
+ The model prompt must require:
111
+
112
+ - A concise answer.
113
+ - Version-specific wording when the question names a version.
114
+ - No unsupported claims.
115
+ - A short citation to the retrieved section when the system provides one.
116
+
117
+ The prompt must not reveal the answer key, rubric, or expected winning system.
118
+
119
+ ## Correctness Scoring
120
+
121
+ Each answer receives one score:
122
+
123
+ - `1.0`: Correct, version-aware, and includes all required answer properties.
124
+ - `0.5`: Partially correct, but misses a required nuance, version condition, or
125
+ citation.
126
+ - `0.0`: Incorrect, unsupported, materially incomplete, or answers the wrong
127
+ version.
128
+
129
+ For public reporting, include both:
130
+
131
+ - Mean correctness score.
132
+ - Per-category correctness score.
133
+
134
+ Any answer that appears correct but lacks evidence from the supplied docs is
135
+ marked in the raw results and discussed separately. The benchmark should reward
136
+ grounded answers, not confident autocomplete.
137
+
138
+ ## Token Measurement
139
+
140
+ Token methodology follows roadmap decision 5.8 and ADR-006:
141
+
142
+ - Use Claude token counting as the primary metric.
143
+ - Measure after client-side rewrap, not only raw MCP payload bytes.
144
+ - Record raw payload tokens separately as diagnostic data.
145
+ - Report serialization latency alongside token counts.
146
+
147
+ Primary token count:
148
+
149
+ 1. Capture the MCP tool response or baseline prompt context.
150
+ 2. Pass it through the same client-side wrapping path used by the benchmark
151
+ client.
152
+ 3. Count the resulting message envelope with Claude token counting.
153
+
154
+ If a client cannot expose its exact wrapped message envelope, the report must
155
+ say so and mark that result as an approximation. Approximate counts must not be
156
+ used for headline claims.
157
+
158
+ ## Latency Measurement
159
+
160
+ Latency is wall-clock time measured per question from request dispatch to final
161
+ answer receipt.
162
+
163
+ Report:
164
+
165
+ - Median.
166
+ - p95.
167
+ - Minimum and maximum.
168
+ - Cold-run and warm-run separation where the system has a cache or index.
169
+
170
+ Index build time is not part of per-query latency. It may be reported as setup
171
+ cost in a separate section.
172
+
173
+ ## Reproducibility
174
+
175
+ The public harness must run from a clean clone with one command after dependency
176
+ installation. It must write:
177
+
178
+ - Competitor manifest with pinned versions.
179
+ - Corpus file.
180
+ - Raw transcripts.
181
+ - Raw scoring records.
182
+ - Token-count records.
183
+ - Latency records.
184
+ - Summary report.
185
+
186
+ Result files must include enough metadata to rerun or audit them:
187
+
188
+ - Repository commit.
189
+ - Python version.
190
+ - Operating system.
191
+ - Model name and provider.
192
+ - MCP client or adapter version.
193
+ - Competitor versions.
194
+ - Timestamp.
195
+
196
+ ## Honesty Rules
197
+
198
+ - No comparative claim enters README, PyPI, launch copy, or social posts before
199
+ public results exist.
200
+ - Do not drop failed systems silently. If a competitor cannot run, report the
201
+ failure reason and exclude it from scored comparisons.
202
+ - Do not change the corpus after seeing results unless the change is documented
203
+ and the whole benchmark is rerun.
204
+ - Do not tune prompts per competitor.
205
+ - Do not report approximate token counts as exact.
206
+
207
+ ## Harness Work Packages
208
+
209
+ Once this methodology is accepted, the implementation can be split into smaller
210
+ agent-ready issues:
211
+
212
+ 1. Corpus schema and fixture loader.
213
+ 2. Baseline runner and transcript format.
214
+ 3. `python-docs-mcp-server` runner.
215
+ 4. Competitor manifest and adapter skeletons.
216
+ 5. Correctness scorer with manual-adjudication hooks.
217
+ 6. Claude token-count integration after client rewrap.
218
+ 7. Latency recorder and report generator.
219
+
220
+ Each work package should reference this methodology and use `Refs #63`, not
221
+ `Closes #63`, until the full benchmark has produced public data.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "python-docs-mcp-server"
7
- version = "0.3.0"
7
+ version = "0.3.1"
8
8
  description = "The canonical Python stdlib oracle for AI coding agents — exact symbols, exact sections, exact versions, offline, always free, always MIT, token-frugal."
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -8,13 +8,13 @@
8
8
  "url": "https://github.com/ayhammouda/python-docs-mcp-server",
9
9
  "source": "github"
10
10
  },
11
- "version": "0.3.0",
11
+ "version": "0.3.1",
12
12
  "packages": [
13
13
  {
14
14
  "registryType": "pypi",
15
15
  "registryBaseUrl": "https://pypi.org",
16
16
  "identifier": "python-docs-mcp-server",
17
- "version": "0.3.0",
17
+ "version": "0.3.1",
18
18
  "runtimeHint": "uvx",
19
19
  "transport": {
20
20
  "type": "stdio"