@edjl/gcloud-mcp
Version:
Google Cloud Platform tools for MCP (Model Context Protocol)
106 lines • 4.43 kB
JavaScript
import { z } from 'zod';
import { executeGCloudCommand } from '../../utils/gcloud.js';
const inputSchema = z.object({
resource: z.string().describe('Resource to get IAM policy for (e.g., project ID, bucket name, etc.)'),
resourceType: z.enum(['project', 'bucket', 'dataset', 'instance', 'topic', 'subscription', 'secret']).describe('Type of resource'),
filter: z.string().optional().describe('Filter expression for policy bindings'),
});
const gcloudIamPolicyGetTool = {
name: 'iam_policy_get',
description: 'Get IAM policy for a resource',
category: 'iam',
subcategory: 'policy',
version: '1.0.0',
inputSchema,
handler: async (input) => {
const params = inputSchema.parse(input);
let command = '';
switch (params.resourceType) {
case 'project':
command = `gcloud projects get-iam-policy "${params.resource}"`;
break;
case 'bucket':
command = `gcloud storage buckets get-iam-policy "gs://${params.resource}"`;
break;
case 'dataset':
command = `gcloud bigquery datasets get-iam-policy "${params.resource}"`;
break;
case 'instance':
command = `gcloud compute instances get-iam-policy "${params.resource}"`;
break;
case 'topic':
command = `gcloud pubsub topics get-iam-policy "${params.resource}"`;
break;
case 'subscription':
command = `gcloud pubsub subscriptions get-iam-policy "${params.resource}"`;
break;
case 'secret':
command = `gcloud secrets get-iam-policy "${params.resource}"`;
break;
}
if (params.filter) {
command += ` --filter="${params.filter}"`;
}
command += ' --format=json';
const result = await executeGCloudCommand(command);
if (result.exitCode !== 0) {
return {
content: [{
type: 'text',
text: `Error getting IAM policy: ${result.stderr}`
}],
isError: true
};
}
try {
const policy = JSON.parse(result.stdout);
if (!policy.bindings || policy.bindings.length === 0) {
return {
content: [{
type: 'text',
text: `No IAM policy bindings found for ${params.resourceType}: ${params.resource}`
}]
};
}
let output = `IAM Policy for ${params.resourceType}: ${params.resource}\n\n`;
output += `Version: ${policy.version || '1'}\n`;
output += `ETag: ${policy.etag || 'N/A'}\n\n`;
output += `Bindings (${policy.bindings.length}):\n\n`;
policy.bindings.forEach((binding, index) => {
output += `${index + 1}. Role: ${binding.role}\n`;
output += ` Members (${binding.members?.length || 0}):\n`;
if (binding.members && binding.members.length > 0) {
binding.members.forEach((member) => {
output += ` - ${member}\n`;
});
}
if (binding.condition) {
output += ` Condition:\n`;
output += ` Title: ${binding.condition.title || 'N/A'}\n`;
output += ` Expression: ${binding.condition.expression || 'N/A'}\n`;
if (binding.condition.description) {
output += ` Description: ${binding.condition.description}\n`;
}
}
output += '\n';
});
return {
content: [{
type: 'text',
text: output.trim()
}]
};
}
catch (error) {
return {
content: [{
type: 'text',
text: `Error parsing IAM policy data: ${error instanceof Error ? error.message : String(error)}`
}],
isError: true
};
}
}
};
export default gcloudIamPolicyGetTool;
//# sourceMappingURL=policy-get.js.map