@daghis/teamcity-mcp 2.3.0 → 2.3.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/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.3.1](https://github.com/Daghis/teamcity-mcp/compare/teamcity-mcp-v2.3.0...teamcity-mcp-v2.3.1) (2026-03-10)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * use toBuildLocator() for all build URL templates in api-client ([#416](https://github.com/Daghis/teamcity-mcp/issues/416)) ([2a10312](https://github.com/Daghis/teamcity-mcp/commit/2a10312e1469ed9d7c9b9e47caaddaac693df400))
9
+
3
10
  ## [2.3.0](https://github.com/Daghis/teamcity-mcp/compare/teamcity-mcp-v2.2.3...teamcity-mcp-v2.3.0) (2026-03-10)
4
11
 
5
12
 
package/dist/index.js CHANGED
@@ -1205,7 +1205,7 @@ function debug2(message, meta) {
1205
1205
  // package.json
1206
1206
  var package_default = {
1207
1207
  name: "@daghis/teamcity-mcp",
1208
- version: "2.3.0",
1208
+ version: "2.3.1",
1209
1209
  description: "Model Control Protocol server for TeamCity CI/CD integration with AI coding assistants",
1210
1210
  mcpName: "io.github.Daghis/teamcity",
1211
1211
  main: "dist/index.js",
@@ -1214,7 +1214,7 @@ var package_default = {
1214
1214
  "teamcity-mcp": "dist/index.js"
1215
1215
  },
1216
1216
  engines: {
1217
- node: ">=20.10.0"
1217
+ node: ">=20.19.0"
1218
1218
  },
1219
1219
  scripts: {
1220
1220
  dev: "node ./node_modules/tsx/dist/cli.mjs watch src/index.ts",
@@ -1280,18 +1280,18 @@ var package_default = {
1280
1280
  devDependencies: {
1281
1281
  "@codecov/bundler-plugin-core": "^1.9.1",
1282
1282
  "@esbuild-plugins/tsconfig-paths": "^0.1.2",
1283
+ "@eslint/js": "^10.0.1",
1283
1284
  "@trivago/prettier-plugin-sort-imports": "^6.0.1",
1284
1285
  "@types/jest": "^30.0.0",
1285
1286
  "@types/js-yaml": "^4.0.9",
1286
1287
  "@types/node": "^25.0.2",
1287
- "@typescript-eslint/eslint-plugin": "^8.51.0",
1288
- "@typescript-eslint/parser": "^8.51.0",
1288
+ "@typescript-eslint/eslint-plugin": "^8.57.0",
1289
+ "@typescript-eslint/parser": "^8.57.0",
1289
1290
  esbuild: "^0.27.0",
1290
- eslint: "^9.39.1",
1291
+ eslint: "^10.0.3",
1291
1292
  "eslint-config-prettier": "^10.1.8",
1292
- "eslint-import-resolver-typescript": "^4.4.4",
1293
- "eslint-plugin-import": "^2.32.0",
1294
1293
  "eslint-plugin-prettier": "^5.0.1",
1294
+ globals: "^17.4.0",
1295
1295
  jest: "^30.1.3",
1296
1296
  "jest-junit": "^16.0.0",
1297
1297
  "js-yaml": "^4.1.1",
@@ -1562,13 +1562,13 @@ var ArtifactManager = class _ArtifactManager {
1562
1562
  } catch (error3) {
1563
1563
  const err = error3;
1564
1564
  if (err.response?.status === 401) {
1565
- throw new Error("Authentication failed: Invalid TeamCity token");
1565
+ throw new Error("Authentication failed: Invalid TeamCity token", { cause: error3 });
1566
1566
  }
1567
1567
  if (err.response?.status === 404) {
1568
- throw new Error(`Build not found: ${buildId}`);
1568
+ throw new Error(`Build not found: ${buildId}`, { cause: error3 });
1569
1569
  }
1570
1570
  const errMsg = err.message ?? String(error3);
1571
- throw new Error(`Failed to fetch artifacts: ${errMsg}`);
1571
+ throw new Error(`Failed to fetch artifacts: ${errMsg}`, { cause: error3 });
1572
1572
  }
1573
1573
  }
1574
1574
  /**
@@ -1708,7 +1708,7 @@ var ArtifactManager = class _ArtifactManager {
1708
1708
  } else {
1709
1709
  errMsg = error3 instanceof Error ? error3.message : "Unknown error";
1710
1710
  }
1711
- throw new Error(`Failed to download artifact: ${errMsg}`);
1711
+ throw new Error(`Failed to download artifact: ${errMsg}`, { cause: error3 });
1712
1712
  }
1713
1713
  }
1714
1714
  /**
@@ -2033,7 +2033,7 @@ var BuildConfigurationCloneManager = class {
2033
2033
  return null;
2034
2034
  }
2035
2035
  if (axiosError.response?.status === 403) {
2036
- throw new Error("Permission denied: No access to source configuration");
2036
+ throw new Error("Permission denied: No access to source configuration", { cause: err });
2037
2037
  }
2038
2038
  throw err;
2039
2039
  }
@@ -2107,7 +2107,7 @@ var BuildConfigurationCloneManager = class {
2107
2107
  return { id: newId, name: newName };
2108
2108
  } catch (err) {
2109
2109
  error2("Failed to clone VCS root", err);
2110
- throw new Error(`Failed to clone VCS root: ${err.message}`);
2110
+ throw new Error(`Failed to clone VCS root: ${err.message}`, { cause: err });
2111
2111
  }
2112
2112
  }
2113
2113
  /**
@@ -2237,14 +2237,14 @@ var BuildConfigurationCloneManager = class {
2237
2237
  } catch (err) {
2238
2238
  const error3 = err;
2239
2239
  if (error3.response?.status === 409) {
2240
- throw new Error(`Build configuration already exists with ID: ${configId}`);
2240
+ throw new Error(`Build configuration already exists with ID: ${configId}`, { cause: err });
2241
2241
  }
2242
2242
  if (error3.response?.status === 403) {
2243
- throw new Error("Permission denied: You need project edit permissions");
2243
+ throw new Error("Permission denied: You need project edit permissions", { cause: err });
2244
2244
  }
2245
2245
  if (error3.response?.status === 400) {
2246
2246
  const message = error3.response?.data?.message ?? "Invalid configuration";
2247
- throw new Error(`Invalid configuration: ${message}`);
2247
+ throw new Error(`Invalid configuration: ${message}`, { cause: err });
2248
2248
  }
2249
2249
  error2(
2250
2250
  "Failed to clone build configuration",
@@ -2429,7 +2429,7 @@ var BuildConfigurationUpdateManager = class {
2429
2429
  return null;
2430
2430
  }
2431
2431
  if (err != null && typeof err === "object" && "response" in err && err.response?.status === 403) {
2432
- throw new Error("Permission denied: No access to build configuration");
2432
+ throw new Error("Permission denied: No access to build configuration", { cause: err });
2433
2433
  }
2434
2434
  throw err;
2435
2435
  }
@@ -2622,17 +2622,17 @@ var BuildConfigurationUpdateManager = class {
2622
2622
  } catch (err) {
2623
2623
  const error3 = err;
2624
2624
  if (error3.response?.status === 409) {
2625
- throw new Error("Configuration was modified by another user");
2625
+ throw new Error("Configuration was modified by another user", { cause: err });
2626
2626
  }
2627
2627
  if (error3.response?.status === 403) {
2628
- throw new Error("Permission denied: You need project edit permissions");
2628
+ throw new Error("Permission denied: You need project edit permissions", { cause: err });
2629
2629
  }
2630
2630
  if (error3.response?.status === 400) {
2631
2631
  const message = error3.response?.data?.message ?? "Invalid configuration";
2632
- throw new Error(`Invalid update: ${message}`);
2632
+ throw new Error(`Invalid update: ${message}`, { cause: err });
2633
2633
  }
2634
2634
  error2("Failed to apply updates", error3);
2635
- throw new Error("Partial update failure");
2635
+ throw new Error("Partial update failure", { cause: err });
2636
2636
  }
2637
2637
  }
2638
2638
  /**
@@ -2735,7 +2735,7 @@ var BuildConfigurationUpdateManager = class {
2735
2735
  info2("Rollback completed successfully", { configId });
2736
2736
  } catch (err) {
2737
2737
  error2("Failed to rollback changes", err);
2738
- throw new Error("Rollback failed: Manual intervention may be required");
2738
+ throw new Error("Rollback failed: Manual intervention may be required", { cause: err });
2739
2739
  }
2740
2740
  }
2741
2741
  /**
@@ -38652,12 +38652,15 @@ var TeamCityAPI = class _TeamCityAPI {
38652
38652
  });
38653
38653
  return response.data;
38654
38654
  } catch (primaryError) {
38655
- const response = await this.axiosInstance.get(`/app/rest/builds/id:${buildId}/log`, {
38656
- params: { plain: true },
38657
- headers: { Accept: "text/plain" },
38658
- responseType: "text",
38659
- transformResponse: [(data) => data]
38660
- });
38655
+ const response = await this.axiosInstance.get(
38656
+ `/app/rest/builds/${toBuildLocator(buildId)}/log`,
38657
+ {
38658
+ params: { plain: true },
38659
+ headers: { Accept: "text/plain" },
38660
+ responseType: "text",
38661
+ transformResponse: [(data) => data]
38662
+ }
38663
+ );
38661
38664
  return response.data;
38662
38665
  }
38663
38666
  }
@@ -38669,16 +38672,19 @@ var TeamCityAPI = class _TeamCityAPI {
38669
38672
  const startLine = options?.startLine ?? 0;
38670
38673
  const lineCount = options?.lineCount ?? 500;
38671
38674
  try {
38672
- const response = await this.axiosInstance.get(`/app/rest/builds/id:${buildId}/log`, {
38673
- params: {
38674
- plain: true,
38675
- start: startLine,
38676
- count: lineCount
38677
- },
38678
- headers: { Accept: "text/plain" },
38679
- responseType: "text",
38680
- transformResponse: [(data) => data]
38681
- });
38675
+ const response = await this.axiosInstance.get(
38676
+ `/app/rest/builds/${toBuildLocator(buildId)}/log`,
38677
+ {
38678
+ params: {
38679
+ plain: true,
38680
+ start: startLine,
38681
+ count: lineCount
38682
+ },
38683
+ headers: { Accept: "text/plain" },
38684
+ responseType: "text",
38685
+ transformResponse: [(data) => data]
38686
+ }
38687
+ );
38682
38688
  const text = response.data ?? "";
38683
38689
  const lines = text.replace(/\r\n/g, "\n").replace(/\r/g, "\n").split("\n");
38684
38690
  if (lines.length > 0 && lines[lines.length - 1] === "") lines.pop();
@@ -38712,7 +38718,9 @@ var TeamCityAPI = class _TeamCityAPI {
38712
38718
  return response.data;
38713
38719
  }
38714
38720
  async listTestFailures(buildId) {
38715
- const response = await this.tests.getAllTestOccurrences(`build:(id:${buildId}),status:FAILURE`);
38721
+ const response = await this.tests.getAllTestOccurrences(
38722
+ `build:(${toBuildLocator(buildId)}),status:FAILURE`
38723
+ );
38716
38724
  return response.data;
38717
38725
  }
38718
38726
  async listBuildArtifacts(buildId, options) {
@@ -38732,7 +38740,7 @@ var TeamCityAPI = class _TeamCityAPI {
38732
38740
  responseType: options?.responseType ?? "arraybuffer"
38733
38741
  };
38734
38742
  return this.axiosInstance.get(
38735
- `/app/rest/builds/id:${buildId}/artifacts/content/${normalizedPath}`,
38743
+ `/app/rest/builds/${toBuildLocator(buildId)}/artifacts/content/${normalizedPath}`,
38736
38744
  requestOptions
38737
38745
  );
38738
38746
  }
@@ -38754,13 +38762,16 @@ var TeamCityAPI = class _TeamCityAPI {
38754
38762
  responseType: options?.responseType ?? "text",
38755
38763
  transformResponse: options?.transformResponse ?? [(data) => data]
38756
38764
  };
38757
- return this.axiosInstance.get(`/app/rest/builds/id:${buildId}/log`, requestOptions);
38765
+ return this.axiosInstance.get(
38766
+ `/app/rest/builds/${toBuildLocator(buildId)}/log`,
38767
+ requestOptions
38768
+ );
38758
38769
  }
38759
38770
  async getBuildStatistics(buildId, fields) {
38760
38771
  return this.builds.getBuildStatisticValues(toBuildLocator(buildId), fields);
38761
38772
  }
38762
38773
  async listChangesForBuild(buildId, fields) {
38763
- return this.changes.getAllChanges(`build:(id:${buildId})`, fields);
38774
+ return this.changes.getAllChanges(`build:(${toBuildLocator(buildId)})`, fields);
38764
38775
  }
38765
38776
  async listSnapshotDependencies(buildId) {
38766
38777
  const response = await this.builds.getBuild(toBuildLocator(buildId), "snapshot-dependencies");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@daghis/teamcity-mcp",
3
- "version": "2.3.0",
3
+ "version": "2.3.1",
4
4
  "description": "Model Control Protocol server for TeamCity CI/CD integration with AI coding assistants",
5
5
  "mcpName": "io.github.Daghis/teamcity",
6
6
  "main": "dist/index.js",
@@ -9,7 +9,7 @@
9
9
  "teamcity-mcp": "dist/index.js"
10
10
  },
11
11
  "engines": {
12
- "node": ">=20.10.0"
12
+ "node": ">=20.19.0"
13
13
  },
14
14
  "scripts": {
15
15
  "dev": "node ./node_modules/tsx/dist/cli.mjs watch src/index.ts",
@@ -75,18 +75,18 @@
75
75
  "devDependencies": {
76
76
  "@codecov/bundler-plugin-core": "^1.9.1",
77
77
  "@esbuild-plugins/tsconfig-paths": "^0.1.2",
78
+ "@eslint/js": "^10.0.1",
78
79
  "@trivago/prettier-plugin-sort-imports": "^6.0.1",
79
80
  "@types/jest": "^30.0.0",
80
81
  "@types/js-yaml": "^4.0.9",
81
82
  "@types/node": "^25.0.2",
82
- "@typescript-eslint/eslint-plugin": "^8.51.0",
83
- "@typescript-eslint/parser": "^8.51.0",
83
+ "@typescript-eslint/eslint-plugin": "^8.57.0",
84
+ "@typescript-eslint/parser": "^8.57.0",
84
85
  "esbuild": "^0.27.0",
85
- "eslint": "^9.39.1",
86
+ "eslint": "^10.0.3",
86
87
  "eslint-config-prettier": "^10.1.8",
87
- "eslint-import-resolver-typescript": "^4.4.4",
88
- "eslint-plugin-import": "^2.32.0",
89
88
  "eslint-plugin-prettier": "^5.0.1",
89
+ "globals": "^17.4.0",
90
90
  "jest": "^30.1.3",
91
91
  "jest-junit": "^16.0.0",
92
92
  "js-yaml": "^4.1.1",
package/server.json CHANGED
@@ -7,13 +7,13 @@
7
7
  "source": "github"
8
8
  },
9
9
  "websiteUrl": "https://github.com/Daghis/teamcity-mcp",
10
- "version": "2.3.0",
10
+ "version": "2.3.1",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "registryBaseUrl": "https://registry.npmjs.org",
15
15
  "identifier": "@daghis/teamcity-mcp",
16
- "version": "2.3.0",
16
+ "version": "2.3.1",
17
17
  "runtimeHint": "npx",
18
18
  "runtimeArguments": [
19
19
  {