diff --git a/CHANGELOG.md b/CHANGELOG.md index aeabc080..efdc5cd1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ All notable changes to `mcp/sdk` will be documented in this file. ----- * Throw exception when trying to inject parameter with the unsupported names `$_session` or `$_request`. +* `Throwable` objects are passed to log context instead of the exception message. 0.2.1 ----- diff --git a/examples/server/bootstrap.php b/examples/server/bootstrap.php index a592ea81..a9110317 100644 --- a/examples/server/bootstrap.php +++ b/examples/server/bootstrap.php @@ -63,6 +63,9 @@ public function log($level, Stringable|string $message, array $context = []): vo return; } + $exception = $context['exception'] ?? null; + unset($context['exception']); + $logMessage = sprintf( "[%s] %s %s\n", strtoupper($level), @@ -70,6 +73,10 @@ public function log($level, Stringable|string $message, array $context = []): vo ([] === $context || !$debug) ? '' : json_encode($context), ); + if ($exception instanceof Throwable) { + $logMessage .= sprintf('> %s', $exception->getMessage())."\n"; + } + if (($_SERVER['FILE_LOG'] ?? false) || !defined('STDERR')) { file_put_contents('dev.log', $logMessage, \FILE_APPEND); } else { diff --git a/src/Capability/Discovery/Discoverer.php b/src/Capability/Discovery/Discoverer.php index 88ec4117..95a3fe5a 100644 --- a/src/Capability/Discovery/Discoverer.php +++ b/src/Capability/Discovery/Discoverer.php @@ -106,7 +106,7 @@ public function discover(string $basePath, array $directories, array $excludeDir } } catch (\Throwable $e) { $this->logger->error('Error during file finding process for MCP discovery'.json_encode($e->getTrace(), \JSON_PRETTY_PRINT), [ - 'exception' => $e->getMessage(), + 'exception' => $e, 'trace' => $e->getTraceAsString(), ]); } @@ -183,12 +183,12 @@ private function processFile(SplFileInfo $file, array &$discoveredCount, array & } } } catch (\ReflectionException $e) { - $this->logger->error('Reflection error processing file for MCP discovery', ['file' => $file->getPathname(), 'class' => $className, 'exception' => $e->getMessage()]); + $this->logger->error('Reflection error processing file for MCP discovery', ['file' => $file->getPathname(), 'class' => $className, 'exception' => $e]); } catch (\Throwable $e) { $this->logger->error('Unexpected error processing file for MCP discovery', [ 'file' => $file->getPathname(), 'class' => $className, - 'exception' => $e->getMessage(), + 'exception' => $e, 'trace' => $e->getTraceAsString(), ]); } @@ -287,9 +287,9 @@ private function processMethod(\ReflectionMethod $method, array &$discoveredCoun break; } } catch (ExceptionInterface $e) { - $this->logger->error("Failed to process MCP attribute on {$className}::{$methodName}", ['attribute' => $attributeClassName, 'exception' => $e->getMessage(), 'trace' => $e->getPrevious() ? $e->getPrevious()->getTraceAsString() : $e->getTraceAsString()]); + $this->logger->error("Failed to process MCP attribute on {$className}::{$methodName}", ['attribute' => $attributeClassName, 'exception' => $e, 'trace' => $e->getPrevious() ? $e->getPrevious()->getTraceAsString() : $e->getTraceAsString()]); } catch (\Throwable $e) { - $this->logger->error("Unexpected error processing attribute on {$className}::{$methodName}", ['attribute' => $attributeClassName, 'exception' => $e->getMessage(), 'trace' => $e->getTraceAsString()]); + $this->logger->error("Unexpected error processing attribute on {$className}::{$methodName}", ['attribute' => $attributeClassName, 'exception' => $e, 'trace' => $e->getTraceAsString()]); } } @@ -338,7 +338,7 @@ private function getClassFromFile(SplFileInfo $file): ?string $content = $file->getContents(); } catch (\Throwable $e) { $this->logger->warning("Failed to read file content during class discovery: {$file->getPathname()}", [ - 'exception' => $e->getMessage(), + 'exception' => $e, ]); return null; @@ -354,7 +354,7 @@ private function getClassFromFile(SplFileInfo $file): ?string $tokens = token_get_all($content); } catch (\Throwable $e) { $this->logger->warning("Failed to tokenize file during class discovery: {$file->getPathname()}", [ - 'exception' => $e->getMessage(), + 'exception' => $e, ]); return null; diff --git a/src/Server/Handler/Request/CallToolHandler.php b/src/Server/Handler/Request/CallToolHandler.php index dd159afc..13a4b536 100644 --- a/src/Server/Handler/Request/CallToolHandler.php +++ b/src/Server/Handler/Request/CallToolHandler.php @@ -91,7 +91,7 @@ public function handle(Request $request, SessionInterface $session): Response|Er } catch (\Throwable $e) { $this->logger->error('Unhandled error during tool execution', [ 'name' => $toolName, - 'exception' => $e->getMessage(), + 'exception' => $e, ]); return Error::forInternalError('Error while executing tool', $request->getId());