@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
@@ -0,0 +1,96 @@
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 { validateEntityId, handleOctopusApiError, ENTITY_PREFIXES } from "../helpers/errorHandling.js";
7
+ export function registerFindReleasesTool(server) {
8
+ server.tool("find_releases", `Find releases in a space - can retrieve a single release by ID or list all releases
9
+
10
+ This unified tool can either:
11
+ - Get a specific release when releaseId is provided
12
+ - List all releases in a space when releaseId is omitted
13
+
14
+ Optionally provide skip and take parameters for pagination when listing.`, {
15
+ spaceName: z.string().describe("The space name"),
16
+ releaseId: z.string().optional().describe("The ID of a specific release to retrieve. If omitted, lists all releases."),
17
+ skip: z.number().optional().describe("Number of releases to skip for pagination (only used when listing)"),
18
+ take: z.number().optional().describe("Number of releases to take for pagination (only used when listing)")
19
+ }, {
20
+ title: "Find releases in an Octopus Deploy space",
21
+ readOnlyHint: true,
22
+ }, async ({ spaceName, releaseId, skip, take }) => {
23
+ const configuration = getClientConfigurationFromEnvironment();
24
+ const client = await Client.create(configuration);
25
+ const releaseRepository = new ReleaseRepository(client, spaceName);
26
+ // If releaseId is provided, get a single release
27
+ if (releaseId) {
28
+ validateEntityId(releaseId, 'release', ENTITY_PREFIXES.release);
29
+ try {
30
+ const release = await releaseRepository.get(releaseId);
31
+ return {
32
+ content: [
33
+ {
34
+ type: "text",
35
+ text: JSON.stringify({
36
+ id: release.Id,
37
+ version: release.Version,
38
+ channelId: release.ChannelId,
39
+ projectId: release.ProjectId,
40
+ releaseNotes: release.ReleaseNotes,
41
+ assembled: release.Assembled,
42
+ ignoreChannelRules: release.IgnoreChannelRules,
43
+ selectedPackages: release.SelectedPackages,
44
+ selectedGitResources: release.SelectedGitResources,
45
+ buildInformation: release.BuildInformation,
46
+ customFields: release.CustomFields
47
+ }),
48
+ },
49
+ ],
50
+ };
51
+ }
52
+ catch (error) {
53
+ handleOctopusApiError(error, {
54
+ entityType: 'release',
55
+ entityId: releaseId,
56
+ spaceName,
57
+ helpText: "Use find_releases without releaseId or list_releases_for_project to find valid release IDs."
58
+ });
59
+ }
60
+ }
61
+ // Otherwise, list all releases
62
+ const releasesResponse = await releaseRepository.list({ skip, take });
63
+ return {
64
+ content: [
65
+ {
66
+ type: "text",
67
+ text: JSON.stringify({
68
+ totalResults: releasesResponse.TotalResults,
69
+ itemsPerPage: releasesResponse.ItemsPerPage,
70
+ numberOfPages: releasesResponse.NumberOfPages,
71
+ lastPageNumber: releasesResponse.LastPageNumber,
72
+ items: releasesResponse.Items.map(release => ({
73
+ id: release.Id,
74
+ version: release.Version,
75
+ channelId: release.ChannelId,
76
+ projectId: release.ProjectId,
77
+ releaseNotes: release.ReleaseNotes,
78
+ assembled: release.Assembled,
79
+ ignoreChannelRules: release.IgnoreChannelRules,
80
+ selectedPackages: release.SelectedPackages,
81
+ selectedGitResources: release.SelectedGitResources,
82
+ buildInformation: release.BuildInformation,
83
+ customFields: release.CustomFields
84
+ }))
85
+ }),
86
+ },
87
+ ],
88
+ };
89
+ });
90
+ }
91
+ registerToolDefinition({
92
+ toolName: "find_releases",
93
+ config: { toolset: "releases", readOnly: true },
94
+ registerFn: registerFindReleasesTool,
95
+ });
96
+ //# sourceMappingURL=findReleases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findReleases.js","sourceRoot":"","sources":["../../src/tools/findReleases.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;AAYzE,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"}
@@ -0,0 +1,130 @@
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 { tenantsDescription } from "../types/tenantsTypes.js";
8
+ import { validateEntityId, handleOctopusApiError, ENTITY_PREFIXES, } from "../helpers/errorHandling.js";
9
+ export async function findTenantsHandler(params) {
10
+ const { spaceName, tenantId, skip, take, projectId, tags, ids, partialName } = params;
11
+ const configuration = getClientConfigurationFromEnvironment();
12
+ const client = await Client.create(configuration);
13
+ const spaceId = await resolveSpaceId(client, spaceName);
14
+ // If tenantId is provided, get a single tenant
15
+ if (tenantId) {
16
+ validateEntityId(tenantId, "tenant", ENTITY_PREFIXES.tenant);
17
+ try {
18
+ const tenant = await client.get("~/api/{spaceId}/tenant/{tenantId}", { spaceId, tenantId });
19
+ return {
20
+ content: [
21
+ {
22
+ type: "text",
23
+ text: JSON.stringify({
24
+ id: tenant.Id,
25
+ name: tenant.Name,
26
+ slug: tenant.Slug,
27
+ description: tenant.Description,
28
+ isDisabled: tenant.IsDisabled,
29
+ projectEnvironments: tenant.ProjectEnvironments,
30
+ tenantTags: tenant.TenantTags,
31
+ clonedFromTenantId: tenant.ClonedFromTenantId,
32
+ spaceId: tenant.SpaceId,
33
+ publicUrl: getPublicUrl(`${configuration.instanceURL}/app#/{spaceId}/tenants/{tenantId}/overview`, {
34
+ spaceId: tenant.SpaceId,
35
+ tenantId: tenant.Id,
36
+ }),
37
+ publicUrlInstruction: `You can view more details about this tenant in the Octopus Deploy web portal at the provided publicUrl.`,
38
+ }),
39
+ },
40
+ ],
41
+ };
42
+ }
43
+ catch (error) {
44
+ handleOctopusApiError(error, {
45
+ entityType: "tenant",
46
+ entityId: tenantId,
47
+ spaceName,
48
+ });
49
+ }
50
+ }
51
+ // Otherwise, list tenants
52
+ const tenantsResponse = await client.get("~/api/{spaceId}/tenants{?skip,take,projectId,tags,ids,partialName}", {
53
+ spaceId,
54
+ skip,
55
+ take,
56
+ projectId,
57
+ tags,
58
+ ids,
59
+ partialName,
60
+ });
61
+ return {
62
+ content: [
63
+ {
64
+ type: "text",
65
+ text: JSON.stringify({
66
+ totalResults: tenantsResponse.TotalResults,
67
+ itemsPerPage: tenantsResponse.ItemsPerPage,
68
+ numberOfPages: tenantsResponse.NumberOfPages,
69
+ lastPageNumber: tenantsResponse.LastPageNumber,
70
+ items: tenantsResponse.Items.map((tenant) => ({
71
+ id: tenant.Id,
72
+ name: tenant.Name,
73
+ slug: tenant.Slug,
74
+ description: tenant.Description,
75
+ isDisabled: tenant.IsDisabled ?? false,
76
+ tenantTags: tenant.TenantTags,
77
+ clonedFromTenantId: tenant.ClonedFromTenantId,
78
+ spaceId: tenant.SpaceId,
79
+ publicUrl: getPublicUrl(`${configuration.instanceURL}/app#/{spaceId}/tenants/{tenantId}/overview`, {
80
+ spaceId: tenant.SpaceId,
81
+ tenantId: tenant.Id,
82
+ }),
83
+ publicUrlInstruction: `You can view more details about this tenant in the Octopus Deploy web portal at the provided publicUrl.`,
84
+ })),
85
+ }),
86
+ },
87
+ ],
88
+ };
89
+ }
90
+ export function registerFindTenantsTool(server) {
91
+ server.tool("find_tenants", `Find tenants in a space - can retrieve a single tenant by ID or list all tenants
92
+
93
+ This unified tool can either:
94
+ - Get details for a specific tenant when tenantId is provided, including the projects and environments the tenant is associated with
95
+ - List all tenants in a space when tenantId is omitted
96
+
97
+ ${tenantsDescription}
98
+
99
+ Optionally provide filtering and pagination parameters when listing.`, {
100
+ spaceName: z.string().describe("The space name"),
101
+ tenantId: z.string().optional().describe("The ID of a specific tenant to retrieve. If omitted, lists all tenants."),
102
+ skip: z.number().optional().describe("Number of tenants to skip for pagination (only used when listing)"),
103
+ take: z.number().optional().describe("Number of tenants to take for pagination (only used when listing)"),
104
+ projectId: z
105
+ .string()
106
+ .optional()
107
+ .describe("Filter by specific project ID (only used when listing)"),
108
+ tags: z
109
+ .string()
110
+ .optional()
111
+ .describe("Filter by tenant tags (comma-separated list, only used when listing)"),
112
+ ids: z
113
+ .array(z.string())
114
+ .optional()
115
+ .describe("Filter by specific tenant IDs (only used when listing)"),
116
+ partialName: z
117
+ .string()
118
+ .optional()
119
+ .describe("Filter by partial tenant name match (only used when listing)"),
120
+ }, {
121
+ title: "Find tenants in an Octopus Deploy space",
122
+ readOnlyHint: true,
123
+ }, findTenantsHandler);
124
+ }
125
+ registerToolDefinition({
126
+ toolName: "find_tenants",
127
+ config: { toolset: "tenants", readOnly: true },
128
+ registerFn: registerFindTenantsTool,
129
+ });
130
+ //# sourceMappingURL=findTenants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findTenants.js","sourceRoot":"","sources":["../../src/tools/findTenants.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getBranches.d.ts","sourceRoot":"","sources":["../../src/tools/getBranches.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,QAmDxD"}
1
+ {"version":3,"file":"getBranches.d.ts","sourceRoot":"","sources":["../../src/tools/getBranches.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,QAoExD"}
@@ -4,6 +4,7 @@ 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 { getProjectBranches } from "../helpers/vcsProjectHelpers.js";
7
+ import { validateEntityId, handleOctopusApiError, ENTITY_PREFIXES } from "../helpers/errorHandling.js";
7
8
  export function registerGetBranchesTool(server) {
8
9
  server.tool("get_branches", `Get Git branches for a version-controlled project
9
10
 
@@ -17,34 +18,48 @@ This tool retrieves Git branches for a specific project in a space. The space na
17
18
  title: "Get Git branches for a version-controlled project",
18
19
  readOnlyHint: true,
19
20
  }, async ({ spaceName, projectId, searchByName, skip, take }) => {
20
- const configuration = getClientConfigurationFromEnvironment();
21
- const client = await Client.create(configuration);
22
- const spaceId = await resolveSpaceId(client, spaceName);
21
+ validateEntityId(projectId, 'project', ENTITY_PREFIXES.project);
23
22
  const options = {
24
23
  searchByName,
25
24
  skip,
26
25
  take,
27
26
  };
28
- const branches = await getProjectBranches(client, spaceId, projectId, options);
29
- return {
30
- content: [
31
- {
32
- type: "text",
33
- text: JSON.stringify({
34
- Items: branches.Items.map(branch => ({
35
- Name: branch.Name,
36
- IsProtected: branch.IsProtected,
37
- CanonicalName: branch.CanonicalName,
38
- })),
39
- TotalResults: branches.TotalResults,
40
- ItemsPerPage: branches.ItemsPerPage,
41
- NumberOfPages: branches.NumberOfPages,
42
- LastPageNumber: branches.LastPageNumber,
43
- ItemType: branches.ItemType,
44
- }),
45
- },
46
- ],
47
- };
27
+ try {
28
+ const configuration = getClientConfigurationFromEnvironment();
29
+ const client = await Client.create(configuration);
30
+ const spaceId = await resolveSpaceId(client, spaceName);
31
+ const branches = await getProjectBranches(client, spaceId, projectId, options);
32
+ if (branches.Items.length === 0 && !searchByName) {
33
+ throw new Error(`No branches found for project '${projectId}'. This may indicate that the project is not version controlled or ` +
34
+ "uses database storage instead of Git. Only version controlled projects have branches.");
35
+ }
36
+ return {
37
+ content: [
38
+ {
39
+ type: "text",
40
+ text: JSON.stringify({
41
+ Items: branches.Items.map(branch => ({
42
+ Name: branch.Name,
43
+ IsProtected: branch.IsProtected,
44
+ CanonicalName: branch.CanonicalName,
45
+ })),
46
+ TotalResults: branches.TotalResults,
47
+ ItemsPerPage: branches.ItemsPerPage,
48
+ NumberOfPages: branches.NumberOfPages,
49
+ LastPageNumber: branches.LastPageNumber,
50
+ ItemType: branches.ItemType,
51
+ }),
52
+ },
53
+ ],
54
+ };
55
+ }
56
+ catch (error) {
57
+ handleOctopusApiError(error, {
58
+ entityType: 'project',
59
+ entityId: projectId,
60
+ spaceName
61
+ });
62
+ }
48
63
  });
49
64
  }
50
65
  registerToolDefinition({
@@ -1 +1 @@
1
- {"version":3,"file":"getBranches.js","sourceRoot":"","sources":["../../src/tools/getBranches.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,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAErE,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,IAAI,CACT,cAAc,EACd;;yMAEqM,EACrM;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACnC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC5B,EACD;QACE,KAAK,EAAE,mDAAmD;QAC1D,YAAY,EAAE,IAAI;KACnB,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QAC3D,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,OAAO,GAAG;YACd,YAAY;YACZ,IAAI;YACJ,IAAI;SACL,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAE/E,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;4BACnC,IAAI,EAAE,MAAM,CAAC,IAAI;4BACjB,WAAW,EAAE,MAAM,CAAC,WAAW;4BAC/B,aAAa,EAAE,MAAM,CAAC,aAAa;yBACpC,CAAC,CAAC;wBACH,YAAY,EAAE,QAAQ,CAAC,YAAY;wBACnC,YAAY,EAAE,QAAQ,CAAC,YAAY;wBACnC,aAAa,EAAE,QAAQ,CAAC,aAAa;wBACrC,cAAc,EAAE,QAAQ,CAAC,cAAc;wBACvC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;qBAC5B,CAAC;iBACH;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,sBAAsB,CAAC;IACrB,QAAQ,EAAE,cAAc;IACxB,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC9C,UAAU,EAAE,uBAAuB;IACnC,qBAAqB,EAAE,QAAQ;CAChC,CAAC,CAAC"}
1
+ {"version":3,"file":"getBranches.js","sourceRoot":"","sources":["../../src/tools/getBranches.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getCurrentUser.d.ts","sourceRoot":"","sources":["../../src/tools/getCurrentUser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAezE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,QAsC3D"}
1
+ {"version":3,"file":"getCurrentUser.d.ts","sourceRoot":"","sources":["../../src/tools/getCurrentUser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgBzE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,QA0C3D"}
@@ -2,6 +2,7 @@ import { Client } from "@octopusdeploy/api-client";
2
2
  import {} from "@modelcontextprotocol/sdk/server/mcp.js";
3
3
  import { registerToolDefinition } from "../types/toolConfig.js";
4
4
  import { getClientConfigurationFromEnvironment } from "../helpers/getClientConfigurationFromEnvironment.js";
5
+ import { handleOctopusApiError } from "../helpers/errorHandling.js";
5
6
  export function registerGetCurrentUserTool(server) {
6
7
  server.tool("get_current_user", `Get information about the current authenticated user
7
8
 
@@ -9,27 +10,32 @@ This tool retrieves information about the currently authenticated user from the
9
10
  title: "Get current user information",
10
11
  readOnlyHint: true,
11
12
  }, async () => {
12
- const configuration = getClientConfigurationFromEnvironment();
13
- const client = await Client.create(configuration);
14
- const user = await client.get("~/api/users/me");
15
- const currentUser = {
16
- id: user.Id,
17
- username: user.Username,
18
- displayName: user.DisplayName,
19
- isActive: user.IsActive,
20
- isService: user.IsService,
21
- emailAddress: user.EmailAddress,
22
- canPasswordBeEdited: user.CanPasswordBeEdited,
23
- isRequestor: user.IsRequestor,
24
- };
25
- return {
26
- content: [
27
- {
28
- type: "text",
29
- text: JSON.stringify(currentUser),
30
- },
31
- ],
32
- };
13
+ try {
14
+ const configuration = getClientConfigurationFromEnvironment();
15
+ const client = await Client.create(configuration);
16
+ const user = await client.get("~/api/users/me");
17
+ const currentUser = {
18
+ id: user.Id,
19
+ username: user.Username,
20
+ displayName: user.DisplayName,
21
+ isActive: user.IsActive,
22
+ isService: user.IsService,
23
+ emailAddress: user.EmailAddress,
24
+ canPasswordBeEdited: user.CanPasswordBeEdited,
25
+ isRequestor: user.IsRequestor,
26
+ };
27
+ return {
28
+ content: [
29
+ {
30
+ type: "text",
31
+ text: JSON.stringify(currentUser),
32
+ },
33
+ ],
34
+ };
35
+ }
36
+ catch (error) {
37
+ handleOctopusApiError(error, {});
38
+ }
33
39
  });
34
40
  }
