package main
import (
"context"
"fmt"
"log"
"time"
chucky "github.com/chucky-cloud/chucky-sdk-go"
)
func main() {
token, _ := chucky.CreateToken(chucky.CreateTokenOptions{
UserID: "user-123",
ProjectID: "your-project-id",
Secret: "hk_live_your_secret",
Budget: chucky.CreateBudget(chucky.CreateBudgetOptions{
AIDollars: 1.0,
ComputeHours: 0.5,
Window: chucky.BudgetWindowHour,
}),
})
// Define tools
greetTool := chucky.Tool(
"greet",
"Greet a user by name",
chucky.NewSchema().
String("name", "Name to greet").
Required("name").
Build(),
func(ctx context.Context, input map[string]interface{}) (*chucky.ToolResult, error) {
name := input["name"].(string)
fmt.Printf("[Tool] Greeting %s\n", name)
return chucky.TextResult(fmt.Sprintf("Hello, %s! Nice to meet you.", name)), nil
},
)
calculatorTool := chucky.Tool(
"calculate",
"Perform math calculations",
chucky.NewSchema().
Enum("op", "Operation", "add", "subtract", "multiply", "divide").
Number("a", "First number").
Number("b", "Second number").
Required("op", "a", "b").
Build(),
func(ctx context.Context, input map[string]interface{}) (*chucky.ToolResult, error) {
op := input["op"].(string)
a := input["a"].(float64)
b := input["b"].(float64)
var result float64
switch op {
case "add":
result = a + b
case "subtract":
result = a - b
case "multiply":
result = a * b
case "divide":
if b == 0 {
return chucky.ErrorResult("Cannot divide by zero"), nil
}
result = a / b
}
fmt.Printf("[Tool] %s(%g, %g) = %g\n", op, a, b, result)
return chucky.TextResult(fmt.Sprintf("Result: %g", result)), nil
},
)
// Create MCP server with tools
mcpServer := chucky.NewMcpServer("my-tools").
Version("1.0.0").
Add(greetTool).
Add(calculatorTool).
Build()
// Create client and session
client := chucky.NewClient(chucky.ClientOptions{
Token: token,
Debug: true,
})
defer client.Close()
session := client.CreateSession(&chucky.SessionOptions{
BaseOptions: chucky.BaseOptions{
Model: chucky.ModelClaudeSonnet,
MaxTurns: 10,
McpServers: []chucky.McpServerDefinition{mcpServer},
},
})
defer session.Close()
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
defer cancel()
// Send message that triggers tool use
if err := session.Send(ctx, "Use the calculator to multiply 15 by 7, then greet 'World'"); err != nil {
log.Fatal(err)
}
// Stream response
for msg := range session.Stream(ctx) {
switch m := msg.(type) {
case *chucky.SDKAssistantMessage:
text := chucky.GetAssistantText(m)
if text != "" {
fmt.Println("Assistant:", text)
}
case *chucky.SDKResultMessage:
fmt.Println("\n=== Result ===")
fmt.Println("Answer:", m.Result)
fmt.Printf("Cost: $%.6f\n", m.TotalCostUsd)
}
}
}