@daghis/teamcity-mcp 2.4.2 → 2.5.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/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.5.0](https://github.com/Daghis/teamcity-mcp/compare/teamcity-mcp-v2.4.3...teamcity-mcp-v2.5.0) (2026-03-18)
4
+
5
+
6
+ ### Features
7
+
8
+ * add wait_for_build tool to poll until build completes ([#430](https://github.com/Daghis/teamcity-mcp/issues/430)) ([#433](https://github.com/Daghis/teamcity-mcp/issues/433)) ([a83e6cf](https://github.com/Daghis/teamcity-mcp/commit/a83e6cf99e4c523103bf894ee3d58c91734853f6))
9
+
10
+ ## [2.4.3](https://github.com/Daghis/teamcity-mcp/compare/teamcity-mcp-v2.4.2...teamcity-mcp-v2.4.3) (2026-03-18)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * use individual property PUTs in update_vcs_root_properties to prevent wiping existing properties ([#431](https://github.com/Daghis/teamcity-mcp/issues/431)) ([85bac24](https://github.com/Daghis/teamcity-mcp/commit/85bac244cb55f458bc2d22844c993d7f0446ea57)), closes [#428](https://github.com/Daghis/teamcity-mcp/issues/428)
16
+ * use z.coerce.number() to accept string-encoded numeric params ([#432](https://github.com/Daghis/teamcity-mcp/issues/432)) ([6de9aa4](https://github.com/Daghis/teamcity-mcp/commit/6de9aa4c9b11e9c78a261c57381fc44e5f3ffd7b)), closes [#429](https://github.com/Daghis/teamcity-mcp/issues/429)
17
+
3
18
  ## [2.4.2](https://github.com/Daghis/teamcity-mcp/compare/teamcity-mcp-v2.4.1...teamcity-mcp-v2.4.2) (2026-03-17)
4
19
 
5
20
 
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.4.2",
1208
+ version: "2.5.0",
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",
@@ -4140,6 +4140,11 @@ async function fetchAllPages(fetchFn, options = {}) {
4140
4140
  return allItems;
4141
4141
  }
4142
4142
 
4143
+ // src/utils/async/index.ts
4144
+ function sleep(ms) {
4145
+ return new Promise((resolve2) => setTimeout(resolve2, ms));
4146
+ }
4147
+
4143
4148
  // src/utils/list-builds-locator.ts
4144
4149
  var SIMPLE_BRANCH_VALUES = /* @__PURE__ */ new Set([
4145
4150
  "default:true",
@@ -38770,7 +38775,7 @@ var isReadableStream = (value) => typeof value === "object" && value !== null &&
38770
38775
  var isAxios4042 = (error3) => (0, import_axios36.isAxiosError)(error3) && error3.response?.status === 404;
38771
38776
  var buildIdentifierSchema = import_zod4.z.object({
38772
38777
  buildId: import_zod4.z.string().min(1).optional(),
38773
- buildNumber: import_zod4.z.union([import_zod4.z.string().min(1), import_zod4.z.number().int()]).optional(),
38778
+ buildNumber: import_zod4.z.union([import_zod4.z.string().min(1), import_zod4.z.coerce.number().int()]).optional(),
38774
38779
  buildTypeId: import_zod4.z.string().min(1).optional()
38775
38780
  }).superRefine((value, ctx) => {
38776
38781
  if (!value.buildId && value.buildNumber === void 0) {
@@ -39142,8 +39147,8 @@ var DEV_TOOLS = [
39142
39147
  const schema = import_zod4.z.object({
39143
39148
  locator: import_zod4.z.string().min(1).optional(),
39144
39149
  parentProjectId: import_zod4.z.string().min(1).optional(),
39145
- pageSize: import_zod4.z.number().int().min(1).max(1e3).optional(),
39146
- maxPages: import_zod4.z.number().int().min(1).max(1e3).optional(),
39150
+ pageSize: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
39151
+ maxPages: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
39147
39152
  all: import_zod4.z.boolean().optional(),
39148
39153
  fields: import_zod4.z.string().min(1).optional()
39149
39154
  });
@@ -39245,9 +39250,9 @@ var DEV_TOOLS = [
39245
39250
  buildTypeId: import_zod4.z.string().min(1).optional(),
39246
39251
  branch: import_zod4.z.string().min(1).optional(),
39247
39252
  status: import_zod4.z.enum(["SUCCESS", "FAILURE", "ERROR"]).optional(),
39248
- count: import_zod4.z.number().int().min(1).max(1e3).default(10).optional(),
39249
- pageSize: import_zod4.z.number().int().min(1).max(1e3).optional(),
39250
- maxPages: import_zod4.z.number().int().min(1).max(1e3).optional(),
39253
+ count: import_zod4.z.coerce.number().int().min(1).max(1e3).default(10).optional(),
39254
+ pageSize: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
39255
+ maxPages: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
39251
39256
  all: import_zod4.z.boolean().optional(),
39252
39257
  fields: import_zod4.z.string().min(1).optional()
39253
39258
  });
@@ -39622,6 +39627,95 @@ var DEV_TOOLS = [
39622
39627
  );
39623
39628
  }
39624
39629
  },
39630
+ {
39631
+ name: "wait_for_build",
39632
+ description: "Wait for a build to complete by polling until it reaches a terminal state (finished, canceled, failed) or timeout",
39633
+ inputSchema: {
39634
+ type: "object",
39635
+ properties: {
39636
+ buildId: { type: "string", description: "Build ID to wait for" },
39637
+ buildNumber: {
39638
+ type: "string",
39639
+ description: "Human build number (requires buildTypeId)"
39640
+ },
39641
+ buildTypeId: {
39642
+ type: "string",
39643
+ description: "Build configuration ID (required with buildNumber)"
39644
+ },
39645
+ timeout: {
39646
+ type: "number",
39647
+ description: "Max seconds to wait (default 600, max 3600)"
39648
+ },
39649
+ pollInterval: {
39650
+ type: "number",
39651
+ description: "Seconds between polls (default 15, min 5)"
39652
+ },
39653
+ includeTests: { type: "boolean", description: "Include test summary in result" },
39654
+ includeProblems: { type: "boolean", description: "Include build problems in result" }
39655
+ }
39656
+ },
39657
+ handler: async (args) => {
39658
+ const schema = import_zod4.z.object({
39659
+ buildId: import_zod4.z.string().min(1).optional(),
39660
+ buildNumber: import_zod4.z.string().min(1).optional(),
39661
+ buildTypeId: import_zod4.z.string().min(1).optional(),
39662
+ timeout: import_zod4.z.coerce.number().int().min(1).max(3600).default(600),
39663
+ pollInterval: import_zod4.z.coerce.number().int().min(5).max(300).default(15),
39664
+ includeTests: import_zod4.z.boolean().optional(),
39665
+ includeProblems: import_zod4.z.boolean().optional()
39666
+ }).superRefine((value, ctx) => {
39667
+ if (!value.buildId && !value.buildNumber) {
39668
+ ctx.addIssue({
39669
+ code: import_zod4.z.ZodIssueCode.custom,
39670
+ path: ["buildId"],
39671
+ message: "Either buildId or buildNumber must be provided"
39672
+ });
39673
+ }
39674
+ if (value.buildNumber && !value.buildTypeId) {
39675
+ ctx.addIssue({
39676
+ code: import_zod4.z.ZodIssueCode.custom,
39677
+ path: ["buildTypeId"],
39678
+ message: "buildTypeId is required when querying by buildNumber"
39679
+ });
39680
+ }
39681
+ });
39682
+ return runTool(
39683
+ "wait_for_build",
39684
+ schema,
39685
+ async (typed) => {
39686
+ const adapter = createAdapterFromTeamCityAPI(TeamCityAPI.getInstance());
39687
+ const statusManager = new (await Promise.resolve().then(() => (init_build_status_manager(), build_status_manager_exports))).BuildStatusManager(adapter);
39688
+ const deadline = Date.now() + typed.timeout * 1e3;
39689
+ const terminalStates = /* @__PURE__ */ new Set(["finished", "canceled", "failed"]);
39690
+ let pollCount = 0;
39691
+ const startTime = Date.now();
39692
+ while (true) {
39693
+ pollCount++;
39694
+ const result = await statusManager.getBuildStatus({
39695
+ buildId: typed.buildId,
39696
+ buildNumber: typed.buildNumber,
39697
+ buildTypeId: typed.buildTypeId,
39698
+ includeTests: typed.includeTests,
39699
+ includeProblems: typed.includeProblems,
39700
+ forceRefresh: true
39701
+ });
39702
+ const waitSeconds = Math.round((Date.now() - startTime) / 1e3);
39703
+ debug2(
39704
+ `wait_for_build poll #${pollCount}: state=${result.state} (${waitSeconds}s elapsed)`
39705
+ );
39706
+ if (terminalStates.has(result.state)) {
39707
+ return json({ ...result, pollCount, waitSeconds });
39708
+ }
39709
+ if (Date.now() >= deadline) {
39710
+ return json({ ...result, timedOut: true, pollCount, waitSeconds });
39711
+ }
39712
+ await sleep(typed.pollInterval * 1e3);
39713
+ }
39714
+ },
39715
+ args
39716
+ );
39717
+ }
39718
+ },
39625
39719
  {
39626
39720
  name: "fetch_build_log",
39627
39721
  description: "Fetch build log with pagination (by lines)",
@@ -39658,12 +39752,12 @@ var DEV_TOOLS = [
39658
39752
  handler: async (args) => {
39659
39753
  const schema = import_zod4.z.object({
39660
39754
  buildId: import_zod4.z.string().min(1).optional(),
39661
- buildNumber: import_zod4.z.union([import_zod4.z.string().min(1), import_zod4.z.number().int().min(0)]).optional(),
39755
+ buildNumber: import_zod4.z.union([import_zod4.z.string().min(1), import_zod4.z.coerce.number().int().min(0)]).optional(),
39662
39756
  buildTypeId: import_zod4.z.string().min(1).optional(),
39663
- page: import_zod4.z.number().int().min(1).optional(),
39664
- pageSize: import_zod4.z.number().int().min(1).max(5e3).optional(),
39665
- startLine: import_zod4.z.number().int().min(0).optional(),
39666
- lineCount: import_zod4.z.number().int().min(1).max(5e3).optional(),
39757
+ page: import_zod4.z.coerce.number().int().min(1).optional(),
39758
+ pageSize: import_zod4.z.coerce.number().int().min(1).max(5e3).optional(),
39759
+ startLine: import_zod4.z.coerce.number().int().min(0).optional(),
39760
+ lineCount: import_zod4.z.coerce.number().int().min(1).max(5e3).optional(),
39667
39761
  tail: import_zod4.z.boolean().optional(),
39668
39762
  encoding: import_zod4.z.enum(["text", "stream"]).default("text"),
39669
39763
  outputPath: import_zod4.z.string().min(1).optional()
@@ -39897,8 +39991,8 @@ var DEV_TOOLS = [
39897
39991
  const schema = import_zod4.z.object({
39898
39992
  locator: import_zod4.z.string().min(1).optional(),
39899
39993
  projectId: import_zod4.z.string().min(1).optional(),
39900
- pageSize: import_zod4.z.number().int().min(1).max(1e3).optional(),
39901
- maxPages: import_zod4.z.number().int().min(1).max(1e3).optional(),
39994
+ pageSize: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
39995
+ maxPages: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
39902
39996
  all: import_zod4.z.boolean().optional(),
39903
39997
  fields: import_zod4.z.string().min(1).optional()
39904
39998
  });
@@ -39987,8 +40081,8 @@ var DEV_TOOLS = [
39987
40081
  handler: async (args) => {
39988
40082
  const schema = buildIdentifierSchema.and(
39989
40083
  import_zod4.z.object({
39990
- pageSize: import_zod4.z.number().int().min(1).max(1e3).optional(),
39991
- maxPages: import_zod4.z.number().int().min(1).max(1e3).optional(),
40084
+ pageSize: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
40085
+ maxPages: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
39992
40086
  all: import_zod4.z.boolean().optional(),
39993
40087
  fields: import_zod4.z.string().min(1).optional()
39994
40088
  })
@@ -40049,8 +40143,8 @@ var DEV_TOOLS = [
40049
40143
  handler: async (args) => {
40050
40144
  const schema = import_zod4.z.object({
40051
40145
  projectId: import_zod4.z.string().min(1).optional(),
40052
- pageSize: import_zod4.z.number().int().min(1).max(1e3).optional(),
40053
- maxPages: import_zod4.z.number().int().min(1).max(1e3).optional(),
40146
+ pageSize: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
40147
+ maxPages: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
40054
40148
  all: import_zod4.z.boolean().optional(),
40055
40149
  fields: import_zod4.z.string().min(1).optional()
40056
40150
  });
@@ -40246,11 +40340,12 @@ var DEV_TOOLS = [
40246
40340
  updated: 0
40247
40341
  });
40248
40342
  }
40249
- await adapter.modules.vcsRoots.setVcsRootProperties(
40250
- typed.id,
40251
- void 0,
40252
- { property: properties },
40253
- { headers: { "Content-Type": "application/json", Accept: "application/json" } }
40343
+ await Promise.all(
40344
+ properties.map(
40345
+ (p) => adapter.modules.vcsRoots.setVcsRootProperty(typed.id, p.name, p.value, {
40346
+ headers: { "Content-Type": "text/plain", Accept: "text/plain" }
40347
+ })
40348
+ )
40254
40349
  );
40255
40350
  return json({
40256
40351
  success: true,
@@ -40287,8 +40382,8 @@ var DEV_TOOLS = [
40287
40382
  handler: async (args) => {
40288
40383
  const schema = import_zod4.z.object({
40289
40384
  locator: import_zod4.z.string().min(1).optional(),
40290
- pageSize: import_zod4.z.number().int().min(1).max(1e3).optional(),
40291
- maxPages: import_zod4.z.number().int().min(1).max(1e3).optional(),
40385
+ pageSize: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
40386
+ maxPages: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
40292
40387
  all: import_zod4.z.boolean().optional(),
40293
40388
  fields: import_zod4.z.string().min(1).optional()
40294
40389
  });
@@ -40698,8 +40793,8 @@ var DEV_TOOLS = [
40698
40793
  handler: async (args) => {
40699
40794
  const schema = import_zod4.z.object({
40700
40795
  locator: import_zod4.z.string().min(1).optional(),
40701
- pageSize: import_zod4.z.number().int().min(1).max(1e3).optional(),
40702
- maxPages: import_zod4.z.number().int().min(1).max(1e3).optional(),
40796
+ pageSize: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
40797
+ maxPages: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
40703
40798
  all: import_zod4.z.boolean().optional(),
40704
40799
  fields: import_zod4.z.string().min(1).optional()
40705
40800
  });
@@ -40757,8 +40852,8 @@ var DEV_TOOLS = [
40757
40852
  },
40758
40853
  handler: async (args) => {
40759
40854
  const schema = import_zod4.z.object({
40760
- pageSize: import_zod4.z.number().int().min(1).max(1e3).optional(),
40761
- maxPages: import_zod4.z.number().int().min(1).max(1e3).optional(),
40855
+ pageSize: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
40856
+ maxPages: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
40762
40857
  all: import_zod4.z.boolean().optional(),
40763
40858
  fields: import_zod4.z.string().min(1).optional()
40764
40859
  });
@@ -40845,13 +40940,13 @@ var DEV_TOOLS = [
40845
40940
  const schema = import_zod4.z.object({
40846
40941
  buildId: import_zod4.z.string().min(1).optional(),
40847
40942
  buildTypeId: import_zod4.z.string().min(1).optional(),
40848
- buildNumber: import_zod4.z.union([import_zod4.z.string().min(1), import_zod4.z.number().int()]).optional(),
40943
+ buildNumber: import_zod4.z.union([import_zod4.z.string().min(1), import_zod4.z.coerce.number().int()]).optional(),
40849
40944
  includeArtifacts: import_zod4.z.boolean().optional(),
40850
40945
  includeStatistics: import_zod4.z.boolean().optional(),
40851
40946
  includeChanges: import_zod4.z.boolean().optional(),
40852
40947
  includeDependencies: import_zod4.z.boolean().optional(),
40853
40948
  artifactFilter: import_zod4.z.string().min(1).optional(),
40854
- maxArtifactSize: import_zod4.z.number().int().min(1).optional(),
40949
+ maxArtifactSize: import_zod4.z.coerce.number().int().min(1).optional(),
40855
40950
  artifactEncoding: import_zod4.z.enum(["base64", "stream"]).default("base64")
40856
40951
  }).superRefine((value, ctx) => {
40857
40952
  const hasBuildId = typeof value.buildId === "string" && value.buildId.trim().length > 0;
@@ -40949,7 +41044,7 @@ var DEV_TOOLS = [
40949
41044
  import_zod4.z.object({
40950
41045
  artifactPath: import_zod4.z.string().min(1),
40951
41046
  encoding: import_zod4.z.enum(["base64", "text", "stream"]).default("base64"),
40952
- maxSize: import_zod4.z.number().int().positive().optional(),
41047
+ maxSize: import_zod4.z.coerce.number().int().positive().optional(),
40953
41048
  outputPath: import_zod4.z.string().min(1).optional()
40954
41049
  })
40955
41050
  );
@@ -41036,7 +41131,7 @@ var DEV_TOOLS = [
41036
41131
  import_zod4.z.object({
41037
41132
  artifactPaths: import_zod4.z.array(artifactInputSchema).min(1),
41038
41133
  encoding: import_zod4.z.enum(["base64", "text", "stream"]).default("base64"),
41039
- maxSize: import_zod4.z.number().int().positive().optional(),
41134
+ maxSize: import_zod4.z.coerce.number().int().positive().optional(),
41040
41135
  outputDir: import_zod4.z.string().min(1).optional().refine((value) => value == null || (0, import_node_path.isAbsolute)(value), {
41041
41136
  message: "outputDir must be an absolute path"
41042
41137
  })
@@ -41227,8 +41322,8 @@ var DEV_TOOLS = [
41227
41322
  locator: import_zod4.z.string().min(1).optional(),
41228
41323
  projectId: import_zod4.z.string().min(1).optional(),
41229
41324
  buildId: import_zod4.z.string().min(1).optional(),
41230
- pageSize: import_zod4.z.number().int().min(1).max(1e3).optional(),
41231
- maxPages: import_zod4.z.number().int().min(1).max(1e3).optional(),
41325
+ pageSize: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
41326
+ maxPages: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
41232
41327
  all: import_zod4.z.boolean().optional(),
41233
41328
  fields: import_zod4.z.string().min(1).optional()
41234
41329
  });
@@ -41297,8 +41392,8 @@ var DEV_TOOLS = [
41297
41392
  locator: import_zod4.z.string().min(1).optional(),
41298
41393
  projectId: import_zod4.z.string().min(1).optional(),
41299
41394
  buildId: import_zod4.z.string().min(1).optional(),
41300
- pageSize: import_zod4.z.number().int().min(1).max(1e3).optional(),
41301
- maxPages: import_zod4.z.number().int().min(1).max(1e3).optional(),
41395
+ pageSize: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
41396
+ maxPages: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
41302
41397
  all: import_zod4.z.boolean().optional(),
41303
41398
  fields: import_zod4.z.string().min(1).optional()
41304
41399
  });
@@ -41373,8 +41468,8 @@ var DEV_TOOLS = [
41373
41468
  locator: import_zod4.z.string().min(1).optional(),
41374
41469
  buildId: import_zod4.z.string().min(1).optional(),
41375
41470
  problemId: import_zod4.z.string().min(1).optional(),
41376
- pageSize: import_zod4.z.number().int().min(1).max(1e3).optional(),
41377
- maxPages: import_zod4.z.number().int().min(1).max(1e3).optional(),
41471
+ pageSize: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
41472
+ maxPages: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
41378
41473
  all: import_zod4.z.boolean().optional(),
41379
41474
  fields: import_zod4.z.string().min(1).optional()
41380
41475
  });
@@ -41454,8 +41549,8 @@ var DEV_TOOLS = [
41454
41549
  projectId: import_zod4.z.string().min(1).optional(),
41455
41550
  buildTypeId: import_zod4.z.string().min(1).optional(),
41456
41551
  assigneeUsername: import_zod4.z.string().min(1).optional(),
41457
- pageSize: import_zod4.z.number().int().min(1).max(1e3).optional(),
41458
- maxPages: import_zod4.z.number().int().min(1).max(1e3).optional(),
41552
+ pageSize: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
41553
+ maxPages: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
41459
41554
  all: import_zod4.z.boolean().optional(),
41460
41555
  fields: import_zod4.z.string().min(1).optional()
41461
41556
  });
@@ -41531,8 +41626,8 @@ var DEV_TOOLS = [
41531
41626
  projectId: import_zod4.z.string().min(1).optional(),
41532
41627
  buildTypeId: import_zod4.z.string().min(1).optional(),
41533
41628
  testNameId: import_zod4.z.string().min(1).optional(),
41534
- pageSize: import_zod4.z.number().int().min(1).max(1e3).optional(),
41535
- maxPages: import_zod4.z.number().int().min(1).max(1e3).optional(),
41629
+ pageSize: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
41630
+ maxPages: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
41536
41631
  all: import_zod4.z.boolean().optional(),
41537
41632
  fields: import_zod4.z.string().min(1).optional()
41538
41633
  });
@@ -41638,8 +41733,8 @@ var DEV_TOOLS = [
41638
41733
  const schema = import_zod4.z.object({
41639
41734
  locator: import_zod4.z.string().min(1).optional(),
41640
41735
  groupId: import_zod4.z.string().min(1).optional(),
41641
- pageSize: import_zod4.z.number().int().min(1).max(1e3).optional(),
41642
- maxPages: import_zod4.z.number().int().min(1).max(1e3).optional(),
41736
+ pageSize: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
41737
+ maxPages: import_zod4.z.coerce.number().int().min(1).max(1e3).optional(),
41643
41738
  all: import_zod4.z.boolean().optional(),
41644
41739
  fields: import_zod4.z.string().min(1).optional()
41645
41740
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@daghis/teamcity-mcp",
3
- "version": "2.4.2",
3
+ "version": "2.5.0",
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",
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.4.2",
10
+ "version": "2.5.0",
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.4.2",
16
+ "version": "2.5.0",
17
17
  "runtimeHint": "npx",
18
18
  "runtimeArguments": [
19
19
  {