get_name() ] = $get; $abilities[ $update->get_name() ] = $update; } return $abilities; } /** * Appends the per-Post Kit settings abilities to the convertkit_abilities * filter, so they are registered with the Abilities API and exposed via * the MCP server. * * @since 3.4.0 * * @param array $abilities Abilities to register. * @return array */ public function register_post_settings_abilities( $abilities ) { $abilities['kit/post-settings-get'] = new ConvertKit_MCP_Ability_Post_Settings_Get(); $abilities['kit/post-settings-update'] = new ConvertKit_MCP_Ability_Post_Settings_Update(); return $abilities; } /** * Appends the per-Category Kit settings abilities to the convertkit_abilities * filter, so they are registered with the Abilities API and exposed via * the MCP server. * * @since 3.4.0 * * @param array $abilities Abilities to register. * @return array */ public function register_category_settings_abilities( $abilities ) { $abilities['kit/category-settings-get'] = new ConvertKit_MCP_Ability_Category_Settings_Get(); $abilities['kit/category-settings-update'] = new ConvertKit_MCP_Ability_Category_Settings_Update(); return $abilities; } /** * Appends the resource-list abilities (Forms, Tags, Landing Pages, * Products) to the convertkit_abilities filter, so they are registered * with the Abilities API and exposed via the MCP server. * * @since 3.4.0 * * @param array $abilities Abilities to register. * @return array */ public function register_resource_abilities( $abilities ) { return array_merge( $abilities, array( 'kit/forms-list' => new ConvertKit_MCP_Ability_Resource_Forms(), 'kit/tags-list' => new ConvertKit_MCP_Ability_Resource_Tags(), 'kit/landing-pages-list' => new ConvertKit_MCP_Ability_Resource_Landing_Pages(), 'kit/products-list' => new ConvertKit_MCP_Ability_Resource_Products(), ) ); } /** * Appends the MCP resources (live-state lists, account, settings and * reference docs) to the convertkit_resources filter, so they are * registered with the Abilities API and exposed as MCP Resources. * * @since 3.5.0 * * @param array $resources Resources to register. * @return array */ public function register_mcp_resources( $resources ) { $mcp_resources = array( new ConvertKit_MCP_Resource_Forms(), new ConvertKit_MCP_Resource_Tags(), new ConvertKit_MCP_Resource_Landing_Pages(), new ConvertKit_MCP_Resource_Products(), new ConvertKit_MCP_Resource_Account(), new ConvertKit_MCP_Resource_Settings(), new ConvertKit_MCP_Resource_Overview(), new ConvertKit_MCP_Resource_Forms_Reference(), new ConvertKit_MCP_Resource_Restrict_Content_Reference(), new ConvertKit_MCP_Resource_Settings_Reference(), ); foreach ( $mcp_resources as $resource ) { $resources[ $resource->get_name() ] = $resource; } return $resources; } /** * Appends the MCP prompts (guided workflows) to the convertkit_prompts * filter, so they are registered with the Abilities API and exposed as * MCP Prompts. * * @since 3.5.0 * * @param array $prompts Prompts to register. * @return array */ public function register_mcp_prompts( $prompts ) { $mcp_prompts = array( new ConvertKit_MCP_Prompt_Setup(), new ConvertKit_MCP_Prompt_Add_Form(), new ConvertKit_MCP_Prompt_Restrict_Content(), new ConvertKit_MCP_Prompt_Configure_Broadcasts_Import(), new ConvertKit_MCP_Prompt_Audit(), ); foreach ( $mcp_prompts as $prompt ) { $prompts[ $prompt->get_name() ] = $prompt; } return $prompts; } /** * Register the 'kit' ability category. * * @since 3.4.0 */ public function register_abilities_category() { wp_register_ability_category( self::CATEGORY_SLUG, array( 'label' => __( 'Kit', 'convertkit' ), 'description' => __( 'Abilities exposed by the Kit Plugin.', 'convertkit' ), ) ); } /** * Register abilities with the WordPress Abilities API. * * @since 3.4.0 */ public function register_abilities() { // Get abilities. $abilities = convertkit_get_abilities(); // Bail if no abilities are available. if ( ! count( $abilities ) ) { return; } // Iterate through abilities, registering them. foreach ( $abilities as $ability ) { // Skip if this ability is not an instance of ConvertKit_MCP_Ability. if ( ! ( $ability instanceof ConvertKit_MCP_Ability ) ) { continue; } // Register ability. wp_register_ability( $ability->get_name(), $ability->get_ability_args() ); } } /** * Register MCP resources with the WordPress Abilities API. * * @since 3.4.2 */ public function register_resources() { // Get resources. $resources = convertkit_get_resources(); // Bail if no resources are available. if ( ! count( $resources ) ) { return; } // Iterate through resources, registering each as an ability. foreach ( $resources as $resource ) { // Skip if this resource is not an instance of ConvertKit_MCP_Resource. if ( ! ( $resource instanceof ConvertKit_MCP_Resource ) ) { continue; } // Register resource. wp_register_ability( $resource->get_name(), $resource->get_ability_args() ); } } /** * Register MCP prompts with the WordPress Abilities API. * * @since 3.4.2 */ public function register_prompts() { // Get prompts. $prompts = convertkit_get_prompts(); // Bail if no prompts are available. if ( ! count( $prompts ) ) { return; } // Iterate through prompts, registering each as an ability. foreach ( $prompts as $prompt ) { // Skip if this prompt is not an instance of ConvertKit_MCP_Prompt. if ( ! ( $prompt instanceof ConvertKit_MCP_Prompt ) ) { continue; } // Register prompt. wp_register_ability( $prompt->get_name(), $prompt->get_ability_args() ); } } /** * Register an MCP server that exposes Kit abilities as MCP tools. * * @since 3.4.0 * * @param object $adapter The MCP Adapter instance. * @return void */ public function register_mcp_server( $adapter ) { // Bail if the MCP server isn't enabled. $settings = new ConvertKit_Settings(); $mcp_settings = new ConvertKit_Settings_MCP(); if ( ! $mcp_settings->enabled() ) { return; } // Get abilities. $abilities = convertkit_get_abilities(); // Build array of ability names. $ability_names = array(); foreach ( $abilities as $ability ) { $ability_names[] = $ability->get_name(); } // Build array of resource names. $resource_names = array(); foreach ( convertkit_get_resources() as $resource ) { $resource_names[] = $resource->get_name(); } // Build array of prompt names. $prompt_names = array(); foreach ( convertkit_get_prompts() as $prompt ) { $prompt_names[] = $prompt->get_name(); } // Create the MCP server. $result = $adapter->create_server( self::SERVER_ID, self::SERVER_NAMESPACE, self::SERVER_ROUTE, __( 'Kit WordPress Plugin MCP', 'convertkit' ), __( 'Exposes Kit Plugin abilities over the Model Context Protocol.', 'convertkit' ), '1.0.0', array( 'WP\\MCP\\Transport\\HttpTransport' ), 'WP\\MCP\\Infrastructure\\ErrorHandling\\ErrorLogMcpErrorHandler', 'WP\\MCP\\Infrastructure\\Observability\\NullMcpObservabilityHandler', $ability_names, // Abilities (Tools). $resource_names, // Resources. $prompt_names // Prompts. ); // If an error occured when creating the server, log it. if ( is_wp_error( $result ) && $settings->debug_enabled() ) { $log = new ConvertKit_Log( CONVERTKIT_PLUGIN_PATH ); $log->add( 'MCP: create_server(): Error: ' . $result->get_error_message() ); } } }