@octopusdeploy/mcp-server 1.1.0 → 2.1.1
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 +202 -47
- 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 +3 -0
- package/dist/helpers/errorHandling.d.ts.map +1 -1
- package/dist/helpers/errorHandling.js +4 -1
- package/dist/helpers/errorHandling.js.map +1 -1
- package/dist/helpers/getClientConfigurationFromEnvironment.d.ts +2 -0
- package/dist/helpers/getClientConfigurationFromEnvironment.d.ts.map +1 -1
- package/dist/helpers/getClientConfigurationFromEnvironment.js +20 -4
- 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/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/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 +58 -9
- 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 +89 -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.map +1 -1
- package/dist/tools/createRelease.js +93 -50
- package/dist/tools/createRelease.js.map +1 -1
- package/dist/tools/deployRelease.d.ts.map +1 -1
- package/dist/tools/deployRelease.js +117 -97
- package/dist/tools/deployRelease.js.map +1 -1
- package/dist/tools/execute.d.ts +3 -0
- package/dist/tools/execute.d.ts.map +1 -0
- package/dist/tools/execute.js +262 -0
- package/dist/tools/execute.js.map +1 -0
- package/dist/tools/findAccounts.d.ts.map +1 -1
- package/dist/tools/findAccounts.js +15 -12
- package/dist/tools/findAccounts.js.map +1 -1
- package/dist/tools/findCertificates.d.ts.map +1 -1
- package/dist/tools/findCertificates.js +19 -16
- package/dist/tools/findCertificates.js.map +1 -1
- package/dist/tools/findDeploymentTargets.d.ts.map +1 -1
- package/dist/tools/findDeploymentTargets.js +26 -23
- package/dist/tools/findDeploymentTargets.js.map +1 -1
- 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.map +1 -1
- package/dist/tools/findReleases.js +90 -48
- package/dist/tools/findReleases.js.map +1 -1
- 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.map +1 -1
- package/dist/tools/findTenants.js +28 -25
- package/dist/tools/findTenants.js.map +1 -1
- package/dist/tools/getBranches.d.ts.map +1 -1
- package/dist/tools/getBranches.js +13 -10
- package/dist/tools/getBranches.js.map +1 -1
- package/dist/tools/getCurrentUser.d.ts.map +1 -1
- package/dist/tools/getCurrentUser.js +7 -4
- package/dist/tools/getCurrentUser.js.map +1 -1
- package/dist/tools/getDeploymentFromUrl.d.ts +8 -3
- package/dist/tools/getDeploymentFromUrl.d.ts.map +1 -1
- package/dist/tools/getDeploymentFromUrl.js +46 -18
- package/dist/tools/getDeploymentFromUrl.js.map +1 -1
- package/dist/tools/getDeploymentProcess.d.ts.map +1 -1
- package/dist/tools/getDeploymentProcess.js +26 -23
- package/dist/tools/getDeploymentProcess.js.map +1 -1
- package/dist/tools/getKubernetesLiveStatus.d.ts.map +1 -1
- package/dist/tools/getKubernetesLiveStatus.js +13 -10
- package/dist/tools/getKubernetesLiveStatus.js.map +1 -1
- package/dist/tools/getMissingTenantVariables.d.ts.map +1 -1
- package/dist/tools/getMissingTenantVariables.js +13 -10
- package/dist/tools/getMissingTenantVariables.js.map +1 -1
- package/dist/tools/getTaskFromUrl.d.ts +2 -3
- package/dist/tools/getTaskFromUrl.d.ts.map +1 -1
- package/dist/tools/getTaskFromUrl.js +33 -33
- package/dist/tools/getTaskFromUrl.js.map +1 -1
- package/dist/tools/getTenantVariables.d.ts.map +1 -1
- package/dist/tools/getTenantVariables.js +13 -10
- 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 +11 -5
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +21 -7
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/listDeployments.d.ts.map +1 -1
- package/dist/tools/listDeployments.js +22 -13
- package/dist/tools/listDeployments.js.map +1 -1
- package/dist/tools/listEnvironments.d.ts.map +1 -1
- package/dist/tools/listEnvironments.js +12 -9
- package/dist/tools/listEnvironments.js.map +1 -1
- package/dist/tools/listProjects.d.ts.map +1 -1
- package/dist/tools/listProjects.js +10 -7
- package/dist/tools/listProjects.js.map +1 -1
- package/dist/tools/listSpaces.d.ts.map +1 -1
- package/dist/tools/listSpaces.js +9 -6
- 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 +15 -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/package.json +4 -4
- package/dist/tools/getTaskById.d.ts +0 -9
- package/dist/tools/getTaskById.d.ts.map +0 -1
- package/dist/tools/getTaskById.js +0 -51
- 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 -65
- 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 -50
- package/dist/tools/getTaskRaw.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
|
@@ -0,0 +1,308 @@
|
|
|
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 { DESTRUCTIVE_WRITE_TOOL_ANNOTATIONS } from "../types/toolAnnotations.js";
|
|
7
|
+
import { handleOctopusApiError } from "../helpers/errorHandling.js";
|
|
8
|
+
import { requireConfirmation, unconfirmedResponse, } from "../helpers/requireConfirmation.js";
|
|
9
|
+
import {} from "../types/featureToggleTypes.js";
|
|
10
|
+
const environmentPatchSchema = z.object({
|
|
11
|
+
deploymentEnvironmentId: z
|
|
12
|
+
.string()
|
|
13
|
+
.describe("Targets the existing per-environment configuration to patch (e.g. Environments-7). Must already be configured on the toggle — this tool does not add new environment configurations."),
|
|
14
|
+
isEnabled: z
|
|
15
|
+
.boolean()
|
|
16
|
+
.optional()
|
|
17
|
+
.describe("Whether the toggle is on for this environment, before targeting/rollout is applied."),
|
|
18
|
+
rolloutPercentage: z
|
|
19
|
+
.number()
|
|
20
|
+
.int()
|
|
21
|
+
.min(0)
|
|
22
|
+
.max(100)
|
|
23
|
+
.optional()
|
|
24
|
+
.describe("Server-side rollout percentage [0, 100]."),
|
|
25
|
+
clientRolloutPercentage: z
|
|
26
|
+
.number()
|
|
27
|
+
.int()
|
|
28
|
+
.min(0)
|
|
29
|
+
.max(100)
|
|
30
|
+
.optional()
|
|
31
|
+
.describe("Client-side fractional rollout evaluated by the SDK [0, 100]."),
|
|
32
|
+
});
|
|
33
|
+
export const updateFeatureToggleSchema = z
|
|
34
|
+
.object({
|
|
35
|
+
spaceName: z.string().describe("Space name."),
|
|
36
|
+
projectId: z
|
|
37
|
+
.string()
|
|
38
|
+
.describe("Project ID (e.g. Projects-123). Feature toggles are scoped per project."),
|
|
39
|
+
slug: z
|
|
40
|
+
.string()
|
|
41
|
+
.describe("The toggle's Slug (not its Id). Find it via find_feature_toggles."),
|
|
42
|
+
defaultIsEnabled: z
|
|
43
|
+
.boolean()
|
|
44
|
+
.optional()
|
|
45
|
+
.describe("Toggle-level default. The value returned for environments that have no explicit per-environment configuration."),
|
|
46
|
+
description: z
|
|
47
|
+
.string()
|
|
48
|
+
.optional()
|
|
49
|
+
.describe("Toggle-level description (max 1000 chars). Markdown supported in the UI."),
|
|
50
|
+
environments: z
|
|
51
|
+
.array(environmentPatchSchema)
|
|
52
|
+
.optional()
|
|
53
|
+
.describe("Per-environment patches. Environments not listed here are preserved as-is. Each entry must reference a deploymentEnvironmentId that already exists on the toggle; unknown environments are rejected rather than silently added. Each environment may appear at most once in this array — duplicates are rejected."),
|
|
54
|
+
confirm: z
|
|
55
|
+
.boolean()
|
|
56
|
+
.optional()
|
|
57
|
+
.describe("Required only when the MCP client does not support elicitation. Set to true to confirm the update; otherwise the tool aborts."),
|
|
58
|
+
})
|
|
59
|
+
.superRefine((args, ctx) => {
|
|
60
|
+
// Reject duplicate deploymentEnvironmentIds up front. Without this,
|
|
61
|
+
// the merge picks the FIRST patch for the env while the confirmation
|
|
62
|
+
// diff overwrites earlier entries with later ones using the same key —
|
|
63
|
+
// the user could see one change in the prompt and a different one
|
|
64
|
+
// actually go through.
|
|
65
|
+
if (!args.environments)
|
|
66
|
+
return;
|
|
67
|
+
const seen = new Map();
|
|
68
|
+
for (let i = 0; i < args.environments.length; i++) {
|
|
69
|
+
const id = args.environments[i].deploymentEnvironmentId;
|
|
70
|
+
const prev = seen.get(id);
|
|
71
|
+
if (prev !== undefined) {
|
|
72
|
+
ctx.addIssue({
|
|
73
|
+
code: z.ZodIssueCode.custom,
|
|
74
|
+
message: `Duplicate environment entry for '${id}' at index ${i} (also at index ${prev}). ` +
|
|
75
|
+
"Combine the patches into a single entry per environment.",
|
|
76
|
+
path: ["environments", i, "deploymentEnvironmentId"],
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
seen.set(id, i);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
function applyEnvironmentPatch(current, patch) {
|
|
83
|
+
const merged = { ...current };
|
|
84
|
+
const changedFields = [];
|
|
85
|
+
if (patch.isEnabled !== undefined && patch.isEnabled !== current.IsEnabled) {
|
|
86
|
+
merged.IsEnabled = patch.isEnabled;
|
|
87
|
+
changedFields.push("IsEnabled");
|
|
88
|
+
}
|
|
89
|
+
if (patch.rolloutPercentage !== undefined &&
|
|
90
|
+
patch.rolloutPercentage !== current.RolloutPercentage) {
|
|
91
|
+
merged.RolloutPercentage = patch.rolloutPercentage;
|
|
92
|
+
changedFields.push("RolloutPercentage");
|
|
93
|
+
}
|
|
94
|
+
if (patch.clientRolloutPercentage !== undefined &&
|
|
95
|
+
patch.clientRolloutPercentage !== current.ClientRolloutPercentage) {
|
|
96
|
+
merged.ClientRolloutPercentage = patch.clientRolloutPercentage;
|
|
97
|
+
changedFields.push("ClientRolloutPercentage");
|
|
98
|
+
}
|
|
99
|
+
return { current, merged, changedFields };
|
|
100
|
+
}
|
|
101
|
+
function buildDiffSource(toggle, params, envPatches) {
|
|
102
|
+
const source = {};
|
|
103
|
+
if (params.defaultIsEnabled !== undefined) {
|
|
104
|
+
source.DefaultIsEnabled = toggle.DefaultIsEnabled;
|
|
105
|
+
}
|
|
106
|
+
if (params.description !== undefined) {
|
|
107
|
+
source.Description = toggle.Description ?? null;
|
|
108
|
+
}
|
|
109
|
+
for (const patch of envPatches) {
|
|
110
|
+
if (patch.changedFields.length === 0)
|
|
111
|
+
continue;
|
|
112
|
+
const sourceFields = {};
|
|
113
|
+
for (const field of patch.changedFields) {
|
|
114
|
+
sourceFields[field] =
|
|
115
|
+
patch.current[field];
|
|
116
|
+
}
|
|
117
|
+
source[`Environments[${patch.current.DeploymentEnvironmentId}]`] = sourceFields;
|
|
118
|
+
}
|
|
119
|
+
return source;
|
|
120
|
+
}
|
|
121
|
+
function buildDiffTarget(params, envPatches) {
|
|
122
|
+
const target = {};
|
|
123
|
+
if (params.defaultIsEnabled !== undefined) {
|
|
124
|
+
target.DefaultIsEnabled = params.defaultIsEnabled;
|
|
125
|
+
}
|
|
126
|
+
if (params.description !== undefined) {
|
|
127
|
+
target.Description = params.description;
|
|
128
|
+
}
|
|
129
|
+
for (const patch of envPatches) {
|
|
130
|
+
if (patch.changedFields.length === 0)
|
|
131
|
+
continue;
|
|
132
|
+
const targetFields = {};
|
|
133
|
+
for (const field of patch.changedFields) {
|
|
134
|
+
targetFields[field] =
|
|
135
|
+
patch.merged[field];
|
|
136
|
+
}
|
|
137
|
+
target[`Environments[${patch.current.DeploymentEnvironmentId}]`] = targetFields;
|
|
138
|
+
}
|
|
139
|
+
return target;
|
|
140
|
+
}
|
|
141
|
+
export async function updateFeatureToggleHandler(server, params) {
|
|
142
|
+
const { spaceName, projectId, slug, environments, confirm } = params;
|
|
143
|
+
const noPatches = params.defaultIsEnabled === undefined &&
|
|
144
|
+
params.description === undefined &&
|
|
145
|
+
(!environments || environments.length === 0);
|
|
146
|
+
if (noPatches) {
|
|
147
|
+
return {
|
|
148
|
+
content: [
|
|
149
|
+
{
|
|
150
|
+
type: "text",
|
|
151
|
+
text: JSON.stringify({
|
|
152
|
+
success: false,
|
|
153
|
+
reason: "no_patches",
|
|
154
|
+
message: "No fields supplied to update. Pass at least one of defaultIsEnabled, description, or environments[].",
|
|
155
|
+
}, null, 2),
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
isError: true,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
const client = await Client.create(getClientConfigurationFromEnvironment());
|
|
162
|
+
let spaceId;
|
|
163
|
+
try {
|
|
164
|
+
spaceId = await resolveSpaceId(client, spaceName);
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
handleOctopusApiError(error, { spaceName });
|
|
168
|
+
}
|
|
169
|
+
let current;
|
|
170
|
+
try {
|
|
171
|
+
current = await client.get("~/api/{spaceId}/projects/{projectId}/featuretoggles/{slug}", { spaceId, projectId, slug });
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
handleOctopusApiError(error, {
|
|
175
|
+
entityType: "feature toggle",
|
|
176
|
+
entityId: slug,
|
|
177
|
+
spaceName,
|
|
178
|
+
helpText: "Use find_feature_toggles to list valid slugs. If 404 persists across all toggles in the project, the customer feature toggles capability may be disabled on the Octopus instance.",
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
// Match patch entries to existing environment configurations. Unknown
|
|
182
|
+
// environments are rejected — the contract is "slight adjustment", not
|
|
183
|
+
// "configure new environments".
|
|
184
|
+
const envPatches = [];
|
|
185
|
+
if (environments) {
|
|
186
|
+
for (const patch of environments) {
|
|
187
|
+
const existing = current.Environments.find((e) => e.DeploymentEnvironmentId === patch.deploymentEnvironmentId);
|
|
188
|
+
if (!existing) {
|
|
189
|
+
const configured = current.Environments.map((e) => e.DeploymentEnvironmentId);
|
|
190
|
+
return {
|
|
191
|
+
content: [
|
|
192
|
+
{
|
|
193
|
+
type: "text",
|
|
194
|
+
text: JSON.stringify({
|
|
195
|
+
success: false,
|
|
196
|
+
reason: "environment_not_configured",
|
|
197
|
+
message: `Environment '${patch.deploymentEnvironmentId}' is not configured on toggle '${current.Slug}'. ` +
|
|
198
|
+
"This tool only adjusts existing environment configurations; it does not add new ones. " +
|
|
199
|
+
"Use the Octopus UI to add an environment to a toggle.",
|
|
200
|
+
configuredEnvironmentIds: configured,
|
|
201
|
+
}, null, 2),
|
|
202
|
+
},
|
|
203
|
+
],
|
|
204
|
+
isError: true,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
envPatches.push(applyEnvironmentPatch(existing, patch));
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// Detect a no-op call (everything provided already matches current state)
|
|
211
|
+
// before involving the user with a confirmation dialog.
|
|
212
|
+
const toggleLevelChanges = (params.defaultIsEnabled !== undefined &&
|
|
213
|
+
params.defaultIsEnabled !== current.DefaultIsEnabled) ||
|
|
214
|
+
(params.description !== undefined &&
|
|
215
|
+
params.description !== (current.Description ?? undefined));
|
|
216
|
+
const envLevelChanges = envPatches.some((p) => p.changedFields.length > 0);
|
|
217
|
+
if (!toggleLevelChanges && !envLevelChanges) {
|
|
218
|
+
return {
|
|
219
|
+
content: [
|
|
220
|
+
{
|
|
221
|
+
type: "text",
|
|
222
|
+
text: JSON.stringify({
|
|
223
|
+
success: true,
|
|
224
|
+
noOp: true,
|
|
225
|
+
message: "All supplied fields already match the current toggle state — nothing to update.",
|
|
226
|
+
slug: current.Slug,
|
|
227
|
+
}, null, 2),
|
|
228
|
+
},
|
|
229
|
+
],
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
const merged = {
|
|
233
|
+
...current,
|
|
234
|
+
DefaultIsEnabled: params.defaultIsEnabled !== undefined
|
|
235
|
+
? params.defaultIsEnabled
|
|
236
|
+
: current.DefaultIsEnabled,
|
|
237
|
+
Description: params.description !== undefined ? params.description : current.Description,
|
|
238
|
+
Environments: current.Environments.map((env) => {
|
|
239
|
+
const patch = envPatches.find((p) => p.current.DeploymentEnvironmentId === env.DeploymentEnvironmentId);
|
|
240
|
+
return patch ? patch.merged : env;
|
|
241
|
+
}),
|
|
242
|
+
};
|
|
243
|
+
const confirmation = await requireConfirmation(server, {
|
|
244
|
+
message: `Update feature toggle "${current.Name}" (${current.Slug}) in space ${spaceName}?`,
|
|
245
|
+
fallbackConfirm: confirm,
|
|
246
|
+
change: {
|
|
247
|
+
source: buildDiffSource(current, params, envPatches),
|
|
248
|
+
target: buildDiffTarget(params, envPatches),
|
|
249
|
+
},
|
|
250
|
+
});
|
|
251
|
+
if (!confirmation.confirmed) {
|
|
252
|
+
return unconfirmedResponse(confirmation, {
|
|
253
|
+
action: "feature toggle update",
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
try {
|
|
257
|
+
await client.doUpdate("~/api/{spaceId}/projects/{projectId}/featuretoggles", merged, { spaceId, projectId });
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
handleOctopusApiError(error, {
|
|
261
|
+
entityType: "feature toggle",
|
|
262
|
+
entityId: current.Id,
|
|
263
|
+
spaceName,
|
|
264
|
+
helpText: "Verify you have FeatureToggleEdit on the project and every environment referenced. Server-side validation rules (max segments, ephemeral environment clamping, etc.) are documented in the Octopus feature toggles API reference.",
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
const encodedSpace = encodeURIComponent(spaceName);
|
|
268
|
+
const encodedProjectId = encodeURIComponent(projectId);
|
|
269
|
+
const encodedSlug = encodeURIComponent(current.Slug);
|
|
270
|
+
const resourceUri = `octopus://spaces/${encodedSpace}/projects/${encodedProjectId}/featuretoggles/${encodedSlug}`;
|
|
271
|
+
return {
|
|
272
|
+
content: [
|
|
273
|
+
{
|
|
274
|
+
type: "text",
|
|
275
|
+
text: JSON.stringify({
|
|
276
|
+
success: true,
|
|
277
|
+
id: current.Id,
|
|
278
|
+
slug: current.Slug,
|
|
279
|
+
name: current.Name,
|
|
280
|
+
resourceUri,
|
|
281
|
+
message: `Feature toggle '${current.Slug}' updated successfully.`,
|
|
282
|
+
helpText: "Dereference resourceUri to read the updated toggle body.",
|
|
283
|
+
}, null, 2),
|
|
284
|
+
},
|
|
285
|
+
],
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
export function registerUpdateFeatureToggleTool(server) {
|
|
289
|
+
server.registerTool("update_feature_toggle", {
|
|
290
|
+
title: "Update a feature toggle",
|
|
291
|
+
description: `Adjust an existing customer feature toggle in an Octopus Deploy project.
|
|
292
|
+
|
|
293
|
+
Narrow surface — flip an environment on/off, change rollout percentages, or update the toggle-level description / default state. Internally fetches the current toggle, applies your patches in memory, and PUTs the merged body, so unmentioned environments and unmentioned fields are preserved.
|
|
294
|
+
|
|
295
|
+
Deliberately not exposed: name/slug rename, tag changes, rollout group attach/detach, tenant targeting, segments, minimum version, adding or removing environment configurations entirely. For those, use the Octopus UI.
|
|
296
|
+
|
|
297
|
+
Patches that reference an environment not already configured on the toggle are rejected with reason: environment_not_configured. The tool does not add new environment configurations.`,
|
|
298
|
+
inputSchema: updateFeatureToggleSchema,
|
|
299
|
+
annotations: DESTRUCTIVE_WRITE_TOOL_ANNOTATIONS,
|
|
300
|
+
}, (args) => updateFeatureToggleHandler(server, args));
|
|
301
|
+
}
|
|
302
|
+
registerToolDefinition({
|
|
303
|
+
toolName: "update_feature_toggle",
|
|
304
|
+
config: { toolset: "featureToggles", readOnly: false },
|
|
305
|
+
registerFn: registerUpdateFeatureToggleTool,
|
|
306
|
+
minimumOctopusVersion: "2026.1.10655",
|
|
307
|
+
});
|
|
308
|
+
//# sourceMappingURL=updateFeatureToggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateFeatureToggle.js","sourceRoot":"","sources":["../../src/tools/updateFeatureToggle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire-format types for the customer-facing Feature Toggles API.
|
|
3
|
+
*
|
|
4
|
+
* Octopus's @octopusdeploy/api-client (3.8.0) does not expose typed Repository
|
|
5
|
+
* classes or Resource interfaces for feature toggles, so we declare the minimum
|
|
6
|
+
* surface we touch here. Field names and casing match the JSON response from
|
|
7
|
+
* /api/{spaceId}/projects/{projectId}/featuretoggles{,/{slug}}.
|
|
8
|
+
*/
|
|
9
|
+
export interface FeatureToggleEnvironmentResource {
|
|
10
|
+
FeatureToggleId?: string;
|
|
11
|
+
DeploymentEnvironmentId: string;
|
|
12
|
+
IsEnabled: boolean;
|
|
13
|
+
RolloutPercentage?: number;
|
|
14
|
+
ClientRolloutPercentage?: number;
|
|
15
|
+
TenantIds?: string[];
|
|
16
|
+
ExcludedTenantIds?: string[];
|
|
17
|
+
TenantTags?: string[];
|
|
18
|
+
ExcludedTenantTags?: string[];
|
|
19
|
+
Segments?: Array<{
|
|
20
|
+
Key: string;
|
|
21
|
+
Value: string;
|
|
22
|
+
}>;
|
|
23
|
+
MinimumVersion?: string | null;
|
|
24
|
+
}
|
|
25
|
+
export interface FeatureToggleResource {
|
|
26
|
+
Id: string;
|
|
27
|
+
SpaceId: string;
|
|
28
|
+
ProjectId: string;
|
|
29
|
+
Name: string;
|
|
30
|
+
Slug: string;
|
|
31
|
+
DefaultIsEnabled: boolean;
|
|
32
|
+
Description?: string | null;
|
|
33
|
+
Environments: FeatureToggleEnvironmentResource[];
|
|
34
|
+
Tags: string[];
|
|
35
|
+
RolloutGroupId?: string | null;
|
|
36
|
+
}
|
|
37
|
+
export interface RolloutGroupResource {
|
|
38
|
+
Id: string;
|
|
39
|
+
SpaceId: string;
|
|
40
|
+
ProjectId: string;
|
|
41
|
+
Name: string;
|
|
42
|
+
FeatureToggleUsages: Array<{
|
|
43
|
+
Id: string;
|
|
44
|
+
Name: string;
|
|
45
|
+
}>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=featureToggleTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"featureToggleTypes.d.ts","sourceRoot":"","sources":["../../src/types/featureToggleTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,gCAAgC;IAC/C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uBAAuB,EAAE,MAAM,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,gCAAgC,EAAE,CAAC;IACjD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1D"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire-format types for the customer-facing Feature Toggles API.
|
|
3
|
+
*
|
|
4
|
+
* Octopus's @octopusdeploy/api-client (3.8.0) does not expose typed Repository
|
|
5
|
+
* classes or Resource interfaces for feature toggles, so we declare the minimum
|
|
6
|
+
* surface we touch here. Field names and casing match the JSON response from
|
|
7
|
+
* /api/{spaceId}/projects/{projectId}/featuretoggles{,/{slug}}.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=featureToggleTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"featureToggleTypes.js","sourceRoot":"","sources":["../../src/types/featureToggleTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type Toolset } from "./toolConfig.js";
|
|
2
|
+
export interface ResourcePayload {
|
|
3
|
+
mimeType: string;
|
|
4
|
+
text: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ResourceDescriptor {
|
|
7
|
+
name: string;
|
|
8
|
+
uriTemplate: string;
|
|
9
|
+
toolset: Toolset;
|
|
10
|
+
title: string;
|
|
11
|
+
description: string;
|
|
12
|
+
mimeType: string;
|
|
13
|
+
read: (vars: Record<string, string>) => Promise<ResourcePayload>;
|
|
14
|
+
}
|
|
15
|
+
export declare const RESOURCE_REGISTRY: ResourceDescriptor[];
|
|
16
|
+
export declare function registerResourceDescriptor(descriptor: ResourceDescriptor): void;
|
|
17
|
+
//# sourceMappingURL=resourceConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resourceConfig.d.ts","sourceRoot":"","sources":["../../src/types/resourceConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;CAClE;AAED,eAAO,MAAM,iBAAiB,EAAE,kBAAkB,EAAO,CAAC;AAE1D,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAE/E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resourceConfig.js","sourceRoot":"","sources":["../../src/types/resourceConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,iBAAiB,CAAC;AAiB/C,MAAM,CAAC,MAAM,iBAAiB,GAAyB,EAAE,CAAC;AAE1D,MAAM,UAAU,0BAA0B,CAAC,UAA8B;IACvE,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ToolAnnotations } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
/** Read-only Octopus query tool: list/find/get/grep/read_resource. */
|
|
3
|
+
export declare const READ_ONLY_TOOL_ANNOTATIONS: ToolAnnotations;
|
|
4
|
+
/** Write tool whose effect is purely additive — creates a new record, no overwrite. */
|
|
5
|
+
export declare const ADDITIVE_WRITE_TOOL_ANNOTATIONS: ToolAnnotations;
|
|
6
|
+
/** Write tool that may overwrite or otherwise mutate live state. */
|
|
7
|
+
export declare const DESTRUCTIVE_WRITE_TOOL_ANNOTATIONS: ToolAnnotations;
|
|
8
|
+
//# sourceMappingURL=toolAnnotations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolAnnotations.d.ts","sourceRoot":"","sources":["../../src/types/toolAnnotations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAQ1E,sEAAsE;AACtE,eAAO,MAAM,0BAA0B,EAAE,eAKxC,CAAC;AAEF,uFAAuF;AACvF,eAAO,MAAM,+BAA+B,EAAE,eAK7C,CAAC;AAEF,oEAAoE;AACpE,eAAO,MAAM,kCAAkC,EAAE,eAKhD,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import {} from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
// Every tool in this server hits a single user-configured Octopus instance with
|
|
3
|
+
// a fixed entity schema (releases, projects, environments, machines, tenants,
|
|
4
|
+
// ...). The SDK contrasts "web search" (open) with "memory tool" (closed); we
|
|
5
|
+
// fall on the closed side.
|
|
6
|
+
const CLOSED_WORLD = { openWorldHint: false };
|
|
7
|
+
/** Read-only Octopus query tool: list/find/get/grep/read_resource. */
|
|
8
|
+
export const READ_ONLY_TOOL_ANNOTATIONS = {
|
|
9
|
+
readOnlyHint: true,
|
|
10
|
+
destructiveHint: false,
|
|
11
|
+
idempotentHint: true,
|
|
12
|
+
...CLOSED_WORLD,
|
|
13
|
+
};
|
|
14
|
+
/** Write tool whose effect is purely additive — creates a new record, no overwrite. */
|
|
15
|
+
export const ADDITIVE_WRITE_TOOL_ANNOTATIONS = {
|
|
16
|
+
readOnlyHint: false,
|
|
17
|
+
destructiveHint: false,
|
|
18
|
+
idempotentHint: false,
|
|
19
|
+
...CLOSED_WORLD,
|
|
20
|
+
};
|
|
21
|
+
/** Write tool that may overwrite or otherwise mutate live state. */
|
|
22
|
+
export const DESTRUCTIVE_WRITE_TOOL_ANNOTATIONS = {
|
|
23
|
+
readOnlyHint: false,
|
|
24
|
+
destructiveHint: true,
|
|
25
|
+
idempotentHint: false,
|
|
26
|
+
...CLOSED_WORLD,
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=toolAnnotations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolAnnotations.js","sourceRoot":"","sources":["../../src/types/toolAnnotations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,MAAM,oCAAoC,CAAC;AAE1E,gFAAgF;AAChF,8EAA8E;AAC9E,8EAA8E;AAC9E,2BAA2B;AAC3B,MAAM,YAAY,GAAG,EAAE,aAAa,EAAE,KAAK,EAAW,CAAC;AAEvD,sEAAsE;AACtE,MAAM,CAAC,MAAM,0BAA0B,GAAoB;IACzD,YAAY,EAAE,IAAI;IAClB,eAAe,EAAE,KAAK;IACtB,cAAc,EAAE,IAAI;IACpB,GAAG,YAAY;CAChB,CAAC;AAEF,uFAAuF;AACvF,MAAM,CAAC,MAAM,+BAA+B,GAAoB;IAC9D,YAAY,EAAE,KAAK;IACnB,eAAe,EAAE,KAAK;IACtB,cAAc,EAAE,KAAK;IACrB,GAAG,YAAY;CAChB,CAAC;AAEF,oEAAoE;AACpE,MAAM,CAAC,MAAM,kCAAkC,GAAoB;IACjE,YAAY,EAAE,KAAK;IACnB,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,KAAK;IACrB,GAAG,YAAY;CAChB,CAAC"}
|
|
@@ -1,12 +1,26 @@
|
|
|
1
1
|
import { type McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
-
export type Toolset = "core" | "projects" | "deployments" | "releases" | "tasks" | "tenants" | "kubernetes" | "machines" | "context" | "certificates" | "accounts";
|
|
2
|
+
export type Toolset = "core" | "projects" | "deployments" | "releases" | "runbooks" | "tasks" | "tenants" | "kubernetes" | "machines" | "context" | "certificates" | "accounts" | "interruptions" | "featureToggles";
|
|
3
3
|
export interface ToolConfig {
|
|
4
4
|
toolset: Toolset;
|
|
5
5
|
readOnly: boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Tools whose actual read/write/delete tier is determined at runtime by
|
|
8
|
+
* tool arguments (typically the HTTP method passed in) rather than the
|
|
9
|
+
* static `readOnly` flag. Setting this to `true` bypasses the read-only
|
|
10
|
+
* registration filter — the tool must do its own tier gating in the
|
|
11
|
+
* handler. Currently set only on `execute`.
|
|
12
|
+
*/
|
|
13
|
+
methodGated?: boolean;
|
|
6
14
|
}
|
|
7
15
|
export interface ToolsetConfig {
|
|
8
16
|
enabledToolsets?: Toolset[] | "all";
|
|
9
17
|
readOnlyMode?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Permit DELETE-method requests through the `execute` backstop tool.
|
|
20
|
+
* Requires `readOnlyMode: false` to take effect — the read-only gate runs
|
|
21
|
+
* first. Default false (no DELETE allowed unless explicitly opted in).
|
|
22
|
+
*/
|
|
23
|
+
allowDeletes?: boolean;
|
|
10
24
|
}
|
|
11
25
|
export interface ToolRegistration {
|
|
12
26
|
toolName: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolConfig.d.ts","sourceRoot":"","sources":["../../src/types/toolConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,MAAM,MAAM,OAAO,GACf,MAAM,GACN,UAAU,GACV,aAAa,GACb,UAAU,GACV,OAAO,GACP,SAAS,GACT,YAAY,GACZ,UAAU,GACV,SAAS,GACT,cAAc,GACd,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"toolConfig.d.ts","sourceRoot":"","sources":["../../src/types/toolConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,MAAM,MAAM,OAAO,GACf,MAAM,GACN,UAAU,GACV,aAAa,GACb,UAAU,GACV,UAAU,GACV,OAAO,GACP,SAAS,GACT,YAAY,GACZ,UAAU,GACV,SAAS,GACT,cAAc,GACd,UAAU,GACV,eAAe,GACf,gBAAgB,CAAC;AAErB,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,eAAe,CAAC,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACpC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC;IACxC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,eAAO,MAAM,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAa,CAAC;AAEtE,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,gBAAgB,QAEpE;AAED,eAAO,MAAM,gBAAgB,EAAE,OAAO,EAerC,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;IAC/C,uBAAuB,EAAE,MAAM,CAAC;IAChC,0BAA0B,EAAE,MAAM,CAAC;IACnC,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAiBD,wBAAgB,mBAAmB,IAAI,eAAe,CA6BrD;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAmB/C"}
|
package/dist/types/toolConfig.js
CHANGED
|
@@ -8,13 +8,16 @@ export const DEFAULT_TOOLSETS = [
|
|
|
8
8
|
"projects",
|
|
9
9
|
"deployments",
|
|
10
10
|
"releases",
|
|
11
|
+
"runbooks",
|
|
11
12
|
"tasks",
|
|
12
13
|
"tenants",
|
|
13
14
|
"kubernetes",
|
|
14
15
|
"machines",
|
|
15
16
|
"context",
|
|
16
17
|
"certificates",
|
|
17
|
-
"accounts"
|
|
18
|
+
"accounts",
|
|
19
|
+
"interruptions",
|
|
20
|
+
"featureToggles"
|
|
18
21
|
];
|
|
19
22
|
function compareVersions(v1, v2) {
|
|
20
23
|
const parts1 = v1.split('.').map(Number);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolConfig.js","sourceRoot":"","sources":["../../src/types/toolConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"toolConfig.js","sourceRoot":"","sources":["../../src/types/toolConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { type ToolsetConfig, type Toolset } from "../types/toolConfig.js";
|
|
2
2
|
export declare function parseToolsets(toolsetsArg: string | undefined): Toolset[] | "all";
|
|
3
|
-
export declare function createToolsetConfig(toolsetsArg: string | undefined, readOnlyArg: boolean | undefined): ToolsetConfig;
|
|
3
|
+
export declare function createToolsetConfig(toolsetsArg: string | undefined, readOnlyArg: boolean | undefined, allowDeletesArg?: boolean | undefined): ToolsetConfig;
|
|
4
4
|
//# sourceMappingURL=parseConfig.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseConfig.d.ts","sourceRoot":"","sources":["../../src/utils/parseConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,OAAO,EAAoB,MAAM,wBAAwB,CAAC;AAE5F,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,EAAE,GAAG,KAAK,CAgBhF;AAED,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,WAAW,EAAE,OAAO,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"parseConfig.d.ts","sourceRoot":"","sources":["../../src/utils/parseConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,OAAO,EAAoB,MAAM,wBAAwB,CAAC;AAE5F,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,EAAE,GAAG,KAAK,CAgBhF;AAED,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,WAAW,EAAE,OAAO,GAAG,SAAS,EAChC,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,GACpC,aAAa,CAMf"}
|
|
@@ -12,10 +12,11 @@ export function parseToolsets(toolsetsArg) {
|
|
|
12
12
|
}
|
|
13
13
|
return toolsets;
|
|
14
14
|
}
|
|
15
|
-
export function createToolsetConfig(toolsetsArg, readOnlyArg) {
|
|
15
|
+
export function createToolsetConfig(toolsetsArg, readOnlyArg, allowDeletesArg) {
|
|
16
16
|
return {
|
|
17
17
|
enabledToolsets: parseToolsets(toolsetsArg),
|
|
18
|
-
readOnlyMode: readOnlyArg ??
|
|
18
|
+
readOnlyMode: readOnlyArg ?? false, // Default: writes enabled. Pass --read-only to gate them.
|
|
19
|
+
allowDeletes: allowDeletesArg ?? false, // Default deny all DELETEs
|
|
19
20
|
};
|
|
20
21
|
}
|
|
21
22
|
//# sourceMappingURL=parseConfig.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseConfig.js","sourceRoot":"","sources":["../../src/utils/parseConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE5F,MAAM,UAAU,aAAa,CAAC,WAA+B;IAC3D,IAAI,CAAC,WAAW,IAAI,WAAW,KAAK,KAAK,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAc,CAAC;IAExE,oBAAoB;IACpB,MAAM,aAAa,GAAG,gBAAgB,CAAC;IACvC,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzE,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,qBAAqB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,WAA+B,EAC/B,WAAgC;
|
|
1
|
+
{"version":3,"file":"parseConfig.js","sourceRoot":"","sources":["../../src/utils/parseConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE5F,MAAM,UAAU,aAAa,CAAC,WAA+B;IAC3D,IAAI,CAAC,WAAW,IAAI,WAAW,KAAK,KAAK,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAc,CAAC;IAExE,oBAAoB;IACpB,MAAM,aAAa,GAAG,gBAAgB,CAAC;IACvC,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzE,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,qBAAqB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,WAA+B,EAC/B,WAAgC,EAChC,eAAqC;IAErC,OAAO;QACL,eAAe,EAAE,aAAa,CAAC,WAAW,CAAC;QAC3C,YAAY,EAAE,WAAW,IAAI,KAAK,EAAE,0DAA0D;QAC9F,YAAY,EAAE,eAAe,IAAI,KAAK,EAAE,2BAA2B;KACpE,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"bugs": {
|
|
5
5
|
"url": "https://github.com/OctopusDeploy/mcp-server/issues"
|
|
6
6
|
},
|
|
7
|
-
"version": "1.1
|
|
7
|
+
"version": "2.1.1",
|
|
8
8
|
"type": "module",
|
|
9
9
|
"description": "The Octopus MCP Server provides your AI assistant with powerful tools that allow it to inspect, query, and diagnose problems within your Octopus instance.",
|
|
10
10
|
"main": "dist/index.js",
|
|
@@ -50,8 +50,8 @@
|
|
|
50
50
|
"devDependencies": {
|
|
51
51
|
"@eslint/js": "^9.35.0",
|
|
52
52
|
"@types/node": "^24.3.1",
|
|
53
|
-
"@vitest/coverage-v8": "^
|
|
54
|
-
"@vitest/ui": "^
|
|
53
|
+
"@vitest/coverage-v8": "^4.0.17",
|
|
54
|
+
"@vitest/ui": "^4.0.17",
|
|
55
55
|
"eslint": "^9.35.0",
|
|
56
56
|
"globals": "^16.3.0",
|
|
57
57
|
"jiti": "^2.5.1",
|
|
@@ -59,6 +59,6 @@
|
|
|
59
59
|
"shx": "^0.4.0",
|
|
60
60
|
"typescript": "^5.9.2",
|
|
61
61
|
"typescript-eslint": "^8.42.0",
|
|
62
|
-
"vitest": "^
|
|
62
|
+
"vitest": "^4.0.17"
|
|
63
63
|
}
|
|
64
64
|
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { Client } from '@octopusdeploy/api-client';
|
|
2
|
-
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
-
export interface GetTaskByIdParams {
|
|
4
|
-
spaceName: string;
|
|
5
|
-
taskId: string;
|
|
6
|
-
}
|
|
7
|
-
export declare function getTaskById(client: Client, params: GetTaskByIdParams): Promise<import("@octopusdeploy/api-client").ServerTask<any>>;
|
|
8
|
-
export declare function registerGetTaskByIdTool(server: McpServer): void;
|
|
9
|
-
//# sourceMappingURL=getTaskById.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getTaskById.d.ts","sourceRoot":"","sources":["../../src/tools/getTaskById.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA6B,MAAM,2BAA2B,CAAC;AAG9E,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,gEAQ1E;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,QAuCxD"}
|