Skip to main content

ios-icon-mcp

CI PyPI Python

Organize an iPhone home screen from any MCP-compatible AI client. Move apps and web clips, create folders, rearrange pages, and inspect widget-aware text layouts with natural language.

No jailbreak, device supervision, or Apple Configurator is required.

中文版 README

Warning: This project uses private iOS APIs through pymobiledevice3. Compatibility can change with iOS updates. Use the preview and backup features before writing.

Features

  • Read apps, folders, web clips, and widgets, including localized names and bundle IDs.
  • Render pages as text grids using the device's reported rows and columns.
  • Edit a saved layout or make a direct change on the device.
  • Create folders, including folders with multiple pages.
  • Preview changes by default before applying a layout file.
  • Refuse unknown IDs, accidental app removal, over-capacity pages, and widget displacement.
  • Back up automatically before every write and verify the resulting layout and widgets.
  • Restore complete backups, with a preview and a fresh safety backup.

Requirements

  • macOS with its built-in usbmuxd.
  • One iPhone connected over USB, unlocked, and trusted by the Mac.
  • uv, which provides the uvx command.

The MCP server needs Python 3.10 or newer; uvx handles the Python environment and dependencies.

Install

Add this to your MCP client's configuration:

{
  "mcpServers": {
    "ios-icon": {
      "command": "uvx",
      "args": ["ios-icon-mcp"]
    }
  }
}

Restart the MCP client after changing its configuration. The first run downloads the package into an isolated environment.

To run directly from GitHub instead:

{
  "mcpServers": {
    "ios-icon": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/huangzheng2016/ios-icon-mcp",
        "ios-icon-mcp"
      ]
    }
  }
}

To upgrade the cached PyPI package, run uvx --refresh ios-icon-mcp or restart the client with that command once.

Quick start

Connect and unlock the iPhone, then ask your AI client:

  • “Show my home screen as a text grid.”
  • “Export every app with its name and bundle ID.”
  • “Save the current layout, put my music apps in a folder, and preview the change.”
  • “Move this app to page 2 without changing anything else.”

For a batch edit, the intended flow is:

  1. save_layout creates a workspace snapshot.
  2. move_icon, swap_icons, or create_folder edits that file.
  3. apply_icon_layout previews the complete diff by default.
  4. After reviewing the result, call it with dry_run=false to write.
  5. Check verified in the response. Backups are created automatically.

Direct *_on_device tools are intended for small changes and write immediately unless dry_run=true is supplied.

Layout format

A layout is a JSON array. Index 0 is the Dock; subsequent arrays are home screen pages. Strings are app bundle IDs or web clip URLs. A folder is an array whose first item is its name.

[
  ["com.apple.mobilephone", "com.apple.MobileSMS"],
  [
    "com.apple.mobilesafari",
    ["Social", "com.example.chat", "com.example.social"],
    ["Multi-page folder", ["com.example.one"], ["com.example.two"]]
  ]
]

The IDs above only illustrate the syntax. Use IDs from get_icon_layout or export_icon_detail for a real edit.

  • Flat folder form: ["Folder", "app.one", "app.two"].
  • Multi-page folder form: ["Folder", ["app.one"], ["app.two"]].
  • Widgets are deliberately omitted from this editable representation and merged from the current device state during writes.

Tools

Tool Purpose
device_info Read the connected device name, model, and iOS version
render_home_screen Render every page as a widget-aware text grid
get_icon_layout Read the editable Dock/page/folder representation
export_icon_detail Export names, IDs, versions, types, and estimated positions
get_widgets List widget sizes, owners, and estimated positions
save_layout / read_layout / list_layouts Save, inspect, and list workspace layouts
move_icon / swap_icons / create_folder Edit a workspace layout file
apply_icon_layout Preview or apply a complete layout; supports allow_remove
move_icon_on_device / swap_icons_on_device / create_folder_on_device Make a direct edit, with optional dry-run
list_backups / restore_backup List backups and preview or restore a complete state

apply_icon_layout defaults to dry_run=true. restore_backup also defaults to dry_run=true; a real restore requires dry_run=false.

Safety and limitations

  • No silent app loss. If a layout omits existing apps or web clips, writing is refused. For intentional removal from the home screen, set allow_remove=true. This never uninstalls the app.
  • No unknown IDs. Only apps and web clips already present in the current home screen state can be rearranged. Adding arbitrary items from App Library is not supported.
  • Widgets are protected, not editable. The server cannot create or configure widgets. A layout that would move a widget to another page or change its estimated grid position is refused. Keep the widget's page and the number of icons before it unchanged.
  • Capacity includes widgets. Limits come from the device rather than a hard-coded 4×6 grid. Validation also simulates widget occupancy.
  • Positions are estimates. Row and column values are inferred from icon order and widget sizes; they are not coordinates supplied by iOS.
  • Backups contain personal layout data. They stay in the local, Git-ignored workspace/ directory. Review files before sharing them.
  • One device at a time. Connect only the iPhone you intend to modify.

Development

git clone https://github.com/huangzheng2016/ios-icon-mcp.git
cd ios-icon-mcp
uv sync --locked
uv run python -m compileall -q server.py
uvx --from ruff==0.17.1 ruff check server.py
uv build
uvx twine check dist/*

CI runs offline checks across supported Python versions and builds the wheel and source distribution. GitHub releases are published to PyPI with Trusted Publishing (OIDC), without a stored PyPI password or long-lived API token.

License

MIT

Metadata

Release files for ios-icon-mcp 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ios-icon-mcp 1.0.0
File Size Uploaded Provenance
ios_icon_mcp-1.0.0.tar.gz 16.8 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for ios-icon-mcp 1.0.0
File Interpreter ABI Platform
ios_icon_mcp-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 31.1 kB

Release files / ios_icon_mcp-1.0.0.tar.gz

Download URL ios_icon_mcp-1.0.0.tar.gz
Size 16.8 kB
Tags Source
SHA-256 checksum
How to use checksums
2e1f8176164e07d3a3941e67f418dc9772c3fe5f977263985bcea123691160c1
BLAKE2b-256 checksum
How to use checksums
92ae1252e3fe741dbffb838b831830a9d5d87814bf3d2599149b20c9d9819e54
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.

Transparency log

Release files / ios_icon_mcp-1.0.0-py3-none-any.whl

Download URL ios_icon_mcp-1.0.0-py3-none-any.whl
Size 14.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
67d4713b32abda7c46d88e3c9411281aad012186d38f03d464f4eba8aa59e32f
BLAKE2b-256 checksum
How to use checksums
cb0dc9a0e20fc56eef2547af61fe5d6c0adef4141b230e14b0941429032e5e4e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.

Transparency log

Security for ios-icon-mcp 1.0.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for ios_icon_mcp-1.0.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page