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
31 changes: 29 additions & 2 deletions internal/gpt/tooling/tooling.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"github.com/openai/openai-go/v2"
"github.com/openai/openai-go/v2/packages/param"
"github.com/openai/openai-go/v2/responses"
"github.com/traPtitech/BOT_GPT/internal/pkg/config"
)

type ToolKind string
Expand All @@ -26,6 +27,7 @@ type MCPOptions struct {
ServerLabel string
ServerURL param.Opt[string]
ApprovalPolicy string
Authorization param.Opt[string]
}

func (o MCPOptions) validate() error {
Expand All @@ -38,6 +40,12 @@ func (o MCPOptions) validate() error {
if strings.TrimSpace(o.ApprovalPolicy) == "" {
return errors.New("mcp approval policy is required")
}
if o.ApprovalPolicy != "always" && o.ApprovalPolicy != "never" && o.ApprovalPolicy != "prompt" {
return fmt.Errorf("invalid mcp approval policy: %s", o.ApprovalPolicy)
}
if o.Authorization.Valid() && strings.TrimSpace(o.Authorization.Value) == "" {
return errors.New("mcp authorization, if provided, cannot be empty")
}

return nil
}
Expand All @@ -64,8 +72,9 @@ func (s Spec) ToResponseTool() (responses.ToolUnionParam, error) {
case ToolKindMCP:
return responses.ToolUnionParam{
OfMcp: &responses.ToolMcpParam{
ServerLabel: s.MCP.ServerLabel,
ServerURL: s.MCP.ServerURL,
ServerLabel: s.MCP.ServerLabel,
ServerURL: s.MCP.ServerURL,
Authorization: s.MCP.Authorization,
RequireApproval: responses.ToolMcpRequireApprovalUnionParam{
OfMcpToolApprovalSetting: openai.Opt(s.MCP.ApprovalPolicy),
},
Expand Down Expand Up @@ -126,5 +135,23 @@ func DefaultSpecs() []Spec {
ApprovalPolicy: "never",
},
},
{
Kind: ToolKindMCP,
MCP: &MCPOptions{
ServerLabel: "Grafana (ConoHa)",
ServerURL: param.NewOpt("https://grafana-mcp.trap.jp/sse"),
ApprovalPolicy: "never",
Authorization: param.NewOpt("Bearer " + config.MCP().GrafanaMCPBearerToken),
},
},
{
Kind: ToolKindMCP,
MCP: &MCPOptions{
ServerLabel: "Grafana (Sakura)",
ServerURL: param.NewOpt("https://s-grafana-mcp.trap.jp/sse"),
ApprovalPolicy: "never",
Authorization: param.NewOpt("Bearer " + config.MCP().GrafanaMCPBearerToken),
},
},
}
}
21 changes: 0 additions & 21 deletions internal/gpt/tooling/tooling_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,24 +107,3 @@ func TestStaticProviderNil(t *testing.T) {
t.Fatalf("expected nil tools, got %v", tools)
}
}

func TestDefaultSpecsProvider(t *testing.T) {
provider := NewStaticProvider(DefaultSpecs())

tools, err := provider.Tools(context.Background())
if err != nil {
t.Fatalf("Tools returned error: %v", err)
}

if len(tools) != 1 {
t.Fatalf("expected 1 tool, got %d", len(tools))
}

if tools[0].OfMcp == nil {
t.Fatalf("expected MCP tool variant")
}

if got := tools[0].OfMcp.ServerLabel; got != "deepwiki" {
t.Fatalf("ServerLabel = %q, want %q", got, "deepwiki")
}
}
18 changes: 18 additions & 0 deletions internal/pkg/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,14 @@ func getEnv(key, defaultValue string) string {
return defaultValue
}

func mustGetEnv(key string) string {
if value, exists := os.LookupEnv(key); exists {
return value
}

panic(fmt.Sprintf("environment variable %s is required", key))
}

func AppAddr() string {
return getEnv("APP_ADDR", ":8080")
}
Expand Down Expand Up @@ -50,3 +58,13 @@ func MySQL() *mysql.Config {

return c
}

type MCPConfig struct {
GrafanaMCPBearerToken string
}

func MCP() *MCPConfig {
return &MCPConfig{
GrafanaMCPBearerToken: mustGetEnv("GRAFANA_MCP_BEARER_TOKEN"),
}
}
Loading