Apple Tools (Unified)
PYPI · APPLE-TOOLS-MCP · 2 COMPONENTS
Unified Apple ecosystem MCP server for macOS: Mail, Calendar, Notes, Files, Messages, and more.
Available components
Last scanned (21 hours ago)
Scores higher than 99% of PyPI servers
Category Productivity and Notes
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs setuptools.build_meta at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
- 1 of 39 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to JonathanRReed/Apple-MCPs). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 1 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability85
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (good).Pass
- Tool/resource definitions use about 16830 tokens (~82/item across 203 items; 184 tools + 19 resources), lean.Pass
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 14 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 186 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 22 Oct 26 +6
- Stability: pass → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Schema quality: 44 → 82 ▼ functional
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Tool coverage: 1% → 100% ▲ functional
- Schema quality: poor → good functional
- Package version: 1.1.2 → 1.1.3 functional
- 18 Oct 26 0
- Stability: 0.97 → pass security
- 17 Oct 26 +41
- Injection markers: unverified → pass ▲ security
- Stability: unverified → 0.97 ▲ functional
- Tool coverage: unverified → 100 ▲ functional
- MCP protocol: unverified → pass ▲ functional
- Schema quality: unverified → 100 ▲ functional
- Package version: 1.0.5 → 1.1.2 functional
- 16 Oct 26 0
- Package version: 1.0.5 → 1.1.2 functional
- 15 Oct 26 0
- Tool safety: Tool safety not yet verified: this server's registry entry declares environment variables (an API key or similar), and its server did not start in our sandbox, so we have no tool text to scan. security
- Stability: Stability not yet verified: this server's registry entry declares environment variables (an API key or similar), and its server did not start in our sandbox, so we have no schema to compare. security
- Tool coverage: Tool coverage not yet verified: this server's registry entry declares environment variables (an API key or similar), and its server did not start in our sandbox, so we have no tool definitions to assess. functional
- Capabilities: Protocol version not yet verified: this server's registry entry declares environment variables (an API key or similar), and its server did not start in our sandbox, so we never saw its MCP handshake. functional
- Schema quality: Schema quality not yet verified: this server's registry entry declares environment variables (an API key or similar), and its server did not start in our sandbox, so we have no schema to assess. functional
- 14 Oct 26 0
- Stability: Stability not yet verified: this server's registry entry declares environment variables (an API key or similar), and its server did not start in our sandbox, so we have no schema to compare. security
- Tool safety: Tool safety not yet verified: this server's registry entry declares environment variables (an API key or similar), and its server did not start in our sandbox, so we have no tool text to scan. security
- Schema quality: Schema quality not yet verified: this server's registry entry declares environment variables (an API key or similar), and its server did not start in our sandbox, so we have no schema to assess. functional
- Capabilities: Protocol version not yet verified: this server's registry entry declares environment variables (an API key or similar), and its server did not start in our sandbox, so we never saw its MCP handshake. functional
- Tool coverage: Tool coverage not yet verified: this server's registry entry declares environment variables (an API key or similar), and its server did not start in our sandbox, so we have no tool definitions to assess. functional
- Package version: 1.0.5 → 1.1.2 functional
- Package version: 1.0.5 → 1.1.1 functional
- 13 Oct 26 0
- Package version: 1.0.5 → 1.1.1 functional
- 12 Oct 26 −41
- Tool safety: pass → unverified ▼ security
- Stability: pass → unverified ▼ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Package version: 1.0.5 → 1.1.0 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 23 Oct 2026 · Analysed pypi/apple-tools-mcp@1.1.3
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | pypi |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | JonathanRReed/Apple-MCPs |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/JonathanRReed/Apple-MCPs/.github/workflows/release.yml@refs/tags/v1.1.3 |
| Rekor log index | 3371477963 |
| Predicate type | PyPI publish attestation https://docs.pypi.org/attestations/publish/v1 |
| Subject digest | sha256:855b038a07c665f7f7d1e5831e19e5244475e154f09059fa9837c11ec58db7c3 |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | setuptools.build_meta |
Background: Why install scripts are a supply-chain risk →
Dependencies 39 packages
| Packages resolved | 39 |
|---|---|
| No linked repository | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
apple_tag_file Apple Tag File ~100
Read, replace, add, or remove Finder tags on a file or folder through Apple Files.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | get reads tags; set replaces all tags; add adds tags; remove removes the listed tags. |
| path | string | yes | Absolute path, or a path starting with ~, inside the Apple Files allowed roots (see files_list_allowed_roots). |
| tags | – | – | Finder tag names. Required for set, add, and remove. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
apple_triage_communications_task Apple Triage Communications Task ~88
Generate a cross-app communications triage summary from unread Messages and Mail search results.
| Name | Type | Req | Description |
|---|---|---|---|
| conversation_limit | integer | – | Maximum number of recent Messages conversations to include (1 or more). |
| mail_limit | integer | – | Maximum number of Mail highlights to include (1 or more). |
| mail_query | string | – | Apple Mail search text for the highlights section; '*' matches recent messages. |
Structured output declared, but exposes no named fields.
No examples provided.
apple_undo_action Apple Undo Action ~53
Undo a recent Apple-Tools action when the underlying standalone MCPs support a reliable reversal.
| Name | Type | Req | Description |
|---|---|---|---|
| action_id | string | yes | action_id from apple_list_recent_actions. Only actions with undo_status available can be undone. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
apple_update_contact_preferences Apple Update Contact Preferences ~178
Persist preferred communication routing for a specific contact so Apple-Tools can choose the right channel and target for that person.
| Name | Type | Req | Description |
|---|---|---|---|
| clear_existing | boolean | – | Set true to discard this contact's saved routing before applying the new values. |
| contact_id | string | yes | Contacts contact_id from contacts_search_contacts or contacts_get_contact. |
| preferred_communication_channel | – | – | Channel to use for this person: auto, messages, or mail. Omit to keep the current value. |
| preferred_mail_address | – | – | Email address to use for this person. Pass an empty string to clear it. |
| preferred_message_channel | – | – | Messages address type for this person: auto, phone, or email. Omit to keep the current value. |
| preferred_message_target | – | – | Phone number or email address to message for this person. Pass an empty string to clear it. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
apple_update_preferences Apple Update Preferences ~398
Persist assistant defaults such as default lists, folders, calendars, archive mailboxes, and preferred communication routing.
| Name | Type | Req | Description |
|---|---|---|---|
| default_archive_account | – | – | Mail account that holds default_archive_mailbox. Omit to keep the current value. |
| default_archive_mailbox | – | – | Default mailbox that apple_archive_message moves messages into. Omit to keep the current value. |
| default_calendar_id | – | – | Default calendar_id from calendar_list_calendars. Omit to keep the current value. |
| default_calendar_name | – | – | Display name of the default calendar. Omit to keep the current value. |
| default_digest_account_name | – | – | Notes account that holds the digest folder. Omit to keep the current value. |
| default_digest_folder_id | – | – | Notes folder_id used for daily and weekly digests. Omit to keep the current value. |
| default_digest_folder_name | – | – | Display name of the digest folder. Omit to keep the current value. |
| default_mail_account | – | – | Default Mail account name used to send and search. Omit to keep the current value. |
| default_notes_account_name | – | – | Notes account that holds the default notes folder, for example iCloud. Omit to keep the current value. |
| default_notes_folder_id | – | – | Default folder_id from notes_list_folders. Omit to keep the current value. |
| default_notes_folder_name | – | – | Display name of the default notes folder. Omit to keep the current value. |
| default_reminder_list_id | – | – | Default list_id from reminders_list_lists. Omit to keep the current value. |
| default_reminder_list_name | – | – | Display name of the default reminder list. Omit to keep the current value. |
| preferred_communication_channel | – | – | Default channel for apple_send_communication: auto, messages, or mail. Omit to keep the current value. |
| preferred_message_channel | – | – | Preferred Messages address type: auto, phone, or email. Omit to keep the current value. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
apple_update_system_setting Apple Update System Setting ~103
Apply an assistant-relevant macOS setting through the unified Apple control plane.
| Name | Type | Req | Description |
|---|---|---|---|
| enabled | – | – | New on/off value. Required for every setting except appearance_mode. |
| mode | – | – | light or dark. Required for appearance_mode. |
| setting | string | yes | One of appearance_mode, show_all_extensions, show_hidden_files, finder_path_bar, finder_status_bar, dock_autohide, dock_show_recents, reduce_motion, increase_contrast, reduce_transparency. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
calendar_create_event Create Event ~398
Create a new event in a specific Apple Calendar calendar. Use the exact calendar_id returned by calendar_list_calendars. With native access, a unique calendar name resolves to its native calendar; duplicate names return AMBIGUOUS_CALENDAR. Optional alarms: list of {minutes_before: N} or {absolute_iso: ISO datetime}. Automation can add initial display alerts only when no inherited alerts need removal; full alarm editing requires native EventKit access.
| Name | Type | Req | Description |
|---|---|---|---|
| alarms | – | – | List of alarms, each exactly one of {minutes_before: whole minutes 0-525600} or {absolute_iso: ISO 8601 datetime with Z or an offset}; at most 100. Omit to set no explicit alarms. |
| all_day | boolean | – | True for an all-day event spanning the start and end dates. |
| calendar_id | string | yes | Select the calendar by name and source in calendar_list_calendars, then pass its calendar_id unchanged. Re-list after Calendar access changes to obtain native IDs when EventKit is available. |
| end_iso | string | yes | Event end; must be later than start_iso. ISO 8601 datetime such as 2026-10-22T09:00:00-05:00; without an offset the Mac's local time zone is used. |
| location | – | – | Free-text event location. |
| notes | – | – | Plain-text event notes. |
| recurrence | – | – | Repeat rule object: {frequency: daily|weekly|monthly|yearly, interval: N (default 1), end_date: optional ISO 8601 date}. Requires native EventKit access. Omit for a single event. |
| start_iso | string | yes | Event start. ISO 8601 datetime such as 2026-10-22T09:00:00-05:00; without an offset the Mac's local time zone is used. |
| title | string | yes | Event title shown in Calendar. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
calendar_delete_event Delete Event ~40
Delete a calendar event by event_id.
| Name | Type | Req | Description |
|---|---|---|---|
| event_id | string | yes | Event ID returned by calendar_list_events or calendar_get_event; pass it unchanged. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
calendar_get_event Get Event ~43
Fetch full details for a calendar event by event_id.
| Name | Type | Req | Description |
|---|---|---|---|
| event_id | string | yes | Event ID returned by calendar_list_events or calendar_get_event; pass it unchanged. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
calendar_health Calendar Health ~16
Report the active Apple Calendar server configuration.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| access_status | string | yes | – |
| alarm_edit_backend | string | – | – |
| can_edit_existing_alarms | boolean | – | – |
| can_read_events | boolean | yes | – |
| can_write_events | boolean | yes | – |
| capabilities | array | yes | – |
| helper_available | boolean | yes | – |
| helper_compiled | boolean | yes | – |
| ok | boolean | – | – |
| permission_client | – | – | – |
| permission_error | – | – | – |
| permission_suggestion | – | – | – |
| safety_mode | string | yes | – |
| safety_mode_warning | – | – | Set when the configured safety value was invalid or blank and the server fell back to a safer mode |
| server_name | string | yes | – |
| transport | string | – | – |
| version | string | yes | – |
| write_allowed_calendars | array | – | – |
No examples provided.
calendar_list_calendars List Calendars ~41
List available Apple Calendar calendars. Select by name and source, then pass the returned calendar_id unchanged. Re-list after Calendar access changes to refresh identifiers.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
calendar_list_events List Events ~211
List calendar events in a time window, optionally filtered to one calendar. Use calendar_id from calendar_list_calendars. Listing through native EventKit returns native event IDs for full alarm edits.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar_id | – | – | Select the calendar by name and source in calendar_list_calendars, then pass its calendar_id unchanged. Re-list after Calendar access changes to obtain native IDs when EventKit is available. |
| end_iso | string | yes | End of the time window; must be later than start_iso. ISO 8601 datetime such as 2026-10-22T09:00:00-05:00; without an offset the Mac's local time zone is used. |
| limit | – | – | Maximum number of events to return (1 or more). |
| start_iso | string | yes | Start of the time window. ISO 8601 datetime such as 2026-10-22T09:00:00-05:00; without an offset the Mac's local time zone is used. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
calendar_update_event Update Event ~522
Update one or more fields on an existing calendar event. For full alarm edits, list events using a native calendar_id and pass the returned native event_id. Existing applescript:: IDs continue to use automation after access changes. Optional alarms: list of {minutes_before: N} or {absolute_iso: ISO datetime}; pass [] to clear alarms, omit to leave unchanged. Replacing or clearing existing alarms, or combining explicit alarms with other field edits, requires native EventKit access. Automation rejects combined requests before any mutation, including [] or unchanged field values. Omit alarms for ordinary field edits; alarm-only initial alerts or [] no-ops require all alert collections verified empty.
| Name | Type | Req | Description |
|---|---|---|---|
| alarms | – | – | List of alarms, each exactly one of {minutes_before: whole minutes 0-525600} or {absolute_iso: ISO 8601 datetime with Z or an offset}; at most 100. Replaces existing alarms; pass [] to clear them, or… |
| all_day | – | – | True for all-day, false for timed. Omit to leave unchanged. |
| calendar_id | – | – | Destination calendar to move the event to. Select the calendar by name and source in calendar_list_calendars, then pass its calendar_id unchanged. Re-list after Calendar access changes to obtain nati… |
| end_iso | – | – | New end. ISO 8601 datetime such as 2026-10-22T09:00:00-05:00; without an offset the Mac's local time zone is used. Omit to leave unchanged. |
| event_id | string | yes | Event ID returned by calendar_list_events. For full alarm edits, list with a native calendar_id and use the returned native event_id; existing applescript:: IDs use automation. |
| location | – | – | Replacement location. Omit to leave unchanged. |
| notes | – | – | Replacement notes. Omit to leave unchanged. |
| recurrence | – | – | Repeat rule object: {frequency: daily|weekly|monthly|yearly, interval: N (default 1), end_date: optional ISO 8601 date}. Requires native EventKit access. Replaces the existing rule. Omit to leave unc… |
| start_iso | – | – | New start. ISO 8601 datetime such as 2026-10-22T09:00:00-05:00; without an offset the Mac's local time zone is used. Omit to leave unchanged. |
| title | – | – | New title. Omit to leave unchanged. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
contacts_create_contact Create Contact ~146
Create a new contact in Apple Contacts with a first name (required) and optional last name, organization, and note.
| Name | Type | Req | Description |
|---|---|---|---|
| emails | – | – | Email addresses as {label, value} objects, e.g. {"label": "work", "value": "person@example.com"}. |
| first_name | string | yes | Given name of the new contact. |
| last_name | string | – | Family name. |
| note | string | – | Free-text note stored on the contact. |
| organization | string | – | Company or organization. |
| phones | – | – | Phone numbers as {label, value} objects, e.g. {"label": "mobile", "value": "+15551234567"}. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
contacts_delete_contact Delete Contact ~52
Permanently delete a contact by contact_id. Requires full_access safety mode.
| Name | Type | Req | Description |
|---|---|---|---|
| contact_id | string | yes | Contact id: the contact_id returned by contacts_search_contacts or contacts_list_contacts. Deletion is permanent. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
contacts_get_contact Get Contact ~44
Fetch full details for an Apple Contacts record by contact_id.
| Name | Type | Req | Description |
|---|---|---|---|
| contact_id | string | yes | Contact id: the contact_id returned by contacts_search_contacts or contacts_list_contacts. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
contacts_health Contacts Health ~16
Report the active Apple Contacts MCP configuration.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| capabilities | array | yes | – |
| contacts_accessible | boolean | yes | – |
| ok | boolean | – | – |
| permission_client | – | – | – |
| permission_error | – | – | – |
| permission_error_code | – | – | – |
| permission_status | string | – | – |
| permission_suggestion | – | – | – |
| safety_mode | string | yes | – |
| safety_mode_warning | – | – | Set when the configured safety value was invalid or blank and the server fell back to a safer mode |
| server_name | string | yes | – |
| transport | string | – | – |
| version | string | yes | – |
No examples provided.
contacts_list_contacts List Contacts ~54
List Apple Contacts entries.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum number of contacts to return, from 1 to 100. |
| offset | integer | – | Number of contacts to skip, for paging; 0 or more. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
contacts_resolve_message_recipient Resolve Message Recipient ~82
Resolve a contact into a message-ready phone number or email address.
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | – | Which contact method to return: phone, email, or any. |
| query | string | yes | A name, phone number, or email address to look up. Several matches return AMBIGUOUS_CONTACT; then pick a contact_id with contacts_search_contacts. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
contacts_search_contacts Search Contacts ~69
Search Apple Contacts by name, phone number, or email address.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum number of matches to return; 1 or more, capped at 100. |
| query | string | yes | A name, phone number, or email address to look up. Must not be empty. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
contacts_update_contact Update Contact ~222
Update an existing contact's information. Only the fields you provide will be changed.
| Name | Type | Req | Description |
|---|---|---|---|
| contact_id | string | yes | Contact id: the contact_id returned by contacts_search_contacts or contacts_list_contacts. |
| emails | – | – | Email addresses as {label, value} objects, e.g. {"label": "work", "value": "person@example.com"}. When given, replaces all existing entries; [] removes them all. Omit to keep them. |
| first_name | string | – | New given name. Empty keeps the current value. |
| last_name | string | – | New family name. Empty keeps the current value. |
| note | string | – | New note, replacing the current one. Empty keeps the current value. |
| organization | string | – | New company or organization. Empty keeps the current value. |
| phones | – | – | Phone numbers as {label, value} objects, e.g. {"label": "mobile", "value": "+15551234567"}. When given, replaces all existing entries; [] removes them all. Omit to keep them. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
files_add_tags Add Tags ~77
Add Finder tags to a file or folder. Requires safe_manage or full_access safety mode.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path (~ is expanded) to an existing file or folder inside the allowed roots; call files_list_allowed_roots to see them. |
| tags | array | yes | Finder tag names to add. Existing tags are kept. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
files_create_folder Create Folder ~53
Create a folder inside the allowed roots.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path (~ is expanded) of the folder to create inside the allowed roots. Missing parent folders are created; an existing folder is left as is. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
files_delete_path Delete Path ~64
Delete a file or empty folder inside the allowed roots. Requires full_access safety mode.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path (~ is expanded) of the file or empty folder to delete inside the allowed roots. Deletion is permanent; it does not go to the Trash. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
files_get_file_info Get File Info ~55
Get metadata for a file or folder inside the allowed roots.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path (~ is expanded) to an existing file or folder inside the allowed roots; call files_list_allowed_roots to see them. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
files_get_icloud_status Get iCloud Status ~30
Report whether local iCloud Drive is available and whether it is part of the current allowed roots.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
files_get_tags Get Tags ~55
Read Finder tags for a file or folder inside the allowed roots.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path (~ is expanded) to an existing file or folder inside the allowed roots; call files_list_allowed_roots to see them. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
files_health Files Health ~16
Report the active Apple Files MCP configuration.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| allowed_roots | array | yes | – |
| capabilities | array | yes | – |
| ok | boolean | – | – |
| safety_mode | string | yes | – |
| safety_mode_warning | – | – | Set when the configured safety value was invalid or blank and the server fell back to a safer mode |
| server_name | string | yes | – |
| supports | array | yes | – |
| transport | string | yes | – |
| version | string | yes | – |
No examples provided.
files_list_allowed_roots List Allowed Roots ~21
List the file system roots the server may access.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | – |
| ok | boolean | – | – |
| roots | array | yes | – |
No examples provided.
files_list_directory List Directory ~40
List files and folders inside an allowed directory path.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path (~ is expanded) to an existing folder inside the allowed roots. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
files_list_recent_locations List Recent Locations ~41
List recently active parent folders across the allowed roots, including iCloud-aware metadata.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum number of recently active folders to return. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
files_move_path Move Path ~86
Move or rename a file or folder inside the allowed roots.
| Name | Type | Req | Description |
|---|---|---|---|
| destination | string | yes | Full new path, including the file or folder name, inside the allowed roots. Its parent folder must exist and the path must not exist yet; nothing is overwritten. |
| source | string | yes | Absolute path (~ is expanded) of the existing file or folder to move, inside the allowed roots. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
files_open_path Open Path ~61
Open a file or folder in the default app. Requires safe_manage or full_access safety mode.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path (~ is expanded) to an existing file or folder inside the allowed roots; call files_list_allowed_roots to see them. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
files_read_text_file Read Text File ~86
Read a UTF-8 text file inside the allowed roots.
| Name | Type | Req | Description |
|---|---|---|---|
| max_bytes | integer | – | Maximum bytes to read, 1 to 10485760. Longer files are cut off and returned with truncated=true. |
| path | string | yes | Absolute path (~ is expanded) to an existing file or folder inside the allowed roots; call files_list_allowed_roots to see them. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
files_recent_files Recent Files ~36
List recently modified files inside the allowed roots.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum number of recently modified files to return, newest first. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
files_remove_tags Remove Tags ~77
Remove Finder tags from a file or folder. Requires safe_manage or full_access safety mode.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path (~ is expanded) to an existing file or folder inside the allowed roots; call files_list_allowed_roots to see them. |
| tags | array | yes | Finder tag names to remove. Other tags are kept. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
files_reveal_in_finder Reveal In Finder ~62
Reveal a file or folder in Finder. Requires safe_manage or full_access safety mode.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path (~ is expanded) to an existing file or folder inside the allowed roots; call files_list_allowed_roots to see them. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
files_search_files Search Files ~78
Search file and folder names inside the allowed roots.
| Name | Type | Req | Description |
|---|---|---|---|
| base_path | – | – | Optional folder inside the allowed roots to search under. Omit to search every allowed root. |
| limit | integer | – | Maximum number of matches to return. |
| query | string | yes | Case-insensitive text to match anywhere in file and folder names (not file contents). |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
files_set_tags Set Tags ~87
Replace Finder tags for a file or folder. Requires safe_manage or full_access safety mode.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path (~ is expanded) to an existing file or folder inside the allowed roots; call files_list_allowed_roots to see them. |
| tags | array | yes | The complete new set of Finder tag names. Replaces all existing tags; pass [] to clear them. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
get_tool_info Get Tool Info ~69
Load the full schema, examples, and metadata for one tool from this server.
| Name | Type | Req | Description |
|---|---|---|---|
| include_examples | boolean | – | Include example calls. |
| include_schema | boolean | – | Include the tool's input and output JSON schemas. |
| name | string | yes | Exact tool name, as returned by search_tools. |
Structured output declared, but exposes no named fields.
No examples provided.
mail_archive_thread Archive Thread ~145
Move related messages in the same mailbox thread to the target archive mailbox.
| Name | Type | Req | Description |
|---|---|---|---|
| archive_account | – | – | Account that owns archive_mailbox. Omit to use each message's own account. |
| archive_mailbox | string | – | Exact name of the destination mailbox (default "Archive"), as returned by mail_list_mailboxes. |
| limit | – | – | Maximum number of thread messages to move (1 or more); the thread is matched by normalized subject in the anchor message's mailbox. |
| message_id | string | yes | Message ID exactly as returned by mail_search_messages, mail_get_thread or mail_get_message; it encodes the account, mailbox and message. Any message in the thread to archive. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
mail_compose_draft Compose Draft ~168
Create a draft message in Apple Mail without sending it. Optionally specify from_account as an email address or account name to set the sender.
| Name | Type | Req | Description |
|---|---|---|---|
| attachments | – | – | Absolute paths of files to attach. Each must be a regular file under the configured APPLE_MAIL_MCP_ALLOWED_ATTACHMENT_ROOT; attachments are rejected when no root is configured. |
| bcc | – | – | Blind carbon-copy email addresses, one per item. |
| body | string | – | Plain-text message body. |
| cc | – | – | Carbon-copy email addresses, one per item. |
| from_account | – | – | Sender: an account email address or account name from mail_list_mailboxes. Omit to use Mail's default account. |
| subject | string | – | Subject line. |
| to | array | yes | Recipient email addresses, one per item. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
mail_delete_message Delete Message ~66
Delete (trash) an email message by its message_id.
| Name | Type | Req | Description |
|---|---|---|---|
| message_id | string | yes | Message ID exactly as returned by mail_search_messages, mail_get_thread or mail_get_message; it encodes the account, mailbox and message. The message is moved to the account's Trash. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
mail_forward_message Forward Message ~177
Forward an existing email message to new recipients. Provide a message_id and the to list. Optionally prepend body text and specify from_account. In full_access the forward is sent; in safe_manage it is saved as an unsent draft in Mail for the user to review (check `sent` and `note` in the result).
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | – | Optional plain-text note placed above the forwarded message. |
| from_account | – | – | Sender: an account email address or account name from mail_list_mailboxes. Omit to use Mail's default account. |
| message_id | string | yes | Message ID exactly as returned by mail_search_messages, mail_get_thread or mail_get_message; it encodes the account, mailbox and message. This is the message being forwarded. |
| to | array | yes | Recipient email addresses, one per item. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
mail_get_message Get Email ~54
Fetch a single Apple Mail message by message_id.
| Name | Type | Req | Description |
|---|---|---|---|
| message_id | string | yes | Message ID exactly as returned by mail_search_messages, mail_get_thread or mail_get_message; it encodes the account, mailbox and message. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
mail_get_thread Get Thread ~92
Find related messages in the same mailbox thread by normalized subject, anchored on a message_id.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | – | – | Maximum number of thread messages to consider (1 or more); the thread is matched by normalized subject in the anchor message's mailbox. |
| message_id | string | yes | Message ID exactly as returned by mail_search_messages, mail_get_thread or mail_get_message; it encodes the account, mailbox and message. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
mail_health Mail Health ~16
Report the active Apple Mail MCP configuration.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| capabilities | array | yes | – |
| ok | boolean | yes | – |
| safety_mode_warning | – | – | – |
| safety_profile | string | yes | – |
| server_name | string | yes | – |
| supports | array | yes | – |
| transport | string | yes | – |
| version | string | yes | – |
| visible_drafts | boolean | yes | – |
No examples provided.
mail_list_mailboxes List Mailboxes ~43
List Apple Mail mailboxes, optionally filtered by account.
| Name | Type | Req | Description |
|---|---|---|---|
| account | – | – | Mail account name as returned by mail_list_mailboxes. Omit to cover all accounts. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
mail_mark_message Mark Message Read/Unread ~90
Set the read status of an email message. Pass is_read=true to mark as read, is_read=false to mark as unread.
| Name | Type | Req | Description |
|---|---|---|---|
| is_read | boolean | yes | True to mark the message read, false to mark it unread. |
| message_id | string | yes | Message ID exactly as returned by mail_search_messages, mail_get_thread or mail_get_message; it encodes the account, mailbox and message. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
mail_move_message Move Message ~112
Move an email message to a different mailbox. Optionally specify target_account if the mailbox is in a different account.
| Name | Type | Req | Description |
|---|---|---|---|
| message_id | string | yes | Message ID exactly as returned by mail_search_messages, mail_get_thread or mail_get_message; it encodes the account, mailbox and message. |
| target_account | – | – | Account that owns target_mailbox. Omit to use the message's own account. |
| target_mailbox | string | yes | Exact name of the destination mailbox, as returned by mail_list_mailboxes. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
How do I install the Apple Tools (Unified) MCP server?
Apple Tools (Unified) runs locally as a PyPI package, launched with uvx apple-tools-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · apple-tools-mcp
claude mcp add jonathanrreed-apple-tools-mcp -- uvx apple-tools-mcp
What is the Apple Tools (Unified) MCP server?
Apple Tools (Unified) is an MCP server listed in the public MCP registry as io.github.JonathanRReed/apple-tools-mcp. Unified Apple ecosystem MCP server for macOS: Mail, Calendar, Notes, Files, Messages, and more. This page covers its PyPI package (apple-tools-mcp).
Is the Apple Tools (Unified) MCP server safe to use?
Apple Tools (Unified) scores 97 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 23 October 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Apple Tools (Unified) MCP server expose?
Apple Tools (Unified) exposes 184 tools: apple_get_preferences, apple_detect_defaults, apple_update_preferences, apple_detect_digest_folder, apple_set_digest_folder, and 179 more. Their descriptions and schemas cost roughly 16,164 tokens of context every time the server is loaded.
Is the Apple Tools (Unified) MCP server still maintained?
Apple Tools (Unified) is still listed as active in the MCP registry. We last reached this channel on 23 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the Apple Tools (Unified) MCP server under?
Apple Tools (Unified) declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.