fix(packaging)!: rename PyPI distribution to blc-ssh-mcp and correct install docs - #51
Merged
Conversation
…install docs The name "ssh-mcp" on PyPI belongs to an unrelated project by a different author (czyhandsome, MIT, last release 0.1.4 in June 2025). This repository has never owned it, and PyPI names are globally unique and first-come, so no trusted-publisher configuration could ever have made 0.6.0 publishable — the upload is rejected outright. The user-facing consequence was a documentation defect with a security dimension: README instructed `uvx ssh-mcp`, `pip install ssh-mcp` and `claude mcp add ssh-mcp -- uvx ssh-mcp`, all of which install that stranger's package. Being also an SSH tool, the substitution was not obvious. - distribution renamed to blc-ssh-mcp; import package stays ssh_mcp, the container image stays ghcr.io/blackaxgit/ssh-mcp, config paths and the SSH_MCP_ env prefix are unchanged - add a blc-ssh-mcp console script so `uvx blc-ssh-mcp` resolves; keep ssh-mcp as an alias for the Dockerfile HEALTHCHECK and release.yml's smoke test - pin [tool.hatch.build.targets.wheel] packages: hatchling derives the package directory from the distribution name, so the wheel build failed outright after the rename while the sdist still succeeded - fix every install instruction, including the two Claude Desktop JSON examples whose "args": ["ssh-mcp"] form is easy to miss - document the migration for anyone who installed the wrong package Verified by building and installing the wheel in a clean venv: METADATA Name is blc-ssh-mcp, both console scripts run, and the import package is ssh_mcp.
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.
Why the 0.6.0 PyPI publish could never have worked
The name
ssh-mcpon PyPI belongs to an unrelated project — authorczyhandsome, MIT-licensed, "SSH MCP - tools for remote SSH operations for debugging", last release 0.1.4 in June 2025. This repository has never owned it. PyPI names are globally unique and first-come, so no trusted-publisher configuration could have fixed theinvalid-publisherfailure — an upload under that name is rejected outright. That is also why "Your projects" on PyPI showed nothing.The actual defect this exposes
README.mdinstructed users to run:All three install that stranger's package. Because it is also an SSH tool, the substitution is not obvious. This PR fixes every install instruction — including the two Claude Desktop JSON examples whose
"args": ["ssh-mcp"]form a plainuvx ssh-mcpgrep does not catch.What changes, and what deliberately does not
ssh-mcp(not ours)blc-ssh-mcpssh_mcpssh_mcp(unchanged)ghcr.io/blackaxgit/ssh-mcp~/.config/ssh-mcp/,SSH_MCP_ssh-mcpblc-ssh-mcp+ssh-mcpaliasThe
ssh-mcpconsole script is retained deliberately: the DockerfileHEALTHCHECKandrelease.yml's artifact smoke test both invoke it, and existing installs have it onPATH.A build failure the rename introduced, caught before CI
[tool.hatch.build.targets.wheel] packages = ["src/ssh_mcp"]is now required. Hatchling derives the package directory from the distribution name, so after the rename it looked forsrc/blc_ssh_mcp, found nothing, and the wheel build failed outright — while the sdist still built fine, so a partial build looks deceptively healthy:Verification
Built and installed the wheel in a clean venv — not just a metadata read:
pytest— 717 passedruff format --check/ruff check src/ tests//mypy src//bandit -r src/ -q/pip-audit— cleangitleaksscoped toorigin/main..HEAD— no leaksuv.lockdiff is the project entry rename only (51/51); no dependency resolution changedMerge order — please read
The 0.6.1 CHANGELOG entry credits the
github-releasedecoupling fix, which lives in #50. Merge #50 first, then this PR, so 0.6.1 is cut from amainthat actually contains it. This branch was cut before #50 and does not include it.Still requires operator action
Create a pending publisher (account-level, since the project will not exist until first upload) at https://pypi.org/manage/account/publishing/:
blc-ssh-mcpblackaxgitssh-mcprelease.ymlpypiA pending publisher does not reserve the name — configure it and tag promptly. Also worth adding required reviewers to the
pypienvironment: it was auto-created by the 0.6.0 run with no protection rules, so the reviewer gate described inAGENTS.mddoes not currently exist.