// internal/tools/v1/dashboards.go
package v1
import (
"context"
"encoding/json"
"fmt"
"log"
v1 "github.com/chussenot/datadog-mcp/internal/api/v1"
"github.com/chussenot/datadog-mcp/internal/client"
"github.com/chussenot/datadog-mcp/internal/types"
"github.com/modelcontextprotocol/go-sdk/mcp"
)
// ListDashboards lists all dashboards in DataDog
func ListDashboards(ctx context.Context, client *client.DataDogClient, args types.ListDashboardsArgs) (*mcp.CallToolResult, any, error) {
log.Printf("🔍 Calling DataDog API v1: ListDashboards with filter: %v", args.Filter)
// Call the real DataDog API
resp, err := client.Client.ListDashboardsWithResponse(ctx, &v1.ListDashboardsParams{})
if err != nil {
log.Printf("❌ API call error: %v", err)
return &mcp.CallToolResult{
IsError: true,
Content: []mcp.Content{&mcp.TextContent{Text: fmt.Sprintf("API call failed: %v", err)}},
}, nil, nil
}
log.Printf("📊 API Response Status: %d", resp.StatusCode())
log.Printf("📊 API Response Headers: %+v", resp.HTTPResponse.Header)
// Check response status
if resp.StatusCode() < 200 || resp.StatusCode() >= 300 {
body := "No response body"
if resp.Body != nil {
body = string(resp.Body)
}
log.Printf("❌ API error response: status %d, body: %s", resp.StatusCode(), body)
return &mcp.CallToolResult{
IsError: true,
Content: []mcp.Content{&mcp.TextContent{Text: fmt.Sprintf("API returned status %d: %s", resp.StatusCode(), body)}},
}, nil, nil
}
// Check if we have JSON response data
if resp.JSON200 == nil {
log.Printf("❌ No JSON200 data in response")
log.Printf("❌ Response body: %s", string(resp.Body))
return &mcp.CallToolResult{
IsError: true,
Content: []mcp.Content{&mcp.TextContent{Text: "No JSON response data available"}},
}, nil, nil
}
// Convert the response to JSON string
jsonBytes, err := json.Marshal(resp.JSON200)
if err != nil {
log.Printf("❌ Failed to marshal JSON response: %v", err)
return &mcp.CallToolResult{
IsError: true,
Content: []mcp.Content{&mcp.TextContent{Text: fmt.Sprintf("Failed to marshal response: %v", err)}},
}, nil, nil
}
dashboardCount := 0
if resp.JSON200 != nil && resp.JSON200.Dashboards != nil {
dashboardCount = len(*resp.JSON200.Dashboards)
}
log.Printf("✅ Successfully retrieved %d dashboards", dashboardCount)
return &mcp.CallToolResult{
Content: []mcp.Content{
&mcp.TextContent{Text: string(jsonBytes)},
},
}, nil, nil
}
// GetDashboard gets details of a specific dashboard
func GetDashboard(ctx context.Context, client *client.DataDogClient, args types.GetDashboardArgs) (*mcp.CallToolResult, any, error) {
log.Printf("🔍 Calling DataDog API v1: GetDashboard with ID: %s", args.DashboardID)
log.Printf("🔍 Request context: %+v", ctx)
// Call the real DataDog API
resp, err := client.Client.GetDashboardWithResponse(ctx, args.DashboardID)
if err != nil {
log.Printf("❌ API call error: %v", err)
log.Printf("❌ Error type: %T", err)
return &mcp.CallToolResult{
IsError: true,
Content: []mcp.Content{&mcp.TextContent{Text: fmt.Sprintf("API call failed: %v", err)}},
}, nil, nil
}
log.Printf("📊 API Response Status: %d", resp.StatusCode())
log.Printf("📊 API Response Headers: %+v", resp.HTTPResponse.Header)
// Check response status
if resp.StatusCode() < 200 || resp.StatusCode() >= 300 {
body := "No response body"
if resp.Body != nil {
body = string(resp.Body)
}
log.Printf("❌ API error response: status %d, body: %s", resp.StatusCode(), body)
log.Printf("❌ Full response headers: %+v", resp.HTTPResponse.Header)
return &mcp.CallToolResult{
IsError: true,
Content: []mcp.Content{&mcp.TextContent{Text: fmt.Sprintf("API returned status %d: %s", resp.StatusCode(), body)}},
}, nil, nil
}
// Check if we have JSON response data
if resp.JSON200 == nil {
log.Printf("❌ No JSON200 data in response")
log.Printf("❌ Response body: %s", string(resp.Body))
return &mcp.CallToolResult{
IsError: true,
Content: []mcp.Content{&mcp.TextContent{Text: "No JSON response data available"}},
}, nil, nil
}
// Convert the response to JSON string
jsonBytes, err := json.Marshal(resp.JSON200)
if err != nil {
log.Printf("❌ Failed to marshal JSON response: %v", err)
return &mcp.CallToolResult{
IsError: true,
Content: []mcp.Content{&mcp.TextContent{Text: fmt.Sprintf("Failed to marshal response: %v", err)}},
}, nil, nil
}
log.Printf("✅ Successfully retrieved dashboard: %s", resp.JSON200.Title)
log.Printf("✅ Dashboard ID: %s", *resp.JSON200.Id)
log.Printf("✅ Response size: %d bytes", len(jsonBytes))
return &mcp.CallToolResult{
Content: []mcp.Content{
&mcp.TextContent{Text: string(jsonBytes)},
},
}, nil, nil
}