[Capability] Remove CompletionProvider's dead providerClass argument (#499)

* [Capability] Remove CompletionProvider's dead providerClass argument

It always threw on construction, so it never worked in any release. `provider:`
takes the same class-string and is now the first positional argument.

* Reword Changelog
This commit is contained in:
Christopher Hertel 2026-09-07 23:27:53 +02:00 • committed by GitHub
commit f39625b257
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 197 additions and 10 deletions

View file

@ -94,7 +94,7 @@ class DiscoveryTest extends TestCase
$this->assertEquals([InvocablePromptFixture::class, '__invoke'], $prompts['InvokableGreeterPrompt']->handler);
$this->assertArrayHasKey('content_creator', $prompts);
$this->assertCount(3, $prompts['content_creator']->completionProviders);
$this->assertCount(4, $prompts['content_creator']->completionProviders);
$templates = $discovery->getResourceTemplates();
$this->assertCount(4, $templates);
@ -165,7 +165,7 @@ class DiscoveryTest extends TestCase
$discovery = $this->discoverer->discover(__DIR__, ['Fixtures']);
$this->assertArrayHasKey('content_creator', $prompts = $discovery->getPrompts());
$this->assertCount(3, $prompts['content_creator']->completionProviders);
$this->assertCount(4, $prompts['content_creator']->completionProviders);
$typeProvider = $prompts['content_creator']->completionProviders['type'];
$this->assertInstanceOf(ListCompletionProvider::class, $typeProvider);
@ -182,4 +182,14 @@ class DiscoveryTest extends TestCase
$categoryProvider = $templates['content://{category}/{slug}']->completionProviders['category'];
$this->assertInstanceOf(ListCompletionProvider::class, $categoryProvider);
}
public function testDiscoversPositionalCompletionProviderAsClassString(): void
{
$discovery = $this->discoverer->discover(__DIR__, ['Fixtures']);
$this->assertArrayHasKey('content_creator', $prompts = $discovery->getPrompts());
// Kept as a class-string so the container resolves it at the point of use.
$this->assertEquals(CompletionProviderFixture::class, $prompts['content_creator']->completionProviders['author']);
}
}

View file

@ -14,13 +14,14 @@ namespace Mcp\Tests\Unit\Capability\Discovery\Fixtures;
use Mcp\Capability\Attribute\CompletionProvider;
use Mcp\Capability\Attribute\McpPrompt;
use Mcp\Capability\Attribute\McpResourceTemplate;
use Mcp\Tests\Unit\Capability\Attribute\CompletionProviderFixture;
use Mcp\Tests\Unit\Fixtures\Enum\PriorityEnum;
use Mcp\Tests\Unit\Fixtures\Enum\StatusEnum;
class EnhancedCompletionHandler
{
/**
* Create content with list and enum completion providers.
* Create content with list, enum and positional provider completion providers.
*/
#[McpPrompt(name: 'content_creator')]
public function createContent(
@ -30,9 +31,11 @@ class EnhancedCompletionHandler
string $status,
#[CompletionProvider(enum: PriorityEnum::class)]
string $priority,
#[CompletionProvider(CompletionProviderFixture::class)]
string $author,
): array {
return [
['role' => 'user', 'content' => "Create a {$type} with status {$status} and priority {$priority}"],
['role' => 'user', 'content' => "Create a {$type} with status {$status} and priority {$priority} for {$author}"],
];
}