Skip to main content
Glama
Desmond-Labs

Supabase Storage MCP

by Desmond-Labs

create_signed_urls

Generate multiple secure download URLs for batch file access from Supabase Storage buckets with configurable expiration times.

Instructions

Generate multiple signed download URLs in a single request for batch operations

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
bucket_nameYesSource bucket
file_pathsYesArray of file paths to generate URLs for
expires_inNoURL expiration in seconds (default: 3600)

Implementation Reference

  • The primary handler function for the 'create_signed_urls' tool. It destructures arguments (bucket_name, file_paths, expires_in), performs input validation, iterates over each file_path to generate signed URLs via supabase.storage.createSignedUrl(), handles individual errors, tracks success/failure counts, audits the request, and returns a comprehensive batch result including per-file details and overall statistics.
    async function handleCreateSignedUrls(args: any, requestId: string, startTime: number) {
      const { bucket_name, file_paths, expires_in = 3600 } = args;
      
      const inputHash = generateSecureHash(JSON.stringify({ bucket_name, file_count: file_paths.length, expires_in }));
      
      try {
        // Input validation
        if (!bucket_name || typeof bucket_name !== 'string') {
          throw new Error('Invalid bucket_name parameter');
        }
        
        if (!Array.isArray(file_paths) || file_paths.length === 0) {
          throw new Error('file_paths must be a non-empty array');
        }
        
        if (file_paths.length > 100) {
          throw new Error('Cannot generate more than 100 URLs in a single request');
        }
        
        const results = [];
        let successCount = 0;
        let errorCount = 0;
        
        // Process each file path
        for (const filePath of file_paths) {
          try {
            const { data, error } = await supabase.storage
              .from(bucket_name)
              .createSignedUrl(filePath, expires_in);
            
            if (error) {
              results.push({
                file_path: filePath,
                signed_url: '',
                expires_at: '',
                success: false,
                error: error.message
              });
              errorCount++;
            } else {
              const expiresAt = new Date(Date.now() + expires_in * 1000).toISOString();
              results.push({
                file_path: filePath,
                signed_url: data.signedUrl,
                expires_at: expiresAt,
                success: true
              });
              successCount++;
            }
          } catch (error) {
            results.push({
              file_path: filePath,
              signed_url: '',
              expires_at: '',
              success: false,
              error: getErrorMessage(error)
            });
            errorCount++;
          }
        }
        
        const successRate = file_paths.length > 0 ? `${Math.round((successCount / file_paths.length) * 100)}%` : '0%';
        
        auditRequest('create_signed_urls', successCount > 0, inputHash);
        
        const result: SignedUrlBatchResult = {
          urls: results,
          total_files: file_paths.length,
          successful_urls: successCount,
          failed_urls: errorCount,
          success_rate: successRate,
          expires_in
        };
        
        return {
          content: [
            {
              type: 'text',
              text: JSON.stringify({
                ...result,
                request_id: requestId,
                processing_time: Date.now() - startTime
              }, null, 2)
            }
          ]
        };
      } catch (error) {
        auditRequest('create_signed_urls', false, inputHash, getErrorMessage(error));
        throw error;
      }
    }
  • Input schema definition for the create_signed_urls tool, specifying required bucket_name and file_paths array (1-100 items), optional expires_in (60s-7d, default 3600s), with length constraints and no additional properties.
    inputSchema: {
      type: 'object',
      properties: {
        bucket_name: {
          type: 'string',
          description: 'Source bucket',
          minLength: 3,
          maxLength: 63
        },
        file_paths: {
          type: 'array',
          description: 'Array of file paths to generate URLs for',
          items: {
            type: 'string',
            maxLength: 1024
          },
          minItems: 1,
          maxItems: 100
        },
        expires_in: {
          type: 'number',
          description: 'URL expiration in seconds (default: 3600)',
          minimum: 60,
          maximum: 604800,
          default: 3600
        }
      },
      required: ['bucket_name', 'file_paths'],
      additionalProperties: false
    }
  • src/index.ts:244-276 (registration)
    MCP tool registration block in the ListToolsRequestSchema handler, defining the tool's name, description, and inputSchema for discovery by MCP clients.
      name: 'create_signed_urls',
      description: 'Generate multiple signed download URLs in a single request for batch operations',
      inputSchema: {
        type: 'object',
        properties: {
          bucket_name: {
            type: 'string',
            description: 'Source bucket',
            minLength: 3,
            maxLength: 63
          },
          file_paths: {
            type: 'array',
            description: 'Array of file paths to generate URLs for',
            items: {
              type: 'string',
              maxLength: 1024
            },
            minItems: 1,
            maxItems: 100
          },
          expires_in: {
            type: 'number',
            description: 'URL expiration in seconds (default: 3600)',
            minimum: 60,
            maximum: 604800,
            default: 3600
          }
        },
        required: ['bucket_name', 'file_paths'],
        additionalProperties: false
      }
    },
  • src/index.ts:482-483 (registration)
    Dispatch case in the main CallToolRequestSchema switch statement that routes 'create_signed_urls' requests to the handleCreateSignedUrls handler function.
    case 'create_signed_urls':
      return await handleCreateSignedUrls(args, requestId, startTime);

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/Desmond-Labs/supabase-storage-mcp'

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