@debugbundle/mcp 0.1.3 → 0.1.6

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.
Files changed (3) hide show
  1. package/README.md +1 -1
  2. package/dist/main.cjs +130 -53
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -30,7 +30,7 @@ debugbundle-mcp
30
30
  }
31
31
  ```
32
32
 
33
- The server uses stdio transport and exposes the same DebugBundle incident, incident-context, bundle, webhook, alert, token, project, member, billing, GitHub, probe, and diagnostic tools documented at https://debugbundle.com/docs/mcp. Hosted verification supports the active V1 proof path through `verify_cloud` with `trigger5xx: true`, incident triage can start with the one-call `get_incident_context` tool, and `doctor` accepts `privacy: true` to return the same deterministic redaction preview as `debugbundle doctor --privacy`.
33
+ The server uses stdio transport and exposes the same DebugBundle incident, incident-context, bundle, webhook, alert, token, project, member, billing, GitHub, probe, and diagnostic tools documented at https://debugbundle.com/docs/mcp. Hosted verification supports the active V1 proof path through `verify_cloud` with `trigger5xx: true` and the configured-client-error proof path with `trigger4xxStatus: 403`, incident triage can start with the one-call `get_incident_context` tool, and `doctor` accepts `privacy: true` to return the same deterministic redaction preview as `debugbundle doctor --privacy`.
34
34
 
35
35
  ## Authentication
36
36
 
package/dist/main.cjs CHANGED
@@ -16276,6 +16276,31 @@ var CaptureProbeEventsValues = ["buffer_only", "standalone_when_activated"];
16276
16276
  var CaptureProbeEventsSchema = external_exports.enum(CaptureProbeEventsValues);
16277
16277
  var RequestSignalClassificationValues = ["incident_signal", "context_signal"];
16278
16278
  var RequestSignalClassificationSchema = external_exports.enum(RequestSignalClassificationValues);
16279
+ var RECOMMENDED_IMMEDIATE_CLIENT_ERROR_STATUSES = [401, 403, 409, 422];
16280
+ var ImmediateClientErrorStatusSchema = external_exports.number().int().min(400).max(499);
16281
+ function normalizeImmediateClientErrorStatuses(statuses) {
16282
+ return Array.from(new Set(statuses)).sort((left, right) => left - right);
16283
+ }
16284
+ var ImmediateClientErrorStatusesSchema = external_exports.array(ImmediateClientErrorStatusSchema).max(12).transform((statuses) => normalizeImmediateClientErrorStatuses(statuses));
16285
+ var ResolvedCapturePolicySchema = external_exports.object({
16286
+ preset: CapturePresetSchema,
16287
+ capture_logs: CaptureLogsSchema,
16288
+ capture_request_events: CaptureRequestEventsSchema,
16289
+ capture_breadcrumbs: CaptureBreadcrumbsSchema,
16290
+ capture_probe_events: CaptureProbeEventsSchema,
16291
+ immediate_client_error_statuses: ImmediateClientErrorStatusesSchema
16292
+ });
16293
+ var CapturePolicyOverridesSchema = external_exports.object({
16294
+ capture_logs: CaptureLogsSchema.nullable(),
16295
+ capture_request_events: CaptureRequestEventsSchema.nullable(),
16296
+ capture_breadcrumbs: CaptureBreadcrumbsSchema.nullable(),
16297
+ capture_probe_events: CaptureProbeEventsSchema.nullable(),
16298
+ immediate_client_error_statuses: ImmediateClientErrorStatusesSchema.nullable()
16299
+ });
16300
+ var CapturePolicyResponseSchema = external_exports.object({
16301
+ policy: ResolvedCapturePolicySchema,
16302
+ overrides: CapturePolicyOverridesSchema
16303
+ });
16279
16304
  var CapturePolicySchema = external_exports.object({
16280
16305
  project_id: external_exports.string().uuid(),
16281
16306
  preset: CapturePresetSchema,
@@ -16283,6 +16308,7 @@ var CapturePolicySchema = external_exports.object({
16283
16308
  capture_request_events: CaptureRequestEventsSchema.nullable(),
16284
16309
  capture_breadcrumbs: CaptureBreadcrumbsSchema.nullable(),
16285
16310
  capture_probe_events: CaptureProbeEventsSchema.nullable(),
16311
+ immediate_client_error_statuses: ImmediateClientErrorStatusesSchema.nullable(),
16286
16312
  updated_at: external_exports.string().datetime()
16287
16313
  });
16288
16314
  var CapturePolicyUpdateSchema = external_exports.object({
@@ -16290,21 +16316,48 @@ var CapturePolicyUpdateSchema = external_exports.object({
16290
16316
  capture_logs: CaptureLogsSchema.nullable().optional(),
16291
16317
  capture_request_events: CaptureRequestEventsSchema.nullable().optional(),
16292
16318
  capture_breadcrumbs: CaptureBreadcrumbsSchema.nullable().optional(),
16293
- capture_probe_events: CaptureProbeEventsSchema.nullable().optional()
16319
+ capture_probe_events: CaptureProbeEventsSchema.nullable().optional(),
16320
+ immediate_client_error_statuses: ImmediateClientErrorStatusesSchema.nullable().optional()
16294
16321
  });
16322
+ var PRESET_DEFAULTS = {
16323
+ minimal: {
16324
+ capture_logs: "error",
16325
+ capture_request_events: "failures_only",
16326
+ capture_breadcrumbs: "local_only",
16327
+ capture_probe_events: "buffer_only",
16328
+ immediate_client_error_statuses: []
16329
+ },
16330
+ balanced: {
16331
+ capture_logs: "warning",
16332
+ capture_request_events: "failures_only",
16333
+ capture_breadcrumbs: "exception_only",
16334
+ capture_probe_events: "buffer_only",
16335
+ immediate_client_error_statuses: []
16336
+ },
16337
+ investigative: {
16338
+ capture_logs: "info",
16339
+ capture_request_events: "all",
16340
+ capture_breadcrumbs: "standalone",
16341
+ capture_probe_events: "standalone_when_activated",
16342
+ immediate_client_error_statuses: [...RECOMMENDED_IMMEDIATE_CLIENT_ERROR_STATUSES]
16343
+ }
16344
+ };
16295
16345
  var BALANCED_IMMEDIATE_REQUEST_STATUSES = /* @__PURE__ */ new Set([408, 423, 424, 425, 429]);
16296
16346
  var INVESTIGATIVE_IMMEDIATE_REQUEST_STATUSES = /* @__PURE__ */ new Set([...BALANCED_IMMEDIATE_REQUEST_STATUSES, 409]);
16297
16347
  var BALANCED_STANDARD_ANOMALY_STATUSES = /* @__PURE__ */ new Set([401, 403, 404, 409, 422]);
16298
16348
  var BALANCED_HIGH_VOLUME_ANOMALY_STATUSES = /* @__PURE__ */ new Set([400, 410]);
16299
16349
  var INVESTIGATIVE_ANOMALY_STATUSES = /* @__PURE__ */ new Set([...BALANCED_STANDARD_ANOMALY_STATUSES, ...BALANCED_HIGH_VOLUME_ANOMALY_STATUSES]);
16300
16350
  function classifyRequestStatus(input) {
16301
- const { responseStatus, capturePreset } = input;
16351
+ const { responseStatus, capturePreset, immediateClientErrorStatuses = [] } = input;
16302
16352
  if (responseStatus === null || !Number.isFinite(responseStatus)) {
16303
16353
  return "context_signal";
16304
16354
  }
16305
16355
  if (responseStatus >= 500) {
16306
16356
  return "incident_signal";
16307
16357
  }
16358
+ if (immediateClientErrorStatuses.includes(responseStatus)) {
16359
+ return "incident_signal";
16360
+ }
16308
16361
  if (capturePreset === "investigative") {
16309
16362
  return INVESTIGATIVE_IMMEDIATE_REQUEST_STATUSES.has(responseStatus) ? "incident_signal" : "context_signal";
16310
16363
  }
@@ -17558,16 +17611,6 @@ function createCliHttpClient(input, dependencies) {
17558
17611
  }
17559
17612
 
17560
17613
  // ../cli/src/capture-policy-commands.ts
17561
- var ResolvedCapturePolicySchema = external_exports.object({
17562
- preset: CapturePresetSchema,
17563
- capture_logs: CaptureLogsSchema,
17564
- capture_request_events: CaptureRequestEventsSchema,
17565
- capture_breadcrumbs: CaptureBreadcrumbsSchema,
17566
- capture_probe_events: CaptureProbeEventsSchema
17567
- });
17568
- var CapturePolicyResponseSchema = external_exports.object({
17569
- policy: ResolvedCapturePolicySchema
17570
- });
17571
17614
  var CapturePolicyApiError = class extends Error {
17572
17615
  status;
17573
17616
  constructor(status, message) {
@@ -17597,7 +17640,7 @@ function createCapturePolicyApi(httpClient) {
17597
17640
  if (!parsed.success) {
17598
17641
  throw new CapturePolicyApiError(500, "Invalid capture policy response.");
17599
17642
  }
17600
- return parsed.data.policy;
17643
+ return parsed.data;
17601
17644
  },
17602
17645
  async updateCapturePolicy(input) {
17603
17646
  const response = await httpClient.request({
@@ -17613,7 +17656,7 @@ function createCapturePolicyApi(httpClient) {
17613
17656
  if (!parsed.success) {
17614
17657
  throw new CapturePolicyApiError(500, "Invalid capture policy response.");
17615
17658
  }
17616
- return parsed.data.policy;
17659
+ return parsed.data;
17617
17660
  }
17618
17661
  };
17619
17662
  }
@@ -18041,7 +18084,7 @@ function getRequestResponseStatus(payload) {
18041
18084
  const status = payload?.["response_status"];
18042
18085
  return typeof status === "number" && Number.isFinite(status) ? status : null;
18043
18086
  }
18044
- function classifyEvent(eventType, logLevel, probeActivationId, payload, capturePreset = "minimal") {
18087
+ function classifyEvent(eventType, logLevel, probeActivationId, payload, capturePreset = "minimal", immediateClientErrorStatuses = []) {
18045
18088
  switch (eventType) {
18046
18089
  case "backend_exception":
18047
18090
  case "frontend_exception":
@@ -18053,7 +18096,7 @@ function classifyEvent(eventType, logLevel, probeActivationId, payload, captureP
18053
18096
  return "context_signal";
18054
18097
  case "request_event": {
18055
18098
  const responseStatus = getRequestResponseStatus(payload);
18056
- return classifyRequestStatus({ responseStatus, capturePreset });
18099
+ return classifyRequestStatus({ responseStatus, capturePreset, immediateClientErrorStatuses });
18057
18100
  }
18058
18101
  case "frontend_breadcrumb":
18059
18102
  case "deploy_metadata":
@@ -18978,6 +19021,13 @@ var STORAGE_SCHEMA_MIGRATIONS = [
18978
19021
  ON slack_destinations (organization_id, is_active, created_at)
18979
19022
  `
