Skip to content

Commit f5c4d3e

Browse files
committed
fix(validation): only match tool_use/tool_result IDs when last message has tool_result
Fixes #2960 Move the ID-matching check inside the has_tool_results block so validate_tool_use_result_messages() does not raise when a previous tool_use is followed by a plain text response without tool_result.
1 parent 603342f commit f5c4d3e

2 files changed

Lines changed: 18 additions & 1 deletion

File tree

src/mcp/server/validation.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ def validate_tool_use_result_messages(messages: list[SamplingMessage]) -> None:
8181
if not has_previous_tool_use:
8282
raise ValueError("tool_result blocks do not match any tool_use in the previous message")
8383

84-
if has_previous_tool_use and previous_content:
8584
tool_use_ids = {c.id for c in previous_content if c.type == "tool_use"}
8685
tool_result_ids = {c.tool_use_id for c in last_content if c.type == "tool_result"}
8786
if tool_use_ids != tool_result_ids:

tests/server/test_validation.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,24 @@ def test_validate_tool_use_result_messages_raises_when_tool_result_ids_dont_matc
146146
validate_tool_use_result_messages(messages)
147147

148148

149+
def test_validate_tool_use_result_messages_no_error_when_tool_use_not_followed_by_tool_result() -> None:
150+
"""No error when previous message has tool_use but last message has no tool_result."""
151+
messages = [
152+
SamplingMessage(
153+
role="assistant",
154+
content=[
155+
TextContent(type="text", text="Hold on..."),
156+
ToolUseContent(type="tool_use", id="abc", name="search", input={"q": "test"}),
157+
],
158+
),
159+
SamplingMessage(
160+
role="user",
161+
content=TextContent(type="text", text="Thanks, no results needed"),
162+
),
163+
]
164+
validate_tool_use_result_messages(messages) # Should not raise
165+
166+
149167
def test_validate_tool_use_result_messages_no_error_when_tool_result_matches_tool_use() -> None:
150168
"""No error when tool_result IDs match tool_use IDs."""
151169
messages = [

0 commit comments

Comments
 (0)