Skip to main content
Glama
lanemiles

lane-mac-mcp

by lanemiles

lane-mac-mcp

Сервер MCP только для чтения для iMessage + CLI для macOS. Один проверяемый файл, без возможности отправки.

Claude (через MCP) или вы (через CLI) можете просматривать список разговоров, читать чат и искать в истории сообщений — и ничего больше. Только чтение по построению: в v1 вообще нет кода отправки. Весь доступ к данным выполняется через собственный /usr/bin/sqlite3 от Apple с флагами -json -readonly против ~/Library/Messages/chat.db; имена контактов берутся из запросов только на чтение к локальным базам AddressBook.

Ограничения дизайна

Весь сервер — это server.ts (~600 строк, включая комментарии), чтобы его можно было проверить от начала до конца — проверяемый файл и есть исполняемый файл, поскольку Node ≥ 22.18 выполняет TypeScript напрямую с нативным удалением типов (без шага сборки, без скомпилированных артефактов). Есть ровно две зависимости, зафиксированные через package-lock.json: @modelcontextprotocol/sdk и zod. Никаких сетевых импортов, никаких открытых портов — только stdio JSON-RPC, запускаемый как дочерний процесс Claude Desktop; запуски CLI — одноразовые процессы. Демона нет: Claude Desktop запускает и останавливает сервер вместе с приложением (перезапустите приложение, чтобы перезагрузить код).

Related MCP server: imessage-rich-search

Требования

macOS с настроенными Сообщениями, Node.js ≥ 22.18 и полный доступ к диску для процесса, который запускает сервер: Terminal (или ваше терминальное приложение) для CLI, и Claude Desktop для MCP. Предоставьте его в Системных настройках → Конфиденциальность и безопасность → Полный доступ к диску, затем перезапустите приложение. node server.ts doctor проверяет всё это и сообщает, чего не хватает.

Установка

git clone <this repo> && cd MacMCPServer
npm install          # installs the two pinned dependencies
node server.ts doctor

Затем добавьте сервер в claude_desktop_config.json Claude Desktop (Настройки → Разработчик → Изменить конфигурацию):

{
  "mcpServers": {
    "lane-mac": {
      "command": "node",
      "args": ["/Users/you/Desktop/MacMCPServer/server.ts"]
    }
  }
}

Перезапустите Claude Desktop. Появятся три инструмента: list_chats, read_chat, search_messages.

Использование CLI

node server.ts chats                                   # recent chats, names resolved
node server.ts chats --search "mom" --limit 5
node server.ts chats --awaiting-reply-only             # threads where the last word wasn't yours
node server.ts read "Martha" --limit 100               # fuzzy name; ambiguous → candidates
node server.ts read 42 --start-date 2024-01-01 --end-date 2024-06-30 --include-reactions
node server.ts search "dinner" --from "martha"         # last 30 days by default
node server.ts search "dinner" --start-date 2015-01-01 --deep   # older history + rich-text decode
node server.ts doctor

Вывод — JSON. search покрывает message.text с помощью SQL LIKE; --deep дополнительно декодирует сообщения, чей текст находится только в blob attributedBody (ограниченное сканирование, медленнее). Реакции Tapback исключаются везде, если не указано --include-reactions.

Обработанные особенности Apple

Метки времени — наносекунды с 2001-01-01 (секунды для очень старых строк) — конвертируются оба варианта. Текст сообщения часто находится в blob typedstream attributedBody, а не в message.text; он декодируется в JS с известной эвристикой NSString. Имена контактов сопоставляются по нормализованному последнему 10-значному номеру телефона или email в нижнем регистре по всем источникам AddressBook, с корректным откатом к сырым номерам, когда контакты недоступны для чтения.

Позиция по конфиденциальности и безопасности

Сервер может только читать. Он открывает базы данных с флагом -readonly sqlite3, не содержит пути кода, который записывает в любую базу данных или отправляет сообщения, не устанавливает сетевых соединений и не слушает порты. Пользовательский ввод экранируется в строковые литералы SQL (удвоение ''), а числовые значения проверяются. doctor выводит только количество строк, никогда не содержимое сообщений. Переопределения через переменные окружения (CHAT_DB_PATH, SQLITE_BIN, ADDRESSBOOK_DIR) существуют, чтобы тесты никогда не касались реальных данных.

Тестирование

npm test

Тесты «чёрного ящика» генерируют синтетический chat.db и фикстуру AddressBook (включая сообщение только с attributedBody, tapback и входящую ветку без ответа) и запускают реальный CLI и реальный интерфейс MCP stdio как дочерние процессы. Разработка никогда не касается реальных данных.

Дорожная карта (позже, не v1)

Полировка обогащения контактов → чтение Заметок через osascript → отправка, ограниченная переменной окружения SEND_ENABLED плюс одобрение каждого вызова.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    A local MCP server that enables reading iMessage conversations and sending new messages through Claude Desktop. It provides secure, read-only access to your Mac's iMessage database and AppleScript-based message sending capabilities.
    6
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables full-text search of macOS iMessages including link preview metadata. Works as an MCP server for Claude Desktop to search your messages locally.
    1
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    A read-only MCP server that exposes your iMessage data to Claude Code and Claude Desktop, with automatic contact name resolution.
    3
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Read-only MCP server for local macOS Messages database, enabling querying of chats, messages, attachments, and metadata.
    147 npm
    MIT