Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions src/wp-includes/connectors.php
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,24 @@ function _wp_connectors_init(): void {
// Only register default AI providers if AI support is enabled.
if ( wp_supports_ai() ) {
_wp_connectors_register_default_ai_providers( $registry );

$registry->register(
'mcp-adapter',
array(
'name' => __( 'WordPress MCP' ),
'description' => __( 'Connect AI agents and MCP clients to this site.' ),
'type' => 'mcp_server',
'plugin' => array(
'file' => 'mcp-adapter/mcp-adapter.php',
'is_active' => static function () {
return defined( 'WP_MCP_VERSION' );
},
),
'authentication' => array(
'method' => 'none',
),
)
);
}

// Non-AI default connectors.
Expand Down Expand Up @@ -965,6 +983,17 @@ function _wp_connectors_get_connector_script_module_data( array $data ): array {
ksort( $connectors );
$data['connectors'] = $connectors;
$data['isFileModDisabled'] = ! wp_is_file_mod_allowed( 'install_plugins' );

$user = wp_get_current_user();
$data['applicationPasswords'] = array(
'isSupported' => wp_is_application_passwords_supported(),
'isAvailable' => wp_is_application_passwords_available(),
'isAvailableForUser' => wp_is_application_passwords_available_for_user( $user ),
'canCreate' => current_user_can( 'create_app_password', $user->ID ),
'username' => $user->user_login,
'profileUrl' => admin_url( 'profile.php#application-passwords-section' ),
);

return $data;
}
add_filter( 'script_module_data_options-connectors-wp-admin', '_wp_connectors_get_connector_script_module_data' );
Original file line number Diff line number Diff line change
Expand Up @@ -209,4 +209,46 @@ public function test_environment_variable_password_may_contain_colons(): void {
$this->assertSame( 'env', $auth['keySource'] );
$this->assertTrue( $auth['isConnected'] );
}

/**
* @ticket 66323
*/
public function test_exposes_mcp_adapter_connector(): void {
$data = _wp_connectors_get_connector_script_module_data( array() );
$connector = $data['connectors']['mcp-adapter'];

$this->assertSame( 'mcp_server', $connector['type'] );
$this->assertSame( array( 'method' => 'none' ), $connector['authentication'] );
$this->assertSame(
array(
'file' => 'mcp-adapter/mcp-adapter.php',
'isInstalled' => false,
'isActivated' => false,
),
$connector['plugin']
);
}

/**
* @ticket 66323
*/
public function test_exposes_application_passwords_data_for_current_user(): void {
$user = self::factory()->user->create_and_get( array( 'role' => 'administrator' ) );
wp_set_current_user( $user->ID );
add_filter( 'wp_is_application_passwords_available', '__return_true' );

$data = _wp_connectors_get_connector_script_module_data( array() );

$this->assertSame(
array(
'isSupported' => wp_is_application_passwords_supported(),
'isAvailable' => true,
'isAvailableForUser' => true,
'canCreate' => true,
'username' => $user->user_login,
'profileUrl' => admin_url( 'profile.php#application-passwords-section' ),
),
$data['applicationPasswords']
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,9 @@ public function test_returns_expected_connector_keys(): void {
$this->assertArrayHasKey( 'openai', $connectors );
$this->assertArrayHasKey( 'anthropic', $connectors );
$this->assertArrayHasKey( 'akismet', $connectors );
$this->assertArrayHasKey( 'mcp-adapter', $connectors );
$this->assertArrayHasKey( 'mock-connectors-test', $connectors );
$this->assertCount( 5, $connectors );
$this->assertCount( 6, $connectors );
}

/**
Expand All @@ -57,7 +58,7 @@ public function test_each_connector_has_required_fields(): void {
$this->assertArrayHasKey( 'description', $connector_data, "Connector '{$connector_id}' is missing 'description'." );
$this->assertIsString( $connector_data['description'], "Connector '{$connector_id}' description should be a string." );
$this->assertArrayHasKey( 'type', $connector_data, "Connector '{$connector_id}' is missing 'type'." );
$this->assertContains( $connector_data['type'], array( 'ai_provider', 'spam_filtering' ), "Connector '{$connector_id}' has unexpected type '{$connector_data['type']}'." );
$this->assertContains( $connector_data['type'], array( 'ai_provider', 'spam_filtering', 'mcp_server' ), "Connector '{$connector_id}' has unexpected type '{$connector_data['type']}'." );
$this->assertArrayHasKey( 'authentication', $connector_data, "Connector '{$connector_id}' is missing 'authentication'." );
$this->assertIsArray( $connector_data['authentication'], "Connector '{$connector_id}' authentication should be an array." );
$this->assertArrayHasKey( 'method', $connector_data['authentication'], "Connector '{$connector_id}' authentication is missing 'method'." );
Expand Down
Loading