@debugbundle/mcp 1.13.1 → 1.14.0

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/README.md CHANGED
@@ -42,7 +42,7 @@ Use `npx -y @debugbundle/mcp` in clients that require noninteractive package exe
42
42
  | Claude Desktop local MCP | local MCP server config | uses local machine auth/config |
43
43
  | Claude Code plugin | `/plugin marketplace add debugbundle/debugbundle` | installs bundled MCP config and DebugBundle skill |
44
44
  | Codex developer plugin | `codex plugin add debugbundle-codex@debugbundle` | repository marketplace; local MCP and workflow skill |
45
- | Codex direct MCP | `codex mcp add debugbundle -- npx -y @debugbundle/mcp@1.13.1 --local-auth` | app, CLI, and IDE on the same host |
45
+ | Codex direct MCP | `codex mcp add debugbundle -- npx -y @debugbundle/mcp@1.14.0 --local-auth` | app, CLI, and IDE on the same host |
46
46
  | Cursor | MCP config with `npx @debugbundle/mcp` | stdio transport |
47
47
  | VS Code / GitHub MCP Registry | `com.debugbundle/mcp` | official registry metadata |
48
48
  | OpenClaw / ClawHub | DebugBundle skill plus MCP config | use the published skill for workflow guidance |
@@ -112,6 +112,14 @@ The plugin package lives at `apps/mcp/claude-code/debugbundle` and bundles a Cla
112
112
  - List saved analytics funnels and, with owner/admin access, create, update, or archive reusable funnel definitions through `list_saved_analytics_funnels`, `create_saved_analytics_funnel`, `update_saved_analytics_funnel`, and `archive_saved_analytics_funnel`.
113
113
  - Inspect hosted health checks, probes, alerts, webhooks, projects, members, billing, capture policy, and GitHub automation state.
114
114
  - Run local and hosted verification through tools such as `verify_local`, `verify_cloud`, `doctor`, `smoke`, and `analyze`.
115
+
116
+ `verify_app_event` provides real SDK-driven app proof, matching the CLI's
117
+ `verify cloud --expect-app-event`. Pass `projectId` and at least one of `service`,
118
+ `traceId`, or `requestId`; `environment`, `maxAgeMinutes`, and `authFilePath` are
119
+ optional. It reads existing incidents/bundles and never sends synthetic events.
120
+ The existing `verify_cloud` schema and description remain unchanged. The new tool
121
+ is available through ordinary and local-auth stdio MCP and its OpenClaw projection;
122
+ hosted read-only and restricted agent catalogs remain unchanged.
115
123
  - Resolve or reopen incidents after verification.
116
124
 
117
125
  For analytics questions, use direct aggregate tools first and generate an AnalyticsBundle only when a bounded analysis needs a durable artifact. The product does not create one bundle per visit.
@@ -147,3 +155,14 @@ For analytics questions, use direct aggregate tools first and generate an Analyt
147
155
  ## License
148
156
 
149
157
  Apache-2.0.
158
+
159
+ `disconnect_github_installation` calls the existing organization-wide disconnect
160
+ route. It requires the active organization's owner and removes repository assignments
161
+ for all its projects, including cleanup after downgrade. It does not uninstall the
162
+ App on GitHub. Install/reconnect uses the dashboard browser flow to retain the signed
163
+ state cookie. This additive tool brings the ordinary/local-auth catalog to 130 tools;
164
+ the hosted 23-tool and restricted five-tool profiles remain unchanged.
165
+
166
+ `test_webhook_event` accepts all eight supported webhook events through the existing
167
+ scoped test service. The legacy `test_webhook` schema remains verification-only.
168
+ Both queue a signed synthetic envelope without creating real incidents or bundles.
package/dist/main.cjs CHANGED
@@ -75020,6 +75020,32 @@ var AnalyticsFlowCaptureSchemas = {
75020
75020
  withdraw: Context.strict()
75021
75021
  };
75022
75022
 
