dation_enabled', array( __CLASS__, 'disable_mcp_validation' ), 999 ); } } /** * Get WooCommerce abilities for MCP server. * * Filters abilities to include only those with 'woocommerce/' namespace by default, * with a filter to allow inclusion of abilities from other namespaces. * * @return array Array of ability IDs for MCP server. */ private function get_woocommerce_mcp_abilities(): array { // Get all abilities from the registry. $abilities_registry = wc_get_container()->get( AbilitiesRegistry::class ); $all_abilities_ids = $abilities_registry->get_abilities_ids(); // Filter abilities based on namespace and custom filter. $mcp_abilities = array_filter( $all_abilities_ids, static function ( $ability_id ) { // Include WooCommerce abilities by default. $include = str_starts_with( $ability_id, 'woocommerce/' ); // Allow filter to override inclusion decision. /** * Filter to override MCP ability inclusion decision. * * @since 10.3.0 * * @param bool $include Whether to include the ability. * @param string $ability_id The ability ID. */ return apply_filters( 'woocommerce_mcp_include_ability', $include, $ability_id ); } ); // Re-index array. return array_values( $mcp_abilities ); } /** * Temporarily disable MCP validation. * * Used as a callback for the mcp_validation_enabled filter to work around * validator bugs with union types. * * @return bool Always returns false to disable validation. */ public static function disable_mcp_validation(): bool { return false; } /** * Check if MCP adapter is initialized. * * @return bool Whether MCP adapter is initialized. */ public function is_initialized(): bool { return $this->initialized; } /** * Check if the current request is for the MCP endpoint. * * @return bool True if this is an MCP endpoint request. */ public static function is_mcp_request(): bool { // Check if this is a REST request. if ( ! wp_is_serving_rest_request() ) { return false; } // Get the request URI. $request_uri = isset( $_SERVER['REQUEST_URI'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : ''; // Build the MCP endpoint path dynamically from constants. $mcp_endpoint = '/' . self::MCP_NAMESPACE . '/' . self::MCP_ROUTE; // Check if the request is for the MCP endpoint. return false !== strpos( $request_uri, $mcp_endpoint ); } }