Skip to content

Commit a75ed6c

Browse files
committed
refactor: add logger support to PromptGetter and ResourceReader classes
1 parent 6ac148c commit a75ed6c

File tree

7 files changed

+102
-84
lines changed

7 files changed

+102
-84
lines changed

src/Capability/Prompt/PromptGetter.php

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@
1515
use Mcp\Capability\Registry\ReferenceProviderInterface;
1616
use Mcp\Exception\PromptGetException;
1717
use Mcp\Exception\PromptNotFoundException;
18-
use Mcp\Exception\RegistryException;
1918
use Mcp\Schema\Request\GetPromptRequest;
2019
use Mcp\Schema\Result\GetPromptResult;
20+
use Psr\Log\LoggerInterface;
21+
use Psr\Log\NullLogger;
2122

2223
/**
2324
* @author Pavel Buchnev <butschster@gmail.com>
@@ -27,27 +28,41 @@ final class PromptGetter implements PromptGetterInterface
2728
public function __construct(
2829
private readonly ReferenceProviderInterface $referenceProvider,
2930
private readonly ReferenceHandlerInterface $referenceHandler,
30-
) {}
31+
private readonly LoggerInterface $logger = new NullLogger(),
32+
) {
33+
}
3134

32-
/**
33-
* @throws RegistryException
34-
* @throws \JsonException
35-
*/
3635
public function get(GetPromptRequest $request): GetPromptResult
3736
{
38-
$reference = $this->referenceProvider->getPrompt($request->name);
37+
$promptName = $request->name;
38+
$arguments = $request->arguments ?? [];
39+
40+
$this->logger->debug('Getting prompt', ['name' => $promptName, 'arguments' => $arguments]);
41+
42+
$reference = $this->referenceProvider->getPrompt($promptName);
3943

4044
if (null === $reference) {
45+
$this->logger->warning('Prompt not found', ['name' => $promptName]);
4146
throw new PromptNotFoundException($request);
4247
}
4348

4449
try {
45-
return new GetPromptResult(
46-
$reference->formatResult(
47-
$this->referenceHandler->handle($reference, $request->arguments ?? []),
48-
),
49-
);
50+
$result = $this->referenceHandler->handle($reference, $arguments);
51+
$formattedResult = $reference->formatResult($result);
52+
53+
$this->logger->debug('Prompt retrieved successfully', [
54+
'name' => $promptName,
55+
'result_type' => \gettype($result),
56+
]);
57+
58+
return new GetPromptResult($formattedResult);
5059
} catch (\Throwable $e) {
60+
$this->logger->error('Prompt retrieval failed', [
61+
'name' => $promptName,
62+
'exception' => $e->getMessage(),
63+
'trace' => $e->getTraceAsString(),
64+
]);
65+
5166
throw new PromptGetException($request, $e);
5267
}
5368
}

src/Capability/Resource/ResourceReader.php

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
use Mcp\Exception\ResourceReadException;
1818
use Mcp\Schema\Request\ReadResourceRequest;
1919
use Mcp\Schema\Result\ReadResourceResult;
20+
use Psr\Log\LoggerInterface;
21+
use Psr\Log\NullLogger;
2022

