diff --git a/pyproject.toml b/pyproject.toml index 31a54944e..05494d85f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,11 +25,11 @@ dependencies = [ "anyio>=4.5", "httpx>=0.27", "httpx-sse>=0.4", - "pydantic>=2.10.1,<3.0.0", + "pydantic>=2.7.2,<3.0.0", "starlette>=0.27", "sse-starlette>=1.6.1", - "pydantic-settings>=2.6.1", - "uvicorn>=0.30", + "pydantic-settings>=2.5.2", + "uvicorn>=0.23.1", ] [project.optional-dependencies] diff --git a/tests/server/fastmcp/test_func_metadata.py b/tests/server/fastmcp/test_func_metadata.py index 7173b43b2..b68fb9025 100644 --- a/tests/server/fastmcp/test_func_metadata.py +++ b/tests/server/fastmcp/test_func_metadata.py @@ -235,8 +235,45 @@ async def check_call(args): def test_complex_function_json_schema(): + """Test JSON schema generation for complex function arguments. + + Note: Different versions of pydantic output slightly different + JSON Schema formats for model fields with defaults. The format changed in 2.9.0: + + 1. Before 2.9.0: + { + "allOf": [{"$ref": "#/$defs/Model"}], + "default": {} + } + + 2. Since 2.9.0: + { + "$ref": "#/$defs/Model", + "default": {} + } + + Both formats are valid and functionally equivalent. This test accepts either format + to ensure compatibility across our supported pydantic versions. + + This change in format does not affect runtime behavior since: + 1. Both schemas validate the same way + 2. The actual model classes and validation logic are unchanged + 3. func_metadata uses model_validate/model_dump, not the schema directly + """ meta = func_metadata(complex_arguments_fn) - assert meta.arg_model.model_json_schema() == { + actual_schema = meta.arg_model.model_json_schema() + + # Create a copy of the actual schema to normalize + normalized_schema = actual_schema.copy() + + # Normalize the my_model_a_with_default field to handle both pydantic formats + if 'allOf' in actual_schema['properties']['my_model_a_with_default']: + normalized_schema['properties']['my_model_a_with_default'] = { + '$ref': '#/$defs/SomeInputModelA', + 'default': {} + } + + assert normalized_schema == { "$defs": { "InnerModel": { "properties": {"x": {"title": "X", "type": "integer"}},