python-mcp-bootstrap 0.1.3__tar.gz → 0.1.4__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 (34) hide show
  1. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/CHANGELOG.md +14 -0
  2. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/CONTRIBUTING.md +8 -3
  3. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/PKG-INFO +17 -7
  4. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/README.md +14 -6
  5. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/docs/integration.md +2 -2
  6. python_mcp_bootstrap-0.1.4/docs/releases/0.1.4.md +60 -0
  7. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/pyproject.toml +3 -1
  8. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/src/python_mcp_bootstrap/__init__.py +1 -1
  9. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/tests/test_release_check.py +10 -10
  10. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/tests/test_vendor.py +2 -2
  11. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/.gitignore +0 -0
  12. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/LICENSE +0 -0
  13. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/SECURITY.md +0 -0
  14. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/docs/contract.md +0 -0
  15. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/docs/releases/0.1.0.md +0 -0
  16. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/docs/releases/0.1.1.md +0 -0
  17. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/docs/releases/0.1.2.md +0 -0
  18. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/docs/releases/0.1.3.md +0 -0
  19. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/examples/README.md +0 -0
  20. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/examples/example_mcp/__init__.py +0 -0
  21. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/examples/first_run.py +0 -0
  22. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/examples/pyproject.toml +0 -0
  23. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/scripts/__init__.py +0 -0
  24. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/scripts/release_check.py +0 -0
  25. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/scripts/vendor.py +0 -0
  26. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/src/python_mcp_bootstrap/__main__.py +0 -0
  27. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/src/python_mcp_bootstrap/cli.py +0 -0
  28. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/src/python_mcp_bootstrap/core.py +0 -0
  29. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/src/python_mcp_bootstrap/py.typed +0 -0
  30. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/tests/test_bootstrap.py +0 -0
  31. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/tests/test_cli.py +0 -0
  32. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/tests/test_core.py +0 -0
  33. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/tests/test_examples.py +0 -0
  34. {python_mcp_bootstrap-0.1.3 → python_mcp_bootstrap-0.1.4}/tests/test_package.py +0 -0
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.4 — 2026-11-04
4
+
5
+ - Correct the PyPI project page. PyPI renders the README captured when the
6
+ artifacts were built, and the 0.1.3 build predated the package being
7
+ published, so its page still said the project was "not published on PyPI"
8
+ and that CI was advisory. This release ships the current README. `core.py`
9
+ is unchanged.
10
+ - Pin every GitHub Action used by `ci`, `release-gate`, and `publish` to a
11
+ commit SHA instead of a mutable tag or branch. The publish action runs with
12
+ `id-token: write`, so a moved ref could mint a PyPI token.
13
+ - Add `Changelog` and `Documentation` project URLs.
14
+ - Note for the record: 0.1.3 reached PyPI after its tag was cut, so the 0.1.3
15
+ release notes describe the state before that publication.
16
+
3
17
  ## 0.1.3 — 2026-11-04
4
18
 
5
19
  - Restore the single handoff that 0.1.2 removed. 0.1.2 stopped exec'ing on the
@@ -36,9 +36,14 @@ python scripts/vendor.py --target examples --dest _vendor/python_mcp_bootstrap.p
36
36
 
37
37
  ## CI status
38
38
 
39
- CI is advisory for now: there is no branch protection and there are no
40
- required status checks. Check the matrix before merging; a pending cell is not
41
- green. A green tag run is the strongest evidence for a release.
39
+ `main` is protected. The wheel/release gate, the Python 3.12 import job, and
40
+ the vendored example run are required status checks before a pull request
41
+ merges, and force-pushes and branch deletions are blocked.
42
+
43
+ The 3.14/3.15 matrix runs alongside those required jobs, but it is not a
44
+ required check, so read the run rather than the badge: a queued macOS or
45
+ Windows cell is not green. A green tag run is the strongest evidence for a
46
+ release.
42
47
 
43
48
  ## Rules
44
49
 
@@ -1,8 +1,10 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: python-mcp-bootstrap
3
- Version: 0.1.3
3
+ Version: 0.1.4
4
4
  Summary: Pre-install Python runtime bootstrap for MCP applications.
5
5
  Project-URL: Repository, https://github.com/4zhmv6zvj2-afk/python-mcp-bootstrap
6
+ Project-URL: Changelog, https://github.com/4zhmv6zvj2-afk/python-mcp-bootstrap/blob/main/CHANGELOG.md
7
+ Project-URL: Documentation, https://github.com/4zhmv6zvj2-afk/python-mcp-bootstrap/blob/main/docs/contract.md
6
8
  Author-email: Ron <4zhmv6zvj2-afk@users.noreply.github.com>
7
9
  License-Expression: MIT
8
10
  License-File: LICENSE
