@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/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.2.12",
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 import_zod3 = require("zod");
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/version.js
230
- var VERSION2 = "0.1.0";
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.REVENUECAT_PUBLIC_API_KEY,
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 ListProjectsInputSchema = import_zod2.z.object({
478
- workspaceType: import_zod2.z.preprocess((val) => typeof val === "string" ? val.toUpperCase() : val, import_zod2.z.enum(["TEAM", "PERSONAL", "ALL"]).optional())
479
- });
480
- var ListTasksInputSchema = import_zod2.z.object({
481
- projectId: import_zod2.z.string().optional(),
482
- state: import_zod2.z.nativeEnum(TaskState).optional(),
483
- assigneeId: import_zod2.z.string().optional(),
484
- includeArchived: import_zod2.z.boolean().optional()
485
- });
486
- var cuidOrPrefixedId = import_zod2.z.string().regex(/^([a-z0-9]+|[a-z]+_[a-zA-Z0-9]+)$/);
487
- var gitBranchName = import_zod2.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");
488
- var GetTaskInputSchema = import_zod2.z.object({
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 = import_zod2.z.object({
683
+ var AssignTaskInputSchema = import_zod3.z.object({
492
684
  projectId: cuidOrPrefixedId,
493
685
  taskId: cuidOrPrefixedId,
494
- expectedState: import_zod2.z.nativeEnum(TaskState).default(TaskState.TODO)
686
+ expectedState: import_zod3.z.nativeEnum(TaskState).default(TaskState.TODO)
495
687
  });
496
- var UpdateProgressInputSchema = import_zod2.z.object({
688
+ var UpdateProgressInputSchema = import_zod3.z.object({
497
689
  taskId: cuidOrPrefixedId,
498
- statusMessage: import_zod2.z.string().max(1e3).optional(),
499
- completedCheckpointIds: import_zod2.z.array(import_zod2.z.string()).optional(),
500
- currentCheckpointIndex: import_zod2.z.number().int().optional()
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 = import_zod2.z.object({
694
+ var CompleteTaskInputSchema = import_zod3.z.object({
503
695
  projectId: cuidOrPrefixedId,
504
696
  taskId: cuidOrPrefixedId,
505
- pullRequestTitle: import_zod2.z.string().min(1).max(300).optional(),
506
- pullRequestBody: import_zod2.z.string().max(1e4).optional()
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 = import_zod2.z.object({
700
+ var ReportErrorInputSchema = import_zod3.z.object({
509
701
  taskId: cuidOrPrefixedId,
510
- errorType: import_zod2.z.nativeEnum(ErrorType),
511
- errorMessage: import_zod2.z.string().min(1).max(1e3),
512
- context: import_zod2.z.string().max(2e3).optional()
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 = import_zod2.z.object({
706
+ var GetProjectContextInputSchema = import_zod3.z.object({
515
707
  projectId: cuidOrPrefixedId
516
708
  });
517
- var AddNoteInputSchema = import_zod2.z.object({
709
+ var AddNoteInputSchema = import_zod3.z.object({
518
710
  taskId: cuidOrPrefixedId,
519
- content: import_zod2.z.string().min(1).max(500)
711
+ content: import_zod3.z.string().min(1).max(500)
520
712
  });
521
- var AbandonTaskInputSchema = import_zod2.z.object({
713
+ var AbandonTaskInputSchema = import_zod3.z.object({
522
714
  projectId: cuidOrPrefixedId,
523
715
  taskId: cuidOrPrefixedId,
524
- deleteBranch: import_zod2.z.boolean().optional()
716
+ deleteBranch: import_zod3.z.boolean().optional()
525
717
  });
526
- var RequestChangesInputSchema = import_zod2.z.object({
718
+ var RequestChangesInputSchema = import_zod3.z.object({
527
719
  projectId: cuidOrPrefixedId,
528
720
  taskId: cuidOrPrefixedId,
529
- reviewComments: import_zod2.z.string().min(1).max(5e3),
530
- requestedChanges: import_zod2.z.array(import_zod2.z.string().min(1).max(500)).optional()
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 = import_zod2.z.object({
724
+ var ApproveTaskInputSchema = import_zod3.z.object({
533
725
  projectId: cuidOrPrefixedId,
534
726
  taskId: cuidOrPrefixedId,
535
- reviewComments: import_zod2.z.string().max(2e3).optional()
727
+ reviewComments: import_zod3.z.string().max(2e3).optional()
536
728
  });
537
- var ArchiveTaskInputSchema = import_zod2.z.object({
729
+ var ArchiveTaskInputSchema = import_zod3.z.object({
538
730
  projectId: cuidOrPrefixedId,
539
731
  taskId: cuidOrPrefixedId
540
732
  });
541
- var UnarchiveTaskInputSchema = import_zod2.z.object({
733
+ var UnarchiveTaskInputSchema = import_zod3.z.object({
542
734
  projectId: cuidOrPrefixedId,
543
735
  taskId: cuidOrPrefixedId
544
736
  });
545
- var CreatePersonalProjectInputSchema = import_zod2.z.object({
546
- name: import_zod2.z.string().min(1).max(100),
547
- description: import_zod2.z.string().max(500).optional(),
548
- repositoryUrl: import_zod2.z.string().url()
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 = import_zod2.z.object({});
551
- var CreateTaskMCPInputSchema = import_zod2.z.object({
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: import_zod2.z.string().min(1).max(200),
555
- description: import_zod2.z.string().max(5e3),
556
- priority: import_zod2.z.nativeEnum(TaskPriority).default(TaskPriority.MEDIUM),
557
- acceptanceCriteria: import_zod2.z.array(import_zod2.z.object({
558
- description: import_zod2.z.string().min(1).max(500)
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 = import_zod2.z.object({
562
- name: import_zod2.z.string().min(1).max(255),
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 = import_zod2.z.object({
756
+ var UpdateOrganizationInputSchema = import_zod3.z.object({
566
757
  organizationId: cuidOrPrefixedId,
567
- name: import_zod2.z.string().min(1).max(255).optional(),
568
- logoUrl: import_zod2.z.string().url().nullable().optional(),
569
- accentColor: import_zod2.z.string().regex(/^#[0-9A-Fa-f]{6}$/, "Invalid hex color format. Expected #RRGGBB").nullable().optional(),
570
- tenantName: import_zod2.z.string().max(255).nullable().optional()
571
- });
572
- var CreateProjectInputSchema = import_zod2.z.object({
573
- name: import_zod2.z.string().min(1).max(100),
574
- description: import_zod2.z.string().max(500).optional(),
575
- type: import_zod2.z.nativeEnum(ProjectType),
576
- repositoryUrl: import_zod2.z.string().url(),
577
- baseBranch: import_zod2.z.string().default("develop").optional(),
578
- tags: import_zod2.z.array(import_zod2.z.string()).default([])
579
- });
580
- var UpdateProjectInputSchema = import_zod2.z.object({
581
- projectId: import_zod2.z.string().min(1).optional(),
582
- name: import_zod2.z.string().min(1).max(100).optional(),
583
- description: import_zod2.z.string().max(500).optional(),
584
- repositoryUrl: import_zod2.z.string().url().optional(),
585
- baseBranch: import_zod2.z.string().optional(),
586
- tags: import_zod2.z.array(import_zod2.z.string()).optional(),
587
- allowMemberArchive: import_zod2.z.boolean().optional()
588
- });
589
- var CreateEpicInputSchema = import_zod2.z.object({
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: import_zod2.z.string().min(1).max(200),
592
- description: import_zod2.z.string().max(2e3).optional()
593
- });
594
- var CreateTaskInputSchema = import_zod2.z.object({
595
- projectId: import_zod2.z.string().min(1),
596
- epicId: import_zod2.z.string().min(1).nullable().optional(),
597
- title: import_zod2.z.string().min(1).max(200),
598
- description: import_zod2.z.string().max(5e3),
599
- priority: import_zod2.z.nativeEnum(TaskPriority).default(TaskPriority.MEDIUM),
600
- acceptanceCriteria: import_zod2.z.array(import_zod2.z.object({
601
- description: import_zod2.z.string().min(1).max(500)
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 = import_zod2.z.object({
605
- taskId: import_zod2.z.string().min(1),
606
- title: import_zod2.z.string().min(1).max(200).optional(),
607
- description: import_zod2.z.string().max(5e3).optional(),
608
- priority: import_zod2.z.nativeEnum(TaskPriority).optional(),
609
- state: import_zod2.z.nativeEnum(TaskState).optional(),
610
- assigneeId: import_zod2.z.string().nullable().optional(),
611
- acceptanceCriteria: import_zod2.z.array(import_zod2.z.object({
612
- id: import_zod2.z.string().optional(),
613
- description: import_zod2.z.string().min(1).max(500),
614
- completed: import_zod2.z.boolean().optional()
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 = import_zod2.z.object({
618
- taskId: import_zod2.z.string().min(1),
619
- userId: import_zod2.z.string().min(1)
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 = import_zod2.z.object({
812
+ var CreateTagInputSchema = import_zod3.z.object({
622
813
  organizationId: cuidOrPrefixedId,
623
- name: import_zod2.z.string().min(1).max(50).regex(/^[a-zA-Z0-9\s-]+$/)
814
+ name: import_zod3.z.string().min(1).max(50).regex(/^[a-zA-Z0-9\s-]+$/)
624
815
  });
625
- var UpdateTagInputSchema = import_zod2.z.object({
626
- name: import_zod2.z.string().min(1).max(50).regex(/^[a-zA-Z0-9\s-]+$/)
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 = import_zod2.z.object({
819
+ var UpdateOrganizationSettingsInputSchema = import_zod3.z.object({
629
820
  organizationId: cuidOrPrefixedId,
630
- ldapEnabled: import_zod2.z.boolean().optional(),
631
- ldapUrl: import_zod2.z.string().url().nullable().optional(),
632
- ldapBindDN: import_zod2.z.string().nullable().optional(),
633
- ldapSearchBase: import_zod2.z.string().nullable().optional(),
634
- deleteMergedBranches: import_zod2.z.boolean().optional(),
635
- enforceConventionalCommits: import_zod2.z.boolean().optional(),
636
- maxPersonalProjectsPerUser: import_zod2.z.number().int().min(0).optional(),
637
- logoUrl: import_zod2.z.string().url().nullable().optional(),
638
- accentColor: import_zod2.z.string().regex(/^#[0-9A-Fa-f]{6}$/, "Invalid hex color format. Expected #RRGGBB").nullable().optional(),
639
- tenantName: import_zod2.z.string().max(255).nullable().optional()
640
- });
641
- var InviteUserInputSchema = import_zod2.z.object({
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: import_zod2.z.string().email(),
644
- role: import_zod2.z.nativeEnum(UserRole).default(UserRole.MEMBER),
645
- tags: import_zod2.z.array(import_zod2.z.string()).default([])
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 = import_zod2.z.object({
838
+ var AssignUserTagsInputSchema = import_zod3.z.object({
648
839
  userId: cuidOrPrefixedId,
649
- tags: import_zod2.z.array(import_zod2.z.string()).min(0)
840
+ tags: import_zod3.z.array(import_zod3.z.string()).min(0)
650
841
  });
651
- var InviteCollaboratorInputSchema = import_zod2.z.object({
842
+ var InviteCollaboratorInputSchema = import_zod3.z.object({
652
843
  projectId: cuidOrPrefixedId,
653
- email: import_zod2.z.string().email()
844
+ email: import_zod3.z.string().email()
654
845
  });
655
- var PublishProjectInputSchema = import_zod2.z.object({
846
+ var PublishProjectInputSchema = import_zod3.z.object({
656
847
  projectId: cuidOrPrefixedId,
657
- transferOwnership: import_zod2.z.boolean().default(false),
658
- tags: import_zod2.z.array(import_zod2.z.string()).min(1)
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 = import_zod2.z.object({
661
- name: import_zod2.z.string().min(1).max(100),
662
- expiresInDays: import_zod2.z.number().int().min(1).max(365).default(90),
663
- permissions: import_zod2.z.nativeEnum(ApiKeyPermission).default(ApiKeyPermission.WRITE)
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 RevokeApiKeyInputSchema = import_zod2.z.object({
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 = import_zod2.z.object({
669
- email: import_zod2.z.string().email(),
670
- password: import_zod2.z.string().min(8).max(255)
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 = import_zod2.z.object({
673
- email: import_zod2.z.string().email(),
674
- password: import_zod2.z.string().min(8).max(255),
675
- name: import_zod2.z.string().min(1).max(255),
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 = import_zod2.z.object({
874
+ var VerifyTaskInputSchema = import_zod3.z.object({
679
875
  projectId: cuidOrPrefixedId,
680
876
  taskId: cuidOrPrefixedId,
681
- approved: import_zod2.z.boolean(),
682
- feedback: import_zod2.z.string().max(5e3).optional()
877
+ approved: import_zod3.z.boolean(),
878
+ feedback: import_zod3.z.string().max(5e3).optional()
683
879
  });
684
- var GetTaskPromptInputSchema = import_zod2.z.object({
880
+ var GetTaskPromptInputSchema = import_zod3.z.object({
685
881
  projectId: cuidOrPrefixedId,
686
882
  taskId: cuidOrPrefixedId
687
883
  });
688
- var UpdateTaskMCPInputSchema = import_zod2.z.object({
884
+ var UpdateTaskMCPInputSchema = import_zod3.z.object({
689
885
  projectId: cuidOrPrefixedId,
690
886
  taskId: cuidOrPrefixedId,
691
- title: import_zod2.z.string().min(1).max(200).optional(),
692
- description: import_zod2.z.string().max(5e3).optional(),
693
- priority: import_zod2.z.nativeEnum(TaskPriority).optional(),
694
- acceptanceCriteria: import_zod2.z.array(import_zod2.z.object({
695
- id: import_zod2.z.string().optional(),
696
- description: import_zod2.z.string().min(1).max(500)
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 = import_zod2.z.object({
895
+ var ReportBranchInputSchema = import_zod3.z.object({
700
896
  projectId: cuidOrPrefixedId,
701
897
  taskId: cuidOrPrefixedId,
702
898
  branchName: gitBranchName
703
899
  });
704
- var ReportPRInputSchema = import_zod2.z.object({
900
+ var ReportPRInputSchema = import_zod3.z.object({
705
901
  projectId: cuidOrPrefixedId,
706
902
  taskId: cuidOrPrefixedId,
707
- pullRequestUrl: import_zod2.z.string().url(),
708
- pullRequestNumber: import_zod2.z.number().int().positive()
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: import_zod3.z.enum(["TEAM", "PERSONAL", "ALL"]).optional().describe("Filter by workspace type")
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: import_zod3.z.string().optional().describe("Filter by project ID"),
1473
- state: import_zod3.z.nativeEnum(TaskState).optional().describe("Filter by task state"),
1474
- assigneeId: import_zod3.z.string().optional().describe("Filter by assignee ID"),
1475
- includeArchived: import_zod3.z.boolean().optional().describe("Include archived tasks (default: false)")
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: import_zod3.z.string().describe("The task ID to retrieve")
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: import_zod3.z.string().describe("The project ID"),
1533
- taskId: import_zod3.z.string().describe("The task ID to assign"),
1534
- expectedState: import_zod3.z.nativeEnum(TaskState).optional().describe("Expected task state (default: TODO)")
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: import_zod3.z.string().describe("The task ID to update"),
1569
- statusMessage: import_zod3.z.string().optional().describe("Status message (max 1000 chars)"),
1570
- completedCheckpointIds: import_zod3.z.array(import_zod3.z.string()).optional().describe("Array of completed checkpoint IDs"),
1571
- currentCheckpointIndex: import_zod3.z.number().optional().describe("Current checkpoint index")
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: import_zod3.z.string().describe("The project ID"),
1606
- taskId: import_zod3.z.string().describe("The task ID to complete"),
1607
- pullRequestTitle: import_zod3.z.string().optional().describe("PR title (max 300 chars)"),
1608
- pullRequestBody: import_zod3.z.string().optional().describe("PR body/description (max 10000 chars)")
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: import_zod3.z.string().describe("The task ID"),
1666
- errorType: import_zod3.z.nativeEnum(ErrorType).describe("Error type: BUILD_FAILURE, TEST_FAILURE, CONFLICT, AUTH_ERROR, OTHER"),
1667
- errorMessage: import_zod3.z.string().describe("Error message (max 1000 chars)"),
1668
- context: import_zod3.z.string().optional().describe("Additional context (max 2000 chars)")
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: import_zod3.z.string().describe("The project ID")
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: import_zod3.z.string().describe("The task ID"),
1734
- content: import_zod3.z.string().describe("Note content (max 500 chars)")
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: import_zod3.z.string().describe("The project ID"),
1764
- taskId: import_zod3.z.string().describe("The task ID to abandon"),
1765
- deleteBranch: import_zod3.z.boolean().optional().describe("Whether to delete the associated branch")
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: import_zod3.z.string().describe("The project ID"),
1800
- taskId: import_zod3.z.string().describe("The task ID"),
1801
- branchName: import_zod3.z.string().describe("Name of the branch created (e.g., feature/TASK-123-fix-login)")
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: import_zod3.z.string().describe("The project ID"),
1836
- taskId: import_zod3.z.string().describe("The task ID"),
1837
- pullRequestUrl: import_zod3.z.string().describe("Full URL of the created PR (e.g., https://github.com/owner/repo/pull/123)"),
1838
- pullRequestNumber: import_zod3.z.number().describe("PR number (e.g., 123)")
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: import_zod3.z.string().describe("The project ID"),
1874
- taskId: import_zod3.z.string().describe("The task ID to archive")
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: import_zod3.z.string().describe("The project ID"),
1908
- taskId: import_zod3.z.string().describe("The task ID to restore")
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: import_zod3.z.string().describe("Project name (max 100 chars)"),
1942
- description: import_zod3.z.string().optional().describe("Project description (max 500 chars)"),
1943
- repositoryUrl: import_zod3.z.string().describe("GitHub repository URL")
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: import_zod3.z.string().describe("The project ID to create the task in"),
1978
- epicId: import_zod3.z.string().nullable().optional().describe("Optional epic ID to associate the task with"),
1979
- title: import_zod3.z.string().describe("Task title (max 200 chars)"),
1980
- description: import_zod3.z.string().describe("Task description (max 5000 chars)"),
1981
- priority: import_zod3.z.nativeEnum(TaskPriority).optional().describe("Task priority: LOW, MEDIUM, HIGH, CRITICAL (default: MEDIUM)"),
1982
- acceptanceCriteria: import_zod3.z.array(
1983
- import_zod3.z.object({
1984
- description: import_zod3.z.string().describe("Acceptance criterion description (max 500 chars)")
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: import_zod3.z.string().describe("The project ID"),
2024
- taskId: import_zod3.z.string().describe("The task ID to review"),
2025
- reviewComments: import_zod3.z.string().describe("Review comments explaining requested changes (max 5000 chars)"),
2026
- requestedChanges: import_zod3.z.array(import_zod3.z.string()).optional().describe("List of specific changes requested")
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: import_zod3.z.string().describe("The project ID"),
2062
- taskId: import_zod3.z.string().describe("The task ID to approve"),
2063
- reviewComments: import_zod3.z.string().optional().describe("Optional approval comments (max 2000 chars)")
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: import_zod3.z.string().describe("The project ID"),
2098
- taskId: import_zod3.z.string().describe("The task ID to verify"),
2099
- approved: import_zod3.z.boolean().describe("Whether to approve the task"),
2100
- feedback: import_zod3.z.string().optional().describe("Feedback for the task (required if not approved)")
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: import_zod3.z.string().describe("The project ID"),
2132
- taskId: import_zod3.z.string().describe("The task ID")
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: import_zod3.z.string().describe("The project ID"),
2166
- taskId: import_zod3.z.string().describe("The task ID to update"),
2167
- title: import_zod3.z.string().optional().describe("New task title"),
2168
- description: import_zod3.z.string().optional().describe("New task description"),
2169
- priority: import_zod3.z.nativeEnum(TaskPriority).optional().describe("New task priority"),
2170
- acceptanceCriteria: import_zod3.z.array(
2171
- import_zod3.z.object({
2172
- id: import_zod3.z.string().optional().describe("Existing criterion ID (for updates)"),
2173
- description: import_zod3.z.string().describe("Criterion 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 = import_zod3.z.object({
2282
- taskId: import_zod3.z.string().min(1),
2283
- projectId: import_zod3.z.string().min(1),
2284
- branchName: import_zod3.z.string().optional(),
2285
- worktreePath: import_zod3.z.string().optional(),
2286
- startedAt: import_zod3.z.string().optional()
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"