@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,47 +1,70 @@
1
- import { Client, EnvironmentRepository } from "@octopusdeploy/api-client";
1
+ import { Client, EnvironmentRepository, } from "@octopusdeploy/api-client";
2
2
  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 { handleOctopusApiError } from "../helpers/errorHandling.js";
6
7
  export function registerListEnvironmentsTool(server) {
7
8
  server.tool("list_environments", `List environments in a space
8
-
9
+
9
10
  This tool lists all environments in a given space. The space name is required. Use this tool as early as possible to understand which environments are configured. Optionally filter by partial name match using partialName parameter.`, {
10
11
  spaceName: z.string(),
11
12
  partialName: z.string().optional(),
12
13
  skip: z.number().optional(),
13
- take: z.number().optional()
14
+ take: z.number().optional(),
14
15
  }, {
15
16
  title: "List all environments in an Octopus Deploy space",
16
17
  readOnlyHint: true,
17
18
  }, async ({ spaceName, partialName, skip, take }) => {
18
- const configuration = getClientConfigurationFromEnvironment();
19
- const client = await Client.create(configuration);
20
- const environmentRepository = new EnvironmentRepository(client, spaceName);
21
- const environmentsResponse = await environmentRepository.list({ partialName, skip, take });
22
- return {
23
- content: [
24
- {
25
- type: "text",
26
- text: JSON.stringify({
27
- totalResults: environmentsResponse.TotalResults,
28
- itemsPerPage: environmentsResponse.ItemsPerPage,
29
- numberOfPages: environmentsResponse.NumberOfPages,
30
- lastPageNumber: environmentsResponse.LastPageNumber,
31
- items: environmentsResponse.Items.map((environment) => ({
32
- spaceId: environment.SpaceId,
33
- id: environment.Id,
34
- name: environment.Name,
35
- description: environment.Description,
36
- sortOrder: environment.SortOrder,
37
- useGuidedFailure: environment.UseGuidedFailure,
38
- allowDynamicInfrastructure: environment.AllowDynamicInfrastructure,
39
- extensionSettings: environment.ExtensionSettings,
40
- }))
41
- }),
42
- },
43
- ],
44
- };
19
+ try {
20
+ const configuration = getClientConfigurationFromEnvironment();
21
+ const client = await Client.create(configuration);
22
+ const environmentRepository = new EnvironmentRepository(client, spaceName);
23
+ const environmentsResponse = await environmentRepository.list({
24
+ partialName,
25
+ skip,
26
+ take,
27
+ });
28
+ if (environmentsResponse.Items.length === 0) {
29
+ const message = partialName
30
+ ? `No environments found matching '${partialName}' in space '${spaceName}'. Environment names are case-sensitive.`
31
+ : `No environments found in space '${spaceName}'. This space may not have any environments configured.`;
32
+ return {
33
+ content: [
34
+ {
35
+ type: "text",
36
+ text: message,
37
+ },
38
+ ],
39
+ };
40
+ }
41
+ return {
42
+ content: [
43
+ {
44
+ type: "text",
45
+ text: JSON.stringify({
46
+ totalResults: environmentsResponse.TotalResults,
47
+ itemsPerPage: environmentsResponse.ItemsPerPage,
48
+ numberOfPages: environmentsResponse.NumberOfPages,
49
+ lastPageNumber: environmentsResponse.LastPageNumber,
50
+ items: environmentsResponse.Items.map((environment) => ({
51
+ spaceId: environment.SpaceId,
52
+ id: environment.Id,
53
+ name: environment.Name,
54
+ description: environment.Description,
55
+ sortOrder: environment.SortOrder,
56
+ useGuidedFailure: environment.UseGuidedFailure,
57
+ allowDynamicInfrastructure: environment.AllowDynamicInfrastructure,
58
+ extensionSettings: environment.ExtensionSettings,
59
+ })),
60
+ }),
61
+ },
62
+ ],
63
+ };
64
+ }
65
+ catch (error) {
66
+ handleOctopusApiError(error, { spaceName });
67
+ }
45
68
  });
46
69
  }
