@debugbundle/mcp 1.0.0 → 1.0.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/dist/main.cjs CHANGED
@@ -18609,6 +18609,17 @@ function createMemberApi(httpClient) {
18609
18609
  throw toApiError4(response.status, response.body);
18610
18610
  }
18611
18611
  return response.body;
18612
+ },
18613
+ async leaveProject(input) {
18614
+ const response = await httpClient.request({
18615
+ method: "DELETE",
18616
+ path: `/v1/projects/${input.projectId}/membership`,
18617
+ bearerToken: input.bearerToken
18618
+ });
18619
+ if (response.status !== 200) {
18620
+ throw toApiError4(response.status, response.body);
18621
+ }
18622
+ return response.body;
18612
18623
  }
18613
18624
  };
18614
18625
  }
@@ -18824,11 +18835,129 @@ var ISO_TIMESTAMP_PATTERN = /\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z\b/
18824
18835
  var IPV4_PATTERN = /\b(?:\d{1,3}\.){3}\d{1,3}\b/g;
18825
18836
  var HEX_PATTERN = /\b0x[0-9a-f]+\b/gi;
18826
18837
  var BARE_HEX_PATTERN = /\b(?=[0-9a-f]{8,}\b)(?=[0-9a-f]*[a-f])[0-9a-f]+\b/gi;
18838
+ var LONG_ALPHANUMERIC_TOKEN_PATTERN = /\b(?=[A-Za-z0-9_-]{16,}\b)(?=[A-Za-z0-9_-]*[A-Za-z])(?=[A-Za-z0-9_-]*\d)[A-Za-z0-9_-]+\b/g;
18827
18839
  var LARGE_NUMBER_PATTERN = /\b\d{2,}\b/g;
18828
18840
  var DYNAMIC_SEGMENT_PATTERN = /^(?:\d+|[0-9a-f]{8}-[0-9a-f-]{27}|[A-Za-z0-9_-]{24,})$/;
18829
18841
  var FRAME_NOISE_PATTERNS = ["node_modules/", "vendor/", "site-packages/", ".venv/"];
