Skip to main content
Glama
localstack

LocalStack MCP Server

Official
by localstack

localstack-cloud-pods

Save, load, delete, or reset LocalStack Cloud Pods to manage AWS development environment states for consistent testing and deployment workflows.

Instructions

Manages LocalStack Cloud Pods with following actions: save, load, delete, reset

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
actionYesThe Cloud Pods action to perform.
pod_nameNoThe name of the Cloud Pod. This is required for 'save', 'load', and 'delete' actions.

Implementation Reference

  • The main asynchronous handler function for the 'localstack-cloud-pods' tool. It performs preflight checks, initializes CloudPodsApiClient, and dispatches to action-specific logic (save, load, delete, reset) with appropriate error handling and responses.
    export default async function localstackCloudPods({
      action,
      pod_name,
    }: InferSchema<typeof schema>) {
      const preflightError = await runPreflights([
        requireLocalStackCli(),
        requireProFeature(ProFeature.CLOUD_PODS),
      ]);
      if (preflightError) return preflightError;
    
      const client = new CloudPodsApiClient();
    
      switch (action) {
        case "save": {
          if (!pod_name || pod_name.trim() === "") {
            return ResponseBuilder.error(
              "Missing Required Parameter",
              "The `save` action requires the `pod_name` parameter to be specified."
            );
          }
    
          const result = await client.savePod(pod_name);
          if (!result.success) {
            if (result.statusCode === 409) {
              return ResponseBuilder.error(
                "Cloud Pods Error",
                `A Cloud Pod named '**${pod_name}**' already exists. Please choose a different name or delete the existing pod first.`
              );
            }
            return ResponseBuilder.error("Cloud Pods Error", result.message);
          }
    
          return ResponseBuilder.success(`Cloud Pod '**${pod_name}**' was saved successfully.`);
        }
    
        case "load": {
          if (!pod_name || pod_name.trim() === "") {
            return ResponseBuilder.error(
              "Missing Required Parameter",
              "The `load` action requires the `pod_name` parameter to be specified."
            );
          }
    
          const result = await client.loadPod(pod_name);
          if (!result.success) {
            if (result.statusCode === 404) {
              return ResponseBuilder.error(
                "Cloud Pods Error",
                `A Cloud Pod named '**${pod_name}**' could not be found.`
              );
            }
            return ResponseBuilder.error("Cloud Pods Error", result.message);
          }
    
          return ResponseBuilder.success(
            `Cloud Pod '**${pod_name}**' was loaded. Your LocalStack instance has been restored to this snapshot.`
          );
        }
    
        case "delete": {
          if (!pod_name || pod_name.trim() === "") {
            return ResponseBuilder.error(
              "Missing Required Parameter",
              "The `delete` action requires the `pod_name` parameter to be specified."
            );
          }
    
          const result = await client.deletePod(pod_name);
          if (!result.success) {
            if (result.statusCode === 404) {
              return ResponseBuilder.error(
                "Cloud Pods Error",
                `A Cloud Pod named '**${pod_name}**' could not be found.`
              );
            }
            return ResponseBuilder.error("Cloud Pods Error", result.message);
          }
    
          return ResponseBuilder.success(`Cloud Pod '**${pod_name}**' has been permanently deleted.`);
        }
    
        case "reset": {
          const result = await client.resetState();
          if (!result.success) {
            return ResponseBuilder.error("Cloud Pods Error", result.message);
          }
    
          return ResponseBuilder.markdown(
            "⚠️ LocalStack state has been reset successfully. **All unsaved state has been permanently lost.**"
          );
        }
    
        default:
          return ResponseBuilder.error("Unknown action", `Unsupported action: ${action}`);
      }
    }
  • Zod schema defining the input parameters for the tool: 'action' (required enum: save/load/delete/reset) and optional 'pod_name' (validated string).
    export const schema = {
      action: z.enum(["save", "load", "delete", "reset"]).describe("The Cloud Pods action to perform."),
    
      pod_name: z
        .string()
        .refine((v) => v.trim().length > 0, {
          message: "pod_name must not be empty or whitespace",
        })
        .refine((v) => /^[A-Za-z0-9._-]{1,128}$/.test(v), {
          message:
            "pod_name may only contain letters, numbers, '.', '_' or '-' and be at most 128 characters",
        })
        .optional()
        .describe(
          "The name of the Cloud Pod. This is required for 'save', 'load', and 'delete' actions."
        ),
    };
  • Tool metadata export defining the tool name 'localstack-cloud-pods', description, and annotations for registration in the MCP tools system.
    export const metadata: ToolMetadata = {
      name: "localstack-cloud-pods",
      description: "Manages LocalStack Cloud Pods with following actions: save, load, delete, reset",
      annotations: {
        title: "LocalStack Cloud Pods",
        readOnlyHint: false,
        destructiveHint: true,
        idempotentHint: false,
      },
    };
  • Supporting CloudPodsApiClient class used by the handler for API calls to manage cloud pods. (Note: approximate lines; actual class definition within the file.)
    import { httpClient, HttpError } from "../../core/http-client";
    
    export type ApiResult<T> =
      | { success: true; data: T }
      | { success: false; message: string; statusCode?: number };
    
    // Chaos API Client
    export class ChaosApiClient {
      private async makeRequest(
        endpoint: string,
        method: "GET" | "POST" | "PATCH" | "DELETE",
        body?: any
      ): Promise<ApiResult<any>> {
        try {
          const data = await httpClient.request<any>(`/_localstack/chaos${endpoint}`, {
            method,
            headers: { "Content-Type": "application/json" },
            body: body ? JSON.stringify(body) : undefined,
          });
          return { success: true, data };
        } catch (error) {
          if (error instanceof HttpError) {
            return {
              success: false,
              message: `❌ **Error:** The LocalStack Chaos API returned an error (Status ${error.status}):\n\`\`\`\n${error.body}\n\`\`\``,

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/localstack/localstack-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server