Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion responses/response.go
Original file line number Diff line number Diff line change
Expand Up @@ -12137,10 +12137,20 @@ func ToolParamOfComputerUsePreview(displayHeight int64, displayWidth int64, envi
return ToolUnionParam{OfComputerUsePreview: &computerUsePreview}
}

func ToolParamOfMcp(serverLabel string, serverURL string) ToolUnionParam {
func ToolParamOfMcp(serverLabel string, serverURL string, allowedTools []string, requireApproval string) ToolUnionParam {
var mcp ToolMcpParam
mcp.ServerLabel = serverLabel
mcp.ServerURL = serverURL
if len(allowedTools) > 0 {
mcp.AllowedTools = ToolMcpAllowedToolsUnionParam{
OfMcpAllowedTools: allowedTools,
}
}
if requireApproval != "" {
mcp.RequireApproval = ToolMcpRequireApprovalUnionParam{
OfMcpToolApprovalSetting: param.NewOpt(requireApproval),
}
}
return ToolUnionParam{OfMcp: &mcp}
}

Expand Down
147 changes: 147 additions & 0 deletions responses/response_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/openai/openai-go/v2"
"github.com/openai/openai-go/v2/internal/testutil"
"github.com/openai/openai-go/v2/option"
"github.com/openai/openai-go/v2/packages/param"
"github.com/openai/openai-go/v2/responses"
"github.com/openai/openai-go/v2/shared"
)
Expand Down Expand Up @@ -170,3 +171,149 @@ func TestResponseCancel(t *testing.T) {
t.Fatalf("err should be nil: %s", err.Error())
}
}

func TestToolParamOfMcp(t *testing.T) {
// Test with all parameters
t.Run("with all parameters", func(t *testing.T) {
serverLabel := "test-server"
serverURL := "https://test-mcp-server.com"
allowedTools := []string{"search_products", "send_email"}
requireApproval := "never"

tool := responses.ToolParamOfMcp(serverLabel, serverURL, allowedTools, requireApproval)

if tool.OfMcp == nil {
t.Fatal("Expected OfMcp to be non-nil")
}

mcp := tool.OfMcp
if mcp.ServerLabel != serverLabel {
t.Errorf("Expected ServerLabel to be %s, got %s", serverLabel, mcp.ServerLabel)
}

if mcp.ServerURL != serverURL {
t.Errorf("Expected ServerURL to be %s, got %s", serverURL, mcp.ServerURL)
}

if param.IsOmitted(mcp.AllowedTools) {
t.Error("Expected AllowedTools to be set")
} else {
if mcp.AllowedTools.OfMcpAllowedTools == nil {
t.Error("Expected OfMcpAllowedTools to be set")
} else {
tools := mcp.AllowedTools.OfMcpAllowedTools
if len(tools) != 2 || tools[0] != "search_products" || tools[1] != "send_email" {
t.Errorf("Expected allowedTools to be %v, got %v", allowedTools, tools)
}
}
}

if param.IsOmitted(mcp.RequireApproval) {
t.Error("Expected RequireApproval to be set")
} else {
if param.IsOmitted(mcp.RequireApproval.OfMcpToolApprovalSetting) {
t.Error("Expected OfMcpToolApprovalSetting to be set")
} else {
if mcp.RequireApproval.OfMcpToolApprovalSetting.Value != requireApproval {
t.Errorf("Expected requireApproval to be %s, got %s", requireApproval, mcp.RequireApproval.OfMcpToolApprovalSetting.Value)
}
}
}
})

// Test with empty allowedTools
t.Run("with empty allowed tools", func(t *testing.T) {
serverLabel := "test-server"
serverURL := "https://test-mcp-server.com"
var allowedTools []string // empty slice
requireApproval := "auto"

tool := responses.ToolParamOfMcp(serverLabel, serverURL, allowedTools, requireApproval)

if tool.OfMcp == nil {
t.Fatal("Expected OfMcp to be non-nil")
}

mcp := tool.OfMcp
if !param.IsOmitted(mcp.AllowedTools) {
t.Error("Expected AllowedTools to be omitted when empty slice provided")
}

if param.IsOmitted(mcp.RequireApproval) {
t.Error("Expected RequireApproval to be set")
}
})

// Test with nil allowedTools
t.Run("with nil allowed tools", func(t *testing.T) {
serverLabel := "test-server"
serverURL := "https://test-mcp-server.com"
var allowedTools []string = nil // nil slice
requireApproval := "always"

tool := responses.ToolParamOfMcp(serverLabel, serverURL, allowedTools, requireApproval)

if tool.OfMcp == nil {
t.Fatal("Expected OfMcp to be non-nil")
}

mcp := tool.OfMcp
if !param.IsOmitted(mcp.AllowedTools) {
t.Error("Expected AllowedTools to be omitted when nil slice provided")
}
})

// Test with empty requireApproval
t.Run("with empty require approval", func(t *testing.T) {
serverLabel := "test-server"
serverURL := "https://test-mcp-server.com"
allowedTools := []string{"search_products"}
requireApproval := "" // empty string

tool := responses.ToolParamOfMcp(serverLabel, serverURL, allowedTools, requireApproval)

if tool.OfMcp == nil {
t.Fatal("Expected OfMcp to be non-nil")
}

mcp := tool.OfMcp
if !param.IsOmitted(mcp.RequireApproval) {
t.Error("Expected RequireApproval to be omitted when empty string provided")
}

if param.IsOmitted(mcp.AllowedTools) {
t.Error("Expected AllowedTools to be set")
}
})

// Test minimal case (both optional parameters empty)
t.Run("minimal parameters", func(t *testing.T) {
serverLabel := "minimal-server"
serverURL := "https://minimal-server.com"
var allowedTools []string // empty
requireApproval := "" // empty

tool := responses.ToolParamOfMcp(serverLabel, serverURL, allowedTools, requireApproval)

if tool.OfMcp == nil {
t.Fatal("Expected OfMcp to be non-nil")
}

mcp := tool.OfMcp
if mcp.ServerLabel != serverLabel {
t.Errorf("Expected ServerLabel to be %s, got %s", serverLabel, mcp.ServerLabel)
}

if mcp.ServerURL != serverURL {
t.Errorf("Expected ServerURL to be %s, got %s", serverURL, mcp.ServerURL)
}

if !param.IsOmitted(mcp.AllowedTools) {
t.Error("Expected AllowedTools to be omitted")
}

if !param.IsOmitted(mcp.RequireApproval) {
t.Error("Expected RequireApproval to be omitted")
}
})
}