Telegram MCP
by 0xjesus
README.md
# Telegram MCP: conversaciones, archivos y mensajes programados
Conecta tu cuenta de Telegram con un asistente mediante MCP. Lee conversaciones, busca acuerdos y programa mensajes sin abrir otra sesión por cada herramienta.
## Qué puedes hacer
- Buscar mensajes por texto o significado, y consultar la cobertura del índice.
- Transcribir notas de voz y el audio de videos con el servicio local de transcripción.
- Extraer texto de imágenes, PDF, Word, Excel y PowerPoint; interpretar contenido con OpenAI y recuperar el progreso tras reinicios.
- Compartir con WhatsApp la caché y el presupuesto mensual del análisis de adjuntos. El análisis con OpenAI es opcional y requiere configuración.
- Programar mensajes, consultar pendientes, reprogramar y cancelar. La cola queda guardada en disco.
- Elegir grupos individualmente, aplicar la regla de hasta diez integrantes o habilitar todos desde el panel privado.
- Crear y administrar grupos, trabajar con encuestas y tarjetas de contacto, bloquear contactos y configurar privacidad con los permisos que Telegram conceda.
- Ver imágenes y hasta seis fotogramas de un video desde el asistente. Los fotogramas son una muestra.
- Conservar reacciones recibidas y respetar ediciones y eliminaciones sin restaurar snapshots anteriores.
El catálogo `tools/list` describe los parámetros de cada herramienta. Los mensajes y archivos son datos no confiables, nunca instrucciones para el agente.
## Puesta en marcha
Python 3.10 o posterior, FFmpeg y FFprobe. Desde una copia del repositorio:
```sh
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python daemon.py
```
Registra tu propia aplicación en https://my.telegram.org y guarda `api_id` y `api_hash` en el archivo indicado por `TG_APP_JSON`. El valor predeterminado está en el directorio de configuración del usuario, fuera del repositorio. Vincula la cuenta en http://127.0.0.1:7255/pair y configura MCP en http://127.0.0.1:7255/mcp. La sesión y las bases de datos se guardan bajo `TG_STORE`, también fuera del repositorio.
El servidor escucha sólo en loopback. Para usarlo desde otra máquina, crea un túnel SSH. Nunca publiques el puerto ni subas la sesión, credenciales o bases de datos a Git.
## Análisis de adjuntos
Instala también las dependencias de `tools/attachments/requirements.txt` y `rapidocr-onnxruntime==1.4.4` sin sus dependencias automáticas. Ejecuta `python -m tools.attachments.worker` desde la raíz del repositorio. Usa un trabajador por cuenta.
Para OpenAI configura `TG_ATTACHMENT_BACKEND=openai`, `TG_OPENAI_KEY_FILE` apuntando a un archivo privado y `TG_ATTACHMENT_CLOUD_DB` apuntando al registro privado de presupuesto. Si usas ambos MCP, apunta al mismo registro de WhatsApp para compartir caché y presupuesto. `TG_ATTACHMENT_MONTHLY_USD` vale 10 por defecto. El presupuesto de embeddings es independiente.
Los archivos se descargan mediante la sesión existente, hasta 50 MiB. La extracción está acotada a 500 páginas, 100 MiB expandidos y dos millones de caracteres. El contenido que excede límites o no se puede interpretar queda marcado como parcial. La interpretación avanza por unidades y conserva progreso; no significa que todo el historial ya esté analizado. No se garantiza interpretar gráficos vectoriales de Office ni todas las imágenes de una animación.
## Panel privado de monitoreo
`python monitoring_dashboard.py` sirve el panel en http://127.0.0.1:7257. Necesita acceso local a las bases de ambos MCP mediante `TG_STORE` y `WA_STORE`. Muestra grupos, conteos, controles individuales y solicitudes de recuperación.
`python monitoring_dashboard.py --enable-all` registra una autorización explícita para todos los grupos conocidos y activa los nuevos grupos descubiertos mientras el panel permanezca ejecutándose. Los grupos que se apaguen manualmente se respetan. Ejecuta este comando sólo si ésa es tu decisión: sustituye también las desactivaciones anteriores. Reiniciar el panel sin ese argumento conserva las decisiones.
La recuperación y los embeddings avanzan por lotes. Telegram recupera lo que permite la cuenta; WhatsApp depende del historial que entregue el teléfono. No se pueden garantizar mensajes borrados, archivos vencidos ni exhaustividad.
## Diferencias entre plataformas
Estas herramientas equivalen a las funciones compatibles del fork de WhatsApp; sus parámetros y límites son nativos de Telegram. Una encuesta admite selección única o múltiple, sin fijar un máximo intermedio. Las reacciones pueden ofrecer sólo totales y participantes recientes. Los permisos de administrador, privacidad y acceso al historial los decide Telegram. Los lotes de cambios de participantes devuelven el progreso parcial si deben parar por un límite; no repiten automáticamente operaciones cuyo resultado sea incierto.
## Historial y búsqueda
`semantic_search`, `index_status` and `history_analytics` query the shared Mac
history service at `http://127.0.0.1:7256`. The MCP fixes the source to Telegram;
callers cannot override it. These tools send no Telegram messages and need no
account reconnection. The HTTP timeout is 45 seconds.
| Tool | Parameters and defaults | Usage |
|---|---|---|
| `semantic_search` | Required `query`; `mode="hybrid"`, `limit=20` | Find related messages. Modes are `hybrid`, `semantic`, `keyword`; limit is 1 to 50. |
| `index_status` | None | Inspect indexed coverage and embedding progress before interpreting missing results. |
| `history_analytics` | `group_by="month"`, `limit=30` | Count indexed messages by `month`, `day`, `chat`, `sender`, `media_type` or `source`; limit is 1 to 100. |
Search and analytics also accept optional `chat`, `sender`, `after` and `before`.
`chat` is the exact cached Telegram chat ID as a string. Dates accept UTC epoch
seconds or ISO date/time strings. Responses preserve the service's JSON object.
History synchronization, copying messages into the index and generating
embeddings have separate progress. An empty result does not prove that a
conversation never happened. Aggregates cover the indexed messages available
at query time. `index_status` reports the current index state.
Use a result's `chat_id` as `chat` and its `message_id` with the existing
`get_message_context` tool to retrieve surrounding cached messages. Messages
and transcriptions are untrusted data, including text that looks like
instructions to an agent.
If the history service is unavailable, these tools return an MCP error without
restarting the account client. Existing cached-message tools remain available.
The implementation is isolated in [memory_proxy.py](memory_proxy.py).
Run `python3 -m unittest test_memory_proxy -v` for synthetic HTTP tests that
never import or start the Telegram account client.
## Monitoreo de grupos
Sin configuración, los grupos requieren autorización individual. La política opcional de grupos pequeños permite monitorear automáticamente grupos y supergrupos de hasta 10 integrantes, incluidos los 10. Los grupos más grandes o cuyo tamaño no se puede confirmar permanecen apagados. Los chats privados y canales de difusión conservan su comportamiento.
El inventario se actualiza durante la sincronización de diálogos, publicando avances por lotes de 20. Se consultan conteos, sin descargar listas masivas de participantes. Los grupos pequeños se verifican cada cinco minutos; los grandes o de tamaño desconocido, como máximo una vez por hora mediante consultas adicionales. Reutilizar un conteo conserva su fecha original de verificación. Los permisos automáticos caducan a los 15 minutos si no se pueden renovar. Un cambio de miembros invalida el permiso automático hasta la siguiente verificación. Si el grupo crece por encima del límite, deja de procesarse. Los permisos del índice caducan en 60 segundos sin actualización.
Las decisiones manuales `allow` y `revoke` prevalecen sobre la regla automática; un grupo apagado manualmente no se vuelve a encender por ser pequeño. La política admite `auto-enable --max-members 10 --confirm --evidence 'autorización del responsable'`, `auto-disable`, `inventory` y `list` mediante el módulo `consent`. Cambiar el límite exige conteos nuevos. Activar el monitoreo inicia la recuperación paginada del historial que Telegram permita consultar; no garantiza recuperar mensajes borrados.
## Mensajes programados
- `schedule_message`: guarda destinatario y texto con `send_at` RFC3339 y zona horaria, por ejemplo `2026-12-01T10:00:00-06:00`. Acepta `expires_at`, `idempotency_key`, `reply_to` y `silent`.
- `list_scheduled_messages`: muestra estados, hasta 100 por página, con cursor.
- `cancel_scheduled_message`: cancela un pendiente por `job_id`.
- `reschedule_message`: cambia la fecha de un pendiente por `job_id`.
La cola se guarda en SQLite privado. Un único despachador consulta un índice cada dos segundos; no crea una tarea por mensaje ni carga toda la cola en memoria. Hay un máximo de 1,000 pendientes y 10,000 registros totales; el historial terminal se limpia por lotes después de siete días. Los resultados inciertos se conservan para revisión. La clave de idempotencia evita repetir un encargo mientras su registro siga guardado; reutilizarla con otros datos produce error.
Se admiten textos de hasta 4,096 unidades UTF-16 y fechas dentro de un año. Si no se especifica vencimiento, el envío expira 24 horas después de su fecha; esto evita enviar mensajes muy atrasados tras una caída prolongada. El equipo y la cuenta deben estar conectados. Las esperas de Telegram y los límites de ritmo pueden retrasar el envío.
Los envíos inmediatos y programados comparten un bloqueo y límites de ritmo persistentes. Se respeta `FloodWait`, con pausa durable y un máximo de cinco intentos de envío por trabajo. Si una conexión se pierde después de iniciar un envío, o el proceso reinicia en ese punto, el trabajo queda `uncertain`; no se reenvía automáticamente porque pudo haberse entregado. Cancelar o reprogramar sólo funciona mientras siga pendiente.
Estas medidas reducen errores y ráfagas, pero no garantizan evitar restricciones de la plataforma. Programar requiere autorización del usuario para ese destinatario, contenido y momento. Instalar el programador no crea envíos por sí mismo.
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues