Not yet for this implementation, since I jumped to working on the Bézier Curve version, but as you see on the script, it is 3D ready, most of variables are using vector3. On the following portion of code, simply change the “atan2” to some others find 3D angle method that should make it work on 3D too 
//---- parent joins
t[0].z += atan2(target_vec.y, target_vec.x)*r2d;
if(join[0].parent)
{
t[0].z -= join[0].parent.eulerAngles.z;
}
yeah… as of the above code, after find the 3D angle, minus it with the parent join angle 
This is the full script for your reference.
(remark, this script should apply on the “child” bone)
var reference:GameObject;
var bone_0 :float = 1;
var bone_1 :float = 1;
var join_bias :float = 0;
private var target:GameObject;
function IK_2bone(a0:float, a1:float, mag:float):float[]
{
if (abs(a0-a1) > mag) { return [0.0, 180.0]; }
if (abs(a0+a1) < mag) { return [0.0, 0.0]; }
//var a = a0+a1;
var b = mag;
var x0 = CosLaw( b, a0, a1);
var x1 = CosLaw(a0, a1, b);
var t0 = (x0 -PI/2.0)*r2d;
var t1 = (x1 +PI/2.0)*r2d;
return [t0, t1];
}
function FixedUpdate ()
{
if(reference target)
{
target.transform.position = reference.transform.position;
}
//----- setup joins
var L:int = 2;
var join = new Array();
join[L-1] = this.transform;
var i:int;
for(i=L-1;i>0;i--)
{
join[i-1] = join[i].parent;
}
//----- setup target
if (!target)
{
target = new GameObject();
target.name = "_target";
target.transform.position = Vector3.zero;
target.transform.parent = this.transform;
target.transform.localPosition = Vector3(bone_1, 0, 0);
}
//----- calc vector
var base_pos = join[0].transform.position;
var target_pos = target.transform.position;
var target_vec = (target_pos - base_pos).normalized;
var target_mag = (target_pos - base_pos).magnitude;
//---- init
var t = new Vector3[L];
for(i=0;i<L;i++)
{
t[i] = Vector3.zero;
}
//----- body joins
var sector_angle = new float[L];
sector_angle = IK_2bone(bone_0, bone_1, target_mag);
var dotL = Vector3.Dot(target_vec,join[L-1].transform.up);
for(i=0;i<L;i++)
{
t[i].z -= sector_angle[i]*sign(dotL +join_bias);
}
//---- parent joins
t[0].z += atan2(target_vec.y, target_vec.x)*r2d;
if(join[0].parent)
{
t[0].z -= join[0].parent.eulerAngles.z;
}
//---- assign
target.transform.parent = null;
for(i=0;i<L;i++)
{
join[i].Rotate(t[i]-join[i].localEulerAngles);
}
target.transform.parent = this.transform;
_pline(target_pos, base_pos, 6);
}
//-------------------- helper ------------------------------
function OnDrawGizmos()
{
if(!target) return;
Gizmos.color = Color(1,1,0);
Gizmos.DrawCube (target.transform.position, Vector3.one*0.05);
}
private static var TP_str: String = "...";
function OnGUI() { GUI.Label(Rect(0,0,320,240), TP_str); }
function CosLaw(a:float, b:float, c:float):float
{
return asin((a*a+b*b-c*c)/(2*a*b));
}
function _ray(p:Vector3, v:Vector3, c:Color) { Debug().DrawRay(p,v,c); }
function _pline(p1:Vector3, p2:Vector3, c:int)
{
var b = c % 2; c /=2;
var g = c % 2; c /=2;
var r = c % 2;
_line(p1, p2, Color(r, g, b));
}
private var _log = Debug().Log;
private var _line = Debug().DrawLine;
private var atan2 = Mathf().Atan2;
private var asin = Mathf().Asin;
private var PI = Mathf().PI;
private var r2d = Mathf().Rad2Deg;
private var sqrt = Mathf().Sqrt;
private var sign = Mathf().Sign;
private var abs = Mathf().Abs;
(once again, most of the math and debug function are overloaded :p)