A Mac menu bar app that shares Calendar, Messages, Notes, Reminders and more with your assistant.
- Needs your setup first
- ★ 1.8K GitHub stars
- Last commit 26 Oct 2026
What is iMCP?
iMCP is a free macOS app by Mattt that turns on an MCP server for your Mac's Calendar, Contacts, Messages, Mail, Notes, Reminders, Maps, Location and Weather, with a permission switch for each.
iMCP, made by Mattt, is a native macOS app that sits in the menu bar and exposes your Mac's own data to AI apps: calendars, contacts, Messages, Mail, Notes, Reminders, Maps, location, weather, Music, the camera and screenshots, call history, voicemail, Voice Memos and Shortcuts. It bundles the server, so there is nothing to install from npm or PyPI.
Every service starts switched off apart from Maps, and turning one on triggers the normal macOS permission prompt for it. The first time a client connects, iMCP asks you to approve it. The app stores none of your data itself, but remember that whatever a tool returns goes to the AI app you connected.
- Made by
- Mattt
- Licence
- MIT
- GitHub stars
- 1.8K
- Last commit
- 26 Oct 2026
- Tools
- 56
- Runs on
- Your computer
- Setup checked
- 27 Oct 2026
- Page updated
- 27 Oct 2026
Our check: It needs something our Linux test machine does not have (an account, a desktop app, a Mac or a running service), so on 27 Oct 2026 we read its tools from the source code instead of running this config. The shared database gave a command for the MCP Inspector, not this server. The server is the imcp-server program inside the app.
MCP Shelf take
iMCP needs something our Linux test machine does not have (an account, an app or a service), so on 27 Oct 2026 we read its source and counted 56 tools. 41 of the 56 only read; the other 15 can change things. Other directories point at a package with the same name that belongs to someone else; the config on this page installs the real one. It sits 13th of 16 in its category on our shelf by GitHub stars (1.8K).
What can iMCP read and change?
It can read
- Calendars, contacts, Messages, Mail, Notes, Reminders, call history, voicemail and Voice Memos, for the services you switch on
- Your location, the camera, the microphone and the screen, when you allow them
It can change
- Calendar events, contacts, reminders and reminder lists
- Music playback, and phone calls and shortcuts you ask it to start
Safer setup: Switch on only the services you need, turn off tools you do not want in Settings, and approve each client rather than always trusting it. A local model keeps the data on your Mac.
What's in the pod
What tools does iMCP have?
We found 56 tools in its source code on 27 Oct 2026. 41 only read. The rest can change things, so keep your app's "ask before each tool call" setting on for them.
How we tested it: Tool list read from the Swift source at commit 507da50. iMCP is a macOS app, and tools for a service appear only once you switch that service on.
Runs commands1 tool · Can start programs or run code.
| Tool | What it is for |
|---|---|
shortcuts_run | Runs a shortcut, optionally with text input. |
Changes things14 tools · Can create, edit, send or delete.
| Tool | What it is for |
|---|---|
contacts_create | Adds a contact. |
contacts_update | Changes a contact's details. |
events_create | Adds an event, with location, notes, alarms and repeats if needed. |
events_delete | Deletes an event. |
events_update | Changes an event, or one occurrence of a repeating event. |
mail_compose | Opens a new email in your mail app for you to review and send. It does not send anything. |
music_control | Plays, pauses, skips or seeks in Music. |
phone_call | Starts a phone call through your iPhone. |
reminders_create | Adds a reminder. |
reminders_delete | Deletes a reminder. |
reminders_lists_create | Creates a reminder list. |
reminders_lists_delete | Deletes a reminder list and everything in it. |
reminders_lists_rename | Renames a reminder list. |
reminders_update | Changes or completes a reminder. |
Only reads41 tools · Looks things up and changes nothing.
| Tool | What it is for |
|---|---|
calendars_list | Lists your calendars. |
capture_record_audio | Records audio from the microphone. |
capture_take_picture | Takes a photo with the Mac's camera. |
capture_take_screenshot | Takes a screenshot of the screen, a window or an app. |
contacts_list | Lists all contacts, a page at a time. |
contacts_me | Returns your own contact card. |
contacts_search | Finds contacts by name, phone or email. |
events_fetch | Finds calendar events by date range, calendar, text and status. |
location_current | Returns where your Mac is now. |
location_geocode | Turns an address into coordinates. |
location_reverse-geocode | Turns coordinates into an address. |
mail_mailboxes_list | Lists the mailboxes in Apple Mail. |
mail_messages_read | Reads one email. |
mail_messages_search | Searches Mail by sender, subject, mailbox and date. |
maps_directions | Gets driving or walking directions. |
maps_eta | Estimates travel time between two points. |
maps_explore | Finds places of a kind near a point, such as cafes. |
maps_generate | Makes a map image of an area. |
maps_search | Searches Apple Maps for places and addresses. |
messages_attachment_read | Opens an attachment from a message. |
messages_fetch | Reads iMessages and texts by person, chat, date or text. |
music_catalog_search | Searches the Apple Music catalogue. |
music_now_playing | Shows what is playing in Music. |
notes_fetch | Finds notes by text, folder or date. |
notes_folders | Lists your Notes folders. |
notes_read | Reads a note as Markdown. Locked notes cannot be read. |
phone_calls_fetch | Reads call history synced from your iPhone. |
reminders_fetch | Finds reminders by list, date, text or completion. |
reminders_lists | Lists your reminder lists. |
shortcuts_list | Lists your Shortcuts. |
utilities_beep | Plays a system sound. Always available, so you can test a connection. |
voice_memo_audio_fetch | Returns a recording's audio. |
voice_memo_transcript_fetch | Reads the transcript Voice Memos made of a recording. |
voice_memos_fetch | Lists Voice Memos recordings. |
voicemail_audio_fetch | Returns a voicemail's audio. |
voicemail_transcript_fetch | Reads a voicemail's transcript. |
voicemails_fetch | Lists voicemails synced to the Mac. |
weather_current | Current weather for a location. |
weather_daily | Daily forecast for a location. |
weather_hourly | Hourly forecast for a location. |
weather_minute | Minute-by-minute forecast for a location. |
Grouped and described by us. The README on GitHub lists the inputs each tool takes.
How do I install iMCP?
Install steps from the iMCP README
The project's own instructions, copied from its README on GitHub on 27 Oct 2026 under its MIT licence. They are the source of truth; the ready-made configs further down are built from them. The rest of the README is in the README tab.
Getting Started
To use iMCP, you need two apps: iMCP, which gives access to the services you turn on, and an AI app that can connect to MCP servers. Install iMCP and turn on services first. Then follow the instructions for your AI app:
- Claude Desktop
- ChatGPT desktop app
- Claude Code, llama.cpp, and other clients
Download and open the app
First, download the iMCP app (requires macOS 15.3 or later).
Or, if you have Homebrew installed, you can run the following command:
brew install --cask mattt/tap/iMCP
When you open the app,
you'll see a
icon in your menu bar.
Click this icon to open the iMCP menu. The blue "Enable MCP Server" switch at the top indicates that the MCP server is running and ready to connect with AI apps. iMCP must be open for AI apps to use it.
Below the switch, the menu lists the available services. Maps is on when you first open iMCP; the other services are off and appear in gray. iMCP also includes a tool that plays a system sound. That tool is always available, even with every service off, so you can test a connection without granting any permissions.
Turn on services
To turn on a service, click its icon. macOS asks you for permission. For example, when you turn on Calendar, a dialog asks "'iMCP' Would Like Full Access to Your Calendar". Click "Allow Full Access" to continue.
Important: iMCP does not collect or store any of your data. AI apps like Claude and ChatGPT do send your data off device as part of tool calls. Turn on only the services you want your AI app to use. To keep your data on your Mac, use a local model with llama.cpp.
When a service is on, its icon changes from gray to the service's color: red for Calendar, green for Messages, blue for Location, and so on.
Repeat these steps for each service that you want to use.
macOS asks for each permission separately,
so iMCP can access only the data that you allow.
To turn off a service, click its icon again.
To turn off individual tools in a service,
click
> "Settings", and then click the service in the sidebar.
Approve connections
The first time an AI app connects,
iMCP shows a "Client Connection Request" dialog
with the name the app reports
and the services that the app can use.
Click "Allow" to connect.
To skip this dialog next time, select "Always trust this client";
iMCP then shows a notification each time the app connects.
You can remove trusted clients in
> "Settings" > "Clients".
Mail access and search
Mail store access uses Envelope, which reads the local index and message files and selects readable content with its internal MIME reader. iMCP manages folder access, tool arguments, JSON output, and composition.
Mail reading requires access to ~/Library/Mail.
If folder access is unavailable, mail_compose can still open a compose window
in the default email app.
It does not save or send a message.
Mail reads use a read-only SQLite connection and require WAL journal mode. iMCP does not change the index's journal mode or run checkpoints. It permits one Mail database connection at a time; concurrent reads wait their turn, and a read returns an error if SQLite reports a lock conflict. Each SQL statement has a 100 ms execution budget, all statements of one read share a 1 s budget, and statements check task cancellation. The deadline is cooperative; it cannot interrupt a filesystem operation while SQLite is waiting for that operation to finish. Slow searches can fail instead of returning results. Service status checks do not open SQLite connections, and message reads close the database before scanning mailbox files. These limits reduce interference, but active reads can still delay WAL checkpoints.
Use the @id string from mail_mailboxes_list as the mailbox filter
in mail_messages_search, for example {"mailbox": "V10:12"}.
The identifier includes the Mail store,
so an identifier from before a Mail store upgrade returns an error.
The url field describes storage and is not a search identifier.
Each mailbox includes an account identifier when available.
The account's email field comes from Mail's local account map;
it is null when that map is missing or does not contain an email address.
Search results include localIndex.indexedMessageCount for the selected mailbox,
or all mailboxes when no mailbox is selected, before filters and pagination.
This count includes label membership without counting a message twice.
Sync status is reported as unknown.
A count of zero can mean an empty mailbox or missing local indexing;
it cannot show whether Mail has ever indexed the account.
Open Mail to check account sync.
Search results are newest first.
When more messages match, the result includes a nextCursor value;
pass it as cursor with the same filters to get the next page.
A cursor names the last message of a page,
so mail that arrives between requests does not shift later pages.
Search matches sender and subject metadata only.
mail_messages_read can read the local content of a returned message.
It lists attachments without their content.
When Mail stores a message's attachments or inline images in separate files,
the message file keeps the text, and each of those attachments has
isStoredSeparately set to true.
Body search is not available, and these tools do not download messages.
Connect to Claude Desktop
If you don't have Claude Desktop installed, you can download it here.
Open Claude Desktop and choose Claude > "Settings" (⌘,).
Click "Developer" in the sidebar,
and then click "Edit Config".
This creates a configuration file at
~/Library/Application Support/Claude/claude_desktop_config.json.
To connect iMCP to Claude Desktop,
click
> "Configure Claude Desktop",
and then click "Set Up".
iMCP adds or updates its entry in the configuration file
so that Claude Desktop starts the imcp-server executable in the app.
iMCP keeps the other MCP servers in the file.
Configure Claude Desktop manually
Click
> "Copy server command to clipboard".
Then open
claude_desktop_config.json in your editor
and enter the following:
{
"mcpServers": {
"iMCP": {
"command": "{paste iMCP server command}"
}
}
}
Call iMCP tools from Claude Desktop
Quit and reopen the Claude Desktop app. iMCP asks you to approve the connection.
After you approve the connection, a 🔨 icon with the number of available tools appears in the lower-right corner of the chat box. Click it to see the iMCP tools that Claude can use.
Now you can ask Claude questions that require access to your personal data, such as:
"How's the weather where I am?"
Claude uses iMCP tools to get this information, so you don't have to share it in the conversation yourself.
Connect to the ChatGPT desktop app
If you don't have the ChatGPT desktop app installed, you can download it here.
Note: These steps use the labels in ChatGPT 26.930 for macOS and haven't been tested end to end yet. OpenAI documents MCP servers for Codex mode, so use iMCP in a Codex conversation.
- Click
> "Copy server command to clipboard".
- In ChatGPT, open Settings (⌘,) and click "MCP servers" in the sidebar.
- Click "Add server".
Enter
iMCPfor "Name", choose "STDIO" for "Type", and paste the copied command into "Command to launch". Leave the other fields empty. - Click "Save", and then click "Restart".
- Approve the connection in iMCP.
ChatGPT might identify itself as
codex-mcp-client.
To test the connection, start a new Codex conversation and send this message:
"Use iMCP to play a system sound."
Your Mac plays a short sound.
If your Mac is muted, open the tool call in the conversation;
a result of true means that iMCP received the request.
Troubleshooting the ChatGPT desktop app
- Settings doesn't show "MCP servers". Update ChatGPT and switch to Codex mode. If ChatGPT shows "MCP server settings are unavailable" and an organization manages your account, ask your administrator whether you can add MCP servers.
- iMCP doesn't show an approval dialog. ChatGPT can't open iMCP for you. Make sure that iMCP is open and "Enable MCP Server" is on, and then click "Restart" in ChatGPT's "MCP servers" settings. The dialog can also open behind other windows. If you trusted ChatGPT before, iMCP shows a notification instead of a dialog.
- ChatGPT can't use iMCP tools. Make sure that you're in a Codex conversation and that iMCP is turned on in ChatGPT's "MCP servers" settings. If you clicked "Deny", click "Restart" to see the dialog again. If you turned on a service after connecting, click "Restart" so that ChatGPT loads its tools.
- A service doesn't turn on in iMCP. If you denied permission when macOS asked, open System Settings > "Privacy & Security", click the category for the service, such as "Calendars", and turn on iMCP. Then click the service icon in the iMCP menu again.
- ChatGPT shows an error for the iMCP server. The command might point to the wrong place, for example, if you moved iMCP after setting it up. Copy the server command again, open the iMCP server's settings in ChatGPT, and replace "Command to launch" with the copied command. Make sure that "Arguments" is empty, and then click "Save" and "Restart".
Connect to other clients
Most MCP clients can start iMCP as a local server
that uses the STDIO transport.
Click
> "Copy server command to clipboard",
and then enter the copied command
as the command for a new STDIO server in your client.
The copied command is the full path to the
imcp-server executable
in your copy of iMCP.
The commands below assume that iMCP is in your Applications folder.
If you installed iMCP somewhere else,
replace /Applications/iMCP.app/Contents/MacOS/imcp-server
with the copied command.
Claude Code
To add iMCP for all of your projects, run this command:
claude mcp add --scope user iMCP -- /Applications/iMCP.app/Contents/MacOS/imcp-server
Or import from Claude Desktop
If you've already configured Claude Desktop, you can import its MCP servers:
claude mcp add-from-claude-desktop
llama.cpp
You can use iMCP with an open model that runs on your Mac
through llama.cpp,
so your conversations and tool results stay on your Mac.
llama-server (or llama serve) starts the MCP servers
listed in a configuration file
and gives their tools to models in its web UI.
This requires llama.cpp 0.1.0 or later.
Create a file at ~/.config/llama/mcp.json with the following contents:
{
"mcpServers": {
"imcp": {
"command": "/Applications/iMCP.app/Contents/MacOS/imcp-server"
}
}
}
Then start the server with the --mcp-servers-config option
and a model that supports tool calling:
llama serve --mcp-servers-config ~/.config/llama/mcp.json \
-hf ggml-org/Qwen3-4B-GGUF
Open the web UI at http://localhost:9931
(llama.cpp versions before 0.7.0 use port 8080).
iMCP tools appear with an imcp_ prefix,
such as imcp_weather_current.
The web UI asks you before it runs each tool call,
unless you choose to always allow that tool.
Use the Llama app
Llama is a menu bar app that runs llama serve for you.
It doesn't have a setting for MCP servers,
so add the --mcp-servers-config option to its custom server arguments:
defaults write app.llama.Llama extraServerArgs -string "--mcp-servers-config $HOME/.config/llama/mcp.json"
Llama splits this value at each space and doesn't expand ~,
so use the full path to the file, without spaces.
If you already set custom server arguments,
add the option to your existing value.
Quit and reopen Llama,
then open the web UI at http://localhost:9931.
Important: When the server starts, it waits 10 seconds for iMCP to list its tools. If you don't approve the connection from "llama.cpp" in that time, no iMCP tools appear until you restart the server.
What you need first
- A Mac with macOS 15.3 or newer
- The iMCP app, open while you use it
Steps
- Download iMCP from iMCP.app/download, or run "brew install --cask mattt/tap/iMCP", and open it.
- Click the menu bar icon and turn on the services you want, allowing each macOS permission as it is asked.
- Add the config below to your client, or use the Configure option in the iMCP menu for Claude Desktop, then approve the connection when iMCP asks.
Add iMCP to your app
Pick your app for a ready-to-paste snippet and where it goes, built from the steps above.
Where it goes: Your terminal, in the project folder
claude mcp add imcp -- /Applications/iMCP.app/Contents/MacOS/imcp-serverUse Copy server command to clipboard in the iMCP menu if the app lives somewhere other than /Applications. iMCP must be open, and it asks you to approve Claude Code the first time it connects.
Where it goes: ~/.cursor/mcp.json, or .cursor/mcp.json in a project
{
"mcpServers": {
"imcp": {
"command": "/Applications/iMCP.app/Contents/MacOS/imcp-server",
"args": []
}
}
}Where it goes: claude_desktop_config.json (Settings → Developer → Edit Config)
{
"mcpServers": {
"imcp": {
"command": "/Applications/iMCP.app/Contents/MacOS/imcp-server",
"args": []
}
}
}Easier: click the iMCP menu bar icon, choose Configure Claude Desktop, then Set Up. iMCP writes this entry for you and keeps your other servers. Quit and reopen Claude, then approve the connection in iMCP.
Where it goes: .vscode/mcp.json in your project
{
"servers": {
"imcp": {
"type": "stdio",
"command": "/Applications/iMCP.app/Contents/MacOS/imcp-server",
"args": []
}
}
}Where it goes: ~/.codeium/windsurf/mcp_config.json
{
"mcpServers": {
"imcp": {
"command": "/Applications/iMCP.app/Contents/MacOS/imcp-server",
"args": []
}
}
}Where it goes: ChatGPT desktop app for Mac → Settings → MCP servers → Add server
/Applications/iMCP.app/Contents/MacOS/imcp-serverName it iMCP, choose STDIO as the type and paste the command. The project says these steps are for Codex conversations in the Mac app and have not been tested end to end yet.
Checked against the project's own install docs on 27 Oct 2026: loopwork-ai/iMCP README.
New to this? See the setup guides for Claude Code, Cursor, Claude Desktop and ChatGPT.
iMCP not working? Common fixes
- The client cannot connect
- iMCP must be open with Enable MCP Server switched on. Then restart the server in your client; the approval prompt can appear behind other windows.
- A service will not switch on
- You probably denied the macOS prompt. Open System Settings > Privacy & Security, allow iMCP in that category, then click the service again.
- New tools do not appear
- Tools for a service appear only after it is switched on. Restart the server in your client after turning one on.
- The client reports a wrong command
- If you moved the app, copy the server command again from the iMCP menu and paste it into your client with no arguments.
How do I configure iMCP?
Names are exactly as the project spells them. Required ones are marked.
| Setting | What it does |
|---|---|
Services (iMCP menu)Config · required | Each service, such as Calendar or Messages, is switched on from the menu bar icon and asks for its own macOS permission. Only Maps starts on. |
Settings > servicesConfig | Turns off single tools inside a service, for example to allow reading reminders but not deleting them. |
Settings > ClientsConfig | Lists the AI apps you chose to always trust, and lets you remove them. |
iMCP FAQ
How do I add iMCP to Claude Desktop?
Install iMCP from iMCP.app or with brew install --cask mattt/tap/iMCP, turn on the services you want, then choose Configure Claude Desktop in its menu and click Set Up. Reopen Claude and approve the connection.
Does iMCP work with ChatGPT?
In the ChatGPT desktop app for Mac, through Codex conversations: add a STDIO MCP server with the command iMCP copies to your clipboard. The project notes these steps are not fully tested yet.
What can iMCP access on my Mac?
Calendar, Contacts, Messages, Mail, Notes, Reminders, Maps, Location and Weather, each only after you switch it on and allow the macOS permission. Maps is on at first; the rest start off.
Does iMCP send my data anywhere?
iMCP keeps nothing itself, but whatever a tool returns goes to the AI app you connected, and a cloud model sends it off your Mac. Use a local model through llama.cpp to keep it on device.
Is iMCP free?
Yes. It is an MIT licensed app by Mattt, free to download, with no account.
Can iMCP send iMessages?
No. It can read messages and their attachments, but it has no tool for sending them. It can compose mail and create calendar events, contacts and reminders.
Does iMCP work on Windows or Linux?
No. It is a native macOS app built on Apple's own frameworks, and it needs macOS 15.3 or newer.
Why can't my app connect to iMCP?
iMCP must be running with the Enable MCP Server switch on, and you must approve each app the first time it connects. If the command is wrong, copy it again from the iMCP menu.
iMCP README
This is the project's own README from loopwork-ai/iMCP, written by Mattt, and shared under its MIT licence. We copied it on 27 Oct 2026, so the version on GitHub may be newer.
iMCP is a macOS app for connecting your digital life with AI. It works with Claude Desktop, the ChatGPT desktop app, local models served by llama.cpp, and a growing list of clients that support the Model Context Protocol (MCP).
Capabilities
|
|
Calendar | View and manage calendar events, including creating new events with customizable settings like recurrence, alarms, and availability status. |
|---|---|---|
|
|
Contacts | Access contact information about yourself and search your contacts by name, phone number, or email address. |
|
|
Home | Find homes, rooms, accessories, scenes, and automations, read and control accessories, and organize rooms and zones. Needs a helper app that you build with your own Apple Developer account. |
|
|
Location | Access current location data and convert between addresses and geographic coordinates. |
|
|
List mailboxes, search messages by sender, subject, mailbox, date, or read status, read messages stored on your Mac, and open new drafts in your default email app. Reading mail needs access to your Mail folder. | |
|
|
Maps | Provides location services including place search, directions, points of interest lookup, travel time estimation, and static map image generation. |
|
|
Messages | Access message history with specific participants within customizable date ranges. |
|
|
Music | See what's playing in the Music app, control playback, and search the Apple Music catalog. Playback tools need Automation permission for Music; catalog search needs Apple Music access. |
|
|
Notes | Search notes by text, folder, or date, and read them as Markdown with their checklists, tables, and links. |
|
|
Phone | View call history synced from your iPhone, filter calls by participant, date, or call type, and start calls with system confirmation. |
|
|
Reminders | View, create, edit, and delete reminders with customizable due dates, recurrence, priorities, and alerts across different reminder lists, and manage the lists themselves. |
|
|
Shortcuts | List and run shortcuts on your Mac, with optional text input. |
|
|
Voice Memos | Fetch recordings from Voice Memos, with transcripts and audio, filtering by title, folder, or date, or reading Recently Deleted. Needs access to your Voice Memos folder. |
|
|
Voicemail | Fetch voicemails synced from your iPhone, with transcripts and audio, filtering by sender, date, message type, or mailbox (inbox, blocked, or deleted). |
|
|
Weather | Access current weather conditions including temperature, wind speed, and weather conditions for any location. |
Getting Started
To use iMCP, you need two apps: iMCP, which gives access to the services you turn on, and an AI app that can connect to MCP servers. Install iMCP and turn on services first. Then follow the instructions for your AI app:
- Claude Desktop
- ChatGPT desktop app
- Claude Code, llama.cpp, and other clients
Download and open the app
First, download the iMCP app (requires macOS 15.3 or later).
Or, if you have Homebrew installed, you can run the following command:
brew install --cask mattt/tap/iMCP
When you open the app,
you'll see a
icon in your menu bar.
Click this icon to open the iMCP menu. The blue "Enable MCP Server" switch at the top indicates that the MCP server is running and ready to connect with AI apps. iMCP must be open for AI apps to use it.
Below the switch, the menu lists the available services. Maps is on when you first open iMCP; the other services are off and appear in gray. iMCP also includes a tool that plays a system sound. That tool is always available, even with every service off, so you can test a connection without granting any permissions.
Turn on services
To turn on a service, click its icon. macOS asks you for permission. For example, when you turn on Calendar, a dialog asks "'iMCP' Would Like Full Access to Your Calendar". Click "Allow Full Access" to continue.
Important: iMCP does not collect or store any of your data. AI apps like Claude and ChatGPT do send your data off device as part of tool calls. Turn on only the services you want your AI app to use. To keep your data on your Mac, use a local model with llama.cpp.
When a service is on, its icon changes from gray to the service's color: red for Calendar, green for Messages, blue for Location, and so on.
Repeat these steps for each service that you want to use.
macOS asks for each permission separately,
so iMCP can access only the data that you allow.
To turn off a service, click its icon again.
To turn off individual tools in a service,
click
> "Settings", and then click the service in the sidebar.
Approve connections
The first time an AI app connects,
iMCP shows a "Client Connection Request" dialog
with the name the app reports
and the services that the app can use.
Click "Allow" to connect.
To skip this dialog next time, select "Always trust this client";
iMCP then shows a notification each time the app connects.
You can remove trusted clients in
> "Settings" > "Clients".
Mail access and search
Mail store access uses Envelope, which reads the local index and message files and selects readable content with its internal MIME reader. iMCP manages folder access, tool arguments, JSON output, and composition.
Mail reading requires access to ~/Library/Mail.
If folder access is unavailable, mail_compose can still open a compose window
in the default email app.
It does not save or send a message.
Mail reads use a read-only SQLite connection and require WAL journal mode. iMCP does not change the index's journal mode or run checkpoints. It permits one Mail database connection at a time; concurrent reads wait their turn, and a read returns an error if SQLite reports a lock conflict. Each SQL statement has a 100 ms execution budget, all statements of one read share a 1 s budget, and statements check task cancellation. The deadline is cooperative; it cannot interrupt a filesystem operation while SQLite is waiting for that operation to finish. Slow searches can fail instead of returning results. Service status checks do not open SQLite connections, and message reads close the database before scanning mailbox files. These limits reduce interference, but active reads can still delay WAL checkpoints.
Use the @id string from mail_mailboxes_list as the mailbox filter
in mail_messages_search, for example {"mailbox": "V10:12"}.
The identifier includes the Mail store,
so an identifier from before a Mail store upgrade returns an error.
The url field describes storage and is not a search identifier.
Each mailbox includes an account identifier when available.
The account's email field comes from Mail's local account map;
it is null when that map is missing or does not contain an email address.
Search results include localIndex.indexedMessageCount for the selected mailbox,
or all mailboxes when no mailbox is selected, before filters and pagination.
This count includes label membership without counting a message twice.
Sync status is reported as unknown.
A count of zero can mean an empty mailbox or missing local indexing;
it cannot show whether Mail has ever indexed the account.
Open Mail to check account sync.
Search results are newest first.
When more messages match, the result includes a nextCursor value;
pass it as cursor with the same filters to get the next page.
A cursor names the last message of a page,
so mail that arrives between requests does not shift later pages.
Search matches sender and subject metadata only.
mail_messages_read can read the local content of a returned message.
It lists attachments without their content.
When Mail stores a message's attachments or inline images in separate files,
the message file keeps the text, and each of those attachments has
isStoredSeparately set to true.
Body search is not available, and these tools do not download messages.
Connect to Claude Desktop
If you don't have Claude Desktop installed, you can download it here.
Open Claude Desktop and choose Claude > "Settings" (⌘,).
Click "Developer" in the sidebar,
and then click "Edit Config".
This creates a configuration file at
~/Library/Application Support/Claude/claude_desktop_config.json.
To connect iMCP to Claude Desktop,
click
> "Configure Claude Desktop",
and then click "Set Up".
iMCP adds or updates its entry in the configuration file
so that Claude Desktop starts the imcp-server executable in the app.
iMCP keeps the other MCP servers in the file.
Configure Claude Desktop manually
Click
> "Copy server command to clipboard".
Then open
claude_desktop_config.json in your editor
and enter the following:
{
"mcpServers": {
"iMCP": {
"command": "{paste iMCP server command}"
}
}
}
Call iMCP tools from Claude Desktop
Quit and reopen the Claude Desktop app. iMCP asks you to approve the connection.
After you approve the connection, a 🔨 icon with the number of available tools appears in the lower-right corner of the chat box. Click it to see the iMCP tools that Claude can use.
Now you can ask Claude questions that require access to your personal data, such as:
"How's the weather where I am?"
Claude uses iMCP tools to get this information, so you don't have to share it in the conversation yourself.
Connect to the ChatGPT desktop app
If you don't have the ChatGPT desktop app installed, you can download it here.
Note: These steps use the labels in ChatGPT 26.930 for macOS and haven't been tested end to end yet. OpenAI documents MCP servers for Codex mode, so use iMCP in a Codex conversation.
- Click
> "Copy server command to clipboard".
- In ChatGPT, open Settings (⌘,) and click "MCP servers" in the sidebar.
- Click "Add server".
Enter
iMCPfor "Name", choose "STDIO" for "Type", and paste the copied command into "Command to launch". Leave the other fields empty. - Click "Save", and then click "Restart".
- Approve the connection in iMCP.
ChatGPT might identify itself as
codex-mcp-client.
To test the connection, start a new Codex conversation and send this message:
"Use iMCP to play a system sound."
Your Mac plays a short sound.
If your Mac is muted, open the tool call in the conversation;
a result of true means that iMCP received the request.
Troubleshooting the ChatGPT desktop app
- Settings doesn't show "MCP servers". Update ChatGPT and switch to Codex mode. If ChatGPT shows "MCP server settings are unavailable" and an organization manages your account, ask your administrator whether you can add MCP servers.
- iMCP doesn't show an approval dialog. ChatGPT can't open iMCP for you. Make sure that iMCP is open and "Enable MCP Server" is on, and then click "Restart" in ChatGPT's "MCP servers" settings. The dialog can also open behind other windows. If you trusted ChatGPT before, iMCP shows a notification instead of a dialog.
- ChatGPT can't use iMCP tools. Make sure that you're in a Codex conversation and that iMCP is turned on in ChatGPT's "MCP servers" settings. If you clicked "Deny", click "Restart" to see the dialog again. If you turned on a service after connecting, click "Restart" so that ChatGPT loads its tools.
- A service doesn't turn on in iMCP. If you denied permission when macOS asked, open System Settings > "Privacy & Security", click the category for the service, such as "Calendars", and turn on iMCP. Then click the service icon in the iMCP menu again.
- ChatGPT shows an error for the iMCP server. The command might point to the wrong place, for example, if you moved iMCP after setting it up. Copy the server command again, open the iMCP server's settings in ChatGPT, and replace "Command to launch" with the copied command. Make sure that "Arguments" is empty, and then click "Save" and "Restart".
Connect to other clients
Most MCP clients can start iMCP as a local server
that uses the STDIO transport.
Click
> "Copy server command to clipboard",
and then enter the copied command
as the command for a new STDIO server in your client.
The copied command is the full path to the
imcp-server executable
in your copy of iMCP.
The commands below assume that iMCP is in your Applications folder.
If you installed iMCP somewhere else,
replace /Applications/iMCP.app/Contents/MacOS/imcp-server
with the copied command.
Claude Code
To add iMCP for all of your projects, run this command:
claude mcp add --scope user iMCP -- /Applications/iMCP.app/Contents/MacOS/imcp-server
Or import from Claude Desktop
If you've already configured Claude Desktop, you can import its MCP servers:
claude mcp add-from-claude-desktop
llama.cpp
You can use iMCP with an open model that runs on your Mac
through llama.cpp,
so your conversations and tool results stay on your Mac.
llama-server (or llama serve) starts the MCP servers
listed in a configuration file
and gives their tools to models in its web UI.
This requires llama.cpp 0.1.0 or later.
Create a file at ~/.config/llama/mcp.json with the following contents:
{
"mcpServers": {
"imcp": {
"command": "/Applications/iMCP.app/Contents/MacOS/imcp-server"
}
}
}
Then start the server with the --mcp-servers-config option
and a model that supports tool calling:
llama serve --mcp-servers-config ~/.config/llama/mcp.json \
-hf ggml-org/Qwen3-4B-GGUF
Open the web UI at http://localhost:9931
(llama.cpp versions before 0.7.0 use port 8080).
iMCP tools appear with an imcp_ prefix,
such as imcp_weather_current.
The web UI asks you before it runs each tool call,
unless you choose to always allow that tool.
Use the Llama app
Llama is a menu bar app that runs llama serve for you.
It doesn't have a setting for MCP servers,
so add the --mcp-servers-config option to its custom server arguments:
defaults write app.llama.Llama extraServerArgs -string "--mcp-servers-config $HOME/.config/llama/mcp.json"
Llama splits this value at each space and doesn't expand ~,
so use the full path to the file, without spaces.
If you already set custom server arguments,
add the option to your existing value.
Quit and reopen Llama,
then open the web UI at http://localhost:9931.
Important: When the server starts, it waits 10 seconds for iMCP to list its tools. If you don't approve the connection from "llama.cpp" in that time, no iMCP tools appear until you restart the server.
Technical Details
App & CLI
iMCP is a macOS app that bundles a command-line executable, imcp-server.
iMCP.appprovides UI for configuring services and — most importantly — a means of interacting with macOS system permissions, so that it can access Contacts, Calendar, and other information.imcp-serverprovides an MCP server that uses standard input/output for communication (stdio transport).
The app and CLI communicate with each other on the local network
using Bonjour for automatic discovery.
Both advertise a service with type "_mcp._tcp" and domain "local".
Requests from MCP clients are read by the CLI from stdin
and relayed to the app;
responses from the app are received by the CLI and written to stdout.
See StdioProxy
for implementation details.
For this project, we created what became the official Swift SDK for Model Context Protocol servers and clients. The app uses this package to handle proxied requests from MCP clients.
iMessage Database Access
Apple doesn't provide public APIs for accessing your messages.
However, the Messages app on macOS stores data in a SQLite database located at
~/Library/Messages/chat.db.
iMCP runs in App Sandbox,
which limits its access to user data and system resources.
When you go to enable the Messages service,
you'll be prompted to select your ~/Library/Messages folder through the standard file picker.
When you do, macOS adds that folder to the app's sandbox.
NSOpenPanel is magic like that.
The folder matters: chat.db is a WAL-mode database,
and Messages writes every new message to chat.db-wal next to it first,
only folding the log into chat.db at a checkpoint every few MB —
often hours later.
A grant on chat.db alone (what earlier versions asked for)
leaves that log unreadable, so the newest messages were missing until then.
If you granted chat.db with an earlier version, Messages keeps working from the last checkpoint;
switch Messages off and on in the iMCP menu to grant the folder instead.
Attachment files are a separate matter.
The sandbox walls off ~/Library/Messages/Attachments from a grant on its parent folder,
so reading message attachments (messages_attachment_read)
asks for that subfolder through the same picker —
a second, read-only grant of its own.
Granting it is optional:
declining leaves messages_attachment_read unable to read files,
while everything else keeps working.
If you granted the Messages folder before attachments were supported,
switch Messages off and on in the iMCP menu to be asked for it.
But opening the iMessage database is just half the battle.
Over the past few years,
Apple has moved away from storing messages in plain text
and instead toward a proprietary typedstream format.
For this project, we created Madrid:
a Swift package for reading your iMessage database.
It includes a Swift implementation for decoding Apple's typedstream format,
adapted from Christopher Sardegna's imessage-exporter project
and blog post about reverse-engineering typedstream.
Call History Database Access
Call history synced from your iPhone lives in a SQLite database at
~/Library/Application Support/CallHistoryDB/CallHistory.storedata.
Recent calls sit in its write-ahead log next to the store file,
so the Phone service asks you to open the CallHistoryDB folder
rather than the file alone.
Visual Voicemail Database Access
Voicemails synced from your iPhone by the Phone app (on macOS 26 and later)
live in a SQLite database at
~/Library/Group Containers/group.com.apple.FaceTime/com.apple.facetimemessagestored/Data Store/FaceTimeMessageStore-local.sqlitedb.
The store is a write-ahead log database, and the message audio sits in an Assets
tree beside it, so the Voicemail service asks you to open the Data Store folder
rather than the file alone.
Voice Memos Library Access
Voice Memos keeps its library in a SQLite database at
~/Library/Group Containers/group.com.apple.VoiceMemos.shared/Recordings/CloudRecordings.db.
The audio files sit beside the database,
so the Voice Memos service asks you to open the Recordings folder
rather than the file alone.
Voice Memos writes each transcript into the audio file of its recording,
so a recording has a transcript only when its audio is on your Mac.
For this project, we created TSRP:
a Swift package for reading your Voice Memos library.
It reads transcripts from both .m4a and .qta files,
which keep them in different places.
Notes Database Access
Apple doesn't provide public APIs for accessing your notes, either.
The Notes app keeps them in a SQLite database at
~/Library/Group Containers/group.com.apple.notes/NoteStore.sqlite.
Recent edits sit in its write-ahead log,
so the Notes service asks you to open the group.com.apple.notes folder
rather than the file alone.
iMCP only reads the database; it never changes your notes.
Each note's contents are stored as a gzip-compressed protocol buffer: the text, followed by runs that give the formatting of each part of it. Tables are stored separately, as the state of a CRDT that lists the rows, the columns, and the cell at each intersection. Notes locked with a password are encrypted, so iMCP can find them by title but can't read their contents.
For this project, we created TopoText: a Swift package for reading the Notes database, named after Apple's internal name for the note text format. It builds on the reverse engineering in Jon Baumann's apple_cloud_notes_parser and Steve Dunham's notesutils. The Notes service reads notes with TopoText and returns them as Markdown.
JSON-LD for Tool Results
The tools provided by iMCP return results as
JSON-LD documents.
For example,
the fetchContacts tool uses the Contacts framework,
which represents people and organizations with the CNContact type.
Here's how an object of that type is encoded as JSON-LD:
{
"@context": "https://schema.org",
"@type": "Person",
"name": "Mattt",
"url": "https://mat.tt"
}
A tool that returns a list, such as contacts_search,
returns a JSON-LD document that holds the list in @graph
under a single @context.
To keep results short,
values nested in another value, including the values in a graph,
leave out @type.
Schema.org provides standard vocabularies for people, postal addresses, events, and many other objects we want to represent. And JSON-LD is a convenient encoding format for humans, AI, and conventional software alike.
For this project, we created Ontology: a Swift package for working with structured data. It includes convenience initializers for types from Apple frameworks, such as those returned by iMCP tools.
iMCP Helper
Apple doesn't make the HomeKit framework available to native macOS apps,
only to Mac Catalyst apps.
So the Home service runs in a separate Catalyst app,
iMCP Helper.
Apple doesn't allow HomeKit in Developer ID apps,
so iMCP's release build doesn't include the helper.
Build and install it with your own Apple Developer account:
git clone https://github.com/mattt/iMCP.git
cd iMCP
Scripts/install-helper.sh
The script signs the helper with your team's development certificate
and installs it in /Applications.
Run it with --help to choose another team, bundle ID, or install directory.
Xcode must be signed in to your account (Xcode > Settings > Accounts),
and the helper runs only on Macs registered to your team.
Whether free personal teams can use HomeKit isn't verified.
Then turn on Home in iMCP.
iMCP finds the helper in /Applications.
If you installed it somewhere else,
iMCP asks you to choose it when you turn on Home,
or you can choose it in Settings > Home.
When you enable Home,
iMCP launches the helper if it isn't running,
and the helper asks for HomeKit access.
The first time, the helper's window shows an eight-character pairing code,
such as 7KQ2-M9XD, and numbered steps:
click Copy Code,
click Open iMCP… to open iMCP's Pair with iMCP Helper window,
then paste the code and click Pair.
The button opens the URL imcp://pair, which carries no data;
iMCP only opens its pairing window for it.
The helper opens that URL only with the app that has iMCP's bundle ID, co.dododo.iMCP,
preferring the running copy, and not with a copy that doesn't declare the imcp scheme;
otherwise, for example if you built iMCP with another bundle ID,
the helper tells you to choose Pair… in Settings > Home instead.
If the helper's window is behind other windows,
click Open iMCP Helper… in iMCP's window.
The code works once:
when you pair, iMCP sends the helper a new random key,
and both apps keep that key in their keychains.
After five wrong codes, the helper shows a new one.
To pair again, click Pair Again… in the helper's window and confirm;
the helper ends iMCP's connection and shows a new code and the same steps.
The helper keeps running after iMCP quits;
choose Quit iMCP Helper from its app menu, or press Command-Q, to stop it.
The window also reports startup and permission errors.
The Mac's iCloud account must have access to the home,
and writes can require the owner or administrator role.
Sparkle updates iMCP but not the helper. After an iMCP update, rebuild the helper from the tag that matches the new version:
git fetch --tags
git checkout <version>
Scripts/install-helper.sh
A helper from an older version may not match the app's Home tools.
The helper's development certificate and provisioning profile expire. Each is usually valid for one year, but the certificate can expire first. To read the profile's expiration date, run:
security cms -D -i "/Applications/iMCP Helper.app/Contents/embedded.provisionprofile" |
plutil -extract ExpirationDate raw -o - -
To read the certificate's expiration date, run:
codesign -d --extract-certificates=/tmp/imcp-helper-cert "/Applications/iMCP Helper.app"
openssl x509 -inform DER -in /tmp/imcp-helper-cert0 -noout -enddate
After the earlier of the two dates, the helper may stop launching.
Run Scripts/install-helper.sh again to renew it;
the script lets Xcode create a new certificate and profile
when the old ones have expired.
On the first run, provisioning can fail with "PLA Update available".
The team's Account Holder must accept the latest Program License Agreement
in the Apple Developer account.
If you can't write to /Applications (for example, as a non-admin user),
the install can fail with a permission error.
Run the script with --destination ~/Applications instead.
iMCP then asks you to choose the helper.
Both apps compile the same tool definitions from
Shared/Home/HomeTools.swift.
The helper implements them with HomeKit;
the app forwards each call over an MCP connection on the loopback interface,
so the usual service and per-tool switches apply.
Object IDs are HomeKit UUID strings.
Inventory tools return live characteristic values only when include_values is true,
with a five-second timeout and at most four outstanding HomeKit reads.
After a lost connection, read-only calls retry once.
Writes are not repeated, because HomeKit may have applied them already;
the error asks the caller to inspect the home before retrying.
The helper advertises "_imcp-helper._tcp" on the local-only DNS-SD interface,
and iMCP finds it there, whether or not iMCP launched it.
If more than one helper is running,
iMCP tries the one at the chosen location first, then the others.
Connections use TLS with the key from pairing as a pre-shared key,
so a connection without the key fails the TLS handshake.
The cipher suite adds an ECDHE key exchange,
so a recorded connection stays secret even if the key or code is found later.
The pairing connection uses a key derived from the code with PBKDF2,
which makes each guess slow for a process
that advertises itself as the helper while you pair.
If you built the helper with an earlier version of iMCP,
quit it and rebuild it with Scripts/install-helper.sh;
iMCP refuses a helper that doesn't declare the current protocol version.
With Home turned on in iMCP,
uv run Scripts/check-home.py <path-to-imcp-server> runs a read-only
integration check through iMCP.
Building the helper
Building the iMCP scheme runs
Scripts/build-helper.sh,
which builds the iMCP Helper scheme for Mac Catalyst in its own
derived-data directory and copies the product into the app.
A direct target dependency selects the iOS variant of the helper,
so the nested build is required.
Release builds set EMBED_HOME_HELPER = NO and leave the helper out.
The HomeKit entitlement requires a development certificate and a
provisioning profile with the HomeKit capability.
So the helper uses automatic signing with team TTY35UM57S
in both Debug and Release, even though the native Debug app is unsigned.
To build with another team, change it in the helper target's
Signing & Capabilities tab.
The first Mac Catalyst build for a new bundle ID can fail with
"Entitlement com.apple.developer.homekit not found and could not be included in profile",
because automatic provisioning registers the capability only for the iOS destination.
Scripts/install-helper.sh handles this by building for iOS once and retrying.
To do it by hand, build the helper once for iOS to register it,
then build for Mac Catalyst:
xcodebuild -scheme "iMCP Helper" -destination "generic/platform=iOS" \
-allowProvisioningUpdates build
xcodebuild -scheme "iMCP Helper" -destination "platform=macOS,variant=Mac Catalyst" \
-allowProvisioningUpdates build
CI builds both apps unsigned, which checks compilation and packaging but can't access HomeKit:
xcodebuild -scheme iMCP -configuration Debug -destination "platform=macOS" \
CODE_SIGNING_ALLOWED=NO CODE_SIGNING_REQUIRED=NO \
HELPER_CODE_SIGNING_ALLOWED=NO build
Debugging
Allowing local network access
imcp-server finds the iMCP app with Bonjour,
so it needs permission to access the local network.
imcp-server has its own entry in
System Settings > Privacy & Security > Local Network,
separate from iMCP and from the app that runs it, such as your terminal.
If that entry is turned off,
imcp-server can't find the app
and reports that Bonjour service discovery timed out.
Using the MCP Inspector
To debug interactions between iMCP and clients, you can use the inspector tool (requires Node.js):
Click
> "Copy server command to clipboard"
Open a terminal and run the following commands:
# Download and run inspector package on imcp-server npx @modelcontextprotocol/inspector [paste-copied-command] # Open inspector web app running locally open http://127.0.0.1:6274
Inspector lets you see all requests and responses between the client and the iMCP server, which is helpful for understanding how the protocol works.
Using Companion
Companion is a utility for testing and debugging your MCP servers (requires macOS 15 or later). It gives you an easy way to browse and interact with a server's prompts, resources, and tools. Here's how to connect it to iMCP:
- Click
> "Copy server command to clipboard"
- Download and open the Companion app
- Click the + button in the toolbar to add an MCP server
- Fill out the form:
- Enter "iMCP" as the name
- Select "STDIO" as the transport
- Paste the copied iMCP server command
- Click "Add Server"
Acknowledgments
- Justin Spahr-Summers (@jspahrsummers), David Soria Parra (@dsp-ant), and Ashwin Bhat (@ashwin-ant) for their work on MCP.
- Christopher Sardegna
(@ReagentX)
for reverse-engineering the
typedstreamformat used by the Messages app.
License
This project is available under the MIT license. See the LICENSE file for more info.
Legal
iMessage® is a registered trademark of Apple Inc. This project is not affiliated with, endorsed, or sponsored by Apple Inc.
Two peas, one chat
Chat with AI about iMCP
Opens a chat primed with iMCP’s README and setup docs from this page, or add it in Cursor to use its tools.
The Cursor button opens Cursor and asks before it adds the server. Fill in any keys it needs in Cursor’s MCP settings.
Peas in a pod
What are the alternatives to iMCP?
How iMCP lines up against its neighbours on the shelf. See every knowledge and work apps server.

iMCPThis pea
A Mac menu bar app that shares Calendar, Messages, Notes, Reminders and more with your assistant.
- Tools
- 56
- Runs on
- Your computer
- Licence
- MIT
- Stars
- 1.8K

One folder of Markdown that every agent on a team can read, with access rules.
- Tools
- 2
- Runs on
- Hosted
- Licence
- Apache-2.0
- Stars
- 1.7K

Records and transcribes meetings on your device, then lets an assistant search them.
- Tools
- 34
- Runs on
- Your computer
- Licence
- MIT
- Stars
- 1.6K

Ask an assistant about your Garmin activities, sleep, recovery and training.
- Tools
- 20
- Runs on
- Your computer
- Licence
- MIT
- Stars
- 1.4K
Notion's own server: search, read and update pages and databases.
- Tools
- 24
- Runs on
- Hosted or your computer
- Licence
- MIT
- Stars
- 4.7K

MCP Atlassian (Jira and Confluence)
Jira issues and Confluence pages, Cloud or self-hosted.
- Tools
- 98
- Runs on
- Your computer
- Licence
- MIT
- Stars
- 6K
Something wrong on this page? Tell us.