@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.
- package/README.md +237 -46
- package/dist/helpers/activeToolsetConfig.d.ts +4 -0
- package/dist/helpers/activeToolsetConfig.d.ts.map +1 -0
- package/dist/helpers/activeToolsetConfig.js +18 -0
- package/dist/helpers/activeToolsetConfig.js.map +1 -0
- package/dist/helpers/errorHandling.d.ts +38 -0
- package/dist/helpers/errorHandling.d.ts.map +1 -0
- package/dist/helpers/errorHandling.js +75 -0
- package/dist/helpers/errorHandling.js.map +1 -0
- package/dist/helpers/getClientConfigurationFromEnvironment.d.ts +2 -0
- package/dist/helpers/getClientConfigurationFromEnvironment.d.ts.map +1 -1
- package/dist/helpers/getClientConfigurationFromEnvironment.js +21 -5
- package/dist/helpers/getClientConfigurationFromEnvironment.js.map +1 -1
- package/dist/helpers/grepLines.d.ts +38 -0
- package/dist/helpers/grepLines.d.ts.map +1 -0
- package/dist/helpers/grepLines.js +65 -0
- package/dist/helpers/grepLines.js.map +1 -0
- package/dist/helpers/methodTier.d.ts +15 -0
- package/dist/helpers/methodTier.d.ts.map +1 -0
- package/dist/helpers/methodTier.js +25 -0
- package/dist/helpers/methodTier.js.map +1 -0
- package/dist/helpers/pathAllowlist.d.ts +27 -0
- package/dist/helpers/pathAllowlist.d.ts.map +1 -0
- package/dist/helpers/pathAllowlist.js +177 -0
- package/dist/helpers/pathAllowlist.js.map +1 -0
- package/dist/helpers/pathGlob.d.ts +15 -0
- package/dist/helpers/pathGlob.d.ts.map +1 -0
- package/dist/helpers/pathGlob.js +47 -0
- package/dist/helpers/pathGlob.js.map +1 -0
- package/dist/helpers/requireConfirmation.d.ts +119 -0
- package/dist/helpers/requireConfirmation.d.ts.map +1 -0
- package/dist/helpers/requireConfirmation.js +148 -0
- package/dist/helpers/requireConfirmation.js.map +1 -0
- package/dist/helpers/sensitivePathDenylist.d.ts +32 -0
- package/dist/helpers/sensitivePathDenylist.d.ts.map +1 -0
- package/dist/helpers/sensitivePathDenylist.js +49 -0
- package/dist/helpers/sensitivePathDenylist.js.map +1 -0
- 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/stripLinks.d.ts +15 -0
- package/dist/helpers/stripLinks.d.ts.map +1 -0
- package/dist/helpers/stripLinks.js +19 -0
- package/dist/helpers/stripLinks.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/helpers/userCache.d.ts +14 -0
- package/dist/helpers/userCache.d.ts.map +1 -0
- package/dist/helpers/userCache.js +16 -0
- package/dist/helpers/userCache.js.map +1 -0
- package/dist/helpers/validateExecutePath.d.ts +29 -0
- package/dist/helpers/validateExecutePath.d.ts.map +1 -0
- package/dist/helpers/validateExecutePath.js +62 -0
- package/dist/helpers/validateExecutePath.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +64 -15
- package/dist/index.js.map +1 -1
- package/dist/resources/catalog/capabilities.d.ts +36 -0
- package/dist/resources/catalog/capabilities.d.ts.map +1 -0
- package/dist/resources/catalog/capabilities.js +90 -0
- package/dist/resources/catalog/capabilities.js.map +1 -0
- package/dist/resources/catalog/llmsTxt.d.ts +8 -0
- package/dist/resources/catalog/llmsTxt.d.ts.map +1 -0
- package/dist/resources/catalog/llmsTxt.js +44 -0
- package/dist/resources/catalog/llmsTxt.js.map +1 -0
- package/dist/resources/dispatch.d.ts +30 -0
- package/dist/resources/dispatch.d.ts.map +1 -0
- package/dist/resources/dispatch.js +81 -0
- package/dist/resources/dispatch.js.map +1 -0
- package/dist/resources/featureToggle.d.ts +2 -0
- package/dist/resources/featureToggle.d.ts.map +1 -0
- package/dist/resources/featureToggle.js +34 -0
- package/dist/resources/featureToggle.js.map +1 -0
- package/dist/resources/index.d.ts +12 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +44 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/interruption.d.ts +2 -0
- package/dist/resources/interruption.d.ts.map +1 -0
- package/dist/resources/interruption.js +34 -0
- package/dist/resources/interruption.js.map +1 -0
- package/dist/resources/release.d.ts +2 -0
- package/dist/resources/release.d.ts.map +1 -0
- package/dist/resources/release.js +33 -0
- package/dist/resources/release.js.map +1 -0
- package/dist/resources/rolloutGroup.d.ts +2 -0
- package/dist/resources/rolloutGroup.d.ts.map +1 -0
- package/dist/resources/rolloutGroup.js +35 -0
- package/dist/resources/rolloutGroup.js.map +1 -0
- package/dist/resources/runbook.d.ts +2 -0
- package/dist/resources/runbook.d.ts.map +1 -0
- package/dist/resources/runbook.js +34 -0
- package/dist/resources/runbook.js.map +1 -0
- package/dist/resources/task.d.ts +2 -0
- package/dist/resources/task.d.ts.map +1 -0
- package/dist/resources/task.js +68 -0
- package/dist/resources/task.js.map +1 -0
- package/dist/tools/createRelease.d.ts +3 -0
- package/dist/tools/createRelease.d.ts.map +1 -0
- package/dist/tools/createRelease.js +151 -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 +227 -0
- package/dist/tools/deployRelease.js.map +1 -0
- package/dist/tools/execute.d.ts +3 -0
- package/dist/tools/execute.d.ts.map +1 -0
- package/dist/tools/execute.js +261 -0
- package/dist/tools/execute.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 +90 -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 +98 -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 +161 -0
- package/dist/tools/findDeploymentTargets.js.map +1 -0
- package/dist/tools/findFeatureToggles.d.ts +37 -0
- package/dist/tools/findFeatureToggles.d.ts.map +1 -0
- package/dist/tools/findFeatureToggles.js +139 -0
- package/dist/tools/findFeatureToggles.js.map +1 -0
- package/dist/tools/findInterruptions.d.ts +79 -0
- package/dist/tools/findInterruptions.d.ts.map +1 -0
- package/dist/tools/findInterruptions.js +273 -0
- package/dist/tools/findInterruptions.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 +138 -0
- package/dist/tools/findReleases.js.map +1 -0
- package/dist/tools/findRunbooks.d.ts +3 -0
- package/dist/tools/findRunbooks.d.ts.map +1 -0
- package/dist/tools/findRunbooks.js +139 -0
- package/dist/tools/findRunbooks.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 +133 -0
- package/dist/tools/findTenants.js.map +1 -0
- package/dist/tools/getBranches.d.ts.map +1 -1
- package/dist/tools/getBranches.js +51 -33
- package/dist/tools/getBranches.js.map +1 -1
- package/dist/tools/getCurrentUser.d.ts.map +1 -1
- package/dist/tools/getCurrentUser.js +34 -25
- package/dist/tools/getCurrentUser.js.map +1 -1
- package/dist/tools/getDeploymentFromUrl.d.ts +57 -0
- package/dist/tools/getDeploymentFromUrl.d.ts.map +1 -0
- package/dist/tools/getDeploymentFromUrl.js +162 -0
- package/dist/tools/getDeploymentFromUrl.js.map +1 -0
- package/dist/tools/getDeploymentProcess.d.ts.map +1 -1
- package/dist/tools/getDeploymentProcess.js +57 -19
- package/dist/tools/getDeploymentProcess.js.map +1 -1
- package/dist/tools/getKubernetesLiveStatus.d.ts.map +1 -1
- package/dist/tools/getKubernetesLiveStatus.js +70 -48
- package/dist/tools/getKubernetesLiveStatus.js.map +1 -1
- package/dist/tools/getMissingTenantVariables.d.ts.map +1 -1
- package/dist/tools/getMissingTenantVariables.js +58 -26
- package/dist/tools/getMissingTenantVariables.js.map +1 -1
- package/dist/tools/getTaskFromUrl.d.ts +18 -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/getTenantVariables.d.ts.map +1 -1
- package/dist/tools/getTenantVariables.js +58 -38
- package/dist/tools/getTenantVariables.js.map +1 -1
- package/dist/tools/getVariables.d.ts.map +1 -1
- package/dist/tools/getVariables.js +12 -9
- package/dist/tools/getVariables.js.map +1 -1
- package/dist/tools/grepLlmsTxt.d.ts +13 -0
- package/dist/tools/grepLlmsTxt.d.ts.map +1 -0
- package/dist/tools/grepLlmsTxt.js +105 -0
- package/dist/tools/grepLlmsTxt.js.map +1 -0
- package/dist/tools/grepTaskLog.d.ts +30 -0
- package/dist/tools/grepTaskLog.d.ts.map +1 -0
- package/dist/tools/grepTaskLog.js +116 -0
- package/dist/tools/grepTaskLog.js.map +1 -0
- package/dist/tools/index.d.ts +22 -18
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +33 -21
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/listDeployments.d.ts.map +1 -1
- package/dist/tools/listDeployments.js +77 -37
- package/dist/tools/listDeployments.js.map +1 -1
- package/dist/tools/listEnvironments.d.ts.map +1 -1
- package/dist/tools/listEnvironments.js +63 -37
- package/dist/tools/listEnvironments.js.map +1 -1
- package/dist/tools/listProjects.d.ts.map +1 -1
- package/dist/tools/listProjects.js +64 -38
- package/dist/tools/listProjects.js.map +1 -1
- package/dist/tools/listSpaces.d.ts.map +1 -1
- package/dist/tools/listSpaces.js +56 -30
- package/dist/tools/listSpaces.js.map +1 -1
- package/dist/tools/readResource.d.ts +3 -0
- package/dist/tools/readResource.d.ts.map +1 -0
- package/dist/tools/readResource.js +50 -0
- package/dist/tools/readResource.js.map +1 -0
- package/dist/tools/runRunbook.d.ts +3 -0
- package/dist/tools/runRunbook.d.ts.map +1 -0
- package/dist/tools/runRunbook.js +174 -0
- package/dist/tools/runRunbook.js.map +1 -0
- package/dist/tools/updateFeatureToggle.d.ts +94 -0
- package/dist/tools/updateFeatureToggle.d.ts.map +1 -0
- package/dist/tools/updateFeatureToggle.js +308 -0
- package/dist/tools/updateFeatureToggle.js.map +1 -0
- package/dist/types/featureToggleTypes.d.ts +47 -0
- package/dist/types/featureToggleTypes.d.ts.map +1 -0
- package/dist/types/featureToggleTypes.js +10 -0
- package/dist/types/featureToggleTypes.js.map +1 -0
- package/dist/types/resourceConfig.d.ts +17 -0
- package/dist/types/resourceConfig.d.ts.map +1 -0
- package/dist/types/resourceConfig.js +6 -0
- package/dist/types/resourceConfig.js.map +1 -0
- package/dist/types/toolAnnotations.d.ts +8 -0
- package/dist/types/toolAnnotations.d.ts.map +1 -0
- package/dist/types/toolAnnotations.js +28 -0
- package/dist/types/toolAnnotations.js.map +1 -0
- package/dist/types/toolConfig.d.ts +7 -1
- package/dist/types/toolConfig.d.ts.map +1 -1
- package/dist/types/toolConfig.js +4 -1
- package/dist/types/toolConfig.js.map +1 -1
- package/dist/utils/parseConfig.d.ts +1 -1
- package/dist/utils/parseConfig.d.ts.map +1 -1
- package/dist/utils/parseConfig.js +3 -2
- package/dist/utils/parseConfig.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/getTaskById.d.ts +0 -9
- package/dist/tools/getTaskById.d.ts.map +0 -1
- package/dist/tools/getTaskById.js +0 -44
- package/dist/tools/getTaskById.js.map +0 -1
- package/dist/tools/getTaskDetails.d.ts +0 -9
- package/dist/tools/getTaskDetails.d.ts.map +0 -1
- package/dist/tools/getTaskDetails.js +0 -44
- package/dist/tools/getTaskDetails.js.map +0 -1
- package/dist/tools/getTaskRaw.d.ts +0 -9
- package/dist/tools/getTaskRaw.d.ts.map +0 -1
- package/dist/tools/getTaskRaw.js +0 -43
- package/dist/tools/getTaskRaw.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/listReleasesForProject.d.ts +0 -3
- package/dist/tools/listReleasesForProject.d.ts.map +0 -1
- package/dist/tools/listReleasesForProject.js +0 -60
- package/dist/tools/listReleasesForProject.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,98 @@
|
|
|
1
|
+
import { Client, resolveSpaceId } from "@octopusdeploy/api-client";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import {} from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
4
|
+
import { registerToolDefinition } from "../types/toolConfig.js";
|
|
5
|
+
import { READ_ONLY_TOOL_ANNOTATIONS } from "../types/toolAnnotations.js";
|
|
6
|
+
import { getClientConfigurationFromEnvironment } from "../helpers/getClientConfigurationFromEnvironment.js";
|
|
7
|
+
import { mapCertificateResource } from "../types/certificateTypes.js";
|
|
8
|
+
import { validateEntityId, handleOctopusApiError, ENTITY_PREFIXES } from "../helpers/errorHandling.js";
|
|
9
|
+
export function registerFindCertificatesTool(server) {
|
|
10
|
+
server.registerTool("find_certificates", {
|
|
11
|
+
title: "Find certificates in an Octopus Deploy space",
|
|
12
|
+
description: `Find certificates in a space - can retrieve a single certificate by ID or list all certificates
|
|
13
|
+
|
|
14
|
+
This unified tool can either:
|
|
15
|
+
- Get detailed information about a specific certificate when certificateId is provided
|
|
16
|
+
- List all certificates in a space when certificateId is omitted
|
|
17
|
+
|
|
18
|
+
You can optionally filter by various parameters like name, archived status, tenant, etc. when listing.`,
|
|
19
|
+
inputSchema: {
|
|
20
|
+
spaceName: z.string(),
|
|
21
|
+
certificateId: z.string().optional().describe("The ID of a specific certificate to retrieve. If omitted, lists all certificates."),
|
|
22
|
+
skip: z.number().optional().describe("Number of certificates to skip for pagination (only used when listing)"),
|
|
23
|
+
take: z.number().optional().describe("Number of certificates to take for pagination (only used when listing)"),
|
|
24
|
+
search: z.string().optional().describe("Search term to filter certificates (only used when listing)"),
|
|
25
|
+
archived: z.boolean().optional().describe("Filter by archived status (only used when listing)"),
|
|
26
|
+
tenant: z.string().optional().describe("Filter by tenant (only used when listing)"),
|
|
27
|
+
firstResult: z.number().optional().describe("Index of first result to return (only used when listing)"),
|
|
28
|
+
orderBy: z.string().optional().describe("Field to order results by (only used when listing)"),
|
|
29
|
+
ids: z.array(z.string()).optional().describe("Filter by specific certificate IDs (only used when listing)"),
|
|
30
|
+
partialName: z.string().optional().describe("Filter by partial name match (only used when listing)"),
|
|
31
|
+
},
|
|
32
|
+
annotations: READ_ONLY_TOOL_ANNOTATIONS,
|
|
33
|
+
}, async ({ spaceName, certificateId, skip, take, search, archived, tenant, firstResult, orderBy, ids, partialName, }) => {
|
|
34
|
+
const configuration = getClientConfigurationFromEnvironment();
|
|
35
|
+
const client = await Client.create(configuration);
|
|
36
|
+
const spaceId = await resolveSpaceId(client, spaceName);
|
|
37
|
+
// If certificateId is provided, get a single certificate
|
|
38
|
+
if (certificateId) {
|
|
39
|
+
validateEntityId(certificateId, 'certificate', ENTITY_PREFIXES.certificate);
|
|
40
|
+
try {
|
|
41
|
+
const response = await client.get("~/api/{spaceId}/certificates/{id}", {
|
|
42
|
+
spaceId,
|
|
43
|
+
id: certificateId,
|
|
44
|
+
});
|
|
45
|
+
const certificate = mapCertificateResource(response);
|
|
46
|
+
return {
|
|
47
|
+
content: [
|
|
48
|
+
{
|
|
49
|
+
type: "text",
|
|
50
|
+
text: JSON.stringify(certificate),
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
handleOctopusApiError(error, {
|
|
57
|
+
entityType: 'certificate',
|
|
58
|
+
entityId: certificateId,
|
|
59
|
+
spaceName
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Otherwise, list all certificates
|
|
64
|
+
const response = await client.get("~/api/{spaceId}/certificates{?skip,take,search,archived,tenant,firstResult,orderBy,ids,partialName}", {
|
|
65
|
+
spaceId,
|
|
66
|
+
skip,
|
|
67
|
+
take,
|
|
68
|
+
search,
|
|
69
|
+
archived,
|
|
70
|
+
tenant,
|
|
71
|
+
firstResult,
|
|
72
|
+
orderBy,
|
|
73
|
+
ids,
|
|
74
|
+
partialName,
|
|
75
|
+
});
|
|
76
|
+
const certificates = response.Items.map((cert) => mapCertificateResource(cert));
|
|
77
|
+
return {
|
|
78
|
+
content: [
|
|
79
|
+
{
|
|
80
|
+
type: "text",
|
|
81
|
+
text: JSON.stringify({
|
|
82
|
+
totalResults: response.TotalResults,
|
|
83
|
+
itemsPerPage: response.ItemsPerPage,
|
|
84
|
+
numberOfPages: response.NumberOfPages,
|
|
85
|
+
lastPageNumber: response.LastPageNumber,
|
|
86
|
+
items: certificates,
|
|
87
|
+
}),
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
};
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
registerToolDefinition({
|
|
94
|
+
toolName: "find_certificates",
|
|
95
|
+
config: { toolset: "certificates", readOnly: true },
|
|
96
|
+
registerFn: registerFindCertificatesTool,
|
|
97
|
+
});
|
|
98
|
+
//# sourceMappingURL=findCertificates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findCertificates.js","sourceRoot":"","sources":["../../src/tools/findCertificates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findDeploymentTargets.d.ts","sourceRoot":"","sources":["../../src/tools/findDeploymentTargets.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,SAAS,QAqLlE"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { Client, resolveSpaceId } from "@octopusdeploy/api-client";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import {} from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
4
|
+
import { registerToolDefinition } from "../types/toolConfig.js";
|
|
5
|
+
import { READ_ONLY_TOOL_ANNOTATIONS } from "../types/toolAnnotations.js";
|
|
6
|
+
import { getClientConfigurationFromEnvironment } from "../helpers/getClientConfigurationFromEnvironment.js";
|
|
7
|
+
import {} from "../types/deploymentTargetTypes.js";
|
|
8
|
+
import { validateEntityId, handleOctopusApiError, ENTITY_PREFIXES } from "../helpers/errorHandling.js";
|
|
9
|
+
export function registerFindDeploymentTargetsTool(server) {
|
|
10
|
+
server.registerTool("find_deployment_targets", {
|
|
11
|
+
title: "Find deployment targets in an Octopus Deploy space",
|
|
12
|
+
description: `Find deployment targets (machines) in a space - can retrieve a single target by ID or list all targets
|
|
13
|
+
|
|
14
|
+
This unified tool can either:
|
|
15
|
+
- Get detailed information about a specific deployment target when targetId is provided
|
|
16
|
+
- List all deployment targets in a space when targetId is omitted
|
|
17
|
+
|
|
18
|
+
You can optionally filter by various parameters like name, roles, health status, etc. when listing.`,
|
|
19
|
+
inputSchema: {
|
|
20
|
+
spaceName: z.string(),
|
|
21
|
+
targetId: z.string().optional().describe("The ID of a specific deployment target to retrieve. If omitted, lists all deployment targets."),
|
|
22
|
+
skip: z.number().optional().describe("Number of targets to skip for pagination (only used when listing)"),
|
|
23
|
+
take: z.number().optional().describe("Number of targets to take for pagination (only used when listing)"),
|
|
24
|
+
name: z.string().optional().describe("Filter by exact name (only used when listing)"),
|
|
25
|
+
ids: z.array(z.string()).optional().describe("Filter by specific target IDs (only used when listing)"),
|
|
26
|
+
partialName: z.string().optional().describe("Filter by partial name match (only used when listing)"),
|
|
27
|
+
roles: z.array(z.string()).optional().describe("A list of roles / target tags to filter by (only used when listing)"),
|
|
28
|
+
isDisabled: z.boolean().optional().describe("Filter by disabled status (only used when listing)"),
|
|
29
|
+
healthStatuses: z.array(z.string()).optional().describe("Possible values: Healthy, Unhealthy, Unavailable, Unknown, HasWarnings (only used when listing)"),
|
|
30
|
+
commStyles: z.array(z.string()).optional().describe("Filter by communication styles (only used when listing)"),
|
|
31
|
+
tenantIds: z.array(z.string()).optional().describe("Filter by tenant IDs (only used when listing)"),
|
|
32
|
+
tenantTags: z.array(z.string()).optional().describe("Filter by tenant tags (only used when listing)"),
|
|
33
|
+
environmentIds: z.array(z.string()).optional().describe("Filter by environment IDs (only used when listing)"),
|
|
34
|
+
thumbprint: z.string().optional().describe("Filter by thumbprint (only used when listing)"),
|
|
35
|
+
deploymentId: z.string().optional().describe("Filter by deployment ID (only used when listing)"),
|
|
36
|
+
shellNames: z.array(z.string()).optional().describe("Filter by shell names (only used when listing)"),
|
|
37
|
+
deploymentTargetTypes: z.array(z.string()).optional().describe("Filter by deployment target types (only used when listing)"),
|
|
38
|
+
},
|
|
39
|
+
annotations: READ_ONLY_TOOL_ANNOTATIONS,
|
|
40
|
+
}, async ({ spaceName, targetId, skip, take, name, ids, partialName, roles, isDisabled, healthStatuses, commStyles, tenantIds, tenantTags, environmentIds, thumbprint, deploymentId, shellNames, deploymentTargetTypes, }) => {
|
|
41
|
+
const configuration = getClientConfigurationFromEnvironment();
|
|
42
|
+
const client = await Client.create(configuration);
|
|
43
|
+
const spaceId = await resolveSpaceId(client, spaceName);
|
|
44
|
+
// If targetId is provided, get a single deployment target
|
|
45
|
+
if (targetId) {
|
|
46
|
+
validateEntityId(targetId, 'machine', ENTITY_PREFIXES.machine);
|
|
47
|
+
try {
|
|
48
|
+
const target = await client.get("~/api/{spaceId}/machines/{id}", {
|
|
49
|
+
spaceId,
|
|
50
|
+
id: targetId,
|
|
51
|
+
});
|
|
52
|
+
const deploymentTarget = {
|
|
53
|
+
spaceId: target.SpaceId,
|
|
54
|
+
id: target.Id,
|
|
55
|
+
name: target.Name,
|
|
56
|
+
slug: target.Slug,
|
|
57
|
+
isDisabled: target.IsDisabled,
|
|
58
|
+
healthStatus: target.HealthStatus,
|
|
59
|
+
statusSummary: target.StatusSummary,
|
|
60
|
+
environmentIds: target.EnvironmentIds,
|
|
61
|
+
roles: target.Roles,
|
|
62
|
+
tenantedDeploymentParticipation: target.TenantedDeploymentParticipation,
|
|
63
|
+
tenantIds: target.TenantIds,
|
|
64
|
+
tenantTags: target.TenantTags,
|
|
65
|
+
endpoint: {
|
|
66
|
+
id: target.Endpoint.Id,
|
|
67
|
+
communicationStyle: target.Endpoint.CommunicationStyle,
|
|
68
|
+
uri: target.Endpoint.Uri,
|
|
69
|
+
fingerprint: target.Endpoint.Fingerprint,
|
|
70
|
+
proxyId: target.Endpoint.ProxyId,
|
|
71
|
+
tentacleVersionDetails: target.Endpoint.TentacleVersionDetails,
|
|
72
|
+
},
|
|
73
|
+
shellName: target.ShellName,
|
|
74
|
+
machinePolicyId: target.MachinePolicyId,
|
|
75
|
+
hasLatestCalamari: target.HasLatestCalamari,
|
|
76
|
+
isInProcess: target.IsInProcess,
|
|
77
|
+
links: target.Links,
|
|
78
|
+
};
|
|
79
|
+
return {
|
|
80
|
+
content: [
|
|
81
|
+
{
|
|
82
|
+
type: "text",
|
|
83
|
+
text: JSON.stringify(deploymentTarget),
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
handleOctopusApiError(error, {
|
|
90
|
+
entityType: 'deployment target',
|
|
91
|
+
entityId: targetId,
|
|
92
|
+
spaceName,
|
|
93
|
+
helpText: "Use find_deployment_targets without targetId to find valid target IDs."
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Otherwise, list all deployment targets
|
|
98
|
+
const response = await client.get("~/api/{spaceId}/machines{?skip,take,name,ids,partialName,roles,isDisabled,healthStatuses,commStyles,tenantIds,tenantTags,environmentIds,thumbprint,deploymentId,shellNames,deploymentTargetTypes}", {
|
|
99
|
+
spaceId,
|
|
100
|
+
skip,
|
|
101
|
+
take,
|
|
102
|
+
name,
|
|
103
|
+
ids,
|
|
104
|
+
partialName,
|
|
105
|
+
roles,
|
|
106
|
+
isDisabled,
|
|
107
|
+
healthStatuses,
|
|
108
|
+
commStyles,
|
|
109
|
+
tenantIds,
|
|
110
|
+
tenantTags,
|
|
111
|
+
environmentIds,
|
|
112
|
+
thumbprint,
|
|
113
|
+
deploymentId,
|
|
114
|
+
shellNames,
|
|
115
|
+
deploymentTargetTypes,
|
|
116
|
+
});
|
|
117
|
+
const deploymentTargets = response.Items.map((target) => ({
|
|
118
|
+
spaceId: target.SpaceId,
|
|
119
|
+
id: target.Id,
|
|
120
|
+
name: target.Name,
|
|
121
|
+
slug: target.Slug,
|
|
122
|
+
isDisabled: target.IsDisabled,
|
|
123
|
+
healthStatus: target.HealthStatus,
|
|
124
|
+
statusSummary: target.StatusSummary,
|
|
125
|
+
environmentIds: target.EnvironmentIds,
|
|
126
|
+
roles: target.Roles,
|
|
127
|
+
tenantedDeploymentParticipation: target.TenantedDeploymentParticipation,
|
|
128
|
+
tenantIds: target.TenantIds,
|
|
129
|
+
tenantTags: target.TenantTags,
|
|
130
|
+
endpoint: {
|
|
131
|
+
communicationStyle: target.Endpoint.CommunicationStyle,
|
|
132
|
+
uri: target.Endpoint.Uri,
|
|
133
|
+
fingerprint: target.Endpoint.Fingerprint,
|
|
134
|
+
},
|
|
135
|
+
shellName: target.ShellName,
|
|
136
|
+
machinePolicyId: target.MachinePolicyId,
|
|
137
|
+
hasLatestCalamari: target.HasLatestCalamari,
|
|
138
|
+
isInProcess: target.IsInProcess,
|
|
139
|
+
}));
|
|
140
|
+
return {
|
|
141
|
+
content: [
|
|
142
|
+
{
|
|
143
|
+
type: "text",
|
|
144
|
+
text: JSON.stringify({
|
|
145
|
+
totalResults: response.TotalResults,
|
|
146
|
+
itemsPerPage: response.ItemsPerPage,
|
|
147
|
+
numberOfPages: response.NumberOfPages,
|
|
148
|
+
lastPageNumber: response.LastPageNumber,
|
|
149
|
+
items: deploymentTargets,
|
|
150
|
+
}),
|
|
151
|
+
},
|
|
152
|
+
],
|
|
153
|
+
};
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
registerToolDefinition({
|
|
157
|
+
toolName: "find_deployment_targets",
|
|
158
|
+
config: { toolset: "machines", readOnly: true },
|
|
159
|
+
registerFn: registerFindDeploymentTargetsTool,
|
|
160
|
+
});
|
|
161
|
+
//# sourceMappingURL=findDeploymentTargets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findDeploymentTargets.js","sourceRoot":"","sources":["../../src/tools/findDeploymentTargets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
declare const findFeatureTogglesSchema: z.ZodObject<{
|
|
4
|
+
spaceName: z.ZodString;
|
|
5
|
+
projectId: z.ZodString;
|
|
6
|
+
partialName: z.ZodOptional<z.ZodString>;
|
|
7
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
8
|
+
environmentIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
9
|
+
skip: z.ZodOptional<z.ZodNumber>;
|
|
10
|
+
take: z.ZodOptional<z.ZodNumber>;
|
|
11
|
+
}, "strip", z.ZodTypeAny, {
|
|
12
|
+
spaceName: string;
|
|
13
|
+
projectId: string;
|
|
14
|
+
partialName?: string | undefined;
|
|
15
|
+
skip?: number | undefined;
|
|
16
|
+
take?: number | undefined;
|
|
17
|
+
tags?: string[] | undefined;
|
|
18
|
+
environmentIds?: string[] | undefined;
|
|
19
|
+
}, {
|
|
20
|
+
spaceName: string;
|
|
21
|
+
projectId: string;
|
|
22
|
+
partialName?: string | undefined;
|
|
23
|
+
skip?: number | undefined;
|
|
24
|
+
take?: number | undefined;
|
|
25
|
+
tags?: string[] | undefined;
|
|
26
|
+
environmentIds?: string[] | undefined;
|
|
27
|
+
}>;
|
|
28
|
+
export type FindFeatureTogglesParams = z.infer<typeof findFeatureTogglesSchema>;
|
|
29
|
+
export declare function findFeatureTogglesHandler(params: FindFeatureTogglesParams): Promise<{
|
|
30
|
+
content: {
|
|
31
|
+
type: "text";
|
|
32
|
+
text: string;
|
|
33
|
+
}[];
|
|
34
|
+
}>;
|
|
35
|
+
export declare function registerFindFeatureTogglesTool(server: McpServer): void;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=findFeatureToggles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findFeatureToggles.d.ts","sourceRoot":"","sources":["../../src/tools/findFeatureToggles.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8CzE,QAAA,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;EAoC5B,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEhF,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,wBAAwB;;;;;GA2DjC;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,SAAS,QAiB/D"}
|
|
@@ -0,0 +1,139 @@
|
|
|
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 { READ_ONLY_TOOL_ANNOTATIONS } from "../types/toolAnnotations.js";
|
|
7
|
+
import { handleOctopusApiError, isErrorWithMessage, } from "../helpers/errorHandling.js";
|
|
8
|
+
import {} from "../types/featureToggleTypes.js";
|
|
9
|
+
/**
|
|
10
|
+
* Slim per-environment shape returned alongside each toggle. Includes just
|
|
11
|
+
* enough state to answer "where is X turned on, and at what rollout?" without
|
|
12
|
+
* dereferencing the full toggle body. Tenant lists, segments, and minimum
|
|
13
|
+
* versions stay in the resource.
|
|
14
|
+
*/
|
|
15
|
+
function environmentSummary(env) {
|
|
16
|
+
return {
|
|
17
|
+
deploymentEnvironmentId: env.DeploymentEnvironmentId,
|
|
18
|
+
isEnabled: env.IsEnabled,
|
|
19
|
+
rolloutPercentage: env.RolloutPercentage,
|
|
20
|
+
clientRolloutPercentage: env.ClientRolloutPercentage,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function toggleSummary(toggle, spaceName) {
|
|
24
|
+
const encodedSpace = encodeURIComponent(spaceName);
|
|
25
|
+
const encodedProjectId = encodeURIComponent(toggle.ProjectId);
|
|
26
|
+
const encodedSlug = encodeURIComponent(toggle.Slug);
|
|
27
|
+
return {
|
|
28
|
+
id: toggle.Id,
|
|
29
|
+
slug: toggle.Slug,
|
|
30
|
+
name: toggle.Name,
|
|
31
|
+
projectId: toggle.ProjectId,
|
|
32
|
+
defaultIsEnabled: toggle.DefaultIsEnabled,
|
|
33
|
+
rolloutGroupId: toggle.RolloutGroupId ?? null,
|
|
34
|
+
tags: toggle.Tags ?? [],
|
|
35
|
+
environmentSummaries: (toggle.Environments ?? []).map(environmentSummary),
|
|
36
|
+
resourceUri: `octopus://spaces/${encodedSpace}/projects/${encodedProjectId}/featuretoggles/${encodedSlug}`,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const findFeatureTogglesSchema = z.object({
|
|
40
|
+
spaceName: z.string().describe("Space name."),
|
|
41
|
+
projectId: z
|
|
42
|
+
.string()
|
|
43
|
+
.describe("Project ID (e.g. Projects-123). Feature toggles are scoped per project."),
|
|
44
|
+
partialName: z
|
|
45
|
+
.string()
|
|
46
|
+
.optional()
|
|
47
|
+
.describe("Case-insensitive substring match on the toggle name."),
|
|
48
|
+
tags: z
|
|
49
|
+
.array(z.string())
|
|
50
|
+
.optional()
|
|
51
|
+
.describe('Filter by canonical tag names (e.g. "release-rings/beta"). Repeats: a toggle matches if it has any of these tags.'),
|
|
52
|
+
environmentIds: z
|
|
53
|
+
.array(z.string())
|
|
54
|
+
.optional()
|
|
55
|
+
.describe("Filter by environment IDs (e.g. Environments-7). A toggle matches if it has configuration for any of these environments."),
|
|
56
|
+
skip: z
|
|
57
|
+
.number()
|
|
58
|
+
.int()
|
|
59
|
+
.min(0)
|
|
60
|
+
.optional()
|
|
61
|
+
.describe("Pagination offset (≥ 0)."),
|
|
62
|
+
take: z
|
|
63
|
+
.number()
|
|
64
|
+
.int()
|
|
65
|
+
.min(1)
|
|
66
|
+
.max(100)
|
|
67
|
+
.optional()
|
|
68
|
+
.describe("Pagination page size (1–100, server-side cap)."),
|
|
69
|
+
});
|
|
70
|
+
export async function findFeatureTogglesHandler(params) {
|
|
71
|
+
const { spaceName, projectId, partialName, tags, environmentIds, skip, take } = params;
|
|
72
|
+
const client = await Client.create(getClientConfigurationFromEnvironment());
|
|
73
|
+
let spaceId;
|
|
74
|
+
try {
|
|
75
|
+
spaceId = await resolveSpaceId(client, spaceName);
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
handleOctopusApiError(error, { spaceName });
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
const response = await client.get("~/api/{spaceId}/projects/{projectId}/featuretoggles{?Skip,Take,PartialName,Tags,Environments}", {
|
|
82
|
+
spaceId,
|
|
83
|
+
projectId,
|
|
84
|
+
Skip: skip,
|
|
85
|
+
Take: take,
|
|
86
|
+
PartialName: partialName,
|
|
87
|
+
Tags: tags,
|
|
88
|
+
Environments: environmentIds,
|
|
89
|
+
});
|
|
90
|
+
return {
|
|
91
|
+
content: [
|
|
92
|
+
{
|
|
93
|
+
type: "text",
|
|
94
|
+
text: JSON.stringify({
|
|
95
|
+
totalResults: response.TotalResults,
|
|
96
|
+
itemsPerPage: response.ItemsPerPage,
|
|
97
|
+
numberOfPages: response.NumberOfPages,
|
|
98
|
+
lastPageNumber: response.LastPageNumber,
|
|
99
|
+
items: (response.Items ?? []).map((toggle) => toggleSummary(toggle, spaceName)),
|
|
100
|
+
}),
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
// 404 at this layer is ambiguous: either feature toggles are disabled on
|
|
107
|
+
// the instance (per the API contract — every route returns 404 when the
|
|
108
|
+
// capability is off), or the projectId is wrong. The space itself was
|
|
109
|
+
// already resolved successfully above. Surface the disabled-capability
|
|
110
|
+
// hint rather than the generic "Space not found" message.
|
|
111
|
+
if (isErrorWithMessage(error, "not found") || isErrorWithMessage(error, "404")) {
|
|
112
|
+
throw new Error(`Feature toggles endpoint returned 404 for project '${projectId}' in space '${spaceName}'. ` +
|
|
113
|
+
"Either the customer feature toggles capability is disabled on this Octopus instance, or the projectId is incorrect. " +
|
|
114
|
+
"Use list_projects to verify the project ID.");
|
|
115
|
+
}
|
|
116
|
+
handleOctopusApiError(error, { spaceName });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
export function registerFindFeatureTogglesTool(server) {
|
|
120
|
+
server.registerTool("find_feature_toggles", {
|
|
121
|
+
title: "Find feature toggles",
|
|
122
|
+
description: `List customer feature toggles in an Octopus Deploy project.
|
|
123
|
+
|
|
124
|
+
Each summary includes per-environment state (isEnabled, rolloutPercentage, clientRolloutPercentage) so "where is X turned on" is answerable from the list response. Heavy fields (description, tenant lists, segments, minimum versions) live in the resource body.
|
|
125
|
+
|
|
126
|
+
Dereference the returned resourceUri (octopus://spaces/{spaceName}/projects/{projectId}/featuretoggles/{slug}) for the full toggle body.
|
|
127
|
+
|
|
128
|
+
Use update_feature_toggle to flip an environment on/off or change rollout percentages on an existing toggle. This MCP server does not expose toggle creation, deletion, renaming, or rollout-group management — direct customers to the Octopus UI for those.`,
|
|
129
|
+
inputSchema: findFeatureTogglesSchema.shape,
|
|
130
|
+
annotations: READ_ONLY_TOOL_ANNOTATIONS,
|
|
131
|
+
}, findFeatureTogglesHandler);
|
|
132
|
+
}
|
|
133
|
+
registerToolDefinition({
|
|
134
|
+
toolName: "find_feature_toggles",
|
|
135
|
+
config: { toolset: "featureToggles", readOnly: true },
|
|
136
|
+
registerFn: registerFindFeatureTogglesTool,
|
|
137
|
+
minimumOctopusVersion: "2026.1.10655",
|
|
138
|
+
});
|
|
139
|
+
//# sourceMappingURL=findFeatureToggles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findFeatureToggles.js","sourceRoot":"","sources":["../../src/tools/findFeatureToggles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { type McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
interface InterruptionFormElement {
|
|
3
|
+
Name: string;
|
|
4
|
+
Control?: {
|
|
5
|
+
Type?: string;
|
|
6
|
+
} | null;
|
|
7
|
+
IsValueRequired?: boolean;
|
|
8
|
+
}
|
|
9
|
+
interface InterruptionResource {
|
|
10
|
+
Id: string;
|
|
11
|
+
Title: string;
|
|
12
|
+
Type?: string;
|
|
13
|
+
Created: string;
|
|
14
|
+
IsPending: boolean;
|
|
15
|
+
Form?: {
|
|
16
|
+
Values?: Record<string, unknown> | null;
|
|
17
|
+
Elements?: InterruptionFormElement[] | null;
|
|
18
|
+
} | null;
|
|
19
|
+
RelatedDocumentIds?: string[];
|
|
20
|
+
ResponsibleTeamIds?: string[];
|
|
21
|
+
ResponsibleUserId?: string;
|
|
22
|
+
CanTakeResponsibility: boolean;
|
|
23
|
+
HasResponsibility: boolean;
|
|
24
|
+
IsLinkedToOtherInterruption?: boolean;
|
|
25
|
+
TaskId: string;
|
|
26
|
+
CorrelationId?: string;
|
|
27
|
+
SpaceId: string;
|
|
28
|
+
}
|
|
29
|
+
export declare function interruptionSummary(interruption: InterruptionResource, spaceName: string, instanceURL: string): {
|
|
30
|
+
id: string;
|
|
31
|
+
title: string;
|
|
32
|
+
type: string | undefined;
|
|
33
|
+
taskId: string;
|
|
34
|
+
correlationId: string | undefined;
|
|
35
|
+
isPending: boolean;
|
|
36
|
+
isLinkedToOtherInterruption: boolean | undefined;
|
|
37
|
+
created: string;
|
|
38
|
+
relatedDocumentIds: string[];
|
|
39
|
+
responsible: {
|
|
40
|
+
teamIds: string[];
|
|
41
|
+
userId: string | undefined;
|
|
42
|
+
canTakeResponsibility: boolean;
|
|
43
|
+
hasResponsibility: boolean;
|
|
44
|
+
};
|
|
45
|
+
formElementNames: string[];
|
|
46
|
+
resourceUri: string;
|
|
47
|
+
taskResourceUri: string;
|
|
48
|
+
publicUrl: string;
|
|
49
|
+
publicUrlInstruction: string;
|
|
50
|
+
};
|
|
51
|
+
export interface FindInterruptionsParams {
|
|
52
|
+
spaceName: string;
|
|
53
|
+
interruptionId?: string;
|
|
54
|
+
pendingOnly?: boolean;
|
|
55
|
+
assignedToMe?: boolean;
|
|
56
|
+
regarding?: string;
|
|
57
|
+
skip?: number;
|
|
58
|
+
take?: number;
|
|
59
|
+
}
|
|
60
|
+
export declare function findInterruptionsHandler(params: FindInterruptionsParams): Promise<{
|
|
61
|
+
content: {
|
|
62
|
+
type: "text";
|
|
63
|
+
text: string;
|
|
64
|
+
}[];
|
|
65
|
+
}>;
|
|
66
|
+
/**
|
|
67
|
+
* Page through the unfiltered /interruptions result set, collecting items
|
|
68
|
+
* the authenticated user can act on. Octopus has no responsibleUserId query
|
|
69
|
+
* parameter, so post-filtering is the only correctness-preserving option.
|
|
70
|
+
*
|
|
71
|
+
* Safety cap: ASSIGNED_SCAN_MAX records inspected. Almost always hit only
|
|
72
|
+
* with pendingOnly: false on busy spaces with deep history; the assigned
|
|
73
|
+
* set under pendingOnly: true is virtually always small.
|
|
74
|
+
*/
|
|
75
|
+
export declare const ASSIGNED_SCAN_PAGE_SIZE = 100;
|
|
76
|
+
export declare const ASSIGNED_SCAN_MAX = 500;
|
|
77
|
+
export declare function registerFindInterruptionsTool(server: McpServer): void;
|
|
78
|
+
export {};
|
|
79
|
+
//# sourceMappingURL=findInterruptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findInterruptions.d.ts","sourceRoot":"","sources":["../../src/tools/findInterruptions.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWzE,UAAU,uBAAuB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACnC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,UAAU,oBAAoB;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;QACxC,QAAQ,CAAC,EAAE,uBAAuB,EAAE,GAAG,IAAI,CAAC;KAC7C,GAAG,IAAI,CAAC;IACT,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,oBAAoB,EAClC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;EAkCpB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA4DD,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,uBAAuB;;;;;GA6I7E;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,iBAAiB,MAAM,CAAC;AA2DrC,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,QAyB9D"}
|