Skip to main content
Glama
jaredtkatz

iMessage RAG MCP

by jaredtkatz

iMessage RAG MCP

Un servidor MCP que hace que tu historial local de iMessage en macOS sea buscable por asistentes de IA.

Sincroniza chat.db en una base de datos SQLite local, divide las conversaciones en fragmentos conscientes del contexto y sirve recuperación híbrida (densa + léxica, fusionada y reordenada) a través de un endpoint MCP. Todo se ejecuta localmente: ningún dato de mensajes sale de tu máquina.

Características

  • Recuperación híbrida — búsqueda densa con FAISS fusionada con búsqueda léxica TF-IDF mediante fusión de rango recíproco, y luego reordenada con un cross-encoder.

  • Fragmentación consciente de la conversación — los mensajes se agrupan en sesiones por intervalo de tiempo, luego se fragmentan con solapamiento para que los pasajes recuperados sean coherentes.

  • Expansión de contexto — los resultados incluyen mensajes circundantes, no solo el fragmento coincidente.

  • Resolución de nombres de contacto — los números de teléfono y correos electrónicos se asignan a nombres reales desde tu libreta de direcciones de macOS.

  • Sincronización incremental — una huella digital de la base de datos fuente evita trabajo redundante cuando no ha cambiado nada.

  • Solo local — lee las bases de datos de Apple en modo solo lectura; todos los índices permanecen en disco.

Related MCP server: iMessage Max

Requisitos

  • macOS (lee ~/Library/Messages/chat.db)

  • Python 3.10+

  • Acceso completo al disco para el programa que ejecute el servidor (Terminal, iTerm, PyCharm, etc.) — concédelo en Configuración del Sistema → Privacidad y Seguridad → Acceso completo al disco, y luego reinicia ese programa.

Instalación

git clone git@github.com:jaredtkatz/imessage-rag-mcp.git
cd imessage-rag-mcp
python -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt

La primera ejecución descarga los modelos de incrustación y reordenamiento de Hugging Face (unos cientos de MB).

Uso

Construye el índice e inicia el servidor:

SYNC_ON_STARTUP=true ./run.sh

La sincronización inicial y la construcción del índice pueden tardar varios minutos dependiendo del tamaño de tu historial de mensajes. En ejecuciones posteriores puedes omitir la bandera para omitir la sincronización e iniciar inmediatamente contra el índice existente:

./run.sh

run.sh es un envoltorio delgado alrededor de:

python -m uvicorn mcp_server:app --host 0.0.0.0 --port 8000 --reload

Conexión de un cliente MCP

Apunta tu cliente MCP a:

http://localhost:8000/mcp

Endpoints HTTP

Ambos endpoints también se pueden usar directamente a través de HTTP:

  • GET /search?query=...&limit=8 — pipeline híbrido completo (denso + léxico → fusión → reordenamiento → expansión de contexto). Esta es la herramienta expuesta a través de MCP.

  • GET /lexical?query=...&limit=20 — solo resultados TF-IDF, útil para depurar la recuperación.

Configuración

Todas las configuraciones son variables de entorno con valores predeterminados sensatos. Se pueden establecer en el shell o en un archivo .env en la raíz del proyecto:

cp .env.example .env

Las variables del shell tienen prioridad sobre .env, por lo que puedes anular un valor de archivo para una sola ejecución:

SYNC_ON_STARTUP=true ./run.sh

.env está en gitignore.

Variable

Default

Descripción

SYNC_ON_STARTUP

false

Sincronizar mensajes y reconstruir índices al inicio

IMESSAGE_DB

~/Library/Messages/chat.db

Base de datos de iMessage fuente

IMESSAGE_SELF_SENDER_NAME

Me

Nombre usado para tus propios mensajes salientes

IMESSAGE_EMBEDDING_MODEL

BAAI/bge-small-en-v1.5

Modelo de incrustación de sentence-transformer

IMESSAGE_RERANK_MODEL

cross-encoder/ms-marco-MiniLM-L-6-v2

Modelo de reordenamiento cross-encoder

IMESSAGE_SESSION_GAP_HOURS

8

Intervalo de inactividad que inicia una nueva sesión de conversación

IMESSAGE_TARGET_CHUNK_CHARS

1800

Tamaño objetivo de fragmento en caracteres

IMESSAGE_MAX_CHUNK_MESSAGES

16

Máximo de mensajes por fragmento

IMESSAGE_CHUNK_OVERLAP_MESSAGES

3

Mensajes repetidos entre fragmentos adyacentes

IMESSAGE_DENSE_CANDIDATES

40

Candidatos recuperados de FAISS

IMESSAGE_LEXICAL_CANDIDATES

40

Candidatos recuperados de TF-IDF

IMESSAGE_RERANK_CANDIDATES

40

Candidatos fusionados pasados al reordenador

IMESSAGE_RECENT_ROW_LOOKBACK

5000

Filas reexaminadas detrás de la última fila sincronizada

Cómo funciona

  1. Ingesta (ingest.py) — lee filas nuevas y recientemente modificadas de chat.db, recupera texto de attributedBody cuando la columna text está vacía, resuelve nombres de remitentes contra la libreta de direcciones y actualiza la base de datos canónica local.

  2. Índice (indexer.py) — agrupa mensajes por chat, los divide en sesiones por intervalos de tiempo, fragmenta cada sesión con solapamiento y luego escribe un índice FAISS y una matriz TF-IDF.

  3. Recuperación (rag.py) — ejecuta búsqueda densa y léxica, fusiona los rankings con RRF, reordena con un cross-encoder, elimina fragmentos solapados y expande cada resultado con mensajes circundantes.

  4. Servir (mcp_server.py) — expone el pipeline como una aplicación FastAPI montada como servidor MCP.

Estructura del proyecto

config.py       Environment-driven settings and file paths
db.py           SQLAlchemy models for chat.db, Address Book, and local storage
ingest.py       Sync from chat.db into the canonical database
indexer.py      Session splitting, chunking, and index construction
rag.py          Hybrid retrieval, fusion, reranking, context expansion
mcp_server.py   FastAPI application and MCP mount
run.sh          Development server launcher
.env.example    Template for local configuration

Almacenamiento de datos

Los artefactos generados viven en imessage_rag_data/ (en gitignore):

messages.sqlite   Canonical messages and chunks
messages.faiss    Dense vector index
lexical.joblib    TF-IDF vectorizer and matrix
state.json        Sync watermark and source fingerprint

Elimina el directorio para forzar una reconstrucción limpia.

Notas y limitaciones

  • La sincronización solo ocurre al inicio, y solo cuando SYNC_ON_STARTUP=true. Aún no hay sincronización en segundo plano o bajo demanda, así que reinicia el servidor para recoger nuevos mensajes.

  • Los adjuntos, reacciones e historial de mensajes editados no se indexan — solo texto.

  • Ejecutar uvicorn con múltiples workers actualmente causa errores 404 en el montaje MCP, por lo que el servidor se ejecuta con un solo worker.

  • Todo el índice se reconstruye desde cero cada vez que el corpus cambia; no hay reindexación incremental.

Maintenance

ActivityMaintained
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
    B
    maintenance
    Enables AI assistants to read, search, and send iMessages with features like contact name resolution, session grouping, and attachment listing. It provides intent-aligned tools to efficiently navigate conversation history and manage messages through natural language queries.
    6
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Enables reading, searching, and sending iMessages on macOS by accessing the local messages database and utilizing AppleScript. Users can list conversations, search message history, and send messages to individuals or group chats directly through the Model Context Protocol.
    6
  • 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

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/jaredtkatz/imessage-rag-mcp'

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