From 26f806adb915900b568321e9cf0fee70c5f50b71 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Sat, 27 Dec 2025 20:50:18 +0100 Subject: [PATCH 1/4] Use the throwable object in $context['excpetion'] --- examples/server/bootstrap.php | 4 ++++ src/Capability/Discovery/Discoverer.php | 14 +++++++------- src/Server/Handler/Request/CallToolHandler.php | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/examples/server/bootstrap.php b/examples/server/bootstrap.php index a592ea81..34d4cb05 100644 --- a/examples/server/bootstrap.php +++ b/examples/server/bootstrap.php @@ -70,6 +70,10 @@ public function log($level, Stringable|string $message, array $context = []): vo ([] === $context || !$debug) ? '' : json_encode($context), ); + if (isset($context['exception']) && $context['exception'] instanceof Throwable) { + $logMessage .= sprintf('> %s', $context['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()); From 914441444443c536babbf40229f5eddbc89aa042 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Sat, 27 Dec 2025 22:06:41 +0100 Subject: [PATCH 2/4] add changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) 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 ----- From ed282cb72913c6996aa9972bcb337f53b265301a Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Sat, 27 Dec 2025 23:21:26 +0100 Subject: [PATCH 3/4] remove 'exception' from context --- examples/server/bootstrap.php | 7 +++++-- examples/server/env-variables/EnvToolHandler.php | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/examples/server/bootstrap.php b/examples/server/bootstrap.php index 34d4cb05..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,8 +73,8 @@ public function log($level, Stringable|string $message, array $context = []): vo ([] === $context || !$debug) ? '' : json_encode($context), ); - if (isset($context['exception']) && $context['exception'] instanceof Throwable) { - $logMessage .= sprintf('> %s', $context['exception']->getMessage())."\n"; + if ($exception instanceof Throwable) { + $logMessage .= sprintf('> %s', $exception->getMessage())."\n"; } if (($_SERVER['FILE_LOG'] ?? false) || !defined('STDERR')) { diff --git a/examples/server/env-variables/EnvToolHandler.php b/examples/server/env-variables/EnvToolHandler.php index 7c6cc8df..f7b0e8b8 100644 --- a/examples/server/env-variables/EnvToolHandler.php +++ b/examples/server/env-variables/EnvToolHandler.php @@ -24,7 +24,7 @@ final class EnvToolHandler * @return array the result, varying by APP_MODE */ #[McpTool(name: 'process_data_by_mode')] - public function processData(string $input): array + public function processData(string $input, $_session): array { $appMode = getenv('APP_MODE'); // Read from environment From aa952c564c3e7e41c46953809c532f1800b86f09 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Sat, 27 Dec 2025 23:23:08 +0100 Subject: [PATCH 4/4] revert debug --- examples/server/env-variables/EnvToolHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/server/env-variables/EnvToolHandler.php b/examples/server/env-variables/EnvToolHandler.php index f7b0e8b8..7c6cc8df 100644 --- a/examples/server/env-variables/EnvToolHandler.php +++ b/examples/server/env-variables/EnvToolHandler.php @@ -24,7 +24,7 @@ final class EnvToolHandler * @return array the result, varying by APP_MODE */ #[McpTool(name: 'process_data_by_mode')] - public function processData(string $input, $_session): array + public function processData(string $input): array { $appMode = getenv('APP_MODE'); // Read from environment