47
70
  registerToolDefinition({
@@ -1 +1 @@
1
- {"version":3,"file":"listEnvironments.js","sourceRoot":"","sources":["../../src/tools/listEnvironments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAA8B,MAAM,2BAA2B,CAAC;AACtG,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,4BAA4B,CAAC,MAAiB;IAC5D,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB;;0OAEsO,EACtO;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAClC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC5B,EACD;QACE,KAAK,EAAE,kDAAkD;QACzD,YAAY,EAAE,IAAI;KACnB,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QAC/C,MAAM,aAAa,GAAG,qCAAqC,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,qBAAqB,GAAG,IAAI,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAE3E,MAAM,oBAAoB,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAE3F,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,YAAY,EAAE,oBAAoB,CAAC,YAAY;wBAC/C,YAAY,EAAE,oBAAoB,CAAC,YAAY;wBAC/C,aAAa,EAAE,oBAAoB,CAAC,aAAa;wBACjD,cAAc,EAAE,oBAAoB,CAAC,cAAc;wBACnD,KAAK,EAAE,oBAAoB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,WAAkC,EAAE,EAAE,CAAC,CAAC;4BAC7E,OAAO,EAAE,WAAW,CAAC,OAAO;4BAC5B,EAAE,EAAE,WAAW,CAAC,EAAE;4BAClB,IAAI,EAAE,WAAW,CAAC,IAAI;4BACtB,WAAW,EAAE,WAAW,CAAC,WAAW;4BACpC,SAAS,EAAE,WAAW,CAAC,SAAS;4BAChC,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;4BAC9C,0BAA0B,EAAE,WAAW,CAAC,0BAA0B;4BAClE,iBAAiB,EAAE,WAAW,CAAC,iBAAiB;yBACjD,CAAC,CAAC;qBACJ,CAAC;iBACH;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAGD,sBAAsB,CAAC;IACrB,QAAQ,EAAE,mBAAmB;IAC7B,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC3C,UAAU,EAAE,4BAA4B;CACzC,CAAC,CAAC"}
1
+ {"version":3,"file":"listEnvironments.js","sourceRoot":"","sources":["../../src/tools/listEnvironments.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"listProjects.d.ts","sourceRoot":"","sources":["../../src/tools/listProjects.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,QAkDzD"}
1
+ {"version":3,"file":"listProjects.d.ts","sourceRoot":"","sources":["../../src/tools/listProjects.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,QAyEzD"}
@@ -1,49 +1,72 @@
1
- import { Client, ProjectRepository } from "@octopusdeploy/api-client";
1
+ import { Client, 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";
5
5
  import { getClientConfigurationFromEnvironment } from "../helpers/getClientConfigurationFromEnvironment.js";
6
6
  import { projectsDescription } from "../types/projectTypes.js";
7
+ import { handleOctopusApiError } from "../helpers/errorHandling.js";
7
8
  export function registerListProjectsTool(server) {
8
9
  server.tool("list_projects", `This tool lists all projects in a given space. ${projectsDescription} The space name is required, if you can't find the space name, ask the user directly for the name of the space. Optionally filter by partial name match using partialName parameter.`, {
9
10
  spaceName: z.string(),
10
11
  partialName: z.string().optional(),
11
12
  skip: z.number().optional(),
12
- take: z.number().optional()
13
+ take: z.number().optional(),
13
14
  }, {
14
15
  title: "List all projects in an Octopus Deploy space",
15
16
  readOnlyHint: true,
16
17
  }, async ({ spaceName, partialName, skip, take }) => {
17
- const configuration = getClientConfigurationFromEnvironment();
18
- const client = await Client.create(configuration);
19
- const projectRepository = new ProjectRepository(client, spaceName);
20
- const projectsResponse = await projectRepository.list({ partialName, skip, take });
21
- return {
22
- content: [
23
- {
24
- type: "text",
25
- text: JSON.stringify({
26
- totalResults: projectsResponse.TotalResults,
27
- itemsPerPage: projectsResponse.ItemsPerPage,
28
- numberOfPages: projectsResponse.NumberOfPages,
29
- lastPageNumber: projectsResponse.LastPageNumber,
30
- items: projectsResponse.Items.map((project) => ({
31
- spaceId: project.SpaceId,
32
- id: project.Id,
33
- name: project.Name,
34
- description: project.Description,
35
- slug: project.Slug,
36
- deploymentProcessId: project.DeploymentProcessId,
37
- lifecycleId: project.LifecycleId,
38
- isDisabled: project.IsDisabled,
39
- repositoryUrl: project.PersistenceSettings.Type === "VersionControlled"
40
- ? project.PersistenceSettings.Url
41
- : null,
42
- })),
43
- }),
44
- },
45
- ],
46
- };
18
+ try {
19
+ const configuration = getClientConfigurationFromEnvironment();
20
+ const client = await Client.create(configuration);
21
+ const projectRepository = new ProjectRepository(client, spaceName);
22
+ const projectsResponse = await projectRepository.list({
23
+ partialName,
24
+ skip,
25
+ take,
26
+ });
27
+ if (projectsResponse.Items.length === 0) {
28
+ const message = partialName
29
+ ? `No projects found matching '${partialName}' in space '${spaceName}'. Project names are case-sensitive.`
30
+ : `No projects found in space '${spaceName}'. This space may be empty or you may not have permission to view projects.`;
31
+ return {
32
+ content: [
33
+ {
34
+ type: "text",
35
+ text: message,
36
+ },
37
+ ],
38
+ };
39
+ }
40
+ return {
41
+ content: [
42
+ {
43
+ type: "text",
44
+ text: JSON.stringify({
45
+ totalResults: projectsResponse.TotalResults,
46
+ itemsPerPage: projectsResponse.ItemsPerPage,
47
+ numberOfPages: projectsResponse.NumberOfPages,
48
+ lastPageNumber: projectsResponse.LastPageNumber,
49
+ items: projectsResponse.Items.map((project) => ({
50
+ spaceId: project.SpaceId,
51
+ id: project.Id,
52
+ name: project.Name,
53
+ description: project.Description,
54
+ slug: project.Slug,
55
+ deploymentProcessId: project.DeploymentProcessId,
56
+ lifecycleId: project.LifecycleId,
57
+ isDisabled: project.IsDisabled,
58
+ repositoryUrl: project.PersistenceSettings.Type === "VersionControlled"
59
+ ? project.PersistenceSettings.Url
60
+ : null,
61
+ })),
62
+ }),
63
+ },
64
+ ],
65
+ };
66
+ }
67
+ catch (error) {
68
+ handleOctopusApiError(error, { spaceName });
69
+ }
47
70
  });
48
71
  }
49
72
  registerToolDefinition({
@@ -1 +1 @@
1
- {"version":3,"file":"listProjects.js","sourceRoot":"","sources":["../../src/tools/listProjects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAgB,MAAM,2BAA2B,CAAC;AACpF,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,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,IAAI,CACT,eAAe,EACf,kDAAkD,mBAAmB,sLAAsL,EAC3P;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAClC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC5B,EACD;QACE,KAAK,EAAE,8CAA8C;QACrD,YAAY,EAAE,IAAI;KACnB,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QAC/C,MAAM,aAAa,GAAG,qCAAqC,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAEnE,MAAM,gBAAgB,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAEnF,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,YAAY,EAAE,gBAAgB,CAAC,YAAY;wBAC3C,YAAY,EAAE,gBAAgB,CAAC,YAAY;wBAC3C,aAAa,EAAE,gBAAgB,CAAC,aAAa;wBAC7C,cAAc,EAAE,gBAAgB,CAAC,cAAc;wBAC/C,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAgB,EAAE,EAAE,CAAC,CAAC;4BACvD,OAAO,EAAE,OAAO,CAAC,OAAO;4BACxB,EAAE,EAAE,OAAO,CAAC,EAAE;4BACd,IAAI,EAAE,OAAO,CAAC,IAAI;4BAClB,WAAW,EAAE,OAAO,CAAC,WAAW;4BAChC,IAAI,EAAE,OAAO,CAAC,IAAI;4BAClB,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;4BAChD,WAAW,EAAE,OAAO,CAAC,WAAW;4BAChC,UAAU,EAAE,OAAO,CAAC,UAAU;4BAC9B,aAAa,EACX,OAAO,CAAC,mBAAmB,CAAC,IAAI,KAAK,mBAAmB;gCACtD,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG;gCACjC,CAAC,CAAC,IAAI;yBACX,CAAC,CAAC;qBACJ,CAAC;iBACH;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,sBAAsB,CAAC;IACrB,QAAQ,EAAE,eAAe;IACzB,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC/C,UAAU,EAAE,wBAAwB;CACrC,CAAC,CAAC"}
1
+ {"version":3,"file":"listProjects.js","sourceRoot":"","sources":["../../src/tools/listProjects.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"listSpaces.d.ts","sourceRoot":"","sources":["../../src/tools/listSpaces.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,QA0CvD"}
1
+ {"version":3,"file":"listSpaces.d.ts","sourceRoot":"","sources":["../../src/tools/listSpaces.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,QAiEvD"}
@@ -4,39 +4,62 @@ import { getClientConfigurationFromEnvironment } from "../helpers/getClientConfi
4
4
  import {} from "@modelcontextprotocol/sdk/server/mcp.js";
5
5
  import { registerToolDefinition } from "../types/toolConfig.js";
6
6
  import { spacesDescription } from "../types/spaceTypes.js";
7
+ import { handleOctopusApiError } from "../helpers/errorHandling.js";
7
8
  export function registerListSpacesTool(server) {
8
9
  server.tool("list_spaces", `List all spaces in the Octopus Deploy instance. ${spacesDescription} Always use this tool first to check that the requested space exists.`, {
9
10
  partialName: z.string().optional(),
10
11
  skip: z.number().optional(),
11
- take: z.number().optional()
12
+ take: z.number().optional(),
12
13
  }, {
13
14
  title: "List all spaces in an Octopus Deploy instance",
14
15
  readOnlyHint: true,
15
16
  }, async ({ partialName, skip, take }) => {
16
- const configuration = getClientConfigurationFromEnvironment();
17
- const client = await Client.create(configuration);
18
- const spaceRepository = new SpaceRepository(client);
19
- const spacesResponse = await spaceRepository.list({ partialName, skip, take });
20
- return {
21
- content: [
22
- {
23
- type: "text",
24
- text: JSON.stringify({
25
- totalResults: spacesResponse.TotalResults,
26
- itemsPerPage: spacesResponse.ItemsPerPage,
27
- numberOfPages: spacesResponse.NumberOfPages,
28
- lastPageNumber: spacesResponse.LastPageNumber,
29
- items: spacesResponse.Items.map((space) => ({
30
- id: space.Id,
31
- name: space.Name,
32
- description: space.Description,
33
- isDefault: space.IsDefault,
34
- taskQueueStopped: space.TaskQueueStopped,
35
- }))
36
- }),
37
- },
38
- ],
39
- };
17
+ try {
18
+ const configuration = getClientConfigurationFromEnvironment();
19
+ const client = await Client.create(configuration);
20
+ const spaceRepository = new SpaceRepository(client);
21
+ const spacesResponse = await spaceRepository.list({
22
+ partialName,
23
+ skip,
24
+ take,
25
+ });
26
+ if (spacesResponse.Items.length === 0) {
27
+ const message = partialName
28
+ ? `No spaces found matching '${partialName}'. Space names are case-sensitive.`
29
+ : "No spaces found. This may indicate a configuration or permission issue.";
30
+ return {
31
+ content: [
32
+ {
33
+ type: "text",
34
+ text: message,
35
+ },
36
+ ],
37
+ };
38
+ }
39
+ return {
40
+ content: [
41
+ {
42
+ type: "text",
43
+ text: JSON.stringify({
44
+ totalResults: spacesResponse.TotalResults,
45
+ itemsPerPage: spacesResponse.ItemsPerPage,
46
+ numberOfPages: spacesResponse.NumberOfPages,
47
+ lastPageNumber: spacesResponse.LastPageNumber,
48
+ items: spacesResponse.Items.map((space) => ({
49
+ id: space.Id,
50
+ name: space.Name,
51
+ description: space.Description,
52
+ isDefault: space.IsDefault,
53
+ taskQueueStopped: space.TaskQueueStopped,
54
+ })),
55
+ }),
56
+ },
57
+ ],
58
+ };
59
+ }
60
+ catch (error) {
61
+ handleOctopusApiError(error, {});
62
+ }
40
63
  });
41
64
  }
42
65
  registerToolDefinition({
@@ -1 +1 @@
1
- {"version":3,"file":"listSpaces.js","sourceRoot":"","sources":["../../src/tools/listSpaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,qCAAqC,EAAE,MAAM,qDAAqD,CAAC;AAC5G,OAAO,EAAkB,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,IAAI,CACT,aAAa,EACb,mDAAmD,iBAAiB,uEAAuE,EAC3I;QACE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAClC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC5B,EACD;QACE,KAAK,EAAE,+CAA+C;QACtD,YAAY,EAAE,IAAI;KACnB,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QACpC,MAAM,aAAa,GAAG,qCAAqC,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;QAEpD,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/E,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,YAAY,EAAE,cAAc,CAAC,YAAY;wBACzC,YAAY,EAAE,cAAc,CAAC,YAAY;wBACzC,aAAa,EAAE,cAAc,CAAC,aAAa;wBAC3C,cAAc,EAAE,cAAc,CAAC,cAAc;wBAC7C,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;4BAC1C,EAAE,EAAE,KAAK,CAAC,EAAE;4BACZ,IAAI,EAAE,KAAK,CAAC,IAAI;4BAChB,WAAW,EAAE,KAAK,CAAC,WAAW;4BAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;4BAC1B,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;yBACzC,CAAC,CAAC;qBACJ,CAAC;iBACH;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,sBAAsB,CAAC;IACrB,QAAQ,EAAE,aAAa;IACvB,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC3C,UAAU,EAAE,sBAAsB;CACnC,CAAC,CAAC"}
1
+ {"version":3,"file":"listSpaces.js","sourceRoot":"","sources":["../../src/tools/listSpaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,qCAAqC,EAAE,MAAM,qDAAqD,CAAC;AAC5G,OAAO,EAAkB,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,IAAI,CACT,aAAa,EACb,mDAAmD,iBAAiB,uEAAuE,EAC3I;QACE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAClC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC5B,EACD;QACE,KAAK,EAAE,+CAA+C;QACtD,YAAY,EAAE,IAAI;KACnB,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QACpC,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,qCAAqC,EAAE,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAClD,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;YAEpD,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC;gBAChD,WAAW;gBACX,IAAI;gBACJ,IAAI;aACL,CAAC,CAAC;YAEH,IAAI,cAAc,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtC,MAAM,OAAO,GAAG,WAAW;oBACzB,CAAC,CAAC,6BAA6B,WAAW,oCAAoC;oBAC9E,CAAC,CAAC,yEAAyE,CAAC;gBAE9E,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,OAAO;yBACd;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,YAAY,EAAE,cAAc,CAAC,YAAY;4BACzC,YAAY,EAAE,cAAc,CAAC,YAAY;4BACzC,aAAa,EAAE,cAAc,CAAC,aAAa;4BAC3C,cAAc,EAAE,cAAc,CAAC,cAAc;4BAC7C,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gCAC1C,EAAE,EAAE,KAAK,CAAC,EAAE;gCACZ,IAAI,EAAE,KAAK,CAAC,IAAI;gCAChB,WAAW,EAAE,KAAK,CAAC,WAAW;gCAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;gCAC1B,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;6BACzC,CAAC,CAAC;yBACJ,CAAC;qBACH;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,qBAAqB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,sBAAsB,CAAC;IACrB,QAAQ,EAAE,aAAa;IACvB,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC3C,UAAU,EAAE,sBAAsB;CACnC,CAAC,CAAC"}
@@ -1,2 +1,13 @@
1
+ import { type NamedResource, type SpaceScopedResource } from "./baseResource.js";
1
2
  export declare const tenantsDescription = "Tenants represent customers or clients in Octopus Deploy, allowing you to manage deployments and configurations specific to each tenant. Tenants can be grouped into tenant tags for easier management and deployment targeting. Tenants can also represent geographical locations, organizational units, or any other logical grouping.";
3
+ export interface TenantResource extends SpaceScopedResource, NamedResource {
4
+ IsDisabled: boolean | undefined;
5
+ Slug: string;
6
+ Description: string | null;
7
+ ClonedFromTenantId: string | null;
8
+ TenantTags: string[];
9
+ ProjectEnvironments: {
10
+ [projectId: string]: string[];
11
+ };
12
+ }
2
13
  //# sourceMappingURL=tenantsTypes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tenantsTypes.d.ts","sourceRoot":"","sources":["../../src/types/tenantsTypes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,6UAA6U,CAAC"}
1
+ {"version":3,"file":"tenantsTypes.d.ts","sourceRoot":"","sources":["../../src/types/tenantsTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEjF,eAAO,MAAM,kBAAkB,6UAA6U,CAAC;AAE7W,MAAM,WAAW,cAAe,SAAQ,mBAAmB,EAAE,aAAa;IACtE,UAAU,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,mBAAmB,EAAE;QACjB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KACjC,CAAC;CACL"}
@@ -1,2 +1,3 @@
1
+ import {} from "./baseResource.js";
1
2
  export const tenantsDescription = "Tenants represent customers or clients in Octopus Deploy, allowing you to manage deployments and configurations specific to each tenant. Tenants can be grouped into tenant tags for easier management and deployment targeting. Tenants can also represent geographical locations, organizational units, or any other logical grouping.";
2
3
  //# sourceMappingURL=tenantsTypes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tenantsTypes.js","sourceRoot":"","sources":["../../src/types/tenantsTypes.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,0UAA0U,CAAC"}
1
+ {"version":3,"file":"tenantsTypes.js","sourceRoot":"","sources":["../../src/types/tenantsTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgD,MAAM,mBAAmB,CAAC;AAEjF,MAAM,CAAC,MAAM,kBAAkB,GAAG,0UAA0U,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const SEMVER_VERSION: string;
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,QAAsB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import packageJson from "../../package.json" with { type: "json" };
2
+ export const SEMVER_VERSION = packageJson.version;
3
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,oBAAoB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAEnE,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC"}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "bugs": {
5
5
  "url": "https://github.com/OctopusDeploy/mcp-server/issues"
6
6
  },
7
- "version": "1.0.0",
7
+ "version": "1.1.0",
8
8
  "type": "module",
9
9
  "description": "The Octopus MCP Server provides your AI assistant with powerful tools that allow it to inspect, query, and diagnose problems within your Octopus instance.",
10
10
  "main": "dist/index.js",
@@ -20,7 +20,10 @@
20
20
  "build": "tsc && shx chmod +x dist/*.js",
21
21
  "dev": "nodemon --quiet --exec \"tsc && node dist/index.js\" --ext ts --watch src",
22
22
  "lint": "eslint src --ext .ts",
23
- "lint:fix": "eslint src --ext .ts --fix"
23
+ "lint:fix": "eslint src --ext .ts --fix",
24
+ "test": "vitest run --reporter=verbose",
25
+ "test:watch": "vitest",
26
+ "test:coverage": "vitest run --coverage"
24
27
  },
25
28
  "keywords": [
26
29
  "octopus deploy",
@@ -47,12 +50,15 @@
47
50
  "devDependencies": {
48
51
  "@eslint/js": "^9.35.0",
49
52
  "@types/node": "^24.3.1",
53
+ "@vitest/coverage-v8": "^2.1.8",
54
+ "@vitest/ui": "^2.1.8",
50
55
  "eslint": "^9.35.0",
51
56
  "globals": "^16.3.0",
52
57
  "jiti": "^2.5.1",
53
58
  "nodemon": "^3.1.10",
54
59
  "shx": "^0.4.0",
55
60
  "typescript": "^5.9.2",
56
- "typescript-eslint": "^8.42.0"
61
+ "typescript-eslint": "^8.42.0",
62
+ "vitest": "^2.1.8"
57
63
  }
58
64
  }
@@ -1,3 +0,0 @@
1
- import { type McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerGetAccountTool(server: McpServer): void;
3
- //# sourceMappingURL=getAccount.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getAccount.d.ts","sourceRoot":"","sources":["../../src/tools/getAccount.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,QAuCvD"}
@@ -1,40 +0,0 @@
1
- import { Client, resolveSpaceId } from "@octopusdeploy/api-client";
2
- import { z } from "zod";
3
- import {} from "@modelcontextprotocol/sdk/server/mcp.js";
4
- import { registerToolDefinition } from "../types/toolConfig.js";
5
- import { getClientConfigurationFromEnvironment } from "../helpers/getClientConfigurationFromEnvironment.js";
6
- import { mapAccountResource } from "../types/accountTypes.js";
7
- export function registerGetAccountTool(server) {
8
- server.tool("get_account", `Get details for a specific account by its ID
9
-
10
- This tool retrieves detailed information about a specific account using its ID. The space name and account ID are both required.`, {
11
- spaceName: z.string(),
12
- accountId: z.string().describe("The ID of the account to retrieve"),
13
- }, {
14
- title: "Get a specific account by ID from an Octopus Deploy space",
15
- readOnlyHint: true,
16
- }, async ({ spaceName, accountId }) => {
17
- const configuration = getClientConfigurationFromEnvironment();
18
- const client = await Client.create(configuration);
19
- const spaceId = await resolveSpaceId(client, spaceName);
20
- const response = await client.get("~/api/{spaceId}/accounts/{id}", {
21
- spaceId,
22
- id: accountId,
23
- });
24
- const account = mapAccountResource(response);
25
- return {
26
- content: [
27
- {
28
- type: "text",
29
- text: JSON.stringify(account),
30
- },
31
- ],
32
- };
33
- });
34
- }
35
- registerToolDefinition({
36
- toolName: "get_account",
37
- config: { toolset: "accounts", readOnly: true },
38
- registerFn: registerGetAccountTool,
39
- });
40
- //# sourceMappingURL=getAccount.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getAccount.js","sourceRoot":"","sources":["../../src/tools/getAccount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACnE,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,EAEL,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAElC,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,IAAI,CACT,aAAa,EACb;;iIAE6H,EAC7H;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;KACpE,EACD;QACE,KAAK,EAAE,2DAA2D;QAClE,YAAY,EAAE,IAAI;KACnB,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE;QACjC,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;QAExD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAC/B,+BAA+B,EAC/B;YACE,OAAO;YACP,EAAE,EAAE,SAAS;SACd,CACF,CAAC;QAEF,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAE7C,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;iBAC9B;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,sBAAsB,CAAC;IACrB,QAAQ,EAAE,aAAa;IACvB,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC/C,UAAU,EAAE,sBAAsB;CACnC,CAAC,CAAC"}
@@ -1,3 +0,0 @@
1
- import { type McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerGetCertificateTool(server: McpServer): void;
3
- //# sourceMappingURL=getCertificate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getCertificate.d.ts","sourceRoot":"","sources":["../../src/tools/getCertificate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,QAuC3D"}
@@ -1,40 +0,0 @@
1
- import { Client, resolveSpaceId } from "@octopusdeploy/api-client";
2
- import { z } from "zod";
3
- import {} from "@modelcontextprotocol/sdk/server/mcp.js";
4
- import { registerToolDefinition } from "../types/toolConfig.js";
5
- import { getClientConfigurationFromEnvironment } from "../helpers/getClientConfigurationFromEnvironment.js";
6
- import { mapCertificateResource } from "../types/certificateTypes.js";
7
- export function registerGetCertificateTool(server) {
8
- server.tool("get_certificate", `Get details for a specific certificate by its ID
9
-
10
- This tool retrieves detailed information about a specific certificate using its ID. The space name and certificate ID are both required.`, {
11
- spaceName: z.string(),
12
- certificateId: z.string().describe("The ID of the certificate to retrieve"),
13
- }, {
14
- title: "Get a specific certificate by ID from an Octopus Deploy space",
15
- readOnlyHint: true,
16
- }, async ({ spaceName, certificateId }) => {
17
- const configuration = getClientConfigurationFromEnvironment();
18
- const client = await Client.create(configuration);
19
- const spaceId = await resolveSpaceId(client, spaceName);
20
- const response = await client.get("~/api/{spaceId}/certificates/{id}", {
21
- spaceId,
22
- id: certificateId,
23
- });
24
- const certificate = mapCertificateResource(response);
25
- return {
26
- content: [
27
- {
28
- type: "text",
29
- text: JSON.stringify(certificate),
30
- },
31
- ],
32
- };
33
- });
34
- }
35
- registerToolDefinition({
36
- toolName: "get_certificate",
37
- config: { toolset: "certificates", readOnly: true },
38
- registerFn: registerGetCertificateTool,
39
- });
40
- //# sourceMappingURL=getCertificate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getCertificate.js","sourceRoot":"","sources":["../../src/tools/getCertificate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACnE,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,EAA4B,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAEhG,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB;;yIAEqI,EACrI;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;KAC5E,EACD;QACE,KAAK,EAAE,+DAA+D;QACtE,YAAY,EAAE,IAAI;KACnB,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,EAAE;QACrC,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;QAExD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAC/B,mCAAmC,EACnC;YACE,OAAO;YACP,EAAE,EAAE,aAAa;SAClB,CACF,CAAC;QAEF,MAAM,WAAW,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QAErD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;iBAClC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,sBAAsB,CAAC;IACrB,QAAQ,EAAE,iBAAiB;IAC3B,MAAM,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;IACnD,UAAU,EAAE,0BAA0B;CACvC,CAAC,CAAC"}
@@ -1,3 +0,0 @@
1
- import { type McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerGetDeploymentTargetTool(server: McpServer): void;
3
- //# sourceMappingURL=getDeploymentTarget.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getDeploymentTarget.d.ts","sourceRoot":"","sources":["../../src/tools/getDeploymentTarget.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,SAAS,QAiEhE"}
@@ -1,66 +0,0 @@
1
- import { Client, resolveSpaceId } from "@octopusdeploy/api-client";
2
- import { z } from "zod";
3
- import {} from "@modelcontextprotocol/sdk/server/mcp.js";
4
- import { registerToolDefinition } from "../types/toolConfig.js";
5
- import { getClientConfigurationFromEnvironment } from "../helpers/getClientConfigurationFromEnvironment.js";
6
- import {} from "../types/deploymentTargetTypes.js";
7
- export function registerGetDeploymentTargetTool(server) {
8
- server.tool("get_deployment_target", `Get a specific deployment target (machine) by ID
9
-
10
- This tool retrieves detailed information about a specific deployment target using its ID. The space name and target ID are both required.`, {
11
- spaceName: z.string(),
12
- targetId: z.string(),
13
- }, {
14
- title: "Get a specific deployment target from an Octopus Deploy space",
15
- readOnlyHint: true,
16
- }, async ({ spaceName, targetId }) => {
17
- const configuration = getClientConfigurationFromEnvironment();
18
- const client = await Client.create(configuration);
19
- const spaceId = await resolveSpaceId(client, spaceName);
20
- const target = await client.get("~/api/{spaceId}/machines/{id}", {
21
- spaceId,
22
- id: targetId,
23
- });
24
- const deploymentTarget = {
25
- spaceId: target.SpaceId,
26
- id: target.Id,
27
- name: target.Name,
28
- slug: target.Slug,
29
- isDisabled: target.IsDisabled,
30
- healthStatus: target.HealthStatus,
31
- statusSummary: target.StatusSummary,
32
- environmentIds: target.EnvironmentIds,
33
- roles: target.Roles,
34
- tenantedDeploymentParticipation: target.TenantedDeploymentParticipation,
35
- tenantIds: target.TenantIds,
36
- tenantTags: target.TenantTags,
37
- endpoint: {
38
- id: target.Endpoint.Id,
39
- communicationStyle: target.Endpoint.CommunicationStyle,
40
- uri: target.Endpoint.Uri,
41
- fingerprint: target.Endpoint.Fingerprint,
42
- proxyId: target.Endpoint.ProxyId,
43
- tentacleVersionDetails: target.Endpoint.TentacleVersionDetails,
44
- },
45
- shellName: target.ShellName,
46
- machinePolicyId: target.MachinePolicyId,
47
- hasLatestCalamari: target.HasLatestCalamari,
48
- isInProcess: target.IsInProcess,
49
- links: target.Links,
50
- };
51
- return {
52
- content: [
53
- {
54
- type: "text",
55
- text: JSON.stringify(deploymentTarget),
56
- },
57
- ],
58
- };
59
- });
60
- }
61
- registerToolDefinition({
62
- toolName: "get_deployment_target",
63
- config: { toolset: "machines", readOnly: true },
64
- registerFn: registerGetDeploymentTargetTool,
65
- });
66
- //# sourceMappingURL=getDeploymentTarget.js.map