Skip to content

Commit

Permalink
fix(fastmcp): handle strings containing numbers correctly
Browse files Browse the repository at this point in the history
This is a port of jlowin/fastmcp#63 to this repo
- I guess the transition was made before this PR was merged into
fastmcp, so it wasn't included here.

See jlowin/fastmcp#62 for the initial bug
report.
  • Loading branch information
sd2k committed Jan 13, 2025
1 parent 4770bcd commit 5abe811
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/mcp/server/fastmcp/utilities/func_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,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/server/fastmcp/test_func_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,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 5abe811

Please sign in to comment.