Skip to main content
Glama

macos-mcp Platform: macOS License: MIT

macOS에서 AI 에이전트 또는 셸에서 Reminders, Calendar, Notes, Mail, Messages, Contacts를 제어합니다.

Apple은 이 앱들에 대해 세 가지 자동화 표면을 제공하지만, 각각은 어딘가에서 실패합니다. EventKit은 Notes, Mail, Messages, Contacts에 접근하지 못합니다. JXA로 Messages를 읽으면 Sonoma 이상에서 아무것도 반환되지 않습니다. JXA로 Mail을 읽으면 실제 받은 편지함에서 60초에 타임아웃됩니다. 이 프로젝트는 앱별로 작동하는 브리지를 사용하며, 그 이유는 DECISION.md에 문서화되어 있습니다.

읽기

쓰기

Reminders

EventKit (Swift)

EventKit (Swift)

Calendar

EventKit (Swift)

EventKit (Swift)

Notes

JXA

JXA

Contacts

JXA

JXA

Mail

SQLite (Envelope Index)

JXA

Messages

SQLite (chat.db)

JXA

Mac이 필요합니다. 이 브리지들은 EventKit, Apple Events, 그리고 로컬 Apple 데이터베이스의 SQLite 읽기입니다. Linux, Windows, iOS, Android 또는 브라우저 빌드는 없습니다.

세 가지 사용 방법

MCP 서버로. 로컬 stdio 전송을 사용하며, 같은 Mac의 모든 MCP 지원 클라이언트(Claude Code, Claude Desktop, Cursor, Zed, Continue, ChatGPT 데스크톱)에서 작동합니다. 8개의 도구가 있으며, 도구 아래에 나열되어 있습니다.

에이전트 스킬로. 동일한 브리지를 셸 명령으로 호출하며, 컨텍스트에 도구 스키마가 로드되지 않습니다. MCP 서버는 세션이 Mac 앱을 건드리지 않더라도 세션 시작 시 8개의 도구 정의를 모두 모델 앞에 배치합니다. 스킬은 트리거가 발생할 때까지 설명 한 줄에 불과합니다. 스킬은 skills/macos/에서, 선택 방법은 docs/mcp-vs-skill.md에서 확인하세요.

CLI로. EventKitCLI는 stdout에 JSON을 출력하는 독립형 Swift 바이너리입니다. 스킬의 JXA 및 SQLite 레시피는 셸이 있는 곳이라면 어디서든 실행됩니다.

Related MCP server: Apple MCP

빠른 시작

Claude Code 플러그인으로 설치

/plugin marketplace add krmj22/macos-mcp
/plugin install macos-mcp@krmj22-plugins

Claude Code 내에서 실행하세요. 플러그인은 npx -y mcp-macos를 통해 MCP 서버를 연결하므로 별도의 설치 단계가 필요하지 않습니다.

npm에서 설치

npm install -g mcp-macos
# or use npx via your client's MCP config (no global install needed)

또는 MCPB(Claude Desktop)로 설치

최신 GitHub 릴리스에서 .mcpb 번들을 다운로드하여 Claude Desktop에 끌어다 놓으세요. 번들에는 사전 빌드된 유니버설 Swift 바이너리(arm64 + x86_64)가 포함되어 있어 Xcode Command Line Tools가 필요하지 않습니다.

또는 소스에서 빌드

git clone https://github.com/krmj22/macos-mcp.git
cd macos-mcp
pnpm install
pnpm build

설정 확인

macos-mcp --check   # or: node dist/index.js --check

macOS 버전, Node.js, EventKit 바이너리, Full Disk Access, JXA 자동화 권한을 확인합니다.

또는 서버 대신 스킬로 사용

스킬을 에이전트의 스킬 디렉터리에 복사하세요. MCP 서버도, 컨텍스트의 도구 스키마도 필요 없습니다.

git clone https://github.com/krmj22/macos-mcp.git
cp -R macos-mcp/skills/macos ~/.claude/skills/macos

스킬은 EventKitCLI, osascript, sqlite3을 직접 호출하므로 Swift 바이너리가 PATH에 있어야 합니다:

cd "$(mktemp -d)" && npm i mcp-macos --no-save \
  && mkdir -p ~/.local/lib/mcp-macos/bin \
  && cp node_modules/mcp-macos/bin/EventKitCLI ~/.local/lib/mcp-macos/bin/EventKitCLI \
  && ln -sf ~/.local/lib/mcp-macos/bin/EventKitCLI ~/.local/bin/EventKitCLI

어느 쪽이든 동일한 권한이 적용됩니다. 권한을 참조하세요.

도구

도구

브리지

작업

reminders_tasks

Reminders

EventKit

읽기, 생성, 업데이트, 삭제

reminders_lists

Reminders

EventKit

읽기, 생성, 업데이트, 삭제

calendar_events

Calendar

EventKit

읽기, 생성, 업데이트, 삭제

calendar_calendars

Calendar

EventKit

읽기

notes_items

