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.
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/workflows/ci.yml +2 -2
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/workflows/codeql.yml +1 -1
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/workflows/e2e.yml +2 -2
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/workflows/release.yml +3 -3
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/workflows/scorecard.yml +1 -1
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/workflows/security.yml +2 -2
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.gitignore +3 -0
- python_docs_mcp_server-0.3.1/.mcp.json +9 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/CHANGELOG.md +12 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/PKG-INFO +28 -1
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/README.md +27 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/STRATEGIC-ROADMAP-2026-05-29.md +23 -0
- python_docs_mcp_server-0.3.1/docs/benchmarks/PUBLIC-BENCHMARK-METHODOLOGY.md +221 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/pyproject.toml +1 -1
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/server.json +2 -2
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/uv.lock +88 -91
- python_docs_mcp_server-0.3.0/.planning/POSITIONING.md +0 -20
- python_docs_mcp_server-0.3.0/.planning/ROADMAP.md +0 -23
- python_docs_mcp_server-0.3.0/.planning/agent-context/adr-001-source-adapters.md +0 -49
- python_docs_mcp_server-0.3.0/.planning/agent-context/adr-006-serialization.md +0 -55
- python_docs_mcp_server-0.3.0/.planning/agent-context/cpython-source-sha-pin.md +0 -78
- python_docs_mcp_server-0.3.0/.planning/agent-context/pyyaml-safe-loader-audit.md +0 -52
- python_docs_mcp_server-0.3.0/.planning/agent-context/readme-glama-six-tool-refresh.md +0 -54
- python_docs_mcp_server-0.3.0/.planning/agent-context/zstd-cache-codec.md +0 -71
- python_docs_mcp_server-0.3.0/.planning/issues/v0.3.0/00-README.md +0 -63
- python_docs_mcp_server-0.3.0/.planning/issues/v0.3.0/01-zstd-cache-codec.md +0 -83
- python_docs_mcp_server-0.3.0/.planning/issues/v0.3.0/02-readme-glama-six-tool-refresh.md +0 -59
- python_docs_mcp_server-0.3.0/.planning/issues/v0.3.0/03-pyyaml-safe-loader-audit.md +0 -50
- python_docs_mcp_server-0.3.0/.planning/issues/v0.3.0/04-adr-006-serialization.md +0 -91
- python_docs_mcp_server-0.3.0/.planning/issues/v0.3.0/05-adr-001-source-adapters.md +0 -76
- python_docs_mcp_server-0.3.0/.planning/issues/v0.3.0/06-cpython-source-sha-pin.md +0 -61
- python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-01-data-shape-spike-PLAN.md +0 -205
- python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-01-data-shape-spike-SUMMARY.md +0 -181
- python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-02-result-models-PLAN.md +0 -183
- python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-02-result-models-SUMMARY.md +0 -97
- python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-03-compare-service-PLAN.md +0 -403
- python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-03-compare-service-SUMMARY.md +0 -158
- python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-04-mcp-tool-wiring-PLAN.md +0 -405
- python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-04-mcp-tool-wiring-SUMMARY.md +0 -157
- python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-05-user-facing-docs-PLAN.md +0 -254
- python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-05-user-facing-docs-SUMMARY.md +0 -95
- python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-CONTEXT.md +0 -40
- python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-REVIEW.md +0 -240
- python_docs_mcp_server-0.3.0/.planning/phases/09-compare-versions/09-VERIFICATION.md +0 -120
- python_docs_mcp_server-0.3.0/.planning/phases/10-whatsnew/10-CONTEXT.md +0 -40
- python_docs_mcp_server-0.3.0/.planning/phases/11-detect-venv/11-CONTEXT.md +0 -43
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.coderabbit.yaml +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.cursorignore +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/CODEOWNERS +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/INTEGRATION-TEST.md +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/ISSUE_TEMPLATE/autonomous-agent.yml +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/PULL_REQUEST_TEMPLATE/agent.md +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/RELEASE.md +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/TEST-STRATEGY.md +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/dependabot.yml +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/AGENT-EXECUTION-PIPELINE.md +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/AGENTS.md +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/CLAUDE.md +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/CONTRIBUTING.md +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/LICENSE +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/OPENCLAW-FORGE-PROTOCOL.md +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/SECURITY.md +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/docs/architecture/ADR-001-source-adapters.md +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/docs/architecture/ADR-006-serialization.md +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/docs/architecture/YAML-TRUST-BOUNDARY.md +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/glama.json +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/__init__.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/__main__.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/app_context.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/cache/__init__.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/cache/codec.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/data/synonyms.yaml +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/detection.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/diagnostics.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/errors.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/ingestion/__init__.py +0 -0
- {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
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/ingestion/inventory.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/ingestion/publish.py +0 -0
- {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
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/models.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/py.typed +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/retrieval/__init__.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/retrieval/budget.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/retrieval/query.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/retrieval/ranker.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/server.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/services/__init__.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/services/cache.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/services/compare.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/services/content.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/services/observability.py +0 -0
- {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
- {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
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/services/search.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/services/version.py +0 -0
- {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
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/storage/__init__.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/storage/db.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/src/mcp_server_python_docs/storage/schema.sql +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/__init__.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/cache/__init__.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/cache/test_codec.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/conftest.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/fixtures/retrieval_regression_cases.json +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/fixtures/sample_broken.fjson +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/fixtures/sample_library.fjson +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/fixtures/schema-get_docs-input.json +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/fixtures/schema-get_docs-output.json +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/fixtures/schema-list_versions-output.json +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/fixtures/schema-search_docs-input.json +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/fixtures/schema-search_docs-output.json +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_ci_workflows.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_compare_versions.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_compare_versions_spike.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_detection.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_doctor.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_ingestion.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_mcp_get_docs_cache_smoke.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_multi_version.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_package_docs.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_packaging.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_persistent_docs_cache.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_phase1_integration.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_publish.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_retrieval.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_retrieval_regression.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_schema.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_schema_snapshot.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_services.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_stability.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_stdio_hygiene.py +0 -0
- {python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/tests/test_stdio_smoke.py +0 -0
- {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@
|
|
21
|
+
- uses: actions/checkout@v7
|
|
22
22
|
|
|
23
23
|
- name: Install uv
|
|
24
|
-
uses: astral-sh/setup-uv@v8.
|
|
24
|
+
uses: astral-sh/setup-uv@v8.2.0
|
|
25
25
|
with:
|
|
26
26
|
cache-suffix: py${{ matrix.python-version }}
|
|
27
27
|
|
|
@@ -17,10 +17,10 @@ jobs:
|
|
|
17
17
|
python-version: ["3.13", "3.14"]
|
|
18
18
|
|
|
19
19
|
steps:
|
|
20
|
-
- uses: actions/checkout@
|
|
20
|
+
- uses: actions/checkout@v7
|
|
21
21
|
|
|
22
22
|
- name: Install uv
|
|
23
|
-
uses: astral-sh/setup-uv@v8.
|
|
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@
|
|
19
|
+
- uses: actions/checkout@v7
|
|
20
20
|
|
|
21
21
|
- name: Install uv
|
|
22
|
-
uses: astral-sh/setup-uv@v8.
|
|
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@
|
|
120
|
+
- uses: actions/checkout@v7
|
|
121
121
|
|
|
122
122
|
- name: Install mcp-publisher
|
|
123
123
|
run: |
|
{python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/.github/workflows/security.yml
RENAMED
|
@@ -20,10 +20,10 @@ jobs:
|
|
|
20
20
|
|
|
21
21
|
steps:
|
|
22
22
|
- name: Checkout repository
|
|
23
|
-
uses: actions/checkout@
|
|
23
|
+
uses: actions/checkout@v7
|
|
24
24
|
|
|
25
25
|
- name: Install uv
|
|
26
|
-
uses: astral-sh/setup-uv@v8.
|
|
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.
|
|
@@ -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.
|
|
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:
|
{python_docs_mcp_server-0.3.0 → python_docs_mcp_server-0.3.1}/STRATEGIC-ROADMAP-2026-05-29.md
RENAMED
|
@@ -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.
|
|
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.
|
|
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.
|
|
17
|
+
"version": "0.3.1",
|
|
18
18
|
"runtimeHint": "uvx",
|
|
19
19
|
"transport": {
|
|
20
20
|
"type": "stdio"
|