mcp-server-datadog

by winor30
Verified
import { ExtendedTool, ToolHandlers } from '../../utils/types' import { client, v1 } from '@datadog/datadog-api-client' import { createToolSchema } from '../../utils/tool' import { GetMonitorsZodSchema } from './schema' import { unreachable } from '../../utils/helper' import { UnparsedObject } from '@datadog/datadog-api-client/dist/packages/datadog-api-client-common/util.js' type MonitorsToolName = 'get_monitors' type MonitorsTool = ExtendedTool<MonitorsToolName> export const MONITORS_TOOLS: MonitorsTool[] = [ createToolSchema( GetMonitorsZodSchema, 'get_monitors', 'Get monitors status from Datadog', ), ] as const type MonitorsToolHandlers = ToolHandlers<MonitorsToolName> export const createMonitorsToolHandlers = ( config: client.Configuration, ): MonitorsToolHandlers => { const apiInstance = new v1.MonitorsApi(config) return { get_monitors: async (request) => { const { groupStates, name, tags } = GetMonitorsZodSchema.parse( request.params.arguments, ) const response = await apiInstance.listMonitors({ groupStates: groupStates?.join(','), name, tags: tags?.join(','), }) if (response == null) { throw new Error('No monitors data returned') } const monitors = response.map((monitor) => ({ name: monitor.name || '', id: monitor.id || 0, status: (monitor.overallState as string) || 'unknown', message: monitor.message, tags: monitor.tags || [], query: monitor.query || '', lastUpdatedTs: monitor.modified ? Math.floor(new Date(monitor.modified).getTime() / 1000) : undefined, })) // Calculate summary const summary = response.reduce( (acc, monitor) => { const status = monitor.overallState if (status == null || status instanceof UnparsedObject) { return acc } switch (status) { case 'Alert': acc.alert++ break case 'Warn': acc.warn++ break case 'No Data': acc.noData++ break case 'OK': acc.ok++ break case 'Ignored': acc.ignored++ break case 'Skipped': acc.skipped++ break case 'Unknown': acc.unknown++ break default: unreachable(status) } return acc }, { alert: 0, warn: 0, noData: 0, ok: 0, ignored: 0, skipped: 0, unknown: 0, }, ) return { content: [ { type: 'text', text: `Monitors: ${JSON.stringify(monitors)}`, }, { type: 'text', text: `Summary of monitors: ${JSON.stringify(summary)}`, }, ], } }, } }