18842
+ var KNOWN_DATABASE_MESSAGE_FAMILIES = [
18843
+ {
18844
+ summary: "PostgreSQL access rejected by pg_hba.conf",
18845
+ when: (message) => looksLikePostgresMessage(message) && message.includes("pg_hba.conf")
18846
+ },
18847
+ {
18848
+ summary: "PostgreSQL authentication failed",
18849
+ when: (message) => looksLikePostgresMessage(message) && (message.includes("password authentication failed") || message.includes("authentication failed for user"))
18850
+ },
18851
+ {
18852
+ summary: "PostgreSQL host resolution failed",
18853
+ when: (message) => looksLikePostgresMessage(message) && (message.includes("could not translate host name") || message.includes("getaddrinfo enotfound"))
18854
+ },
18855
+ {
18856
+ summary: "PostgreSQL connection timed out",
18857
+ when: (message) => looksLikePostgresMessage(message) && (message.includes("connection timed out") || message.includes("timeout expired") || message.includes("etimedout"))
18858
+ },
18859
+ {
18860
+ summary: "PostgreSQL connection limit reached",
18861
+ when: (message) => looksLikePostgresMessage(message) && (message.includes("too many connections") || message.includes("remaining connection slots are reserved"))
18862
+ },
18863
+ {
18864
+ summary: "PostgreSQL database does not exist",
18865
+ when: (message) => looksLikePostgresMessage(message) && message.includes("does not exist")
18866
+ },
18867
+ {
18868
+ summary: "PostgreSQL connection refused",
18869
+ when: (message) => looksLikePostgresMessage(message) && message.includes("connection refused")
18870
+ },
18871
+ {
18872
+ summary: "MySQL authentication failed",
18873
+ when: (message) => looksLikeMySqlMessage(message) && (message.includes("access denied for user") || message.includes("authentication failed"))
18874
+ },
18875
+ {
18876
+ summary: "MySQL connection refused",
18877
+ when: (message) => looksLikeMySqlMessage(message) && (message.includes("connection refused") || message.includes("can't connect to mysql server"))
18878
+ },
18879
+ {
18880
+ summary: "MySQL connection dropped",
18881
+ when: (message) => looksLikeMySqlMessage(message) && message.includes("server has gone away")
18882
+ },
18883
+ {
18884
+ summary: "MySQL connection limit reached",
18885
+ when: (message) => looksLikeMySqlMessage(message) && message.includes("too many connections")
18886
+ },
18887
+ {
18888
+ summary: "MySQL database does not exist",
18889
+ when: (message) => looksLikeMySqlMessage(message) && message.includes("unknown database")
18890
+ },
18891
+ {
18892
+ summary: "MongoDB authentication failed",
18893
+ when: (message) => looksLikeMongoMessage(message) && message.includes("authentication failed")
18894
+ },
18895
+ {
18896
+ summary: "MongoDB host resolution failed",
18897
+ when: (message) => looksLikeMongoMessage(message) && (message.includes("getaddrinfo enotfound") || message.includes("ename not found"))
18898
+ },
18899
+ {
18900
+ summary: "MongoDB connection timed out",
18901
+ when: (message) => looksLikeMongoMessage(message) && (message.includes("connection timed out") || message.includes("etimedout") || message.includes("server selection timed out"))
18902
+ },
18903
+ {
18904
+ summary: "MongoDB connection refused",
18905
+ when: (message) => looksLikeMongoMessage(message) && message.includes("connection refused")
18906
+ },
18907
+ {
18908
+ summary: "Redis authentication failed",
18909
+ when: (message) => looksLikeRedisMessage(message) && message.includes("wrongpass")
18910
+ },
18911
+ {
18912
+ summary: "Redis replica is read-only",
18913
+ when: (message) => looksLikeRedisMessage(message) && message.includes("readonly")
18914
+ },
18915
+ {
18916
+ summary: "Redis host resolution failed",
18917
+ when: (message) => looksLikeRedisMessage(message) && (message.includes("getaddrinfo enotfound") || message.includes("ename not found"))
18918
+ },
18919
+ {
18920
+ summary: "Redis connection timed out",
18921
+ when: (message) => looksLikeRedisMessage(message) && (message.includes("connection timed out") || message.includes("etimedout") || message.includes("timeout"))
18922
+ },
18923
+ {
18924
+ summary: "Redis connection refused",
18925
+ when: (message) => looksLikeRedisMessage(message) && message.includes("connection refused")
18926
+ }
18927
+ ];
18928
+ function looksLikePostgresMessage(message) {
18929
+ return message.includes("postgres") || message.includes("pgsql") || message.includes("pg_hba.conf") || message.includes("connection to server at");
18930
+ }
18931
+ function looksLikeMySqlMessage(message) {
18932
+ return message.includes("mysql") || message.includes("mariadb");
18933
+ }
18934
+ function looksLikeMongoMessage(message) {
18935
+ return message.includes("mongodb") || message.includes("mongoserver") || message.includes("mongo");
18936
+ }
18937
+ function looksLikeRedisMessage(message) {
18938
+ return message.includes("redis");
18939
+ }
18940
+ function normalizeScalarTokens(message) {
18941
+ return message.replace(UUID_PATTERN, "{dynamic}").replace(EMAIL_PATTERN, "{dynamic}").replace(ISO_TIMESTAMP_PATTERN, "{dynamic}").replace(IPV4_PATTERN, "{dynamic}").replace(HEX_PATTERN, "{dynamic}").replace(BARE_HEX_PATTERN, "{dynamic}").replace(LONG_ALPHANUMERIC_TOKEN_PATTERN, "{dynamic}").replace(LARGE_NUMBER_PATTERN, "{dynamic}");
18942
+ }
18943
+ function collapseWhitespace(message) {
18944
+ return message.replace(/\s+/g, " ").trim();
18945
+ }
18946
+ function normalizeKnownDatabaseMessage(message) {
18947
+ const lowerMessage = message.toLowerCase();
18948
+ for (const family of KNOWN_DATABASE_MESSAGE_FAMILIES) {
18949
+ if (family.when(lowerMessage)) {
18950
+ return family.summary;
18951
+ }
18952
+ }
18953
+ return null;
18954
+ }
18830
18955
  function normalizeMessage(message) {
18831
- return message.replace(UUID_PATTERN, "{dynamic}").replace(EMAIL_PATTERN, "{dynamic}").replace(ISO_TIMESTAMP_PATTERN, "{dynamic}").replace(IPV4_PATTERN, "{dynamic}").replace(HEX_PATTERN, "{dynamic}").replace(BARE_HEX_PATTERN, "{dynamic}").replace(LARGE_NUMBER_PATTERN, "{dynamic}");
18956
+ const knownDatabaseMessage = normalizeKnownDatabaseMessage(message);
18957
+ if (knownDatabaseMessage !== null) {
18958
+ return knownDatabaseMessage;
18959
+ }
18960
+ return collapseWhitespace(normalizeScalarTokens(message));
18832
18961
  }
