azure-devops-mcp
by RyanCardin15
Verified
- src
- Services
import { AzureDevOpsConfig } from "../Interfaces/AzureDevOps";
import { AzureDevOpsService } from "./AzureDevOpsService";
import {
ListArtifactFeedsParams,
GetPackageVersionsParams,
PublishPackageParams,
PromotePackageParams,
DeletePackageVersionParams,
ListContainerImagesParams,
GetContainerImageTagsParams,
ScanContainerImageParams,
ManageContainerPoliciesParams,
ManageUniversalPackagesParams,
CreatePackageDownloadReportParams,
CheckPackageDependenciesParams
} from "../Interfaces/ArtifactManagement";
export class ArtifactManagementService extends AzureDevOpsService {
constructor(config: AzureDevOpsConfig) {
super(config);
}
async listArtifactFeeds(params: ListArtifactFeedsParams) {
// This would contain actual implementation
// For now, we're returning a mock response
const feedType = params.feedType || 'all';
return {
feeds: [
{
id: "feed-npm-1",
name: "npm-packages",
description: "NPM packages for the organization",
type: "npm",
visibility: "organization",
url: "https://feeds.dev.azure.com/organization/project/_packaging/npm-packages/npm",
createdDate: new Date(Date.now() - 90 * 24 * 60 * 60 * 1000).toISOString()
},
{
id: "feed-nuget-1",
name: "nuget-packages",
description: "NuGet packages for .NET projects",
type: "nuget",
visibility: "project",
url: "https://feeds.dev.azure.com/organization/project/_packaging/nuget-packages/nuget",
createdDate: new Date(Date.now() - 60 * 24 * 60 * 60 * 1000).toISOString()
},
{
id: "feed-universal-1",
name: "universal-packages",
description: "Universal packages for deployments",
type: "universal",
visibility: "organization",
url: "https://feeds.dev.azure.com/organization/project/_packaging/universal-packages/universal",
createdDate: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString()
}
].filter(feed => feedType === 'all' || feed.type === feedType),
count: 3,
includeDeleted: params.includeDeleted || false
};
}
async getPackageVersions(params: GetPackageVersionsParams) {
const versions = [
{
version: "1.0.0",
publishedDate: new Date(Date.now() - 90 * 24 * 60 * 60 * 1000).toISOString(),
views: ["release", "prerelease"],
downloadsCount: 1250,
isLatest: false
},
{
version: "1.1.0",
publishedDate: new Date(Date.now() - 60 * 24 * 60 * 60 * 1000).toISOString(),
views: ["release", "prerelease"],
downloadsCount: 945,
isLatest: false
},
{
version: "1.2.0",
publishedDate: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString(),
views: ["release", "prerelease"],
downloadsCount: 1587,
isLatest: true
}
];
return {
feedId: params.feedId,
packageName: params.packageName,
totalVersions: versions.length,
versions: params.top ? versions.slice(0, params.top) : versions
};
}
async publishPackage(params: PublishPackageParams) {
return {
feedId: params.feedId,
packageType: params.packageType,
packageName: params.packagePath.split('/').pop()?.split('.')[0] || 'unknown',
packageVersion: params.packageVersion || '1.0.0',
publishDate: new Date().toISOString(),
status: "published",
packageUrl: `https://feeds.dev.azure.com/organization/project/_packaging/${params.feedId}/npm/registry/${params.packagePath.split('/').pop()?.split('.')[0]}/v/${params.packageVersion || '1.0.0'}`
};
}
async promotePackage(params: PromotePackageParams) {
return {
feedId: params.feedId,
packageName: params.packageName,
packageVersion: params.packageVersion,
sourceView: params.sourceView,
targetView: params.targetView,
promotionDate: new Date().toISOString(),
status: "promoted",
promotedBy: "user@example.com"
};
}
async deletePackageVersion(params: DeletePackageVersionParams) {
return {
feedId: params.feedId,
packageName: params.packageName,
packageVersion: params.packageVersion,
deletionDate: new Date().toISOString(),
permanent: params.permanent || false,
status: "deleted",
deletedBy: "user@example.com"
};
}
async listContainerImages(params: ListContainerImagesParams) {
return {
repositoryName: params.repositoryName || "all",
images: [
{
name: "api-service",
tags: ["latest", "v1.0.0", "v1.1.0"],
size: "256MB",
lastUpdated: new Date(Date.now() - 15 * 24 * 60 * 60 * 1000).toISOString(),
pullCount: 1250,
manifest: params.includeManifests ? {
schemaVersion: 2,
mediaType: "application/vnd.docker.distribution.manifest.v2+json",
layers: [
{ digest: "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4", size: 32456234 }
]
} : undefined
},
{
name: "web-frontend",
tags: ["latest", "v2.0.0", "v2.1.0", "v2.2.0"],
size: "124MB",
lastUpdated: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(),
pullCount: 2189,
manifest: params.includeManifests ? {
schemaVersion: 2,
mediaType: "application/vnd.docker.distribution.manifest.v2+json",
layers: [
{ digest: "sha256:b3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d5", size: 24567890 }
]
} : undefined
}
],
count: 2,
includeDeleted: params.includeDeleted || false
};
}
async getContainerImageTags(params: GetContainerImageTagsParams) {
const tags = [
{
tag: "latest",
createdDate: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(),
size: "256MB",
digest: "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4",
pullCount: 523
},
{
tag: "v1.0.0",
createdDate: new Date(Date.now() - 90 * 24 * 60 * 60 * 1000).toISOString(),
size: "245MB",
digest: "sha256:b3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d5",
pullCount: 412
},
{
tag: "v1.1.0",
createdDate: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString(),
size: "255MB",
digest: "sha256:c3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d6",
pullCount: 315
}
];
return {
repositoryName: params.repositoryName,
imageName: params.imageName,
totalTags: tags.length,
tags: params.top ? tags.slice(0, params.top) : tags
};
}
async scanContainerImage(params: ScanContainerImageParams) {
return {
repositoryName: params.repositoryName,
imageTag: params.imageTag,
scanType: params.scanType || "both",
scanDate: new Date().toISOString(),
vulnerabilities: params.scanType === "compliance" ? [] : [
{
id: "CVE-2023-1234",
severity: "high",
description: "Vulnerability in base image affecting OpenSSL",
package: "openssl",
installedVersion: "1.1.1k",
fixedVersion: "1.1.1l",
remediation: "Update to latest base image"
},
{
id: "CVE-2023-5678",
severity: "medium",
description: "Vulnerability in package manager",
package: "apt",
installedVersion: "2.2.4",
fixedVersion: "2.2.5",
remediation: "Run apt-get update && apt-get upgrade"
}
],
complianceIssues: params.scanType === "vulnerability" ? [] : [
{
id: "COMP-1",
severity: "high",
description: "Root user used for application execution",
standard: "CIS Docker Benchmark 4.1",
remediation: "Use non-root user in Dockerfile"
},
{
id: "COMP-2",
severity: "medium",
description: "No healthcheck defined",
standard: "CIS Docker Benchmark 4.6",
remediation: "Add HEALTHCHECK instruction to Dockerfile"
}
],
overallRisk: "high",
scanStatus: "completed"
};
}
async manageContainerPolicies(params: ManageContainerPoliciesParams) {
let policyDetails;
if (params.policyType === "retention") {
policyDetails = {
daysToKeep: 90,
maxImagesPerRepository: 50,
keepLatestImage: true
};
} else if (params.policyType === "security") {
policyDetails = {
blockHighVulnerabilities: true,
requireVulnerabilityScan: true,
complianceStandards: ["CIS", "NIST"]
};
} else {
policyDetails = {
allowedUsers: ["project-admins", "project-contributors"],
allowAnonymousPull: false,
requireAuthentication: true
};
}
return {
repositoryName: params.repositoryName,
policyType: params.policyType,
action: params.action,
status: "success",
appliedDate: new Date().toISOString(),
appliedBy: "user@example.com",
policySettings: params.action === "get" ? policyDetails : (params.policySettings || policyDetails)
};
}
async manageUniversalPackages(params: ManageUniversalPackagesParams) {
return {
packageName: params.packageName,
action: params.action,
packageVersion: params.packageVersion || "1.0.0",
status: "success",
timestamp: new Date().toISOString(),
size: "45MB",
packagePath: params.packagePath || `/path/to/${params.packageName}_${params.packageVersion || '1.0.0'}.zip`,
packageUrl: `https://feeds.dev.azure.com/organization/_packaging/universal-packages/universal/download/${params.packageName}/${params.packageVersion || '1.0.0'}`
};
}
async createPackageDownloadReport(params: CreatePackageDownloadReportParams) {
return {
feedId: params.feedId || "all-feeds",
packageName: params.packageName || "all-packages",
timeRange: params.timeRange || "30d",
format: params.format || "csv",
reportDate: new Date().toISOString(),
totalDownloads: 5782,
reportUrl: `https://dev.azure.com/organization/project/_apis/packaging/reports/${params.feedId || 'all'}-${Date.now()}.${params.format || 'csv'}`,
packages: [
{
name: "core-library",
version: "3.2.1",
downloads: 2345,
lastDownloaded: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString()
},
{
name: "ui-components",
version: "2.0.0",
downloads: 1897,
lastDownloaded: new Date(Date.now() - 5 * 24 * 60 * 60 * 1000).toISOString()
},
{
name: "data-access",
version: "1.5.0",
downloads: 1540,
lastDownloaded: new Date(Date.now() - 1 * 24 * 60 * 60 * 1000).toISOString()
}
],
topConsumers: [
{ name: "API Project", downloads: 1250 },
{ name: "Frontend Project", downloads: 986 },
{ name: "Mobile App", downloads: 754 }
]
};
}
async checkPackageDependencies(params: CheckPackageDependenciesParams) {
return {
packageName: params.packageName,
packageVersion: params.packageVersion || "latest",
directDependencies: [
{ name: "lodash", version: "4.17.21", isVulnerable: false },
{ name: "axios", version: "0.21.1", isVulnerable: true }
],
transitiveDependencies: params.includeTransitive ? [
{ name: "follow-redirects", version: "1.14.1", isVulnerable: true, parentPackage: "axios" },
{ name: "debug", version: "4.3.2", isVulnerable: false, parentPackage: "axios" }
] : [],
vulnerabilities: params.checkVulnerabilities ? [
{
id: "CVE-2021-3749",
packageName: "axios",
severity: "medium",
description: "Server-Side Request Forgery vulnerability",
fixedVersion: "0.21.2",
references: ["https://nvd.nist.gov/vuln/detail/CVE-2021-3749"]
},
{
id: "CVE-2021-26500",
packageName: "follow-redirects",
severity: "high",
description: "Memory consumption DoS vulnerability",
fixedVersion: "1.14.2",
references: ["https://nvd.nist.gov/vuln/detail/CVE-2021-26500"]
}
] : [],
summary: {
totalDependencies: params.includeTransitive ? 4 : 2,
vulnerableDependencies: params.checkVulnerabilities ? 2 : 0,
riskLevel: params.checkVulnerabilities ? "medium" : "unknown"
}
};
}
}