From 6558dc97edef10190aca27128ec5bb635aec00df Mon Sep 17 00:00:00 2001 From: Zain Dana Harper Date: Thu, 2 Jul 2026 03:06:24 -0700 Subject: [PATCH] Clarify missing tool result validation error --- src/mcp/server/validation.py | 2 ++ tests/server/test_validation.py | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/mcp/server/validation.py b/src/mcp/server/validation.py index fd16beb95..1c258d5c1 100644 --- a/src/mcp/server/validation.py +++ b/src/mcp/server/validation.py @@ -84,5 +84,7 @@ def validate_tool_use_result_messages(messages: list[SamplingMessage]) -> None: if has_previous_tool_use and previous_content: tool_use_ids = {c.id for c in previous_content if c.type == "tool_use"} tool_result_ids = {c.tool_use_id for c in last_content if c.type == "tool_result"} + if not has_tool_results: + raise ValueError("tool_use blocks must be followed by matching tool_result blocks") if tool_use_ids != tool_result_ids: raise ValueError("ids of tool_result blocks and tool_use blocks from previous message do not match") diff --git a/tests/server/test_validation.py b/tests/server/test_validation.py index 8015c34dd..8f8e28a3d 100644 --- a/tests/server/test_validation.py +++ b/tests/server/test_validation.py @@ -146,6 +146,23 @@ def test_validate_tool_use_result_messages_raises_when_tool_result_ids_dont_matc validate_tool_use_result_messages(messages) +def test_validate_tool_use_result_messages_raises_when_tool_use_has_no_following_tool_result() -> None: + """Raises a specific error when the previous assistant tool_use has no following tool_result.""" + messages = [ + SamplingMessage( + role="assistant", + content=ToolUseContent(type="tool_use", id="tool-1", name="test", input={}), + ), + SamplingMessage( + role="user", + content=TextContent(type="text", text="No tool result is provided"), + ), + ] + with pytest.raises(ValueError) as exc_info: + validate_tool_use_result_messages(messages) + assert str(exc_info.value) == "tool_use blocks must be followed by matching tool_result blocks" + + def test_validate_tool_use_result_messages_no_error_when_tool_result_matches_tool_use() -> None: """No error when tool_result IDs match tool_use IDs.""" messages = [