chore(deps): raise CVE floors for httplib2 + mcp to clear pip-audit - #255
Merged
Conversation
Clears the 4 time-based pip-audit findings keeping the e2e security-audit job red. Reproduced 2026-07-18 with the exact CI invocation (uv export --frozen ... | pip-audit --strict --ignore-vuln PYSEC-2025-183); after this bump the same invocation reports "No known vulnerabilities found". Locked-version moves (uv sync; ONLY these two packages changed): - httplib2 0.31.2 -> 0.32.0 PYSEC-2026-3444 (unbounded gzip/deflate decompression DoS, fixed 0.32.0). New floor >=0.32.0,<1. Imported in google_api_client.py; also transitive via google-api-python-client / google-auth-httplib2 (their bound >=0.19.0,<1.0.0 accommodates it). - mcp 1.27.1 -> 1.28.1 CVE-2026-52870 + CVE-2026-52869 (fixed 1.27.2), CVE-2026-59950 (WebSocket Host/Origin validation, fixed 1.28.1). New floor >=1.28.1,<2. Imported in decorators.py (mcp.types.ToolAnnotations); also transitive via fastmcp-slim [client,server], whose own bound mcp>=1.24.0,<2.0 accommodates it. Both packages were unpinned in the security-floor block, so the locked resolution sat on the CVE-affected versions. FastMCP compatibility verified: server boots via the real appscriptly entry path (discovery + on_duplicate + tool-count floor all fire clean); tool-registration (live list_tools == golden) and token-log-hygiene (fastmcp verifier path) tests pass on mcp 1.28.1; mcp 1.28.1's own dependency subtree is unchanged (no new transitive deps). Golden tool surface unchanged (141 tools); ruff clean; pyright 0 errors; unit suite 89.92% coverage (only the pre-existing Windows-only DCR-restart flake, a py-key-value filetree path quirk unrelated to these packages and green on the Linux CI runner). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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.
What
Clears the 4 time-based pip-audit findings that have kept the e2e
security-auditjob red, returning that job to a clean pass so it can rejoin the merge gates. Deliberately scoped to only the two CVE-affected packages.>=0.32.0,<1>=1.28.1,<2mcp needs 1.28.1, not 1.27.2: CVE-2026-59950 is still present in 1.27.2 and 1.28.0, and is only fixed in 1.28.1 (per GHSA-vj7q-gjh5-988w). 1.28.1 is the minimum that clears all three mcp CVEs at once.
Both packages were unpinned in pyproject.toml's security-floor block, so the locked resolution sat on the CVE-affected versions. Both are also imported directly in
src/(httplib2 ingoogle_api_client.py;mcp.types.ToolAnnotationsindecorators.py), so an explicit floor is doubly warranted.uv.lockregenerated viauv sync; only these two version entries changed (mcp 1.28.1's own dependency subtree is identical to 1.27.1's, no new transitive deps).pip-audit proof (exact CI invocation)
Before:
After (
uv export --frozen --format requirements-txt --no-hashes --no-emit-projectpiped topip-audit --strict --ignore-vuln PYSEC-2025-183):No new advisories introduced by the bump.
FastMCP compatibility
mcp underlies fastmcp's server + oauth-proxy, so the bump was compat-checked three ways:
fastmcp-slim[client,server]declaresmcp>=1.24.0,<2.0; 1.28.1 sits inside it (and my<2ceiling matches fastmcp's own upper bound).appscriptly help(real console entry) boots clean (exit 0), firing auto-discovery,on_duplicate="error", and the_MIN_EXPECTED_TOOL_COUNTfloor at import.test_tool_registration(livemcp.list_tools()== golden) andtest_token_log_hygiene(runs fastmcp's REAL token verifier through our client, the N4 canary) both pass on 1.28.1.Gate results (run in the worktree)
pytest tests/unit --cov-fail-under=55pytest tests/integration/--live-gated)pyright src/ruff check src/ tests/freeze_tool_surface.py --checkpip-audit(CI invocation)One known-noise failure, ignored per builder brief:
test_dcr_registration_survives_a_simulated_restartfails Windows-only withPathSecurityErrorfromkey_value.aio.stores.filetree(Windows Store Python's AppData virtualization redirects the write path under...\Packages\PythonSoftwareFoundation.Python...\LocalCache\..., which the filetree store's path-traversal guard then reads as "outside" the root). It lives inpy-key-value-aio(a fastmcp-slim dep), not mcp/httplib2; it is pre-existing (documented in the merged #224), not an import/API break, and is green on the Linux CI runner where CI actually gates.Scope
Zero tool-surface change (golden stays at 141), no auth/scope edits (the OAuth review is open). Only
pyproject.toml+uv.locktouched.Dependabot #250-252 disposition
These three are orthogonal to this PR and none of them clears a pip-audit CVE:
>=2.62.0to>=2.65.0>=2.53.0to>=2.55.2>=0.15.17to>=0.15.21Recommendation: keep all three open; do not fold into this PR. Folding unrelated routine floor-bumps into a security fix would broaden its scope against the tight-scope convention (and none is needed to clear the pip-audit reds). They each touch
pyproject.toml/uv.locktoo, so once this CVE PR merges, dependabot will auto-rebase them onto the new main; evaluate/merge each on its own merits afterward. (Left open per instructions, not closed here.)🤖 Generated with Claude Code