Notes

JXA

읽기, 생성, 업데이트, 삭제

notes_folders

Notes

JXA

읽기, 생성

mail_messages

Mail

SQLite + JXA

읽기, 생성, 업데이트, 삭제

messages_chat

Messages

SQLite + JXA

읽기, 생성

contacts_people

Contacts

JXA

읽기, 검색, 생성, 업데이트, 삭제

밑줄(reminders_tasks)과 점(reminders.tasks) 표기법 모두 작동합니다.

설계 노트

  • 읽기는 SQLite, 쓰기는 JXA. JXA로 Mail을 읽는 것은 확장이 불가능하여 실제 받은 편지함에서 60초 타임아웃이 발생하고, JXA로 Messages를 읽는 것은 macOS Sonoma 이상에서 완전히 깨져 있습니다. 이 프로젝트는 chat.db와 Mail의 Envelope Index를 직접 읽으며, [Gmail]/All Mail 계정의 Gmail labels 조인 테이블도 포함합니다. 쓰기는 여전히 JXA를 통해 이루어지는데, Apple Events가 이를 트리거하는 유일한 API이기 때문입니다. ADR-001을 참조하세요.

  • 앱별 하이브리드 백엔드. 각 앱은 작동하는 브리지를 사용합니다: Reminders와 Calendar는 EventKit을 통한 Swift CLI, Notes, Contacts, Mail 쓰기와 Messages 전송은 JXA, Mail과 Messages 읽기는 SQLite입니다. 아키텍처 다이어그램에 팬아웃이 나와 있습니다.

  • 도구 간 연락처 강화. 공유 레이어가 Messages, Mail, Calendar 전반에서 원시 전화번호와 이메일 주소를 연락처 이름으로 해석합니다. SQLite AddressBook 저장소를 통한 대량 캐시는 1,100개 항목에 대해 50ms 미만이며, JXA whose()를 통한 대상 조회도 지원합니다. ADR-002를 참조하세요.

  • 사전 점검. macos-mcp --check는 런타임 전에 macOS 버전, Node.js, EventKit 바이너리, Full Disk Access, JXA 권한을 검증하고, 실패한 항목에 대해 관련 시스템 설정 창으로의 딥 링크를 제공합니다.

설정

사전 요구 사항

  • Node.js 20+

  • macOS

  • Xcode Command Line Tools (Swift 컴파일)

클라이언트 구성

JSON 구성은 모든 클라이언트에서 동일합니다. 위치만 다릅니다.

{
  "mcpServers": {
    "macos-mcp": {
      "command": "npx",
      "args": ["mcp-macos"]
    }
  }
}

클라이언트

구성 위치

Claude Desktop

claude_desktop_config.json

Cursor

설정 > MCP > 새 전역 MCP 서버 추가

Claude Code

프로젝트 루트의 .mcp.json

권한

macOS는 첫 사용 시 접근을 요청합니다. 메시지가 표시되면 허용을 클릭하세요.

권한

시스템 설정 경로

Reminders

전체 접근

개인정보 보호 및 보안 > Reminders

Calendar

전체 접근

개인정보 보호 및 보안 > 캘린더

Notes

자동화

개인정보 보호 및 보안 > 자동화 > Notes

Mail

자동화 + 전체 디스크 접근

두 위치 모두

Messages

자동화 + 전체 디스크 접근

두 위치 모두

Contacts

자동화

개인정보 보호 및 보안 > 자동화 > Contacts

Messages와 Mail은 SQLite 데이터베이스를 직접 읽으므로 터미널 앱(Terminal, iTerm2 등)에 전체 디스크 접근 권한이 필요합니다.

macos-mcp --check를 실행하여 확인하세요. 실패하는 항목이 있으면 문제 해결을 참조하세요.

문제 해결

빠른 수정 명령

# Open specific settings panes
open "x-apple.systempreferences:com.apple.preference.security?Privacy_Reminders"
open "x-apple.systempreferences:com.apple.preference.security?Privacy_Calendars"
open "x-apple.systempreferences:com.apple.preference.security?Privacy_Automation"
open "x-apple.systempreferences:com.apple.preference.security?Privacy_AllFiles"

전체 디스크 접근 (Messages 및 Mail)

Messages와 Mail은 SQLite 데이터베이스(~/Library/Messages/chat.db~/Library/Mail/V10/MailData/Envelope Index)를 읽습니다. 터미널 앱에 전체 디스크 접근 권한이 필요합니다.

# Find your real node binary (version managers use shims)
node -e "console.log(process.execPath)"

# Reveal it in Finder for drag-and-drop into FDA settings
open -R "$(node -e "console.log(process.execPath)")"

# Open Full Disk Access settings
open "x-apple.systempreferences:com.apple.preference.security?Privacy_AllFiles"

버전 관리자 사용자(Volta, nvm, fnm): node 명령은 심(shim)입니다. 시스템 설정에는 실제 바이너리가 필요합니다:

관리자

실제 바이너리 찾기