2123
/**
2224
* @author Pavel Buchnev <butschster@gmail.com>
@@ -26,24 +28,40 @@ final class ResourceReader implements ResourceReaderInterface
2628
public function __construct(
2729
private readonly ReferenceProviderInterface $referenceProvider,
2830
private readonly ReferenceHandlerInterface $referenceHandler,
29-
) {}
31+
private readonly LoggerInterface $logger = new NullLogger(),
32+
) {
33+
}
3034

3135
public function read(ReadResourceRequest $request): ReadResourceResult
3236
{
33-
$reference = $this->referenceProvider->getResource($request->uri);
37+
$uri = $request->uri;
38+
39+
$this->logger->debug('Reading resource', ['uri' => $uri]);
40+
41+
$reference = $this->referenceProvider->getResource($uri);
3442

3543
if (null === $reference) {
44+
$this->logger->warning('Resource not found', ['uri' => $uri]);
3645
throw new ResourceNotFoundException($request);
3746
}
3847

3948
try {
40-
return new ReadResourceResult(
41-
$reference->formatResult(
42-
$this->referenceHandler->handle($reference, ['uri' => $request->uri]),
43-
$request->uri,
44-
),
45-
);
49+
$result = $this->referenceHandler->handle($reference, ['uri' => $uri]);
50+
$formattedResult = $reference->formatResult($result, $uri);
51+
52+
$this->logger->debug('Resource read successfully', [
53+
'uri' => $uri,
54+
'result_type' => \gettype($result),
55+
]);
56+
57+
return new ReadResourceResult($formattedResult);
4658
} catch (\Throwable $e) {
59+
$this->logger->error('Resource read failed', [
60+
'uri' => $uri,
61+
'exception' => $e->getMessage(),
62+
'trace' => $e->getTraceAsString(),
63+
]);
64+
4765
throw new ResourceReadException($request, $e);
4866
}
4967
}

src/JsonRpc/Handler.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
/**
3434
* @final
35+
*
3536
* @author Christopher Hertel <mail@christopher-hertel.de>
3637
*/
3738
class Handler

src/Server/ServerBuilder.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
use Mcp\Capability\Discovery\DocBlockParser;
1717
use Mcp\Capability\Discovery\HandlerResolver;
1818
use Mcp\Capability\Discovery\SchemaGenerator;
19-
use Mcp\Capability\DispatchableRegistry;
2019
use Mcp\Capability\Prompt\Completion\EnumCompletionProvider;
2120
use Mcp\Capability\Prompt\Completion\ListCompletionProvider;
2221
use Mcp\Capability\Prompt\PromptGetter;
@@ -283,8 +282,8 @@ public function build(): Server
283282

284283
$referenceHandler = new ReferenceHandler($container);
285284
$toolExecutor = $this->toolExecutor ??= new ToolExecutor($registry, $referenceHandler, $logger);
286-
$resourceReader = $this->resourceReader ??= new ResourceReader($registry, $referenceHandler);
287-
$promptGetter = $this->promptGetter ??= new PromptGetter($registry, $referenceHandler);
285+
$resourceReader = $this->resourceReader ??= new ResourceReader($registry, $referenceHandler, $logger);
286+
$promptGetter = $this->promptGetter ??= new PromptGetter($registry, $referenceHandler, $logger);
288287

289288
$this->registerManualElements($registry, $logger);
290289

tests/Capability/Prompt/PromptGetterTest.php

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
use Mcp\Exception\PromptGetException;
2020
use Mcp\Exception\PromptNotFoundException;
2121
use Mcp\Exception\RegistryException;
22-
use Mcp\Exception\RuntimeException;
2322
use Mcp\Schema\Content\PromptMessage;
2423
use Mcp\Schema\Content\TextContent;
2524
use Mcp\Schema\Enum\Role;
@@ -28,6 +27,7 @@
2827
use Mcp\Schema\Result\GetPromptResult;
2928
use PHPUnit\Framework\MockObject\MockObject;
3029
use PHPUnit\Framework\TestCase;
30+
use Psr\Log\LoggerInterface;
3131

3232
class PromptGetterTest extends TestCase
3333
{
@@ -605,6 +605,28 @@ public function testGetThrowsRuntimeExceptionForObjectHandlerResult(): void
605605
$this->promptGetter->get($request);
606606
}
607607