18833
18962
  function normalizeRoute(path) {
18834
18963
  if (path === null || path.length === 0) {
@@ -25177,6 +25306,16 @@ function createMemberMcpTools(api) {
25177
25306
  } catch (error) {
25178
25307
  mapMcpError9(error);
25179
25308
  }
25309
+ },
25310
+ async leave_project(input) {
25311
+ try {
25312
+ return await api.leaveProject({
25313
+ bearerToken: String(input["bearerToken"]),
25314
+ projectId: String(input["projectId"])
25315
+ });
25316
+ } catch (error) {
25317
+ mapMcpError9(error);
25318
+ }
25180
25319
  }
25181
25320
  };
25182
25321
  }
@@ -27759,7 +27898,7 @@ var zodToJsonSchema = (schema, options) => {
27759
27898
  var package_default = {
27760
27899
  name: "@debugbundle/mcp",
27761
27900
  mcpName: "com.debugbundle/mcp",
27762
- version: "1.0.0",
27901
+ version: "1.0.1",
27763
27902
  private: false,
27764
27903
  description: "Model Context Protocol server for DebugBundle",
27765
27904
  license: "AGPL-3.0-only",
@@ -28654,6 +28793,15 @@ var MCP_TOOL_CATALOG = [
28654
28793
  userId: external_exports.string()
28655
28794
  })
28656
28795
  },
28796
+ {
28797
+ name: "leave_project",
28798
+ group: "members",
28799
+ description: "Leave a shared project as the authenticated collaborator.",
28800
+ inputSchema: external_exports.object({
28801
+ bearerToken: external_exports.string(),
28802
+ projectId: external_exports.string()
28803
+ })
28804
+ },
28657
28805
  {
28658
28806
  name: "list_services",
28659
28807
  group: "services",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@debugbundle/mcp",
3
3
  "mcpName": "com.debugbundle/mcp",
4
- "version": "1.0.0",
4
+ "version": "1.0.1",
5
5
  "private": false,
6
6
  "description": "Model Context Protocol server for DebugBundle",
7
7
  "license": "AGPL-3.0-only",
package/server.json CHANGED
@@ -8,13 +8,13 @@
8
8
  "source": "github",
9
9
  "subfolder": "apps/mcp"
10
10
  },
11
- "version": "1.0.0",
11
+ "version": "1.0.1",
12
12
  "packages": [
13
13
  {
14
14
  "registryType": "npm",
15
15
  "registryBaseUrl": "https://registry.npmjs.org",
16
16
  "identifier": "@debugbundle/mcp",
17
- "version": "1.0.0",
17
+ "version": "1.0.1",
18
18
  "transport": {
19
19
  "type": "stdio"
20
20
  },