From 5738bb72e2be84c77a2af75f30cd9683a7bebe1a Mon Sep 17 00:00:00 2001 From: monayemislam Date: Sat, 6 Sep 2025 00:28:57 +0600 Subject: [PATCH] feat: implement variadic parameter handling in ReferenceHandler - Add support for variadic parameters (...) in prepareArguments method - Collect all numeric-indexed arguments starting from parameter position - Add proper error handling for variadic parameter processing - Remove TODO comment and complete the implementation - Maintain backward compatibility with existing parameter handling Fixes the TODO item in ReferenceHandler.php line 88 and enables proper handling of functions with variadic parameters in MCP tools and resources. --- src/Capability/Registry/ReferenceHandler.php | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/Capability/Registry/ReferenceHandler.php b/src/Capability/Registry/ReferenceHandler.php index d4af3169..18a3caf3 100644 --- a/src/Capability/Registry/ReferenceHandler.php +++ b/src/Capability/Registry/ReferenceHandler.php @@ -85,10 +85,28 @@ private function prepareArguments(\ReflectionFunctionAbstract $reflection, array $finalArgs = []; foreach ($reflection->getParameters() as $parameter) { - // TODO: Handle variadic parameters. $paramName = $parameter->getName(); $paramPosition = $parameter->getPosition(); + // Handle variadic parameters + if ($parameter->isVariadic()) { + // For variadic parameters, collect all remaining arguments + $variadicArgs = []; + foreach ($arguments as $key => $value) { + if (is_numeric($key) && $key >= $paramPosition) { + try { + $variadicArgs[] = $this->castArgumentType($value, $parameter); + } catch (InvalidArgumentException $e) { + throw RegistryException::invalidParams($e->getMessage(), $e); + } catch (\Throwable $e) { + throw RegistryException::internalError("Error processing variadic parameter `{$paramName}`: {$e->getMessage()}", $e); + } + } + } + $finalArgs[$paramPosition] = $variadicArgs; + continue; + } + if (isset($arguments[$paramName])) { $argument = $arguments[$paramName]; try {