@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.
- package/README.md +56 -20
- package/dist/helpers/errorHandling.d.ts +35 -0
- package/dist/helpers/errorHandling.d.ts.map +1 -0
- package/dist/helpers/errorHandling.js +72 -0
- package/dist/helpers/errorHandling.js.map +1 -0
- package/dist/helpers/getClientConfigurationFromEnvironment.js +1 -1
- package/dist/helpers/getClientConfigurationFromEnvironment.js.map +1 -1
- package/dist/helpers/spaceResolver.d.ts +4 -0
- package/dist/helpers/spaceResolver.d.ts.map +1 -0
- package/dist/helpers/spaceResolver.js +18 -0
- package/dist/helpers/spaceResolver.js.map +1 -0
- package/dist/helpers/urlParser.d.ts +16 -0
- package/dist/helpers/urlParser.d.ts.map +1 -0
- package/dist/helpers/urlParser.js +83 -0
- package/dist/helpers/urlParser.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -7
- package/dist/index.js.map +1 -1
- package/dist/tools/createRelease.d.ts +3 -0
- package/dist/tools/createRelease.d.ts.map +1 -0
- package/dist/tools/createRelease.js +108 -0
- package/dist/tools/createRelease.js.map +1 -0
- package/dist/tools/deployRelease.d.ts +3 -0
- package/dist/tools/deployRelease.d.ts.map +1 -0
- package/dist/tools/deployRelease.js +207 -0
- package/dist/tools/deployRelease.js.map +1 -0
- package/dist/tools/findAccounts.d.ts +3 -0
- package/dist/tools/findAccounts.d.ts.map +1 -0
- package/dist/tools/findAccounts.js +87 -0
- package/dist/tools/findAccounts.js.map +1 -0
- package/dist/tools/findCertificates.d.ts +3 -0
- package/dist/tools/findCertificates.d.ts.map +1 -0
- package/dist/tools/findCertificates.js +95 -0
- package/dist/tools/findCertificates.js.map +1 -0
- package/dist/tools/findDeploymentTargets.d.ts +3 -0
- package/dist/tools/findDeploymentTargets.d.ts.map +1 -0
- package/dist/tools/findDeploymentTargets.js +158 -0
- package/dist/tools/findDeploymentTargets.js.map +1 -0
- package/dist/tools/findReleases.d.ts +3 -0
- package/dist/tools/findReleases.d.ts.map +1 -0
- package/dist/tools/findReleases.js +96 -0
- package/dist/tools/findReleases.js.map +1 -0
- package/dist/tools/findTenants.d.ts +19 -0
- package/dist/tools/findTenants.d.ts.map +1 -0
- package/dist/tools/findTenants.js +130 -0
- package/dist/tools/findTenants.js.map +1 -0
- package/dist/tools/getBranches.d.ts.map +1 -1
- package/dist/tools/getBranches.js +38 -23
- package/dist/tools/getBranches.js.map +1 -1
- package/dist/tools/getCurrentUser.d.ts.map +1 -1
- package/dist/tools/getCurrentUser.js +27 -21
- package/dist/tools/getCurrentUser.js.map +1 -1
- package/dist/tools/getDeploymentFromUrl.d.ts +52 -0
- package/dist/tools/getDeploymentFromUrl.d.ts.map +1 -0
- package/dist/tools/getDeploymentFromUrl.js +134 -0
- package/dist/tools/getDeploymentFromUrl.js.map +1 -0
- package/dist/tools/getDeploymentProcess.d.ts.map +1 -1
- package/dist/tools/getDeploymentProcess.js +48 -13
- package/dist/tools/getDeploymentProcess.js.map +1 -1
- package/dist/tools/getKubernetesLiveStatus.d.ts.map +1 -1
- package/dist/tools/getKubernetesLiveStatus.js +57 -38
- package/dist/tools/getKubernetesLiveStatus.js.map +1 -1
- package/dist/tools/getMissingTenantVariables.d.ts.map +1 -1
- package/dist/tools/getMissingTenantVariables.js +45 -16
- package/dist/tools/getMissingTenantVariables.js.map +1 -1
- package/dist/tools/getTaskById.d.ts.map +1 -1
- package/dist/tools/getTaskById.js +24 -17
- package/dist/tools/getTaskById.js.map +1 -1
- package/dist/tools/getTaskDetails.d.ts +2 -2
- package/dist/tools/getTaskDetails.d.ts.map +1 -1
- package/dist/tools/getTaskDetails.js +48 -27
- package/dist/tools/getTaskDetails.js.map +1 -1
- package/dist/tools/getTaskFromUrl.d.ts +19 -0
- package/dist/tools/getTaskFromUrl.d.ts.map +1 -0
- package/dist/tools/getTaskFromUrl.js +90 -0
- package/dist/tools/getTaskFromUrl.js.map +1 -0
- package/dist/tools/getTaskRaw.d.ts.map +1 -1
- package/dist/tools/getTaskRaw.js +24 -17
- package/dist/tools/getTaskRaw.js.map +1 -1
- package/dist/tools/getTenantVariables.d.ts.map +1 -1
- package/dist/tools/getTenantVariables.js +45 -28
- package/dist/tools/getTenantVariables.js.map +1 -1
- package/dist/tools/index.d.ts +13 -14
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +19 -17
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/listDeployments.d.ts.map +1 -1
- package/dist/tools/listDeployments.js +55 -24
- package/dist/tools/listDeployments.js.map +1 -1
- package/dist/tools/listEnvironments.d.ts.map +1 -1
- package/dist/tools/listEnvironments.js +53 -30
- package/dist/tools/listEnvironments.js.map +1 -1
- package/dist/tools/listProjects.d.ts.map +1 -1
- package/dist/tools/listProjects.js +55 -32
- package/dist/tools/listProjects.js.map +1 -1
- package/dist/tools/listSpaces.d.ts.map +1 -1
- package/dist/tools/listSpaces.js +48 -25
- package/dist/tools/listSpaces.js.map +1 -1
- package/dist/utils/version.d.ts +2 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +3 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +9 -3
- package/dist/tools/getAccount.d.ts +0 -3
- package/dist/tools/getAccount.d.ts.map +0 -1
- package/dist/tools/getAccount.js +0 -40
- package/dist/tools/getAccount.js.map +0 -1
- package/dist/tools/getCertificate.d.ts +0 -3
- package/dist/tools/getCertificate.d.ts.map +0 -1
- package/dist/tools/getCertificate.js +0 -40
- package/dist/tools/getCertificate.js.map +0 -1
- package/dist/tools/getDeploymentTarget.d.ts +0 -3
- package/dist/tools/getDeploymentTarget.d.ts.map +0 -1
- package/dist/tools/getDeploymentTarget.js +0 -66
- package/dist/tools/getDeploymentTarget.js.map +0 -1
- package/dist/tools/getReleaseById.d.ts +0 -3
- package/dist/tools/getReleaseById.d.ts.map +0 -1
- package/dist/tools/getReleaseById.js +0 -45
- package/dist/tools/getReleaseById.js.map +0 -1
- package/dist/tools/getTenantById.d.ts +0 -3
- package/dist/tools/getTenantById.d.ts.map +0 -1
- package/dist/tools/getTenantById.js +0 -50
- package/dist/tools/getTenantById.js.map +0 -1
- package/dist/tools/listAccounts.d.ts +0 -3
- package/dist/tools/listAccounts.d.ts.map +0 -1
- package/dist/tools/listAccounts.js +0 -54
- package/dist/tools/listAccounts.js.map +0 -1
- package/dist/tools/listCertificates.d.ts +0 -3
- package/dist/tools/listCertificates.d.ts.map +0 -1
- package/dist/tools/listCertificates.js +0 -62
- package/dist/tools/listCertificates.js.map +0 -1
- package/dist/tools/listDeploymentTargets.d.ts +0 -3
- package/dist/tools/listDeploymentTargets.d.ts.map +0 -1
- package/dist/tools/listDeploymentTargets.js +0 -98
- package/dist/tools/listDeploymentTargets.js.map +0 -1
- package/dist/tools/listReleases.d.ts +0 -3
- package/dist/tools/listReleases.d.ts.map +0 -1
- package/dist/tools/listReleases.js +0 -54
- package/dist/tools/listReleases.js.map +0 -1
- package/dist/tools/listTenants.d.ts +0 -3
- package/dist/tools/listTenants.d.ts.map +0 -1
- package/dist/tools/listTenants.js +0 -69
- 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":"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,gBAAgB,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEvG,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,IAAI,CACT,eAAe,EACf;;;;;;2EAMuE,EACvE;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAChD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2EAA2E,CAAC;QACtH,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oEAAoE,CAAC;QAC1G,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oEAAoE,CAAC;KAC3G,EACD;QACE,KAAK,EAAE,0CAA0C;QACjD,YAAY,EAAE,IAAI;KACnB,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QAC7C,MAAM,aAAa,GAAG,qCAAqC,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAEnE,iDAAiD;QACjD,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;gBAEvD,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,EAAE,EAAE,OAAO,CAAC,EAAE;gCACd,OAAO,EAAE,OAAO,CAAC,OAAO;gCACxB,SAAS,EAAE,OAAO,CAAC,SAAS;gCAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;gCAC5B,YAAY,EAAE,OAAO,CAAC,YAAY;gCAClC,SAAS,EAAE,OAAO,CAAC,SAAS;gCAC5B,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;gCAC9C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;gCAC1C,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;gCAClD,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;gCAC1C,YAAY,EAAE,OAAO,CAAC,YAAY;6BACnC,CAAC;yBACH;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,6FAA6F;iBACxG,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,MAAM,gBAAgB,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtE,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,OAAO,CAAC,EAAE,CAAC,CAAC;4BAC5C,EAAE,EAAE,OAAO,CAAC,EAAE;4BACd,OAAO,EAAE,OAAO,CAAC,OAAO;4BACxB,SAAS,EAAE,OAAO,CAAC,SAAS;4BAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;4BAC5B,YAAY,EAAE,OAAO,CAAC,YAAY;4BAClC,SAAS,EAAE,OAAO,CAAC,SAAS;4BAC5B,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;4BAC9C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;4BAC1C,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;4BAClD,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;4BAC1C,YAAY,EAAE,OAAO,CAAC,YAAY;yBACnC,CAAC,CAAC;qBACJ,CAAC;iBACH;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,sBAAsB,CAAC;IACrB,QAAQ,EAAE,eAAe;IACzB,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC/C,UAAU,EAAE,wBAAwB;CACrC,CAAC,CAAC"}
|
|
@@ -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;
|
|
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
|
-
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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;
|
|
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;
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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;
|
|
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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"}
|