Apple Contacts MCP
A local-first MCP server for safely managing Apple Contacts on macOS via AppleScript automation. All write operations are dry-run by default.
contacts_status– Verify Contacts.app accessibility and retrieve aggregate counts without exposing personal data.search_contacts– Find contacts by name, organization, job title, email, or phone number; control whether actual values are revealed in results (max 25 results per query).create_contact– Add a new contact with fields like first/last name, nickname, organization, job title, department, emails, and phones. RequiresdryRun: falseandconfirm: truefor actual creation.update_contact– Modify scalar fields, notes, or add email/phone values to an existing contact by ID. RequiresdryRun: falseandconfirm: truefor actual updates.append_contact_note– Append a dated, structured interaction log entry to a contact's notes field (CRM-style), without overwriting existing notes.delete_contact– Remove a contact by ID. Requiresconfirm: trueand the confirmation phrase"delete contact"for safety.test_roundtrip– Run a full end-to-end test (create → edit → verify → delete) using a dummy contact to validate permissions and setup without touching real data.
Allows searching, creating, updating, and deleting contacts in the Apple Contacts app on macOS.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Apple Contacts MCPsearch for John Doe's phone number"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Apple Contacts MCP
Local-first MCP server for safely searching, editing, and maintaining Apple Contacts notes on macOS.
The server uses Contacts.app automation through AppleScript today. That keeps install simple and uses macOS privacy prompts instead of cloud credentials. Writes are dry-run by default and require explicit confirmation.
Tools
contacts_status: check Contacts.app access and return aggregate counts.search_contacts: search local contacts by name, organization, job title, email, or phone.create_contact: create a contact. Dry-run by default.update_contact: update scalar fields, notes, or add email/phone values. Dry-run by default.append_contact_note: append a dated interaction log entry to a contact note. Dry-run by default.delete_contact: delete a contact. Dry-run by default and requires a confirmation phrase.test_roundtrip: create, edit, verify, and delete one dummy contact.
Related MCP server: iMCP
Requirements
macOS with Contacts.app
Node.js 18 or newer
Contacts/Automation permissions when macOS prompts
Quick Start
git clone <repo-url>
cd apple-contacts-mcp
npm test
npm run smokenpm run smoke verifies the MCP handshake and tool list without touching Contacts.
To run a live dummy create/edit/note/delete roundtrip:
npm run smoke:livemacOS may prompt for Contacts or Automation permissions. The live smoke test creates one dummy contact, edits it, appends a note, verifies the change, and deletes the dummy.
Install For Your Agent
This is a stdio MCP server. Any MCP-capable agent needs the same command:
node /absolute/path/to/apple-contacts-mcp/bin/apple-contacts-mcp.cjsUse an absolute path. Relative paths are easy to break when an agent launches MCP servers from another working directory.
Install In Codex
After cloning:
codex mcp add apple-contacts -- node /absolute/path/to/apple-contacts-mcp/bin/apple-contacts-mcp.cjsThen restart Codex or start a new Codex thread so the MCP tools are loaded.
To confirm the server is registered:
codex mcp listAsk Codex:
Use apple-contacts to run contacts_status.Install In Claude Desktop
Open the Claude Desktop config file on macOS:
open "$HOME/Library/Application Support/Claude/claude_desktop_config.json"Add this under the top-level mcpServers object, then restart Claude Desktop:
{
"mcpServers": {
"apple-contacts": {
"command": "node",
"args": ["/absolute/path/to/apple-contacts-mcp/bin/apple-contacts-mcp.cjs"]
}
}
}If the file already has other MCP servers, add only the apple-contacts entry inside the existing mcpServers object.
Ask Claude:
Use the Apple Contacts MCP server to run contacts_status. Do not show any contact values.Install In Other Agents
Add a stdio MCP server with:
{
"mcpServers": {
"apple-contacts": {
"command": "node",
"args": ["/absolute/path/to/apple-contacts-mcp/bin/apple-contacts-mcp.cjs"]
}
}
}If your agent has an MCP CLI, use its equivalent of:
<agent> mcp add apple-contacts -- node /absolute/path/to/apple-contacts-mcp/bin/apple-contacts-mcp.cjsGood first prompt for any agent:
Install this repository as a local MCP server named apple-contacts. Use the absolute path to bin/apple-contacts-mcp.cjs, then restart or reload your MCP tools and run contacts_status. Treat contact data as personal data and keep writes dry-run unless I explicitly approve them.Permissions
This server automates Contacts.app locally. The first live call may trigger macOS permission prompts for Contacts and/or Automation. Approve those prompts for the terminal or app that is launching the MCP server.
If a call fails because Contacts.app is not running, open Contacts and retry:
open -a ContactsWrite Safety
Create, update, and delete operations are dry-run by default. An actual write must pass both:
{
"dryRun": false,
"confirm": true
}Delete also requires:
{
"confirmPhrase": "delete contact"
}This gives agents a natural two-step flow: propose the change first, then apply only after user approval.
Contact Notes
Use append_contact_note for CRM-style interaction logs instead of overwriting the full note field.
Input:
{
"contactId": "CONTACT-ID-FROM-search_contacts",
"date": "2026-06-04",
"summary": "Met at an AI founder dinner. They are interested in local-first agent tooling.",
"openThreads": [
"Send the GitHub repo",
"Follow up about a demo next week"
],
"dryRun": true
}The appended note entry uses:
- 2026-06-04 - Met at an AI founder dinner. They are interested in local-first agent tooling.
Open threads: Send the GitHub repo; Follow up about a demo next weekAn actual append requires:
{
"dryRun": false,
"confirm": true
}Privacy
This server runs locally on your Mac. It does not call a cloud API or upload contacts on its own. Your agent will still see whatever contact data you ask the MCP server to return, so use field filters and redaction when possible.
Contacts may sync through iCloud, Google, Exchange, or another configured account. A local write can propagate to those services.
Current Backend
The first backend is AppleScript automation of Contacts.app. A future backend may use a signed Swift helper around Apple's Contacts.framework for more structured access.
Direct SQLite writes to ~/Library/Application Support/AddressBook are intentionally not supported.
License
MIT
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/lu-wo/apple-contacts-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server