53 lines
1.1 KiB
V
53 lines
1.1 KiB
V
module mcp
|
|
|
|
|
|
pub fn result_to_mcp_tool_contents[T](result T) []ToolContent {
|
|
return [result_to_mcp_tool_content[T](result)]
|
|
}
|
|
|
|
pub fn result_to_mcp_tool_content[T](result T) ToolContent {
|
|
$if T is string {
|
|
return ToolContent{
|
|
typ: 'text'
|
|
text: result.str()
|
|
}
|
|
} $else $if T is int {
|
|
return ToolContent{
|
|
typ: 'number'
|
|
number: result.int()
|
|
}
|
|
} $else $if T is bool {
|
|
return ToolContent{
|
|
typ: 'boolean'
|
|
boolean: result.bool()
|
|
}
|
|
} $else $if result is $array {
|
|
mut items := []ToolContent{}
|
|
for item in result {
|
|
items << result_to_mcp_tool_content(item)
|
|
}
|
|
return ToolContent{
|
|
typ: 'array'
|
|
items: items
|
|
}
|
|
} $else $if T is $struct {
|
|
mut properties := map[string]ToolContent{}
|
|
$for field in T.fields {
|
|
properties[field.name] = result_to_mcp_tool_content(result.$(field.name))
|
|
}
|
|
return ToolContent{
|
|
typ: 'object'
|
|
properties: properties
|
|
}
|
|
} $else {
|
|
panic('Unsupported type: ${typeof(result)}')
|
|
}
|
|
}
|
|
|
|
pub fn array_to_mcp_tool_contents[U](array []U) []ToolContent {
|
|
mut contents := []ToolContent{}
|
|
for item in array {
|
|
contents << result_to_mcp_tool_content(item)
|
|
}
|
|
return contents
|
|
} |