Skip to content

Commit

Permalink
fix: handle strings containing numbers correctly
Browse files Browse the repository at this point in the history
Fixes #62.
  • Loading branch information
sd2k committed Dec 5, 2024
1 parent 2212d39 commit 07fc104
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/fastmcp/utilities/func_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
15 changes: 15 additions & 0 deletions tests/test_func_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"""

Expand Down

0 comments on commit 07fc104

Please sign in to comment.