Skip to main content
Glama
jcontini

macOS Contacts MCP

by jcontini

macOS Contacts for MCP

Connect your macOS Contacts app to AI assistants like Claude Desktop and Cursor. Search, view, and manage your contacts directly through conversations using your local Contacts data.

What This Does

  • Search your contacts by name or company

  • View full contact details including emails, phones, and social links

  • Add new contacts with notes, social media profiles (LinkedIn, Twitter, GitHub, etc.)

  • Update existing contacts with new information and social links

  • Browse recent contacts to see who you've added or modified

Works with your local macOS Contacts app - no need to sync with external services.

Related MCP server: Apple MCP

Setup Instructions

1. Get the Code

git clone https://github.com/jcontini/macos-contacts-mcp.git
cd macos-contacts-mcp
npm install && npm run build

2. Add to Your AI Assistant

Add this configuration to your MCP client:

{
  "mcpServers": {
    "macos-contacts": {
      "command": "node",
      "args": ["/path/to/your/macos-contacts-mcp/build/index.js"]
    }
  }
}

3. Grant Permissions

When you first use the contacts features, macOS will ask for permission:

  1. Contacts Access: Allow your AI assistant to access Contacts

  2. Automation Permission: Allow the app to control Contacts

You can also set these manually in System Settings → Privacy & Security → Contacts and Automation.

4. Restart Your Assistant

Close and reopen your AI assistant to load the new connection.

Using It

Once set up, you can ask your AI assistant things like:

  • "Find my contacts at Google"

  • "Show me John's contact details and social links"

  • "Add a new contact for Jane Smith with her LinkedIn profile"

  • "Who did I add to contacts this week?"

  • "Update John's job title and add his GitHub profile"

Social Media Support

You can store and manage social media profiles for contacts:

  • LinkedIn profiles

  • Twitter/X accounts

  • GitHub profiles

  • Facebook profiles

  • Any other websites or social links

Troubleshooting

"Contact not found" errors: Make sure the contact exists in your Contacts app with the exact name you're searching for.

Permission errors: Check System Settings → Privacy & Security and make sure your AI assistant has access to Contacts and Automation.

Server won't start: Make sure you ran npm install && npm run build and the path in your configuration is correct.

Requirements

  • macOS with the Contacts app

  • Node.js (any recent version)

  • An MCP-compatible AI assistant

Works with Claude Desktop, Cursor, and any other app that supports the Model Context Protocol.

Future Plans

We're working on easier distribution methods to eliminate the need for manual installation:

Desktop Extensions (.dxt)

Claude Desktop now supports one-click installation via Desktop Extensions. We plan to package this server as a .dxt file for:

  • No manual setup - double-click to install

  • No dependencies - Claude Desktop includes Node.js runtime

  • Automatic updates - seamless version management

  • Curated directory - discover through Claude Desktop's extension marketplace

NPM Distribution

For developers who prefer package managers:

  • NPX support: npx macos-contacts-mcp for instant usage

  • Global installation: npm install -g macos-contacts-mcp

  • Version management: Easy updates via npm

MCP Directory Listings

We're submitting to major MCP directories for better discoverability:

These improvements will make installation as simple as a single click or command while maintaining the same powerful local contact management capabilities.

TODO: LLM-Friendly Improvements

Based on real-world usage with LLMs, the following improvements would make this MCP more robust:

Graceful Error Handling

  • Issue: AppleScript syntax errors don't provide helpful feedback to LLMs about what went wrong

  • Solution: Catch AppleScript errors and translate them into actionable error messages

  • Why: Better error messages help LLMs understand and retry with corrected inputs

Available Tools

5 tools
create_contactC