608+
public function testConstructorWithDefaultLogger(): void
609+
{
610+
$promptGetter = new PromptGetter(
611+
$this->referenceProvider,
612+
$this->referenceHandler,
613+
);
614+
615+
$this->assertInstanceOf(PromptGetter::class, $promptGetter);
616+
}
617+
618+
public function testConstructorWithCustomLogger(): void
619+
{
620+
$logger = $this->createMock(LoggerInterface::class);
621+
$promptGetter = new PromptGetter(
622+
$this->referenceProvider,
623+
$this->referenceHandler,
624+
$logger,
625+
);
626+
627+
$this->assertInstanceOf(PromptGetter::class, $promptGetter);
628+
}
629+
608630
private function createValidPrompt(string $name): Prompt
609631
{
610632
return new Prompt(

tests/Capability/Resource/ResourceReaderTest.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
use Mcp\Schema\Result\ReadResourceResult;
2828
use PHPUnit\Framework\MockObject\MockObject;
2929
use PHPUnit\Framework\TestCase;
30+
use Psr\Log\LoggerInterface;
3031

3132
class ResourceReaderTest extends TestCase
3233
{
@@ -471,6 +472,28 @@ public function testReadResourceCallsFormatResultOnReference(): void
471472
$this->assertSame($formattedResult, $result->contents);
472473
}
473474

475+
public function testConstructorWithDefaultLogger(): void
476+
{
477+
$resourceReader = new ResourceReader(
478+
$this->referenceProvider,
479+
$this->referenceHandler,
480+
);
481+
482+
$this->assertInstanceOf(ResourceReader::class, $resourceReader);
483+
}
484+
485+
public function testConstructorWithCustomLogger(): void
486+
{
487+
$logger = $this->createMock(LoggerInterface::class);
488+
$resourceReader = new ResourceReader(
489+
$this->referenceProvider,
490+
$this->referenceHandler,
491+
$logger,
492+
);
493+
494+
$this->assertInstanceOf(ResourceReader::class, $resourceReader);
495+
}
496+
474497
private function createValidResource(string $uri, string $name, ?string $mimeType = null): Resource
475498
{
476499
return new Resource(

tests/Schema/ServerCapabilitiesTest.php

Lines changed: 0 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -88,66 +88,6 @@ public function testConstructorWithNullValues(): void
8888
$this->assertNull($capabilities->experimental);
8989
}
9090

91-
public function testWithEvents(): void
92-
{
93-
$capabilities = new ServerCapabilities(
94-
tools: true,
95-
toolsListChanged: false,
96-
resources: true,
97-
resourcesSubscribe: false,
98-
resourcesListChanged: false,
99-
prompts: true,
100-
promptsListChanged: false,
101-
logging: false,
102-
completions: true
103-
);
104-
105-
$withEvents = $capabilities->withEvents();
106-
107-
$this->assertTrue($withEvents->tools);
108-
$this->assertTrue($withEvents->toolsListChanged);
109-
$this->assertTrue($withEvents->resources);
110-
$this->assertFalse($withEvents->resourcesSubscribe);
111-
$this->assertTrue($withEvents->resourcesListChanged);
112-
$this->assertTrue($withEvents->prompts);
113-
$this->assertTrue($withEvents->promptsListChanged);
114-
$this->assertFalse($withEvents->logging);
115-
$this->assertTrue($withEvents->completions);
116-
}
117-
118-
public function testWithEventsPreservesResourcesSubscribe(): void
119-
{
120-
$capabilities = new ServerCapabilities(
121-
resourcesSubscribe: true
122-
);
123-
124-
$withEvents = $capabilities->withEvents();
125-
126-
$this->assertTrue($withEvents->resourcesSubscribe);
127-
$this->assertTrue($withEvents->resourcesListChanged);
128-
}
129-
130-
public function testWithEventsIsImmutable(): void
131-
{
132-
$original = new ServerCapabilities(
133-
toolsListChanged: false,
134-
resourcesListChanged: false,
135-
promptsListChanged: false
136-
);
137-
138-
$withEvents = $original->withEvents();
139-
140-
$this->assertFalse($original->toolsListChanged);
141-
$this->assertFalse($original->resourcesListChanged);
142-
$this->assertFalse($original->promptsListChanged);
143-
144-
$this->assertTrue($withEvents->toolsListChanged);
145-
$this->assertTrue($withEvents->resourcesListChanged);
146-
$this->assertTrue($withEvents->promptsListChanged);
147-
148-
$this->assertNotSame($original, $withEvents);
149-
}
150-
15191
public function testFromArrayWithEmptyArray(): void
15292
{
15393
$capabilities = ServerCapabilities::fromArray([]);

0 commit comments

Comments
 (0)