@mtaap/mcp 0.2.13 → 0.4.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/README.md +1 -1
- package/dist/cli.js +469 -260
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +19 -4
- package/dist/index.js +467 -258
- package/dist/index.js.map +1 -1
- package/dist/server.js +597 -269
- package/dist/server.js.map +1 -1
- package/package.json +2 -1
package/dist/cli.js
CHANGED
|
@@ -30,7 +30,7 @@ var import_stdio = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
|
30
30
|
// package.json
|
|
31
31
|
var package_default = {
|
|
32
32
|
name: "@mtaap/mcp",
|
|
33
|
-
version: "0.
|
|
33
|
+
version: "0.4.1",
|
|
34
34
|
description: "Model Context Protocol (MCP) server for AI agents to interact with Collab - the multi-tenant collaborative agent development platform",
|
|
35
35
|
mcpName: "collab",
|
|
36
36
|
scripts: {
|
|
@@ -39,6 +39,7 @@ var package_default = {
|
|
|
39
39
|
main: "./dist/index.js",
|
|
40
40
|
types: "./dist/index.d.ts",
|
|
41
41
|
bin: {
|
|
42
|
+
mcp: "./dist/cli.js",
|
|
42
43
|
"collab-mcp": "./dist/cli.js",
|
|
43
44
|
"collab-mcp-server": "./dist/server.js"
|
|
44
45
|
},
|
|
@@ -88,7 +89,7 @@ var package_default = {
|
|
|
88
89
|
var VERSION = package_default.version;
|
|
89
90
|
|
|
90
91
|
// src/index.ts
|
|
91
|
-
var
|
|
92
|
+
var import_zod4 = require("zod");
|
|
92
93
|
|
|
93
94
|
// ../../packages/core/dist/constants/enums.js
|
|
94
95
|
var TaskState;
|
|
@@ -175,12 +176,6 @@ var WebSocketEventType;
|
|
|
175
176
|
WebSocketEventType2["TASK_DELETED"] = "task.deleted";
|
|
176
177
|
WebSocketEventType2["MEMBER_JOINED"] = "member.joined";
|
|
177
178
|
})(WebSocketEventType || (WebSocketEventType = {}));
|
|
178
|
-
var AuthProvider;
|
|
179
|
-
(function(AuthProvider2) {
|
|
180
|
-
AuthProvider2["CREDENTIALS"] = "credentials";
|
|
181
|
-
AuthProvider2["LDAP"] = "ldap";
|
|
182
|
-
AuthProvider2["SSO"] = "sso";
|
|
183
|
-
})(AuthProvider || (AuthProvider = {}));
|
|
184
179
|
var SubscriptionStatus;
|
|
185
180
|
(function(SubscriptionStatus2) {
|
|
186
181
|
SubscriptionStatus2["ACTIVE"] = "ACTIVE";
|
|
@@ -196,6 +191,12 @@ var EventType;
|
|
|
196
191
|
EventType2["ACCESS"] = "ACCESS";
|
|
197
192
|
EventType2["MODIFICATION"] = "MODIFICATION";
|
|
198
193
|
})(EventType || (EventType = {}));
|
|
194
|
+
var CreatedVia;
|
|
195
|
+
(function(CreatedVia2) {
|
|
196
|
+
CreatedVia2["UI"] = "UI";
|
|
197
|
+
CreatedVia2["API_KEY"] = "API_KEY";
|
|
198
|
+
CreatedVia2["OAUTH"] = "OAUTH";
|
|
199
|
+
})(CreatedVia || (CreatedVia = {}));
|
|
199
200
|
|
|
200
201
|
// ../../packages/core/dist/constants/state-machine.js
|
|
201
202
|
var VALID_TRANSITIONS = {
|
|
@@ -219,6 +220,62 @@ var VALID_TRANSITIONS = {
|
|
|
219
220
|
[TaskState.DONE]: []
|
|
220
221
|
};
|
|
221
222
|
|
|
223
|
+
// ../../packages/core/dist/constants/oauth.js
|
|
224
|
+
var OAuthScopes = {
|
|
225
|
+
/** Read-only access to MCP resources */
|
|
226
|
+
READ: "mcp:read",
|
|
227
|
+
/** Read and write access to MCP resources */
|
|
228
|
+
WRITE: "mcp:write",
|
|
229
|
+
/** Full administrative access */
|
|
230
|
+
ADMIN: "mcp:admin"
|
|
231
|
+
};
|
|
232
|
+
var VALID_OAUTH_SCOPES = [
|
|
233
|
+
OAuthScopes.READ,
|
|
234
|
+
OAuthScopes.WRITE,
|
|
235
|
+
OAuthScopes.ADMIN
|
|
236
|
+
];
|
|
237
|
+
var DEFAULT_OAUTH_SCOPES = `${OAuthScopes.READ} ${OAuthScopes.WRITE}`;
|
|
238
|
+
var OAUTH_SCOPE_TO_PERMISSION = {
|
|
239
|
+
[OAuthScopes.READ]: ApiKeyPermission.READ,
|
|
240
|
+
[OAuthScopes.WRITE]: ApiKeyPermission.WRITE,
|
|
241
|
+
[OAuthScopes.ADMIN]: ApiKeyPermission.ADMIN
|
|
242
|
+
};
|
|
243
|
+
var PERMISSION_TO_OAUTH_SCOPE = {
|
|
244
|
+
[ApiKeyPermission.READ]: OAuthScopes.READ,
|
|
245
|
+
[ApiKeyPermission.WRITE]: OAuthScopes.WRITE,
|
|
246
|
+
[ApiKeyPermission.ADMIN]: OAuthScopes.ADMIN
|
|
247
|
+
};
|
|
248
|
+
var OAuthTokenLifetimes = {
|
|
249
|
+
/** Access token lifetime: 1 hour */
|
|
250
|
+
ACCESS_TOKEN_MS: 60 * 60 * 1e3,
|
|
251
|
+
/** Refresh token lifetime: 30 days */
|
|
252
|
+
REFRESH_TOKEN_MS: 30 * 24 * 60 * 60 * 1e3,
|
|
253
|
+
/** Authorization code lifetime: 10 minutes */
|
|
254
|
+
AUTHORIZATION_CODE_MS: 10 * 60 * 1e3
|
|
255
|
+
};
|
|
256
|
+
var OAuthGrantTypes = {
|
|
257
|
+
AUTHORIZATION_CODE: "authorization_code",
|
|
258
|
+
REFRESH_TOKEN: "refresh_token"
|
|
259
|
+
};
|
|
260
|
+
var SUPPORTED_GRANT_TYPES = [
|
|
261
|
+
OAuthGrantTypes.AUTHORIZATION_CODE,
|
|
262
|
+
OAuthGrantTypes.REFRESH_TOKEN
|
|
263
|
+
];
|
|
264
|
+
var OAuthResponseTypes = {
|
|
265
|
+
CODE: "code"
|
|
266
|
+
};
|
|
267
|
+
var OAuthCodeChallengeMethods = {
|
|
268
|
+
S256: "S256"
|
|
269
|
+
};
|
|
270
|
+
var OAuthRateLimits = {
|
|
271
|
+
/** /oauth/token: 30 requests per minute per client */
|
|
272
|
+
TOKEN_ENDPOINT: { limit: 30, windowMs: 60 * 1e3 },
|
|
273
|
+
/** /oauth/authorize: 10 requests per minute per user */
|
|
274
|
+
AUTHORIZE_ENDPOINT: { limit: 10, windowMs: 60 * 1e3 },
|
|
275
|
+
/** /oauth/register: 5 requests per minute per IP */
|
|
276
|
+
REGISTER_ENDPOINT: { limit: 5, windowMs: 60 * 1e3 }
|
|
277
|
+
};
|
|
278
|
+
|
|
222
279
|
// ../../packages/core/dist/config/deployment.js
|
|
223
280
|
var config = {
|
|
224
281
|
deploymentMode: process.env.DEPLOYMENT_MODE || "saas"
|
|
@@ -226,20 +283,24 @@ var config = {
|
|
|
226
283
|
var isSaas = config.deploymentMode === "saas";
|
|
227
284
|
var isOnPrem = config.deploymentMode === "onprem";
|
|
228
285
|
|
|
229
|
-
// ../../packages/core/dist/
|
|
230
|
-
var
|
|
286
|
+
// ../../packages/core/dist/versions.js
|
|
287
|
+
var VERSIONS = {
|
|
288
|
+
core: "0.3.0",
|
|
289
|
+
web: "0.3.0",
|
|
290
|
+
mcp: "0.4.1"
|
|
291
|
+
};
|
|
292
|
+
var VERSION2 = VERSIONS.core;
|
|
231
293
|
|
|
232
294
|
// ../../packages/core/dist/config/index.js
|
|
233
295
|
var DEPLOYMENT_MODE = process.env.DEPLOYMENT_MODE || "saas";
|
|
234
296
|
var config2 = {
|
|
235
297
|
version: VERSION2,
|
|
298
|
+
packages: VERSIONS,
|
|
236
299
|
deploymentMode: DEPLOYMENT_MODE,
|
|
237
300
|
billing: {
|
|
238
301
|
enabled: DEPLOYMENT_MODE === "saas",
|
|
239
302
|
revenuecat: {
|
|
240
|
-
publicKey: process.env.
|
|
241
|
-
stripeKey: process.env.STRIPE_SECRET_KEY
|
|
242
|
-
// Required by RevenueCat Web Billing
|
|
303
|
+
publicKey: process.env.NEXT_PUBLIC_REVENUECAT_PUBLIC_KEY
|
|
243
304
|
}
|
|
244
305
|
},
|
|
245
306
|
licensing: {
|
|
@@ -345,7 +406,6 @@ var OrganizationIdSchema = import_zod.z.string().regex(/^org_[a-zA-Z0-9]+$/);
|
|
|
345
406
|
var OrganizationSchema = import_zod.z.object({
|
|
346
407
|
id: OrganizationIdSchema,
|
|
347
408
|
name: import_zod.z.string().min(1).max(255),
|
|
348
|
-
slug: import_zod.z.string().min(1).max(100).regex(/^[a-z0-9-]+$/),
|
|
349
409
|
logoUrl: import_zod.z.string().url().nullable(),
|
|
350
410
|
accentColor: import_zod.z.string().regex(/^#[0-9A-Fa-f]{6}$/).nullable(),
|
|
351
411
|
tenantName: import_zod.z.string().nullable(),
|
|
@@ -473,239 +533,375 @@ var ProjectCollaboratorSchema = import_zod.z.object({
|
|
|
473
533
|
});
|
|
474
534
|
|
|
475
535
|
// ../../packages/core/dist/validation/index.js
|
|
536
|
+
var import_zod3 = require("zod");
|
|
537
|
+
|
|
538
|
+
// ../../packages/core/dist/validation/oauth.js
|
|
476
539
|
var import_zod2 = require("zod");
|
|
477
|
-
var
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
var
|
|
540
|
+
var scopeString = import_zod2.z.string().optional().transform((val) => {
|
|
541
|
+
if (!val)
|
|
542
|
+
return void 0;
|
|
543
|
+
const scopes = val.split(" ").filter(Boolean);
|
|
544
|
+
const validScopes = scopes.filter((s) => VALID_OAUTH_SCOPES.includes(s));
|
|
545
|
+
return validScopes.length > 0 ? validScopes.join(" ") : void 0;
|
|
546
|
+
});
|
|
547
|
+
var redirectUri = import_zod2.z.string().url().refine((uri) => {
|
|
548
|
+
const url = new URL(uri);
|
|
549
|
+
return url.protocol === "https:" || url.hostname === "localhost" || url.hostname === "127.0.0.1";
|
|
550
|
+
}, { message: "redirect_uri must use HTTPS or be localhost" });
|
|
551
|
+
var codeVerifier = import_zod2.z.string().min(43).max(128).regex(/^[A-Za-z0-9._~-]+$/, "code_verifier must only contain unreserved characters");
|
|
552
|
+
var codeChallenge = import_zod2.z.string().min(43).max(128).regex(/^[A-Za-z0-9_-]+$/, "code_challenge must be base64url encoded (no padding)");
|
|
553
|
+
var DynamicClientRegistrationSchema = import_zod2.z.object({
|
|
554
|
+
redirect_uris: import_zod2.z.array(redirectUri).min(1),
|
|
555
|
+
client_name: import_zod2.z.string().min(1).max(255),
|
|
556
|
+
client_uri: import_zod2.z.string().url().optional(),
|
|
557
|
+
logo_uri: import_zod2.z.string().url().optional(),
|
|
558
|
+
// Accept lowercase OAuth spec values
|
|
559
|
+
grant_types: import_zod2.z.array(import_zod2.z.enum(["authorization_code", "refresh_token"])).default(["authorization_code", "refresh_token"]),
|
|
560
|
+
response_types: import_zod2.z.array(import_zod2.z.enum([OAuthResponseTypes.CODE])).default([OAuthResponseTypes.CODE]),
|
|
561
|
+
scope: scopeString,
|
|
562
|
+
// Accept lowercase OAuth spec values
|
|
563
|
+
token_endpoint_auth_method: import_zod2.z.enum(["none", "client_secret_post", "client_secret_basic"]).default("none")
|
|
564
|
+
});
|
|
565
|
+
var DynamicClientRegistrationResponseSchema = import_zod2.z.object({
|
|
566
|
+
client_id: import_zod2.z.string(),
|
|
567
|
+
client_secret: import_zod2.z.string().optional(),
|
|
568
|
+
client_id_issued_at: import_zod2.z.number(),
|
|
569
|
+
client_secret_expires_at: import_zod2.z.number().optional(),
|
|
570
|
+
redirect_uris: import_zod2.z.array(import_zod2.z.string()),
|
|
571
|
+
client_name: import_zod2.z.string(),
|
|
572
|
+
client_uri: import_zod2.z.string().optional(),
|
|
573
|
+
logo_uri: import_zod2.z.string().optional(),
|
|
574
|
+
grant_types: import_zod2.z.array(import_zod2.z.string()),
|
|
575
|
+
response_types: import_zod2.z.array(import_zod2.z.string()),
|
|
576
|
+
scope: import_zod2.z.string(),
|
|
577
|
+
token_endpoint_auth_method: import_zod2.z.string(),
|
|
578
|
+
registration_access_token: import_zod2.z.string().optional(),
|
|
579
|
+
registration_client_uri: import_zod2.z.string().optional()
|
|
580
|
+
});
|
|
581
|
+
var AuthorizationRequestSchema = import_zod2.z.object({
|
|
582
|
+
response_type: import_zod2.z.literal(OAuthResponseTypes.CODE),
|
|
583
|
+
client_id: import_zod2.z.string().min(1),
|
|
584
|
+
redirect_uri: redirectUri,
|
|
585
|
+
scope: scopeString,
|
|
586
|
+
state: import_zod2.z.string().max(255).optional(),
|
|
587
|
+
// PKCE is mandatory in OAuth 2.1
|
|
588
|
+
code_challenge: codeChallenge,
|
|
589
|
+
code_challenge_method: import_zod2.z.literal(OAuthCodeChallengeMethods.S256)
|
|
590
|
+
});
|
|
591
|
+
var TokenRequestAuthorizationCodeSchema = import_zod2.z.object({
|
|
592
|
+
grant_type: import_zod2.z.literal(OAuthGrantTypes.AUTHORIZATION_CODE),
|
|
593
|
+
code: import_zod2.z.string().min(1),
|
|
594
|
+
redirect_uri: redirectUri,
|
|
595
|
+
client_id: import_zod2.z.string().min(1),
|
|
596
|
+
// PKCE code verifier is mandatory
|
|
597
|
+
code_verifier: codeVerifier,
|
|
598
|
+
// Client secret is optional (for confidential clients)
|
|
599
|
+
client_secret: import_zod2.z.string().optional()
|
|
600
|
+
});
|
|
601
|
+
var TokenRequestRefreshTokenSchema = import_zod2.z.object({
|
|
602
|
+
grant_type: import_zod2.z.literal(OAuthGrantTypes.REFRESH_TOKEN),
|
|
603
|
+
refresh_token: import_zod2.z.string().min(1),
|
|
604
|
+
client_id: import_zod2.z.string().min(1),
|
|
605
|
+
// Optional: request reduced scope
|
|
606
|
+
scope: scopeString,
|
|
607
|
+
// Client secret is optional (for confidential clients)
|
|
608
|
+
client_secret: import_zod2.z.string().optional()
|
|
609
|
+
});
|
|
610
|
+
var TokenRequestSchema = import_zod2.z.discriminatedUnion("grant_type", [
|
|
611
|
+
TokenRequestAuthorizationCodeSchema,
|
|
612
|
+
TokenRequestRefreshTokenSchema
|
|
613
|
+
]);
|
|
614
|
+
var TokenResponseSchema = import_zod2.z.object({
|
|
615
|
+
access_token: import_zod2.z.string(),
|
|
616
|
+
token_type: import_zod2.z.literal("Bearer"),
|
|
617
|
+
expires_in: import_zod2.z.number(),
|
|
618
|
+
refresh_token: import_zod2.z.string().optional(),
|
|
619
|
+
scope: import_zod2.z.string()
|
|
620
|
+
});
|
|
621
|
+
var TokenRevocationRequestSchema = import_zod2.z.object({
|
|
622
|
+
token: import_zod2.z.string().min(1),
|
|
623
|
+
token_type_hint: import_zod2.z.enum(["access_token", "refresh_token"]).optional(),
|
|
624
|
+
client_id: import_zod2.z.string().min(1),
|
|
625
|
+
client_secret: import_zod2.z.string().optional()
|
|
626
|
+
});
|
|
627
|
+
var OAuthErrorResponseSchema = import_zod2.z.object({
|
|
628
|
+
error: import_zod2.z.string(),
|
|
629
|
+
error_description: import_zod2.z.string().optional(),
|
|
630
|
+
error_uri: import_zod2.z.string().url().optional(),
|
|
631
|
+
state: import_zod2.z.string().optional()
|
|
632
|
+
});
|
|
633
|
+
var AuthorizationServerMetadataSchema = import_zod2.z.object({
|
|
634
|
+
issuer: import_zod2.z.string().url(),
|
|
635
|
+
authorization_endpoint: import_zod2.z.string().url(),
|
|
636
|
+
token_endpoint: import_zod2.z.string().url(),
|
|
637
|
+
registration_endpoint: import_zod2.z.string().url().optional(),
|
|
638
|
+
revocation_endpoint: import_zod2.z.string().url().optional(),
|
|
639
|
+
scopes_supported: import_zod2.z.array(import_zod2.z.string()),
|
|
640
|
+
response_types_supported: import_zod2.z.array(import_zod2.z.string()),
|
|
641
|
+
grant_types_supported: import_zod2.z.array(import_zod2.z.string()),
|
|
642
|
+
token_endpoint_auth_methods_supported: import_zod2.z.array(import_zod2.z.string()),
|
|
643
|
+
code_challenge_methods_supported: import_zod2.z.array(import_zod2.z.string()),
|
|
644
|
+
service_documentation: import_zod2.z.string().url().optional()
|
|
645
|
+
});
|
|
646
|
+
var ProtectedResourceMetadataSchema = import_zod2.z.object({
|
|
647
|
+
resource: import_zod2.z.string().url(),
|
|
648
|
+
authorization_servers: import_zod2.z.array(import_zod2.z.string().url()),
|
|
649
|
+
scopes_supported: import_zod2.z.array(import_zod2.z.string()).optional(),
|
|
650
|
+
bearer_methods_supported: import_zod2.z.array(import_zod2.z.string()).optional(),
|
|
651
|
+
resource_signing_alg_values_supported: import_zod2.z.array(import_zod2.z.string()).optional(),
|
|
652
|
+
resource_documentation: import_zod2.z.string().url().optional()
|
|
653
|
+
});
|
|
654
|
+
var InternalTokenValidationRequestSchema = import_zod2.z.object({
|
|
655
|
+
access_token: import_zod2.z.string().min(1)
|
|
656
|
+
});
|
|
657
|
+
var InternalTokenValidationResponseSchema = import_zod2.z.object({
|
|
658
|
+
valid: import_zod2.z.boolean(),
|
|
659
|
+
userId: import_zod2.z.string().optional(),
|
|
660
|
+
userEmail: import_zod2.z.string().optional(),
|
|
661
|
+
userName: import_zod2.z.string().optional(),
|
|
662
|
+
scope: import_zod2.z.string().optional(),
|
|
663
|
+
permissions: import_zod2.z.string().optional(),
|
|
664
|
+
clientId: import_zod2.z.string().optional(),
|
|
665
|
+
expiresAt: import_zod2.z.string().optional()
|
|
666
|
+
});
|
|
667
|
+
|
|
668
|
+
// ../../packages/core/dist/validation/index.js
|
|
669
|
+
var ListProjectsInputSchema = import_zod3.z.object({
|
|
670
|
+
workspaceType: import_zod3.z.preprocess((val) => typeof val === "string" ? val.toUpperCase() : val, import_zod3.z.enum(["TEAM", "PERSONAL", "ALL"]).optional())
|
|
671
|
+
});
|
|
672
|
+
var ListTasksInputSchema = import_zod3.z.object({
|
|
673
|
+
projectId: import_zod3.z.string().optional(),
|
|
674
|
+
state: import_zod3.z.nativeEnum(TaskState).optional(),
|
|
675
|
+
assigneeId: import_zod3.z.string().optional(),
|
|
676
|
+
includeArchived: import_zod3.z.boolean().optional()
|
|
677
|
+
});
|
|
678
|
+
var cuidOrPrefixedId = import_zod3.z.string().regex(/^([a-z0-9]+|[a-z]+_[a-zA-Z0-9]+)$/);
|
|
679
|
+
var gitBranchName = import_zod3.z.string().min(1).max(100).regex(/^[a-zA-Z0-9][-a-zA-Z0-9._/]*[a-zA-Z0-9]$|^[a-zA-Z0-9]$/, "Branch name must start and end with alphanumeric character").refine((val) => !val.includes("..") && !val.includes("@{") && !val.includes("//") && !val.endsWith(".lock") && !val.includes("~") && !val.includes("^") && !val.includes(":") && !val.includes("?") && !val.includes("*") && !val.includes("[") && !val.includes("\\") && !val.includes(" ") && !val.includes(";") && !val.includes("&") && !val.includes("|") && !val.includes("$") && !val.includes("`") && !val.includes("'") && !val.includes('"') && !val.includes("<") && !val.includes(">") && !val.includes("(") && !val.includes(")"), "Invalid branch name: contains forbidden characters or sequences");
|
|
680
|
+
var GetTaskInputSchema = import_zod3.z.object({
|
|
489
681
|
taskId: cuidOrPrefixedId
|
|
490
682
|
});
|
|
491
|
-
var AssignTaskInputSchema =
|
|
683
|
+
var AssignTaskInputSchema = import_zod3.z.object({
|
|
492
684
|
projectId: cuidOrPrefixedId,
|
|
493
685
|
taskId: cuidOrPrefixedId,
|
|
494
|
-
expectedState:
|
|
686
|
+
expectedState: import_zod3.z.nativeEnum(TaskState).default(TaskState.TODO)
|
|
495
687
|
});
|
|
496
|
-
var UpdateProgressInputSchema =
|
|
688
|
+
var UpdateProgressInputSchema = import_zod3.z.object({
|
|
497
689
|
taskId: cuidOrPrefixedId,
|
|
498
|
-
statusMessage:
|
|
499
|
-
completedCheckpointIds:
|
|
500
|
-
currentCheckpointIndex:
|
|
690
|
+
statusMessage: import_zod3.z.string().max(1e3).optional(),
|
|
691
|
+
completedCheckpointIds: import_zod3.z.array(import_zod3.z.string()).optional(),
|
|
692
|
+
currentCheckpointIndex: import_zod3.z.number().int().optional()
|
|
501
693
|
});
|
|
502
|
-
var CompleteTaskInputSchema =
|
|
694
|
+
var CompleteTaskInputSchema = import_zod3.z.object({
|
|
503
695
|
projectId: cuidOrPrefixedId,
|
|
504
696
|
taskId: cuidOrPrefixedId,
|
|
505
|
-
pullRequestTitle:
|
|
506
|
-
pullRequestBody:
|
|
697
|
+
pullRequestTitle: import_zod3.z.string().min(1).max(300).optional(),
|
|
698
|
+
pullRequestBody: import_zod3.z.string().max(1e4).optional()
|
|
507
699
|
});
|
|
508
|
-
var ReportErrorInputSchema =
|
|
700
|
+
var ReportErrorInputSchema = import_zod3.z.object({
|
|
509
701
|
taskId: cuidOrPrefixedId,
|
|
510
|
-
errorType:
|
|
511
|
-
errorMessage:
|
|
512
|
-
context:
|
|
702
|
+
errorType: import_zod3.z.nativeEnum(ErrorType),
|
|
703
|
+
errorMessage: import_zod3.z.string().min(1).max(1e3),
|
|
704
|
+
context: import_zod3.z.string().max(2e3).optional()
|
|
513
705
|
});
|
|
514
|
-
var GetProjectContextInputSchema =
|
|
706
|
+
var GetProjectContextInputSchema = import_zod3.z.object({
|
|
515
707
|
projectId: cuidOrPrefixedId
|
|
516
708
|
});
|
|
517
|
-
var AddNoteInputSchema =
|
|
709
|
+
var AddNoteInputSchema = import_zod3.z.object({
|
|
518
710
|
taskId: cuidOrPrefixedId,
|
|
519
|
-
content:
|
|
711
|
+
content: import_zod3.z.string().min(1).max(500)
|
|
520
712
|
});
|
|
521
|
-
var AbandonTaskInputSchema =
|
|
713
|
+
var AbandonTaskInputSchema = import_zod3.z.object({
|
|
522
714
|
projectId: cuidOrPrefixedId,
|
|
523
715
|
taskId: cuidOrPrefixedId,
|
|
524
|
-
deleteBranch:
|
|
716
|
+
deleteBranch: import_zod3.z.boolean().optional()
|
|
525
717
|
});
|
|
526
|
-
var RequestChangesInputSchema =
|
|
718
|
+
var RequestChangesInputSchema = import_zod3.z.object({
|
|
527
719
|
projectId: cuidOrPrefixedId,
|
|
528
720
|
taskId: cuidOrPrefixedId,
|
|
529
|
-
reviewComments:
|
|
530
|
-
requestedChanges:
|
|
721
|
+
reviewComments: import_zod3.z.string().min(1).max(5e3),
|
|
722
|
+
requestedChanges: import_zod3.z.array(import_zod3.z.string().min(1).max(500)).optional()
|
|
531
723
|
});
|
|
532
|
-
var ApproveTaskInputSchema =
|
|
724
|
+
var ApproveTaskInputSchema = import_zod3.z.object({
|
|
533
725
|
projectId: cuidOrPrefixedId,
|
|
534
726
|
taskId: cuidOrPrefixedId,
|
|
535
|
-
reviewComments:
|
|
727
|
+
reviewComments: import_zod3.z.string().max(2e3).optional()
|
|
536
728
|
});
|
|
537
|
-
var ArchiveTaskInputSchema =
|
|
729
|
+
var ArchiveTaskInputSchema = import_zod3.z.object({
|
|
538
730
|
projectId: cuidOrPrefixedId,
|
|
539
731
|
taskId: cuidOrPrefixedId
|
|
540
732
|
});
|
|
541
|
-
var UnarchiveTaskInputSchema =
|
|
733
|
+
var UnarchiveTaskInputSchema = import_zod3.z.object({
|
|
542
734
|
projectId: cuidOrPrefixedId,
|
|
543
735
|
taskId: cuidOrPrefixedId
|
|
544
736
|
});
|
|
545
|
-
var CreatePersonalProjectInputSchema =
|
|
546
|
-
name:
|
|
547
|
-
description:
|
|
548
|
-
repositoryUrl:
|
|
737
|
+
var CreatePersonalProjectInputSchema = import_zod3.z.object({
|
|
738
|
+
name: import_zod3.z.string().min(1).max(100),
|
|
739
|
+
description: import_zod3.z.string().max(500).optional(),
|
|
740
|
+
repositoryUrl: import_zod3.z.string().url()
|
|
549
741
|
});
|
|
550
|
-
var CheckActiveTaskInputSchema =
|
|
551
|
-
var CreateTaskMCPInputSchema =
|
|
742
|
+
var CheckActiveTaskInputSchema = import_zod3.z.object({});
|
|
743
|
+
var CreateTaskMCPInputSchema = import_zod3.z.object({
|
|
552
744
|
projectId: cuidOrPrefixedId,
|
|
553
745
|
epicId: cuidOrPrefixedId.nullable().optional(),
|
|
554
|
-
title:
|
|
555
|
-
description:
|
|
556
|
-
priority:
|
|
557
|
-
acceptanceCriteria:
|
|
558
|
-
description:
|
|
746
|
+
title: import_zod3.z.string().min(1).max(200),
|
|
747
|
+
description: import_zod3.z.string().max(5e3),
|
|
748
|
+
priority: import_zod3.z.nativeEnum(TaskPriority).default(TaskPriority.MEDIUM),
|
|
749
|
+
acceptanceCriteria: import_zod3.z.array(import_zod3.z.object({
|
|
750
|
+
description: import_zod3.z.string().min(1).max(500)
|
|
559
751
|
})).min(1)
|
|
560
752
|
});
|
|
561
|
-
var CreateOrganizationInputSchema =
|
|
562
|
-
name:
|
|
563
|
-
slug: import_zod2.z.string().min(1).max(100).regex(/^[a-z0-9-]+$/).optional()
|
|
753
|
+
var CreateOrganizationInputSchema = import_zod3.z.object({
|
|
754
|
+
name: import_zod3.z.string().min(1).max(255)
|
|
564
755
|
});
|
|
565
|
-
var UpdateOrganizationInputSchema =
|
|
756
|
+
var UpdateOrganizationInputSchema = import_zod3.z.object({
|
|
566
757
|
organizationId: cuidOrPrefixedId,
|
|
567
|
-
name:
|
|
568
|
-
logoUrl:
|
|
569
|
-
accentColor:
|
|
570
|
-
tenantName:
|
|
571
|
-
});
|
|
572
|
-
var CreateProjectInputSchema =
|
|
573
|
-
name:
|
|
574
|
-
description:
|
|
575
|
-
type:
|
|
576
|
-
repositoryUrl:
|
|
577
|
-
baseBranch:
|
|
578
|
-
tags:
|
|
579
|
-
});
|
|
580
|
-
var UpdateProjectInputSchema =
|
|
581
|
-
projectId:
|
|
582
|
-
name:
|
|
583
|
-
description:
|
|
584
|
-
repositoryUrl:
|
|
585
|
-
baseBranch:
|
|
586
|
-
tags:
|
|
587
|
-
allowMemberArchive:
|
|
588
|
-
});
|
|
589
|
-
var CreateEpicInputSchema =
|
|
758
|
+
name: import_zod3.z.string().min(1).max(255).optional(),
|
|
759
|
+
logoUrl: import_zod3.z.string().url().nullable().optional(),
|
|
760
|
+
accentColor: import_zod3.z.string().regex(/^#[0-9A-Fa-f]{6}$/, "Invalid hex color format. Expected #RRGGBB").nullable().optional(),
|
|
761
|
+
tenantName: import_zod3.z.string().max(255).nullable().optional()
|
|
762
|
+
});
|
|
763
|
+
var CreateProjectInputSchema = import_zod3.z.object({
|
|
764
|
+
name: import_zod3.z.string().min(1).max(100),
|
|
765
|
+
description: import_zod3.z.string().max(500).optional(),
|
|
766
|
+
type: import_zod3.z.nativeEnum(ProjectType),
|
|
767
|
+
repositoryUrl: import_zod3.z.string().url(),
|
|
768
|
+
baseBranch: import_zod3.z.string().default("develop").optional(),
|
|
769
|
+
tags: import_zod3.z.array(import_zod3.z.string()).default([])
|
|
770
|
+
});
|
|
771
|
+
var UpdateProjectInputSchema = import_zod3.z.object({
|
|
772
|
+
projectId: import_zod3.z.string().min(1).optional(),
|
|
773
|
+
name: import_zod3.z.string().min(1).max(100).optional(),
|
|
774
|
+
description: import_zod3.z.string().max(500).optional(),
|
|
775
|
+
repositoryUrl: import_zod3.z.string().url().optional(),
|
|
776
|
+
baseBranch: import_zod3.z.string().optional(),
|
|
777
|
+
tags: import_zod3.z.array(import_zod3.z.string()).optional(),
|
|
778
|
+
allowMemberArchive: import_zod3.z.boolean().optional()
|
|
779
|
+
});
|
|
780
|
+
var CreateEpicInputSchema = import_zod3.z.object({
|
|
590
781
|
projectId: cuidOrPrefixedId,
|
|
591
|
-
name:
|
|
592
|
-
description:
|
|
593
|
-
});
|
|
594
|
-
var CreateTaskInputSchema =
|
|
595
|
-
projectId:
|
|
596
|
-
epicId:
|
|
597
|
-
title:
|
|
598
|
-
description:
|
|
599
|
-
priority:
|
|
600
|
-
acceptanceCriteria:
|
|
601
|
-
description:
|
|
782
|
+
name: import_zod3.z.string().min(1).max(200),
|
|
783
|
+
description: import_zod3.z.string().max(2e3).optional()
|
|
784
|
+
});
|
|
785
|
+
var CreateTaskInputSchema = import_zod3.z.object({
|
|
786
|
+
projectId: import_zod3.z.string().min(1),
|
|
787
|
+
epicId: import_zod3.z.string().min(1).nullable().optional(),
|
|
788
|
+
title: import_zod3.z.string().min(1).max(200),
|
|
789
|
+
description: import_zod3.z.string().max(5e3),
|
|
790
|
+
priority: import_zod3.z.nativeEnum(TaskPriority).default(TaskPriority.MEDIUM),
|
|
791
|
+
acceptanceCriteria: import_zod3.z.array(import_zod3.z.object({
|
|
792
|
+
description: import_zod3.z.string().min(1).max(500)
|
|
602
793
|
})).min(1)
|
|
603
794
|
});
|
|
604
|
-
var UpdateTaskInputSchema =
|
|
605
|
-
taskId:
|
|
606
|
-
title:
|
|
607
|
-
description:
|
|
608
|
-
priority:
|
|
609
|
-
state:
|
|
610
|
-
assigneeId:
|
|
611
|
-
acceptanceCriteria:
|
|
612
|
-
id:
|
|
613
|
-
description:
|
|
614
|
-
completed:
|
|
795
|
+
var UpdateTaskInputSchema = import_zod3.z.object({
|
|
796
|
+
taskId: import_zod3.z.string().min(1),
|
|
797
|
+
title: import_zod3.z.string().min(1).max(200).optional(),
|
|
798
|
+
description: import_zod3.z.string().max(5e3).optional(),
|
|
799
|
+
priority: import_zod3.z.nativeEnum(TaskPriority).optional(),
|
|
800
|
+
state: import_zod3.z.nativeEnum(TaskState).optional(),
|
|
801
|
+
assigneeId: import_zod3.z.string().nullable().optional(),
|
|
802
|
+
acceptanceCriteria: import_zod3.z.array(import_zod3.z.object({
|
|
803
|
+
id: import_zod3.z.string().optional(),
|
|
804
|
+
description: import_zod3.z.string().min(1).max(500),
|
|
805
|
+
completed: import_zod3.z.boolean().optional()
|
|
615
806
|
})).optional()
|
|
616
807
|
});
|
|
617
|
-
var AssignTaskWebappInputSchema =
|
|
618
|
-
taskId:
|
|
619
|
-
userId:
|
|
808
|
+
var AssignTaskWebappInputSchema = import_zod3.z.object({
|
|
809
|
+
taskId: import_zod3.z.string().min(1),
|
|
810
|
+
userId: import_zod3.z.string().min(1)
|
|
620
811
|
});
|
|
621
|
-
var CreateTagInputSchema =
|
|
812
|
+
var CreateTagInputSchema = import_zod3.z.object({
|
|
622
813
|
organizationId: cuidOrPrefixedId,
|
|
623
|
-
name:
|
|
814
|
+
name: import_zod3.z.string().min(1).max(50).regex(/^[a-zA-Z0-9\s-]+$/)
|
|
624
815
|
});
|
|
625
|
-
var UpdateTagInputSchema =
|
|
626
|
-
name:
|
|
816
|
+
var UpdateTagInputSchema = import_zod3.z.object({
|
|
817
|
+
name: import_zod3.z.string().min(1).max(50).regex(/^[a-zA-Z0-9\s-]+$/)
|
|
627
818
|
});
|
|
628
|
-
var UpdateOrganizationSettingsInputSchema =
|
|
819
|
+
var UpdateOrganizationSettingsInputSchema = import_zod3.z.object({
|
|
629
820
|
organizationId: cuidOrPrefixedId,
|
|
630
|
-
ldapEnabled:
|
|
631
|
-
ldapUrl:
|
|
632
|
-
ldapBindDN:
|
|
633
|
-
ldapSearchBase:
|
|
634
|
-
deleteMergedBranches:
|
|
635
|
-
enforceConventionalCommits:
|
|
636
|
-
maxPersonalProjectsPerUser:
|
|
637
|
-
logoUrl:
|
|
638
|
-
accentColor:
|
|
639
|
-
tenantName:
|
|
640
|
-
});
|
|
641
|
-
var InviteUserInputSchema =
|
|
821
|
+
ldapEnabled: import_zod3.z.boolean().optional(),
|
|
822
|
+
ldapUrl: import_zod3.z.string().url().nullable().optional(),
|
|
823
|
+
ldapBindDN: import_zod3.z.string().nullable().optional(),
|
|
824
|
+
ldapSearchBase: import_zod3.z.string().nullable().optional(),
|
|
825
|
+
deleteMergedBranches: import_zod3.z.boolean().optional(),
|
|
826
|
+
enforceConventionalCommits: import_zod3.z.boolean().optional(),
|
|
827
|
+
maxPersonalProjectsPerUser: import_zod3.z.number().int().min(0).optional(),
|
|
828
|
+
logoUrl: import_zod3.z.string().url().nullable().optional(),
|
|
829
|
+
accentColor: import_zod3.z.string().regex(/^#[0-9A-Fa-f]{6}$/, "Invalid hex color format. Expected #RRGGBB").nullable().optional(),
|
|
830
|
+
tenantName: import_zod3.z.string().max(255).nullable().optional()
|
|
831
|
+
});
|
|
832
|
+
var InviteUserInputSchema = import_zod3.z.object({
|
|
642
833
|
organizationId: cuidOrPrefixedId,
|
|
643
|
-
email:
|
|
644
|
-
role:
|
|
645
|
-
tags:
|
|
834
|
+
email: import_zod3.z.string().email(),
|
|
835
|
+
role: import_zod3.z.nativeEnum(UserRole).default(UserRole.MEMBER),
|
|
836
|
+
tags: import_zod3.z.array(import_zod3.z.string()).default([])
|
|
646
837
|
});
|
|
647
|
-
var AssignUserTagsInputSchema =
|
|
838
|
+
var AssignUserTagsInputSchema = import_zod3.z.object({
|
|
648
839
|
userId: cuidOrPrefixedId,
|
|
649
|
-
tags:
|
|
840
|
+
tags: import_zod3.z.array(import_zod3.z.string()).min(0)
|
|
650
841
|
});
|
|
651
|
-
var InviteCollaboratorInputSchema =
|
|
842
|
+
var InviteCollaboratorInputSchema = import_zod3.z.object({
|
|
652
843
|
projectId: cuidOrPrefixedId,
|
|
653
|
-
email:
|
|
844
|
+
email: import_zod3.z.string().email()
|
|
654
845
|
});
|
|
655
|
-
var PublishProjectInputSchema =
|
|
846
|
+
var PublishProjectInputSchema = import_zod3.z.object({
|
|
656
847
|
projectId: cuidOrPrefixedId,
|
|
657
|
-
transferOwnership:
|
|
658
|
-
tags:
|
|
848
|
+
transferOwnership: import_zod3.z.boolean().default(false),
|
|
849
|
+
tags: import_zod3.z.array(import_zod3.z.string()).min(1)
|
|
659
850
|
});
|
|
660
|
-
var GenerateApiKeyInputSchema =
|
|
661
|
-
name:
|
|
662
|
-
|
|
663
|
-
|
|
851
|
+
var GenerateApiKeyInputSchema = import_zod3.z.object({
|
|
852
|
+
name: import_zod3.z.string().min(1).max(100),
|
|
853
|
+
publicNickname: import_zod3.z.string().max(50).optional(),
|
|
854
|
+
expiresInDays: import_zod3.z.number().int().min(1).max(365).default(90),
|
|
855
|
+
permissions: import_zod3.z.nativeEnum(ApiKeyPermission).default(ApiKeyPermission.WRITE)
|
|
664
856
|
});
|
|
665
|
-
var
|
|
857
|
+
var UpdateApiKeyInputSchema = import_zod3.z.object({
|
|
858
|
+
publicNickname: import_zod3.z.string().max(50).nullable().optional(),
|
|
859
|
+
scopedOrganizationId: import_zod3.z.string().optional().nullable(),
|
|
860
|
+
scopedProjectIds: import_zod3.z.array(import_zod3.z.string()).optional()
|
|
861
|
+
});
|
|
862
|
+
var RevokeApiKeyInputSchema = import_zod3.z.object({
|
|
666
863
|
keyId: cuidOrPrefixedId
|
|
667
864
|
});
|
|
668
|
-
var LoginInputSchema =
|
|
669
|
-
email:
|
|
670
|
-
password:
|
|
865
|
+
var LoginInputSchema = import_zod3.z.object({
|
|
866
|
+
email: import_zod3.z.string().email(),
|
|
867
|
+
password: import_zod3.z.string().min(8).max(255)
|
|
671
868
|
});
|
|
672
|
-
var RegisterInputSchema =
|
|
673
|
-
email:
|
|
674
|
-
password:
|
|
675
|
-
name:
|
|
676
|
-
organizationSlug: import_zod2.z.string().min(1).max(100).regex(/^[a-z0-9-]+$/).optional()
|
|
869
|
+
var RegisterInputSchema = import_zod3.z.object({
|
|
870
|
+
email: import_zod3.z.string().email(),
|
|
871
|
+
password: import_zod3.z.string().min(8).max(255),
|
|
872
|
+
name: import_zod3.z.string().min(1).max(255)
|
|
677
873
|
});
|
|
678
|
-
var VerifyTaskInputSchema =
|
|
874
|
+
var VerifyTaskInputSchema = import_zod3.z.object({
|
|
679
875
|
projectId: cuidOrPrefixedId,
|
|
680
876
|
taskId: cuidOrPrefixedId,
|
|
681
|
-
approved:
|
|
682
|
-
feedback:
|
|
877
|
+
approved: import_zod3.z.boolean(),
|
|
878
|
+
feedback: import_zod3.z.string().max(5e3).optional()
|
|
683
879
|
});
|
|
684
|
-
var GetTaskPromptInputSchema =
|
|
880
|
+
var GetTaskPromptInputSchema = import_zod3.z.object({
|
|
685
881
|
projectId: cuidOrPrefixedId,
|
|
686
882
|
taskId: cuidOrPrefixedId
|
|
687
883
|
});
|
|
688
|
-
var UpdateTaskMCPInputSchema =
|
|
884
|
+
var UpdateTaskMCPInputSchema = import_zod3.z.object({
|
|
689
885
|
projectId: cuidOrPrefixedId,
|
|
690
886
|
taskId: cuidOrPrefixedId,
|
|
691
|
-
title:
|
|
692
|
-
description:
|
|
693
|
-
priority:
|
|
694
|
-
acceptanceCriteria:
|
|
695
|
-
id:
|
|
696
|
-
description:
|
|
887
|
+
title: import_zod3.z.string().min(1).max(200).optional(),
|
|
888
|
+
description: import_zod3.z.string().max(5e3).optional(),
|
|
889
|
+
priority: import_zod3.z.nativeEnum(TaskPriority).optional(),
|
|
890
|
+
acceptanceCriteria: import_zod3.z.array(import_zod3.z.object({
|
|
891
|
+
id: import_zod3.z.string().optional(),
|
|
892
|
+
description: import_zod3.z.string().min(1).max(500)
|
|
697
893
|
})).optional()
|
|
698
894
|
});
|
|
699
|
-
var ReportBranchInputSchema =
|
|
895
|
+
var ReportBranchInputSchema = import_zod3.z.object({
|
|
700
896
|
projectId: cuidOrPrefixedId,
|
|
701
897
|
taskId: cuidOrPrefixedId,
|
|
702
898
|
branchName: gitBranchName
|
|
703
899
|
});
|
|
704
|
-
var ReportPRInputSchema =
|
|
900
|
+
var ReportPRInputSchema = import_zod3.z.object({
|
|
705
901
|
projectId: cuidOrPrefixedId,
|
|
706
902
|
taskId: cuidOrPrefixedId,
|
|
707
|
-
pullRequestUrl:
|
|
708
|
-
pullRequestNumber:
|
|
903
|
+
pullRequestUrl: import_zod3.z.string().url(),
|
|
904
|
+
pullRequestNumber: import_zod3.z.number().int().positive()
|
|
709
905
|
});
|
|
710
906
|
|
|
711
907
|
// ../../packages/core/dist/logging/metrics.js
|
|
@@ -786,23 +982,16 @@ function createHistogram(name, help, buckets = [5e-3, 0.01, 0.025, 0.05, 0.1, 0.
|
|
|
786
982
|
var httpRequestsTotal = createCounter("mtaap_http_requests_total", "Total number of HTTP requests");
|
|
787
983
|
var httpRequestDuration = createHistogram("mtaap_http_request_duration_seconds", "HTTP request duration in seconds");
|
|
788
984
|
var activeUsers = createGauge("mtaap_active_users", "Number of active users");
|
|
789
|
-
var tasksTotal = createCounter("mtaap_tasks_total", "Total number of tasks by state");
|
|
790
|
-
var taskStateChanges = createCounter("mtaap_task_state_changes_total", "Total number of task state changes");
|
|
791
985
|
var httpErrorsTotal = createCounter("mtaap_http_errors_total", "Total number of HTTP errors");
|
|
792
986
|
var httpActiveConnections = createGauge("mtaap_http_active_connections", "Number of active HTTP connections");
|
|
793
987
|
var newSignupsTotal = createCounter("mtaap_new_signups_total", "Total number of new user signups");
|
|
794
988
|
var loginSuccessTotal = createCounter("mtaap_login_success_total", "Total number of successful logins");
|
|
795
989
|
var loginFailureTotal = createCounter("mtaap_login_failure_total", "Total number of failed logins");
|
|
796
|
-
var dbConnectionPoolActive = createGauge("mtaap_db_connection_pool_active", "Number of active database connections");
|
|
797
|
-
var dbConnectionPoolIdle = createGauge("mtaap_db_connection_pool_idle", "Number of idle database connections");
|
|
798
|
-
var dbConnectionPoolMax = createGauge("mtaap_db_connection_pool_max", "Maximum number of database connections");
|
|
799
990
|
var dbQueryDuration = createHistogram("mtaap_db_query_duration_seconds", "Database query duration in seconds");
|
|
800
991
|
var dbSlowQueriesTotal = createCounter("mtaap_db_slow_queries_total", "Total number of slow database queries (>1s)");
|
|
801
|
-
var dbErrorsTotal = createCounter("mtaap_db_errors_total", "Total number of database errors");
|
|
802
992
|
var tasksCreatedTotal = createCounter("mtaap_tasks_created_total", "Total number of tasks created");
|
|
803
993
|
var tasksAssignedTotal = createCounter("mtaap_tasks_assigned_total", "Total number of tasks assigned");
|
|
804
994
|
var tasksCompletedTotal = createCounter("mtaap_tasks_completed_total", "Total number of tasks completed");
|
|
805
|
-
var tasksByState = createGauge("mtaap_tasks_by_state", "Number of tasks by state");
|
|
806
995
|
|
|
807
996
|
// ../../packages/core/dist/logging/performance-monitor.js
|
|
808
997
|
var MAX_SAMPLES = 1e3;
|
|
@@ -1024,12 +1213,17 @@ var ApiError = class extends Error {
|
|
|
1024
1213
|
var MCPApiClient = class {
|
|
1025
1214
|
baseUrl;
|
|
1026
1215
|
apiKey;
|
|
1216
|
+
oauthToken;
|
|
1027
1217
|
timeout;
|
|
1028
1218
|
debug;
|
|
1029
1219
|
authContext = null;
|
|
1030
1220
|
constructor(config3) {
|
|
1221
|
+
if (!config3.apiKey && !config3.oauthToken) {
|
|
1222
|
+
throw new Error("Either apiKey or oauthToken must be provided");
|
|
1223
|
+
}
|
|
1031
1224
|
this.baseUrl = config3.baseUrl.replace(/\/$/, "");
|
|
1032
1225
|
this.apiKey = config3.apiKey;
|
|
1226
|
+
this.oauthToken = config3.oauthToken;
|
|
1033
1227
|
this.timeout = config3.timeout ?? DEFAULT_TIMEOUT;
|
|
1034
1228
|
this.debug = config3.debug ?? false;
|
|
1035
1229
|
}
|
|
@@ -1044,18 +1238,33 @@ var MCPApiClient = class {
|
|
|
1044
1238
|
console.error(`[mcp-api] ${method} ${sanitizeForLogging(path)}`);
|
|
1045
1239
|
}
|
|
1046
1240
|
try {
|
|
1241
|
+
const headers = {
|
|
1242
|
+
"Content-Type": "application/json"
|
|
1243
|
+
};
|
|
1244
|
+
if (this.oauthToken) {
|
|
1245
|
+
headers["Authorization"] = `Bearer ${this.oauthToken}`;
|
|
1246
|
+
} else if (this.apiKey) {
|
|
1247
|
+
headers["X-API-Key"] = this.apiKey;
|
|
1248
|
+
}
|
|
1047
1249
|
const response = await fetch(url, {
|
|
1048
1250
|
method,
|
|
1049
|
-
headers
|
|
1050
|
-
"Content-Type": "application/json",
|
|
1051
|
-
"X-API-Key": this.apiKey
|
|
1052
|
-
},
|
|
1251
|
+
headers,
|
|
1053
1252
|
body: body ? JSON.stringify(body) : void 0,
|
|
1054
1253
|
signal: controller.signal
|
|
1055
1254
|
});
|
|
1056
1255
|
clearTimeout(timeoutId);
|
|
1057
1256
|
const data = await response.json();
|
|
1058
1257
|
if (!response.ok) {
|
|
1258
|
+
if (response.status === 403 && data.code === "EMAIL_NOT_VERIFIED" && data.verificationUrl) {
|
|
1259
|
+
throw new ApiError(
|
|
1260
|
+
`${data.error}
|
|
1261
|
+
|
|
1262
|
+
To verify your email, visit: ${data.verificationUrl}
|
|
1263
|
+
${data.hint ? `Hint: ${data.hint}` : ""}`,
|
|
1264
|
+
"EMAIL_NOT_VERIFIED",
|
|
1265
|
+
403
|
|
1266
|
+
);
|
|
1267
|
+
}
|
|
1059
1268
|
throw new ApiError(
|
|
1060
1269
|
data.error || "API request failed",
|
|
1061
1270
|
data.code || "UNKNOWN_ERROR",
|
|
@@ -1318,7 +1527,7 @@ var PERMISSION_RANK = {
|
|
|
1318
1527
|
ADMIN: 3
|
|
1319
1528
|
};
|
|
1320
1529
|
function assertApiKeyPermission(apiKey, required, toolName) {
|
|
1321
|
-
const actualRank = PERMISSION_RANK[apiKey.permissions] ?? 0;
|
|
1530
|
+
const actualRank = apiKey.permissions ? PERMISSION_RANK[apiKey.permissions] ?? 0 : 0;
|
|
1322
1531
|
const requiredRank = PERMISSION_RANK[required] ?? 0;
|
|
1323
1532
|
if (actualRank >= requiredRank) {
|
|
1324
1533
|
return;
|
|
@@ -1439,7 +1648,7 @@ function initializeMCPServer(apiClient, authContext) {
|
|
|
1439
1648
|
{
|
|
1440
1649
|
description: "Discover all accessible projects. Use first to find project IDs. Filter by TEAM, PERSONAL, or ALL workspaces.",
|
|
1441
1650
|
inputSchema: {
|
|
1442
|
-
workspaceType:
|
|
1651
|
+
workspaceType: import_zod4.z.enum(["TEAM", "PERSONAL", "ALL"]).optional().describe("Filter by workspace type")
|
|
1443
1652
|
}
|
|
1444
1653
|
},
|
|
1445
1654
|
async (args) => {
|
|
@@ -1469,10 +1678,10 @@ function initializeMCPServer(apiClient, authContext) {
|
|
|
1469
1678
|
{
|
|
1470
1679
|
description: "Query tasks with filters. Use state=TODO for assignable tasks, state=REVIEW for pending reviews.",
|
|
1471
1680
|
inputSchema: {
|
|
1472
|
-
projectId:
|
|
1473
|
-
state:
|
|
1474
|
-
assigneeId:
|
|
1475
|
-
includeArchived:
|
|
1681
|
+
projectId: import_zod4.z.string().optional().describe("Filter by project ID"),
|
|
1682
|
+
state: import_zod4.z.nativeEnum(TaskState).optional().describe("Filter by task state"),
|
|
1683
|
+
assigneeId: import_zod4.z.string().optional().describe("Filter by assignee ID"),
|
|
1684
|
+
includeArchived: import_zod4.z.boolean().optional().describe("Include archived tasks (default: false)")
|
|
1476
1685
|
}
|
|
1477
1686
|
},
|
|
1478
1687
|
async (args) => {
|
|
@@ -1503,7 +1712,7 @@ function initializeMCPServer(apiClient, authContext) {
|
|
|
1503
1712
|
{
|
|
1504
1713
|
description: "Get complete task details with acceptance criteria and notes. Call before assign_task to understand requirements.",
|
|
1505
1714
|
inputSchema: {
|
|
1506
|
-
taskId:
|
|
1715
|
+
taskId: import_zod4.z.string().describe("The task ID to retrieve")
|
|
1507
1716
|
}
|
|
1508
1717
|
},
|
|
1509
1718
|
async (args) => {
|
|
@@ -1529,9 +1738,9 @@ function initializeMCPServer(apiClient, authContext) {
|
|
|
1529
1738
|
{
|
|
1530
1739
|
description: "Atomically claim a task. Race-safe - fails if already assigned. Task must be TODO. Returns suggested branch name and worktree path for isolated parallel development.",
|
|
1531
1740
|
inputSchema: {
|
|
1532
|
-
projectId:
|
|
1533
|
-
taskId:
|
|
1534
|
-
expectedState:
|
|
1741
|
+
projectId: import_zod4.z.string().describe("The project ID"),
|
|
1742
|
+
taskId: import_zod4.z.string().describe("The task ID to assign"),
|
|
1743
|
+
expectedState: import_zod4.z.nativeEnum(TaskState).optional().describe("Expected task state (default: TODO)")
|
|
1535
1744
|
}
|
|
1536
1745
|
},
|
|
1537
1746
|
async (args) => {
|
|
@@ -1565,10 +1774,10 @@ function initializeMCPServer(apiClient, authContext) {
|
|
|
1565
1774
|
{
|
|
1566
1775
|
description: "Report progress and checkpoint work. Call frequently during execution. Marks acceptance criteria complete.",
|
|
1567
1776
|
inputSchema: {
|
|
1568
|
-
taskId:
|
|
1569
|
-
statusMessage:
|
|
1570
|
-
completedCheckpointIds:
|
|
1571
|
-
currentCheckpointIndex:
|
|
1777
|
+
taskId: import_zod4.z.string().describe("The task ID to update"),
|
|
1778
|
+
statusMessage: import_zod4.z.string().optional().describe("Status message (max 1000 chars)"),
|
|
1779
|
+
completedCheckpointIds: import_zod4.z.array(import_zod4.z.string()).optional().describe("Array of completed checkpoint IDs"),
|
|
1780
|
+
currentCheckpointIndex: import_zod4.z.number().optional().describe("Current checkpoint index")
|
|
1572
1781
|
}
|
|
1573
1782
|
},
|
|
1574
1783
|
async (args) => {
|
|
@@ -1602,10 +1811,10 @@ function initializeMCPServer(apiClient, authContext) {
|
|
|
1602
1811
|
{
|
|
1603
1812
|
description: "Prepare task for PR creation. Returns PR suggestions. After creating PR locally, call report_pr to transition to REVIEW. Requires IN_PROGRESS state.",
|
|
1604
1813
|
inputSchema: {
|
|
1605
|
-
projectId:
|
|
1606
|
-
taskId:
|
|
1607
|
-
pullRequestTitle:
|
|
1608
|
-
pullRequestBody:
|
|
1814
|
+
projectId: import_zod4.z.string().describe("The project ID"),
|
|
1815
|
+
taskId: import_zod4.z.string().describe("The task ID to complete"),
|
|
1816
|
+
pullRequestTitle: import_zod4.z.string().optional().describe("PR title (max 300 chars)"),
|
|
1817
|
+
pullRequestBody: import_zod4.z.string().optional().describe("PR body/description (max 10000 chars)")
|
|
1609
1818
|
}
|
|
1610
1819
|
},
|
|
1611
1820
|
async (args) => {
|
|
@@ -1662,10 +1871,10 @@ function initializeMCPServer(apiClient, authContext) {
|
|
|
1662
1871
|
{
|
|
1663
1872
|
description: "Report unrecoverable errors (BUILD_FAILURE, TEST_FAILURE, CONFLICT, AUTH_ERROR). Consider abandon_task after.",
|
|
1664
1873
|
inputSchema: {
|
|
1665
|
-
taskId:
|
|
1666
|
-
errorType:
|
|
1667
|
-
errorMessage:
|
|
1668
|
-
context:
|
|
1874
|
+
taskId: import_zod4.z.string().describe("The task ID"),
|
|
1875
|
+
errorType: import_zod4.z.nativeEnum(ErrorType).describe("Error type: BUILD_FAILURE, TEST_FAILURE, CONFLICT, AUTH_ERROR, OTHER"),
|
|
1876
|
+
errorMessage: import_zod4.z.string().describe("Error message (max 1000 chars)"),
|
|
1877
|
+
context: import_zod4.z.string().optional().describe("Additional context (max 2000 chars)")
|
|
1669
1878
|
}
|
|
1670
1879
|
},
|
|
1671
1880
|
async (args) => {
|
|
@@ -1700,7 +1909,7 @@ function initializeMCPServer(apiClient, authContext) {
|
|
|
1700
1909
|
{
|
|
1701
1910
|
description: "Load project README, tech stack, and coding conventions. Call after selecting project.",
|
|
1702
1911
|
inputSchema: {
|
|
1703
|
-
projectId:
|
|
1912
|
+
projectId: import_zod4.z.string().describe("The project ID")
|
|
1704
1913
|
}
|
|
1705
1914
|
},
|
|
1706
1915
|
async (args) => {
|
|
@@ -1730,8 +1939,8 @@ function initializeMCPServer(apiClient, authContext) {
|
|
|
1730
1939
|
{
|
|
1731
1940
|
description: "Document implementation decisions. Notes persist for future reference and handoff.",
|
|
1732
1941
|
inputSchema: {
|
|
1733
|
-
taskId:
|
|
1734
|
-
content:
|
|
1942
|
+
taskId: import_zod4.z.string().describe("The task ID"),
|
|
1943
|
+
content: import_zod4.z.string().describe("Note content (max 500 chars)")
|
|
1735
1944
|
}
|
|
1736
1945
|
},
|
|
1737
1946
|
async (args) => {
|
|
@@ -1760,9 +1969,9 @@ function initializeMCPServer(apiClient, authContext) {
|
|
|
1760
1969
|
{
|
|
1761
1970
|
description: "Release task assignment and optionally clean up branch. Task returns to TODO. Use after errors.",
|
|
1762
1971
|
inputSchema: {
|
|
1763
|
-
projectId:
|
|
1764
|
-
taskId:
|
|
1765
|
-
deleteBranch:
|
|
1972
|
+
projectId: import_zod4.z.string().describe("The project ID"),
|
|
1973
|
+
taskId: import_zod4.z.string().describe("The task ID to abandon"),
|
|
1974
|
+
deleteBranch: import_zod4.z.boolean().optional().describe("Whether to delete the associated branch")
|
|
1766
1975
|
}
|
|
1767
1976
|
},
|
|
1768
1977
|
async (args) => {
|
|
@@ -1796,9 +2005,9 @@ function initializeMCPServer(apiClient, authContext) {
|
|
|
1796
2005
|
{
|
|
1797
2006
|
description: "Report a branch created by the agent. Call after using git to create and push a branch. Task must be IN_PROGRESS.",
|
|
1798
2007
|
inputSchema: {
|
|
1799
|
-
projectId:
|
|
1800
|
-
taskId:
|
|
1801
|
-
branchName:
|
|
2008
|
+
projectId: import_zod4.z.string().describe("The project ID"),
|
|
2009
|
+
taskId: import_zod4.z.string().describe("The task ID"),
|
|
2010
|
+
branchName: import_zod4.z.string().describe("Name of the branch created (e.g., feature/TASK-123-fix-login)")
|
|
1802
2011
|
}
|
|
1803
2012
|
},
|
|
1804
2013
|
async (args) => {
|
|
@@ -1832,10 +2041,10 @@ function initializeMCPServer(apiClient, authContext) {
|
|
|
1832
2041
|
{
|
|
1833
2042
|
description: "Report a PR created by the agent. Call after using gh pr create. Transitions task to REVIEW state.",
|
|
1834
2043
|
inputSchema: {
|
|
1835
|
-
projectId:
|
|
1836
|
-
taskId:
|
|
1837
|
-
pullRequestUrl:
|
|
1838
|
-
pullRequestNumber:
|
|
2044
|
+
projectId: import_zod4.z.string().describe("The project ID"),
|
|
2045
|
+
taskId: import_zod4.z.string().describe("The task ID"),
|
|
2046
|
+
pullRequestUrl: import_zod4.z.string().describe("Full URL of the created PR (e.g., https://github.com/owner/repo/pull/123)"),
|
|
2047
|
+
pullRequestNumber: import_zod4.z.number().describe("PR number (e.g., 123)")
|
|
1839
2048
|
}
|
|
1840
2049
|
},
|
|
1841
2050
|
async (args) => {
|
|
@@ -1870,8 +2079,8 @@ function initializeMCPServer(apiClient, authContext) {
|
|
|
1870
2079
|
{
|
|
1871
2080
|
description: "Soft-delete a task. Hidden but restorable via unarchive_task.",
|
|
1872
2081
|
inputSchema: {
|
|
1873
|
-
projectId:
|
|
1874
|
-
taskId:
|
|
2082
|
+
projectId: import_zod4.z.string().describe("The project ID"),
|
|
2083
|
+
taskId: import_zod4.z.string().describe("The task ID to archive")
|
|
1875
2084
|
}
|
|
1876
2085
|
},
|
|
1877
2086
|
async (args) => {
|
|
@@ -1904,8 +2113,8 @@ function initializeMCPServer(apiClient, authContext) {
|
|
|
1904
2113
|
{
|
|
1905
2114
|
description: "Restore previously archived task to original state.",
|
|
1906
2115
|
inputSchema: {
|
|
1907
|
-
projectId:
|
|
1908
|
-
taskId:
|
|
2116
|
+
projectId: import_zod4.z.string().describe("The project ID"),
|
|
2117
|
+
taskId: import_zod4.z.string().describe("The task ID to restore")
|
|
1909
2118
|
}
|
|
1910
2119
|
},
|
|
1911
2120
|
async (args) => {
|
|
@@ -1938,9 +2147,9 @@ function initializeMCPServer(apiClient, authContext) {
|
|
|
1938
2147
|
{
|
|
1939
2148
|
description: "Create new project in personal workspace linked to GitHub repository.",
|
|
1940
2149
|
inputSchema: {
|
|
1941
|
-
name:
|
|
1942
|
-
description:
|
|
1943
|
-
repositoryUrl:
|
|
2150
|
+
name: import_zod4.z.string().describe("Project name (max 100 chars)"),
|
|
2151
|
+
description: import_zod4.z.string().optional().describe("Project description (max 500 chars)"),
|
|
2152
|
+
repositoryUrl: import_zod4.z.string().describe("GitHub repository URL")
|
|
1944
2153
|
}
|
|
1945
2154
|
},
|
|
1946
2155
|
async (args) => {
|
|
@@ -1974,14 +2183,14 @@ function initializeMCPServer(apiClient, authContext) {
|
|
|
1974
2183
|
{
|
|
1975
2184
|
description: "Create task with title, description, acceptance criteria. Starts in DRAFT. Priority: LOW/MEDIUM/HIGH/CRITICAL.",
|
|
1976
2185
|
inputSchema: {
|
|
1977
|
-
projectId:
|
|
1978
|
-
epicId:
|
|
1979
|
-
title:
|
|
1980
|
-
description:
|
|
1981
|
-
priority:
|
|
1982
|
-
acceptanceCriteria:
|
|
1983
|
-
|
|
1984
|
-
description:
|
|
2186
|
+
projectId: import_zod4.z.string().describe("The project ID to create the task in"),
|
|
2187
|
+
epicId: import_zod4.z.string().nullable().optional().describe("Optional epic ID to associate the task with"),
|
|
2188
|
+
title: import_zod4.z.string().describe("Task title (max 200 chars)"),
|
|
2189
|
+
description: import_zod4.z.string().describe("Task description (max 5000 chars)"),
|
|
2190
|
+
priority: import_zod4.z.nativeEnum(TaskPriority).optional().describe("Task priority: LOW, MEDIUM, HIGH, CRITICAL (default: MEDIUM)"),
|
|
2191
|
+
acceptanceCriteria: import_zod4.z.array(
|
|
2192
|
+
import_zod4.z.object({
|
|
2193
|
+
description: import_zod4.z.string().describe("Acceptance criterion description (max 500 chars)")
|
|
1985
2194
|
})
|
|
1986
2195
|
).describe("Array of acceptance criteria (at least 1 required)")
|
|
1987
2196
|
}
|
|
@@ -2020,10 +2229,10 @@ function initializeMCPServer(apiClient, authContext) {
|
|
|
2020
2229
|
{
|
|
2021
2230
|
description: "Return task from REVIEW to IN_PROGRESS with feedback. Original assignee addresses changes.",
|
|
2022
2231
|
inputSchema: {
|
|
2023
|
-
projectId:
|
|
2024
|
-
taskId:
|
|
2025
|
-
reviewComments:
|
|
2026
|
-
requestedChanges:
|
|
2232
|
+
projectId: import_zod4.z.string().describe("The project ID"),
|
|
2233
|
+
taskId: import_zod4.z.string().describe("The task ID to review"),
|
|
2234
|
+
reviewComments: import_zod4.z.string().describe("Review comments explaining requested changes (max 5000 chars)"),
|
|
2235
|
+
requestedChanges: import_zod4.z.array(import_zod4.z.string()).optional().describe("List of specific changes requested")
|
|
2027
2236
|
}
|
|
2028
2237
|
},
|
|
2029
2238
|
async (args) => {
|
|
@@ -2058,9 +2267,9 @@ function initializeMCPServer(apiClient, authContext) {
|
|
|
2058
2267
|
{
|
|
2059
2268
|
description: "Approve completed work and mark DONE. Only for REVIEW state tasks.",
|
|
2060
2269
|
inputSchema: {
|
|
2061
|
-
projectId:
|
|
2062
|
-
taskId:
|
|
2063
|
-
reviewComments:
|
|
2270
|
+
projectId: import_zod4.z.string().describe("The project ID"),
|
|
2271
|
+
taskId: import_zod4.z.string().describe("The task ID to approve"),
|
|
2272
|
+
reviewComments: import_zod4.z.string().optional().describe("Optional approval comments (max 2000 chars)")
|
|
2064
2273
|
}
|
|
2065
2274
|
},
|
|
2066
2275
|
async (args) => {
|
|
@@ -2094,10 +2303,10 @@ function initializeMCPServer(apiClient, authContext) {
|
|
|
2094
2303
|
{
|
|
2095
2304
|
description: "Verify a DRAFT task and move it to TODO state. Requires task to pass programmatic validation (title 10+ chars, description 50+ chars, each criterion 20+ chars). If approved=false, stores feedback with NEEDS_REVISION status.",
|
|
2096
2305
|
inputSchema: {
|
|
2097
|
-
projectId:
|
|
2098
|
-
taskId:
|
|
2099
|
-
approved:
|
|
2100
|
-
feedback:
|
|
2306
|
+
projectId: import_zod4.z.string().describe("The project ID"),
|
|
2307
|
+
taskId: import_zod4.z.string().describe("The task ID to verify"),
|
|
2308
|
+
approved: import_zod4.z.boolean().describe("Whether to approve the task"),
|
|
2309
|
+
feedback: import_zod4.z.string().optional().describe("Feedback for the task (required if not approved)")
|
|
2101
2310
|
}
|
|
2102
2311
|
},
|
|
2103
2312
|
async (args) => {
|
|
@@ -2128,8 +2337,8 @@ function initializeMCPServer(apiClient, authContext) {
|
|
|
2128
2337
|
{
|
|
2129
2338
|
description: "Get state-appropriate prompt for a task. Returns verify prompt for DRAFT, assignment prompt for TODO, or continue prompt for IN_PROGRESS tasks.",
|
|
2130
2339
|
inputSchema: {
|
|
2131
|
-
projectId:
|
|
2132
|
-
taskId:
|
|
2340
|
+
projectId: import_zod4.z.string().describe("The project ID"),
|
|
2341
|
+
taskId: import_zod4.z.string().describe("The task ID")
|
|
2133
2342
|
}
|
|
2134
2343
|
},
|
|
2135
2344
|
async (args) => {
|
|
@@ -2162,15 +2371,15 @@ function initializeMCPServer(apiClient, authContext) {
|
|
|
2162
2371
|
{
|
|
2163
2372
|
description: "Update task details (title, description, priority, acceptanceCriteria). Only works for DRAFT and TODO states. If task is in TODO state, it reverts to DRAFT and requires re-verification.",
|
|
2164
2373
|
inputSchema: {
|
|
2165
|
-
projectId:
|
|
2166
|
-
taskId:
|
|
2167
|
-
title:
|
|
2168
|
-
description:
|
|
2169
|
-
priority:
|
|
2170
|
-
acceptanceCriteria:
|
|
2171
|
-
|
|
2172
|
-
id:
|
|
2173
|
-
description:
|
|
2374
|
+
projectId: import_zod4.z.string().describe("The project ID"),
|
|
2375
|
+
taskId: import_zod4.z.string().describe("The task ID to update"),
|
|
2376
|
+
title: import_zod4.z.string().optional().describe("New task title"),
|
|
2377
|
+
description: import_zod4.z.string().optional().describe("New task description"),
|
|
2378
|
+
priority: import_zod4.z.nativeEnum(TaskPriority).optional().describe("New task priority"),
|
|
2379
|
+
acceptanceCriteria: import_zod4.z.array(
|
|
2380
|
+
import_zod4.z.object({
|
|
2381
|
+
id: import_zod4.z.string().optional().describe("Existing criterion ID (for updates)"),
|
|
2382
|
+
description: import_zod4.z.string().describe("Criterion description")
|
|
2174
2383
|
})
|
|
2175
2384
|
).optional().describe("New acceptance criteria (replaces existing)")
|
|
2176
2385
|
}
|
|
@@ -2278,12 +2487,12 @@ function handleApiError(error) {
|
|
|
2278
2487
|
isError: true
|
|
2279
2488
|
};
|
|
2280
2489
|
}
|
|
2281
|
-
var ActiveTaskSchema =
|
|
2282
|
-
taskId:
|
|
2283
|
-
projectId:
|
|
2284
|
-
branchName:
|
|
2285
|
-
worktreePath:
|
|
2286
|
-
startedAt:
|
|
2490
|
+
var ActiveTaskSchema = import_zod4.z.object({
|
|
2491
|
+
taskId: import_zod4.z.string().min(1),
|
|
2492
|
+
projectId: import_zod4.z.string().min(1),
|
|
2493
|
+
branchName: import_zod4.z.string().optional(),
|
|
2494
|
+
worktreePath: import_zod4.z.string().optional(),
|
|
2495
|
+
startedAt: import_zod4.z.string().optional()
|
|
2287
2496
|
});
|
|
2288
2497
|
async function checkActiveTask() {
|
|
2289
2498
|
const fs = await import("fs");
|
|
@@ -2381,7 +2590,7 @@ Example mcp.json configuration:
|
|
|
2381
2590
|
"mcpServers": {
|
|
2382
2591
|
"collab": {
|
|
2383
2592
|
"command": "npx",
|
|
2384
|
-
"args": ["@mtaap/mcp"],
|
|
2593
|
+
"args": ["-p", "@mtaap/mcp", "collab-mcp"],
|
|
2385
2594
|
"env": {
|
|
2386
2595
|
"COLLAB_API_KEY": "collab_your_api_key_here",
|
|
2387
2596
|
"COLLAB_BASE_URL": "https://collab.mtaap.de"
|
|
@@ -2416,7 +2625,7 @@ function validateEnvironment() {
|
|
|
2416
2625
|
"mcpServers": {
|
|
2417
2626
|
"collab": {
|
|
2418
2627
|
"command": "npx",
|
|
2419
|
-
"args": ["@mtaap/mcp"],
|
|
2628
|
+
"args": ["-p", "@mtaap/mcp", "collab-mcp"],
|
|
2420
2629
|
"env": {
|
|
2421
2630
|
"COLLAB_API_KEY": "collab_your_api_key_here",
|
|
2422
2631
|
"COLLAB_BASE_URL": "https://collab.mtaap.de"
|