35
41
  registerToolDefinition({
@@ -1 +1 @@
1
- {"version":3,"file":"getCurrentUser.js","sourceRoot":"","sources":["../../src/tools/getCurrentUser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAkB,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,qCAAqC,EAAE,MAAM,qDAAqD,CAAC;AAa5G,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB;;oGAEgG,EAChG,EAAE,EACF;QACE,KAAK,EAAE,8BAA8B;QACrC,YAAY,EAAE,IAAI;KACnB,EACD,KAAK,IAAI,EAAE;QACT,MAAM,aAAa,GAAG,qCAAqC,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAElD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAc,gBAAgB,CAAC,CAAC;QAE7D,MAAM,WAAW,GAAG;YAClB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;QAEF,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,kBAAkB;IAC5B,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC9C,UAAU,EAAE,0BAA0B;CACvC,CAAC,CAAC"}
1
+ {"version":3,"file":"getCurrentUser.js","sourceRoot":"","sources":["../../src/tools/getCurrentUser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAkB,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,qCAAqC,EAAE,MAAM,qDAAqD,CAAC;AAC5G,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAapE,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB;;oGAEgG,EAChG,EAAE,EACF;QACE,KAAK,EAAE,8BAA8B;QACrC,YAAY,EAAE,IAAI;KACnB,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,qCAAqC,EAAE,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAElD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAc,gBAAgB,CAAC,CAAC;YAE7D,MAAM,WAAW,GAAG;gBAClB,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;gBAC7C,WAAW,EAAE,IAAI,CAAC,WAAW;aAC9B,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;qBAClC;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,kBAAkB;IAC5B,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC9C,UAAU,EAAE,0BAA0B;CACvC,CAAC,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { Client } from '@octopusdeploy/api-client';
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ export interface GetDeploymentFromUrlParams {
4
+ url: string;
5
+ }
6
+ export declare function getDeploymentFromUrl(client: Client, params: GetDeploymentFromUrlParams): Promise<{
7
+ deployment: {
8
+ spaceId: string;
9
+ id: string;
10
+ name: string;
11
+ releaseId: string;
12
+ releaseVersion: string | undefined;
13
+ environmentId: string;
14
+ tenantId: string | undefined;
15
+ projectId: string;
16
+ channelId: string;
17
+ created: string;
18
+ taskId: string;
19
+ deploymentProcessId: string;
20
+ comments: string;
21
+ formValues: Record<string, unknown>;
22
+ queueTime: Date | undefined;
23
+ queueTimeExpiry: Date | undefined;
24
+ useGuidedFailure: boolean;
25
+ specificMachineIds: string[];
26
+ excludedMachineIds: string[];
27
+ skipActions: string[];
28
+ forcePackageDownload: boolean;
29
+ forcePackageRedeployment: boolean;
30
+ publicUrl: string | undefined;
31
+ };
32
+ resolvedSpaceName: string;
33
+ resolvedDeploymentId: string;
34
+ taskIdForLogs: string;
35
+ urlInfo: {
36
+ originalUrl: string;
37
+ extractedSpaceId: string;
38
+ extractedDeploymentId: string;
39
+ resourceType: "task" | "project" | "tenant" | "deployment" | "release" | "unknown" | undefined;
40
+ };
41
+ nextSteps: {
42
+ description: string;
43
+ useTaskId: string;
44
+ suggestedTool: string;
45
+ suggestedParams: {
46
+ spaceName: string;
47
+ taskId: string;
48
+ };
49
+ };
50
+ }>;
51
+ export declare function registerGetDeploymentFromUrlTool(server: McpServer): void;
52
+ //# sourceMappingURL=getDeploymentFromUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getDeploymentFromUrl.d.ts","sourceRoot":"","sources":["../../src/tools/getDeploymentFromUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA4D,MAAM,2BAA2B,CAAC;AAG7G,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,MAAM,WAAW,0BAA0B;IACzC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyG5F;AAED,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,SAAS,QAwCjE"}
@@ -0,0 +1,134 @@
1
+ import { Client, DeploymentRepository, ReleaseRepository } from '@octopusdeploy/api-client';
2
+ import { z } from 'zod';
3
+ import { getClientConfigurationFromEnvironment } from '../helpers/getClientConfigurationFromEnvironment.js';
4
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import { registerToolDefinition } from '../types/toolConfig.js';
6
+ import { parseOctopusUrl, extractDeploymentId } from '../helpers/urlParser.js';
7
+ import { resolveSpaceNameFromId } from '../helpers/spaceResolver.js';
8
+ import { getPublicUrl } from '../helpers/getPublicUrl.js';
9
+ export async function getDeploymentFromUrl(client, params) {
10
+ const { url } = params;
11
+ if (!url) {
12
+ throw new Error("URL is required");
13
+ }
14
+ const urlParts = parseOctopusUrl(url);
15
+ if (!urlParts.spaceId) {
16
+ throw new Error("Could not extract space ID from URL. URL must contain a space identifier like 'Spaces-1234'");
17
+ }
18
+ const spaceName = await resolveSpaceNameFromId(client, urlParts.spaceId);
19
+ const deploymentId = extractDeploymentId(url);
20
+ if (!deploymentId) {
21
+ throw new Error(`Could not extract deployment ID from URL. ` +
22
+ `URL must contain a deployment identifier (Deployments-XXXXX). ` +
23
+ `The provided URL appears to be: ${urlParts.resourceType || 'unknown type'}`);
24
+ }
25
+ const deploymentRepository = new DeploymentRepository(client, spaceName);
26
+ const deploymentsResponse = await deploymentRepository.list({});
27
+ const deployment = deploymentsResponse.Items.find(d => d.Id === deploymentId);
28
+ if (!deployment) {
29
+ throw new Error(`Deployment ${deploymentId} not found in space "${spaceName}". ` +
30
+ `The deployment may have been deleted or you may not have permission to view it.`);
31
+ }
32
+ let releaseVersion;
33
+ if (deployment.ReleaseId) {
34
+ const releaseRepository = new ReleaseRepository(client, spaceName);
35
+ try {
36
+ const release = await releaseRepository.get(deployment.ReleaseId);
37
+ releaseVersion = release.Version;
38
+ }
39
+ catch {
40
+ releaseVersion = undefined;
41
+ }
42
+ }
43
+ const configuration = getClientConfigurationFromEnvironment();
44
+ const publicUrl = releaseVersion
45
+ ? getPublicUrl(`${configuration.instanceURL}/app#/{spaceId}/projects/{projectId}/deployments/releases/{releaseVersion}/deployments/{deploymentId}`, {
46
+ spaceId: deployment.SpaceId,
47
+ projectId: deployment.ProjectId,
48
+ releaseVersion,
49
+ deploymentId: deployment.Id,
50
+ })
51
+ : undefined;
52
+ return {
53
+ deployment: {
54
+ spaceId: deployment.SpaceId,
55
+ id: deployment.Id,
56
+ name: deployment.Name,
57
+ releaseId: deployment.ReleaseId,
58
+ releaseVersion,
59
+ environmentId: deployment.EnvironmentId,
60
+ tenantId: deployment.TenantId,
61
+ projectId: deployment.ProjectId,
62
+ channelId: deployment.ChannelId,
63
+ created: deployment.Created,
64
+ taskId: deployment.TaskId,
65
+ deploymentProcessId: deployment.DeploymentProcessId,
66
+ comments: deployment.Comments,
67
+ formValues: deployment.FormValues,
68
+ queueTime: deployment.QueueTime,
69
+ queueTimeExpiry: deployment.QueueTimeExpiry,
70
+ useGuidedFailure: deployment.UseGuidedFailure,
71
+ specificMachineIds: deployment.SpecificMachineIds,
72
+ excludedMachineIds: deployment.ExcludedMachineIds,
73
+ skipActions: deployment.SkipActions,
74
+ forcePackageDownload: deployment.ForcePackageDownload,
75
+ forcePackageRedeployment: deployment.ForcePackageRedeployment,
76
+ publicUrl,
77
+ },
78
+ resolvedSpaceName: spaceName,
79
+ resolvedDeploymentId: deploymentId,
80
+ taskIdForLogs: deployment.TaskId,
81
+ urlInfo: {
82
+ originalUrl: url,
83
+ extractedSpaceId: urlParts.spaceId,
84
+ extractedDeploymentId: deploymentId,
85
+ resourceType: urlParts.resourceType,
86
+ },
87
+ nextSteps: {
88
+ description: "To view task logs and execution details for this deployment",
89
+ useTaskId: deployment.TaskId,
90
+ suggestedTool: "get_task_details",
91
+ suggestedParams: {
92
+ spaceName,
93
+ taskId: deployment.TaskId,
94
+ }
95
+ }
96
+ };
97
+ }
98
+ export function registerGetDeploymentFromUrlTool(server) {
99
+ server.tool('get_deployment_from_url', `Get deployment details from an Octopus Deploy URL. This tool automatically extracts the deployment ID from the URL and returns deployment information including the task ID needed to view logs.
100
+
101
+ This tool handles:
102
+ - Deployment URLs (containing Deployments-XXXXX)
103
+ - Automatic space ID to space name resolution
104
+ - Returns the task ID for easy log access via get_task_details
105
+
106
+ Example workflow:
107
+ 1. Call get_deployment_from_url with the deployment URL
108
+ 2. Use the returned taskId to call get_task_details for logs`, { url: z.string() }, {
109
+ title: 'Get deployment details from an Octopus Deploy URL',
110
+ readOnlyHint: true,
111
+ }, async (args) => {
112
+ const { url } = args;
113
+ if (!url) {
114
+ throw new Error("URL is required");
115
+ }
116
+ const configuration = getClientConfigurationFromEnvironment();
117
+ const client = await Client.create(configuration);
118
+ const result = await getDeploymentFromUrl(client, { url });
119
+ return {
120
+ content: [
121
+ {
122
+ type: "text",
123
+ text: JSON.stringify(result, null, 2),
124
+ },
125
+ ],
126
+ };
127
+ });
128
+ }
129
+ registerToolDefinition({
130
+ toolName: "get_deployment_from_url",
131
+ config: { toolset: "deployments", readOnly: true },
132
+ registerFn: registerGetDeploymentFromUrlTool,
133
+ });
134
+ //# sourceMappingURL=getDeploymentFromUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getDeploymentFromUrl.js","sourceRoot":"","sources":["../../src/tools/getDeploymentFromUrl.ts"],"names":[],"mappings":"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"}