@@ -25,6 +27,8 @@ Description-Content-Type: text/markdown
25
27
 
26
28
  # python-mcp-bootstrap
27
29
 
30
+ [![ci](https://github.com/4zhmv6zvj2-afk/python-mcp-bootstrap/actions/workflows/ci.yml/badge.svg)](https://github.com/4zhmv6zvj2-afk/python-mcp-bootstrap/actions/workflows/ci.yml)
31
+
28
32
  A small setup helper for Python apps that use MCP.
29
33
 
30
34
  MCP (Model Context Protocol) is a way for AI assistants to use tools and data.
@@ -40,7 +44,6 @@ no runtime dependency on the MCP SDK and never imports one.
40
44
  it. If you are a developer adding it to an app, jump to
41
45
  [For developers](#for-developers).
42
46
 
43
-
44
47
  ## Do I need this?
45
48
 
46
49
  - If an app's setup tells you to run `python first_run.py`, that script uses
@@ -85,10 +88,15 @@ python -m python_mcp_bootstrap --check
85
88
  python -m python_mcp_bootstrap --version
86
89
  ```
87
90
 
88
- Distribution is GitHub Releases only: install the wheel or sdist from the
91
+ Install from PyPI:
92
+
93
+ ```bash
94
+ python -m pip install python-mcp-bootstrap
95
+ ```
96
+
97
+ Each release also attaches the wheel, the sdist, and `SHA256SUMS` to the
89
98
  [releases page](https://github.com/4zhmv6zvj2-afk/python-mcp-bootstrap/releases).
90
- This project is **not published on PyPI**, so `pip install python-mcp-bootstrap`
91
- does not resolve.
99
+ Both are built from the same tagged tree, so their digests match.
92
100
 
93
101
  Use `BootstrapSpec` and `bootstrap()` from an app's first-run wrapper:
94
102
 
@@ -183,8 +191,10 @@ python -m build
183
191
 
184
192
  CI targets Python 3.14.10 and 3.15.2 on Ubuntu, macOS, and Windows, plus a 3.12
185
193
  compatibility job, a wheel/release gate, and the vendored example first run.
186
- CI is advisory for now (no required status checks); check the current matrix
187
- before merging, and treat a pending cell as not green.
194
+ `main` is protected: the release gate, the 3.12 job, and the vendored example
195
+ run are required before a merge, and force-pushes and deletions are blocked.
196
+ The OS matrix runs alongside them, so read the run rather than the badge — a
197
+ queued cell is not green.
188
198
 
189
199
  ## Who maintains this
190
200
 
@@ -1,5 +1,7 @@
1
1
  # python-mcp-bootstrap
2
2
 
3
+ [![ci](https://github.com/4zhmv6zvj2-afk/python-mcp-bootstrap/actions/workflows/ci.yml/badge.svg)](https://github.com/4zhmv6zvj2-afk/python-mcp-bootstrap/actions/workflows/ci.yml)
4
+
3
5
  A small setup helper for Python apps that use MCP.
4
6
 
5
7
  MCP (Model Context Protocol) is a way for AI assistants to use tools and data.
@@ -15,7 +17,6 @@ no runtime dependency on the MCP SDK and never imports one.
15
17
  it. If you are a developer adding it to an app, jump to
16
18
  [For developers](#for-developers).
17
19
 
18
-
19
20
  ## Do I need this?
20
21
 
21
22
  - If an app's setup tells you to run `python first_run.py`, that script uses
@@ -60,10 +61,15 @@ python -m python_mcp_bootstrap --check
60
61
  python -m python_mcp_bootstrap --version
61
62
  ```
62
63
 
63
- Distribution is GitHub Releases only: install the wheel or sdist from the
64
+ Install from PyPI:
65
+
66
+ ```bash
67
+ python -m pip install python-mcp-bootstrap
68
+ ```
69
+
70
+ Each release also attaches the wheel, the sdist, and `SHA256SUMS` to the
64
71
  [releases page](https://github.com/4zhmv6zvj2-afk/python-mcp-bootstrap/releases).
65
- This project is **not published on PyPI**, so `pip install python-mcp-bootstrap`
66
- does not resolve.
72
+ Both are built from the same tagged tree, so their digests match.
67
73
 
68
74
  Use `BootstrapSpec` and `bootstrap()` from an app's first-run wrapper:
69
75
 
@@ -158,8 +164,10 @@ python -m build
158
164
 
159
165
  CI targets Python 3.14.10 and 3.15.2 on Ubuntu, macOS, and Windows, plus a 3.12
160
166
  compatibility job, a wheel/release gate, and the vendored example first run.
161
- CI is advisory for now (no required status checks); check the current matrix
162
- before merging, and treat a pending cell as not green.
167
+ `main` is protected: the release gate, the 3.12 job, and the vendored example
168
+ run are required before a merge, and force-pushes and deletions are blocked.
169
+ The OS matrix runs alongside them, so read the run rather than the badge — a
170
+ queued cell is not green.
163
171
 
164
172
  ## Who maintains this
165
173
 
@@ -24,8 +24,8 @@ consumer/
24
24
  ```json
25
25
  {
26
26
  "name": "python-mcp-bootstrap",
27
- "version": "0.1.3",
28
- "tag": "v0.1.3",
27
+ "version": "0.1.4",
28
+ "tag": "v0.1.4",
29
29
  "commit": "<full commit>",
30
30
  "file": "python_mcp_bootstrap.py",
31
31
  "sha256": "<sha256 of the vendored file>"
@@ -0,0 +1,60 @@
1
+ # python-mcp-bootstrap v0.1.4
2
+
3
+ A packaging correction. `src/python_mcp_bootstrap/core.py` is unchanged from
4
+ v0.1.3; there is no behaviour change and nothing to migrate.
5
+
6
+ ## Fixed
7
+
8
+ - **The PyPI project page now describes the project accurately.** PyPI renders
9
+ the README captured when the uploaded artifacts were built. The v0.1.3 build
10
+ happened before the package was published, so its page still said the project
11
+ was "not published on PyPI" and that CI was advisory. PyPI metadata is
12
+ immutable per upload, so the only way to correct the page is a new version;
13
+ this release ships the current README.
14
+ - **GitHub Actions are pinned to commit SHAs** in `ci`, `release-gate`, and
15
+ `publish`, instead of mutable tags and branches. The publish action runs with
16
+ `id-token: write` and can mint a PyPI token, so a moved ref was the sharpest
17
+ supply-chain edge in the repository.
18
+ - `Changelog` and `Documentation` project URLs were added to the package
19
+ metadata.
20
+
21
+ ## Honest limits
22
+
23
+ - The v0.1.3 page on PyPI stays wrong permanently. Only 0.1.4 and later render
24
+ the corrected README. v0.1.3 remains installable and its code is identical to
25
+ 0.1.4 apart from packaging metadata.
26
+ - Pinning actions to SHAs means updates are manual. Without Dependabot version
27
+ updates, the pins will drift from the actions' releases; that is the price of
28
+ not trusting a mutable ref.
29
+
30
+ ## Install and verify
31
+
32
+ ```bash
33
+ python -m pip install python-mcp-bootstrap==0.1.4
34
+ python -m python_mcp_bootstrap --check
35
+ ```
36
+
37
+ ## Vendor into a consumer
38
+
39
+ ```bash
40
+ python scripts/vendor.py \
41
+ --target /path/to/consumer \
42
+ --dest src/example/_vendor/python_mcp_bootstrap.py
43
+ ```
44
+
45
+ `core.py` did not change, so an existing v0.1.3 vendored copy stays
46
+ byte-identical. Re-vendoring to 0.1.4 only updates the manifest.
47
+
48
+ ## Release integrity
49
+
50
+ - v0.1.4 is an annotated tag. v0.1.3, v0.1.2, v0.1.1, and v0.1.0 stay in place
51
+ as history.
52
+ - The wheel and sdist are attached to this GitHub release and published to PyPI
53
+ by the OIDC workflow; `dist/` stays gitignored.
54
+ - Tags are unsigned for now. An unsigned tag is not a signature; verify the
55
+ artifacts by digest.
56
+
57
+ ## Artifacts
58
+
59
+ - `python_mcp_bootstrap-0.1.4-py3-none-any.whl`
60
+ - `python_mcp_bootstrap-0.1.4.tar.gz`
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "python-mcp-bootstrap"
7
- version = "0.1.3"
7
+ version = "0.1.4"
8
8
  description = "Pre-install Python runtime bootstrap for MCP applications."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.14"
@@ -39,6 +39,8 @@ python-mcp-bootstrap = "python_mcp_bootstrap.cli:main"
39
39
 
40
40
  [project.urls]
41
41
  Repository = "https://github.com/4zhmv6zvj2-afk/python-mcp-bootstrap"
42
+ Changelog = "https://github.com/4zhmv6zvj2-afk/python-mcp-bootstrap/blob/main/CHANGELOG.md"
43
+ Documentation = "https://github.com/4zhmv6zvj2-afk/python-mcp-bootstrap/blob/main/docs/contract.md"
42
44
 
43
45
  [tool.hatch.build.targets.wheel]
44
46
  packages = ["src/python_mcp_bootstrap"]
@@ -28,7 +28,7 @@ from .core import (
28
28
  version_tuple,
29
29
  )
30
30
 
31
- __version__ = "0.1.3"
31
+ __version__ = "0.1.4"
32
32
 
33
33
  __all__ = [
34
34
  "CARD",
@@ -36,7 +36,7 @@ def _local_tag_is_annotated(tag: str) -> bool:
36
36
 
37
37
 
38
38
  def test_package_version_matches_the_release() -> None:
39
- assert package_version(ROOT) == "0.1.3"
39
+ assert package_version(ROOT) == "0.1.4"
40
40
 
41
41
 
42
42
  def test_current_tree_is_release_ready() -> None:
@@ -44,12 +44,12 @@ def test_current_tree_is_release_ready() -> None:
44
44
 
45
45
 
46
46
  @pytest.mark.skipif(
47
- not _local_tag_is_annotated("v0.1.3"),
48
- reason="local v0.1.3 is absent or not annotated; CI restores it after checkout",
47
+ not _local_tag_is_annotated("v0.1.4"),
48
+ reason="local v0.1.4 is absent or not annotated; CI restores it after checkout",
49
49
  )
50
50
  def test_matching_release_tag_passes(monkeypatch: pytest.MonkeyPatch) -> None:
51
51
  monkeypatch.setattr(release_check, "_release_asset_errors", lambda *_args: [])
52
- assert check(ROOT, allow_dirty=True, tag="v0.1.3") == []
52
+ assert check(ROOT, allow_dirty=True, tag="v0.1.4") == []
53
53
 
54
54
 
55
55
  def test_mismatched_release_tag_fails() -> None:
@@ -83,7 +83,7 @@ def test_release_asset_check_skips_without_gh(
83
83
  monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str]
84
84
  ) -> None:
85
85
  monkeypatch.setattr(release_check.shutil, "which", lambda _name: None)
86
- assert _release_asset_errors(ROOT, "v0.1.3", "0.1.3") == []
86
+ assert _release_asset_errors(ROOT, "v0.1.4", "0.1.4") == []
87
87
  assert "skipping" in capsys.readouterr().err
88
88
 
89
89
 
@@ -91,12 +91,12 @@ def test_release_asset_check_reports_missing_assets(monkeypatch: pytest.MonkeyPa
91
91
  monkeypatch.setattr(release_check.shutil, "which", lambda _name: "/fake/gh")
92
92
  result = SimpleNamespace(
93
93
  returncode=0,
94
- stdout="python_mcp_bootstrap-0.1.3-py3-none-any.whl\nSHA256SUMS\n",
94
+ stdout="python_mcp_bootstrap-0.1.4-py3-none-any.whl\nSHA256SUMS\n",
95
95
  stderr="",
96
96
  )
97
97
  monkeypatch.setattr(release_check.subprocess, "run", lambda *_args, **_kwargs: result)
98
98
 
99
- errors = _release_asset_errors(ROOT, "v0.1.3", "0.1.3")
99
+ errors = _release_asset_errors(ROOT, "v0.1.4", "0.1.4")
100
100
  assert any("tar.gz" in error for error in errors)
101
101
 
102
102
 
@@ -105,15 +105,15 @@ def test_release_asset_check_accepts_full_assets(monkeypatch: pytest.MonkeyPatch
105
105
  result = SimpleNamespace(
106
106
  returncode=0,
107
107
  stdout=(
108
- "python_mcp_bootstrap-0.1.3-py3-none-any.whl\n"
109
- "python_mcp_bootstrap-0.1.3.tar.gz\n"
108
+ "python_mcp_bootstrap-0.1.4-py3-none-any.whl\n"
109
+ "python_mcp_bootstrap-0.1.4.tar.gz\n"
110
110
  "SHA256SUMS\n"
111
111
  ),
112
112
  stderr="",
113
113
  )
114
114
  monkeypatch.setattr(release_check.subprocess, "run", lambda *_args, **_kwargs: result)
115
115
 
116
- assert _release_asset_errors(ROOT, "v0.1.3", "0.1.3") == []
116
+ assert _release_asset_errors(ROOT, "v0.1.4", "0.1.4") == []
117
117
 
118
118
 
119
119
  def test_check_requires_a_notes_file(tmp_path: Path) -> None:
@@ -23,10 +23,10 @@ def test_vendor_writes_core_and_manifest(tmp_path: Path) -> None:
23
23
  assert manifest_path.is_file()
24
24
  manifest = json.loads(manifest_path.read_text(encoding="utf-8"))
25
25
  assert manifest["name"] == "python-mcp-bootstrap"
26
- assert manifest["version"] == "0.1.3"
26
+ assert manifest["version"] == "0.1.4"
27
27
  assert manifest["file"] == dest.name
28
28
  assert manifest["sha256"] == sha256(dest)
29
- assert manifest["tag"] == "v0.1.3"
29
+ assert manifest["tag"] == "v0.1.4"
30
30
  assert manifest["source"].startswith("https://github.com/")
31
31
  assert len(manifest["commit"]) == 40
32
32