diff --git a/CHANGELOG.md b/CHANGELOG.md index ba592d0b2..c8c4dde1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ All notable changes to Get Physics Done are documented here. ## vNEXT +- Bound the `mcp` dependency to `>=1.27.0,<2`. mcp 2.x removed `mcp.server.fastmcp`, so fresh installs without the `arxiv` extra, including `npx -y get-physics-done`, resolved mcp 2.x and seven built-in MCP servers failed to import (#273). - Add pandoc-driven markdown→LaTeX pipeline for the paper writer. Sections can opt in via `Section.content_format="markdown"`; raw-LaTeX payloads still pass through unchanged. Pandoc is probed once per `render_paper` call and shared across sections. When pandoc is missing the markdown path raises `PandocNotAvailable` with a recovery hint; legacy `maybe_convert_to_latex` callers degrade to pass-through. `--natbib` is the default so `@key` / `[@k1; @k2]` emit `\citet`/`\citep` for the template's `\bibliography{…}` to resolve; `pandoc-crossref` is auto-enabled when installed and `pandoc-citeproc` is intentionally excluded from auto-detection. - Fix Nature template citation rendering: switch from `naturemag.bst` to `unsrtnat` with `\usepackage[numbers,super,sort&compress]{natbib}`. `naturemag.bst` predates natbib and has no author-name macro, so pandoc's `\citet` rendered as "(author?)" in the final PDF while passing every string-level `.tex` assertion. - Fix PRL template cite-command resolution under revtex4-2: pass `natbib` as a class option (`\documentclass[…,natbib]{revtex4-2}`) instead of `\usepackage{natbib}`, which would otherwise option-clash with revtex's internal natbib load. diff --git a/pyproject.toml b/pyproject.toml index b6cff3adb..ff367cb1c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,7 +35,9 @@ dependencies = [ "rich>=15.0.0", "pydantic>=2.13.3", "PyYAML>=6.0.3", - "mcp>=1.27.0", + # mcp 2.x removed `mcp.server.fastmcp`, which seven of the built-in + # servers import. Keep the 1.x API until they are ported. + "mcp>=1.27.0,<2", # Utilities "pybtex>=0.25.1", "Pillow>=12.1.1", diff --git a/tests/test_release_consistency.py b/tests/test_release_consistency.py index aab7029ea..a4574299b 100644 --- a/tests/test_release_consistency.py +++ b/tests/test_release_consistency.py @@ -1475,7 +1475,7 @@ def test_public_runtime_dependency_surface_stays_curated() -> None: optional = project.get("optional-dependencies", {}) assert _normalized_dependency_names(dependencies) == _expected_runtime_dependency_names() - assert "mcp>=1.27.0" in dependencies + assert "mcp>=1.27.0,<2" in dependencies assert not any(item.startswith("mcp[") for item in dependencies) assert optional == _EXPECTED_OPTIONAL_DEPENDENCIES @@ -1493,7 +1493,7 @@ def test_uv_lock_tracks_runtime_dependency_extras() -> None: assert [item for item in dependencies if isinstance(item, dict) and item.get("name") == "mcp"] == [{"name": "mcp"}] assert [item for item in requires_dist if isinstance(item, dict) and item.get("name") == "mcp"] == [ - {"name": "mcp", "specifier": ">=1.27.0"} + {"name": "mcp", "specifier": ">=1.27.0,<2"} ] diff --git a/uv.lock b/uv.lock index 902393ddb..8c4a9e08e 100644 --- a/uv.lock +++ b/uv.lock @@ -711,7 +711,7 @@ requires-dist = [ { name = "cairosvg", marker = "extra == 'paper'", specifier = ">=2.7.0" }, { name = "httpx", marker = "extra == 'arxiv'", specifier = ">=0.27" }, { name = "jinja2", specifier = ">=3.1.6" }, - { name = "mcp", specifier = ">=1.27.0" }, + { name = "mcp", specifier = ">=1.27.0,<2" }, { name = "pillow", specifier = ">=12.1.1" }, { name = "pybtex", specifier = ">=0.25.1" }, { name = "pydantic", specifier = ">=2.13.3" },