@azure-devops/mcp 2.2.1-nightly.20251105 → 2.2.2

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.
@@ -0,0 +1,97 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+ import { ReleaseDefinitionExpands, ReleaseDefinitionQueryOrder, ReleaseExpands, ReleaseStatus, ReleaseQueryOrder } from "azure-devops-node-api/interfaces/ReleaseInterfaces.js";
4
+ import { z } from "zod";
5
+ import { getEnumKeys, safeEnumConvert } from "../utils.js";
6
+ const RELEASE_TOOLS = {
7
+ get_release_definitions: "release_get_definitions",
8
+ get_releases: "release_get_releases",
9
+ };
10
+ function configureReleaseTools(server, _, connectionProvider) {
11
+ server.tool(RELEASE_TOOLS.get_release_definitions, "Retrieves list of release definitions for a given project.", {
12
+ project: z.string().describe("Project ID or name to get release definitions for"),
13
+ searchText: z.string().optional().describe("Search text to filter release definitions"),
14
+ expand: z
15
+ .enum(getEnumKeys(ReleaseDefinitionExpands))
16
+ .default("None")
17
+ .describe("Expand options for release definitions"),
18
+ artifactType: z.string().optional().describe("Filter by artifact type"),
19
+ artifactSourceId: z.string().optional().describe("Filter by artifact source ID"),
20
+ top: z.number().optional().describe("Number of results to return (for pagination)"),
21
+ continuationToken: z.string().optional().describe("Continuation token for pagination"),
22
+ queryOrder: z
23
+ .enum(getEnumKeys(ReleaseDefinitionQueryOrder))
24
+ .default("NameAscending")
25
+ .describe("Order of the results"),
26
+ path: z.string().optional().describe("Path to filter release definitions"),
27
+ isExactNameMatch: z.boolean().optional().default(false).describe("Whether to match the exact name of the release definition. Default is false."),
28
+ tagFilter: z.array(z.string()).optional().describe("Filter by tags associated with the release definitions"),
29
+ propertyFilters: z.array(z.string()).optional().describe("Filter by properties associated with the release definitions"),
30
+ definitionIdFilter: z.array(z.string()).optional().describe("Filter by specific release definition IDs"),
31
+ isDeleted: z.boolean().default(false).describe("Whether to include deleted release definitions. Default is false."),
32
+ searchTextContainsFolderName: z.boolean().optional().describe("Whether to include folder names in the search text"),
33
+ }, async ({ project, searchText, expand, artifactType, artifactSourceId, top, continuationToken, queryOrder, path, isExactNameMatch, tagFilter, propertyFilters, definitionIdFilter, isDeleted, searchTextContainsFolderName, }) => {
34
+ const connection = await connectionProvider();
35
+ const releaseApi = await connection.getReleaseApi();
36
+ const releaseDefinitions = await releaseApi.getReleaseDefinitions(project, searchText, safeEnumConvert(ReleaseDefinitionExpands, expand), artifactType, artifactSourceId, top, continuationToken, safeEnumConvert(ReleaseDefinitionQueryOrder, queryOrder), path, isExactNameMatch, tagFilter, propertyFilters, definitionIdFilter, isDeleted, searchTextContainsFolderName);
37
+ return {
38
+ content: [{ type: "text", text: JSON.stringify(releaseDefinitions, null, 2) }],
39
+ };
40
+ });
41
+ server.tool(RELEASE_TOOLS.get_releases, "Retrieves a list of releases for a given project.", {
42
+ project: z.string().optional().describe("Project ID or name to get releases for"),
43
+ definitionId: z.number().optional().describe("ID of the release definition to filter releases"),
44
+ definitionEnvironmentId: z.number().optional().describe("ID of the definition environment to filter releases"),
45
+ searchText: z.string().optional().describe("Search text to filter releases"),
46
+ createdBy: z.string().optional().describe("User ID or name who created the release"),
47
+ statusFilter: z
48
+ .enum(getEnumKeys(ReleaseStatus))
49
+ .optional()
50
+ .default("Active")
51
+ .describe("Status of the releases to filter (default: Active)"),
52
+ environmentStatusFilter: z.number().optional().describe("Environment status to filter releases"),
53
+ minCreatedTime: z.coerce
54
+ .date()
55
+ .optional()
56
+ .default(() => {
57
+ const sevenDaysAgo = new Date();
58
+ sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);
59
+ return sevenDaysAgo;
60
+ })
61
+ .describe("Minimum created time for releases (default: 7 days ago)"),
62
+ maxCreatedTime: z.coerce
63
+ .date()
64
+ .optional()
65
+ .default(() => new Date())
66
+ .describe("Maximum created time for releases (default: now)"),
67
+ queryOrder: z
68
+ .enum(getEnumKeys(ReleaseQueryOrder))
69
+ .optional()
70
+ .default("Ascending")
71
+ .describe("Order in which to return releases (default: Ascending)"),
72
+ top: z.number().optional().describe("Number of releases to return"),
73
+ continuationToken: z.number().optional().describe("Continuation token for pagination"),
74
+ expand: z
75
+ .enum(getEnumKeys(ReleaseExpands))
76
+ .optional()
77
+ .default("None")
78
+ .describe("Expand options for releases"),
79
+ artifactTypeId: z.string().optional().describe("Filter releases by artifact type ID"),
80
+ sourceId: z.string().optional().describe("Filter releases by artifact source ID"),
81
+ artifactVersionId: z.string().optional().describe("Filter releases by artifact version ID"),
82
+ sourceBranchFilter: z.string().optional().describe("Filter releases by source branch"),
83
+ isDeleted: z.boolean().optional().default(false).describe("Whether to include deleted releases (default: false)"),
84
+ tagFilter: z.array(z.string()).optional().describe("Filter releases by tags"),
85
+ propertyFilters: z.array(z.string()).optional().describe("Filter releases by properties"),
86
+ releaseIdFilter: z.array(z.number()).optional().describe("Filter by specific release IDs"),
87
+ path: z.string().optional().describe("Path to filter releases"),
88
+ }, async ({ project, definitionId, definitionEnvironmentId, searchText, createdBy, statusFilter, environmentStatusFilter, minCreatedTime, maxCreatedTime, queryOrder, top, continuationToken, expand, artifactTypeId, sourceId, artifactVersionId, sourceBranchFilter, isDeleted, tagFilter, propertyFilters, releaseIdFilter, path, }) => {
89
+ const connection = await connectionProvider();
90
+ const releaseApi = await connection.getReleaseApi();
91
+ const releases = await releaseApi.getReleases(project, definitionId, definitionEnvironmentId, searchText, createdBy, safeEnumConvert(ReleaseStatus, statusFilter), environmentStatusFilter, minCreatedTime, maxCreatedTime, safeEnumConvert(ReleaseQueryOrder, queryOrder), top, continuationToken, safeEnumConvert(ReleaseExpands, expand), artifactTypeId, sourceId, artifactVersionId, sourceBranchFilter, isDeleted, tagFilter, propertyFilters, releaseIdFilter, path);
92
+ return {
93
+ content: [{ type: "text", text: JSON.stringify(releases, null, 2) }],
94
+ };
95
+ });
96
+ }
97
+ export { RELEASE_TOOLS, configureReleaseTools };