Guilda WorkDevelopers

INTEGRACIÓN

Asistente de IA (MCP)

Conecta Claude Code, Claude Desktop, Codex CLI o ChatGPT directamente contra tu instancia.

stdio (local) streamable-http (remoto) OAuth 2.1 + DCR

Guilda Work expone un servidor MCP (Model Context Protocol) con 90 tools — el mismo catálogo, definido una sola vez en mcp_tools.py, servido por dos transportes distintos según qué cliente lo consuma.

ServidorTransporteParaAutenticación
mcp_server.pystdio (proceso local)Claude Code, Claude Desktop, Codex CLINinguna — confianza del propio sistema operativo
mcp_server_remoto.pystreamable-httpChatGPT (solo admite MCP remoto)OAuth 2.1 + Registro Dinámico de Cliente, vía Ory Hydra

Conexión local — Claude Code, Claude Desktop, Codex CLI

mcp_server.py es un script aparte — no se empaqueta en el .exe de escritorio — así que hace falta tener Python y las dependencias del servidor instaladas:

bash
pip install -r requirements-mcp.txt

Claude Code

Desde la carpeta del proyecto:

bash
claude mcp add guilda-work -- python mcp_server.py

En Windows, si tienes varios Python instalados (o el de PATH no es el del .venv del proyecto, que es donde está instalado el paquete mcp), usa la ruta absoluta del intérprete para evitar que claude mcp add resuelva a un Python sin la dependencia:

powershell
claude mcp add guilda-work -- "C:\ruta\a\tu\instancia\.venv\Scripts\python.exe" "C:\ruta\a\tu\instancia\mcp_server.py"

Verifica que Claude Code lo ve con claude mcp list — debería aparecer guilda-work con estado conectado. Pídele algo simple como “lista mis menús” para confirmar de punta a punta.

Codex CLI

Añade en tu config.toml (o el equivalente que use tu instalación):

toml
[mcp_servers.guilda-work]
command = "python"
args = ["mcp_server.py"]
cwd = "/ruta/a/tu/instancia"

Claude Desktop

Entrada equivalente en su archivo de configuración de servidores MCP (claude_desktop_config.json):

json
{
  "mcpServers": {
    "guilda-work": {
      "command": "python",
      "args": ["mcp_server.py"],
      "cwd": "/ruta/a/tu/instancia"
    }
  }
}
Los tres clientes locales comparten el mismo criterio de confianza: mcp_server.py corre como stdio sin autenticación propia — quien puede ejecutar el proceso ya tiene acceso al sistema donde vive. Para exponerlo a un cliente que no controlas tú (ChatGPT), hace falta el conector remoto de abajo, con autenticación real.

Conector remoto — ChatGPT

ChatGPT solo admite servidores MCP remotos por HTTPS, con OAuth 2.1 real — no hay forma de conectarlo al servidor local. mcp_server_remoto.py expone exactamente las mismas 90 tools por streamable-http, delegando toda la autorización en Ory Hydra (ya desplegado como proveedor OAuth2 del resto del stack) — este proceso nunca gestiona logins ni emite tokens él mismo, solo valida cada token que llega contra la introspección de Hydra (Resource Server, no un Authorization Server propio).

  1. 1

    Instala las dependencias del servidor MCP

    pip install -r requirements-mcp.txt, si no lo hiciste ya para el conector local.

  2. 2

    Activa el Registro Dinámico de Cliente en Hydra

    Ya está en deploy/hydra/hydra.yml (oidc.dynamic_client_registration.enabled: true) — solo falta recrear el contenedor para que lo recoja: docker compose up -d --force-recreate hydra.

  3. 3

    Define las variables de entorno

    MCP_REMOTO_ORIGIN (URL pública de este servidor), HYDRA_PUBLIC_ORIGIN (URL pública de Hydra) y opcionalmente MCP_REMOTO_PUERTO (por defecto 8017) — ver el ejemplo de abajo.

  4. 4

    Publícalo detrás de Caddy

    Ya está el bloque en deploy/Caddyfile (mcp.HOSTNAME { reverse_proxy localhost:8017 }) — solo falta que Caddy recargue la configuración.

  5. 5

    Arráncalo como proceso persistente

    Mismo patrón que el resto de la app fuera de Docker: copia deploy/guilda-work-mcp.service a /etc/systemd/system/, ajusta usuario/rutas, y sudo systemctl enable --now guilda-work-mcp.

  6. 6

    Configura las variables de las herramientas que quieras exponer

    Cada una es opcional por separado — ver Variables de entorno para la lista completa.

  7. 7

    Verifica

    curl https://mcp.tu-hostname/.well-known/oauth-protected-resource debe devolver un JSON con resource/authorization_servers (RFC9728) — confirma que el servidor sirve y anuncia Hydra como su autorización.

