* @author Tobias Nyholm */ final class CallToolHandler implements MethodHandlerInterface { public function __construct( private readonly ToolCallerInterface $toolCaller, private readonly LoggerInterface $logger = new NullLogger(), ) { } public function supports(HasMethodInterface $message): bool { return $message instanceof CallToolRequest; } public function handle(CallToolRequest|HasMethodInterface $message, SessionInterface $session): Response|Error { \assert($message instanceof CallToolRequest); try { $content = $this->toolCaller->call($message); } catch (ExceptionInterface $exception) { $this->logger->error( \sprintf('Error while executing tool "%s": "%s".', $message->name, $exception->getMessage()), [ 'tool' => $message->name, 'arguments' => $message->arguments, ], ); return Error::forInternalError('Error while executing tool', $message->getId()); } return new Response($message->getId(), $content); } }