@octopusdeploy/mcp-server 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/README.md +56 -20
  2. package/dist/helpers/errorHandling.d.ts +35 -0
  3. package/dist/helpers/errorHandling.d.ts.map +1 -0
  4. package/dist/helpers/errorHandling.js +72 -0
  5. package/dist/helpers/errorHandling.js.map +1 -0
  6. package/dist/helpers/getClientConfigurationFromEnvironment.js +1 -1
  7. package/dist/helpers/getClientConfigurationFromEnvironment.js.map +1 -1
  8. package/dist/helpers/spaceResolver.d.ts +4 -0
  9. package/dist/helpers/spaceResolver.d.ts.map +1 -0
  10. package/dist/helpers/spaceResolver.js +18 -0
  11. package/dist/helpers/spaceResolver.js.map +1 -0
  12. package/dist/helpers/urlParser.d.ts +16 -0
  13. package/dist/helpers/urlParser.d.ts.map +1 -0
  14. package/dist/helpers/urlParser.js +83 -0
  15. package/dist/helpers/urlParser.js.map +1 -0
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +7 -7
  18. package/dist/index.js.map +1 -1
  19. package/dist/tools/createRelease.d.ts +3 -0
  20. package/dist/tools/createRelease.d.ts.map +1 -0
  21. package/dist/tools/createRelease.js +108 -0
  22. package/dist/tools/createRelease.js.map +1 -0
  23. package/dist/tools/deployRelease.d.ts +3 -0
  24. package/dist/tools/deployRelease.d.ts.map +1 -0
  25. package/dist/tools/deployRelease.js +207 -0
  26. package/dist/tools/deployRelease.js.map +1 -0
  27. package/dist/tools/findAccounts.d.ts +3 -0
  28. package/dist/tools/findAccounts.d.ts.map +1 -0
  29. package/dist/tools/findAccounts.js +87 -0
  30. package/dist/tools/findAccounts.js.map +1 -0
  31. package/dist/tools/findCertificates.d.ts +3 -0
  32. package/dist/tools/findCertificates.d.ts.map +1 -0
  33. package/dist/tools/findCertificates.js +95 -0
  34. package/dist/tools/findCertificates.js.map +1 -0
  35. package/dist/tools/findDeploymentTargets.d.ts +3 -0
  36. package/dist/tools/findDeploymentTargets.d.ts.map +1 -0
  37. package/dist/tools/findDeploymentTargets.js +158 -0
  38. package/dist/tools/findDeploymentTargets.js.map +1 -0
  39. package/dist/tools/findReleases.d.ts +3 -0
  40. package/dist/tools/findReleases.d.ts.map +1 -0
  41. package/dist/tools/findReleases.js +96 -0
  42. package/dist/tools/findReleases.js.map +1 -0
  43. package/dist/tools/findTenants.d.ts +19 -0
  44. package/dist/tools/findTenants.d.ts.map +1 -0
  45. package/dist/tools/findTenants.js +130 -0
  46. package/dist/tools/findTenants.js.map +1 -0
  47. package/dist/tools/getBranches.d.ts.map +1 -1
  48. package/dist/tools/getBranches.js +38 -23
  49. package/dist/tools/getBranches.js.map +1 -1
  50. package/dist/tools/getCurrentUser.d.ts.map +1 -1
  51. package/dist/tools/getCurrentUser.js +27 -21
  52. package/dist/tools/getCurrentUser.js.map +1 -1
  53. package/dist/tools/getDeploymentFromUrl.d.ts +52 -0
  54. package/dist/tools/getDeploymentFromUrl.d.ts.map +1 -0
  55. package/dist/tools/getDeploymentFromUrl.js +134 -0
  56. package/dist/tools/getDeploymentFromUrl.js.map +1 -0
  57. package/dist/tools/getDeploymentProcess.d.ts.map +1 -1
  58. package/dist/tools/getDeploymentProcess.js +48 -13
  59. package/dist/tools/getDeploymentProcess.js.map +1 -1
  60. package/dist/tools/getKubernetesLiveStatus.d.ts.map +1 -1
  61. package/dist/tools/getKubernetesLiveStatus.js +57 -38
  62. package/dist/tools/getKubernetesLiveStatus.js.map +1 -1
  63. package/dist/tools/getMissingTenantVariables.d.ts.map +1 -1
  64. package/dist/tools/getMissingTenantVariables.js +45 -16
  65. package/dist/tools/getMissingTenantVariables.js.map +1 -1
  66. package/dist/tools/getTaskById.d.ts.map +1 -1
  67. package/dist/tools/getTaskById.js +24 -17
  68. package/dist/tools/getTaskById.js.map +1 -1
  69. package/dist/tools/getTaskDetails.d.ts +2 -2
  70. package/dist/tools/getTaskDetails.d.ts.map +1 -1
  71. package/dist/tools/getTaskDetails.js +48 -27
  72. package/dist/tools/getTaskDetails.js.map +1 -1
  73. package/dist/tools/getTaskFromUrl.d.ts +19 -0
  74. package/dist/tools/getTaskFromUrl.d.ts.map +1 -0
  75. package/dist/tools/getTaskFromUrl.js +90 -0
  76. package/dist/tools/getTaskFromUrl.js.map +1 -0
  77. package/dist/tools/getTaskRaw.d.ts.map +1 -1
  78. package/dist/tools/getTaskRaw.js +24 -17
  79. package/dist/tools/getTaskRaw.js.map +1 -1
  80. package/dist/tools/getTenantVariables.d.ts.map +1 -1
  81. package/dist/tools/getTenantVariables.js +45 -28
  82. package/dist/tools/getTenantVariables.js.map +1 -1
  83. package/dist/tools/index.d.ts +13 -14
  84. package/dist/tools/index.d.ts.map +1 -1
  85. package/dist/tools/index.js +19 -17
  86. package/dist/tools/index.js.map +1 -1
  87. package/dist/tools/listDeployments.d.ts.map +1 -1
  88. package/dist/tools/listDeployments.js +55 -24
  89. package/dist/tools/listDeployments.js.map +1 -1
  90. package/dist/tools/listEnvironments.d.ts.map +1 -1
  91. package/dist/tools/listEnvironments.js +53 -30
  92. package/dist/tools/listEnvironments.js.map +1 -1
  93. package/dist/tools/listProjects.d.ts.map +1 -1
  94. package/dist/tools/listProjects.js +55 -32
  95. package/dist/tools/listProjects.js.map +1 -1
  96. package/dist/tools/listSpaces.d.ts.map +1 -1
  97. package/dist/tools/listSpaces.js +48 -25
  98. package/dist/tools/listSpaces.js.map +1 -1
  99. package/dist/types/tenantsTypes.d.ts +11 -0
  100. package/dist/types/tenantsTypes.d.ts.map +1 -1
  101. package/dist/types/tenantsTypes.js +1 -0
  102. package/dist/types/tenantsTypes.js.map +1 -1
  103. package/dist/utils/version.d.ts +2 -0
  104. package/dist/utils/version.d.ts.map +1 -0
  105. package/dist/utils/version.js +3 -0
  106. package/dist/utils/version.js.map +1 -0
  107. package/package.json +9 -3
  108. package/dist/tools/getAccount.d.ts +0 -3
  109. package/dist/tools/getAccount.d.ts.map +0 -1
  110. package/dist/tools/getAccount.js +0 -40
  111. package/dist/tools/getAccount.js.map +0 -1
  112. package/dist/tools/getCertificate.d.ts +0 -3
  113. package/dist/tools/getCertificate.d.ts.map +0 -1
  114. package/dist/tools/getCertificate.js +0 -40
  115. package/dist/tools/getCertificate.js.map +0 -1
  116. package/dist/tools/getDeploymentTarget.d.ts +0 -3
  117. package/dist/tools/getDeploymentTarget.d.ts.map +0 -1
  118. package/dist/tools/getDeploymentTarget.js +0 -66
  119. package/dist/tools/getDeploymentTarget.js.map +0 -1
  120. package/dist/tools/getReleaseById.d.ts +0 -3
  121. package/dist/tools/getReleaseById.d.ts.map +0 -1
  122. package/dist/tools/getReleaseById.js +0 -45
  123. package/dist/tools/getReleaseById.js.map +0 -1
  124. package/dist/tools/getTenantById.d.ts +0 -3
  125. package/dist/tools/getTenantById.d.ts.map +0 -1
  126. package/dist/tools/getTenantById.js +0 -45
  127. package/dist/tools/getTenantById.js.map +0 -1
  128. package/dist/tools/listAccounts.d.ts +0 -3
  129. package/dist/tools/listAccounts.d.ts.map +0 -1
  130. package/dist/tools/listAccounts.js +0 -54
  131. package/dist/tools/listAccounts.js.map +0 -1
  132. package/dist/tools/listCertificates.d.ts +0 -3
  133. package/dist/tools/listCertificates.d.ts.map +0 -1
  134. package/dist/tools/listCertificates.js +0 -62
  135. package/dist/tools/listCertificates.js.map +0 -1
  136. package/dist/tools/listDeploymentTargets.d.ts +0 -3
  137. package/dist/tools/listDeploymentTargets.d.ts.map +0 -1
  138. package/dist/tools/listDeploymentTargets.js +0 -98
  139. package/dist/tools/listDeploymentTargets.js.map +0 -1
  140. package/dist/tools/listReleases.d.ts +0 -3
  141. package/dist/tools/listReleases.d.ts.map +0 -1
  142. package/dist/tools/listReleases.js +0 -54
  143. package/dist/tools/listReleases.js.map +0 -1
  144. package/dist/tools/listTenants.d.ts +0 -3
  145. package/dist/tools/listTenants.d.ts.map +0 -1
  146. package/dist/tools/listTenants.js +0 -64
  147. package/dist/tools/listTenants.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"getDeploymentProcess.d.ts","sourceRoot":"","sources":["../../src/tools/getDeploymentProcess.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,SAAS,QAmGjE"}