Create a new contact

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesFull name of the contact
organizationNoOrganization or company name
job_titleNoJob title or position
emailsNoEmail addresses
phonesNoPhone numbers
urlsNoURLs (social media, websites, etc.) with labels
noteNoNotes about the contact

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. 'Create a new contact' implies a write operation but doesn't specify permissions needed, whether duplicates are allowed, error conditions, or what happens on success. This is inadequate for a mutation tool with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with no wasted words. It's front-loaded and directly states the tool's purpose, making it easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with 7 parameters, no annotations, and no output schema, the description is incomplete. It lacks behavioral context, usage guidelines, and any indication of what the tool returns, leaving significant gaps for an AI agent to operate effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all 7 parameters. The description adds no additional meaning beyond the schema, such as explaining relationships between parameters or usage examples. Baseline 3 is appropriate when the schema does all the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Create') and resource ('contact'), making the purpose immediately understandable. It doesn't differentiate from sibling tools like 'update_contact' or specify what makes a 'new' contact distinct, which prevents a perfect score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like 'update_contact' or 'get_contact'. It doesn't mention prerequisites, such as when a contact might already exist, leaving the agent to infer usage from context alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_contactB

Get full contact details by name or ID

ParametersJSON Schema
NameRequiredDescriptionDefault
identifierYesContact name or unique ID

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states it 'Get[s] full contact details', implying a read-only operation, but does not address potential side effects, error conditions, authentication needs, rate limits, or return format. For a tool with zero annotation coverage, this is a significant gap in transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that directly states the tool's purpose without redundancy. It is front-loaded with the core action and resource, making it easy to parse, and every word earns its place by specifying key details like 'full contact details' and 'by name or ID'.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity (single parameter, no output schema, no annotations), the description is minimally adequate. It covers the basic purpose but lacks behavioral context, usage guidelines, and output details, which are needed for a complete understanding. Without annotations or output schema, the description should do more to compensate, but it meets the bare minimum for a simple retrieval tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with the parameter 'identifier' documented as 'Contact name or unique ID'. The description adds no additional meaning beyond this, such as format examples, validation rules, or disambiguation between name and ID. With high schema coverage, the baseline score of 3 is appropriate, as the description does not compensate but also does not detract.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Get') and resource ('full contact details'), specifying it retrieves information by name or ID. It distinguishes from siblings like 'create_contact' (creation) and 'update_contact' (modification), but does not explicitly differentiate from 'get_recent_contacts' (which likely retrieves multiple recent contacts) or 'search_contacts' (which may allow broader queries).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like 'get_recent_contacts' or 'search_contacts'. It implies usage for retrieving a single contact by identifier, but does not specify scenarios, exclusions, or prerequisites, leaving the agent to infer based on tool names alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_recent_contactsC

Get contacts created or modified within a date range

ParametersJSON Schema
NameRequiredDescriptionDefault
days_backNoNumber of days back to search
typeNoType of date to filter bymodified
limitNoMaximum number of results to return

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool retrieves contacts based on date criteria but doesn't mention important behaviors like whether it's read-only (implied by 'Get'), pagination details beyond the 'limit' parameter, error handling, or performance considerations. The description is minimal and lacks context about what the tool actually does beyond the basic filter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that front-loads the core purpose without any wasted words. It directly communicates what the tool does in a clear and concise manner.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and no output schema, the description is incomplete for a tool with 3 parameters and behavioral implications. It doesn't explain what the return values look like (e.g., list of contacts with fields), error cases, or how it interacts with sibling tools. For a retrieval tool with date filtering, more context is needed to guide effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description adds no additional meaning beyond implying date-range filtering, which is already covered in the schema. This meets the baseline of 3 for high schema coverage without extra param info in the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Get contacts') and scope ('created or modified within a date range'), providing a specific verb+resource combination. However, it doesn't explicitly differentiate from sibling tools like 'get_contact' (singular) or 'search_contacts', which might offer different filtering capabilities or scopes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like 'get_contact' or 'search_contacts'. It mentions a date range filter but doesn't specify if this is the primary method for retrieving recent contacts or if other tools might be better for different use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_contactsC

