// cmd/server/main.go
package main
import (
"context"
"log"
"os"
"github.com/chussenot/datadog-mcp/internal/client"
v1 "github.com/chussenot/datadog-mcp/internal/tools/v1"
"github.com/chussenot/datadog-mcp/internal/types"
"github.com/modelcontextprotocol/go-sdk/mcp"
)
func main() {
ctx := context.Background()
log.Println("🚀 Starting DataDog MCP server...")
// Get configuration from environment
apiKey := os.Getenv("DD_API_KEY")
if apiKey == "" {
log.Fatal("❌ DD_API_KEY environment variable is required")
}
site := os.Getenv("DATADOG_SITE")
if site == "" {
site = "datadoghq.eu"
log.Printf("📝 Using default site: %s", site)
}
// Create DataDog client with authentication
ddClient, err := client.NewDataDogClient(apiKey, site)
if err != nil {
log.Fatalf("❌ Failed to create DataDog client: %v", err)
}
// Create server with options
opts := &mcp.ServerOptions{
Instructions: "DataDog MCP server for monitoring, dashboards, and metrics",
InitializedHandler: func(ctx context.Context, req *mcp.InitializedRequest) {
log.Println("✅ Client session initialized - DataDog tools are now available")
},
}
server := mcp.NewServer(&mcp.Implementation{
Name: "datadog-mcp",
Version: "1.0.0",
}, opts)
log.Println("📝 Registering DataDog v1 tools...")
// Register dashboard tools
mcp.AddTool(server, &mcp.Tool{
Name: "v1_list_dashboards",
Description: "List all dashboards in DataDog (API v1)",
}, func(ctx context.Context, req *mcp.CallToolRequest, args types.ListDashboardsArgs) (*mcp.CallToolResult, any, error) {
return v1.ListDashboards(ctx, ddClient, args)
})
mcp.AddTool(server, &mcp.Tool{
Name: "v1_get_dashboard",
Description: "Get details of a specific dashboard (API v1)",
}, func(ctx context.Context, req *mcp.CallToolRequest, args types.GetDashboardArgs) (*mcp.CallToolResult, any, error) {
return v1.GetDashboard(ctx, ddClient, args)
})
// Register event tools
mcp.AddTool(server, &mcp.Tool{
Name: "v1_list_events",
Description: "List events from DataDog (API v1)",
}, func(ctx context.Context, req *mcp.CallToolRequest, args types.ListEventsArgs) (*mcp.CallToolResult, any, error) {
return v1.ListEvents(ctx, ddClient, args)
})
mcp.AddTool(server, &mcp.Tool{
Name: "v1_create_event",
Description: "Create a new event in DataDog (API v1)",
}, func(ctx context.Context, req *mcp.CallToolRequest, args types.CreateEventArgs) (*mcp.CallToolResult, any, error) {
return v1.CreateEvent(ctx, ddClient, args)
})
// Register connection test tool
mcp.AddTool(server, &mcp.Tool{
Name: "v1_test_connection",
Description: "Test DataDog API v1 connectivity and authentication",
}, func(ctx context.Context, req *mcp.CallToolRequest, args struct{}) (*mcp.CallToolResult, any, error) {
return v1.TestConnection(ctx, ddClient)
})
log.Println("✅ DataDog tools registered successfully")
log.Printf("🔄 Starting server over stdio for site: %s", site)
// Add logging transport for debugging
transport := &mcp.LoggingTransport{
Transport: &mcp.StdioTransport{},
Writer: os.Stderr,
}
// Run over stdio (great for local MCP clients)
if err := server.Run(ctx, transport); err != nil {
log.Printf("❌ Server failed: %v", err)
log.Fatal(err)
}
}