mcp-server-datadog
by winor30
Verified
- src
#!/usr/bin/env node
/**
* This script sets up the mcp-server-datadog.
* It initializes an MCP server that integrates with Datadog for incident management.
* By leveraging MCP, this server can list and retrieve incidents via the Datadog incident API.
* With a design built for scalability, future integrations with additional Datadog APIs are anticipated.
*/
import { Server } from '@modelcontextprotocol/sdk/server/index.js'
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
import {
CallToolRequestSchema,
ListToolsRequestSchema,
} from '@modelcontextprotocol/sdk/types.js'
import { log, mcpDatadogVersion } from './utils/helper'
import { INCIDENT_TOOLS, createIncidentToolHandlers } from './tools/incident'
import { METRICS_TOOLS, createMetricsToolHandlers } from './tools/metrics'
import { LOGS_TOOLS, createLogsToolHandlers } from './tools/logs'
import { MONITORS_TOOLS, createMonitorsToolHandlers } from './tools/monitors'
import {
DASHBOARDS_TOOLS,
createDashboardsToolHandlers,
} from './tools/dashboards'
import { TRACES_TOOLS, createTracesToolHandlers } from './tools/traces'
import { HOSTS_TOOLS, createHostsToolHandlers } from './tools/hosts'
import { ToolHandlers } from './utils/types'
import { createDatadogConfig } from './utils/datadog'
import { createDowntimesToolHandlers, DOWNTIMES_TOOLS } from './tools/downtimes'
const server = new Server(
{
name: 'Datadog MCP Server',
version: mcpDatadogVersion,
},
{
capabilities: {
tools: {},
},
},
)
server.onerror = (error) => {
log('error', `Server error: ${error.message}`, error.stack)
}
/**
* Handler that retrieves the list of available tools in the mcp-server-datadog.
* Currently, it provides incident management functionalities by integrating with Datadog's incident APIs.
*/
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
...INCIDENT_TOOLS,
...METRICS_TOOLS,
...LOGS_TOOLS,
...MONITORS_TOOLS,
...DASHBOARDS_TOOLS,
...TRACES_TOOLS,
...HOSTS_TOOLS,
...DOWNTIMES_TOOLS,
],
}
})
if (!process.env.DATADOG_API_KEY || !process.env.DATADOG_APP_KEY) {
throw new Error('DATADOG_API_KEY and DATADOG_APP_KEY must be set')
}
const datadogConfig = createDatadogConfig({
apiKeyAuth: process.env.DATADOG_API_KEY,
appKeyAuth: process.env.DATADOG_APP_KEY,
site: process.env.DATADOG_SITE,
})
const TOOL_HANDLERS: ToolHandlers = {
...createIncidentToolHandlers(datadogConfig),
...createMetricsToolHandlers(datadogConfig),
...createLogsToolHandlers(datadogConfig),
...createMonitorsToolHandlers(datadogConfig),
...createDashboardsToolHandlers(datadogConfig),
...createTracesToolHandlers(datadogConfig),
...createHostsToolHandlers(datadogConfig),
...createDowntimesToolHandlers(datadogConfig),
}
/**
* Handler for invoking Datadog-related tools in the mcp-server-datadog.
* The TOOL_HANDLERS object contains various tools that interact with different Datadog APIs.
* By specifying the tool name in the request, the LLM can select and utilize the required tool.
*/
server.setRequestHandler(CallToolRequestSchema, async (request) => {
try {
if (TOOL_HANDLERS[request.params.name]) {
return await TOOL_HANDLERS[request.params.name](request)
}
throw new Error('Unknown tool')
} catch (unknownError) {
const error =
unknownError instanceof Error
? unknownError
: new Error(String(unknownError))
log(
'error',
`Request: ${request.params.name}, ${JSON.stringify(request.params.arguments)} failed`,
error.message,
error.stack,
)
throw error
}
})
/**
* Initializes and starts the mcp-server-datadog using stdio transport,
* which sends and receives data through standard input and output.
*/
async function main() {
const transport = new StdioServerTransport()
await server.connect(transport)
}
main().catch((error) => {
log('error', 'Server error:', error)
process.exit(1)
})