Volta

volta which node

nvm

nvm which current

fnm

fnm exec -- node -e "console.log(process.execPath)"

시스템 설정은 숨김 디렉터리의 바이너리를 표시하지 않을 수 있습니다. 위의 open -R을 사용하여 Finder에서 표시한 후 FDA 목록으로 끌어다 놓으세요.

JXA 자동화 (Notes, Mail, Contacts)

첫 사용 시 macOS가 자동화 접근을 요청합니다. 시스템 설정 > 개인정보 보호 및 보안 > 자동화에서 허용하세요.

권한 확인:

osascript -l JavaScript -e 'Application("Contacts").people().length'
osascript -l JavaScript -e 'Application("Calendar").calendars().length'
osascript -l JavaScript -e 'Application("Reminders").defaultList().name()'
osascript -l JavaScript -e 'Application("Mail").inbox().messages().length'
osascript -l JavaScript -e 'Application("Notes").notes().length'

각 명령은 값을 반환해야 합니다. 멈춤은 권한 대화상자가 표시되려고 시도(하고 실패)하고 있음을 의미합니다.

Gmail 라벨 / 받은 편지함 메시지 누락

Gmail은 모든 메시지를 [Gmail]/All Mail에 저장하고 라벨을 사용하여 폴더 구성을 처리합니다. 서버는 직접 사서함과 라벨 조인 테이블을 모두 확인합니다. Gmail 받은 편지함 메시지가 누락된 경우 Mail 앱이 완전히 동기화되었는지 확인하세요.

개발

pnpm install          # Install dependencies
pnpm build            # Build TypeScript + Swift binary
pnpm test             # Run full test suite
pnpm lint             # Lint and format (Biome + TypeScript)
pnpm dev              # Run from source via tsx

프로덕션 진입점(bin/run.cjs)은 pnpm build가 필요합니다. 로컬 개발에는 pnpm dev를 사용하세요.

아키텍처

flowchart LR
    Client[MCP Client<br/>Claude Code, Cursor, Desktop] -->|stdio| Server[macos-mcp]

    Server --> Swift[Swift CLI]
    Server --> JXA[JXA]
    Server --> SQLite[SQLite Readers]

    Swift -->|EventKit| Reminders[Reminders]
    Swift -->|EventKit| Calendar[Calendar]

    JXA -->|Apple Events| Notes[Notes]
    JXA -->|Apple Events| Contacts[Contacts]
    JXA -->|writes only| Mail[Mail]
    JXA -->|send only| Messages[Messages]

    SQLite -->|Envelope Index| Mail
    SQLite -->|chat.db| Messages
    SQLite -->|AddressBook| Enrich[Contact<br/>Enrichment Cache]

Apple 앱에 대한 세 가지 브리지:

  • EventKit (Swift 바이너리). Reminders, Calendar. 컴파일된 Swift CLI로 JSON을 반환합니다.

  • JXA. Notes, Mail 쓰기, Contacts. osascript -l JavaScript를 통해 실행되는 스크립트.

  • SQLite. Messages 읽기(~/Library/Messages/chat.db), Mail 읽기(~/Library/Mail/V10/MailData/Envelope Index). JXA 메시지 읽기는 Sonoma 이상에서 깨져 있습니다. JXA 메일 읽기는 실제 받은 편지함에 너무 느립니다.

Mail과 Messages는 하이브리드 경로를 사용합니다: 쓰기는 JXA(보내기/임시보관을 트리거하는 유일한 방법), 읽기는 SQLite(확장이 가능한 유일한 방법)입니다. 아키텍처 결정 기록은 DECISION.md를 참조하세요.

의존성

런타임: @modelcontextprotocol/sdk, zod

개발: typescript, tsx, jest, @biomejs/biome

크레딧

MCP 서버 레이어는 FradSer/mcp-server-apple-events(MIT)에서 시작되었습니다. EventKit Swift CLI, SQLite 읽기 경로, 연락처 강화, 사전 점검, 스킬 표면은 여기에서 추가되었습니다.

라이선스

MIT

기여

CONTRIBUTING.md를 참조하세요.

Tool Schema Changelog

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

No tool schema history has been recorded yet.

Maintenance

ActivityMaintained
ResponsivenessResponsive

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
    B
    quality
    D
    maintenance
    Enables AI agents to interact with macOS applications (Finder, Mail, Contacts, Reminders, Notes, Calendar, TextEdit) using AppleScript. Allows AI assistants to perform tasks like searching contacts, managing files, checking email, and creating reminders through natural language.
    24
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI interaction with native macOS applications including Messages, Notes, Mail, Calendar, and Maps through natural language. It allows users to automate tasks like sending messages, managing contacts, and scheduling events across the Apple ecosystem.
    192
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    A collection of MCP servers for Apple macOS apps (Mail, Contacts, Notes, Memory, Messages, Calendar, Reminders) enabling AI assistants to read, search, create, and update data via JXA, SQLite, and EventKit.
    24
    MIT

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

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