[Server] Fix completion/complete crash for plain ref/resource (#388)
A non-template resource resolves to a ResourceReference, which has no completionProviders property; only prompts and resource templates do. Read providers from those instead, returning an empty completion result when a resource has none.
This commit is contained in:
parent
30e520a019
commit
00a568e8d9
1 changed files with 111 additions and 4 deletions
|
|
@ -12,6 +12,7 @@
|
|||
namespace Mcp\Server\Handler\Request;
|
||||
|
||||
use Mcp\Capability\Completion\ProviderInterface;
|
||||
use Mcp\Capability\Registry\ResourceTemplateReference;
|
||||
use Mcp\Capability\RegistryInterface;
|
||||
use Mcp\Exception\PromptNotFoundException;
|
||||
use Mcp\Exception\ResourceNotFoundException;
|
||||
|
|
@ -56,12 +57,11 @@ final class CompletionCompleteHandler implements RequestHandlerInterface
|
|||
$value = $request->argument['value'] ?? '';
|
||||
|
||||
try {
|
||||
$reference = match (true) {
|
||||
$request->ref instanceof PromptReference => $this->registry->getPrompt($request->ref->name),
|
||||
$request->ref instanceof ResourceReference => $this->registry->getResource($request->ref->uri),
|
||||
$providers = match (true) {
|
||||
$request->ref instanceof PromptReference => $this->registry->getPrompt($request->ref->name)->completionProviders,
|
||||
$request->ref instanceof ResourceReference => $this->resourceCompletionProviders($request->ref->uri),
|
||||
};
|
||||
|
||||
$providers = $reference->completionProviders;
|
||||
$provider = $providers[$name] ?? null;
|
||||
if (null === $provider) {
|
||||
return new Response($request->getId(), new CompletionCompleteResult([]));
|
||||
|
|
@ -90,4 +90,14 @@ final class CompletionCompleteHandler implements RequestHandlerInterface
|
|||
return Error::forInternalError('Error while handling completion request', $request->getId());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, class-string|object>
|
||||
*/
|
||||
private function resourceCompletionProviders(string $uri): array
|
||||
{
|
||||
$reference = $this->registry->getResource($uri);
|
||||
|
||||
return $reference instanceof ResourceTemplateReference ? $reference->completionProviders : [];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue