@vineethnkrishnan/datadog-mcp 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/common/types.d.ts +12 -0
- package/build/common/types.js +3 -0
- package/build/common/types.js.map +1 -0
- package/build/common/utils.d.ts +26 -0
- package/build/common/utils.js +175 -0
- package/build/common/utils.js.map +1 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +114 -0
- package/build/index.js.map +1 -0
- package/build/services/datadog.service.d.ts +14 -0
- package/build/services/datadog.service.js +93 -0
- package/build/services/datadog.service.js.map +1 -0
- package/build/tools/event.tools.d.ts +24 -0
- package/build/tools/event.tools.js +41 -0
- package/build/tools/event.tools.js.map +1 -0
- package/build/tools/metric.tools.d.ts +17 -0
- package/build/tools/metric.tools.js +29 -0
- package/build/tools/metric.tools.js.map +1 -0
- package/build/tools/monitor.tools.d.ts +31 -0
- package/build/tools/monitor.tools.js +60 -0
- package/build/tools/monitor.tools.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/common/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { McpToolResponse } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Recursively removes specified keys from an object.
|
|
4
|
+
*/
|
|
5
|
+
export declare function stripDatadogMetadata(obj: unknown, keys?: string[]): unknown;
|
|
6
|
+
/**
|
|
7
|
+
* Simplifies dashboard widgets by removing complex visual definitions
|
|
8
|
+
* and keeping only title, type, and query information.
|
|
9
|
+
*/
|
|
10
|
+
export declare function stripDashboardWidgets(dashboard: unknown): unknown;
|
|
11
|
+
/**
|
|
12
|
+
* Truncates metric series data points to MAX_DATAPOINTS and adds summary stats.
|
|
13
|
+
*/
|
|
14
|
+
export declare function truncateMetricSeries(data: unknown): unknown;
|
|
15
|
+
/**
|
|
16
|
+
* Composes all Datadog-specific transformations for LLM optimization.
|
|
17
|
+
*/
|
|
18
|
+
export declare function transformDatadogResponse(data: unknown, resourceType?: string): unknown;
|
|
19
|
+
/**
|
|
20
|
+
* Transforms Datadog data and wraps it in the MCP tool response format.
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatMcpResponse(data: unknown, resourceType?: string): McpToolResponse;
|
|
23
|
+
/**
|
|
24
|
+
* Wraps an error in the MCP tool error response format.
|
|
25
|
+
*/
|
|
26
|
+
export declare function formatMcpError(error: unknown): McpToolResponse;
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.stripDatadogMetadata = stripDatadogMetadata;
|
|
4
|
+
exports.stripDashboardWidgets = stripDashboardWidgets;
|
|
5
|
+
exports.truncateMetricSeries = truncateMetricSeries;
|
|
6
|
+
exports.transformDatadogResponse = transformDatadogResponse;
|
|
7
|
+
exports.formatMcpResponse = formatMcpResponse;
|
|
8
|
+
exports.formatMcpError = formatMcpError;
|
|
9
|
+
const DATADOG_STRIP_KEYS = [
|
|
10
|
+
"creator",
|
|
11
|
+
"matching_downtimes",
|
|
12
|
+
"restricted_roles",
|
|
13
|
+
"org_id",
|
|
14
|
+
"deleted",
|
|
15
|
+
"modified",
|
|
16
|
+
];
|
|
17
|
+
const DASHBOARD_WIDGET_STRIP_KEYS = [
|
|
18
|
+
"style",
|
|
19
|
+
"yaxis",
|
|
20
|
+
"markers",
|
|
21
|
+
"events",
|
|
22
|
+
"layout",
|
|
23
|
+
"conditional_formats",
|
|
24
|
+
"autoscale",
|
|
25
|
+
"custom_unit",
|
|
26
|
+
"precision",
|
|
27
|
+
"text_align",
|
|
28
|
+
"legend_size",
|
|
29
|
+
"show_legend",
|
|
30
|
+
"legend_layout",
|
|
31
|
+
"legend_columns",
|
|
32
|
+
"right_yaxis",
|
|
33
|
+
"has_search_bar",
|
|
34
|
+
];
|
|
35
|
+
const MAX_DATAPOINTS = 50;
|
|
36
|
+
/**
|
|
37
|
+
* Recursively removes specified keys from an object.
|
|
38
|
+
*/
|
|
39
|
+
function stripDatadogMetadata(obj, keys = DATADOG_STRIP_KEYS) {
|
|
40
|
+
if (obj === null || obj === undefined)
|
|
41
|
+
return obj;
|
|
42
|
+
if (Array.isArray(obj))
|
|
43
|
+
return obj.map((item) => stripDatadogMetadata(item, keys));
|
|
44
|
+
if (typeof obj !== "object")
|
|
45
|
+
return obj;
|
|
46
|
+
const result = {};
|
|
47
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
48
|
+
if (keys.includes(key))
|
|
49
|
+
continue;
|
|
50
|
+
result[key] = stripDatadogMetadata(value, keys);
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Simplifies dashboard widgets by removing complex visual definitions
|
|
56
|
+
* and keeping only title, type, and query information.
|
|
57
|
+
*/
|
|
58
|
+
function stripDashboardWidgets(dashboard) {
|
|
59
|
+
if (dashboard === null || dashboard === undefined || typeof dashboard !== "object") {
|
|
60
|
+
return dashboard;
|
|
61
|
+
}
|
|
62
|
+
const record = dashboard;
|
|
63
|
+
if (!record.widgets || !Array.isArray(record.widgets))
|
|
64
|
+
return dashboard;
|
|
65
|
+
const simplifiedWidgets = record.widgets.map(simplifyWidget);
|
|
66
|
+
return {
|
|
67
|
+
...record,
|
|
68
|
+
widgets: simplifiedWidgets,
|
|
69
|
+
_widgetCount: simplifiedWidgets.length,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function simplifyWidget(widget) {
|
|
73
|
+
if (widget === null || widget === undefined || typeof widget !== "object")
|
|
74
|
+
return widget;
|
|
75
|
+
const w = widget;
|
|
76
|
+
const definition = w.definition;
|
|
77
|
+
if (!definition)
|
|
78
|
+
return { id: w.id };
|
|
79
|
+
const simplified = {
|
|
80
|
+
id: w.id,
|
|
81
|
+
type: definition.type,
|
|
82
|
+
};
|
|
83
|
+
if (definition.title)
|
|
84
|
+
simplified.title = definition.title;
|
|
85
|
+
// Extract queries from requests
|
|
86
|
+
if (definition.requests && Array.isArray(definition.requests)) {
|
|
87
|
+
simplified.queries = definition.requests
|
|
88
|
+
.map((req) => req.q ?? req.query)
|
|
89
|
+
.filter(Boolean);
|
|
90
|
+
}
|
|
91
|
+
// Recurse into group widgets
|
|
92
|
+
if (definition.widgets && Array.isArray(definition.widgets)) {
|
|
93
|
+
simplified.widgets = definition.widgets.map(simplifyWidget);
|
|
94
|
+
}
|
|
95
|
+
// Strip visual-only keys from remaining definition
|
|
96
|
+
for (const key of DASHBOARD_WIDGET_STRIP_KEYS) {
|
|
97
|
+
delete definition[key];
|
|
98
|
+
}
|
|
99
|
+
return simplified;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Truncates metric series data points to MAX_DATAPOINTS and adds summary stats.
|
|
103
|
+
*/
|
|
104
|
+
function truncateMetricSeries(data) {
|
|
105
|
+
if (data === null || data === undefined || typeof data !== "object")
|
|
106
|
+
return data;
|
|
107
|
+
const record = data;
|
|
108
|
+
if (!record.series || !Array.isArray(record.series))
|
|
109
|
+
return data;
|
|
110
|
+
const simplifiedSeries = record.series.map((series) => {
|
|
111
|
+
if (series === null || series === undefined || typeof series !== "object")
|
|
112
|
+
return series;
|
|
113
|
+
const s = series;
|
|
114
|
+
const pointlist = s.pointlist;
|
|
115
|
+
if (!pointlist || !Array.isArray(pointlist) || pointlist.length === 0)
|
|
116
|
+
return series;
|
|
117
|
+
const values = pointlist.map((point) => point[1]).filter((v) => v !== null && v !== undefined);
|
|
118
|
+
const summary = {
|
|
119
|
+
min: values.length > 0 ? Math.min(...values) : null,
|
|
120
|
+
max: values.length > 0 ? Math.max(...values) : null,
|
|
121
|
+
avg: values.length > 0 ? values.reduce((a, b) => a + b, 0) / values.length : null,
|
|
122
|
+
count: pointlist.length,
|
|
123
|
+
start: pointlist[0]?.[0] ?? null,
|
|
124
|
+
end: pointlist[pointlist.length - 1]?.[0] ?? null,
|
|
125
|
+
};
|
|
126
|
+
if (pointlist.length <= MAX_DATAPOINTS) {
|
|
127
|
+
return { ...s, _summary: summary };
|
|
128
|
+
}
|
|
129
|
+
// Downsample by picking evenly spaced points
|
|
130
|
+
const step = (pointlist.length - 1) / (MAX_DATAPOINTS - 1);
|
|
131
|
+
const downsampled = [];
|
|
132
|
+
for (let i = 0; i < MAX_DATAPOINTS; i++) {
|
|
133
|
+
const index = Math.round(i * step);
|
|
134
|
+
downsampled.push(pointlist[index]);
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
...s,
|
|
138
|
+
pointlist: downsampled,
|
|
139
|
+
_summary: summary,
|
|
140
|
+
_truncated: { kept: MAX_DATAPOINTS, total: pointlist.length },
|
|
141
|
+
};
|
|
142
|
+
});
|
|
143
|
+
return { ...record, series: simplifiedSeries };
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Composes all Datadog-specific transformations for LLM optimization.
|
|
147
|
+
*/
|
|
148
|
+
function transformDatadogResponse(data, resourceType) {
|
|
149
|
+
let result = stripDatadogMetadata(data);
|
|
150
|
+
if (resourceType === "dashboard")
|
|
151
|
+
result = stripDashboardWidgets(result);
|
|
152
|
+
if (resourceType === "metrics")
|
|
153
|
+
result = truncateMetricSeries(result);
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Transforms Datadog data and wraps it in the MCP tool response format.
|
|
158
|
+
*/
|
|
159
|
+
function formatMcpResponse(data, resourceType) {
|
|
160
|
+
const transformed = transformDatadogResponse(data, resourceType);
|
|
161
|
+
return {
|
|
162
|
+
content: [{ type: "text", text: JSON.stringify(transformed, null, 2) }],
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Wraps an error in the MCP tool error response format.
|
|
167
|
+
*/
|
|
168
|
+
function formatMcpError(error) {
|
|
169
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
170
|
+
return {
|
|
171
|
+
content: [{ type: "text", text: `Error: ${message}` }],
|
|
172
|
+
isError: true,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/common/utils.ts"],"names":[],"mappings":";;AAmCA,oDAWC;AAMD,sDAeC;AAuCD,oDA6CC;AAKD,4DAKC;AAKD,8CAKC;AAKD,wCAMC;AApLD,MAAM,kBAAkB,GAAG;IACzB,SAAS;IACT,oBAAoB;IACpB,kBAAkB;IAClB,QAAQ;IACR,SAAS;IACT,UAAU;CACX,CAAC;AAEF,MAAM,2BAA2B,GAAG;IAClC,OAAO;IACP,OAAO;IACP,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,qBAAqB;IACrB,WAAW;IACX,aAAa;IACb,WAAW;IACX,YAAY;IACZ,aAAa;IACb,aAAa;IACb,eAAe;IACf,gBAAgB;IAChB,aAAa;IACb,gBAAgB;CACjB,CAAC;AAEF,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B;;GAEG;AACH,SAAgB,oBAAoB,CAAC,GAAY,EAAE,OAAiB,kBAAkB;IACpF,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IAClD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACnF,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IAExC,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAA8B,CAAC,EAAE,CAAC;QAC1E,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QACjC,MAAM,CAAC,GAAG,CAAC,GAAG,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAgB,qBAAqB,CAAC,SAAkB;IACtD,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QACnF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,SAAoC,CAAC;IACpD,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAExE,MAAM,iBAAiB,GAAI,MAAM,CAAC,OAAqB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAE5E,OAAO;QACL,GAAG,MAAM;QACT,OAAO,EAAE,iBAAiB;QAC1B,YAAY,EAAE,iBAAiB,CAAC,MAAM;KACvC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,MAAe;IACrC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAEzF,MAAM,CAAC,GAAG,MAAiC,CAAC;IAC5C,MAAM,UAAU,GAAG,CAAC,CAAC,UAAiD,CAAC;IACvE,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;IAErC,MAAM,UAAU,GAA4B;QAC1C,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAE,UAAU,CAAC,IAAI;KACtB,CAAC;IAEF,IAAI,UAAU,CAAC,KAAK;QAAE,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;IAE1D,gCAAgC;IAChC,IAAI,UAAU,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9D,UAAU,CAAC,OAAO,GAAI,UAAU,CAAC,QAAsC;aACpE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC;aAChC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAED,6BAA6B;IAC7B,IAAI,UAAU,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5D,UAAU,CAAC,OAAO,GAAI,UAAU,CAAC,OAAqB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC7E,CAAC;IAED,mDAAmD;IACnD,KAAK,MAAM,GAAG,IAAI,2BAA2B,EAAE,CAAC;QAC9C,OAAQ,UAAsC,CAAC,GAAG,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAAC,IAAa;IAChD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEjF,MAAM,MAAM,GAAG,IAA+B,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjE,MAAM,gBAAgB,GAAI,MAAM,CAAC,MAAoB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACnE,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC;QAEzF,MAAM,CAAC,GAAG,MAAiC,CAAC;QAC5C,MAAM,SAAS,GAAG,CAAC,CAAC,SAAmC,CAAC;QAExD,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QAErF,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC;QAC/F,MAAM,OAAO,GAAG;YACd,GAAG,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;YACnD,GAAG,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;YACnD,GAAG,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;YACjF,KAAK,EAAE,SAAS,CAAC,MAAM;YACvB,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI;YAChC,GAAG,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI;SAClD,CAAC;QAEF,IAAI,SAAS,CAAC,MAAM,IAAI,cAAc,EAAE,CAAC;YACvC,OAAO,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QACrC,CAAC;QAED,6CAA6C;QAC7C,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAe,EAAE,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YACnC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACrC,CAAC;QAED,OAAO;YACL,GAAG,CAAC;YACJ,SAAS,EAAE,WAAW;YACtB,QAAQ,EAAE,OAAO;YACjB,UAAU,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE;SAC9D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,SAAgB,wBAAwB,CAAC,IAAa,EAAE,YAAqB;IAC3E,IAAI,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,YAAY,KAAK,WAAW;QAAE,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACzE,IAAI,YAAY,KAAK,SAAS;QAAE,MAAM,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACtE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,IAAa,EAAE,YAAqB;IACpE,MAAM,WAAW,GAAG,wBAAwB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACjE,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;KACxE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,KAAc;IAC3C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;QACtD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
|
package/build/index.d.ts
ADDED
package/build/index.js
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
|
|
5
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
6
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
7
|
+
const zod_1 = require("zod");
|
|
8
|
+
const datadog_service_1 = require("./services/datadog.service");
|
|
9
|
+
const monitor_tools_1 = require("./tools/monitor.tools");
|
|
10
|
+
const metric_tools_1 = require("./tools/metric.tools");
|
|
11
|
+
const event_tools_1 = require("./tools/event.tools");
|
|
12
|
+
// Validate required config
|
|
13
|
+
const DD_API_KEY = process.env.DD_API_KEY;
|
|
14
|
+
const DD_APP_KEY = process.env.DD_APP_KEY;
|
|
15
|
+
const DD_SITE = process.env.DD_SITE ?? "datadoghq.com";
|
|
16
|
+
if (!DD_API_KEY) {
|
|
17
|
+
console.error("DD_API_KEY environment variable is required.");
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
if (!DD_APP_KEY) {
|
|
21
|
+
console.error("DD_APP_KEY environment variable is required.");
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
// Warn on unknown site values
|
|
25
|
+
const KNOWN_SITES = [
|
|
26
|
+
"datadoghq.com",
|
|
27
|
+
"datadoghq.eu",
|
|
28
|
+
"us3.datadoghq.com",
|
|
29
|
+
"us5.datadoghq.com",
|
|
30
|
+
"ap1.datadoghq.com",
|
|
31
|
+
"ddog-gov.com",
|
|
32
|
+
];
|
|
33
|
+
if (!KNOWN_SITES.includes(DD_SITE)) {
|
|
34
|
+
console.error(`Warning: DD_SITE="${DD_SITE}" is not a recognized Datadog site. Known sites: ${KNOWN_SITES.join(", ")}. Proceeding anyway.`);
|
|
35
|
+
}
|
|
36
|
+
const datadogService = new datadog_service_1.DatadogService({
|
|
37
|
+
apiKey: DD_API_KEY,
|
|
38
|
+
appKey: DD_APP_KEY,
|
|
39
|
+
site: DD_SITE,
|
|
40
|
+
});
|
|
41
|
+
// Initialize tool classes
|
|
42
|
+
const tools = {
|
|
43
|
+
monitors: new monitor_tools_1.MonitorTools(datadogService),
|
|
44
|
+
metrics: new metric_tools_1.MetricTools(datadogService),
|
|
45
|
+
events: new event_tools_1.EventTools(datadogService),
|
|
46
|
+
};
|
|
47
|
+
// Combine all schemas
|
|
48
|
+
const AllToolSchemas = {
|
|
49
|
+
...monitor_tools_1.MonitorToolSchemas,
|
|
50
|
+
...metric_tools_1.MetricToolSchemas,
|
|
51
|
+
...event_tools_1.EventToolSchemas,
|
|
52
|
+
};
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
54
|
+
const { version } = require("../package.json");
|
|
55
|
+
const server = new index_js_1.Server({
|
|
56
|
+
name: "datadog-mcp",
|
|
57
|
+
version,
|
|
58
|
+
}, {
|
|
59
|
+
capabilities: {
|
|
60
|
+
tools: {},
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
/**
|
|
64
|
+
* Handler for listing available tools.
|
|
65
|
+
*/
|
|
66
|
+
server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
|
|
67
|
+
return {
|
|
68
|
+
tools: Object.entries(AllToolSchemas).map(([name, config]) => ({
|
|
69
|
+
name,
|
|
70
|
+
description: config.description,
|
|
71
|
+
inputSchema: zod_1.z.toJSONSchema(config.schema),
|
|
72
|
+
})),
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
const toolRegistry = {};
|
|
76
|
+
for (const name of Object.keys(monitor_tools_1.MonitorToolSchemas)) {
|
|
77
|
+
toolRegistry[name] = (args) => tools.monitors[name](args);
|
|
78
|
+
}
|
|
79
|
+
for (const name of Object.keys(metric_tools_1.MetricToolSchemas)) {
|
|
80
|
+
toolRegistry[name] = (args) => tools.metrics[name](args);
|
|
81
|
+
}
|
|
82
|
+
for (const name of Object.keys(event_tools_1.EventToolSchemas)) {
|
|
83
|
+
toolRegistry[name] = (args) => tools.events[name](args);
|
|
84
|
+
}
|
|
85
|
+
server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
86
|
+
try {
|
|
87
|
+
const { name, arguments: args } = request.params;
|
|
88
|
+
const handler = toolRegistry[name];
|
|
89
|
+
if (!handler) {
|
|
90
|
+
throw new types_js_1.McpError(types_js_1.ErrorCode.MethodNotFound, `Tool not found: ${name}`);
|
|
91
|
+
}
|
|
92
|
+
return await handler(args ?? {});
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
96
|
+
return {
|
|
97
|
+
content: [{ type: "text", text: `Error: ${message}` }],
|
|
98
|
+
isError: true,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
/**
|
|
103
|
+
* Start the server using Stdio transport.
|
|
104
|
+
*/
|
|
105
|
+
async function main() {
|
|
106
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
107
|
+
await server.connect(transport);
|
|
108
|
+
console.error("Datadog MCP Server running on stdio");
|
|
109
|
+
}
|
|
110
|
+
main().catch((error) => {
|
|
111
|
+
console.error("Server error:", error);
|
|
112
|
+
process.exit(1);
|
|
113
|
+
});
|
|
114
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { DatadogConfig } from "../common/types";
|
|
2
|
+
export declare class DatadogService {
|
|
3
|
+
private baseUrl;
|
|
4
|
+
private apiKey;
|
|
5
|
+
private appKey;
|
|
6
|
+
constructor(config: DatadogConfig);
|
|
7
|
+
private request;
|
|
8
|
+
listMonitors(query?: string, limit?: number): Promise<unknown[]>;
|
|
9
|
+
getMonitor(monitorId: number): Promise<unknown>;
|
|
10
|
+
searchMonitors(query: string, limit?: number): Promise<unknown>;
|
|
11
|
+
queryMetrics(query: string, from: number, to: number): Promise<unknown>;
|
|
12
|
+
listEvents(start: number, end: number, limit?: number): Promise<unknown>;
|
|
13
|
+
getEvent(eventId: number): Promise<unknown>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DatadogService = void 0;
|
|
4
|
+
class DatadogService {
|
|
5
|
+
baseUrl;
|
|
6
|
+
apiKey;
|
|
7
|
+
appKey;
|
|
8
|
+
constructor(config) {
|
|
9
|
+
// Construct site-aware base URL: https://api.${DD_SITE}
|
|
10
|
+
const site = config.site.replace(/\/+$/, "");
|
|
11
|
+
this.baseUrl = `https://api.${site}`;
|
|
12
|
+
this.apiKey = config.apiKey;
|
|
13
|
+
this.appKey = config.appKey;
|
|
14
|
+
}
|
|
15
|
+
async request(version, path, params) {
|
|
16
|
+
const url = new URL(`${this.baseUrl}/api/${version}${path}`);
|
|
17
|
+
if (params) {
|
|
18
|
+
for (const [key, value] of Object.entries(params)) {
|
|
19
|
+
if (value !== undefined && value !== null && value !== "") {
|
|
20
|
+
url.searchParams.set(key, String(value));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const response = await fetch(url.toString(), {
|
|
25
|
+
headers: {
|
|
26
|
+
"DD-API-KEY": this.apiKey,
|
|
27
|
+
"DD-APPLICATION-KEY": this.appKey,
|
|
28
|
+
"Content-Type": "application/json",
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
const errorBody = await response.text().catch(() => "");
|
|
33
|
+
switch (response.status) {
|
|
34
|
+
case 401:
|
|
35
|
+
throw new Error("Authentication failed. Check your DD_API_KEY. If using a non-US1 site, ensure DD_SITE matches where your keys were created.");
|
|
36
|
+
case 403:
|
|
37
|
+
throw new Error("Access denied. Check your DD_APP_KEY permissions. Ensure the application key has read access to the requested resource.");
|
|
38
|
+
case 404:
|
|
39
|
+
throw new Error("Not found. Check the ID and ensure the resource exists in your DD_SITE region.");
|
|
40
|
+
case 429: {
|
|
41
|
+
const resetHeader = response.headers.get("X-RateLimit-Reset") ?? "unknown";
|
|
42
|
+
throw new Error(`Rate limited by Datadog. Retry after ${resetHeader} seconds.`);
|
|
43
|
+
}
|
|
44
|
+
default:
|
|
45
|
+
throw new Error(`Datadog API error (${response.status}): ${errorBody || response.statusText}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return response.json();
|
|
49
|
+
}
|
|
50
|
+
// ===========================================================================
|
|
51
|
+
// Monitors
|
|
52
|
+
// ===========================================================================
|
|
53
|
+
async listMonitors(query, limit = 25) {
|
|
54
|
+
const params = { page_size: limit };
|
|
55
|
+
if (query)
|
|
56
|
+
params.query = query;
|
|
57
|
+
return this.request("v1", "/monitor", params);
|
|
58
|
+
}
|
|
59
|
+
async getMonitor(monitorId) {
|
|
60
|
+
return this.request("v1", `/monitor/${monitorId}`);
|
|
61
|
+
}
|
|
62
|
+
async searchMonitors(query, limit = 25) {
|
|
63
|
+
return this.request("v1", "/monitor/search", {
|
|
64
|
+
query,
|
|
65
|
+
per_page: limit,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
// ===========================================================================
|
|
69
|
+
// Metrics
|
|
70
|
+
// ===========================================================================
|
|
71
|
+
async queryMetrics(query, from, to) {
|
|
72
|
+
return this.request("v1", "/query", {
|
|
73
|
+
query,
|
|
74
|
+
from,
|
|
75
|
+
to,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
// ===========================================================================
|
|
79
|
+
// Events
|
|
80
|
+
// ===========================================================================
|
|
81
|
+
async listEvents(start, end, limit = 25) {
|
|
82
|
+
return this.request("v2", "/events", {
|
|
83
|
+
"filter[from]": start,
|
|
84
|
+
"filter[to]": end,
|
|
85
|
+
"page[limit]": limit,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
async getEvent(eventId) {
|
|
89
|
+
return this.request("v2", `/events/${eventId}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.DatadogService = DatadogService;
|
|
93
|
+
//# sourceMappingURL=datadog.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datadog.service.js","sourceRoot":"","sources":["../../src/services/datadog.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { DatadogService } from "../services/datadog.service";
|
|
3
|
+
export declare const EventToolSchemas: {
|
|
4
|
+
list_events: {
|
|
5
|
+
description: string;
|
|
6
|
+
schema: z.ZodObject<{
|
|
7
|
+
start: z.ZodNumber;
|
|
8
|
+
end: z.ZodNumber;
|
|
9
|
+
limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
};
|
|
12
|
+
get_event: {
|
|
13
|
+
description: string;
|
|
14
|
+
schema: z.ZodObject<{
|
|
15
|
+
event_id: z.ZodNumber;
|
|
16
|
+
}, z.core.$strip>;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
export declare class EventTools {
|
|
20
|
+
private datadogService;
|
|
21
|
+
constructor(datadogService: DatadogService);
|
|
22
|
+
list_events(args: z.infer<typeof EventToolSchemas.list_events.schema>): Promise<import("../common/types").McpToolResponse>;
|
|
23
|
+
get_event(args: z.infer<typeof EventToolSchemas.get_event.schema>): Promise<import("../common/types").McpToolResponse>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventTools = exports.EventToolSchemas = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const utils_1 = require("../common/utils");
|
|
6
|
+
exports.EventToolSchemas = {
|
|
7
|
+
list_events: {
|
|
8
|
+
description: "Lists Datadog events within a time range. Events include deployments, alerts, comments, and other activity. Use UNIX epoch seconds for start and end.",
|
|
9
|
+
schema: zod_1.z.object({
|
|
10
|
+
start: zod_1.z.number().describe("Start time as UNIX epoch seconds."),
|
|
11
|
+
end: zod_1.z.number().describe("End time as UNIX epoch seconds."),
|
|
12
|
+
limit: zod_1.z
|
|
13
|
+
.number()
|
|
14
|
+
.optional()
|
|
15
|
+
.default(25)
|
|
16
|
+
.describe("Maximum number of events to return (default 25, max 100)."),
|
|
17
|
+
}),
|
|
18
|
+
},
|
|
19
|
+
get_event: {
|
|
20
|
+
description: "Retrieves a specific Datadog event including title, text, tags, and related resources.",
|
|
21
|
+
schema: zod_1.z.object({
|
|
22
|
+
event_id: zod_1.z.number().describe("The Datadog event ID."),
|
|
23
|
+
}),
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
class EventTools {
|
|
27
|
+
datadogService;
|
|
28
|
+
constructor(datadogService) {
|
|
29
|
+
this.datadogService = datadogService;
|
|
30
|
+
}
|
|
31
|
+
async list_events(args) {
|
|
32
|
+
const events = await this.datadogService.listEvents(args.start, args.end, args.limit);
|
|
33
|
+
return (0, utils_1.formatMcpResponse)(events);
|
|
34
|
+
}
|
|
35
|
+
async get_event(args) {
|
|
36
|
+
const event = await this.datadogService.getEvent(args.event_id);
|
|
37
|
+
return (0, utils_1.formatMcpResponse)(event);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.EventTools = EventTools;
|
|
41
|
+
//# sourceMappingURL=event.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.tools.js","sourceRoot":"","sources":["../../src/tools/event.tools.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAExB,2CAAoD;AAEvC,QAAA,gBAAgB,GAAG;IAC9B,WAAW,EAAE;QACX,WAAW,EACT,uJAAuJ;QACzJ,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC;YACf,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YAC/D,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YAC3D,KAAK,EAAE,OAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,OAAO,CAAC,EAAE,CAAC;iBACX,QAAQ,CAAC,2DAA2D,CAAC;SACzE,CAAC;KACH;IACD,SAAS,EAAE;QACT,WAAW,EACT,wFAAwF;QAC1F,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC;YACf,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;SACvD,CAAC;KACH;CACF,CAAC;AAEF,MAAa,UAAU;IACD;IAApB,YAAoB,cAA8B;QAA9B,mBAAc,GAAd,cAAc,CAAgB;IAAG,CAAC;IAEtD,KAAK,CAAC,WAAW,CAAC,IAAyD;QACzE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACtF,OAAO,IAAA,yBAAiB,EAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAuD;QACrE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChE,OAAO,IAAA,yBAAiB,EAAC,KAAK,CAAC,CAAC;IAClC,CAAC;CACF;AAZD,gCAYC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { DatadogService } from "../services/datadog.service";
|
|
3
|
+
export declare const MetricToolSchemas: {
|
|
4
|
+
query_metrics: {
|
|
5
|
+
description: string;
|
|
6
|
+
schema: z.ZodObject<{
|
|
7
|
+
query: z.ZodString;
|
|
8
|
+
from: z.ZodNumber;
|
|
9
|
+
to: z.ZodNumber;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
export declare class MetricTools {
|
|
14
|
+
private datadogService;
|
|
15
|
+
constructor(datadogService: DatadogService);
|
|
16
|
+
query_metrics(args: z.infer<typeof MetricToolSchemas.query_metrics.schema>): Promise<import("../common/types").McpToolResponse>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MetricTools = exports.MetricToolSchemas = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const utils_1 = require("../common/utils");
|
|
6
|
+
exports.MetricToolSchemas = {
|
|
7
|
+
query_metrics: {
|
|
8
|
+
description: "Queries timeseries metric data from Datadog using the metric query syntax. Returns data points and summary statistics. Example queries: 'avg:system.cpu.user{host:web-01}', 'sum:trace.servlet.request.hits{service:web-app}.as_count()'.",
|
|
9
|
+
schema: zod_1.z.object({
|
|
10
|
+
query: zod_1.z
|
|
11
|
+
.string()
|
|
12
|
+
.describe("Datadog metric query string (e.g., 'avg:system.cpu.user{host:web-01}')."),
|
|
13
|
+
from: zod_1.z.number().describe("Start time as UNIX epoch seconds."),
|
|
14
|
+
to: zod_1.z.number().describe("End time as UNIX epoch seconds."),
|
|
15
|
+
}),
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
class MetricTools {
|
|
19
|
+
datadogService;
|
|
20
|
+
constructor(datadogService) {
|
|
21
|
+
this.datadogService = datadogService;
|
|
22
|
+
}
|
|
23
|
+
async query_metrics(args) {
|
|
24
|
+
const metrics = await this.datadogService.queryMetrics(args.query, args.from, args.to);
|
|
25
|
+
return (0, utils_1.formatMcpResponse)(metrics, "metrics");
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.MetricTools = MetricTools;
|
|
29
|
+
//# sourceMappingURL=metric.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metric.tools.js","sourceRoot":"","sources":["../../src/tools/metric.tools.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAExB,2CAAoD;AAEvC,QAAA,iBAAiB,GAAG;IAC/B,aAAa,EAAE;QACb,WAAW,EACT,2OAA2O;QAC7O,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC;YACf,KAAK,EAAE,OAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,CAAC,yEAAyE,CAAC;YACtF,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YAC9D,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;SAC3D,CAAC;KACH;CACF,CAAC;AAEF,MAAa,WAAW;IACF;IAApB,YAAoB,cAA8B;QAA9B,mBAAc,GAAd,cAAc,CAAgB;IAAG,CAAC;IAEtD,KAAK,CAAC,aAAa,CAAC,IAA4D;QAC9E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACvF,OAAO,IAAA,yBAAiB,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC/C,CAAC;CACF;AAPD,kCAOC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { DatadogService } from "../services/datadog.service";
|
|
3
|
+
export declare const MonitorToolSchemas: {
|
|
4
|
+
list_monitors: {
|
|
5
|
+
description: string;
|
|
6
|
+
schema: z.ZodObject<{
|
|
7
|
+
query: z.ZodOptional<z.ZodString>;
|
|
8
|
+
limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
};
|
|
11
|
+
get_monitor: {
|
|
12
|
+
description: string;
|
|
13
|
+
schema: z.ZodObject<{
|
|
14
|
+
monitor_id: z.ZodNumber;
|
|
15
|
+
}, z.core.$strip>;
|
|
16
|
+
};
|
|
17
|
+
search_monitors: {
|
|
18
|
+
description: string;
|
|
19
|
+
schema: z.ZodObject<{
|
|
20
|
+
query: z.ZodString;
|
|
21
|
+
limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
22
|
+
}, z.core.$strip>;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
export declare class MonitorTools {
|
|
26
|
+
private datadogService;
|
|
27
|
+
constructor(datadogService: DatadogService);
|
|
28
|
+
list_monitors(args: z.infer<typeof MonitorToolSchemas.list_monitors.schema>): Promise<import("../common/types").McpToolResponse>;
|
|
29
|
+
get_monitor(args: z.infer<typeof MonitorToolSchemas.get_monitor.schema>): Promise<import("../common/types").McpToolResponse>;
|
|
30
|
+
search_monitors(args: z.infer<typeof MonitorToolSchemas.search_monitors.schema>): Promise<import("../common/types").McpToolResponse>;
|
|
31
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MonitorTools = exports.MonitorToolSchemas = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const utils_1 = require("../common/utils");
|
|
6
|
+
exports.MonitorToolSchemas = {
|
|
7
|
+
list_monitors: {
|
|
8
|
+
description: "Lists Datadog monitors. Optionally filter by query string (e.g., 'type:metric status:alert tag:service:web'). Returns monitor name, status, query, tags, and thresholds.",
|
|
9
|
+
schema: zod_1.z.object({
|
|
10
|
+
query: zod_1.z
|
|
11
|
+
.string()
|
|
12
|
+
.optional()
|
|
13
|
+
.describe("Filter query using Datadog monitor search syntax (e.g., 'status:alert', 'tag:env:prod')."),
|
|
14
|
+
limit: zod_1.z
|
|
15
|
+
.number()
|
|
16
|
+
.optional()
|
|
17
|
+
.default(25)
|
|
18
|
+
.describe("Maximum number of monitors to return (default 25, max 100)."),
|
|
19
|
+
}),
|
|
20
|
+
},
|
|
21
|
+
get_monitor: {
|
|
22
|
+
description: "Retrieves full details for a specific Datadog monitor including status, query, thresholds, tags, and notification targets.",
|
|
23
|
+
schema: zod_1.z.object({
|
|
24
|
+
monitor_id: zod_1.z.number().describe("The Datadog monitor ID."),
|
|
25
|
+
}),
|
|
26
|
+
},
|
|
27
|
+
search_monitors: {
|
|
28
|
+
description: "Searches Datadog monitors using monitor search syntax. Returns matching monitors with metadata. Example queries: 'type:metric status:alert', 'tag:service:web', 'notification:@pagerduty'.",
|
|
29
|
+
schema: zod_1.z.object({
|
|
30
|
+
query: zod_1.z
|
|
31
|
+
.string()
|
|
32
|
+
.describe("Datadog monitor search query (e.g., 'type:metric status:alert tag:service:web')."),
|
|
33
|
+
limit: zod_1.z
|
|
34
|
+
.number()
|
|
35
|
+
.optional()
|
|
36
|
+
.default(25)
|
|
37
|
+
.describe("Maximum number of results to return (default 25, max 100)."),
|
|
38
|
+
}),
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
class MonitorTools {
|
|
42
|
+
datadogService;
|
|
43
|
+
constructor(datadogService) {
|
|
44
|
+
this.datadogService = datadogService;
|
|
45
|
+
}
|
|
46
|
+
async list_monitors(args) {
|
|
47
|
+
const monitors = await this.datadogService.listMonitors(args.query, args.limit);
|
|
48
|
+
return (0, utils_1.formatMcpResponse)(monitors);
|
|
49
|
+
}
|
|
50
|
+
async get_monitor(args) {
|
|
51
|
+
const monitor = await this.datadogService.getMonitor(args.monitor_id);
|
|
52
|
+
return (0, utils_1.formatMcpResponse)(monitor);
|
|
53
|
+
}
|
|
54
|
+
async search_monitors(args) {
|
|
55
|
+
const result = await this.datadogService.searchMonitors(args.query, args.limit);
|
|
56
|
+
return (0, utils_1.formatMcpResponse)(result);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.MonitorTools = MonitorTools;
|
|
60
|
+
//# sourceMappingURL=monitor.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitor.tools.js","sourceRoot":"","sources":["../../src/tools/monitor.tools.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAExB,2CAAoD;AAEvC,QAAA,kBAAkB,GAAG;IAChC,aAAa,EAAE;QACb,WAAW,EACT,0KAA0K;QAC5K,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC;YACf,KAAK,EAAE,OAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,0FAA0F,CAC3F;YACH,KAAK,EAAE,OAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,OAAO,CAAC,EAAE,CAAC;iBACX,QAAQ,CAAC,6DAA6D,CAAC;SAC3E,CAAC;KACH;IACD,WAAW,EAAE;QACX,WAAW,EACT,4HAA4H;QAC9H,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC;YACf,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;SAC3D,CAAC;KACH;IACD,eAAe,EAAE;QACf,WAAW,EACT,4LAA4L;QAC9L,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC;YACf,KAAK,EAAE,OAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,CACP,kFAAkF,CACnF;YACH,KAAK,EAAE,OAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,OAAO,CAAC,EAAE,CAAC;iBACX,QAAQ,CAAC,4DAA4D,CAAC;SAC1E,CAAC;KACH;CACF,CAAC;AAEF,MAAa,YAAY;IACH;IAApB,YAAoB,cAA8B;QAA9B,mBAAc,GAAd,cAAc,CAAgB;IAAG,CAAC;IAEtD,KAAK,CAAC,aAAa,CAAC,IAA6D;QAC/E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAChF,OAAO,IAAA,yBAAiB,EAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAA2D;QAC3E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACtE,OAAO,IAAA,yBAAiB,EAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAA+D;QACnF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAChF,OAAO,IAAA,yBAAiB,EAAC,MAAM,CAAC,CAAC;IACnC,CAAC;CACF;AAjBD,oCAiBC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@vineethnkrishnan/datadog-mcp",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "A read-only MCP server for Datadog API, enabling AI assistants to query monitors, metrics, and events. Supports all Datadog regions.",
|
|
5
|
+
"main": "build/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"datadog-mcp": "build/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"build/"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc",
|
|
14
|
+
"start": "node build/index.js",
|
|
15
|
+
"test": "jest --coverage"
|
|
16
|
+
},
|
|
17
|
+
"publishConfig": {
|
|
18
|
+
"access": "public"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"mcp",
|
|
22
|
+
"datadog",
|
|
23
|
+
"ai",
|
|
24
|
+
"model-context-protocol",
|
|
25
|
+
"monitoring",
|
|
26
|
+
"observability",
|
|
27
|
+
"metrics",
|
|
28
|
+
"multi-site"
|
|
29
|
+
],
|
|
30
|
+
"author": "Vineeth Krishnan",
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"type": "commonjs",
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=20"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
38
|
+
"zod": "^4.3.6"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/jest": "^30.0.0",
|
|
42
|
+
"@types/node": "^25.5.0",
|
|
43
|
+
"jest": "^30.3.0",
|
|
44
|
+
"ts-jest": "^29.4.6",
|
|
45
|
+
"typescript": "^5.7.0"
|
|
46
|
+
}
|
|
47
|
+
}
|