[Schema] Serialize a settingless extension as an object (#438)

* [Schema] Serialize a settingless extension as an object

An extension declaring support with no settings was advertised as `[]`, an
empty JSON array, which the wire schema rejects - `extensions` maps an id to
a settings *object*. Both ServerCapabilities and ClientCapabilities now cast
each entry, so it goes out as `{}`.

* Apply suggestion from @chr-hertel
This commit is contained in:
Christopher Hertel 2026-08-18 14:59:12 +02:00 • committed by GitHub
commit 08d332c7ac
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -57,6 +57,24 @@ class CapabilitiesExtensionsTest extends TestCase
$this->assertObjectHasProperty(McpApps::EXTENSION_ID, $json['extensions']);
}
public function testServerCapabilitiesSerializeSettinglessExtensionAsObject(): void
{
$caps = new ServerCapabilities(tools: true, extensions: ['acme/thing' => []]);
$json = json_encode($caps->jsonSerialize(), \JSON_UNESCAPED_SLASHES);
$this->assertStringContainsString('"acme/thing":{}', (string) $json);
}
public function testClientCapabilitiesSerializeSettinglessExtensionAsObject(): void
{
$caps = new ClientCapabilities(elicitation: true, extensions: ['acme/thing' => []]);
$json = json_encode($caps->jsonSerialize(), \JSON_UNESCAPED_SLASHES);
$this->assertStringContainsString('"acme/thing":{}', (string) $json);
}
public function testServerCapabilitiesJsonSerializeWithoutExtensions(): void
{
$caps = new ServerCapabilities(tools: true);