ios-icon-mcp
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.
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
uvxcommand.
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:
save_layoutcreates a workspace snapshot.move_icon,swap_icons, orcreate_folderedits that file.apply_icon_layoutpreviews the complete diff by default.- After reviewing the result, call it with
dry_run=falseto write. - Check
verifiedin 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)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| ios_icon_mcp-1.0.0.tar.gz | 16.8 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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 logRelease 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 logSecurity 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.
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 logA 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.