bash
# .env / /etc/guilda-work.env
MCP_REMOTO_ORIGIN=https://mcp.tu-hostname
HYDRA_PUBLIC_ORIGIN=https://hydra.tu-hostname
MCP_REMOTO_PUERTO=8017

La verificación completa (ChatGPT conectándose de verdad, flujo OAuth de punta a punta) solo se puede hacer añadiendo el conector desde Ajustes → Conectores de ChatGPT una vez todo lo de arriba esté desplegado — pégale la URL pública de MCP_REMOTO_ORIGIN.

Requiere el stack Docker + Hydra desplegados de verdad (DNS, registro dinámico de cliente activado...) — no aplica para uso puramente local. Ver Autoalojamiento para el despliegue base.
GrupoToolsDetalle
Propias de Guilda Work31Notas, tareas estilo Outlook, calendario, correo integrado, categorías de correo, firma, exportar/importar.
Stack compartido (sin tenant)31CRM, Drive, Proyectos, Soporte, Analítica, Automatizaciones, Documentación, Chat, Almacenamiento, Monitorización — instancia compartida entre todos los tenants, sin filtrado por tenant en estas tools.
Con parámetro tenant explícito28Ver tabla de familias abajo.

Las tools con tenant explícito existen porque, a diferencia del resto, el aislamiento entre clientes de estas 9 herramientas no lo da una instancia compartida con permisos, sino una instancia física propia, o un token/rol/cuenta propia por tenant — sin ese parámetro no habría forma de saber qué cliente debe ver cada dato. Ver Aislamiento multi-cliente para el detalle de cada mecanismo.

HerramientaBackendTools
FacturaciónFacturaScripts4
Firma electrónicaDocumenso4
Gestión documentalPaperless-ngx3
Hojas de cálculoBaserow3
Reserva de citasCal.diy4
NewsletterListmonk5
Correo propioStalwart3
Notificaciones pushntfy1
VideollamadasJitsi Meet1

Búsqueda semántica (RAG)

buscar_semantico(consulta, tenant=None) no busca coincidencias de texto exacto — convierte la consulta en un vector con un modelo de embeddings local (Ollama) y devuelve las notas, tareas y mensajes de correo más parecidos por significado, aunque no compartan ni una palabra literal con la pregunta. Útil para preguntas del tipo “¿qué dije sobre el contrato de alquiler?” cuando no recuerdas si escribiste “alquiler”, “arrendamiento” o “renta”.

text
buscar_semantico(consulta="problemas de facturación con un cliente")
→ encuentra notas que mencionan "impago", "retraso en el cobro" o "factura pendiente",
  aunque ninguna contenga literalmente la palabra "facturación".
El índice vectorial vive en Meilisearch (campo _vectors, userProvided), reindexado por scripts/reindexar_embeddings.py — el aislamiento por tenant es el mismo que el resto de la búsqueda, nunca cruza datos entre clientes.

Webhooks

Recibe una notificación HTTP en tiempo real cuando ocurre algo en tu cuenta (tarea finalizada, nota creada, cita reservada, correo nuevo), en vez de tener que preguntar por sondeo. Se gestionan con webhooks_listar/webhooks_crear/webhooks_borrar — ver Webhooks para el formato del payload, la firma HMAC y el catálogo completo de eventos.

Las tareas con duración (iniciar/pausar/reanudar/finalizar, la función central del registro de actividad) NO tienen tools de MCPlistar_tareas/crear_tarea/editar_tarea/completar_tarea/consultar_calendario operan sobre las tareas estilo Outlook (independientes, sin cronómetro), no sobre las de duración. Un asistente de IA puede leer y exportar el histórico de tareas con duración (exportar_historial/importar_historial), pero no puede arrancar, pausar ni finalizar una — eso hoy solo se hace desde la app web o la API REST (POST /api/v1/tareas crea y arranca directamente; POST /api/v1/tareas/{id}/pausar|reanudar|finalizar controla el resto del ciclo de vida, ver Referencia de la API). Ver Modelos de datos para la diferencia completa entre ambos tipos de tarea.
Enviar correo es la única acción de dos pasos a propósito, tanto en el correo integrado como en el resto: una tool prepara/previsualiza, otra distinta confirma y envía de verdad — instruye a tu asistente para que te enseñe el contenido antes de llamar a la segunda. El bcc nunca viaja como cabecera visible del mensaje enviado.
Vaultwarden (el gestor de contraseñas) queda excluido a propósito, bajo ningún concepto, de todo esto — no tiene tools, ni variable de entorno, ni forma de activarlo por MCP.