@octopusdeploy/mcp-server 1.0.1 → 2.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 (290) hide show
  1. package/README.md +237 -46
  2. package/dist/helpers/activeToolsetConfig.d.ts +4 -0
  3. package/dist/helpers/activeToolsetConfig.d.ts.map +1 -0
  4. package/dist/helpers/activeToolsetConfig.js +18 -0
  5. package/dist/helpers/activeToolsetConfig.js.map +1 -0
  6. package/dist/helpers/errorHandling.d.ts +38 -0
  7. package/dist/helpers/errorHandling.d.ts.map +1 -0
  8. package/dist/helpers/errorHandling.js +75 -0
  9. package/dist/helpers/errorHandling.js.map +1 -0
  10. package/dist/helpers/getClientConfigurationFromEnvironment.d.ts +2 -0
  11. package/dist/helpers/getClientConfigurationFromEnvironment.d.ts.map +1 -1
  12. package/dist/helpers/getClientConfigurationFromEnvironment.js +21 -5
  13. package/dist/helpers/getClientConfigurationFromEnvironment.js.map +1 -1
  14. package/dist/helpers/grepLines.d.ts +38 -0
  15. package/dist/helpers/grepLines.d.ts.map +1 -0
  16. package/dist/helpers/grepLines.js +65 -0
  17. package/dist/helpers/grepLines.js.map +1 -0
  18. package/dist/helpers/methodTier.d.ts +15 -0
  19. package/dist/helpers/methodTier.d.ts.map +1 -0
  20. package/dist/helpers/methodTier.js +25 -0
  21. package/dist/helpers/methodTier.js.map +1 -0
  22. package/dist/helpers/pathAllowlist.d.ts +27 -0
  23. package/dist/helpers/pathAllowlist.d.ts.map +1 -0
  24. package/dist/helpers/pathAllowlist.js +177 -0
  25. package/dist/helpers/pathAllowlist.js.map +1 -0
  26. package/dist/helpers/pathGlob.d.ts +15 -0
  27. package/dist/helpers/pathGlob.d.ts.map +1 -0
  28. package/dist/helpers/pathGlob.js +47 -0
  29. package/dist/helpers/pathGlob.js.map +1 -0
  30. package/dist/helpers/requireConfirmation.d.ts +119 -0
  31. package/dist/helpers/requireConfirmation.d.ts.map +1 -0
  32. package/dist/helpers/requireConfirmation.js +148 -0
  33. package/dist/helpers/requireConfirmation.js.map +1 -0
  34. package/dist/helpers/sensitivePathDenylist.d.ts +32 -0
  35. package/dist/helpers/sensitivePathDenylist.d.ts.map +1 -0
  36. package/dist/helpers/sensitivePathDenylist.js +49 -0
  37. package/dist/helpers/sensitivePathDenylist.js.map +1 -0
  38. package/dist/helpers/spaceResolver.d.ts +4 -0
  39. package/dist/helpers/spaceResolver.d.ts.map +1 -0
  40. package/dist/helpers/spaceResolver.js +18 -0
  41. package/dist/helpers/spaceResolver.js.map +1 -0
  42. package/dist/helpers/stripLinks.d.ts +15 -0
  43. package/dist/helpers/stripLinks.d.ts.map +1 -0
  44. package/dist/helpers/stripLinks.js +19 -0
  45. package/dist/helpers/stripLinks.js.map +1 -0
  46. package/dist/helpers/urlParser.d.ts +16 -0
  47. package/dist/helpers/urlParser.d.ts.map +1 -0
  48. package/dist/helpers/urlParser.js +83 -0
  49. package/dist/helpers/urlParser.js.map +1 -0
  50. package/dist/helpers/userCache.d.ts +14 -0
  51. package/dist/helpers/userCache.d.ts.map +1 -0
  52. package/dist/helpers/userCache.js +16 -0
  53. package/dist/helpers/userCache.js.map +1 -0
  54. package/dist/helpers/validateExecutePath.d.ts +29 -0
  55. package/dist/helpers/validateExecutePath.d.ts.map +1 -0
  56. package/dist/helpers/validateExecutePath.js +62 -0
  57. package/dist/helpers/validateExecutePath.js.map +1 -0
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +64 -15
  60. package/dist/index.js.map +1 -1
  61. package/dist/resources/catalog/capabilities.d.ts +36 -0
  62. package/dist/resources/catalog/capabilities.d.ts.map +1 -0
  63. package/dist/resources/catalog/capabilities.js +90 -0
  64. package/dist/resources/catalog/capabilities.js.map +1 -0
  65. package/dist/resources/catalog/llmsTxt.d.ts +8 -0
  66. package/dist/resources/catalog/llmsTxt.d.ts.map +1 -0
  67. package/dist/resources/catalog/llmsTxt.js +44 -0
  68. package/dist/resources/catalog/llmsTxt.js.map +1 -0
  69. package/dist/resources/dispatch.d.ts +30 -0
  70. package/dist/resources/dispatch.d.ts.map +1 -0
  71. package/dist/resources/dispatch.js +81 -0
  72. package/dist/resources/dispatch.js.map +1 -0
  73. package/dist/resources/featureToggle.d.ts +2 -0
  74. package/dist/resources/featureToggle.d.ts.map +1 -0
  75. package/dist/resources/featureToggle.js +34 -0
  76. package/dist/resources/featureToggle.js.map +1 -0
  77. package/dist/resources/index.d.ts +12 -0
  78. package/dist/resources/index.d.ts.map +1 -0
  79. package/dist/resources/index.js +44 -0
  80. package/dist/resources/index.js.map +1 -0
  81. package/dist/resources/interruption.d.ts +2 -0
  82. package/dist/resources/interruption.d.ts.map +1 -0
  83. package/dist/resources/interruption.js +34 -0
  84. package/dist/resources/interruption.js.map +1 -0
  85. package/dist/resources/release.d.ts +2 -0
  86. package/dist/resources/release.d.ts.map +1 -0
  87. package/dist/resources/release.js +33 -0
  88. package/dist/resources/release.js.map +1 -0
  89. package/dist/resources/rolloutGroup.d.ts +2 -0
  90. package/dist/resources/rolloutGroup.d.ts.map +1 -0
  91. package/dist/resources/rolloutGroup.js +35 -0
  92. package/dist/resources/rolloutGroup.js.map +1 -0
  93. package/dist/resources/runbook.d.ts +2 -0
  94. package/dist/resources/runbook.d.ts.map +1 -0
  95. package/dist/resources/runbook.js +34 -0
  96. package/dist/resources/runbook.js.map +1 -0
  97. package/dist/resources/task.d.ts +2 -0
  98. package/dist/resources/task.d.ts.map +1 -0
  99. package/dist/resources/task.js +68 -0
  100. package/dist/resources/task.js.map +1 -0
  101. package/dist/tools/createRelease.d.ts +3 -0
  102. package/dist/tools/createRelease.d.ts.map +1 -0
  103. package/dist/tools/createRelease.js +151 -0
  104. package/dist/tools/createRelease.js.map +1 -0
  105. package/dist/tools/deployRelease.d.ts +3 -0
  106. package/dist/tools/deployRelease.d.ts.map +1 -0
  107. package/dist/tools/deployRelease.js +227 -0
  108. package/dist/tools/deployRelease.js.map +1 -0
  109. package/dist/tools/execute.d.ts +3 -0
  110. package/dist/tools/execute.d.ts.map +1 -0
  111. package/dist/tools/execute.js +261 -0
  112. package/dist/tools/execute.js.map +1 -0
  113. package/dist/tools/findAccounts.d.ts +3 -0
  114. package/dist/tools/findAccounts.d.ts.map +1 -0
  115. package/dist/tools/findAccounts.js +90 -0
  116. package/dist/tools/findAccounts.js.map +1 -0
  117. package/dist/tools/findCertificates.d.ts +3 -0
  118. package/dist/tools/findCertificates.d.ts.map +1 -0
  119. package/dist/tools/findCertificates.js +98 -0
  120. package/dist/tools/findCertificates.js.map +1 -0
  121. package/dist/tools/findDeploymentTargets.d.ts +3 -0
  122. package/dist/tools/findDeploymentTargets.d.ts.map +1 -0
  123. package/dist/tools/findDeploymentTargets.js +161 -0
  124. package/dist/tools/findDeploymentTargets.js.map +1 -0
  125. package/dist/tools/findFeatureToggles.d.ts +37 -0
  126. package/dist/tools/findFeatureToggles.d.ts.map +1 -0
  127. package/dist/tools/findFeatureToggles.js +139 -0
  128. package/dist/tools/findFeatureToggles.js.map +1 -0
  129. package/dist/tools/findInterruptions.d.ts +79 -0
  130. package/dist/tools/findInterruptions.d.ts.map +1 -0
  131. package/dist/tools/findInterruptions.js +273 -0
  132. package/dist/tools/findInterruptions.js.map +1 -0
  133. package/dist/tools/findReleases.d.ts +3 -0
  134. package/dist/tools/findReleases.d.ts.map +1 -0
  135. package/dist/tools/findReleases.js +138 -0
  136. package/dist/tools/findReleases.js.map +1 -0
  137. package/dist/tools/findRunbooks.d.ts +3 -0
  138. package/dist/tools/findRunbooks.d.ts.map +1 -0
  139. package/dist/tools/findRunbooks.js +139 -0
  140. package/dist/tools/findRunbooks.js.map +1 -0
  141. package/dist/tools/findTenants.d.ts +19 -0
  142. package/dist/tools/findTenants.d.ts.map +1 -0
  143. package/dist/tools/findTenants.js +133 -0
  144. package/dist/tools/findTenants.js.map +1 -0
  145. package/dist/tools/getBranches.d.ts.map +1 -1
  146. package/dist/tools/getBranches.js +51 -33
  147. package/dist/tools/getBranches.js.map +1 -1
  148. package/dist/tools/getCurrentUser.d.ts.map +1 -1
  149. package/dist/tools/getCurrentUser.js +34 -25
  150. package/dist/tools/getCurrentUser.js.map +1 -1
  151. package/dist/tools/getDeploymentFromUrl.d.ts +57 -0
  152. package/dist/tools/getDeploymentFromUrl.d.ts.map +1 -0
  153. package/dist/tools/getDeploymentFromUrl.js +162 -0
  154. package/dist/tools/getDeploymentFromUrl.js.map +1 -0
  155. package/dist/tools/getDeploymentProcess.d.ts.map +1 -1
  156. package/dist/tools/getDeploymentProcess.js +57 -19
  157. package/dist/tools/getDeploymentProcess.js.map +1 -1
  158. package/dist/tools/getKubernetesLiveStatus.d.ts.map +1 -1
  159. package/dist/tools/getKubernetesLiveStatus.js +70 -48
  160. package/dist/tools/getKubernetesLiveStatus.js.map +1 -1
  161. package/dist/tools/getMissingTenantVariables.d.ts.map +1 -1
  162. package/dist/tools/getMissingTenantVariables.js +58 -26
  163. package/dist/tools/getMissingTenantVariables.js.map +1 -1
  164. package/dist/tools/getTaskFromUrl.d.ts +18 -0
  165. package/dist/tools/getTaskFromUrl.d.ts.map +1 -0
  166. package/dist/tools/getTaskFromUrl.js +90 -0
  167. package/dist/tools/getTaskFromUrl.js.map +1 -0
  168. package/dist/tools/getTenantVariables.d.ts.map +1 -1
  169. package/dist/tools/getTenantVariables.js +58 -38
  170. package/dist/tools/getTenantVariables.js.map +1 -1
  171. package/dist/tools/getVariables.d.ts.map +1 -1
  172. package/dist/tools/getVariables.js +12 -9
  173. package/dist/tools/getVariables.js.map +1 -1
  174. package/dist/tools/grepLlmsTxt.d.ts +13 -0
  175. package/dist/tools/grepLlmsTxt.d.ts.map +1 -0
  176. package/dist/tools/grepLlmsTxt.js +105 -0
  177. package/dist/tools/grepLlmsTxt.js.map +1 -0
  178. package/dist/tools/grepTaskLog.d.ts +30 -0
  179. package/dist/tools/grepTaskLog.d.ts.map +1 -0
  180. package/dist/tools/grepTaskLog.js +116 -0
  181. package/dist/tools/grepTaskLog.js.map +1 -0
  182. package/dist/tools/index.d.ts +22 -18
  183. package/dist/tools/index.d.ts.map +1 -1
  184. package/dist/tools/index.js +33 -21
  185. package/dist/tools/index.js.map +1 -1
  186. package/dist/tools/listDeployments.d.ts.map +1 -1
  187. package/dist/tools/listDeployments.js +77 -37
  188. package/dist/tools/listDeployments.js.map +1 -1
  189. package/dist/tools/listEnvironments.d.ts.map +1 -1
  190. package/dist/tools/listEnvironments.js +63 -37
  191. package/dist/tools/listEnvironments.js.map +1 -1
  192. package/dist/tools/listProjects.d.ts.map +1 -1
  193. package/dist/tools/listProjects.js +64 -38
  194. package/dist/tools/listProjects.js.map +1 -1
  195. package/dist/tools/listSpaces.d.ts.map +1 -1
  196. package/dist/tools/listSpaces.js +56 -30
  197. package/dist/tools/listSpaces.js.map +1 -1
  198. package/dist/tools/readResource.d.ts +3 -0
  199. package/dist/tools/readResource.d.ts.map +1 -0
  200. package/dist/tools/readResource.js +50 -0
  201. package/dist/tools/readResource.js.map +1 -0
  202. package/dist/tools/runRunbook.d.ts +3 -0
  203. package/dist/tools/runRunbook.d.ts.map +1 -0
  204. package/dist/tools/runRunbook.js +174 -0
  205. package/dist/tools/runRunbook.js.map +1 -0
  206. package/dist/tools/updateFeatureToggle.d.ts +94 -0
  207. package/dist/tools/updateFeatureToggle.d.ts.map +1 -0
  208. package/dist/tools/updateFeatureToggle.js +308 -0
  209. package/dist/tools/updateFeatureToggle.js.map +1 -0
  210. package/dist/types/featureToggleTypes.d.ts +47 -0
  211. package/dist/types/featureToggleTypes.d.ts.map +1 -0
  212. package/dist/types/featureToggleTypes.js +10 -0
  213. package/dist/types/featureToggleTypes.js.map +1 -0
  214. package/dist/types/resourceConfig.d.ts +17 -0
  215. package/dist/types/resourceConfig.d.ts.map +1 -0
  216. package/dist/types/resourceConfig.js +6 -0
  217. package/dist/types/resourceConfig.js.map +1 -0
  218. package/dist/types/toolAnnotations.d.ts +8 -0
  219. package/dist/types/toolAnnotations.d.ts.map +1 -0
  220. package/dist/types/toolAnnotations.js +28 -0
  221. package/dist/types/toolAnnotations.js.map +1 -0
  222. package/dist/types/toolConfig.d.ts +7 -1
  223. package/dist/types/toolConfig.d.ts.map +1 -1
  224. package/dist/types/toolConfig.js +4 -1
  225. package/dist/types/toolConfig.js.map +1 -1
  226. package/dist/utils/parseConfig.d.ts +1 -1
  227. package/dist/utils/parseConfig.d.ts.map +1 -1
  228. package/dist/utils/parseConfig.js +3 -2
  229. package/dist/utils/parseConfig.js.map +1 -1
  230. package/dist/utils/version.d.ts +2 -0
  231. package/dist/utils/version.d.ts.map +1 -0
  232. package/dist/utils/version.js +3 -0
  233. package/dist/utils/version.js.map +1 -0
  234. package/package.json +9 -3
  235. package/dist/tools/getAccount.d.ts +0 -3
  236. package/dist/tools/getAccount.d.ts.map +0 -1
  237. package/dist/tools/getAccount.js +0 -40
  238. package/dist/tools/getAccount.js.map +0 -1
  239. package/dist/tools/getCertificate.d.ts +0 -3
  240. package/dist/tools/getCertificate.d.ts.map +0 -1
  241. package/dist/tools/getCertificate.js +0 -40
  242. package/dist/tools/getCertificate.js.map +0 -1
  243. package/dist/tools/getDeploymentTarget.d.ts +0 -3
  244. package/dist/tools/getDeploymentTarget.d.ts.map +0 -1
  245. package/dist/tools/getDeploymentTarget.js +0 -66
  246. package/dist/tools/getDeploymentTarget.js.map +0 -1
  247. package/dist/tools/getReleaseById.d.ts +0 -3
  248. package/dist/tools/getReleaseById.d.ts.map +0 -1
  249. package/dist/tools/getReleaseById.js +0 -45
  250. package/dist/tools/getReleaseById.js.map +0 -1
  251. package/dist/tools/getTaskById.d.ts +0 -9
  252. package/dist/tools/getTaskById.d.ts.map +0 -1
  253. package/dist/tools/getTaskById.js +0 -44
  254. package/dist/tools/getTaskById.js.map +0 -1
  255. package/dist/tools/getTaskDetails.d.ts +0 -9
  256. package/dist/tools/getTaskDetails.d.ts.map +0 -1
  257. package/dist/tools/getTaskDetails.js +0 -44
  258. package/dist/tools/getTaskDetails.js.map +0 -1
  259. package/dist/tools/getTaskRaw.d.ts +0 -9
  260. package/dist/tools/getTaskRaw.d.ts.map +0 -1
  261. package/dist/tools/getTaskRaw.js +0 -43
  262. package/dist/tools/getTaskRaw.js.map +0 -1
  263. package/dist/tools/getTenantById.d.ts +0 -3
  264. package/dist/tools/getTenantById.d.ts.map +0 -1
  265. package/dist/tools/getTenantById.js +0 -50
  266. package/dist/tools/getTenantById.js.map +0 -1
  267. package/dist/tools/listAccounts.d.ts +0 -3
  268. package/dist/tools/listAccounts.d.ts.map +0 -1
  269. package/dist/tools/listAccounts.js +0 -54
  270. package/dist/tools/listAccounts.js.map +0 -1
  271. package/dist/tools/listCertificates.d.ts +0 -3
  272. package/dist/tools/listCertificates.d.ts.map +0 -1
  273. package/dist/tools/listCertificates.js +0 -62
  274. package/dist/tools/listCertificates.js.map +0 -1
  275. package/dist/tools/listDeploymentTargets.d.ts +0 -3
  276. package/dist/tools/listDeploymentTargets.d.ts.map +0 -1
  277. package/dist/tools/listDeploymentTargets.js +0 -98
  278. package/dist/tools/listDeploymentTargets.js.map +0 -1
  279. package/dist/tools/listReleases.d.ts +0 -3
  280. package/dist/tools/listReleases.d.ts.map +0 -1
  281. package/dist/tools/listReleases.js +0 -54
  282. package/dist/tools/listReleases.js.map +0 -1
  283. package/dist/tools/listReleasesForProject.d.ts +0 -3
  284. package/dist/tools/listReleasesForProject.d.ts.map +0 -1
  285. package/dist/tools/listReleasesForProject.js +0 -60
  286. package/dist/tools/listReleasesForProject.js.map +0 -1
  287. package/dist/tools/listTenants.d.ts +0 -3
  288. package/dist/tools/listTenants.d.ts.map +0 -1
  289. package/dist/tools/listTenants.js +0 -69
  290. package/dist/tools/listTenants.js.map +0 -1
