The connection between core and client side is made by ID, the one and only.
Let's start...
About client, you got 2 files, skillname-e.dat & skillgrp.dat. You create a new id, let's say 500, I like to work with small numbers, 500-600 are not used and you'll avoid database errors.
skillname-e.dat
500 1 a,Trance\0 a,This is my freaking description.\0 a,none\0 a,none\0
500 = id, 1 = level, "This is my freaking description" is obviously, 1st "none" is used for enchantable skills (e.g: +1 Power), or you can use it for another purpose, for example "GM Skill". 2nd "none" is the brother of the first, for example you can write "The power is increased."
skillgrp.dat
500 1 2 0 -1 0 0.00000000 0 icon.XD 0 0 0 0 -1 -1
level, id, type, mp consume, cast range, cast style, hit time, if it's magic and so on. You better look at the existing ones to understand, it's very easy.
My example is a little empty, because it's a passive, you don't need these options.
p.s. In case you create an active skill, you need to add skill animation too, not only the icon.
---
Let's move to the other side, xml.
<skill id="500" levels="1" name="Trance">
<set name="target" val="TARGET_SELF"/>
<set name="skillType" val="BUFF"/>
<set name="operateType" val="OP_PASSIVE"/>
<for>
<mul order="0x30" stat="runSpd" val="2" /> <!-- +100% speed because you're a GM, blah. -->
</for>
</skill>
This is quite easy, you probably have edited at least one skill in your life. This is a passive, if you want it to make ACTIVE, just add reuseDelay, hitTime and effect for buff time, stack order & type. As about debuffs and other, look at other existing skills.
---
3rd chapter is about your custom request, adding it as "learn skill".
You can take a look at my rebirth manager.
You gotta touch RequestAcquireSkillInfo, RequestAcquireSkill, L2NpcInstance and SkillTreeTable. Also to create a new class for the xml parser, just like my L2RebirthSkillLearn. And of course the xml for it, as my example: rebirth_skills_tree.xml