75023
+ // ../../packages/shared-types/src/analytics-query.ts
75024
+ var DEFAULT_LAST_MS = 7 * 24 * 60 * 60 * 1e3;
75025
+ var MAX_LAST_MS = 370 * 24 * 60 * 60 * 1e3;
75026
+ var AnalyticsMetricsQuerySchema = external_exports.object({
75027
+ project_id: external_exports.string().uuid(),
75028
+ from: external_exports.string().datetime().optional(),
75029
+ to: external_exports.string().datetime().optional(),
75030
+ last: external_exports.string().trim().min(2).max(16).optional(),
75031
+ granularity: AnalyticsMetricsGranularitySchema.optional().default("day"),
75032
+ service: external_exports.string().trim().min(1).max(120).optional(),
75033
+ environment: external_exports.string().trim().min(1).max(120).optional(),
75034
+ route: external_exports.string().trim().min(1).max(2048).refine((value) => !value.includes("?") && !value.includes("#")).optional(),
75035
+ device_type: external_exports.string().trim().min(1).max(40).optional(),
75036
+ browser: external_exports.string().trim().min(1).max(80).optional(),
75037
+ os: external_exports.string().trim().min(1).max(80).optional(),
75038
+ language: external_exports.string().trim().min(1).max(40).optional(),
75039
+ country: external_exports.string().trim().min(1).max(8).optional(),
75040
+ auth_state: external_exports.enum(["anonymous", "authenticated", "unknown"]).optional(),
75041
+ referrer: external_exports.string().trim().min(1).max(255).optional(),
75042
+ utm_source: external_exports.string().trim().min(1).max(128).optional(),
75043
+ utm_medium: external_exports.string().trim().min(1).max(128).optional(),
75044
+ utm_campaign: external_exports.string().trim().min(1).max(128).optional(),
75045
+ custom_dimensions: external_exports.record(external_exports.string().regex(/^[A-Za-z][A-Za-z0-9_.-]{0,63}$/), external_exports.string().max(128)).refine((value) => Object.keys(value).length <= 8).optional(),
75046
+ limit: external_exports.coerce.number().int().min(1).max(100).optional().default(10)
75047
+ }).strict();
75048
+
75023
75049
  // ../../packages/shared-types/src/index.ts
75024
75050
  var SeveritySchema = external_exports.enum(["low", "medium", "high", "critical"]);