@@ -0,0 +1,273 @@
1
+ import { Client, resolveSpaceId, } 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 { getPublicUrl } from "../helpers/getPublicUrl.js";
7
+ import { getCurrentUserCached } from "../helpers/userCache.js";
8
+ import { validateEntityId, handleOctopusApiError, ENTITY_PREFIXES, } from "../helpers/errorHandling.js";
9
+ export function interruptionSummary(interruption, spaceName, instanceURL) {
10
+ const encodedSpace = encodeURIComponent(spaceName);
11
+ const encodedInterruptionId = encodeURIComponent(interruption.Id);
12
+ const encodedTaskId = encodeURIComponent(interruption.TaskId);
13
+ const elements = interruption.Form?.Elements ?? [];
14
+ return {
15
+ id: interruption.Id,
16
+ title: interruption.Title,
17
+ type: interruption.Type,
18
+ taskId: interruption.TaskId,
19
+ correlationId: interruption.CorrelationId,
20
+ isPending: interruption.IsPending,
21
+ isLinkedToOtherInterruption: interruption.IsLinkedToOtherInterruption,
22
+ created: interruption.Created,
23
+ relatedDocumentIds: interruption.RelatedDocumentIds ?? [],
24
+ responsible: {
25
+ teamIds: interruption.ResponsibleTeamIds ?? [],
26
+ userId: interruption.ResponsibleUserId,
27
+ canTakeResponsibility: interruption.CanTakeResponsibility,
28
+ hasResponsibility: interruption.HasResponsibility,
29
+ },
30
+ formElementNames: elements.map((element) => element.Name),
31
+ resourceUri: `octopus://spaces/${encodedSpace}/interruptions/${encodedInterruptionId}`,
32
+ taskResourceUri: `octopus://spaces/${encodedSpace}/tasks/${encodedTaskId}`,
33
+ publicUrl: getPublicUrl(`${instanceURL}/app#/{spaceId}/tasks/{taskId}`, {
34
+ spaceId: interruption.SpaceId,
35
+ taskId: interruption.TaskId,
36
+ }),
37
+ publicUrlInstruction: "View and respond to this interruption in the Octopus Deploy web portal at the provided publicUrl. " +
38
+ "For full form details (Markdown instructions, button options, control types) dereference the resourceUri.",
39
+ };
40
+ }
41
+ const findInterruptionsSchema = z
42
+ .object({
43
+ spaceName: z.string().describe("Space name."),
44
+ interruptionId: z
45
+ .string()
46
+ .optional()
47
+ .describe("Fetch the slim summary for a single interruption by ID (e.g. Interruptions-1). " +
48
+ "Mutually exclusive with regarding/assignedToMe/pendingOnly. " +
49
+ "For the full body (form definition, instructions, button options, submitted values) dereference the returned resourceUri."),
50
+ pendingOnly: z
51
+ .boolean()
52
+ .optional()
53
+ .default(true)
54
+ .describe("Return only unprocessed (pending) interruptions. Defaults to true. Ignored when interruptionId is set."),
55
+ assignedToMe: z
56
+ .boolean()
57
+ .optional()
58
+ .describe("Limit to interruptions the authenticated user can act on (CanTakeResponsibility or HasResponsibility, " +
59
+ "or where the user is the explicit ResponsibleUserId). When true, /users/me is resolved (cached per session). " +
60
+ "Octopus has no responsibleUserId query parameter, so the tool pages through the server result set and " +
61
+ "post-filters; pages are scanned up to a safety cap (filteredAs.scanComplete signals whether the entire " +
62
+ "result set was inspected). totalResults reflects the post-filter count; the unfiltered server total is " +
63
+ "exposed under filteredAs. Ignored when interruptionId is set."),
64
+ regarding: z
65
+ .string()
66
+ .optional()
67
+ .describe("Native server-side filter to interruptions related to a specific entity ID " +
68
+ "(e.g. ServerTasks-1234, Deployments-5678). Ignored when interruptionId is set."),
69
+ skip: z.number().optional().describe("Pagination offset. Ignored when interruptionId is set."),
70
+ take: z.number().optional().describe("Pagination page size. Ignored when interruptionId is set."),
71
+ })
72
+ .superRefine((args, ctx) => {
73
+ if (!args.interruptionId)
74
+ return;
75
+ const conflicting = [
76
+ "regarding",
77
+ "assignedToMe",
78
+ "skip",
79
+ "take",
80
+ ];
81
+ for (const key of conflicting) {
82
+ if (args[key] !== undefined) {
83
+ ctx.addIssue({
84
+ code: z.ZodIssueCode.custom,
85
+ message: "Provide either interruptionId (to fetch a single interruption) or list filters " +
86
+ `(${conflicting.join(", ")}), not both.`,
87
+ path: [key],
88
+ });
89
+ }
90
+ }
91
+ });
92
+ export async function findInterruptionsHandler(params) {
93
+ const { spaceName, interruptionId, pendingOnly = true, assignedToMe, regarding, skip, take, } = params;
94
+ // Cheap pre-check: validate the ID format before any network round-trip,
95
+ // so callers get a clear error without paying for the space resolve first.
96
+ if (interruptionId) {
97
+ validateEntityId(interruptionId, "interruption", ENTITY_PREFIXES.interruption);
98
+ }
99
+ const configuration = getClientConfigurationFromEnvironment();
100
+ const client = await Client.create(configuration);
101
+ let spaceId;
102
+ try {
103
+ spaceId = await resolveSpaceId(client, spaceName);
104
+ }
105
+ catch (error) {
106
+ handleOctopusApiError(error, { spaceName });
107
+ }
108
+ // Single-id lookup mode.
109
+ if (interruptionId) {
110
+ try {
111
+ const interruption = await client.get("~/api/{spaceId}/interruptions/{interruptionId}", { spaceId, interruptionId });
112
+ return {
113
+ content: [
114
+ {
115
+ type: "text",
116
+ text: JSON.stringify(interruptionSummary(interruption, spaceName, configuration.instanceURL)),
117
+ },
118
+ ],
119
+ };
120
+ }
121
+ catch (error) {
122
+ handleOctopusApiError(error, {
123
+ entityType: "interruption",
124
+ entityId: interruptionId,
125
+ spaceName,
126
+ helpText: "Call find_interruptions without interruptionId to list valid IDs.",
127
+ });
128
+ }
129
+ }
130
+ // assignedToMe: scan multiple server pages and post-filter, since Octopus
131
+ // has no native "responsibleUserId" query param. Without paging, a first
132
+ // server page that contains zero matches would cause us to return an empty
133
+ // result and silently miss actionable interruptions on later pages.
134
+ if (assignedToMe) {
135
+ const user = await getCurrentUserCached(client);
136
+ const currentUserId = user.Id;
137
+ const scan = await scanAssignedInterruptions(client, spaceId, {
138
+ pendingOnly,
139
+ regarding,
140
+ currentUserId,
141
+ });
142
+ const start = skip ?? 0;
143
+ const end = take !== undefined
144
+ ? Math.min(start + take, scan.matched.length)
145
+ : scan.matched.length;
146
+ const sliced = scan.matched.slice(start, end);
147
+ return {
148
+ content: [
149
+ {
150
+ type: "text",
151
+ text: JSON.stringify({
152
+ // Post-filter counts: the LLM's "totalResults" is the number of
153
+ // interruptions actually assigned to the user, not the unfiltered
154
+ // server total. The latter is surfaced under filteredAs for
155
+ // transparency.
156
+ totalResults: scan.matched.length,
157
+ itemsPerPage: sliced.length,
158
+ numberOfPages: 1,
159
+ lastPageNumber: 0,
160
+ filteredAs: {
161
+ userId: currentUserId,
162
+ serverTotalScanned: scan.serverScanned,
163
+ serverTotalAvailable: scan.serverTotal,
164
+ scanComplete: scan.scanComplete,
165
+ ...(scan.scanComplete
166
+ ? {}
167
+ : {
168
+ scanIncompleteHint: "Hit the safety cap before exhausting the server result set. " +
169
+ "Narrow the query (e.g. set regarding to a specific task, or keep pendingOnly: true) " +
170
+ "to ensure complete results.",
171
+ }),
172
+ },
173
+ items: sliced.map((interruption) => interruptionSummary(interruption, spaceName, configuration.instanceURL)),
174
+ }),
175
+ },
176
+ ],
177
+ };
178
+ }
179
+ // List mode (no per-user filter): pass server pagination through directly.
180
+ const response = await client.get("~/api/{spaceId}/interruptions{?skip,take,pendingOnly,regarding}", {
181
+ spaceId,
182
+ skip,
183
+ take,
184
+ pendingOnly,
185
+ regarding,
186
+ });
187
+ return {
188
+ content: [
189
+ {
190
+ type: "text",
191
+ text: JSON.stringify({
192
+ totalResults: response.TotalResults,
193
+ itemsPerPage: response.ItemsPerPage,
194
+ numberOfPages: response.NumberOfPages,
195
+ lastPageNumber: response.LastPageNumber,
196
+ items: (response.Items ?? []).map((interruption) => interruptionSummary(interruption, spaceName, configuration.instanceURL)),
197
+ }),
198
+ },
199
+ ],
200
+ };
201
+ }
202
+ /**
203
+ * Page through the unfiltered /interruptions result set, collecting items
204
+ * the authenticated user can act on. Octopus has no responsibleUserId query
205
+ * parameter, so post-filtering is the only correctness-preserving option.
206
+ *
207
+ * Safety cap: ASSIGNED_SCAN_MAX records inspected. Almost always hit only
208
+ * with pendingOnly: false on busy spaces with deep history; the assigned
209
+ * set under pendingOnly: true is virtually always small.
210
+ */
211
+ export const ASSIGNED_SCAN_PAGE_SIZE = 100;
212
+ export const ASSIGNED_SCAN_MAX = 500;
213
+ async function scanAssignedInterruptions(client, spaceId, params) {
214
+ const matched = [];
215
+ let serverScanned = 0;
216
+ let serverTotal = 0;
217
+ let scanComplete = false;
218
+ while (serverScanned < ASSIGNED_SCAN_MAX) {
219
+ const remaining = ASSIGNED_SCAN_MAX - serverScanned;
220
+ const pageTake = Math.min(ASSIGNED_SCAN_PAGE_SIZE, remaining);
221
+ const page = await client.get("~/api/{spaceId}/interruptions{?skip,take,pendingOnly,regarding}", {
222
+ spaceId,
223
+ skip: serverScanned,
224
+ take: pageTake,
225
+ pendingOnly: params.pendingOnly,
226
+ regarding: params.regarding,
227
+ });
228
+ serverTotal = page.TotalResults;
229
+ const items = page.Items ?? [];
230
+ for (const interruption of items) {
231
+ if (interruption.CanTakeResponsibility ||
232
+ interruption.HasResponsibility ||
233
+ interruption.ResponsibleUserId === params.currentUserId) {
234
+ matched.push(interruption);
235
+ }
236
+ }
237
+ serverScanned += items.length;
238
+ // Empty page (or short page) means the server has no more.
239
+ if (items.length === 0 || items.length < pageTake || serverScanned >= serverTotal) {
240
+ scanComplete = true;
241
+ break;
242
+ }
243
+ }
244
+ return { matched, serverTotal, serverScanned, scanComplete };
245
+ }
246
+ export function registerFindInterruptionsTool(server) {
247
+ server.registerTool("find_interruptions", {
248
+ title: "Find interruptions",
249
+ description: `Find interruptions (manual interventions, guided failures, deployment approvals) in an Octopus Deploy space.
250
+
251
+ Interruptions are the Octopus surface equivalent to pending approvals: a deployment or runbook run pauses and waits for a human to take action. Use this tool to enumerate them or to look up a single one.
252
+
253
+ Modes (picked by which arguments you supply):
254
+ - interruptionId → fetch the slim summary for that interruption.
255
+ - assignedToMe → list interruptions the authenticated user can act on; resolves /users/me (cached per session).
256
+ - regarding → list interruptions related to a specific entity (ServerTasks-…, Deployments-…). Native server-side filter.
257
+ - (none) → list all interruptions, optionally filtered by pendingOnly (default: true) and skip/take.
258
+
259
+ Each summary includes:
260
+ - resourceUri → octopus://spaces/{spaceName}/interruptions/{id} for the FULL body (form definition with Markdown instructions, button options, control types, and any already-submitted values). Dereference this when the user asks for details about a specific interruption.
261
+ - taskResourceUri → octopus://spaces/{spaceName}/tasks/{taskId} for the surrounding deployment/runbook task.
262
+ - publicUrl → Octopus portal deep link to take action.
263
+ - formElementNames → just the field names (e.g. Instructions, Notes, Result). Field values are NOT in the slim summary; fetch resourceUri for those.`,
264
+ inputSchema: findInterruptionsSchema,
265
+ annotations: { readOnlyHint: true },
266
+ }, findInterruptionsHandler);
267
+ }
268
+ registerToolDefinition({
269
+ toolName: "find_interruptions",
270
+ config: { toolset: "interruptions", readOnly: true },
271
+ registerFn: registerFindInterruptionsTool,
272
+ });
273
+ //# sourceMappingURL=findInterruptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findInterruptions.js","sourceRoot":"","sources":["../../src/tools/findInterruptions.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;AAkFzE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,QAsEzD"}
@@ -0,0 +1,138 @@
1
+ import { Client, ReleaseRepository } 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 { READ_ONLY_TOOL_ANNOTATIONS } from "../types/toolAnnotations.js";
7
+ import { validateEntityId, handleOctopusApiError, ENTITY_PREFIXES, } from "../helpers/errorHandling.js";
8
+ /**
9
+ * Slim release shape returned by find_releases.
10
+ *
11
+ * Heavy fields (releaseNotes, selectedPackages, selectedGitResources,
12
+ * buildInformation, customFields) are deliberately omitted. Callers fetch
13
+ * the `resourceUri` (octopus://spaces/{spaceName}/releases/{releaseId})
14
+ * Resource for the full body when needed.
15
+ */
16
+ function releaseSummary(release, spaceName) {
17
+ const encodedSpace = encodeURIComponent(spaceName);
18
+ const encodedId = encodeURIComponent(release.Id);
19
+ return {
20
+ id: release.Id,
21
+ version: release.Version,
22
+ channelId: release.ChannelId,
23
+ projectId: release.ProjectId,
24
+ assembled: release.Assembled,
25
+ ignoreChannelRules: release.IgnoreChannelRules,
26
+ versionControlReference: release.VersionControlReference,
27
+ resourceUri: `octopus://spaces/${encodedSpace}/releases/${encodedId}`,
28
+ };
29
+ }
30
+ const findReleasesSchema = z
31
+ .object({
32
+ spaceName: z.string().describe("Space name."),
33
+ releaseId: z
34
+ .string()
35
+ .optional()
36
+ .describe("Fetch a single release by ID. Mutually exclusive with projectId and searchByVersion."),
37
+ projectId: z
38
+ .string()
39
+ .optional()
40
+ .describe("Restrict listing to a single project. Mutually exclusive with releaseId."),
41
+ searchByVersion: z
42
+ .string()
43
+ .optional()
44
+ .describe("Filter by version string. Requires projectId."),
45
+ skip: z.number().optional().describe("Pagination offset."),
46
+ take: z.number().optional().describe("Pagination page size."),
47
+ })
48
+ .superRefine((args, ctx) => {
49
+ if (args.releaseId && args.projectId) {
50
+ ctx.addIssue({
51
+ code: z.ZodIssueCode.custom,
52
+ message: "Provide either releaseId or projectId, not both. Use releaseId to fetch a single release; use projectId to list releases for a project.",
53
+ path: ["projectId"],
54
+ });
55
+ }
56
+ if (args.searchByVersion && !args.projectId) {
57
+ ctx.addIssue({
58
+ code: z.ZodIssueCode.custom,
59
+ message: "searchByVersion requires projectId.",
60
+ path: ["searchByVersion"],
61
+ });
62
+ }
63
+ if (args.releaseId && args.searchByVersion) {
64
+ ctx.addIssue({
65
+ code: z.ZodIssueCode.custom,
66
+ message: "searchByVersion is only valid when listing releases for a project; it cannot be combined with releaseId.",
67
+ path: ["searchByVersion"],
68
+ });
69
+ }
70
+ });
71
+ export function registerFindReleasesTool(server) {
72
+ server.registerTool("find_releases", {
73
+ title: "Find releases",
74
+ description: `Find releases in an Octopus Deploy space.
75
+
76
+ Three modes, picked by which arguments are supplied:
77
+ - releaseId → fetch the summary for that release.
78
+ - projectId → list releases for that project (optionally filtered by searchByVersion).
79
+ - neither → list releases across the space.
80
+
81
+ Each summary includes a resourceUri for fetching the full release body
82
+ (release notes, packages, build information, custom fields).`,
83
+ inputSchema: findReleasesSchema,
84
+ annotations: READ_ONLY_TOOL_ANNOTATIONS,
85
+ }, async ({ spaceName, releaseId, projectId, searchByVersion, skip, take }) => {
86
+ const client = await Client.create(getClientConfigurationFromEnvironment());
87
+ const releaseRepository = new ReleaseRepository(client, spaceName);
88
+ if (releaseId) {
89
+ validateEntityId(releaseId, "release", ENTITY_PREFIXES.release);
90
+ try {
91
+ const release = await releaseRepository.get(releaseId);
92
+ return {
93
+ content: [
94
+ {
95
+ type: "text",
96
+ text: JSON.stringify(releaseSummary(release, spaceName)),
97
+ },
98
+ ],
99
+ };
100
+ }
101
+ catch (error) {
102
+ handleOctopusApiError(error, {
103
+ entityType: "release",
104
+ entityId: releaseId,
105
+ spaceName,
106
+ helpText: "Call find_releases without releaseId to list valid IDs.",
107
+ });
108
+ }
109
+ }
110
+ const releasesResponse = projectId
111
+ ? await releaseRepository.listForProject(projectId, {
112
+ skip,
113
+ take,
114
+ searchByVersion,
115
+ })
116
+ : await releaseRepository.list({ skip, take });
117
+ return {
118
+ content: [
119
+ {
120
+ type: "text",
121
+ text: JSON.stringify({
122
+ totalResults: releasesResponse.TotalResults,
123
+ itemsPerPage: releasesResponse.ItemsPerPage,
124
+ numberOfPages: releasesResponse.NumberOfPages,
125
+ lastPageNumber: releasesResponse.LastPageNumber,
126
+ items: releasesResponse.Items.map((release) => releaseSummary(release, spaceName)),
127
+ }),
128
+ },
129
+ ],
130
+ };
131
+ });
132
+ }
133
+ registerToolDefinition({
134
+ toolName: "find_releases",
135
+ config: { toolset: "releases", readOnly: true },
136
+ registerFn: registerFindReleasesTool,
137
+ });
138
+ //# sourceMappingURL=findReleases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findReleases.js","sourceRoot":"","sources":["../../src/tools/findReleases.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACtE,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;AAChE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,GAChB,MAAM,6BAA6B,CAAC;AAIrC;;;;;;;GAOG;AACH,SAAS,cAAc,CAAC,OAAgB,EAAE,SAAiB;IACzD,MAAM,YAAY,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAEjD,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,uBAAuB,EAAE,OAAO,CAAC,uBAAuB;QACxD,WAAW,EAAE,oBAAoB,YAAY,aAAa,SAAS,EAAE;KACtE,CAAC;AACJ,CAAC;AAED,MAAM,kBAAkB,GAAG,CAAC;KACzB,MAAM,CAAC;IACN,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;IAC7C,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,sFAAsF,CACvF;IACH,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,0EAA0E,CAAC;IACvF,eAAe,EAAE,CAAC;SACf,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,+CAA+C,CAAC;IAC5D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IAC1D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;CAC9D,CAAC;KACD,WAAW,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IACzB,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACrC,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,OAAO,EACL,yIAAyI;YAC3I,IAAI,EAAE,CAAC,WAAW,CAAC;SACpB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAC5C,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,OAAO,EAAE,qCAAqC;YAC9C,IAAI,EAAE,CAAC,iBAAiB,CAAC;SAC1B,CAAC,CAAC;IACL,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3C,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,OAAO,EACL,0GAA0G;YAC5G,IAAI,EAAE,CAAC,iBAAiB,CAAC;SAC1B,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE;;;;;;;;+DAQ4C;QACzD,WAAW,EAAE,kBAAkB;QAC/B,WAAW,EAAE,0BAA0B;KACxC,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QACzE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,qCAAqC,EAAE,CAAC,CAAC;QAC5E,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAEnE,IAAI,SAAS,EAAE,CAAC;YACd,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;YAEhE,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACvD,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;yBACzD;qBACF;iBACF,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,qBAAqB,CAAC,KAAK,EAAE;oBAC3B,UAAU,EAAE,SAAS;oBACrB,QAAQ,EAAE,SAAS;oBACnB,SAAS;oBACT,QAAQ,EAAE,yDAAyD;iBACpE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,gBAAgB,GAAG,SAAS;YAChC,CAAC,CAAC,MAAM,iBAAiB,CAAC,cAAc,CAAC,SAAS,EAAE;gBAChD,IAAI;gBACJ,IAAI;gBACJ,eAAe;aAChB,CAAC;YACJ,CAAC,CAAC,MAAM,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAEjD,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,OAAO,EAAE,EAAE,CAC5C,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CACnC;qBACF,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"}
@@ -0,0 +1,3 @@
1
+ import { type McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerFindRunbooksTool(server: McpServer): void;
3
+ //# sourceMappingURL=findRunbooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findRunbooks.d.ts","sourceRoot":"","sources":["../../src/tools/findRunbooks.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwDzE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,QA2GzD"}
@@ -0,0 +1,139 @@
1
+ import { Client, ProjectRepository, RunbookRepository, } 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 { READ_ONLY_TOOL_ANNOTATIONS } from "../types/toolAnnotations.js";
7
+ import { handleOctopusApiError } from "../helpers/errorHandling.js";
8
+ function runbookSummary(runbook, spaceName) {
9
+ const encodedSpace = encodeURIComponent(spaceName);
10
+ const encodedId = encodeURIComponent(runbook.Id);
11
+ return {
12
+ id: runbook.Id,
13
+ name: runbook.Name,
14
+ description: runbook.Description,
15
+ projectId: runbook.ProjectId,
16
+ runbookProcessId: runbook.RunbookProcessId,
17
+ publishedRunbookSnapshotId: runbook.PublishedRunbookSnapshotId,
18
+ multiTenancyMode: runbook.MultiTenancyMode,
19
+ environmentScope: runbook.EnvironmentScope,
20
+ environments: runbook.Environments,
21
+ resourceUri: `octopus://spaces/${encodedSpace}/runbooks/${encodedId}`,
22
+ };
23
+ }
24
+ const findRunbooksSchema = z
25
+ .object({
26
+ spaceName: z.string().describe("Space name."),
27
+ projectName: z
28
+ .string()
29
+ .describe("Project name. Runbooks are scoped to a project, so this is required for both single fetch and listing."),
30
+ runbookId: z
31
+ .string()
32
+ .optional()
33
+ .describe("Fetch a single runbook by ID. Mutually exclusive with partialName/skip/take."),
34
+ partialName: z
35
+ .string()
36
+ .optional()
37
+ .describe("Filter listing by partial runbook name (case-insensitive)."),
38
+ skip: z.number().optional().describe("Pagination offset."),
39
+ take: z.number().optional().describe("Pagination page size."),
40
+ })
41
+ .superRefine((args, ctx) => {
42
+ if (args.runbookId && args.partialName) {
43
+ ctx.addIssue({
44
+ code: z.ZodIssueCode.custom,
45
+ message: "partialName cannot be combined with runbookId. Use runbookId to fetch a single runbook; use partialName to filter the listing.",
46
+ path: ["partialName"],
47
+ });
48
+ }
49
+ });
50
+ export function registerFindRunbooksTool(server) {
51
+ server.registerTool("find_runbooks", {
52
+ title: "Find runbooks in a project",
53
+ description: `Find runbooks in an Octopus Deploy project.
54
+
55
+ Two modes, picked by which arguments are supplied:
56
+ - runbookId → fetch the summary for that runbook.
57
+ - neither → list all runbooks in the project (optionally filtered by partialName).
58
+
59
+ Each summary includes the publishedRunbookSnapshotId (which run_runbook uses by default), the multiTenancyMode, and the environmentScope so callers can determine which environments and tenants are valid targets before invoking run_runbook.`,
60
+ inputSchema: findRunbooksSchema,
61
+ annotations: READ_ONLY_TOOL_ANNOTATIONS,
62
+ }, async ({ spaceName, projectName, runbookId, partialName, skip, take }) => {
63
+ try {
64
+ const client = await Client.create(getClientConfigurationFromEnvironment());
65
+ const projectRepository = new ProjectRepository(client, spaceName);
66
+ const projectMatches = await projectRepository.list({
67
+ partialName: projectName,
68
+ take: 100,
69
+ });
70
+ const project = projectMatches.Items.find((p) => p.Name === projectName);
71
+ if (!project) {
72
+ // Returned directly (not thrown) so the error surfaces to the LLM
73
+ // with a project-specific message. handleOctopusApiError below would
74
+ // otherwise rewrite a thrown "Project not found" into a misleading
75
+ // "Space not found" because it requires entityId for the entity
76
+ // branch and falls through to the space branch when entityId is
77
+ // undefined (we haven't reached the runbook lookup yet).
78
+ return {
79
+ content: [
80
+ {
81
+ type: "text",
82
+ text: JSON.stringify({
83
+ success: false,
84
+ error: `Project '${projectName}' not found in space '${spaceName}'. ` +
85
+ `Use list_projects to find valid project names. Project names are case-sensitive.`,
86
+ }, null, 2),
87
+ },
88
+ ],
89
+ isError: true,
90
+ };
91
+ }
92
+ const runbookRepository = new RunbookRepository(client, spaceName, project);
93
+ if (runbookId) {
94
+ const runbook = await runbookRepository.get(runbookId);
95
+ return {
96
+ content: [
97
+ {
98
+ type: "text",
99
+ text: JSON.stringify(runbookSummary(runbook, spaceName)),
100
+ },
101
+ ],
102
+ };
103
+ }
104
+ const runbooksResponse = await runbookRepository.list({
105
+ partialName,
106
+ skip,
107
+ take,
108
+ });
109
+ return {
110
+ content: [
111
+ {
112
+ type: "text",
113
+ text: JSON.stringify({
114
+ totalResults: runbooksResponse.TotalResults,
115
+ itemsPerPage: runbooksResponse.ItemsPerPage,
116
+ numberOfPages: runbooksResponse.NumberOfPages,
117
+ lastPageNumber: runbooksResponse.LastPageNumber,
118
+ items: runbooksResponse.Items.map((runbook) => runbookSummary(runbook, spaceName)),
119
+ }),
120
+ },
121
+ ],
122
+ };
123
+ }
124
+ catch (error) {
125
+ handleOctopusApiError(error, {
126
+ entityType: "runbook",
127
+ entityId: runbookId,
128
+ spaceName,
129
+ helpText: "Use list_projects to find valid project names. Call find_runbooks without runbookId to list all runbooks for a project.",
130
+ });
131
+ }
132
+ });
133
+ }
134
+ registerToolDefinition({
135
+ toolName: "find_runbooks",
136
+ config: { toolset: "runbooks", readOnly: true },
137
+ registerFn: registerFindRunbooksTool,
138
+ });
139
+ //# sourceMappingURL=findRunbooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findRunbooks.js","sourceRoot":"","sources":["../../src/tools/findRunbooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export interface FindTenantsParams {
3
+ spaceName: string;
4
+ tenantId?: string;
5
+ skip?: number;
6
+ take?: number;
7
+ projectId?: string;
8
+ tags?: string;
9
+ ids?: string[];
10
+ partialName?: string;
11
+ }
12
+ export declare function findTenantsHandler(params: FindTenantsParams): Promise<{
13
+ content: {
14
+ type: "text";
15
+ text: string;
16
+ }[];
17
+ }>;
18
+ export declare function registerFindTenantsTool(server: McpServer): void;
19
+ //# sourceMappingURL=findTenants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findTenants.d.ts","sourceRoot":"","sources":["../../src/tools/findTenants.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,iBAAiB;;;;;GAgGjE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,QAwCxD"}