18980
19023
  ]
19024
+ }),
19025
+ defineStorageSchemaMigration({
19026
+ id: "202605140001_add_capture_policy_immediate_client_error_statuses",
19027
+ description: "Add nullable immediate client error status overrides to capture policies.",
19028
+ statements: [
19029
+ "ALTER TABLE capture_policies ADD COLUMN IF NOT EXISTS immediate_client_error_statuses jsonb"
19030
+ ]
18981
19031
  })
18982
19032
  ];
18983
19033
 
@@ -21075,7 +21125,7 @@ function formatResult(input, exitCode, checks, errors, incidentId) {
21075
21125
  };
21076
21126
  }
21077
21127
  function buildCloudSuggestedActions(status, incidentId, mode = "passive_recent_incident") {
21078
- if (status === "healthy" && incidentId !== void 0 && mode === "active_5xx") {
21128
+ if (status === "healthy" && incidentId !== void 0 && (mode === "active_5xx" || mode === "active_4xx")) {
21079
21129
  return [
21080
21130
  `Run debugbundle inspect ${incidentId} --source cloud to inspect why the incident fired.`,
21081
21131
  `Run debugbundle bundle ${incidentId} --source cloud to fetch the generated debug bundle.`
@@ -21145,11 +21195,11 @@ function localFailureStepName(checks) {
21145
21195
  function cloudVerificationRunId(now) {
21146
21196
  return now.toISOString().replace(/[-:.TZ]/g, "").slice(0, 14);
21147
21197
  }
21148
- function requestFailureReason() {
21198
+ function requestFailureReason(responseStatus) {
21149
21199
  const incidentReason = deriveIncidentReasonFromSignal({
21150
21200
  event_type: "request_event",
21151
21201
  event_class: "incident_signal",
21152
- response_status: 503
21202
+ response_status: responseStatus
21153
21203
  });
21154
21204
  if (incidentReason === null) {
21155
21205
  throw new Error("request_failure_reason_unavailable");
@@ -21158,6 +21208,9 @@ function requestFailureReason() {
21158
21208
  }
21159
21209
  function buildCloudVerificationEvent(input) {
21160
21210
  const runId = cloudVerificationRunId(input.now);
21211
+ const is5xxVerification = input.responseStatus >= 500;
21212
+ const routeTemplate = is5xxVerification ? "/debugbundle/verify/cloud" : `/debugbundle/verify/cloud/client-error/${input.responseStatus}`;
21213
+ const verificationLabel = is5xxVerification ? "true" : `client-error-${input.responseStatus}`;
21161
21214
  return createEventEnvelope({
21162
21215
  event_type: "request_event",
21163
21216
  sdk_name: "debugbundle-cli",
@@ -21171,28 +21224,39 @@ function buildCloudVerificationEvent(input) {
21171
21224
  occurred_at: input.now.toISOString(),
21172
21225
  payload: {
21173
21226
  method: "GET",
21174
- path: "/debugbundle/verify/cloud",
21175
- route_template: "/debugbundle/verify/cloud",
21227
+ path: routeTemplate,
21228
+ route_template: routeTemplate,
21176
21229
  query: {
21177
21230
  debugbundle_verification: true,
21178
- run_id: runId
21231
+ run_id: runId,
21232
+ synthetic_status: input.responseStatus
21179
21233
  },
21180
21234
  headers: {
21181
- "x-debugbundle-verification": "true"
21235
+ "x-debugbundle-verification": verificationLabel
21182
21236
  },
21183
- response_status: 503,
21237
+ response_status: input.responseStatus,
21184
21238
  duration_ms: 37,
21185
21239
  response_headers: {
21186
- "x-debugbundle-verification": "true"
21240
+ "x-debugbundle-verification": verificationLabel
21187
21241
  },
21188
21242
  response_body: {
21189
- error: "debugbundle_cloud_verification",
21243
+ error: is5xxVerification ? "debugbundle_cloud_verification" : "debugbundle_cloud_client_error_verification",
21190
21244
  synthetic: true,
21191
- run_id: runId
21245
+ run_id: runId,
21246
+ response_status: input.responseStatus
21192
21247
  }
21193
21248
  }
21194
21249
  });
21195
21250
  }
21251
+ function validateActiveCloudVerificationInput(input) {
21252
+ if (input.trigger5xx === true && input.trigger4xxStatus !== void 0) {
21253
+ return "Choose either --trigger-5xx or --trigger-4xx, not both.";
21254
+ }
21255
+ if (input.trigger4xxStatus !== void 0 && (input.trigger4xxStatus < 400 || input.trigger4xxStatus > 499)) {
21256
+ return "--trigger-4xx must be an integer status between 400 and 499.";
21257
+ }
21258
+ return null;
21259
+ }
21196
21260
  async function sendEventsToApi(input, dependencies = {}) {
21197
21261
  const fetchImpl = dependencies.fetchImpl ?? fetch;
21198
21262
  const baseUrl = input.baseUrl.endsWith("/") ? input.baseUrl.slice(0, -1) : input.baseUrl;
@@ -21384,6 +21448,15 @@ async function verifyCloudCommand(input, dependencies = {}) {
21384
21448
  const checks = [];
21385
21449
  const environment = input.environment ?? "production";
21386
21450
  const maxAgeMinutes = input.maxAgeMinutes ?? 15;
21451
+ const activeInputError = validateActiveCloudVerificationInput(input);
21452
+ if (activeInputError !== null) {
21453
+ checks.push({
21454
+ name: "trigger-input",
21455
+ status: "error",
21456
+ message: activeInputError
21457
+ });
21458
+ return formatCloudResult(input, 4, checks, [activeInputError]);
21459
+ }
21387
21460
  const readAuthState = dependencies.readAuthState ?? readCliAuthState;
21388
21461
  let authState;
21389
21462
  try {
@@ -21416,7 +21489,7 @@ async function verifyCloudCommand(input, dependencies = {}) {
21416
21489
  requestInput,
21417
21490
  dependencies.fetchImpl === void 0 ? {} : { fetchImpl: dependencies.fetchImpl }
21418
21491
  ));
21419
- if (input.trigger5xx === true) {
21492
+ if (input.trigger5xx === true || input.trigger4xxStatus !== void 0) {
21420
21493
  const verificationStartedAt = now();
21421
21494
  const runId = cloudVerificationRunId(verificationStartedAt);
21422
21495
  const serviceName = input.service ?? `debugbundle-verify-cloud-${runId}`;
@@ -21424,16 +21497,20 @@ async function verifyCloudCommand(input, dependencies = {}) {
21424
21497
  const pollAttempts = dependencies.pollAttempts ?? 6;
21425
21498
  const pollIntervalMs = dependencies.pollIntervalMs ?? 2e3;
21426
21499
  const sleep = dependencies.sleep ?? ((milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)));
21500
+ const responseStatus = input.trigger4xxStatus ?? 503;
21501
+ const activeMode = input.trigger4xxStatus !== void 0 ? "active_4xx" : "active_5xx";
21502
+ const activeCheckName = input.trigger4xxStatus !== void 0 ? "active-4xx-event" : "active-5xx-event";
21503
+ const statusLabel = input.trigger4xxStatus !== void 0 ? `${responseStatus}` : "5xx";
21427
21504
  const verification = {
21428
- mode: "active_5xx",
21505
+ mode: activeMode,
21429
21506
  bundle_status: "unknown",
21430
- classification_reason: requestFailureReason()
21507
+ classification_reason: requestFailureReason(responseStatus)
21431
21508
  };
21432
21509
  const errors = [];
21433
21510
  let exitCode = 0;
21434
21511
  let tokenId = null;
21435
21512
  let incidentId;
21436
- let activeStep = "active-5xx-event";
21513
+ let activeStep = activeCheckName;
21437
21514
  try {
21438
21515
  const token = await createProjectToken({
21439
21516
  bearerToken: authState.bearer_token,
@@ -21447,7 +21524,8 @@ async function verifyCloudCommand(input, dependencies = {}) {
21447
21524
  const event = buildCloudVerificationEvent({
21448
21525
  now: verificationStartedAt,
21449
21526
  serviceName,
21450
- environment
21527
+ environment,
21528
+ responseStatus
21451
21529
  });
21452
21530
  const ingestion = await sendEvents({
21453
21531
  baseUrl: authState.base_url,
@@ -21456,12 +21534,12 @@ async function verifyCloudCommand(input, dependencies = {}) {
21456
21534
  });
21457
21535
  verification.accepted_event_count = ingestion.accepted;
21458
21536
  if (ingestion.accepted < 1 || ingestion.rejected > 0 || ingestion.errors.length > 0) {
21459
- throw new Error(`Synthetic 5xx ingestion was not fully accepted: accepted=${ingestion.accepted}, rejected=${ingestion.rejected}.`);
21537
+ throw new Error(`Synthetic ${statusLabel} ingestion was not fully accepted: accepted=${ingestion.accepted}, rejected=${ingestion.rejected}.`);
21460
21538
  }
21461
21539
  checks.push({
21462
- name: "active-5xx-event",
21540
+ name: activeCheckName,
21463
21541
  status: "ok",
21464
- message: "Sent synthetic 5xx request_event through cloud ingestion."
21542
+ message: `Sent synthetic ${statusLabel} request_event through cloud ingestion.`
21465
21543
  });
21466
21544
  activeStep = "incident-retrieval";
21467
21545
  for (let attempt = 1; attempt <= pollAttempts; attempt += 1) {
@@ -21479,7 +21557,7 @@ async function verifyCloudCommand(input, dependencies = {}) {
21479
21557
  if (candidate !== void 0) {
21480
21558
  incidentId = candidate.incident_id;
21481
21559
  verification.incident_id = candidate.incident_id;
21482
- verification.classification_reason = candidate.incident_reason ?? requestFailureReason();
21560
+ verification.classification_reason = candidate.incident_reason ?? requestFailureReason(responseStatus);
21483
21561
  break;
21484
21562
  }
21485
21563
  if (attempt < pollAttempts) {
@@ -21487,12 +21565,12 @@ async function verifyCloudCommand(input, dependencies = {}) {
21487
21565
  }
21488
21566
  }
21489
21567
  if (incidentId === void 0) {
21490
- throw new Error("Synthetic 5xx request was accepted but no matching cloud incident was visible yet.");
21568
+ throw new Error(`Synthetic ${statusLabel} request was accepted but no matching cloud incident was visible yet.`);
21491
21569
  }
21492
21570
  checks.push({
21493
21571
  name: "incident-retrieval",
21494
21572
  status: "ok",
21495
- message: `Retrieved cloud incident ${incidentId} for the synthetic 5xx request.`
21573
+ message: `Retrieved cloud incident ${incidentId} for the synthetic ${statusLabel} request.`
21496
21574
  });
21497
21575
  activeStep = "bundle-status";
21498
21576
  const bundle = await getBundle({
@@ -22142,12 +22220,10 @@ function createCapturePolicyMcpTools(api) {
22142
22220
  return {
22143
22221
  async get_capture_policy(input) {
22144
22222
  try {
22145
- return {
22146
- policy: await api.getCapturePolicy({
22147
- bearerToken: String(input["bearerToken"]),
22148
- projectId: String(input["projectId"])
22149
- })
22150
- };
22223
+ return await api.getCapturePolicy({
22224
+ bearerToken: String(input["bearerToken"]),
22225
+ projectId: String(input["projectId"])
22226
+ });
22151
22227
  } catch (error) {
22152
22228
  mapMcpError4(error);
22153
22229
  }
@@ -22155,13 +22231,11 @@ function createCapturePolicyMcpTools(api) {
22155
22231
  async update_capture_policy(input) {
22156
22232
  try {
22157
22233
  const update = typeof input["update"] === "object" && input["update"] !== null ? input["update"] : {};
22158
- return {
22159
- policy: await api.updateCapturePolicy({
22160
- bearerToken: String(input["bearerToken"]),
22161
- projectId: String(input["projectId"]),
22162
- update
22163
- })
22164
- };
22234
+ return await api.updateCapturePolicy({
22235
+ bearerToken: String(input["bearerToken"]),
22236
+ projectId: String(input["projectId"]),
22237
+ update
22238
+ });
22165
22239
  } catch (error) {
22166
22240
  mapMcpError4(error);
22167
22241
  }
@@ -23236,6 +23310,7 @@ function createSetupMcpTools(commands) {
23236
23310
  ...typeof input["environment"] === "string" ? { environment: input["environment"] } : {},
23237
23311
  ...typeof input["maxAgeMinutes"] === "number" ? { maxAgeMinutes: input["maxAgeMinutes"] } : {},
23238
23312
  ...input["trigger5xx"] === true ? { trigger5xx: true } : {},
23313
+ ...typeof input["trigger4xxStatus"] === "number" ? { trigger4xxStatus: input["trigger4xxStatus"] } : {},
23239
23314
  ...typeof input["authFilePath"] === "string" ? { authFilePath: input["authFilePath"] } : {},
23240
23315
  json: true
23241
23316
  })
@@ -25008,13 +25083,14 @@ var MCP_TOOL_CATALOG = [
25008
25083
  {
25009
25084
  name: "verify_cloud",
25010
25085
  group: "setup",
25011
- description: "Verify that a hosted project is sending data to DebugBundle.",
25086
+ description: "Verify hosted ingestion or actively prove hosted incident creation.",
25012
25087
  inputSchema: external_exports.object({
25013
25088
  projectId: external_exports.string(),
25014
25089
  service: external_exports.string().optional(),
25015
25090
  environment: external_exports.string().optional(),
25016
25091
  maxAgeMinutes: external_exports.number().optional(),
25017
25092
  trigger5xx: external_exports.boolean().optional(),
25093
+ trigger4xxStatus: external_exports.number().int().min(400).max(499).optional(),
25018
25094
  authFilePath: external_exports.string().optional()
25019
25095
  })
25020
25096
  },
@@ -25533,7 +25609,8 @@ var MCP_TOOL_CATALOG = [
25533
25609
  capture_logs: external_exports.string().nullable().optional(),
25534
25610
  capture_request_events: external_exports.string().nullable().optional(),
25535
25611
  capture_breadcrumbs: external_exports.string().nullable().optional(),
25536
- capture_probe_events: external_exports.string().nullable().optional()
25612
+ capture_probe_events: external_exports.string().nullable().optional(),
25613
+ immediate_client_error_statuses: external_exports.array(external_exports.number().int().min(400).max(499)).nullable().optional()
25537
25614
  })
25538
25615
  })
25539
25616
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@debugbundle/mcp",
3
- "version": "0.1.3",
3
+ "version": "0.1.6",
4
4
  "private": false,
5
5
  "description": "Model Context Protocol server for DebugBundle",
6
6
  "license": "AGPL-3.0-only",