Search for contacts by name, organization, or notes

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoSearch term to match against name, organization, or notes
limitNoMaximum number of results to return

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the search functionality but lacks details on permissions, rate limits, pagination, or what happens on no matches. For a search tool with zero annotation coverage, this leaves significant gaps in understanding its operational behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that directly states the tool's purpose without any wasted words. It is appropriately sized and front-loaded, making it easy to understand at a glance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of a search tool with no annotations and no output schema, the description is incomplete. It doesn't explain the return format, error handling, or how results are structured, leaving the agent with insufficient information to fully utilize the tool effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, so the input schema already documents both parameters ('query' and 'limit') thoroughly. The description adds marginal value by listing the searchable fields ('name, organization, or notes'), which aligns with the schema's description for 'query', but doesn't provide additional syntax or format details beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Search for contacts') and the searchable fields ('by name, organization, or notes'), which provides a specific verb+resource. However, it doesn't explicitly differentiate from sibling tools like 'get_recent_contacts' or 'get_contact', which might also retrieve contacts but through different mechanisms.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description offers no guidance on when to use this tool versus alternatives. It doesn't mention when to prefer 'search_contacts' over 'get_recent_contacts' (for recent items) or 'get_contact' (for specific IDs), nor does it provide any context about prerequisites or exclusions for usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_contactC

Update an existing contact

ParametersJSON Schema
NameRequiredDescriptionDefault
identifierYesContact name or unique ID
nameNoUpdated full name
organizationNoUpdated organization or company name
job_titleNoUpdated job title or position
emailsNoUpdated email addresses (replaces all existing)
phonesNoUpdated phone numbers (replaces all existing)
urlsNoUpdated URLs (replaces all existing)
noteNoUpdated notes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. While 'Update an existing contact' implies a mutation operation, it doesn't specify what happens to fields not included in the update (partial vs. full replacement), whether the operation is idempotent, what permissions are required, or what the response looks like. This is inadequate for a mutation tool with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that communicates the core purpose without any wasted words. It's appropriately sized and front-loaded, making it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with 8 parameters, no annotations, and no output schema, the description is insufficient. It doesn't explain what happens on success/failure, how partial updates work, or provide any behavioral context beyond the basic action. The high schema coverage helps with parameters, but the overall context for safe and correct usage is lacking.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds no parameter information beyond what's already in the schema, which has 100% coverage with detailed descriptions for each parameter. According to the rules, when schema_description_coverage is high (>80%), the baseline is 3 even with no param info in the description, which applies here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Update') and target resource ('an existing contact'), making the purpose immediately understandable. However, it doesn't differentiate this tool from its sibling 'create_contact' beyond the 'existing' qualifier, which is why it doesn't reach a perfect score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like 'create_contact' or 'get_contact'. There's no mention of prerequisites, error conditions, or contextual factors that would help an agent choose appropriately among the sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 5 tool updates
    • First observedcreate_contact
    • First observedget_contact
    • First observedget_recent_contacts
    • First observedsearch_contacts
    • First observedupdate_contact

TDQS

A3.5/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose with no overlap: create, get by ID/name, get by recency, search by attributes, and update. The descriptions make it unambiguous which tool to use for each operation, preventing misselection.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern (e.g., create_contact, get_contact, search_contacts) with no deviations in style or casing. This predictability makes the tool set easy to navigate and understand.

Tool Count5/5

With 5 tools, this server is well-scoped for managing contacts on macOS, covering essential operations without bloat. Each tool earns its place, providing a focused and efficient interface for the domain.

Completeness4/5

The tool set covers most core CRUD operations (create, get, update) and useful queries (search, recent), but lacks a delete_contact tool, which is a minor gap. Agents can still handle the domain effectively, though deletion would complete the lifecycle.

Maintenance

ActivityInactive
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to read iMessage history and send messages on macOS. Supports conversation listing, message search with keyword and semantic modes, contact lookup, and sending messages to existing conversations.
    13
    11
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Gives AI assistants access to Google Contacts, supporting listing, searching, creating, updating, and deleting contacts, as well as searching Google Workspace directories.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to manage contacts with full CRUD, dedup, merge, import/export, sync with Google/Apple/CardDAV, and git-backed rollback.
    11
    AGPL 3.0

Latest Blog Posts

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/jcontini/macos-contacts-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server