can_track() ) { return; } $execution_time_ms = ( microtime( true ) - $start_time ) * 1000; $is_error = is_wp_error( $result ); $properties = array_merge( $this->get_default_event_properties( 'wp_plugin_mcp' ), [ 'ability_id' => $ability_id, 'ability_name' => $ability_name, 'success' => ! $is_error, 'execution_time_ms' => round( $execution_time_ms, 2 ), 'input_params' => $this->sanitize_input_params( $input_params ), ] ); // Add error information if execution failed. if ( $is_error ) { $properties['error_code'] = $result->get_error_code(); $properties['error_message'] = $result->get_error_message(); } // Add user information if available. $user = wp_get_current_user(); if ( $user->exists() ) { $this->identify_user( $user ); $properties['user_id'] = $user->ID; } $this->mixpanel->track( 'MCP Ability Executed', $properties ); } /** * Track MCP ability permission denial. * * @param string $ability_id Ability ID. * @param string $ability_name Tool name. * @param string $required_capability Required capability. * * @return void */ public function track_permission_denied( string $ability_id, string $ability_name, string $required_capability ): void { if ( ! $this->can_track() ) { return; } $user = wp_get_current_user(); $properties = array_merge( $this->get_default_event_properties( 'wp_plugin_mcp' ), [ 'ability_id' => $ability_id, 'ability_name' => $ability_name, 'required_capability' => $required_capability, 'user_id' => $user->ID, 'user_role' => $this->get_user_primary_role( $user ), 'permission_denied' => true, ] ); $this->identify_user( $user ); $this->mixpanel->track( 'MCP Ability Permission Denied', $properties ); } /** * Track MCP-initiated backup job. * * Uses the same event name as the standard backup path ("Scheduled Backup Job Started") * so Mixpanel can aggregate all triggers; the context property (wp_plugin_mcp) distinguishes the source. * * @param int|null $job_id Job ID (null for default job). * @param string $job_name Job name. * @param bool $is_default Whether it's the default "Backup Now" job. * @param array $destinations Storage destinations. * @param array $job_types Backup types. * * @return void */ public function track_mcp_backup_triggered( ?int $job_id, string $job_name, bool $is_default, array $destinations, array $job_types ): void { if ( ! $this->can_track() ) { return; } $user = wp_get_current_user(); $properties = array_merge( $this->get_default_event_properties( 'wp_plugin_mcp' ), [ 'job_id' => $job_id, 'job_name' => $job_name, 'is_default_job' => $is_default, 'initiated_via' => 'mcp', 'destinations' => $destinations, 'job_types' => $job_types, ] ); if ( $user->exists() ) { $this->identify_user( $user ); $properties['user_id'] = $user->ID; } $this->mixpanel->track( 'MCP Backup Job Triggered', $properties ); } }