MCP Headless Gmail Server
Un servidor sin interfaz gráfica para obtener y enviar correos electrónicos a través de la API de Gmail, que requiere credenciales de la API de Google en tiempo de ejecución.
Documentación
MCP Headless Gmail Server (NPM & Docker)
Un servidor MCP (Model Context Protocol) que permite obtener y enviar correos de Gmail sin necesidad de configurar credenciales o tokens locales.
¿Por qué MCP Headless Gmail Server?
Ventajas críticas
- Operación headless y remota: A diferencia de otras soluciones MCP de Gmail que requieren ejecutarse fuera de Docker y acceso a archivos locales, este servidor puede ejecutarse completamente headless en entornos remotos sin navegador ni acceso a archivos locales.
- Arquitectura desacoplada: Cualquier cliente puede completar el flujo OAuth de forma independiente y luego pasar las credenciales como contexto a este servidor MCP, creando una separación completa entre el almacenamiento de credenciales y la implementación del servidor.
Conveniente pero no crítico
- Funcionalidad enfocada: En muchos casos de uso, especialmente en aplicaciones de marketing, solo se necesita acceso a Gmail sin servicios adicionales de Google como Calendar, lo que hace que esta implementación enfocada sea ideal.
- Listo para Docker: Diseñado pensando en la contenedorización para una configuración bien aislada, independiente del entorno y de un solo clic.
- Dependencias confiables: Construido sobre la biblioteca google-api-python-client, bien mantenida.
Características
- Obtener los correos más recientes de Gmail con los primeros 1k caracteres del cuerpo
- Obtener el contenido completo del cuerpo del correo en fragmentos de 1k usando el parámetro offset
- Enviar correos a través de Gmail
- Renovar los tokens de acceso por separado
- Manejo automático de renovación de tokens
Requisitos previos
- Python 3.10 o superior
- Credenciales de la API de Google (ID de cliente, secreto de cliente, token de acceso y token de renovación)
Instalación
# Clone the repository
git clone https://github.com/baryhuang/mcp-headless-gmail.git
cd mcp-headless-gmail
# Install dependencies
pip install -e .
Docker
Construyendo la imagen Docker
# Build the Docker image
docker build -t mcp-headless-gmail .
Uso con Claude Desktop
Puedes configurar Claude Desktop para usar la imagen Docker añadiendo lo siguiente a tu configuración de Claude:
docker
{
"mcpServers": {
"gmail": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"buryhuang/mcp-headless-gmail:latest"
]
}
}
}
npm version
{
"mcpServers": {
"gmail": {
"command": "npx",
"args": [
"@peakmojo/mcp-server-headless-gmail"
]
}
}
}
Nota: Con esta configuración, deberás proporcionar tus credenciales de la API de Google en las llamadas a las herramientas como se muestra en la sección Uso de las herramientas. Las credenciales de Gmail no se pasan como variables de entorno para mantener la separación entre el almacenamiento de credenciales y la implementación del servidor.
Publicación multiplataforma
Para publicar la imagen Docker para múltiples plataformas, puedes usar el comando docker buildx. Sigue estos pasos:
-
Crea una nueva instancia de builder (si aún no lo has hecho):
docker buildx create --use -
Construye y sube la imagen para múltiples plataformas:
docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t buryhuang/mcp-headless-gmail:latest --push . -
Verifica que la imagen esté disponible para las plataformas especificadas:
docker buildx imagetools inspect buryhuang/mcp-headless-gmail:latest
Uso
El servidor proporciona funcionalidad de Gmail a través de herramientas MCP. El manejo de autenticación se simplifica con una herramienta dedicada de renovación de tokens.
Iniciando el servidor
mcp-server-headless-gmail
Usando las herramientas
Al usar un cliente MCP como Claude, tienes dos formas principales de manejar la autenticación:
Renovando tokens (primer paso o cuando los tokens expiran)
Si tienes tanto el token de acceso como el de renovación:
{
"google_access_token": "your_access_token",
"google_refresh_token": "your_refresh_token",
"google_client_id": "your_client_id",
"google_client_secret": "your_client_secret"
}
Si tu token de acceso ha expirado, puedes renovarlo solo con el token de renovación:
{
"google_refresh_token": "your_refresh_token",
"google_client_id": "your_client_id",
"google_client_secret": "your_client_secret"
}
Esto devolverá un nuevo token de acceso y su tiempo de expiración, que podrás usar para llamadas posteriores.
Obteniendo correos recientes
Recupera los correos recientes con los primeros 1k caracteres del cuerpo de cada correo:
{
"google_access_token": "your_access_token",
"max_results": 5,
"unread_only": false
}
La respuesta incluye:
- Metadatos del correo (id, threadId, from, to, subject, date, etc.)
- Los primeros 1000 caracteres del cuerpo del correo
body_size_bytes: Tamaño total del cuerpo del correo en bytescontains_full_body: Booleano que indica si el cuerpo completo está incluido (true) o truncado (false)
Obteniendo el contenido completo del cuerpo del correo
Para correos con cuerpos de más de 1k caracteres, puedes recuperar el contenido completo en fragmentos:
{
"google_access_token": "your_access_token",
"message_id": "message_id_from_get_recent_emails",
"offset": 0
}
También puedes obtener el contenido del correo por ID de hilo:
{
"google_access_token": "your_access_token",
"thread_id": "thread_id_from_get_recent_emails",
"offset": 1000
}
La respuesta incluye:
- Un fragmento de 1k del cuerpo del correo a partir del offset especificado
body_size_bytes: Tamaño total del cuerpo del correochunk_size: Tamaño del fragmento devueltocontains_full_body: Booleano que indica si el fragmento contiene el resto del cuerpo
Para recuperar el cuerpo completo de un correo largo, haz llamadas secuenciales aumentando el offset en 1000 cada vez hasta que contains_full_body sea true.
Enviando un correo
{
"google_access_token": "your_access_token",
"to": "recipient@example.com",
"subject": "Hello from MCP Gmail",
"body": "This is a test email sent via MCP Gmail server",
"html_body": "<p>This is a <strong>test email</strong> sent via MCP Gmail server</p>"
}
Flujo de renovación de tokens
- Comienza llamando a la herramienta
gmail_refresh_tokencon:- Tus credenciales completas (token de acceso, token de renovación, ID de cliente y secreto de cliente), o
- Solo tu token de renovación, ID de cliente y secreto de cliente si el token de acceso ha expirado
- Usa el nuevo token de acceso devuelto para llamadas API posteriores.
- Si recibes una respuesta que indica expiración del token, llama nuevamente a la herramienta
gmail_refresh_tokenpara obtener un nuevo token.
Este enfoque simplifica la mayoría de las llamadas API al no requerir credenciales de cliente para cada operación, mientras que aún permite la renovación de tokens cuando sea necesario.
Obtención de credenciales de la API de Google
Para obtener las credenciales requeridas de la API de Google, sigue estos pasos:
- Ve a la Google Cloud Console
- Crea un nuevo proyecto
- Habilita la API de Gmail
- Configura la pantalla de consentimiento OAuth
- Crea credenciales de ID de cliente OAuth (selecciona "Aplicación de escritorio" como tipo de aplicación)
- Guarda el ID de cliente y el secreto de cliente
- Usa OAuth 2.0 para obtener tokens de acceso y renovación con los siguientes alcances:
https://www.googleapis.com/auth/gmail.readonly(para leer correos)https://www.googleapis.com/auth/gmail.send(para enviar correos)
Renovación de tokens
Este servidor implementa la renovación automática de tokens. Cuando tu token de acceso expira, el cliente de la API de Google usará el token de renovación, el ID de cliente y el secreto de cliente para obtener un nuevo token de acceso sin requerir intervención del usuario.
Nota de seguridad
Este servidor requiere acceso directo a tus credenciales de la API de Google. Mantén siempre tus tokens y credenciales seguros y nunca los compartas con partes no confiables.
Licencia
Consulta el archivo LICENSE para más detalles.