@edjl/gcloud-mcp
Version:
Google Cloud Platform tools for MCP (Model Context Protocol)
113 lines • 5.52 kB
JavaScript
import { z } from 'zod';
import { executeGCloudCommand, parseGCloudJson } from '../../utils/gcloud.js';
const inputSchema = z.object({
repository: z.string().describe('Name of the artifact repository'),
location: z.string().describe('Location of the repository (e.g., us-central1)'),
package: z.string().describe('Package/artifact name'),
project: z.string().optional().describe('GCP project ID (uses current project if not specified)'),
limit: z.number().optional().default(20).describe('Maximum number of versions to return'),
includePrerelease: z.boolean().optional().default(true).describe('Include pre-release versions')
});
const gcloudArtifactVersionsTool = {
name: 'artifact_versions',
description: 'List all versions of a specific artifact/package',
category: 'artifacts',
subcategory: 'versions',
version: '1.0.0',
inputSchema,
handler: async (input) => {
const params = inputSchema.parse(input);
let output = `Versions of '${params.package}' in '${params.repository}':\n`;
output += '='.repeat(60) + '\n\n';
// Try Docker tags first (for Docker repositories)
const dockerCommand = `gcloud artifacts docker tags list ${params.location}-docker.pkg.dev/${params.project || '$(gcloud config get-value project)'}/${params.repository}/${params.package} --format=json --limit=${params.limit}`;
const dockerResult = await executeGCloudCommand(dockerCommand);
if (dockerResult.exitCode === 0) {
const tags = parseGCloudJson(dockerResult.stdout);
if (!tags || tags.length === 0) {
return {
content: [{
type: 'text',
text: `No tags found for Docker image '${params.package}'`
}]
};
}
output += `Found ${tags.length} tag${tags.length !== 1 ? 's' : ''}:\n\n`;
// Sort by creation time (newest first)
tags.sort((a, b) => new Date(b.createTime).getTime() - new Date(a.createTime).getTime());
// Find latest stable version
const latestStable = tags.find(t => t.tag && !t.tag.includes('-') && t.tag !== 'latest');
const latestTag = tags.find(t => t.tag === 'latest');
if (latestTag) {
output += 'Latest Tag:\n';
output += ` latest -> ${latestTag.version.split('@')[1].substring(0, 12)}...\n`;
output += ` Created: ${new Date(latestTag.createTime).toLocaleString()}\n\n`;
}
if (latestStable) {
output += 'Latest Stable Version:\n';
output += ` ${latestStable.tag}\n`;
output += ` Created: ${new Date(latestStable.createTime).toLocaleString()}\n\n`;
}
output += 'All Tags:\n';
tags.forEach(tag => {
if (!params.includePrerelease && tag.tag && tag.tag.includes('-') && tag.tag !== 'latest') {
return; // Skip pre-release versions
}
output += ` ${tag.tag}\n`;
output += ` Digest: ${tag.version.split('@')[1].substring(0, 12)}...\n`;
output += ` Created: ${new Date(tag.createTime).toLocaleString()}\n`;
output += ` Full URI: ${tag.package}:${tag.tag}\n`;
output += '\n';
});
return {
content: [{
type: 'text',
text: output.trim()
}]
};
}
// If not Docker, try generic versions list
let versionsCommand = `gcloud artifacts versions list --package=${params.package} --repository=${params.repository} --location=${params.location} --format=json --limit=${params.limit}`;
if (params.project) {
versionsCommand += ` --project=${params.project}`;
}
const versionsResult = await executeGCloudCommand(versionsCommand);
if (versionsResult.exitCode !== 0) {
return {
content: [{
type: 'text',
text: `Error listing artifact versions: ${versionsResult.stderr}`
}],
isError: true
};
}
const versions = parseGCloudJson(versionsResult.stdout);
if (!versions || versions.length === 0) {
return {
content: [{
type: 'text',
text: `No versions found for package '${params.package}'`
}]
};
}
output += `Found ${versions.length} version${versions.length !== 1 ? 's' : ''}:\n\n`;
versions.forEach(version => {
const versionName = version.name.split('/').pop() || 'unknown';
output += `Version: ${versionName}\n`;
output += ` Created: ${new Date(version.createTime).toLocaleString()}\n`;
output += ` Updated: ${new Date(version.updateTime).toLocaleString()}\n`;
if (version.metadata) {
output += ` Metadata: ${JSON.stringify(version.metadata)}\n`;
}
output += '\n';
});
return {
content: [{
type: 'text',
text: output.trim()
}]
};
}
};
export default gcloudArtifactVersionsTool;
//# sourceMappingURL=artifact-versions.js.map