* [Schema][Server] Add the extensions framework SEP-2133 defines enableExtension() took any string and advertised it, with no way for an extension to add a method: MessageFactory could not decode one, so nothing downstream ever saw it. Identifiers are now checked against the _meta key naming rules through ExtensionIdentifier - a prefix is mandatory, since an unprefixed name has no owner, and the modelcontextprotocol/mcp second labels the specification reserves are recognised. An extension implementing MethodProvidingExtensionInterface contributes both its message classes and the handlers serving them. MessageFactory::make() takes an $additional list of message classes, and RequestHandlerInterface's result template is covariant so a handler declaring a concrete result satisfies a collection typed by the interface. * Fix stale @see reference in MethodProvidingExtensionInterface docblock * [Schema][Server][Client] Make ExtensionIdentifier a value object ExtensionInterface::getId() now returns ExtensionIdentifier, which validates the SEP-2133 naming rules at construction instead of the callers checking it. getMessages()/getRequestHandlers() move into ExtensionInterface itself; AbstractExtension gives them empty defaults for extensions that only announce a capability.
39 lines
1.1 KiB
PHP
39 lines
1.1 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the official PHP MCP SDK.
|
|
*
|
|
* A collaboration between Symfony and the PHP Foundation.
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Mcp\Tests\Unit\Schema\Extension;
|
|
|
|
use Mcp\Schema\Extension\AbstractExtension;
|
|
use Mcp\Schema\Extension\ExtensionIdentifier;
|
|
use PHPUnit\Framework\Attributes\TestDox;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
class AbstractExtensionTest extends TestCase
|
|
{
|
|
#[TestDox('An extension that only announces a capability need not declare messages or handlers')]
|
|
public function testDefaultsToNoMessagesOrHandlers(): void
|
|
{
|
|
$extension = new class extends AbstractExtension {
|
|
public function getId(): ExtensionIdentifier
|
|
{
|
|
return new ExtensionIdentifier('com.example/minimal');
|
|
}
|
|
|
|
public function getCapabilities(): array
|
|
{
|
|
return [];
|
|
}
|
|
};
|
|
|
|
$this->assertSame([], $extension->getMessages());
|
|
$this->assertSame([], $extension->getRequestHandlers());
|
|
}
|
|
}
|