// internal/tools/v1/connection.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/modelcontextprotocol/go-sdk/mcp"
)
// TestConnection tests DataDog API connectivity and authentication
func TestConnection(ctx context.Context, client *client.DataDogClient) (*mcp.CallToolResult, any, error) {
log.Printf("๐งช Testing DataDog API v1 connection...")
// Try to list dashboards as a simple connectivity test
resp, err := client.Client.ListDashboardsWithResponse(ctx, &v1.ListDashboardsParams{})
if err != nil {
log.Printf("โ Connection test failed: %v", err)
return &mcp.CallToolResult{
IsError: true,
Content: []mcp.Content{&mcp.TextContent{Text: fmt.Sprintf("Connection test failed: %v", err)}},
}, nil, nil
}
log.Printf("๐ Connection test response status: %d", resp.StatusCode())
log.Printf("๐ Response headers: %+v", resp.HTTPResponse.Header)
if resp.StatusCode() == 401 {
body := "No response body"
if resp.Body != nil {
body = string(resp.Body)
}
log.Printf("โ Authentication failed: %s", body)
return &mcp.CallToolResult{
IsError: true,
Content: []mcp.Content{&mcp.TextContent{Text: fmt.Sprintf("Authentication failed (401): %s. Please check your DD_API_KEY.", body)}},
}, nil, nil
}
if resp.StatusCode() < 200 || resp.StatusCode() >= 300 {
body := "No response body"
if resp.Body != nil {
body = string(resp.Body)
}
log.Printf("โ API error: status %d, body: %s", resp.StatusCode(), body)
return &mcp.CallToolResult{
IsError: true,
Content: []mcp.Content{&mcp.TextContent{Text: fmt.Sprintf("API error (status %d): %s", resp.StatusCode(), body)}},
}, nil, nil
}
log.Printf("โ
Connection test successful!")
result := map[string]interface{}{
"status": "success",
"message": "DataDog API v1 connection is working",
"status_code": resp.StatusCode(),
"headers": resp.HTTPResponse.Header,
}
jsonBytes, err := json.Marshal(result)
if err != nil {
return &mcp.CallToolResult{
IsError: true,
Content: []mcp.Content{&mcp.TextContent{Text: fmt.Sprintf("Failed to marshal result: %v", err)}},
}, nil, nil
}
return &mcp.CallToolResult{
Content: []mcp.Content{
&mcp.TextContent{Text: string(jsonBytes)},
},
}, nil, nil
}