@octopusdeploy/mcp-server 1.0.1 → 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 (143) 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/utils/version.d.ts +2 -0
  100. package/dist/utils/version.d.ts.map +1 -0
  101. package/dist/utils/version.js +3 -0
  102. package/dist/utils/version.js.map +1 -0
  103. package/package.json +9 -3
  104. package/dist/tools/getAccount.d.ts +0 -3
  105. package/dist/tools/getAccount.d.ts.map +0 -1
  106. package/dist/tools/getAccount.js +0 -40
  107. package/dist/tools/getAccount.js.map +0 -1
  108. package/dist/tools/getCertificate.d.ts +0 -3
  109. package/dist/tools/getCertificate.d.ts.map +0 -1
  110. package/dist/tools/getCertificate.js +0 -40
  111. package/dist/tools/getCertificate.js.map +0 -1
  112. package/dist/tools/getDeploymentTarget.d.ts +0 -3
  113. package/dist/tools/getDeploymentTarget.d.ts.map +0 -1
  114. package/dist/tools/getDeploymentTarget.js +0 -66
  115. package/dist/tools/getDeploymentTarget.js.map +0 -1
  116. package/dist/tools/getReleaseById.d.ts +0 -3
  117. package/dist/tools/getReleaseById.d.ts.map +0 -1
  118. package/dist/tools/getReleaseById.js +0 -45
  119. package/dist/tools/getReleaseById.js.map +0 -1
  120. package/dist/tools/getTenantById.d.ts +0 -3
  121. package/dist/tools/getTenantById.d.ts.map +0 -1
  122. package/dist/tools/getTenantById.js +0 -50
  123. package/dist/tools/getTenantById.js.map +0 -1
  124. package/dist/tools/listAccounts.d.ts +0 -3
  125. package/dist/tools/listAccounts.d.ts.map +0 -1
  126. package/dist/tools/listAccounts.js +0 -54
  127. package/dist/tools/listAccounts.js.map +0 -1
  128. package/dist/tools/listCertificates.d.ts +0 -3
  129. package/dist/tools/listCertificates.d.ts.map +0 -1
  130. package/dist/tools/listCertificates.js +0 -62
  131. package/dist/tools/listCertificates.js.map +0 -1
  132. package/dist/tools/listDeploymentTargets.d.ts +0 -3
  133. package/dist/tools/listDeploymentTargets.d.ts.map +0 -1
  134. package/dist/tools/listDeploymentTargets.js +0 -98
  135. package/dist/tools/listDeploymentTargets.js.map +0 -1
  136. package/dist/tools/listReleases.d.ts +0 -3
  137. package/dist/tools/listReleases.d.ts.map +0 -1
  138. package/dist/tools/listReleases.js +0 -54
  139. package/dist/tools/listReleases.js.map +0 -1
  140. package/dist/tools/listTenants.d.ts +0 -3
  141. package/dist/tools/listTenants.d.ts.map +0 -1
  142. package/dist/tools/listTenants.js +0 -69
  143. package/dist/tools/listTenants.js.map +0 -1
