From c250d95696fefac07fa0adb1fea6b392c180e03c Mon Sep 17 00:00:00 2001 From: KarlLeen Date: Wed, 29 Jul 2026 04:55:02 -0400 Subject: [PATCH] fix(time): cap mcp dependency below 2.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #4570. mcp 2.0.0 renamed McpError to MCPError, so unpinned resolvers crash on import. Cap at mcp>=1.23.0,<2 (no alias — the constructor changed too) and add a regression test, matching #4563. --- src/time/pyproject.toml | 2 +- src/time/test/time_server_test.py | 35 +++++++++++++++++++++++++++++-- src/time/uv.lock | 2 +- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/time/pyproject.toml b/src/time/pyproject.toml index f9be050452..84a34c4763 100644 --- a/src/time/pyproject.toml +++ b/src/time/pyproject.toml @@ -17,7 +17,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", ] dependencies = [ - "mcp>=1.23.0", + "mcp>=1.23.0,<2", "pydantic>=2.0.0", "tzdata>=2024.2", "tzlocal>=5.3.1", diff --git a/src/time/test/time_server_test.py b/src/time/test/time_server_test.py index 8d963508d7..8b16863157 100644 --- a/src/time/test/time_server_test.py +++ b/src/time/test/time_server_test.py @@ -1,9 +1,15 @@ +try: + import tomllib +except ModuleNotFoundError: # Python < 3.11 (.python-version is 3.10) + import tomli as tomllib +from pathlib import Path +from unittest.mock import patch +from zoneinfo import ZoneInfo from freezegun import freeze_time from mcp.shared.exceptions import McpError +from packaging.requirements import Requirement import pytest -from unittest.mock import patch -from zoneinfo import ZoneInfo from mcp_server_time.server import TimeServer, get_local_tz @@ -526,3 +532,28 @@ def test_get_local_tz_various_timezones(mock_get_localzone, timezone_name): result = get_local_tz() assert str(result) == timezone_name assert isinstance(result, ZoneInfo) + + +class TestDeclaredDependencies: + """Tests for the dependencies declared in pyproject.toml.""" + + def test_mcp_requirement_excludes_2x(self): + """Test that the mcp requirement admits 1.x but excludes 2.x. + + mcp 2.0.0 renamed McpError to MCPError, so server.py fails to import + against it. Without an upper bound, unpinned launchers such as uvx + resolve 2.x and the server dies on startup. + + A rename-only alias is not a safe fix either: MCPError's constructor + also changed (ErrorData -> code/message), so we cap below 2 instead. + """ + pyproject = Path(__file__).parent.parent / "pyproject.toml" + with pyproject.open("rb") as f: + dependencies = tomllib.load(f)["project"]["dependencies"] + + requirements = [Requirement(dep) for dep in dependencies] + mcp_requirement = next(req for req in requirements if req.name == "mcp") + + assert mcp_requirement.specifier.contains("1.23.0") + assert mcp_requirement.specifier.contains("1.29.0") + assert not mcp_requirement.specifier.contains("2.0.0") diff --git a/src/time/uv.lock b/src/time/uv.lock index e77b3c3820..a9585011d4 100644 --- a/src/time/uv.lock +++ b/src/time/uv.lock @@ -362,7 +362,7 @@ dev = [ [package.metadata] requires-dist = [ - { name = "mcp", specifier = ">=1.23.0" }, + { name = "mcp", specifier = ">=1.23.0,<2" }, { name = "pydantic", specifier = ">=2.0.0" }, { name = "tzdata", specifier = ">=2024.2" }, { name = "tzlocal", specifier = ">=5.3.1" },