Probably the cleanest way of doing it is by handling it the way you currently are (with clickable bodies), and then signalling to parent when a pieces is clicked. I assume your parent is instancing the pieces, so the code might look something like:
For the piece:
extends KinematicBody2D
signal clicked(node)
func _input_event(event):
emit_signal("clicked", self)
And then the parent:
extends WhatEverThisExtends
const Piece = preload(res://Piece.tscn)
func addPiece():
var piece = Piece.instance()
piece.connect("clicked", self, "handle_piece_click")
add_child(piece)
func handle_piece_click(piece):
#do something with your piece
It is also possible to have the pieces connect their own signals on _ready()
func _ready():
connect("clicked", get_parent(), "handle_piece_click")
But I prefer not to depend on my scenes knowing anything about their parent.