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 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
- const response = await api.listSLOs({
3212
- ids: params.ids?.join(","),
3213
- query: params.query,
3214
- tagsQuery: params.tags?.join(","),
3215
- limit: effectiveLimit
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 slos2 = (response.data ?? []).map(formatSlo);
3258
+ const searchSlos = response.data?.attributes?.slos ?? [];
3259
+ const slos2 = searchSlos.map(formatSearchSlo);
3218
3260
  return {
3219
3261
  slos: slos2,
3220
- total: response.data?.length ?? 0
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
- var transports = {};
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
- await server.connect(transport);
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(server, config) {
5641
- const app = createExpressApp(server, config);
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
- await connectHttp(server, config.server);
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) {