Skip to main content
Glama
concavegit

App Store Connect MCP Server

by concavegit

list_devices

Retrieve registered iOS and macOS devices for your App Store Connect team, with options to filter, sort, and limit results for efficient device management.

Instructions

Get a list of all devices registered to your team

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of devices to return (default: 100, max: 200)
sortNoSort order for the results
filterNo
fieldsNo

Implementation Reference

  • The main handler function that implements the list_devices tool logic. It constructs query parameters from input args and calls the App Store Connect API endpoint '/devices'.
    async listDevices(args: {
      limit?: number;
      sort?: DeviceSortOptions;
      filter?: DeviceFilters;
      fields?: {
        devices?: DeviceFieldOptions[];
      };
    } = {}): Promise<ListDevicesResponse> {
      const { limit = 100, sort, filter, fields } = args;
      
      const params: Record<string, any> = {
        limit: sanitizeLimit(limit)
      };
    
      if (sort) {
        params.sort = sort;
      }
    
      Object.assign(params, buildFilterParams(filter));
      Object.assign(params, buildFieldParams(fields));
    
      return this.client.get<ListDevicesResponse>('/devices', params);
    }
  • TypeScript interfaces and types defining the input parameters (filters, sort, fields) and output response structure (ListDevicesResponse) for the list_devices tool.
    export type DevicePlatform = "IOS" | "MAC_OS";
    export type DeviceStatus = "ENABLED" | "DISABLED";
    export type DeviceClass = "APPLE_WATCH" | "IPAD" | "IPHONE" | "IPOD" | "APPLE_TV" | "MAC";
    
    export interface Device {
      id: string;
      type: string;
      attributes: {
        name: string;
        platform: DevicePlatform;
        udid: string;
        deviceClass: DeviceClass;
        status: DeviceStatus;
        model?: string;
        addedDate?: string;
      };
    }
    
    export interface ListDevicesResponse {
      data: Device[];
    }
    
    export interface DeviceFilters {
      name?: string;
      platform?: DevicePlatform;
      status?: DeviceStatus;
      udid?: string;
      deviceClass?: DeviceClass;
    }
    
    export type DeviceSortOptions = 
      | "name" | "-name"
      | "platform" | "-platform"
      | "status" | "-status"
      | "udid" | "-udid"
      | "deviceClass" | "-deviceClass"
      | "model" | "-model"
      | "addedDate" | "-addedDate";
    
    export type DeviceFieldOptions = 
      | "name"
      | "platform"
      | "udid"
      | "deviceClass"
      | "status"
      | "model"
      | "addedDate";
  • The DeviceHandlers class constructor that receives the AppStoreConnectClient instance, used to instantiate the handler.
    import { sanitizeLimit, buildFilterParams, buildFieldParams } from '../utils/index.js';
    
    export class DeviceHandlers {

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden for behavioral disclosure, but it only states the purpose. It does not mention idempotency, side effects, authorization requirements, rate limits, or pagination behavior, which is critical for a read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, concise and front-loaded. It is efficient but slightly too minimal; a bit more context about output or filtering could improve without adding verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description should explain what the list contains (e.g., device objects with fields). It does not mention return structure, pagination defaults, or that filtering/sorting is available, making it incomplete for an agent to anticipate results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds no meaning beyond the input schema. The schema already provides descriptions for all parameters (sort, limit, fields, filter), and with 50% schema coverage context, the description fails to compensate for any gaps, offering no additional context or examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (Get) and the resource (a list of devices), with scope (registered to your team). It effectively distinguishes from sibling tools like list_apps or list_users, as it specifically targets devices.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. Sibling tools include other list operations, but the description does not differentiate or suggest appropriate contexts, leaving the agent without direction on tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.