@daghis/teamcity-mcp 0.2.0 → 0.2.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.
@@ -1 +1 @@
1
- {"version":3,"file":"global-error-handler.d.ts","sourceRoot":"","sources":["../../../src/middleware/global-error-handler.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAe,MAAM,sBAAsB,CAAC;AAEjE,OAAO,EACL,aAAa,EAMd,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,yBAAyB;IACxC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAKD,qBAAa,kBAAkB;IAGjB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqB;gBAEf,OAAO,GAAE,yBAA8B;WAUtD,WAAW,CAAC,OAAO,CAAC,EAAE,yBAAyB,GAAG,kBAAkB;IAUlF,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,aAAa;IA0BxF,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,KAAK;IAuBtF,OAAO,CAAC,cAAc;IAuCtB,OAAO,CAAC,mBAAmB;IA4B3B,OAAO,CAAC,oBAAoB;IAgB5B,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;CAiB1C;AAGD,eAAO,MAAM,kBAAkB,oBAAmC,CAAC"}
1
+ {"version":3,"file":"global-error-handler.d.ts","sourceRoot":"","sources":["../../../src/middleware/global-error-handler.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAe,MAAM,sBAAsB,CAAC;AAEjE,OAAO,EACL,aAAa,EAMd,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,yBAAyB;IACxC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAKD,qBAAa,kBAAkB;IAGjB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqB;gBAEf,OAAO,GAAE,yBAA8B;WAUtD,WAAW,CAAC,OAAO,CAAC,EAAE,yBAAyB,GAAG,kBAAkB;IAUlF,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,aAAa;IA0BxF,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,KAAK;IAuBtF,OAAO,CAAC,cAAc;IAiDtB,OAAO,CAAC,mBAAmB;IA4B3B,OAAO,CAAC,oBAAoB;IAgB5B,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;CAiB1C;AAGD,eAAO,MAAM,kBAAkB,oBAAmC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/teamcity/auth.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,UAAU,EAEV,aAAa,EACb,0BAA0B,EAC3B,MAAM,OAAO,CAAC;AAQf,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAKD,wBAAgB,YAAY,CAAC,MAAM,EAAE,0BAA0B,GAAG,0BAA0B,CAyB3F;AAKD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,KAAK,CAAC;CACvB;AAKD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,oBAAoB,CAmC3E;AAKD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,aAAa,GAAG,aAAa,CAiBlE;AAKD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAgCtE;AAKD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAapD;AAKD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOtD;AAKD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAetF"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/teamcity/auth.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,UAAU,EAEV,aAAa,EACb,0BAA0B,EAC3B,MAAM,OAAO,CAAC;AASf,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAKD,wBAAgB,YAAY,CAAC,MAAM,EAAE,0BAA0B,GAAG,0BAA0B,CAyB3F;AAKD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,KAAK,CAAC;CACvB;AAKD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,oBAAoB,CAmC3E;AAKD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,aAAa,GAAG,aAAa,CAiBlE;AAKD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAmCtE;AAKD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAapD;AAKD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOtD;AAKD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAetF"}
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/tools.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAGD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IAClD,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CACvB;AA2ED,wBAAgB,UAAU,IAAI,KAAK,GAAG,MAAM,CAE3C;AAurFD,wBAAgB,iBAAiB,IAAI,cAAc,EAAE,CAUpD;AAKD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAGhE;AAMD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAO5D;AAKD,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAGvC"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/tools.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAGD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IAClD,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CACvB;AA2ED,wBAAgB,UAAU,IAAI,KAAK,GAAG,MAAM,CAE3C;AAqsFD,wBAAgB,iBAAiB,IAAI,cAAc,EAAE,CAUpD;AAKD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAGhE;AAMD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAO5D;AAKD,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAGvC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@daghis/teamcity-mcp",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Model Control Protocol server for TeamCity CI/CD integration with AI coding assistants",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import { AxiosError } from 'axios';
6
6
 
7
+ import { TeamCityAPIError } from '@/teamcity/errors';
7
8
  import { ErrorContext, errorLogger } from '@/utils/error-logger';
8
9
 
9
10
  import {
@@ -98,6 +99,16 @@ export class GlobalErrorHandler {
98
99
  * Transform raw errors into structured MCP errors
99
100
  */
100
101
  private transformError(error: unknown, context: ErrorContext): Error {
102
+ // Errors already normalized by our TeamCity client
103
+ if (error instanceof TeamCityAPIError) {
104
+ return new MCPTeamCityError(
105
+ this.sanitizeErrorMessage(error.message),
106
+ error.statusCode ?? 500,
107
+ error.code,
108
+ context.requestId
109
+ );
110
+ }
111
+
101
112
  // Already an MCP error
102
113
  if (error instanceof MCPToolError) {
103
114
  // Still sanitize the message if needed
@@ -9,6 +9,7 @@ import type {
9
9
  } from 'axios';
10
10
  import { randomUUID } from 'crypto';
11
11
 
12
+ import { TeamCityAPIError } from '@/teamcity/errors';
12
13
  import { info, error as logError } from '@/utils/logger';
13
14
 
14
15
  /**
@@ -126,7 +127,10 @@ export function logResponse(response: AxiosResponse): AxiosResponse {
126
127
  * Log error with request ID and transform
127
128
  */
128
129
  export function logAndTransformError(error: AxiosError): Promise<never> {
129
- const teamcityError = extractErrorDetails(error);
130
+ // Build a rich TeamCityAPIError instance so downstream handlers
131
+ // see an Error subclass (not a plain object)
132
+ const requestId = (error.config as AxiosRequestConfig & { requestId?: string })?.requestId;
133
+ const tcError = TeamCityAPIError.fromAxiosError(error, requestId);
130
134
  const meta = (error.config as unknown as { _tcMeta?: { start: number } })?._tcMeta;
131
135
  const duration = meta?.start ? Date.now() - meta.start : undefined;
132
136
 
@@ -148,15 +152,15 @@ export function logAndTransformError(error: AxiosError): Promise<never> {
148
152
  };
149
153
 
150
154
  logError('TeamCity API request failed', undefined, {
151
- requestId: teamcityError.requestId,
152
- code: teamcityError.code,
153
- message: sanitize(teamcityError.message) as string,
154
- statusCode: teamcityError.statusCode,
155
- details: sanitize(teamcityError.details),
155
+ requestId: tcError.requestId,
156
+ code: tcError.code,
157
+ message: sanitize(tcError.message) as string,
158
+ statusCode: tcError.statusCode,
159
+ details: sanitize(tcError.details),
156
160
  duration,
157
161
  });
158
162
 
159
- return Promise.reject(teamcityError);
163
+ return Promise.reject(tcError);
160
164
  }
161
165
 
162
166
  /**
package/src/tools.ts CHANGED
@@ -1014,9 +1014,16 @@ const DEV_TOOLS: ToolDefinition[] = [
1014
1014
  description: 'Fetch server metrics (CPU/memory/disk/load) if available',
1015
1015
  inputSchema: { type: 'object', properties: {} },
1016
1016
  handler: async (_args: unknown) => {
1017
- const api = TeamCityAPI.getInstance();
1018
- const metrics = await api.server.getAllMetrics();
1019
- return json(metrics.data);
1017
+ return runTool(
1018
+ 'get_server_metrics',
1019
+ null,
1020
+ async () => {
1021
+ const api = TeamCityAPI.getInstance();
1022
+ const metrics = await api.server.getAllMetrics();
1023
+ return json(metrics.data);
1024
+ },
1025
+ {}
1026
+ );
1020
1027
  },
1021
1028
  mode: 'full',
1022
1029
  },
@@ -1025,9 +1032,16 @@ const DEV_TOOLS: ToolDefinition[] = [
1025
1032
  description: 'Get TeamCity server info (version, build number, state)',
1026
1033
  inputSchema: { type: 'object', properties: {} },
1027
1034
  handler: async (_args: unknown) => {
1028
- const api = TeamCityAPI.getInstance();
1029
- const info = await api.server.getServerInfo();
1030
- return json(info.data);
1035
+ return runTool(
1036
+ 'get_server_info',
1037
+ null,
1038
+ async () => {
1039
+ const api = TeamCityAPI.getInstance();
1040
+ const info = await api.server.getServerInfo();
1041
+ return json(info.data);
1042
+ },
1043
+ {}
1044
+ );
1031
1045
  },
1032
1046
  },
1033
1047
  {
package/.commitlintrc.js DELETED
@@ -1,24 +0,0 @@
1
- module.exports = {
2
- extends: ['@commitlint/config-conventional'],
3
- // Allow Dependabot-style commit type `deps` (e.g., `deps(deps): bump ...`).
4
- rules: {
5
- 'type-enum': [
6
- 2,
7
- 'always',
8
- [
9
- 'build',
10
- 'chore',
11
- 'ci',
12
- 'docs',
13
- 'feat',
14
- 'fix',
15
- 'perf',
16
- 'refactor',
17
- 'revert',
18
- 'style',
19
- 'test',
20
- 'deps'
21
- ]
22
- ]
23
- }
24
- };