Skip to main content
Glama
concavegit

App Store Connect MCP Server

by concavegit

get_beta_feedback_screenshot

Retrieve beta feedback screenshots from App Store Connect to analyze tester submissions. Download images and access associated build or tester details for review.

Instructions

Get detailed information about a specific beta feedback screenshot submission. By default, downloads and returns the screenshot image.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
feedbackIdYesThe ID of the beta feedback screenshot submission
includeBuildsNoInclude build information in response (optional)
includeTestersNoInclude tester information in response (optional)
downloadScreenshotNoDownload and return the screenshot as an image (default: true)

Implementation Reference

  • The handler function that executes the tool: fetches beta feedback screenshot data from App Store Connect API and optionally downloads/embeds the image as base64.
    async getBetaFeedbackScreenshot(args: { 
      feedbackId: string;
      includeBuilds?: boolean;
      includeTesters?: boolean;
      downloadScreenshot?: boolean;
    }): Promise<BetaFeedbackScreenshotSubmissionResponse | any> {
      const { feedbackId, includeBuilds = false, includeTesters = false, downloadScreenshot = true } = args;
      
      if (!feedbackId) {
        throw new Error('feedbackId is required');
      }
    
      const params: Record<string, any> = {};
    
      // Add includes if requested
      const includes: string[] = [];
      if (includeBuilds) includes.push('build');
      if (includeTesters) includes.push('tester');
      if (includes.length > 0) {
        params.include = includes.join(',');
      }
    
      // Add field selections
      params['fields[betaFeedbackScreenshotSubmissions]'] = 'createdDate,comment,email,deviceModel,osVersion,locale,timeZone,architecture,connectionType,pairedAppleWatch,appUptimeInMilliseconds,diskBytesAvailable,diskBytesTotal,batteryPercentage,screenWidthInPoints,screenHeightInPoints,appPlatform,devicePlatform,deviceFamily,buildBundleId,screenshots,build,tester';
    
      const response = await this.client.get<BetaFeedbackScreenshotSubmissionResponse>(
        `/betaFeedbackScreenshotSubmissions/${feedbackId}`, 
        params
      );
    
      // If downloadScreenshot is true, download and include the screenshot as base64
      const screenshots = response.data.attributes?.screenshots;
      if (downloadScreenshot && screenshots && screenshots.length > 0) {
        try {
          const screenshot = screenshots[0];
          console.error(`Downloading screenshot from: ${screenshot.url.substring(0, 100)}...`);
          const axios = (await import('axios')).default;
          
          const imageResponse = await axios.get(screenshot.url, {
            responseType: 'arraybuffer',
            timeout: 10000, // 10 second timeout
            maxContentLength: 5 * 1024 * 1024, // 5MB max
            headers: {
              'User-Agent': 'App-Store-Connect-MCP-Server/1.0'
            }
          });
    
          // Convert to base64
          const base64Data = Buffer.from(imageResponse.data).toString('base64');
          const mimeType = imageResponse.headers['content-type'] || 'image/jpeg';
    
          // Return response with both data and image content
          return {
            toolResult: response,
            content: [
              {
                type: "text",
                text: `Beta feedback screenshot (${screenshot.width}x${screenshot.height}) - ${response.data.attributes.comment || 'No comment'}`
              },
              {
                type: "image",
                data: base64Data,
                mimeType: mimeType
              }
            ]
          };
        } catch (error: any) {
          // If download fails, just return the normal response
          console.error('Failed to download screenshot:', error.message);
          return response;
        }
      }
    
      return response;
    }
  • JSON schema definition for the tool inputs in the tools list response.
    {
      name: "get_beta_feedback_screenshot",
      description: "Get detailed information about a specific beta feedback screenshot submission. By default, downloads and returns the screenshot image.",
      inputSchema: {
        type: "object",
        properties: {
          feedbackId: {
            type: "string",
            description: "The ID of the beta feedback screenshot submission"
          },
          includeBuilds: {
            type: "boolean",
            description: "Include build information in response (optional)",
            default: false
          },
          includeTesters: {
            type: "boolean",
            description: "Include tester information in response (optional)",
            default: false
          },
          downloadScreenshot: {
            type: "boolean",
            description: "Download and return the screenshot as an image (default: true)",
            default: true
          }
        },
        required: ["feedbackId"]
      }
    },
  • src/index.ts:1338-1345 (registration)
    Dispatch in CallToolRequestHandler switch statement that calls the handler method for this tool.
    case "get_beta_feedback_screenshot":
      const result = await this.betaHandlers.getBetaFeedbackScreenshot(args as any);
      // If the result already contains content (image), return it directly
      if (result.content) {
        return result;
      }
      // Otherwise format as text
      return formatResponse(result);

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/concavegit/app-store-connect-mcp-server'

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