From 07fc1042b5d7a9db287d23da4d9cc5c7c9dbb792 Mon Sep 17 00:00:00 2001 From: Ben Sully Date: Thu, 5 Dec 2024 15:39:57 +0000 Subject: [PATCH] fix: handle strings containing numbers correctly Fixes #62. --- src/fastmcp/utilities/func_metadata.py | 2 +- tests/test_func_metadata.py | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/fastmcp/utilities/func_metadata.py b/src/fastmcp/utilities/func_metadata.py index 9bd4921..8bced29 100644 --- a/src/fastmcp/utilities/func_metadata.py +++ b/src/fastmcp/utilities/func_metadata.py @@ -91,7 +91,7 @@ def pre_parse_json(self, data: dict[str, Any]) -> dict[str, Any]: pre_parsed = json.loads(data[field_name]) except json.JSONDecodeError: continue # Not JSON - skip - if isinstance(pre_parsed, str): + if isinstance(pre_parsed, (str, int, float)): # This is likely that the raw value is e.g. `"hello"` which we # Should really be parsed as '"hello"' in Python - but if we parse # it as JSON it'll turn into just 'hello'. So we skip it. diff --git a/tests/test_func_metadata.py b/tests/test_func_metadata.py index d0429a1..eebcb04 100644 --- a/tests/test_func_metadata.py +++ b/tests/test_func_metadata.py @@ -174,6 +174,21 @@ def func_with_str_types(str_or_list: str | list[str]): assert result["str_or_list"] == ["hello", "world"] +def test_str_vs_int(): + """ + Test that string values are kept as strings even when they contain numbers, + while numbers are parsed correctly. + """ + + def func_with_str_and_int(a: str, b: int): + return a + + meta = func_metadata(func_with_str_and_int) + result = meta.pre_parse_json({"a": "123", "b": 123}) + assert result["a"] == "123" + assert result["b"] == 123 + + def test_skip_names(): """Test that skipped parameters are not included in the model"""