Skip to content

Commit 5839a7f

Browse files
JuliaEdomclaude
andcommitted
chore(deps): say why mcp<2 and pyiceberg-core<0.8 are load-bearing
Dependabot has re-proposed both ceilings since 2026-08-23 (#244, #245) and both PRs sat unmergeable for sixteen days. Each pin had a one-line reason in a comment; neither reason was checkable without doing the work, so nobody did, and the PRs stayed open. Checked now, recorded where the pin is, and taught Dependabot to stop asking. mcp<2 holds. mcp 2.2.0 still exports Server from mcp.server, but its lowlevel Server defines neither list_tools nor call_tool, and integrations/agentflow_integrations/mcp/server.py is built entirely out of @server.list_tools() and @server.call_tool(). #244 proposed <3; taking mcp 2 is a port of that module, not a range change. Both halves of the mirrored pin now say which decorators are missing and which file needs the port. pyiceberg-core<0.8 holds, for a reason the old comment only half stated. PyIceberg 0.11.1 declares pyiceberg-core>=0.5.1,<0.9.0, so 0.8.0 is the only step up inside the pairing upstream supports -- and 0.8.0 is the one release in the line published as requires-python <3.13, which the 3.11-3.13 `environments` in [tool.uv] rule out. 0.9.0/0.9.1 restored 3.13 but sit outside PyIceberg's window. So nothing above 0.7 is installable here, which #245's <0.11 does not change: widening alone leaves the lock on 0.7.0 (verified -- `uv lock` rewrites only the recorded specifier), and `uv lock --upgrade-package pyiceberg-core` under it jumps to 0.10.1, i.e. exactly the pairing PyIceberg says it does not support. The ceiling moves when PyIceberg raises its own, and that arrives as a pyiceberg PR. .github/dependabot.yml ignores mcp majors -- in the root and integrations ecosystems, since they own the two halves of the same pin -- and pyiceberg-core minors, each with the reason and the exit condition inline. The file's existing NOTE about `ignore` also suppressing security updates applies unchanged: safety and pip-audit scan both packages and fail on a CVE that only a blocked bump would fix. No resolution change: `uv lock --check` passes untouched (256 packages). test_security_tooling_policy.py, test_contract_dependencies.py, test_cross_package_install_contract.py and test_mcp_server.py pass (44 passed), scripts/validate_project_claims.py OK, docs ratchets pass (33 passed). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018ybRVCaL1Lyd9d5kFTndh3
1 parent 806e19d commit 5839a7f

4 files changed

Lines changed: 61 additions & 5 deletions

File tree

‎.github/dependabot.yml‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,23 @@ updates:
6464
update-types: ["version-update:semver-major"]
6565
- dependency-name: "dagster"
6666
update-types: ["version-update:semver-major"]
67+
# mcp 2.x's lowlevel Server drops the list_tools/call_tool decorators
68+
# integrations/agentflow_integrations/mcp/server.py is built on (checked
69+
# against 2.2.0), so a major bump is a port, not an update. PR #244
70+
# proposed <3 and was closed on that basis; the ignore stops it coming
71+
# back weekly. Same NOTE above applies: the safety/pip-audit jobs still
72+
# scan mcp and fail on a CVE that only a major fixes.
73+
- dependency-name: "mcp"
74+
update-types: ["version-update:semver-major"]
75+
# pyiceberg-core is pinned to the release PyIceberg pairs with, not to
76+
# the newest one. PyIceberg 0.11.1 declares pyiceberg-core>=0.5.1,<0.9.0;
77+
# the only step up inside that window is 0.8.0, published as
78+
# requires-python <3.13, which the 3.11-3.13 resolution environments in
79+
# pyproject.toml rule out. Bumps only make sense when PyIceberg raises
80+
# its own range, and that arrives as a pyiceberg PR. PR #245 proposed
81+
# <0.11 and was closed on that basis.
82+
- dependency-name: "pyiceberg-core"
83+
update-types: ["version-update:semver-minor"]
6784

6885
# ── Python: Flink runtime image manifest ───────────────────────────
6986
# Not an extra of the root project (its beam chain can never co-install
@@ -120,6 +137,12 @@ updates:
120137
- dependencies
121138
- python
122139
- integrations
140+
ignore:
141+
# The other half of the mirrored mcp pin (see the root pip entry): the
142+
# ceiling is what the integration's decorators need, so leaving this
143+
# ecosystem unignored just reopens the same PR from the other directory.
144+
- dependency-name: "mcp"
145+
update-types: ["version-update:semver-major"]
123146

124147
# ── npm: TypeScript SDK ────────────────────────────────────────────
125148
- package-ecosystem: npm

‎CHANGELOG.md‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,28 @@ All notable changes to AgentFlow are documented in this file.
44

55
## [Unreleased]
66

7+
### Dependencies — the two version ceilings that keep coming back are now explained
8+
9+
* **`mcp<2` is load-bearing.** mcp 2.x's lowlevel `Server` no longer defines
10+
`list_tools` or `call_tool` (checked against 2.2.0), and
11+
`integrations/agentflow_integrations/mcp/server.py` builds its whole surface
12+
out of `@server.list_tools()` and `@server.call_tool()`. Taking mcp 2 means
13+
porting that module first. Both halves of the mirrored pin
14+
(`pyproject.toml` and `integrations/pyproject.toml`) now say so.
15+
* **`pyiceberg-core<0.8` is not a stale ceiling.** PyIceberg 0.11.1 declares
16+
`pyiceberg-core>=0.5.1,<0.9.0`, so 0.8.0 is the only step up inside the
17+
pairing upstream supports — and 0.8.0 is the one release in the line
18+
published as `requires-python <3.13`, which the 3.11–3.13 resolution
19+
`environments` rule out. 0.9+ restored 3.13 but sits outside PyIceberg's
20+
declared window. Nothing in that window is installable, so the ceiling
21+
moves when PyIceberg raises its own.
22+
* **Dependabot stops re-proposing both.** `.github/dependabot.yml` ignores
23+
`mcp` majors (in the root *and* integrations ecosystems, which own the two
24+
halves of the same pin) and `pyiceberg-core` minors, each with the reason
25+
and the exit condition. The existing NOTE about `ignore` also suppressing
26+
security updates still applies: `safety` and `pip-audit` scan both
27+
packages and fail on a CVE that only a blocked bump would fix.
28+
729
### Quality — the key-rotation coverage gate was passing on a rounding margin
830

931
* **89.6% rounds to 90.** The gate on `serving/api/auth/key_rotation.py` ran

‎integrations/pyproject.toml‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ dependencies = [
2626

2727
[project.optional-dependencies]
2828
mcp = [
29-
# MCP 2 removes the low-level Server decorators used by this integration.
29+
# mcp 2.x's lowlevel Server drops the list_tools/call_tool decorators
30+
# server.py is built on (checked against 2.2.0). Port the module before
31+
# moving this pin; the root pyproject mirrors it.
3032
"mcp>=1.0,<2",
3133
]
3234

‎pyproject.toml‎

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,14 @@ dependencies = [
4040
cloud = [
4141
"boto3>=1.35,<2",
4242
"pyiceberg>=0.7,<1",
43-
# PyIceberg 0.11 write paths require native transforms. Core 0.8 excludes
44-
# Python 3.13, while 0.7 provides a stable-ABI wheel across Python 3.11-3.13.
43+
# PyIceberg 0.11 write paths require native transforms, and 0.7 is the
44+
# only core release that can serve them here. PyIceberg 0.11.1 declares
45+
# pyiceberg-core>=0.5.1,<0.9.0, so 0.8.0 is the only step up inside the
46+
# pairing upstream supports -- and 0.8.0 is the one release in the line
47+
# published as requires-python <3.13, which the 3.11-3.13 resolution
48+
# environments below rule out. (0.9+ restored 3.13 but sits outside
49+
# PyIceberg's declared window; nothing in that window is installable.)
50+
# The ceiling moves when PyIceberg raises its own, not before.
4551
"pyiceberg-core>=0.7,<0.8",
4652
]
4753
postgres = [
@@ -77,8 +83,11 @@ integrations = [
7783
"llama-index-core>=0.12,<1",
7884
# Mirrors integrations/pyproject.toml [mcp]: locking it here lets CI
7985
# install the editable integrations package with --no-deps from the
80-
# frozen root resolution (audit F-05). MCP 2 removes the low-level
81-
# Server decorators the integration uses.
86+
# frozen root resolution (audit F-05). The ceiling is load-bearing:
87+
# mcp 2.x's lowlevel Server no longer defines list_tools or call_tool
88+
# (checked against 2.2.0), and integrations/.../mcp/server.py builds its
89+
# whole surface out of @server.list_tools() and @server.call_tool().
90+
# Taking mcp 2 means porting that module first, not moving this pin.
8291
"mcp>=1.0,<2",
8392
]
8493
contract = [

0 commit comments

Comments
 (0)