1
+ {"version":3,"file":"getDeploymentProcess.d.ts","sourceRoot":"","sources":["../../src/tools/getDeploymentProcess.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,SAAS,QA6JjE"}
@@ -1,4 +1,4 @@
1
- import { Client, resolveSpaceId, ProjectRepository } from "@octopusdeploy/api-client";
1
+ import { Client, resolveSpaceId, ProjectRepository, } from "@octopusdeploy/api-client";
2
2
  import { z } from "zod";
3
3
  import {} from "@modelcontextprotocol/sdk/server/mcp.js";
4
4
  import { registerToolDefinition } from "../types/toolConfig.js";
@@ -10,32 +10,67 @@ export function registerGetDeploymentProcessTool(server) {
10
10
 
11
11
  This tool retrieves a deployment process by its ID. Each project has a deployment process attached, and releases/deployments can also have frozen processes attached.`, {
12
12
  spaceName: z.string(),
13
- projectId: z.string().optional().describe("The ID of the project to retrieve the deployment process for. If processId is not provided, this parameter is required."),
14
- processId: z.string().optional().describe("The ID of the deployment process to retrieve. If not provided, the deployment process for the project will be retrieved."),
15
- branchName: z.string().optional().describe("Optional branch name to get the deployment process for a specific branch (if using version controlled projects). Try `main` or `master` if unsure."),
16
- includeDetails: z.boolean().optional().default(false).describe("Include detailed properties for steps and actions. Defaults to false."),
13
+ projectId: z
14
+ .string()
15
+ .optional()
16
+ .describe("The ID of the project to retrieve the deployment process for. If processId is not provided, this parameter is required."),
17
+ processId: z
18
+ .string()
19
+ .optional()
20
+ .describe("The ID of the deployment process to retrieve. If not provided, the deployment process for the project will be retrieved."),
21
+ branchName: z
22
+ .string()
23
+ .optional()
24
+ .describe("Optional branch name to get the deployment process for a specific branch (if using version controlled projects). Try `main` or `master` if unsure."),
25
+ includeDetails: z
26
+ .boolean()
27
+ .optional()
28
+ .default(false)
29
+ .describe("Include detailed properties for steps and actions. Defaults to false."),
17
30
  }, {
18
31
  title: "Get deployment process details from Octopus Deploy",
19
32
  readOnlyHint: true,
20
- }, async ({ spaceName, processId, projectId, branchName, includeDetails = false }) => {
33
+ }, async ({ spaceName, processId, projectId, branchName, includeDetails = false, }) => {
21
34
  if (!processId && !projectId) {
22
- throw new Error("Either processId or projectId must be provided.");
35
+ throw new Error("Either processId or projectId must be provided. " +
36
+ "Use list_projects to find project IDs (starting with 'Projects-') or " +
37
+ "use list_deployments to find process IDs (starting with 'DeploymentProcesses-').");
38
+ }
39
+ if (projectId && !projectId.startsWith("Projects-")) {
40
+ throw new Error(`Invalid project ID format '${projectId}'. Project IDs should start with 'Projects-' followed by numbers. ` +
41
+ "Use list_projects to find valid project IDs.");
42
+ }
43
+ if (processId && !processId.startsWith("DeploymentProcesses-")) {
44
+ throw new Error(`Invalid process ID format '${processId}'. Process IDs should start with 'DeploymentProcesses-' followed by numbers. ` +
45
+ "Use list_deployments to find valid process IDs.");
23
46
  }
24
47
  const configuration = getClientConfigurationFromEnvironment();
25
48
  const client = await Client.create(configuration);
26
49
  const spaceId = await resolveSpaceId(client, spaceName);
27
- const projectRepository = projectId ? new ProjectRepository(client, spaceName) : null;
28
- const project = projectRepository && projectId ? await projectRepository.get(projectId) : null;
50
+ const projectRepository = projectId
51
+ ? new ProjectRepository(client, spaceName)
52
+ : null;
53
+ const project = projectRepository && projectId
54
+ ? await projectRepository.get(projectId)
55
+ : null;
29
56
  // If we were not supplied a processId, we assume we are retrieving the process for the specified project.
30
57
  if (!processId) {
31
58
  processId = project?.DeploymentProcessId;
32
59
  }
33
60
  if (project?.IsVersionControlled && !branchName) {
34
- throw new Error("Branch name must be provided for version controlled projects.");
61
+ throw new Error(`Branch name required for version controlled project '${projectId}'. ` +
62
+ "Try 'main' or 'master', or use get_branches tool to list available branches.");
35
63
  }
36
64
  // If using branchName get the canonical ref first
37
- const branches = branchName && projectId && await getProjectBranches(client, spaceId, projectId, { take: 1, searchByName: branchName });
38
- const gitRef = branches && branches.Items.length > 0 ? branches.Items[0].CanonicalName : undefined;
65
+ const branches = branchName &&
66
+ projectId &&
67
+ (await getProjectBranches(client, spaceId, projectId, {
68
+ take: 1,
69
+ searchByName: branchName,
70
+ }));
71
+ const gitRef = branches && branches.Items.length > 0
72
+ ? branches.Items[0].CanonicalName
73
+ : undefined;
39
74
  const url = gitRef
40
75
  ? `~/api/{spaceId}/projects/{projectId}/{gitRef}/deploymentprocesses`
41
76
  : `~/api/{spaceId}/deploymentprocesses/{processId}`;
@@ -43,7 +78,7 @@ This tool retrieves a deployment process by its ID. Each project has a deploymen
43
78
  spaceId,
44
79
  projectId,
45
80
  processId,
46
- gitRef
81
+ gitRef,
47
82
  });
48
83
  const deploymentProcess = {
49
84
  spaceId: response.SpaceId,
@@ -1 +1 @@
1
- {"version":3,"file":"getDeploymentProcess.js","sourceRoot":"","sources":["../../src/tools/getDeploymentProcess.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACtF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAkB,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,qCAAqC,EAAE,MAAM,qDAAqD,CAAC;AAC5G,OAAO,EAAkC,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAErE,MAAM,UAAU,gCAAgC,CAAC,MAAiB;IAChE,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB;;sKAEkK,EAClK;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yHAAyH,CAAC;QACpK,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0HAA0H,CAAC;QACrK,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oJAAoJ,CAAC;QAChM,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,uEAAuE,CAAC;KACxI,EACD;QACE,KAAK,EAAE,oDAAoD;QAC3D,YAAY,EAAE,IAAI;KACnB,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,GAAG,KAAK,EAAE,EAAE,EAAE;QAEhF,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,aAAa,GAAG,qCAAqC,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACxD,MAAM,iBAAiB,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACtF,MAAM,OAAO,GAAG,iBAAiB,IAAI,SAAS,CAAC,CAAC,CAAC,MAAM,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAE/F,0GAA0G;QAC1G,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS,GAAG,OAAO,EAAE,mBAAmB,CAAC;QAC3C,CAAC;QAED,IAAI,OAAO,EAAE,mBAAmB,IAAI,CAAC,UAAU,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QACnF,CAAC;QAED,kDAAkD;QAClD,MAAM,QAAQ,GAAG,UAAU,IAAI,SAAS,IAAI,MAAM,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC;QACxI,MAAM,MAAM,GAAG,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;QAEnG,MAAM,GAAG,GAAG,MAAM;YAChB,CAAC,CAAC,mEAAmE;YACrE,CAAC,CAAC,iDAAiD,CAAC;QAEtD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAC/B,GAAG,EACH;YACE,OAAO;YACP,SAAS;YACT,SAAS;YACT,MAAM;SACP,CACF,CAAC;QAEF,MAAM,iBAAiB,GAAG;YACxB,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,cAAc,EAAE,QAAQ,CAAC,cAAc;YACvC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACjC,MAAM,UAAU,GAAG;oBACjB,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,YAAY,EAAE,IAAI,CAAC,YAAY;oBAC/B,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;oBAC3C,GAAG,CAAC,cAAc,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;oBACtD,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;wBACnC,IAAI,cAAc,EAAE,CAAC;4BACnB,OAAO,MAAM,CAAC;wBAChB,CAAC;6BAAM,CAAC;4BACN,6DAA6D;4BAC7D,MAAM,EAAE,UAAU,EAAE,GAAG,uBAAuB,EAAE,GAAG,MAAM,CAAC;4BAC1D,OAAO,uBAAuB,CAAC;wBACjC,CAAC;oBACH,CAAC,CAAC;iBACH,CAAC;gBAEF,OAAO,UAAU,CAAC;YACpB,CAAC,CAAC;SACH,CAAC;QAEF,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,yCAAyC,iBAAiB,CAAC,EAAE,eAAe,SAAS,IAAI,UAAU,CAAC,CAAC,CAAC,gBAAgB,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG;iBAClJ;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;iBACxC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,sBAAsB,CAAC;IACrB,QAAQ,EAAE,wBAAwB;IAClC,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC/C,UAAU,EAAE,gCAAgC;CAC7C,CAAC,CAAC"}
1
+ {"version":3,"file":"getDeploymentProcess.js","sourceRoot":"","sources":["../../src/tools/getDeploymentProcess.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getKubernetesLiveStatus.d.ts","sourceRoot":"","sources":["../../src/tools/getKubernetesLiveStatus.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,mCAAmC,CAAC,MAAM,EAAE,SAAS,QAiEpE"}
1
+ {"version":3,"file":"getKubernetesLiveStatus.d.ts","sourceRoot":"","sources":["../../src/tools/getKubernetesLiveStatus.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,mCAAmC,CAAC,MAAM,EAAE,SAAS,QAwFpE"}
@@ -3,6 +3,7 @@ import { z } from "zod";
3
3
  import {} from "@modelcontextprotocol/sdk/server/mcp.js";
4
4
  import { getClientConfigurationFromEnvironment } from "../helpers/getClientConfigurationFromEnvironment.js";
5
5
  import { registerToolDefinition } from "../types/toolConfig.js";
6
+ import { validateEntityId, handleOctopusApiError, ENTITY_PREFIXES, isErrorWithMessage } from "../helpers/errorHandling.js";
6
7
  export function registerGetKubernetesLiveStatusTool(server) {
7
8
  server.tool("get_kubernetes_live_status", `Get Kubernetes live status for a project and environment
8
9
 
@@ -16,44 +17,62 @@ export function registerGetKubernetesLiveStatusTool(server) {
16
17
  title: "Get Kubernetes live status from Octopus Deploy",
17
18
  readOnlyHint: true,
18
19
  }, async ({ spaceName, projectId, environmentId, tenantId, summaryOnly = false }) => {
19
- const configuration = getClientConfigurationFromEnvironment();
20
- const client = await Client.create(configuration);
21
- const observabilityRepository = new ObservabilityRepository(client, spaceName);
22
- const liveStatus = await observabilityRepository.getLiveStatus(projectId, environmentId, tenantId, summaryOnly);
23
- return {
24
- content: [
25
- {
26
- type: "text",
27
- text: JSON.stringify({
28
- projectId,
29
- environmentId,
30
- tenantId,
31
- summaryOnly: summaryOnly,
32
- liveStatus: {
33
- machineStatuses: liveStatus.MachineStatuses?.map((machine) => ({
34
- machineId: machine.MachineId,
35
- status: machine.Status,
36
- resources: machine.Resources?.map((resource) => ({
37
- name: resource.Name,
38
- namespace: resource.Namespace,
39
- kind: resource.Kind,
40
- healthStatus: resource.HealthStatus,
41
- syncStatus: resource.SyncStatus,
42
- machineId: resource.MachineId,
43
- children: resource.Children,
44
- desiredResourceId: resource.DesiredResourceId,
45
- resourceId: resource.ResourceId
46
- }))
47
- })),
48
- summary: liveStatus.Summary ? {
49
- status: liveStatus.Summary.Status,
50
- lastUpdated: liveStatus.Summary.LastUpdated
51
- } : undefined
52
- }
53
- }),
54
- },
55
- ],
56
- };
20
+ validateEntityId(projectId, 'project', ENTITY_PREFIXES.project);
21
+ validateEntityId(environmentId, 'environment', ENTITY_PREFIXES.environment);
22
+ if (tenantId) {
23
+ validateEntityId(tenantId, 'tenant', ENTITY_PREFIXES.tenant);
24
+ }
25
+ try {
26
+ const configuration = getClientConfigurationFromEnvironment();
27
+ const client = await Client.create(configuration);
28
+ const observabilityRepository = new ObservabilityRepository(client, spaceName);
29
+ const liveStatus = await observabilityRepository.getLiveStatus(projectId, environmentId, tenantId, summaryOnly);
30
+ if (!liveStatus || (!liveStatus.MachineStatuses && !liveStatus.Summary)) {
31
+ throw new Error(`No Kubernetes live status found for project '${projectId}' in environment '${environmentId}'${tenantId ? ` for tenant '${tenantId}'` : ''}. ` +
32
+ "This may indicate that the project is not deployed to Kubernetes in this environment, or the resources are not being monitored.");
33
+ }
34
+ return {
35
+ content: [
36
+ {
37
+ type: "text",
38
+ text: JSON.stringify({
39
+ projectId,
40
+ environmentId,
41
+ tenantId,
42
+ summaryOnly: summaryOnly,
43
+ liveStatus: {
44
+ machineStatuses: liveStatus.MachineStatuses?.map((machine) => ({
45
+ machineId: machine.MachineId,
46
+ status: machine.Status,
47
+ resources: machine.Resources?.map((resource) => ({
48
+ name: resource.Name,
49
+ namespace: resource.Namespace,
50
+ kind: resource.Kind,
51
+ healthStatus: resource.HealthStatus,
52
+ syncStatus: resource.SyncStatus,
53
+ machineId: resource.MachineId,
54
+ children: resource.Children,
55
+ desiredResourceId: resource.DesiredResourceId,
56
+ resourceId: resource.ResourceId
57
+ }))
58
+ })),
59
+ summary: liveStatus.Summary ? {
60
+ status: liveStatus.Summary.Status,
61
+ lastUpdated: liveStatus.Summary.LastUpdated
62
+ } : undefined
63
+ }
64
+ }),
65
+ },
66
+ ],
67
+ };
68
+ }
69
+ catch (error) {
70
+ if (isErrorWithMessage(error, 'minimum version')) {
71
+ throw new Error(`Kubernetes live status requires Octopus Deploy version 2025.3 or later. ` +
72
+ "This feature is not available in your Octopus Deploy instance version.");
73
+ }
74
+ handleOctopusApiError(error, { spaceName });
75
+ }
57
76
  });
58
77
  }
