create_instance
Create a new Compute Engine instance on Google Cloud Platform by specifying project ID, zone, instance name, machine type, source image, disk size, network, and optional external IP.
Instructions
Create a new Compute Engine instance.
Args:
project_id: The ID of the GCP project
zone: The zone to create the instance in (e.g., "us-central1-a")
instance_name: The name for the new instance
machine_type: The machine type (e.g., "e2-medium")
source_image: The source image for the boot disk (e.g., "projects/debian-cloud/global/images/family/debian-11")
boot_disk_size_gb: The size of the boot disk in GB (default: 10)
network: The network to connect to (default: "default")
subnet: The subnetwork to connect to (optional)
external_ip: Whether to allocate an external IP (default: True)
Returns:
Status message indicating whether the instance was created successfully
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| boot_disk_size_gb | No | ||
| external_ip | No | ||
| instance_name | Yes | ||
| machine_type | Yes | ||
| network | No | default | |
| project_id | Yes | ||
| source_image | Yes | ||
| subnet | No | ||
| zone | Yes |
Implementation Reference
- The @mcp.tool()-decorated function that implements the core logic for creating a GCP Compute Engine instance using the Google Cloud compute_v1 client. It configures disk, network, service account, and calls insert() to create the VM.@mcp.tool() def create_instance(project_id: str, zone: str, instance_name: str, machine_type: str, source_image: str, boot_disk_size_gb: int = 10, network: str = "default", subnet: str = "", external_ip: bool = True) -> str: """ Create a new Compute Engine instance. Args: project_id: The ID of the GCP project zone: The zone to create the instance in (e.g., "us-central1-a") instance_name: The name for the new instance machine_type: The machine type (e.g., "e2-medium") source_image: The source image for the boot disk (e.g., "projects/debian-cloud/global/images/family/debian-11") boot_disk_size_gb: The size of the boot disk in GB (default: 10) network: The network to connect to (default: "default") subnet: The subnetwork to connect to (optional) external_ip: Whether to allocate an external IP (default: True) Returns: Status message indicating whether the instance was created successfully """ try: from google.cloud import compute_v1 # Initialize the clients instances_client = compute_v1.InstancesClient() # Format the machine type machine_type_url = f"projects/{project_id}/zones/{zone}/machineTypes/{machine_type}" # Create the disk configuration boot_disk = compute_v1.AttachedDisk() boot_disk.boot = True initialize_params = compute_v1.AttachedDiskInitializeParams() initialize_params.source_image = source_image initialize_params.disk_size_gb = boot_disk_size_gb boot_disk.initialize_params = initialize_params boot_disk.auto_delete = True # Create the network configuration network_interface = compute_v1.NetworkInterface() if network.startswith("projects/"): network_interface.network = network else: network_interface.network = f"projects/{project_id}/global/networks/{network}" if subnet: if subnet.startswith("projects/"): network_interface.subnetwork = subnet else: network_interface.subnetwork = f"projects/{project_id}/regions/{zone.rsplit('-', 1)[0]}/subnetworks/{subnet}" if external_ip: access_config = compute_v1.AccessConfig() access_config.name = "External NAT" access_config.type_ = "ONE_TO_ONE_NAT" access_config.network_tier = "PREMIUM" network_interface.access_configs = [access_config] # Create the instance instance = compute_v1.Instance() instance.name = instance_name instance.machine_type = machine_type_url instance.disks = [boot_disk] instance.network_interfaces = [network_interface] # Create a default service account for the instance service_account = compute_v1.ServiceAccount() service_account.email = "default" service_account.scopes = ["https://www.googleapis.com/auth/cloud-platform"] instance.service_accounts = [service_account] # Create the instance operation = instances_client.insert( project=project_id, zone=zone, instance_resource=instance ) # Wait for the create operation to complete operation_client = compute_v1.ZoneOperationsClient() # This is a synchronous call that will wait until the operation is complete while operation.status != compute_v1.Operation.Status.DONE: operation = operation_client.get(project=project_id, zone=zone, operation=operation.name.split('/')[-1]) import time time.sleep(1) if operation.error: return f"Error creating instance {instance_name}: {operation.error.errors[0].message}" # Get the created instance to return its details created_instance = instances_client.get(project=project_id, zone=zone, instance=instance_name) # Get the instance IP addresses internal_ip = "None" external_ip = "None" if created_instance.network_interfaces: internal_ip = created_instance.network_interfaces[0].network_i_p or "None" if created_instance.network_interfaces[0].access_configs: external_ip = created_instance.network_interfaces[0].access_configs[0].nat_i_p or "None" return f""" Instance {instance_name} created successfully in zone {zone}. Details: - Machine Type: {machine_type} - Internal IP: {internal_ip} - External IP: {external_ip} - Status: {created_instance.status} """ except Exception as e: return f"Error creating instance: {str(e)}"
- src/gcp_mcp/gcp_modules/compute/tools.py:6-7 (registration)The register_tools function for the compute module defines and registers the create_instance tool (and others) via @mcp.tool() decorators inside it.def register_tools(mcp): """Register all compute tools with the MCP server."""
- src/gcp_mcp/server.py:39-39 (registration)Top-level registration in the MCP server that invokes the compute module's register_tools(mcp), thereby registering the create_instance tool.compute_tools.register_tools(mcp)