75025
75051
  var BundleSdkSchema = external_exports.object({
@@ -76341,7 +76367,12 @@ var WebhookLinksSchema = external_exports.object({
76341
76367
  reproduction: external_exports.string().min(1).optional()
76342
76368
  }).strict();
76343
76369
  var BundleLifecycleWebhookPayloadSchema = external_exports.object({
76344
- event: external_exports.enum(["bundle.created", "bundle.updated", "bundle.resolved", "improvement_bundle.created"]),
76370
+ event: external_exports.enum([
76371
+ "bundle.created",
76372
+ "bundle.updated",
76373
+ "bundle.resolved",
76374
+ "improvement_bundle.created"
76375
+ ]),
76345
76376
  occurred_at: external_exports.string().datetime(),
76346
76377
  project_id: external_exports.string().min(1),
76347
76378
  bundle_id: external_exports.string().min(1),
@@ -76381,10 +76412,15 @@ var VerificationWebhookTestPayloadSchema = external_exports.object({
76381
76412
  message: external_exports.string().min(1)
76382
76413
  }).strict()
76383
76414
  }).strict();
76415
+ var SyntheticWebhookTestPayloadSchema = VerificationWebhookTestPayloadSchema.extend({
76416
+ event: WebhookEventTypeSchema,
76417
+ event_type: WebhookEventTypeSchema
76418
+ });
76384
76419
  var WebhookEventPayloadSchema = external_exports.union([
76385
76420
  BundleLifecycleWebhookPayloadSchema,
76386
76421
  IncidentLifecycleWebhookPayloadSchema,
76387
- VerificationWebhookTestPayloadSchema
76422
+ VerificationWebhookTestPayloadSchema,
76423
+ SyntheticWebhookTestPayloadSchema
76388
76424
  ]);
76389
76425
  var WebhookFiltersSchema = external_exports.object({
76390
76426
  environment: external_exports.array(external_exports.string()).optional(),
@@ -77319,6 +77355,15 @@ async function expectNoContent(responsePromise) {
77319
77355
  }
77320
77356
  function createGitHubManagementApi(client) {
77321
77357
  return {
77358
+ async disconnectInstallation(input2) {
77359
+ return expectNoContent(
77360
+ client.request({
77361
+ method: "DELETE",
77362
+ path: "/v1/github/installation",
77363
+ bearerToken: input2.bearerToken
77364
+ })
77365
+ );
77366
+ },
77322
77367
  async getInstallation(input2) {
77323
77368
  const query = input2.projectId === void 0 ? "" : `?project_id=${encodeURIComponent(input2.projectId)}`;
77324
77369
  return expectInstallation(
@@ -89101,6 +89146,14 @@ function mapMcpError9(error2) {
89101
89146
  }
89102
89147
  function createGitHubMcpTools(api) {
89103
89148
  return {
89149
+ async disconnect_github_installation(input2) {
89150
+ try {
89151
+ await api.disconnectInstallation({ bearerToken: String(input2["bearerToken"]) });
89152
+ return { disconnected: true };
89153
+ } catch (error2) {
89154
+ mapMcpError9(error2);
89155
+ }
89156
+ },
89104
89157
  async get_github_status(input2) {
89105
89158
  try {
89106
89159
  const bearerToken = String(input2["bearerToken"]);
@@ -89173,7 +89226,9 @@ function createGitHubMcpTools(api) {
89173
89226
  ...Array.isArray(input2["services"]) ? { services: input2["services"].map((value) => String(value)) } : {},
89174
89227
  ...typeof input2["severityMin"] === "string" ? { severityMin: input2["severityMin"] } : {},
89175
89228
  ...typeof input2["bundleType"] === "string" ? { bundleType: input2["bundleType"] } : {},
89176
- ...typeof input2["incidentStatus"] === "string" ? { incidentStatus: input2["incidentStatus"] } : {},
89229
+ ...typeof input2["incidentStatus"] === "string" ? {
89230
+ incidentStatus: input2["incidentStatus"]
89231
+ } : {},
89177
89232
  ...typeof input2["cooldownSeconds"] === "number" ? { cooldownSeconds: input2["cooldownSeconds"] } : {},
89178
89233
  ...typeof input2["enabled"] === "boolean" ? { enabled: input2["enabled"] } : {}
89179
89234
  })
@@ -89204,7 +89259,9 @@ function createGitHubMcpTools(api) {
89204
89259
  deliveries: await api.listProjectDeliveries({
89205
89260
  bearerToken: String(input2["bearerToken"]),
89206
89261
  projectId: String(input2["projectId"]),
89207
- ...typeof input2["status"] === "string" ? { status: input2["status"] } : {},
89262
+ ...typeof input2["status"] === "string" ? {
89263
+ status: input2["status"]
89264
+ } : {},
89208
89265
  ...typeof input2["limit"] === "number" ? { limit: input2["limit"] } : {}
89209
89266
  })
89210
89267
  };
@@ -118435,6 +118492,16 @@ function parseJsonOutput2(output) {
118435
118492
  }
118436
118493
  return parsed;
118437
118494
  }
118495
+ function cloudVerificationOptions(input2) {
118496
+ return {
118497
+ projectId: String(input2["projectId"]),
118498
+ ...typeof input2["service"] === "string" ? { service: input2["service"] } : {},
118499
+ ...typeof input2["environment"] === "string" ? { environment: input2["environment"] } : {},
118500
+ ...typeof input2["maxAgeMinutes"] === "number" ? { maxAgeMinutes: input2["maxAgeMinutes"] } : {},
118501
+ ...typeof input2["authFilePath"] === "string" ? { authFilePath: input2["authFilePath"] } : {},
118502
+ json: true
118503
+ };
118504
+ }
118438
118505
  async function runJsonCommand2(command) {
118439
118506
  try {
118440
118507
  const result = await command();
@@ -118472,14 +118539,19 @@ function createSetupMcpTools(commands) {
118472
118539
  async verify_cloud(input2) {
118473
118540
  return runJsonCommand2(
118474
118541
  () => commands.verifyCloudCommand({
118475
- projectId: String(input2["projectId"]),
118476
- ...typeof input2["service"] === "string" ? { service: input2["service"] } : {},
118477
- ...typeof input2["environment"] === "string" ? { environment: input2["environment"] } : {},
118478
- ...typeof input2["maxAgeMinutes"] === "number" ? { maxAgeMinutes: input2["maxAgeMinutes"] } : {},
118542
+ ...cloudVerificationOptions(input2),
118479
118543
  ...input2["trigger5xx"] === true ? { trigger5xx: true } : {},
118480
- ...typeof input2["trigger4xxStatus"] === "number" ? { trigger4xxStatus: input2["trigger4xxStatus"] } : {},
118481
- ...typeof input2["authFilePath"] === "string" ? { authFilePath: input2["authFilePath"] } : {},
118482
- json: true
118544
+ ...typeof input2["trigger4xxStatus"] === "number" ? { trigger4xxStatus: input2["trigger4xxStatus"] } : {}
118545
+ })
118546
+ );
118547
+ },
118548
+ async verify_app_event(input2) {
118549
+ return runJsonCommand2(
118550
+ () => commands.verifyCloudCommand({
118551
+ ...cloudVerificationOptions(input2),
118552
+ expectAppEvent: true,
118553
+ ...typeof input2["traceId"] === "string" ? { traceId: input2["traceId"] } : {},
118554
+ ...typeof input2["requestId"] === "string" ? { requestId: input2["requestId"] } : {}
118483
118555
  })
118484
118556
  );
118485
118557
  },
@@ -118771,6 +118843,20 @@ function createWebhookMcpTools(api) {
118771
118843
  mapMcpError21(error2);
118772
118844
  }
118773
118845
  },
118846
+ async test_webhook_event(input2) {
118847
+ try {
118848
+ return {
118849
+ delivery: await api.testWebhook({
118850
+ bearerToken: String(input2["bearerToken"]),
118851
+ projectId: String(input2["projectId"]),
118852
+ webhookId: String(input2["webhookId"]),
118853
+ eventType: WebhookEventTypeSchema.parse(input2["eventType"])
118854
+ })
118855
+ };
118856
+ } catch (error2) {
118857
+ mapMcpError21(error2);
118858
+ }
118859
+ },
118774
118860
  async test_webhook(input2) {
118775
118861
  try {
118776
118862
  const requestInput = {
@@ -118890,6 +118976,7 @@ function createWeeklyReportMcpTools(api) {
118890
118976
 
118891
118977
  // src/tool-catalog-foundation.ts
118892
118978
  var optionalBearerTokenSchema = external_exports.string().optional();
118979
+ var appVerificationHintSchema = external_exports.string().min(1).refine((value) => value.trim().length > 0);
118893
118980
  var sourceSchema = external_exports.enum(["local", "cloud"]).optional();
118894
118981
  var listIncidentsInputSchema = external_exports.object({
118895
118982
  bearerToken: optionalBearerTokenSchema,
@@ -118956,6 +119043,25 @@ var MCP_TOOL_CATALOG_FOUNDATION = [
118956
119043
  authFilePath: external_exports.string().optional()
118957
119044
  })
118958
119045
  },
119046
+ {
119047
+ name: "verify_app_event",
119048
+ group: "setup",
119049
+ description: "Wait for a real SDK-driven hosted app incident and verify its bundle using service, traceId, or requestId. Read-only proof; does not create synthetic events. Requires local member authentication.",
119050
+ inputSchema: external_exports.object({
119051
+ projectId: external_exports.string().min(1),
119052
+ service: appVerificationHintSchema.optional(),
119053
+ environment: external_exports.string().optional(),
119054
+ maxAgeMinutes: external_exports.number().optional(),
119055
+ traceId: appVerificationHintSchema.optional(),
119056
+ requestId: appVerificationHintSchema.optional(),
119057
+ authFilePath: external_exports.string().optional()
119058
+ }).strict().refine(
119059
+ (input2) => input2.service !== void 0 || input2.traceId !== void 0 || input2.requestId !== void 0,
119060
+ {
119061
+ message: "App-event proof requires service, traceId, or requestId."
119062
+ }
119063
+ )
119064
+ },
118959
119065
  {
118960
119066
  name: "smoke",
118961
119067
  group: "setup",
@@ -119212,6 +119318,12 @@ var MCP_TOOL_CATALOG_FOUNDATION = [
119212
119318
  projectId: external_exports.string()
119213
119319
  })
119214
119320
  },
119321
+ {
119322
+ name: "disconnect_github_installation",
119323
+ group: "github",
119324
+ description: "Disconnect the GitHub installation for the active organization and remove repository assignments across all its projects. Owner only. This does not uninstall the App from GitHub; install/reconnect requires the dashboard browser handoff.",
119325
+ inputSchema: external_exports.object({ bearerToken: external_exports.string().min(1) }).strict()
119326
+ },
119215
119327
  {
119216
119328
  name: "list_project_tokens",
119217
119329
  group: "tokens",
@@ -119253,13 +119365,22 @@ var MCP_TOOL_CATALOG_FOUNDATION = [
119253
119365
  name: "create_agent_token",
119254
119366
  group: "tokens",
119255
119367
  description: "Create a single-project minimized read credential, returned once. Requires owner or project admin.",
119256
- inputSchema: external_exports.object({ bearerToken: external_exports.string(), projectId: external_exports.string().uuid(), label: external_exports.string().min(1).max(120), expiresAt: external_exports.string().datetime().optional() })
119368
+ inputSchema: external_exports.object({
119369
+ bearerToken: external_exports.string(),
119370
+ projectId: external_exports.string().uuid(),
119371
+ label: external_exports.string().min(1).max(120),
119372
+ expiresAt: external_exports.string().datetime().optional()
119373
+ })
119257
119374
  },
119258
119375
  {
119259
119376
  name: "revoke_agent_token",
119260
119377
  group: "tokens",
119261
119378
  description: "Revoke a project-scoped agent credential. Requires owner or project admin.",
119262
- inputSchema: external_exports.object({ bearerToken: external_exports.string(), projectId: external_exports.string().uuid(), tokenId: external_exports.string().uuid() })
119379
+ inputSchema: external_exports.object({
119380
+ bearerToken: external_exports.string(),
119381
+ projectId: external_exports.string().uuid(),
119382
+ tokenId: external_exports.string().uuid()
119383
+ })
119263
119384
  },
119264
119385
  {
119265
119386
  name: "list_member_tokens",
@@ -119357,6 +119478,17 @@ var MCP_TOOL_CATALOG_OPERATIONS = [
119357
119478
  eventType: verificationEventTypeSchema.optional()
119358
119479
  })
119359
119480
  },
119481
+ {
119482
+ name: "test_webhook_event",
119483
+ group: "webhooks",
119484
+ description: "Queue a signed synthetic webhook test for any supported lifecycle event. Requires endpoint creator or owner/admin authority; does not create a real incident or bundle. The legacy test_webhook verification contract is retained.",
119485
+ inputSchema: external_exports.object({
119486
+ bearerToken: external_exports.string(),
119487
+ projectId: external_exports.string().min(1),
119488
+ webhookId: external_exports.string().min(1),
119489
+ eventType: WebhookEventTypeSchema
119490
+ }).strict()
119491
+ },
119360
119492
  {
119361
119493
  name: "list_webhook_deliveries",
119362
119494
  group: "webhooks",
@@ -120097,7 +120229,7 @@ var import_node_readline = require("node:readline");
120097
120229
  var package_default = {
120098
120230
  name: "@debugbundle/mcp",
120099
120231
  mcpName: "com.debugbundle/mcp",
120100
- version: "1.13.1",
120232
+ version: "1.14.0",
120101
120233
  private: false,
120102
120234
  description: "MCP server for runtime error reporting, incident response, health checks, debug bundles, and product analytics",
120103
120235
  license: "Apache-2.0",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@debugbundle/mcp",
3
3
  "mcpName": "com.debugbundle/mcp",
4
- "version": "1.13.1",
4
+ "version": "1.14.0",
5
5
  "private": false,
6
6
  "description": "MCP server for runtime error reporting, incident response, health checks, debug bundles, and product analytics",
7
7
  "license": "Apache-2.0",
package/server.json CHANGED
@@ -8,13 +8,13 @@
8
8
  "source": "github",
9
9
  "subfolder": "apps/mcp"
10
10
  },
11
- "version": "1.13.1",
11
+ "version": "1.14.0",
12
12
  "packages": [
13
13
  {
14
14
  "registryType": "npm",
15
15
  "registryBaseUrl": "https://registry.npmjs.org",
16
16
  "identifier": "@debugbundle/mcp",
17
- "version": "1.13.1",
17
+ "version": "1.14.0",
18
18
  "transport": {
19
19
  "type": "stdio"
20
20
  },