datadog-mcp 5.3.1 → 5.3.3
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/dist/index.js +85 -16
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -3197,27 +3197,69 @@ function formatSlo(s) {
|
|
|
3197
3197
|
timeframe: String(primaryThreshold?.timeframe ?? ""),
|
|
3198
3198
|
tags: s.tags ?? [],
|
|
3199
3199
|
status: {
|
|
3200
|
-
// Note: SLI status requires a separate API call to getSLOHistory
|
|
3201
3200
|
sli: null,
|
|
3202
3201
|
errorBudgetRemaining: null,
|
|
3203
3202
|
state: "unknown"
|
|
3204
3203
|
},
|
|
3204
|
+
overallStatus: [],
|
|
3205
3205
|
createdAt: s.createdAt ? new Date(s.createdAt * 1e3).toISOString() : "",
|
|
3206
3206
|
modifiedAt: s.modifiedAt ? new Date(s.modifiedAt * 1e3).toISOString() : ""
|
|
3207
3207
|
};
|
|
3208
3208
|
}
|
|
3209
|
+
function formatSearchSlo(slo) {
|
|
3210
|
+
const attrs = slo.data?.attributes;
|
|
3211
|
+
const primaryThreshold = attrs?.thresholds?.[0];
|
|
3212
|
+
return {
|
|
3213
|
+
id: slo.data?.id ?? "",
|
|
3214
|
+
name: attrs?.name ?? "",
|
|
3215
|
+
description: attrs?.description ?? null,
|
|
3216
|
+
type: String(attrs?.sloType ?? "unknown"),
|
|
3217
|
+
targetThreshold: primaryThreshold?.target ?? 0,
|
|
3218
|
+
warningThreshold: primaryThreshold?.warning ?? null,
|
|
3219
|
+
timeframe: String(primaryThreshold?.timeframe ?? ""),
|
|
3220
|
+
tags: attrs?.allTags ?? [],
|
|
3221
|
+
status: {
|
|
3222
|
+
sli: attrs?.status?.sli ?? null,
|
|
3223
|
+
errorBudgetRemaining: attrs?.status?.errorBudgetRemaining ?? null,
|
|
3224
|
+
state: String(attrs?.status?.state ?? "unknown")
|
|
3225
|
+
},
|
|
3226
|
+
overallStatus: (attrs?.overallStatus ?? []).map((os) => ({
|
|
3227
|
+
sli: os.status ?? null,
|
|
3228
|
+
errorBudgetRemaining: os.errorBudgetRemaining ?? null,
|
|
3229
|
+
state: String(os.state ?? "unknown"),
|
|
3230
|
+
target: os.target ?? null,
|
|
3231
|
+
timeframe: String(os.timeframe ?? "")
|
|
3232
|
+
})),
|
|
3233
|
+
createdAt: attrs?.createdAt ? new Date(attrs.createdAt * 1e3).toISOString() : "",
|
|
3234
|
+
modifiedAt: attrs?.modifiedAt ? new Date(attrs.modifiedAt * 1e3).toISOString() : ""
|
|
3235
|
+
};
|
|
3236
|
+
}
|
|
3237
|
+
function buildSearchQuery(query, tags) {
|
|
3238
|
+
const parts = [];
|
|
3239
|
+
if (query) parts.push(query);
|
|
3240
|
+
if (tags?.length) parts.push(...tags);
|
|
3241
|
+
return parts.join(" ");
|
|
3242
|
+
}
|
|
3209
3243
|
async function listSlos(api, params, limits) {
|
|
3210
3244
|
const effectiveLimit = params.limit ?? limits.defaultLimit;
|
|
3211
|
-
|
|
3212
|
-
|
|
3213
|
-
|
|
3214
|
-
|
|
3215
|
-
|
|
3245
|
+
if (params.ids?.length) {
|
|
3246
|
+
const response2 = await api.listSLOs({
|
|
3247
|
+
ids: params.ids.join(","),
|
|
3248
|
+
limit: effectiveLimit
|
|
3249
|
+
});
|
|
3250
|
+
const slos3 = (response2.data ?? []).map(formatSlo);
|
|
3251
|
+
return { slos: slos3, total: slos3.length };
|
|
3252
|
+
}
|
|
3253
|
+
const searchQuery = buildSearchQuery(params.query, params.tags);
|
|
3254
|
+
const response = await api.searchSLO({
|
|
3255
|
+
query: searchQuery || void 0,
|
|
3256
|
+
pageSize: effectiveLimit
|
|
3216
3257
|
});
|
|
3217
|
-
const
|
|
3258
|
+
const searchSlos = response.data?.attributes?.slos ?? [];
|
|
3259
|
+
const slos2 = searchSlos.map(formatSearchSlo);
|
|
3218
3260
|
return {
|
|
3219
3261
|
slos: slos2,
|
|
3220
|
-
total:
|
|
3262
|
+
total: slos2.length
|
|
3221
3263
|
};
|
|
3222
3264
|
}
|
|
3223
3265
|
async function getSlo(api, id) {
|
|
@@ -3309,7 +3351,7 @@ async function getSloHistory(api, id, params) {
|
|
|
3309
3351
|
function registerSlosTool(server, api, limits, readOnly = false, _site = "datadoghq.com") {
|
|
3310
3352
|
server.tool(
|
|
3311
3353
|
"slos",
|
|
3312
|
-
"Manage Datadog Service Level Objectives. Actions: list, get, create, update, delete, history. SLO types: metric-based, monitor-based. Use for: reliability tracking, error budgets, SLA compliance, performance targets.",
|
|
3354
|
+
"Manage Datadog Service Level Objectives. Actions: list (with SLI status & error budget), get, create, update, delete, history. SLO types: metric-based, monitor-based. Use for: reliability tracking, error budgets, SLA compliance, performance targets.",
|
|
3313
3355
|
InputSchema8,
|
|
3314
3356
|
async ({ action, id, ids, query, tags, limit, config, from, to }) => {
|
|
3315
3357
|
try {
|
|
@@ -5565,6 +5607,24 @@ function createServer(config) {
|
|
|
5565
5607
|
);
|
|
5566
5608
|
return server;
|
|
5567
5609
|
}
|
|
5610
|
+
function createServerFactory(config) {
|
|
5611
|
+
const clients = createDatadogClients(config.datadog);
|
|
5612
|
+
return () => {
|
|
5613
|
+
const server = new McpServer({
|
|
5614
|
+
name: config.server.name,
|
|
5615
|
+
version: config.server.version
|
|
5616
|
+
});
|
|
5617
|
+
registerAllTools(
|
|
5618
|
+
server,
|
|
5619
|
+
clients,
|
|
5620
|
+
config.limits,
|
|
5621
|
+
config.features,
|
|
5622
|
+
config.datadog.site,
|
|
5623
|
+
config.datadog
|
|
5624
|
+
);
|
|
5625
|
+
return server;
|
|
5626
|
+
};
|
|
5627
|
+
}
|
|
5568
5628
|
|
|
5569
5629
|
// src/transport/stdio.ts
|
|
5570
5630
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
@@ -5579,11 +5639,11 @@ import express from "express";
|
|
|
5579
5639
|
import { randomUUID } from "crypto";
|
|
5580
5640
|
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
5581
5641
|
import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
|
|
5582
|
-
|
|
5583
|
-
function createExpressApp(server, config) {
|
|
5642
|
+
function createExpressApp(createServer2, config) {
|
|
5584
5643
|
const app = express();
|
|
5585
5644
|
app.disable("x-powered-by");
|
|
5586
5645
|
app.use(express.json());
|
|
5646
|
+
const transports = {};
|
|
5587
5647
|
app.get("/health", (_req, res) => {
|
|
5588
5648
|
res.json({ status: "ok", name: config.name, version: config.version });
|
|
5589
5649
|
});
|
|
@@ -5606,7 +5666,15 @@ function createExpressApp(server, config) {
|
|
|
5606
5666
|
console.error(`[MCP] Session closed: ${transport.sessionId}`);
|
|
5607
5667
|
}
|
|
5608
5668
|
};
|
|
5609
|
-
|
|
5669
|
+
try {
|
|
5670
|
+
const server = createServer2();
|
|
5671
|
+
await server.connect(transport);
|
|
5672
|
+
} catch (error) {
|
|
5673
|
+
if (transport.sessionId) {
|
|
5674
|
+
delete transports[transport.sessionId];
|
|
5675
|
+
}
|
|
5676
|
+
throw error;
|
|
5677
|
+
}
|
|
5610
5678
|
} else {
|
|
5611
5679
|
res.status(400).json({
|
|
5612
5680
|
jsonrpc: "2.0",
|
|
@@ -5637,8 +5705,8 @@ function createExpressApp(server, config) {
|
|
|
5637
5705
|
});
|
|
5638
5706
|
return app;
|
|
5639
5707
|
}
|
|
5640
|
-
async function connectHttp(
|
|
5641
|
-
const app = createExpressApp(
|
|
5708
|
+
async function connectHttp(createServer2, config) {
|
|
5709
|
+
const app = createExpressApp(createServer2, config);
|
|
5642
5710
|
app.listen(config.port, config.host, () => {
|
|
5643
5711
|
console.error(`[MCP] Datadog MCP server running on http://${config.host}:${config.port}/mcp`);
|
|
5644
5712
|
console.error(`[MCP] Health check available at http://${config.host}:${config.port}/health`);
|
|
@@ -5648,10 +5716,11 @@ async function connectHttp(server, config) {
|
|
|
5648
5716
|
// src/index.ts
|
|
5649
5717
|
try {
|
|
5650
5718
|
const config = loadConfig();
|
|
5651
|
-
const server = createServer(config);
|
|
5652
5719
|
if (config.server.transport === "http") {
|
|
5653
|
-
|
|
5720
|
+
const factory = createServerFactory(config);
|
|
5721
|
+
await connectHttp(factory, config.server);
|
|
5654
5722
|
} else {
|
|
5723
|
+
const server = createServer(config);
|
|
5655
5724
|
await connectStdio(server);
|
|
5656
5725
|
}
|
|
5657
5726
|
} catch (error) {
|