[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:
Nariman Gardi 2026-07-06 01:09:45 +03:00 • committed by GitHub
commit 00a568e8d9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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 : [];
}
}