@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.
- package/.github/workflows/publish.yml +20 -0
- package/CHANGELOG.md +7 -0
- package/dist/index.js +87 -90
- package/dist/index.js.map +4 -4
- package/dist/src/middleware/global-error-handler.d.ts.map +1 -1
- package/dist/src/teamcity/auth.d.ts.map +1 -1
- package/dist/src/tools.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/middleware/global-error-handler.ts +11 -0
- package/src/teamcity/auth.ts +11 -7
- package/src/tools.ts +20 -6
- package/.commitlintrc.js +0 -24
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-error-handler.d.ts","sourceRoot":"","sources":["../../../src/middleware/global-error-handler.ts"],"names":[],"mappings":"
|
|
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;
|
|
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"}
|
package/dist/src/tools.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
@@ -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
|
package/src/teamcity/auth.ts
CHANGED
|
@@ -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
|
-
|
|
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:
|
|
152
|
-
code:
|
|
153
|
-
message: sanitize(
|
|
154
|
-
statusCode:
|
|
155
|
-
details: sanitize(
|
|
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(
|
|
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
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
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
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
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
|
-
};
|