From 3729867e9c788bfd3984a25093dfac4085cd3e36 Mon Sep 17 00:00:00 2001 From: Jason Chen Date: Sat, 9 Aug 2025 17:14:01 -0400 Subject: [PATCH] don't validate tool error responses --- lib/hermes/server/handlers/tools.ex | 4 ++++ .../component/tool_annotations_test.exs | 20 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/lib/hermes/server/handlers/tools.ex b/lib/hermes/server/handlers/tools.ex index 74261cc..cdb4e8d 100644 --- a/lib/hermes/server/handlers/tools.ex +++ b/lib/hermes/server/handlers/tools.ex @@ -79,6 +79,10 @@ defmodule Hermes.Server.Handlers.Tools do {:reply, Response.to_protocol(resp), frame} end + defp maybe_validate_output_schema(_tool, %Response{isError: true} = resp, frame) do + {:reply, Response.to_protocol(resp), frame} + end + defp maybe_validate_output_schema(%Tool{} = tool, %Response{structured_content: nil}, frame) do metadata = %{tool_name: tool.name} {:error, Error.execution(@output_schema_err, metadata), frame} diff --git a/test/hermes/server/component/tool_annotations_test.exs b/test/hermes/server/component/tool_annotations_test.exs index d36fe69..e3e86f6 100644 --- a/test/hermes/server/component/tool_annotations_test.exs +++ b/test/hermes/server/component/tool_annotations_test.exs @@ -103,6 +103,10 @@ defmodule Hermes.Server.Component.ToolAnnotationsTest do end @impl true + def execute(%{query: "tool error"}, frame) do + {:reply, Response.error(Response.tool(), "Tool error"), frame} + end + def execute(%{query: query}, frame) do results = %{ results: [ @@ -392,6 +396,22 @@ defmodule Hermes.Server.Component.ToolAnnotationsTest do assert result["isError"] == false end + test "tool error response skips output schema validation", %{ + server: server, + session_id: session_id + } do + request = + build_request("tools/call", %{ + "name" => "tool_with_output_schema", + "arguments" => %{"query" => "tool error"} + }) + + {:ok, response_string} = + GenServer.call(server, {:request, request, session_id, %{}}) + + assert {:ok, [%{"result" => %{"isError" => true}}]} = Message.decode(response_string) + end + test "tool without output schema works normally", %{ server: server, session_id: session_id