@@ -0,0 +1,3 @@
1
+ import { type McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerDeployReleaseTool(server: McpServer): void;
3
+ //# sourceMappingURL=deployRelease.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployRelease.d.ts","sourceRoot":"","sources":["../../src/tools/deployRelease.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,QAyP1D"}
@@ -0,0 +1,207 @@
1
+ import { Client, DeploymentRepository } from "@octopusdeploy/api-client";
2
+ import { z } from "zod";
3
+ import {} from "@modelcontextprotocol/sdk/server/mcp.js";
4
+ import { getClientConfigurationFromEnvironment } from "../helpers/getClientConfigurationFromEnvironment.js";
5
+ import { registerToolDefinition } from "../types/toolConfig.js";
6
+ import { handleOctopusApiError } from "../helpers/errorHandling.js";
7
+ export function registerDeployReleaseTool(server) {
8
+ server.tool("deploy_release", `Deploy a release to one or more environments in Octopus Deploy
9
+
10
+ This tool supports both tenanted and untenanted deployments:
11
+ - **Untenanted**: Don't provide tenants or tenantTags. Can deploy to multiple environments at once.
12
+ - **Tenanted**: Provide tenants or tenantTags. Can only deploy to ONE environment, but can target multiple tenants.
13
+
14
+ The tool automatically determines which deployment type to use based on the parameters provided.`, {
15
+ spaceName: z.string().describe("The space name"),
16
+ projectName: z.string().describe("The project name"),
17
+ releaseVersion: z
18
+ .string()
19
+ .describe("The release version to deploy (e.g., '1.0.0')"),
20
+ environmentNames: z
21
+ .array(z.string())
22
+ .describe("Array of environment names. For tenanted deployments, must contain exactly one environment."),
23
+ tenants: z
24
+ .array(z.string())
25
+ .optional()
26
+ .describe("Array of tenant names for tenanted deployment (optional)"),
27
+ tenantTags: z
28
+ .array(z.string())
29
+ .optional()
30
+ .describe("Array of tenant tags for tenanted deployment (e.g., ['Region/US-West', 'Tier/Production'])"),
31
+ forcePackageRedeployment: z
32
+ .boolean()
33
+ .optional()
34
+ .describe("Force redeployment of packages"),
35
+ updateVariableSnapshot: z
36
+ .boolean()
37
+ .optional()
38
+ .describe("Update the variable snapshot"),
39
+ forcePackageDownload: z
40
+ .boolean()
41
+ .optional()
42
+ .describe("Force package download"),
43
+ specificMachineNames: z
44
+ .array(z.string())
45
+ .optional()
46
+ .describe("Deploy to specific machines only"),
47
+ excludedMachineNames: z
48
+ .array(z.string())
49
+ .optional()
50
+ .describe("Exclude specific machines from deployment"),
51
+ skipStepNames: z
52
+ .array(z.string())
53
+ .optional()
54
+ .describe("Skip specific deployment steps"),
55
+ useGuidedFailure: z
56
+ .boolean()
57
+ .optional()
58
+ .describe("Use guided failure mode"),
59
+ runAt: z
60
+ .string()
61
+ .optional()
62
+ .describe("Schedule deployment for later (ISO 8601 date string)"),
63
+ noRunAfter: z
64
+ .string()
65
+ .optional()
66
+ .describe("Don't run deployment after this time (ISO 8601 date string)"),
67
+ variables: z
68
+ .record(z.string())
69
+ .optional()
70
+ .describe("Prompted variable values as key-value pairs"),
71
+ deploymentFreezeOverrideReason: z
72
+ .string()
73
+ .optional()
74
+ .describe("Reason for overriding deployment freeze"),
75
+ deploymentFreezeNames: z
76
+ .array(z.string())
77
+ .optional()
78
+ .describe("Names of deployment freezes to override"),
79
+ }, {
80
+ title: "Deploy a release to environments in Octopus Deploy",
81
+ readOnlyHint: false,
82
+ }, async ({ spaceName, projectName, releaseVersion, environmentNames, tenants, tenantTags, forcePackageRedeployment, updateVariableSnapshot, forcePackageDownload, specificMachineNames, excludedMachineNames, skipStepNames, useGuidedFailure, runAt, noRunAfter, variables, deploymentFreezeOverrideReason, deploymentFreezeNames, }) => {
83
+ try {
84
+ // Validate environment names
85
+ if (!environmentNames || environmentNames.length === 0) {
86
+ throw new Error("At least one environment name must be provided.");
87
+ }
88
+ // Determine if this is a tenanted deployment
89
+ const isTenanted = (tenants && tenants.length > 0) ||
90
+ (tenantTags && tenantTags.length > 0);
91
+ // Validate tenanted deployment constraints
92
+ if (isTenanted && environmentNames.length !== 1) {
93
+ throw new Error(`Tenanted deployments can only target one environment at a time. You provided ${environmentNames.length} environments. ` +
94
+ `For tenanted deployments, specify exactly one environment in environmentNames, then use tenants or tenantTags to target specific tenants.`);
95
+ }
96
+ const configuration = getClientConfigurationFromEnvironment();
97
+ const client = await Client.create(configuration);
98
+ const deploymentRepository = new DeploymentRepository(client, spaceName);
99
+ // Build common parameters
100
+ const commonParams = {
101
+ spaceName: spaceName,
102
+ ProjectName: projectName,
103
+ ...(forcePackageRedeployment !== undefined && {
104
+ ForcePackageRedeployment: forcePackageRedeployment,
105
+ }),
106
+ ...(updateVariableSnapshot !== undefined && {
107
+ UpdateVariableSnapshot: updateVariableSnapshot,
108
+ }),
109
+ ...(forcePackageDownload !== undefined && {
110
+ ForcePackageDownload: forcePackageDownload,
111
+ }),
112
+ ...(specificMachineNames && {
113
+ SpecificMachineNames: specificMachineNames,
114
+ }),
115
+ ...(excludedMachineNames && {
116
+ ExcludedMachineNames: excludedMachineNames,
117
+ }),
118
+ ...(skipStepNames && { SkipStepNames: skipStepNames }),
119
+ ...(useGuidedFailure !== undefined && {
120
+ UseGuidedFailure: useGuidedFailure,
121
+ }),
122
+ ...(runAt && { RunAt: new Date(runAt) }),
123
+ ...(noRunAfter && { NoRunAfter: new Date(noRunAfter) }),
124
+ ...(variables && { Variables: variables }),
125
+ ...(deploymentFreezeOverrideReason && {
126
+ DeploymentFreezeOverrideReason: deploymentFreezeOverrideReason,
127
+ }),
128
+ ...(deploymentFreezeNames && {
129
+ DeploymentFreezeNames: deploymentFreezeNames,
130
+ }),
131
+ };
132
+ let response;
133
+ let deploymentType;
134
+ if (isTenanted) {
135
+ // Tenanted deployment
136
+ deploymentType = "tenanted";
137
+ const command = {
138
+ ...commonParams,
139
+ ReleaseVersion: releaseVersion,
140
+ EnvironmentName: environmentNames[0],
141
+ Tenants: tenants || [],
142
+ TenantTags: tenantTags || [],
143
+ };
144
+ response = await deploymentRepository.createTenanted(command);
145
+ }
146
+ else {
147
+ // Untenanted deployment
148
+ deploymentType = "untenanted";
149
+ const command = {
150
+ ...commonParams,
151
+ ReleaseVersion: releaseVersion,
152
+ EnvironmentNames: environmentNames,
153
+ };
154
+ response = await deploymentRepository.create(command);
155
+ }
156
+ // Format the response
157
+ const tasks = response.DeploymentServerTasks || [];
158
+ return {
159
+ content: [
160
+ {
161
+ type: "text",
162
+ text: JSON.stringify({
163
+ success: true,
164
+ deploymentType,
165
+ deploymentsCreated: tasks.length,
166
+ deploymentTasks: tasks.map((task) => ({
167
+ taskId: task.ServerTaskId,
168
+ deploymentId: task.DeploymentId,
169
+ })),
170
+ message: `Successfully created ${tasks.length} deployment(s) for release ${releaseVersion}`,
171
+ helpText: `Use get_task_by_id with the taskId values to monitor deployment progress. Use list_deployments to view deployment details. Use find_releases to verify the release exists.`,
172
+ }, null, 2),
173
+ },
174
+ ],
175
+ };
176
+ }
177
+ catch (error) {
178
+ // Handle validation errors from our code
179
+ if (error instanceof Error && !error.message.includes("octopus")) {
180
+ return {
181
+ content: [
182
+ {
183
+ type: "text",
184
+ text: JSON.stringify({
185
+ success: false,
186
+ error: error.message,
187
+ }, null, 2),
188
+ },
189
+ ],
190
+ isError: true,
191
+ };
192
+ }
193
+ // Handle Octopus API errors
194
+ handleOctopusApiError(error, {
195
+ entityType: "deployment",
196
+ spaceName,
197
+ helpText: "Use list_projects to find valid project names, list_environments for environment names, find_releases to verify the release exists, and find_tenants for tenant information. Ensure you have permissions to create deployments.",
198
+ });
199
+ }
200
+ });
201
+ }
202
+ registerToolDefinition({
203
+ toolName: "deploy_release",
204
+ config: { toolset: "deployments", readOnly: false },
205
+ registerFn: registerDeployReleaseTool,
206
+ });
207
+ //# sourceMappingURL=deployRelease.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployRelease.js","sourceRoot":"","sources":["../../src/tools/deployRelease.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerFindAccountsTool(server: McpServer): void;
3
+ //# sourceMappingURL=findAccounts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findAccounts.d.ts","sourceRoot":"","sources":["../../src/tools/findAccounts.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUzE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,QAmGzD"}
@@ -0,0 +1,87 @@
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, AccountType } from "../types/accountTypes.js";
7
+ import { validateEntityId, handleOctopusApiError, ENTITY_PREFIXES } from "../helpers/errorHandling.js";
8
+ export function registerFindAccountsTool(server) {
9
+ server.tool("find_accounts", `Find accounts in a space - can retrieve a single account by ID or list all accounts
10
+
11
+ This unified tool can either:
12
+ - Get detailed information about a specific account when accountId is provided
13
+ - List all accounts in a space when accountId is omitted
14
+
15
+ You can optionally filter by various parameters like name, account type, etc. when listing.`, {
16
+ spaceName: z.string(),
17
+ accountId: z.string().optional().describe("The ID of a specific account to retrieve. If omitted, lists all accounts."),
18
+ skip: z.number().optional().describe("Number of accounts to skip for pagination (only used when listing)"),
19
+ take: z.number().optional().describe("Number of accounts to take for pagination (only used when listing)"),
20
+ ids: z.array(z.string()).optional().describe("Filter by specific account IDs (only used when listing)"),
21
+ partialName: z.string().optional().describe("Filter by partial name match (only used when listing)"),
22
+ accountType: z.nativeEnum(AccountType).optional().describe("Filter by account type (only used when listing)"),
23
+ }, {
24
+ title: "Find accounts in an Octopus Deploy space",
25
+ readOnlyHint: true,
26
+ }, async ({ spaceName, accountId, skip, take, ids, partialName, accountType, }) => {
27
+ const configuration = getClientConfigurationFromEnvironment();
28
+ const client = await Client.create(configuration);
29
+ const spaceId = await resolveSpaceId(client, spaceName);
30
+ // If accountId is provided, get a single account
31
+ if (accountId) {
32
+ validateEntityId(accountId, 'account', ENTITY_PREFIXES.account);
33
+ try {
34
+ const response = await client.get("~/api/{spaceId}/accounts/{id}", {
35
+ spaceId,
36
+ id: accountId,
37
+ });
38
+ const account = mapAccountResource(response);
39
+ return {
40
+ content: [
41
+ {
42
+ type: "text",
43
+ text: JSON.stringify(account),
44
+ },
45
+ ],
46
+ };
47
+ }
48
+ catch (error) {
49
+ handleOctopusApiError(error, {
50
+ entityType: 'account',
51
+ entityId: accountId,
52
+ spaceName
53
+ });
54
+ }
55
+ }
56
+ // Otherwise, list all accounts
57
+ const response = await client.get("~/api/{spaceId}/accounts{?skip,take,ids,partialName,accountType}", {
58
+ spaceId,
59
+ skip,
60
+ take,
61
+ ids,
62
+ partialName,
63
+ accountType,
64
+ });
65
+ const accounts = response.Items.map((account) => mapAccountResource(account));
66
+ return {
67
+ content: [
68
+ {
69
+ type: "text",
70
+ text: JSON.stringify({
71
+ totalResults: response.TotalResults,
72
+ itemsPerPage: response.ItemsPerPage,
73
+ numberOfPages: response.NumberOfPages,
74
+ lastPageNumber: response.LastPageNumber,
75
+ items: accounts,
76
+ }),
77
+ },
78
+ ],
79
+ };
80
+ });
81
+ }
82
+ registerToolDefinition({
83
+ toolName: "find_accounts",
84
+ config: { toolset: "accounts", readOnly: true },
85
+ registerFn: registerFindAccountsTool,
86
+ });
87
+ //# sourceMappingURL=findAccounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findAccounts.js","sourceRoot":"","sources":["../../src/tools/findAccounts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerFindCertificatesTool(server: McpServer): void;
3
+ //# sourceMappingURL=findCertificates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findCertificates.d.ts","sourceRoot":"","sources":["../../src/tools/findCertificates.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,QA+G7D"}
@@ -0,0 +1,95 @@
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
+ import { validateEntityId, handleOctopusApiError, ENTITY_PREFIXES } from "../helpers/errorHandling.js";
8
+ export function registerFindCertificatesTool(server) {
9
+ server.tool("find_certificates", `Find certificates in a space - can retrieve a single certificate by ID or list all certificates
10
+
11
+ This unified tool can either:
12
+ - Get detailed information about a specific certificate when certificateId is provided
13
+ - List all certificates in a space when certificateId is omitted
14
+
15
+ You can optionally filter by various parameters like name, archived status, tenant, etc. when listing.`, {
16
+ spaceName: z.string(),
17
+ certificateId: z.string().optional().describe("The ID of a specific certificate to retrieve. If omitted, lists all certificates."),
18
+ skip: z.number().optional().describe("Number of certificates to skip for pagination (only used when listing)"),
19
+ take: z.number().optional().describe("Number of certificates to take for pagination (only used when listing)"),
20
+ search: z.string().optional().describe("Search term to filter certificates (only used when listing)"),
21
+ archived: z.boolean().optional().describe("Filter by archived status (only used when listing)"),
22
+ tenant: z.string().optional().describe("Filter by tenant (only used when listing)"),
23
+ firstResult: z.number().optional().describe("Index of first result to return (only used when listing)"),
24
+ orderBy: z.string().optional().describe("Field to order results by (only used when listing)"),
25
+ ids: z.array(z.string()).optional().describe("Filter by specific certificate IDs (only used when listing)"),
26
+ partialName: z.string().optional().describe("Filter by partial name match (only used when listing)"),
27
+ }, {
28
+ title: "Find certificates in an Octopus Deploy space",
29
+ readOnlyHint: true,
30
+ }, async ({ spaceName, certificateId, skip, take, search, archived, tenant, firstResult, orderBy, ids, partialName, }) => {
31
+ const configuration = getClientConfigurationFromEnvironment();
32
+ const client = await Client.create(configuration);
33
+ const spaceId = await resolveSpaceId(client, spaceName);
34
+ // If certificateId is provided, get a single certificate
35
+ if (certificateId) {
36
+ validateEntityId(certificateId, 'certificate', ENTITY_PREFIXES.certificate);
37
+ try {
38
+ const response = await client.get("~/api/{spaceId}/certificates/{id}", {
39
+ spaceId,
40
+ id: certificateId,
41
+ });
42
+ const certificate = mapCertificateResource(response);
43
+ return {
44
+ content: [
45
+ {
46
+ type: "text",
47
+ text: JSON.stringify(certificate),
48
+ },
49
+ ],
50
+ };
51
+ }
52
+ catch (error) {
53
+ handleOctopusApiError(error, {
54
+ entityType: 'certificate',
55
+ entityId: certificateId,
56
+ spaceName
57
+ });
58
+ }
59
+ }
60
+ // Otherwise, list all certificates
61
+ const response = await client.get("~/api/{spaceId}/certificates{?skip,take,search,archived,tenant,firstResult,orderBy,ids,partialName}", {
62
+ spaceId,
63
+ skip,
64
+ take,
65
+ search,
66
+ archived,
67
+ tenant,
68
+ firstResult,
69
+ orderBy,
70
+ ids,
71
+ partialName,
72
+ });
73
+ const certificates = response.Items.map((cert) => mapCertificateResource(cert));
74
+ return {
75
+ content: [
76
+ {
77
+ type: "text",
78
+ text: JSON.stringify({
79
+ totalResults: response.TotalResults,
80
+ itemsPerPage: response.ItemsPerPage,
81
+ numberOfPages: response.NumberOfPages,
82
+ lastPageNumber: response.LastPageNumber,
83
+ items: certificates,
84
+ }),
85
+ },
86
+ ],
87
+ };
88
+ });
89
+ }
90
+ registerToolDefinition({
91
+ toolName: "find_certificates",
92
+ config: { toolset: "certificates", readOnly: true },
93
+ registerFn: registerFindCertificatesTool,
94
+ });
95
+ //# sourceMappingURL=findCertificates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findCertificates.js","sourceRoot":"","sources":["../../src/tools/findCertificates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerFindDeploymentTargetsTool(server: McpServer): void;
3
+ //# sourceMappingURL=findDeploymentTargets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findDeploymentTargets.d.ts","sourceRoot":"","sources":["../../src/tools/findDeploymentTargets.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,SAAS,QAqLlE"}
@@ -0,0 +1,158 @@
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
+ import { validateEntityId, handleOctopusApiError, ENTITY_PREFIXES } from "../helpers/errorHandling.js";
8
+ export function registerFindDeploymentTargetsTool(server) {
9
+ server.tool("find_deployment_targets", `Find deployment targets (machines) in a space - can retrieve a single target by ID or list all targets
10
+
11
+ This unified tool can either:
12
+ - Get detailed information about a specific deployment target when targetId is provided
13
+ - List all deployment targets in a space when targetId is omitted
14
+
15
+ You can optionally filter by various parameters like name, roles, health status, etc. when listing.`, {
16
+ spaceName: z.string(),
17
+ targetId: z.string().optional().describe("The ID of a specific deployment target to retrieve. If omitted, lists all deployment targets."),
18
+ skip: z.number().optional().describe("Number of targets to skip for pagination (only used when listing)"),
19
+ take: z.number().optional().describe("Number of targets to take for pagination (only used when listing)"),
20
+ name: z.string().optional().describe("Filter by exact name (only used when listing)"),
21
+ ids: z.array(z.string()).optional().describe("Filter by specific target IDs (only used when listing)"),
22
+ partialName: z.string().optional().describe("Filter by partial name match (only used when listing)"),
23
+ roles: z.array(z.string()).optional().describe("A list of roles / target tags to filter by (only used when listing)"),
24
+ isDisabled: z.boolean().optional().describe("Filter by disabled status (only used when listing)"),
25
+ healthStatuses: z.array(z.string()).optional().describe("Possible values: Healthy, Unhealthy, Unavailable, Unknown, HasWarnings (only used when listing)"),
26
+ commStyles: z.array(z.string()).optional().describe("Filter by communication styles (only used when listing)"),
27
+ tenantIds: z.array(z.string()).optional().describe("Filter by tenant IDs (only used when listing)"),
28
+ tenantTags: z.array(z.string()).optional().describe("Filter by tenant tags (only used when listing)"),
29
+ environmentIds: z.array(z.string()).optional().describe("Filter by environment IDs (only used when listing)"),
30
+ thumbprint: z.string().optional().describe("Filter by thumbprint (only used when listing)"),
31
+ deploymentId: z.string().optional().describe("Filter by deployment ID (only used when listing)"),
32
+ shellNames: z.array(z.string()).optional().describe("Filter by shell names (only used when listing)"),
33
+ deploymentTargetTypes: z.array(z.string()).optional().describe("Filter by deployment target types (only used when listing)"),
34
+ }, {
35
+ title: "Find deployment targets in an Octopus Deploy space",
36
+ readOnlyHint: true,
37
+ }, async ({ spaceName, targetId, skip, take, name, ids, partialName, roles, isDisabled, healthStatuses, commStyles, tenantIds, tenantTags, environmentIds, thumbprint, deploymentId, shellNames, deploymentTargetTypes, }) => {
38
+ const configuration = getClientConfigurationFromEnvironment();
39
+ const client = await Client.create(configuration);
40
+ const spaceId = await resolveSpaceId(client, spaceName);
41
+ // If targetId is provided, get a single deployment target
42
+ if (targetId) {
43
+ validateEntityId(targetId, 'machine', ENTITY_PREFIXES.machine);
44
+ try {
45
+ const target = await client.get("~/api/{spaceId}/machines/{id}", {
46
+ spaceId,
47
+ id: targetId,
48
+ });
49
+ const deploymentTarget = {
50
+ spaceId: target.SpaceId,
51
+ id: target.Id,
52
+ name: target.Name,
53
+ slug: target.Slug,
54
+ isDisabled: target.IsDisabled,
55
+ healthStatus: target.HealthStatus,
56
+ statusSummary: target.StatusSummary,
57
+ environmentIds: target.EnvironmentIds,
58
+ roles: target.Roles,
59
+ tenantedDeploymentParticipation: target.TenantedDeploymentParticipation,
60
+ tenantIds: target.TenantIds,
61
+ tenantTags: target.TenantTags,
62
+ endpoint: {
63
+ id: target.Endpoint.Id,
64
+ communicationStyle: target.Endpoint.CommunicationStyle,
65
+ uri: target.Endpoint.Uri,
66
+ fingerprint: target.Endpoint.Fingerprint,
67
+ proxyId: target.Endpoint.ProxyId,
68
+ tentacleVersionDetails: target.Endpoint.TentacleVersionDetails,
69
+ },
70
+ shellName: target.ShellName,
71
+ machinePolicyId: target.MachinePolicyId,
72
+ hasLatestCalamari: target.HasLatestCalamari,
73
+ isInProcess: target.IsInProcess,
74
+ links: target.Links,
75
+ };
76
+ return {
77
+ content: [
78
+ {
79
+ type: "text",
80
+ text: JSON.stringify(deploymentTarget),
81
+ },
82
+ ],
83
+ };
84
+ }
85
+ catch (error) {
86
+ handleOctopusApiError(error, {
87
+ entityType: 'deployment target',
88
+ entityId: targetId,
89
+ spaceName,
90
+ helpText: "Use find_deployment_targets without targetId to find valid target IDs."
91
+ });
92
+ }
93
+ }
94
+ // Otherwise, list all deployment targets
95
+ const response = await client.get("~/api/{spaceId}/machines{?skip,take,name,ids,partialName,roles,isDisabled,healthStatuses,commStyles,tenantIds,tenantTags,environmentIds,thumbprint,deploymentId,shellNames,deploymentTargetTypes}", {
96
+ spaceId,
97
+ skip,
98
+ take,
99
+ name,
100
+ ids,
101
+ partialName,
102
+ roles,
103
+ isDisabled,
104
+ healthStatuses,
105
+ commStyles,
106
+ tenantIds,
107
+ tenantTags,
108
+ environmentIds,
109
+ thumbprint,
110
+ deploymentId,
111
+ shellNames,
112
+ deploymentTargetTypes,
113
+ });
114
+ const deploymentTargets = response.Items.map((target) => ({
115
+ spaceId: target.SpaceId,
116
+ id: target.Id,
117
+ name: target.Name,
118
+ slug: target.Slug,
119
+ isDisabled: target.IsDisabled,
120
+ healthStatus: target.HealthStatus,
121
+ statusSummary: target.StatusSummary,
122
+ environmentIds: target.EnvironmentIds,
123
+ roles: target.Roles,
124
+ tenantedDeploymentParticipation: target.TenantedDeploymentParticipation,
125
+ tenantIds: target.TenantIds,
126
+ tenantTags: target.TenantTags,
127
+ endpoint: {
128
+ communicationStyle: target.Endpoint.CommunicationStyle,
129
+ uri: target.Endpoint.Uri,
130
+ fingerprint: target.Endpoint.Fingerprint,
131
+ },
132
+ shellName: target.ShellName,
133
+ machinePolicyId: target.MachinePolicyId,
134
+ hasLatestCalamari: target.HasLatestCalamari,
135
+ isInProcess: target.IsInProcess,
136
+ }));
137
+ return {
138
+ content: [
139
+ {
140
+ type: "text",
141
+ text: JSON.stringify({
142
+ totalResults: response.TotalResults,
143
+ itemsPerPage: response.ItemsPerPage,
144
+ numberOfPages: response.NumberOfPages,
145
+ lastPageNumber: response.LastPageNumber,
146
+ items: deploymentTargets,
147
+ }),
148
+ },
149
+ ],
150
+ };
151
+ });
152
+ }
153
+ registerToolDefinition({
154
+ toolName: "find_deployment_targets",
155
+ config: { toolset: "machines", readOnly: true },
156
+ registerFn: registerFindDeploymentTargetsTool,
157
+ });
158
+ //# sourceMappingURL=findDeploymentTargets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findDeploymentTargets.js","sourceRoot":"","sources":["../../src/tools/findDeploymentTargets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerFindReleasesTool(server: McpServer): void;
3
+ //# sourceMappingURL=findReleases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findReleases.d.ts","sourceRoot":"","sources":["../../src/tools/findReleases.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,QA6FzD"}