package tool import "github.com/modelcontextprotocol/go-sdk/mcp" // Property describes one property in a tool's input schema. type Property struct { name string schema map[string]any required bool } // PropertyOption configures one property in a tool's input schema. type PropertyOption func(map[string]any) // NewDefinition builds a tool definition without enabling SDK-side validation. func NewDefinition(name, description string, annotations *mcp.ToolAnnotations, properties ...Property) *mcp.Tool { inputProperties := make(map[string]any, len(properties)) required := make([]string, 0, len(properties)) for _, property := range properties { inputProperties[property.name] = property.schema if property.required { required = append(required, property.name) } } inputSchema := map[string]any{ "type": "object", "properties": inputProperties, } if len(required) > 0 { inputSchema["required"] = required } return &mcp.Tool{ Name: name, Description: description, Annotations: annotations, InputSchema: inputSchema, } } func String(name string, options ...PropertyOption) Property { return newProperty(name, "string", false, options...) } func Number(name string, options ...PropertyOption) Property { return newProperty(name, "number", false, options...) } func Boolean(name string, options ...PropertyOption) Property { return newProperty(name, "boolean", false, options...) } func Array(name string, options ...PropertyOption) Property { return newProperty(name, "array", false, options...) } func Object(name string, options ...PropertyOption) Property { return newProperty(name, "object", true, options...) } func newProperty(name, propertyType string, object bool, options ...PropertyOption) Property { schema := map[string]any{"type": propertyType} if object { schema["properties"] = map[string]any{} } for _, option := range options { option(schema) } required, _ := schema["required"].(bool) delete(schema, "required") return Property{name: name, schema: schema, required: required} } func Required() PropertyOption { return func(schema map[string]any) { schema["required"] = true } } func Description(description string) PropertyOption { return func(schema map[string]any) { schema["description"] = description } } func Enum(values ...string) PropertyOption { return func(schema map[string]any) { schema["enum"] = values } } func Default(value any) PropertyOption { return func(schema map[string]any) { schema["default"] = value } } func Minimum(value float64) PropertyOption { return func(schema map[string]any) { schema["minimum"] = value } } func Items(schema any) PropertyOption { return func(propertySchema map[string]any) { propertySchema["items"] = schema } }