Personal MCP server for Apple Calendar and Reminders via EventKit
Server has 25 tools with consistent naming (verb_noun pattern) and descriptions in Korean. All tools have input schemas with type definitions and parameter descriptions. However, descriptions are often terse (many under 100 chars), output schemas are not formally documented, and error handling is generic ('success': false with error codes but limited recovery guidance). Tool composition is sound, tools are single-responsibility and chainable via IDs. Security is reasonable (no secrets in params, permission checks present). Naming is clear and action-oriented, but some parameter descriptions lack format/constraint details (e.g., date formats, enum values for 'span' and 'priority').
지정 기간(기본=오늘)의 이벤트와 마감 미리 알림을 한눈에 보는 보드. 메트릭 카드와 검색·정렬이 가능한 표로 요약합니다. 읽기 전용이며, 캘린더/미리 알림 접근 권한이 필요합니다.
새 캘린더 이벤트를 생성합니다.
캘린더 이벤트를 삭제합니다.
기존 캘린더 이벤트를 수정합니다.
특정 캘린더 이벤트의 상세 정보를 가져옵니다.
사용 가능한 모든 캘린더를 나열합니다. 이벤트 생성 시 사용할 수 있는 캘린더 목록을 반환합니다.
지정한 날짜 범위 내의 캘린더 이벤트를 나열합니다.
Output schemas not formally documented. Tools return dicts with 'success', 'error', and domain fields, but no JSON Schema definitions are visible in source. LLMs cannot reliably parse responses or plan downstream calls.
Parameter descriptions lack format/constraint details. 'span' parameter in edit/delete tools accepts 'this_event' or 'future_events' but description does not explicitly list enum values. 'priority' in reminders accepts 'none|low|medium|high' but not documented as enum.
Error responses are generic. All errors return {'success': false, 'error': <code>, 'message': <text>} but do not guide recovery. E.g., 'permission_denied' does not suggest calling eventkit_check_permissions or explain how to grant access.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
제목, 장소, notes에서 텍스트로 이벤트를 검색합니다.
새 일정을 등록하는 폼 UI를 엽니다. 제목·시작·종료·캘린더·장소·메모·종일·태그를 입력하는 폼을 대화 안에 렌더링합니다. 제출하면 캘린더에 이벤트가 생성됩니다.
캘린더와 미리 알림의 권한 상태를 확인합니다. 캘린더와 미리 알림 각각의 현재 인증 상태와, 권한이 필요한 경우 안내 문구를 함께 반환합니다.
미리 알림을 완료로 표시합니다.
새 미리 알림을 생성합니다.
미리 알림을 삭제합니다.
기존 미리 알림을 수정합니다.
특정 미리 알림의 상세 정보를 가져옵니다.
선택적 필터를 적용해 미리 알림을 나열합니다.
모든 미리 알림 목록을 나열합니다. 미리 알림 생성 시 사용할 수 있는 목록들을 반환합니다.
제목이나 notes에서 텍스트로 미리 알림을 검색합니다.
Claude Desktop을 종료하지 않고 이 서버 프로세스를 그 자리에서 재시작합니다. 짧은 지연 후 백그라운드 스레드에서 동일한 Python 프로세스 이미지를 os.execv로 다시 실행합니다. 지연을 두는 이유는 프로세스 이미지가 교체되기 전에 이 도구 호출 자체의 응답이 stdio 파이프로 먼저 전달될 시간을 주기 위함입니다. 파일 디스크립터(Claude Desktop과의 stdio 파이프)는 execv를 거쳐도 유지되지만, MCP/JSON-RPC 세션을 포함한 모든 메모리 상태는 새 프로세스이므로 초기화됩니다.
이 서버 프로세스의 pid, 버전, 가동 시간, 도구 개수를 보고합니다. server_restart 전후로 호출해서 재시작이 실제로 적용됐는지 (pid가 바뀌고 uptime이 ~0으로 초기화되는지) 확인할 수 있습니다.
이 서버 프로세스를 재실행 없이 완전히 정지시킵니다. server_restart와 달리 새 프로세스를 다시 띄우지 않습니다 - 짧은 지연(이 응답이 stdio 파이프로 먼저 전달될 시간을 주기 위함) 후 프로세스가 그대로 종료됩니다. 종료되면 stdio 파이프가 닫히므로, 이 MCP 커넥터는 무언가가 다시 띄워주기 전까지 응답하지 않습니다: Claude Desktop 설정에서 apple-calendar 커넥터를 껐다 켜거나, Claude Desktop을 재시작하세요. Calendar/Reminders 접근을 잠시 멈추고 싶을 때(예: 자리를 비울 때) 사용하기 위한 도구입니다.
해당 태그를 가진 모든 이벤트와/또는 미리 알림에서 태그를 삭제합니다. 이 작업은 되돌릴 수 없습니다: 정확히 일치하는 태그 이름만 제거하며 (부분/유사 일치 없음), 각 항목의 notes 나머지 부분은 그대로 둡니다.
현재 사용 중인 모든 해시태그와 각 태그를 사용하는 항목 수를 나열합니다. 이벤트는 넓은 (구간으로 나눈) 날짜 범위를, 미리 알림은 완료된 것을 포함한 모든 목록을 스캔합니다.
이벤트와/또는 미리 알림에서 한 태그를 다른 태그로 병합합니다. #from_tag가 붙어 있던 모든 항목이 #into_tag로 바뀝니다 (#from_tag는 제거되고, 없었다면 #into_tag가 추가됩니다). 동작 방식은 tags_rename과 동일하며, "두 태그를 하나로 합친다"는 용도를 위해 별도로 제공합니다. 정확한 태그 이름이 필요합니다.
이벤트와/또는 미리 알림에서 태그 이름을 변경합니다. 일치하는 항목의 notes 중 태그 영역에서만 #old_tag를 #new_tag로 바꿉니다 - notes 본문의 나머지 부분은 그대로 둡니다. 항목이 이미 두 태그를 모두 가지고 있으면 하나로 합쳐집니다 (중복 없음). 정확한 태그 이름이 필요하며, 부분 일치로 추측하지 않습니다.
Descriptions are terse and in Korean. While consistent, many descriptions are under 100 characters and lack context on WHEN to use the tool vs similar ones. E.g., 'calendar_search_events' vs 'calendar_list_events' distinction is not explained.
No pagination metadata in list responses. Tools accept 'limit' but do not return 'total_count' or 'next_cursor', making it unclear if results are truncated or complete.