59
78
  registerToolDefinition({
@@ -1 +1 @@
1
- {"version":3,"file":"getKubernetesLiveStatus.js","sourceRoot":"","sources":["../../src/tools/getKubernetesLiveStatus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,uBAAuB,EAA+E,MAAM,2BAA2B,CAAC;AACzJ,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAkB,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,qCAAqC,EAAE,MAAM,qDAAqD,CAAC;AAC5G,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,UAAU,mCAAmC,CAAC,MAAiB;IACnE,MAAM,CAAC,IAAI,CACT,4BAA4B,EAC5B;;mKAE+J,EAC/J;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAChD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACvD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAC/D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;QAC/F,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;KAChF,EACD;QACE,KAAK,EAAE,gDAAgD;QACvD,YAAY,EAAE,IAAI;KACnB,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,GAAG,KAAK,EAAE,EAAE,EAAE;QAC/E,MAAM,aAAa,GAAG,qCAAqC,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,uBAAuB,GAAG,IAAI,uBAAuB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAE/E,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAAC,aAAa,CAC5D,SAAS,EACT,aAAa,EACb,QAAQ,EACR,WAAW,CACZ,CAAC;QAEF,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,SAAS;wBACT,aAAa;wBACb,QAAQ;wBACR,WAAW,EAAE,WAAW;wBACxB,UAAU,EAAE;4BACV,eAAe,EAAE,UAAU,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,OAA4C,EAAE,EAAE,CAAC,CAAC;gCAClG,SAAS,EAAE,OAAO,CAAC,SAAS;gCAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;gCACtB,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,QAAsC,EAAE,EAAE,CAAC,CAAC;oCAC7E,IAAI,EAAE,QAAQ,CAAC,IAAI;oCACnB,SAAS,EAAE,QAAQ,CAAC,SAAS;oCAC7B,IAAI,EAAE,QAAQ,CAAC,IAAI;oCACnB,YAAY,EAAE,QAAQ,CAAC,YAAY;oCACnC,UAAU,EAAE,QAAQ,CAAC,UAAU;oCAC/B,SAAS,EAAE,QAAQ,CAAC,SAAS;oCAC7B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;oCAC3B,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;oCAC7C,UAAU,EAAE,QAAQ,CAAC,UAAU;iCAChC,CAAC,CAAC;6BACJ,CAAC,CAAC;4BACH,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;gCAC5B,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,MAAM;gCACjC,WAAW,EAAE,UAAU,CAAC,OAAO,CAAC,WAAW;6BAC5C,CAAC,CAAC,CAAC,SAAS;yBACd;qBACF,CAAC;iBACH;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,sBAAsB,CAAC;IACrB,QAAQ,EAAE,4BAA4B;IACtC,MAAM,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE;IACjD,UAAU,EAAE,mCAAmC;IAC/C,qBAAqB,EAAE,QAAQ;CAChC,CAAC,CAAC"}
1
+ {"version":3,"file":"getKubernetesLiveStatus.js","sourceRoot":"","sources":["../../src/tools/getKubernetesLiveStatus.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getMissingTenantVariables.d.ts","sourceRoot":"","sources":["../../src/tools/getMissingTenantVariables.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,qCAAqC,CAAC,MAAM,EAAE,SAAS,QA4CtE"}
1
+ {"version":3,"file":"getMissingTenantVariables.d.ts","sourceRoot":"","sources":["../../src/tools/getMissingTenantVariables.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,qCAAqC,CAAC,MAAM,EAAE,SAAS,QA0EtE"}
@@ -3,6 +3,7 @@ import { z } from "zod";
3
3
  import {} from "@modelcontextprotocol/sdk/server/mcp.js";
4
4
  import { getClientConfigurationFromEnvironment } from "../helpers/getClientConfigurationFromEnvironment.js";
5
5
  import { registerToolDefinition } from "../types/toolConfig.js";
6
+ import { validateEntityId, handleOctopusApiError, ENTITY_PREFIXES } from "../helpers/errorHandling.js";
6
7
  export function registerGetMissingTenantVariablesTool(server) {
7
8
  server.tool("get_missing_tenant_variables", `Get missing tenant variables
8
9
 
@@ -16,27 +17,55 @@ export function registerGetMissingTenantVariablesTool(server) {
16
17
  title: "Get missing tenant variables from Octopus Deploy",
17
18
  readOnlyHint: true,
18
19
  }, async ({ spaceName, tenantId, projectId, environmentId, includeDetails = false }) => {
19
- const configuration = getClientConfigurationFromEnvironment();
20
- const client = await Client.create(configuration);
21
- const tenantRepository = new TenantRepository(client, spaceName);
20
+ if (tenantId) {
21
+ validateEntityId(tenantId, 'tenant', ENTITY_PREFIXES.tenant);
22
+ }
23
+ if (projectId) {
24
+ validateEntityId(projectId, 'project', ENTITY_PREFIXES.project);
25
+ }
26
+ if (environmentId) {
27
+ validateEntityId(environmentId, 'environment', ENTITY_PREFIXES.environment);
28
+ }
22
29
  const filterOptions = {
23
30
  tenantId,
24
31
  projectId,
25
32
  environmentId
26
33
  };
27
- const missingVariables = await tenantRepository.missingVariables(filterOptions, includeDetails);
28
- return {
29
- content: [
30
- {
31
- type: "text",
32
- text: JSON.stringify({
33
- filters: filterOptions,
34
- includeDetails,
35
- missingVariables
36
- }),
37
- },
38
- ],
39
- };
34
+ try {
35
+ const configuration = getClientConfigurationFromEnvironment();
36
+ const client = await Client.create(configuration);
37
+ const tenantRepository = new TenantRepository(client, spaceName);
38
+ const missingVariables = await tenantRepository.missingVariables(filterOptions, includeDetails);
39
+ if (!missingVariables || (Array.isArray(missingVariables) && missingVariables.length === 0)) {
40
+ const filterDescription = Object.entries(filterOptions)
41
+ .filter(([, value]) => value)
42
+ .map(([key, value]) => `${key}: ${value}`)
43
+ .join(', ') || 'no filters';
44
+ return {
45
+ content: [
46
+ {
47
+ type: "text",
48
+ text: `No missing tenant variables found with filters: ${filterDescription}. All required variables appear to be configured.`,
49
+ },
50
+ ],
51
+ };
52
+ }
53
+ return {
54
+ content: [
55
+ {
56
+ type: "text",
57
+ text: JSON.stringify({
58
+ filters: filterOptions,
59
+ includeDetails,
60
+ missingVariables
61
+ }),
62
+ },
63
+ ],
64
+ };
65
+ }
66
+ catch (error) {
67
+ handleOctopusApiError(error, { spaceName });
68
+ }
40
69
  });
41
70
  }
42
71
  registerToolDefinition({
@@ -1 +1 @@
1
- {"version":3,"file":"getMissingTenantVariables.js","sourceRoot":"","sources":["../../src/tools/getMissingTenantVariables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAkB,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,qCAAqC,EAAE,MAAM,qDAAqD,CAAC;AAC5G,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,UAAU,qCAAqC,CAAC,MAAiB;IACrE,MAAM,CAAC,IAAI,CACT,8BAA8B,EAC9B;;sHAEkH,EAClH;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAChD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACxE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QAC1E,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QAClF,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;KACxG,EACD;QACE,KAAK,EAAE,kDAAkD;QACzD,YAAY,EAAE,IAAI;KACnB,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,GAAG,KAAK,EAAE,EAAE,EAAE;QAClF,MAAM,aAAa,GAAG,qCAAqC,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAEjE,MAAM,aAAa,GAAG;YACpB,QAAQ;YACR,SAAS;YACT,aAAa;SACd,CAAC;QAEF,MAAM,gBAAgB,GAAG,MAAM,gBAAgB,CAAC,gBAAgB,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QAEhG,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,OAAO,EAAE,aAAa;wBACtB,cAAc;wBACd,gBAAgB;qBACjB,CAAC;iBACH;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,sBAAsB,CAAC;IACrB,QAAQ,EAAE,8BAA8B;IACxC,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC9C,UAAU,EAAE,qCAAqC;CAClD,CAAC,CAAC"}
1
+ {"version":3,"file":"getMissingTenantVariables.js","sourceRoot":"","sources":["../../src/tools/getMissingTenantVariables.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getTaskById.d.ts","sourceRoot":"","sources":["../../src/tools/getTaskById.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA6B,MAAM,2BAA2B,CAAC;AAG9E,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,gEAU1E;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,QAgCxD"}
1
+ {"version":3,"file":"getTaskById.d.ts","sourceRoot":"","sources":["../../src/tools/getTaskById.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA6B,MAAM,2BAA2B,CAAC;AAG9E,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,gEAQ1E;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,QAuCxD"}
@@ -4,11 +4,10 @@ import { getClientConfigurationFromEnvironment } from '../helpers/getClientConfi
4
4
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
5
  import { registerToolDefinition } from '../types/toolConfig.js';
6
6
  import { tasksDescription } from '../types/taskTypes.js';
7
+ import { validateEntityId, handleOctopusApiError, ENTITY_PREFIXES } from '../helpers/errorHandling.js';
7
8
  export async function getTaskById(client, params) {
8
9
  const { spaceName, taskId } = params;
9
- if (!taskId) {
10
- throw new Error("Task ID is required");
11
- }
10
+ validateEntityId(taskId, 'task', ENTITY_PREFIXES.task);
12
11
  const serverTaskRepository = new SpaceServerTaskRepository(client, spaceName);
13
12
  const response = await serverTaskRepository.getById(taskId);
14
13
  return response;
@@ -19,21 +18,29 @@ export function registerGetTaskByIdTool(server) {
19
18
  readOnlyHint: true,
20
19
  }, async (args) => {
21
20
  const { spaceName, taskId } = args;
22
- if (!taskId) {
23
- throw new Error("Task ID is required");
21
+ validateEntityId(taskId, 'task', ENTITY_PREFIXES.task);
22
+ try {
23
+ const configuration = getClientConfigurationFromEnvironment();
24
+ const client = await Client.create(configuration);
25
+ const serverTaskRepository = new SpaceServerTaskRepository(client, spaceName);
26
+ const response = await serverTaskRepository.getById(taskId);
27
+ return {
28
+ content: [
29
+ {
30
+ type: "text",
31
+ text: JSON.stringify(response),
32
+ },
33
+ ],
34
+ };
35
+ }
36
+ catch (error) {
37
+ handleOctopusApiError(error, {
38
+ entityType: 'task',
39
+ entityId: taskId,
40
+ spaceName,
41
+ helpText: "Use list_deployments or list_releases to find valid task IDs."
42
+ });
24
43
  }
25
- const configuration = getClientConfigurationFromEnvironment();
26
- const client = await Client.create(configuration);
27
- const serverTaskRepository = new SpaceServerTaskRepository(client, spaceName);
28
- const response = await serverTaskRepository.getById(taskId);
29
- return {
30
- content: [
31
- {
32
- type: "text",
33
- text: JSON.stringify(response),
34
- },
35
- ],
36
- };
37
44
  });
38
45
  }
39
46
  registerToolDefinition({
@@ -1 +1 @@
1
- {"version":3,"file":"getTaskById.js","sourceRoot":"","sources":["../../src/tools/getTaskById.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,qCAAqC,EAAE,MAAM,qDAAqD,CAAC;AAC5G,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAOzD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAc,EAAE,MAAyB;IACzE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAErC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,oBAAoB,GAAG,IAAI,yBAAyB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9E,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,qDAAqD,gBAAgB,EAAE,EACvE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EAC7C;QACE,KAAK,EAAE,kDAAkD;QACzD,YAAY,EAAE,IAAI;KACnB,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAyB,CAAC;QAExD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,aAAa,GAAG,qCAAqC,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,oBAAoB,GAAG,IAAI,yBAAyB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAE9E,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE5D,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;iBAC/B;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,sBAAsB,CAAC;IACrB,QAAQ,EAAE,gBAAgB;IAC1B,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC5C,UAAU,EAAE,uBAAuB;CACpC,CAAC,CAAC"}
1
+ {"version":3,"file":"getTaskById.js","sourceRoot":"","sources":["../../src/tools/getTaskById.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,qCAAqC,EAAE,MAAM,qDAAqD,CAAC;AAC5G,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAOvG,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAc,EAAE,MAAyB;IACzE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAErC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAEvD,MAAM,oBAAoB,GAAG,IAAI,yBAAyB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9E,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,qDAAqD,gBAAgB,EAAE,EACvE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EAC7C;QACE,KAAK,EAAE,kDAAkD;QACzD,YAAY,EAAE,IAAI;KACnB,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAyB,CAAC;QAExD,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;QAEvD,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,qCAAqC,EAAE,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAClD,MAAM,oBAAoB,GAAG,IAAI,yBAAyB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAE9E,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAE5D,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;qBAC/B;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,qBAAqB,CAAC,KAAK,EAAE;gBAC3B,UAAU,EAAE,MAAM;gBAClB,QAAQ,EAAE,MAAM;gBAChB,SAAS;gBACT,QAAQ,EAAE,+DAA+D;aAC1E,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,sBAAsB,CAAC;IACrB,QAAQ,EAAE,gBAAgB;IAC1B,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC5C,UAAU,EAAE,uBAAuB;CACpC,CAAC,CAAC"}
@@ -1,5 +1,5 @@
1
- import { Client } from '@octopusdeploy/api-client';
2
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
1
+ import { Client } from "@octopusdeploy/api-client";
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
3
  export interface GetTaskDetailsParams {
4
4
  spaceName: string;
5
5
  taskId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"getTaskDetails.d.ts","sourceRoot":"","sources":["../../src/tools/getTaskDetails.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA6B,MAAM,2BAA2B,CAAC;AAG9E,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,kEAUhF;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,QAgC3D"}
1
+ {"version":3,"file":"getTaskDetails.d.ts","sourceRoot":"","sources":["../../src/tools/getTaskDetails.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA6B,MAAM,2BAA2B,CAAC;AAG9E,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASpE,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,oBAAoB,kEA0B7B;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,QAuC3D"}
@@ -1,39 +1,60 @@
1
- import { Client, SpaceServerTaskRepository } from '@octopusdeploy/api-client';
2
- import { z } from 'zod';
3
- import { getClientConfigurationFromEnvironment } from '../helpers/getClientConfigurationFromEnvironment.js';
4
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
- import { registerToolDefinition } from '../types/toolConfig.js';
6
- import { tasksDescription } from '../types/taskTypes.js';
1
+ import { Client, SpaceServerTaskRepository } from "@octopusdeploy/api-client";
2
+ import { z } from "zod";
3
+ import { getClientConfigurationFromEnvironment } from "../helpers/getClientConfigurationFromEnvironment.js";
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import { registerToolDefinition } from "../types/toolConfig.js";
6
+ import { tasksDescription } from "../types/taskTypes.js";
7
+ import { validateEntityId, handleOctopusApiError, ENTITY_PREFIXES, } from "../helpers/errorHandling.js";
7
8
  export async function getTaskDetails(client, params) {
8
9
  const { spaceName, taskId } = params;
9
- if (!taskId) {
10
- throw new Error("Task ID is required");
11
- }
10
+ validateEntityId(taskId, "task", ENTITY_PREFIXES.task);
12
11
  const serverTaskRepository = new SpaceServerTaskRepository(client, spaceName);
13
- const response = await serverTaskRepository.getDetails(taskId);
14
- return response;
12
+ try {
13
+ const response = await serverTaskRepository.getDetails(taskId);
14
+ return response;
15
+ }
16
+ catch (error) {
17
+ if (error instanceof Error && error.message.includes("not found")) {
18
+ throw new Error(`Task ${taskId} not found in space "${spaceName}". ` +
19
+ `\n\nCommon causes:\n` +
20
+ `1. If you extracted this task ID from a deployment URL, note that deployment URLs do not contain task IDs.\n` +
21
+ ` - Instead, use get_deployment_from_url or get_task_from_url to automatically resolve the correct task ID\n` +
22
+ `2. The task may exist in a different space\n` +
23
+ `3. The task may have been deleted or archived\n` +
24
+ `4. You may not have permission to view this task\n\n` +
25
+ `Tip: Use get_task_from_url if you have an Octopus Deploy URL instead of manually extracting IDs.`);
26
+ }
27
+ throw error;
28
+ }
15
29
  }
16
30
  export function registerGetTaskDetailsTool(server) {
17
- server.tool('get_task_details', `Get detailed information for a specific server task by its ID. ${tasksDescription}`, { spaceName: z.string(), taskId: z.string() }, {
18
- title: 'Get detailed information for a specific server task by its ID',
31
+ server.tool("get_task_details", `Get detailed information for a specific server task by its ID. ${tasksDescription}`, { spaceName: z.string(), taskId: z.string() }, {
32
+ title: "Get detailed information for a specific server task by its ID",
19
33
  readOnlyHint: true,
20
34
  }, async (args) => {
21
35
  const { spaceName, taskId } = args;
22
- if (!taskId) {
23
- throw new Error("Task ID is required");
36
+ validateEntityId(taskId, "task", ENTITY_PREFIXES.task);
37
+ try {
38
+ const configuration = getClientConfigurationFromEnvironment();
39
+ const client = await Client.create(configuration);
40
+ const response = await getTaskDetails(client, { spaceName, taskId });
41
+ return {
42
+ content: [
43
+ {
44
+ type: "text",
45
+ text: JSON.stringify(response),
46
+ },
47
+ ],
48
+ };
49
+ }
50
+ catch (error) {
51
+ handleOctopusApiError(error, {
52
+ entityType: "task",
53
+ entityId: taskId,
54
+ spaceName,
55
+ helpText: "Use list_deployments or list_releases to find valid task IDs.",
56
+ });
24
57
  }
25
- const configuration = getClientConfigurationFromEnvironment();
26
- const client = await Client.create(configuration);
27
- const serverTaskRepository = new SpaceServerTaskRepository(client, spaceName);
28
- const response = await serverTaskRepository.getDetails(taskId);
29
- return {
30
- content: [
31
- {
32
- type: "text",
33
- text: JSON.stringify(response),
34
- },
35
- ],
36
- };
37
58
  });
38
59
  }
39
60
  registerToolDefinition({
@@ -1 +1 @@
1
- {"version":3,"file":"getTaskDetails.js","sourceRoot":"","sources":["../../src/tools/getTaskDetails.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,qCAAqC,EAAE,MAAM,qDAAqD,CAAC;AAC5G,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAOzD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAc,EAAE,MAA4B;IAC/E,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAErC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,oBAAoB,GAAG,IAAI,yBAAyB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9E,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC/D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,kEAAkE,gBAAgB,EAAE,EACpF,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EAC7C;QACE,KAAK,EAAE,+DAA+D;QACtE,YAAY,EAAE,IAAI;KACnB,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAA4B,CAAC;QAE3D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,aAAa,GAAG,qCAAqC,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,oBAAoB,GAAG,IAAI,yBAAyB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAE9E,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAE/D,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;iBAC/B;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,sBAAsB,CAAC;IACrB,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC5C,UAAU,EAAE,0BAA0B;CACvC,CAAC,CAAC"}
1
+ {"version":3,"file":"getTaskDetails.js","sourceRoot":"","sources":["../../src/tools/getTaskDetails.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { Client } from '@octopusdeploy/api-client';
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ export interface GetTaskFromUrlParams {
4
+ url: string;
5
+ }
6
+ export declare function getTaskFromUrl(client: Client, params: GetTaskFromUrlParams): Promise<{
7
+ task: import("@octopusdeploy/api-client").ServerTaskDetails;
8
+ resolvedSpaceName: string;
9
+ resolvedTaskId: string;
10
+ urlInfo: {
11
+ originalUrl: string;
12
+ extractedSpaceId: string;
13
+ extractedTaskId: string | null;
14
+ extractedDeploymentId: string | null;
15
+ resourceType: "task" | "project" | "tenant" | "deployment" | "release" | "unknown" | undefined;
16
+ };
17
+ }>;
18
+ export declare function registerGetTaskFromUrlTool(server: McpServer): void;
19
+ //# sourceMappingURL=getTaskFromUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTaskFromUrl.d.ts","sourceRoot":"","sources":["../../src/tools/getTaskFromUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAmD,MAAM,2BAA2B,CAAC;AAGpG,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB;;;;;;;;;;;GAiEhF;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,QAoC3D"}