fix(packaging): publish a README on PyPI and modernise project metadata - #52
Merged
Conversation
0.6.1's PyPI page rendered an empty body. pyproject.toml declared no `readme`,
so the wheel carried a zero-length long description. Package metadata cannot be
edited on PyPI and published files are immutable, so fixing it requires a
release — that is the only reason 0.6.2 exists.
- readme = "README.md": long description goes from 0 to ~27 KB
- make all 7 relative README links absolute. PyPI resolves relative links
against pypi.org, so [LICENSE](LICENSE), [CHANGELOG.md](CHANGELOG.md) and
friends would have 404'd. Includes the license badge's link target, which
the plain-text pass missed.
- rewrite the summary: the old one named a single MCP client and did not say
what the server does
- migrate `license` to the PEP 639 SPDX expression, dropping the legacy
{text = "..."} table and the deprecated License :: OSI Approved :: classifier
- add Changelog, Documentation, Security Policy and Container Image links,
the System Administrators audience, and sftp/devops/automation keywords
Verified with `twine check` (PASSED on both artifacts) and by reading the built
wheel's METADATA: License-Expression: MPL-2.0, 26936-char description, zero
relative links remaining.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The problem
https://pypi.org/project/blc-ssh-mcp/ renders an empty body — just the name and a one-line summary.
pyproject.tomldeclared noreadme, so the built wheel carried a zero-length long description:Package metadata cannot be edited on PyPI and published files are immutable, so correcting this requires a release. That is the only reason 0.6.2 exists.
Changes
readme = "README.md"— long description goes from 0 to 26,936 chars.All 7 relative README links made absolute. PyPI resolves relative Markdown links against
pypi.org, not the repo, so every one of these would have 404'd for users reading the project page:[LICENSE](LICENSE)·[CHANGELOG.md](CHANGELOG.md)×2 ·[SECURITY.md](SECURITY.md)·[CONTRIBUTING.md](CONTRIBUTING.md)·[compose.yaml](compose.yaml)·config/servers.example.tomlAn 8th was caught only by re-checking the built artifact: the license badge's link target (
](LICENSE)at the end of an image link), which the plain-text replacement pass missed.Summary rewritten. Old: "SSH MCP server for managing infrastructure via Claude Code" — names a single MCP client and never says what the server does. New: "MCP server giving AI assistants SSH access to run commands, transfer files, and manage server fleets".
licensemigrated to the PEP 639 SPDX expression.license = "MPL-2.0"+license-files = ["LICENSE"]replaces the deprecated{text = "..."}table, and the correspondingly deprecatedLicense :: OSI Approved ::classifier is dropped. Published metadata now carriesLicense-Expression: MPL-2.0;License-File: LICENSEis unchanged.More discoverable on PyPI: Changelog, Documentation, Security Policy and Container Image links; the
System Administratorsaudience;sftp,devops,automationkeywords.Verification
twine check— the tool that specifically validates long-description rendering for PyPI:Read back from the built wheel's
METADATA:pytest— 718 passedruff format --check/ruff check src/ tests//mypy src//bandit -r src/ -q/pip-audit— cleangitleaksscoped toorigin/main..HEAD— no leaksNote
No code changes —
src/ssh_mcp/is touched only by the version bump. The trusted publisher is already configured, so taggingv0.6.2after merge publishes without further setup.Not done here (flagging, not fixing)
Provides-Extra: devis published in the metadata, sopip install blc-ssh-mcp[dev]advertises pytest/ruff/bandit to end users. Moving dev dependencies to PEP 735[dependency-groups]would keep them out of the distribution entirely, but it changesuv sync --extra devacross both workflows and the determinism tests that assert on it — worth its own PR.