fix: prevent mcp-oauth's duplicate server registration instead of tolerating it
Proactively unhook wp-media/mcp-oauth's own mcp_adapter_init callback before creating our server, rather than letting it collide and rely on WP_DEBUG=true being harmless. The collision previously surfaced as a fatal-looking _doing_it_wrong notice under WP-CLI (breaking every wp command while the plugin is active) and could leak debug notices into HTTP responses on customer sites that run WP_DEBUG. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01At3V6SjwbMe6eMzVGW3Hs7
This commit is contained in:
@@ -12,9 +12,16 @@ use LIT\MCP\Integrations\IntegrationRegistry;
|
||||
use LIT\MCP\Server\ServerRegistrar;
|
||||
use LIT\MCP\Tests\Unit\TestCase;
|
||||
use Mockery;
|
||||
use WPMedia\MCP\OAuth\Transport\ServerRegistrar as OAuthServerRegistrar;
|
||||
|
||||
final class ServerRegistrarTest extends TestCase
|
||||
{
|
||||
protected function tearDown(): void
|
||||
{
|
||||
unset($GLOBALS['wp_filter']);
|
||||
parent::tearDown();
|
||||
}
|
||||
|
||||
private function registry(): IntegrationRegistry
|
||||
{
|
||||
$direct = Mockery::mock(Ability::class);
|
||||
@@ -77,4 +84,37 @@ final class ServerRegistrarTest extends TestCase
|
||||
|
||||
self::assertFalse($oauthChecked, 'createServer must bail out before touching the adapter');
|
||||
}
|
||||
|
||||
public function testUnhookOAuthDefaultServerRemovesOnlyTheMcpOauthCallback(): void
|
||||
{
|
||||
$oauthRegistrar = Mockery::mock(OAuthServerRegistrar::class);
|
||||
$oauthCallback = [$oauthRegistrar, 'register_server'];
|
||||
$unrelatedCallback = static function (): void {
|
||||
};
|
||||
|
||||
$hook = new class {
|
||||
/** @var array<int, array<string, array{function: mixed, accepted_args: int}>> */
|
||||
public array $callbacks = [];
|
||||
};
|
||||
$hook->callbacks = [
|
||||
5 => ['unrelated-id' => ['function' => $unrelatedCallback, 'accepted_args' => 0]],
|
||||
10 => ['oauth-id' => ['function' => $oauthCallback, 'accepted_args' => 0]],
|
||||
];
|
||||
$GLOBALS['wp_filter']['mcp_adapter_init'] = $hook;
|
||||
|
||||
Functions\expect('remove_action')
|
||||
->once()
|
||||
->with('mcp_adapter_init', $oauthCallback, 10);
|
||||
|
||||
(new ServerRegistrar($this->registry(), $this->instructions()))->unhookOAuthDefaultServer();
|
||||
}
|
||||
|
||||
public function testUnhookOAuthDefaultServerIsNoOpWhenHookIsMissing(): void
|
||||
{
|
||||
unset($GLOBALS['wp_filter']['mcp_adapter_init']);
|
||||
|
||||
Functions\expect('remove_action')->never();
|
||||
|
||||
(new ServerRegistrar($this->registry(), $this->instructions()))->unhookOAuthDefaultServer();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user