Skip to main content
Glama
conorluddy

XC-MCP: XCode CLI wrapper

by conorluddy

Set Simulator Appearance/Locale

simctl-appearance
Idempotent

Adjust iOS simulator appearance—theme, dynamic type size, locale, and region—and relaunch apps to verify localized layouts.

Instructions

simctl-appearance

Control iOS simulator appearance: theme (light/dark), dynamic type size, locale, and region.

What it does

Wraps xcrun simctl ui and xcrun simctl spawn defaults write to let you switch appearance settings on a running simulator without leaving your terminal or MCP session.

Parameters

  • udid (string, optional): Simulator UDID. Auto-detects booted simulator if omitted.

  • theme ('light' | 'dark', optional): Switch light/dark appearance.

  • textSize (string, optional): Dynamic type size alias (XS–AX5, see table below).

  • locale (string, optional): BCP-47 language code (e.g. en, ar, de).

  • region (string, optional): ISO 3166-1 alpha-2 region code (e.g. US, SA). Requires locale.

  • bundleId (string, optional): App bundle ID — terminate + relaunch after locale change. Requires locale.

  • reset (boolean, optional): Reset theme, text size, and locale to system defaults (light / M / en_US). Incompatible with other flags.

Text Size Aliases

Alias

xcrun token

XS

extra-small

S

small

M

medium (default)

L

large

XL

extra-large

XXL

extra-extra-large

XXXL

extra-extra-extra-large

AX1

accessibility-medium

AX2

accessibility-large

AX3

accessibility-extra-large

AX4

accessibility-extra-extra-large

AX5

accessibility-extra-extra-extra-large

RTL Locales

Locales starting with ar, he, fa, ur, or yi are flagged as RTL. The response includes a [RTL layout] note and guidance to verify RTL support.

Returns

JSON response with:

  • success: overall operation success

  • udid: resolved simulator UDID

  • results: per-operation { success, message } objects (theme, textSize, locale, or reset)

  • guidance: next-step suggestions

Examples

Switch to dark mode

await simctlAppearanceTool({ theme: 'dark' })

Set large dynamic type

await simctlAppearanceTool({ textSize: 'AX3' })

Set Arabic locale (Saudi Arabia) and restart app

await simctlAppearanceTool({
  locale: 'ar',
  region: 'SA',
  bundleId: 'com.myapp.ios',
})

Combine theme and text size

await simctlAppearanceTool({ theme: 'dark', textSize: 'XL' })

Reset all appearance to defaults

await simctlAppearanceTool({ reset: true })

Validation Rules

  • At least one of theme, textSize, locale, or reset must be provided.

  • reset cannot be combined with theme, textSize, or locale.

  • region requires locale.

  • bundleId requires locale.

Important Notes

  • The simulator must be booted for commands to succeed.

  • Locale changes apply on the next cold app launch unless bundleId is provided.

  • Multiple operations can be combined in a single call (e.g., theme + textSize).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
udidNo
resetNo
themeNo
localeNo
regionNo
bundleIdNo
textSizeNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Addedv4.1.0

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (idempotent, non-destructive), the description explains important behaviors: it wraps specific xcrun commands, locale changes apply on the next cold launch unless bundleId is provided, reset is incompatible with other flags, and RTL locale detection triggers guidance. This gives the agent a complete picture of side effects and operational details.

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

Conciseness5/5

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

Though lengthy, the description is well-organized with clear headings, a parameter table, examples, and validation rules. Every section adds necessary information, and the structure makes it easy to scan for key details.

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

Completeness5/5

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

The description is comprehensive: it includes prerequisites, return format, validation rules, RTL behavior, examples, and important notes about cold app launches. With no output schema, the description fully compensates by detailing the JSON response structure, making the tool self-contained.

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

Parameters5/5

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

The input schema has zero descriptions, but the description covers every parameter with purpose, optionality, and constraints (e.g., region requires locale, reset incompatible). The text size alias table maps user-friendly values to xcrun tokens, fully compensating for the sparse schema.

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 tool's function: controlling iOS simulator appearance including theme, dynamic type size, locale, and region. It distinguishes itself from sibling simctl tools by scoping to appearance/locale and naming the underlying xcrun commands, leaving no ambiguity about what the tool does.

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

Usage Guidelines4/5

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

The description provides clear context for when to use the tool (for simulator appearance/locale changes) and notes the prerequisite that the simulator must be booted. However, it does not explicitly mention alternatives or exclusion cases, so it stops short of fully explicit usage guidance.

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