CAS Genesis World MCP

Un servidor MCP para el servicio web REST de CAS genesisWorld v7.0.

Documentación

CAS genesisWorld

cas-genesisworld-mcp

npm Docker CI License: MIT

Conecta Claude, Cursor o cualquier agente de IA compatible con MCP a tu CRM CAS genesisWorld. Busca contactos, gestiona tareas y citas, y lee o escribe registros — mediante lenguaje natural, sin escribir ni una sola llamada a la API.

  • 69 herramientas, incluyendo 7 flujos nativos que agrupan operaciones CRM de varios pasos (como comprobar conflictos de agenda antes de reservar una reunión, o verificar duplicados antes de crear un contacto) en una sola llamada.
  • Acceso completo de lectura/escritura a tareas, contactos, citas, documentos, listas de distribución y más — además de acceso genérico a cualquier tipo de objeto personalizado que defina tu instalación.
  • Modo de solo lectura disponible para un uso seguro y exploratorio.
  • Se distribuye como una imagen Docker lista para usar o un paquete npm.

Inicio rápido

Añade esto a la configuración de tu cliente MCP (por ejemplo, el claude_desktop_config.json de Claude Desktop):

{
  "mcpServers": {
    "cas-genesisworld": {
      "command": "npx",
      "args": ["-y", "cas-genesis-world-mcp"],
      "env": {
        "GENESISWORLD_BASE_URL": "http://your-genesisworld-server/genesisrest.svc",
        "GENESISWORLD_PRODUCT_KEY": "your-product-key",
        "GENESISWORLD_USERNAME": "your-username",
        "GENESISWORLD_PASSWORD": "your-password"
      }
    }
  }
}

Reinicia tu cliente — las herramientas aparecen automáticamente. Pide a tu agente que busque un contacto, liste tus tareas abiertas o reserve una reunión, y él se encargará del resto.

¿Prefieres un servidor persistente autoalojado en lugar de un proceso por cliente? Consulta Autoalojamiento con Docker más abajo.

Qué puedes pedirle

Una vez conectado, tu agente puede gestionar solicitudes como:

  • "Encuentra la información de contacto de Jane Doe y muéstrame sus tareas abiertas."
  • "Crea una tarea de seguimiento para este cliente potencial y vincúlala a su registro de contacto."
  • "Reserva una reunión con el equipo de ventas el próximo martes a las 10am — comprueba primero los conflictos en las agendas de todos."
  • "Comprueba posibles duplicados antes de crear un nuevo contacto para Acme Corp."
  • "Genera un informe para esta oportunidad."

Estas solicitudes se responden mediante flujos — llamadas a herramientas individuales que agrupan la secuencia de varios pasos de solicitudes API que una persona tendría que programar manualmente.

Herramientas y flujos

Flujos — acciones compuestas, una llamada cada una

FlujoModoQué hace
my_open_taskslecturaUsuario actual + su lista de tareas (ventana de vencimiento, vista guardada o filtro de texto completo) en una llamada
task_overviewlecturaRegistro de tarea + enlaces + etiquetas, obtenidos en paralelo
create_taskescrituraCrear una tarea y opcionalmente vincularla a otro objeto (p. ej., un contacto)
find_contactlecturaBúsqueda de contactos por nombre y/o número de teléfono, en paralelo
contact_360lecturaContacto + dossier de colección + etiquetas + enlaces, obtenidos en paralelo
create_address_safeescrituraVerificación de duplicados primero — crea solo cuando no se encuentran candidatos
create_appointment_safeescrituraVerificación opcional de conflictos → crear → añadir participantes, en una llamada
Referencia completa de herramientas (62 herramientas atómicas)

Lectura (39)

HerramientaEndpoint
smart_searchGET /v7.0/smartsearch
get_data_objectGET /v7.0/type/{dataObjectType}/{dataObjectGGUID}
get_dossierGET /v7.0/type/{dataObjectType}/{dataObjectGGUID}/dossier/full
list_data_objectsGET /v7.0/type/{dataObjectType}/list
list_viewsGET /v7.0/type/{dataObjectType}/view/list
list_data_objects_by_viewGET /v7.0/type/{dataObjectType}/view/{viewID}/list
list_available_data_object_typesGET /v7.0/user/self/dataobjecttypepermission/list
get_data_object_types_metadataGET /v7.0/metadata
list_linksGET /v7.0/type/{dataObjectType}/{dataObjectGGUID}/link/list
list_recent_data_objectsGET /v7.0/type/{dataObjectType}/recent/list
get_available_productsGET /v7.0/type/gwopportunity/availableproducts
get_data_object_countGET /v7.0/type/{dataObjectType}/count
get_primary_link_parentsGET /v7.0/type/{dataObjectType}/{dataObjectGGUID}/primarylinkparents
list_usersGET /v7.0/user/list
get_user_selfGET /v7.0/user/self
get_viewGET /v7.0/type/{dataObjectType}/view/{viewID}
list_tagsGET /v7.0/tags
get_object_tagsGET /v7.0/type/{dataObjectType}/{dataObjectGGUID}/tags
get_full_data_objectsGET /v7.0/type/{dataObjectType}/full
list_data_objects_by_view_fullGET /v7.0/type/{dataObjectType}/view/{viewID}/full
get_data_objects_bulkPOST /v7.0/type/{dataObjectType}/records (lectura a pesar de POST)
get_ticket_service_agreementsGET /v7.0/type/task/ticket/serviceagreements
get_vcardGET /v7.0/type/address/{dataObjectGGUID}/vcard
get_salutationPOST /v7.0/type/address/salutation (lectura a pesar de POST)
format_phone_numberPOST /v7.0/type/address/formatphonenumber (lectura a pesar de POST)
check_appointment_conflictsGET /v7.0/type/appointment/conflicts
get_participant_summaryGET /v7.0/type/appointment/{gguid}/participant/summary
list_appointment_participantsGET /v7.0/type/appointment/{gguid}/participant/full
get_document_fileGET /v7.0/type/document/{gguid}/file (nunca bloquea)
list_document_versionsGET /v7.0/type/document/{gguid}/file/version/list
list_email_attachmentsGET /v7.0/type/emailstore/{gguid}/attachment/list
get_email_attachmentGET /v7.0/type/emailstore/{gguid}/attachment/{attachmentId}
get_email_fileGET /v7.0/type/emailstore/{gguid}/file
list_object_permissionsGET /v7.0/type/{t}/{gguid}/permission/full
list_distributionsGET /v7.0/type/gwdistribution/list
list_distribution_addressesGET /v7.0/type/gwdistribution/{distributionGuid}/address/list
list_report_templatesGET /v7.0/type/report/template/{templateType}
generate_reportPOST /v7.0/type/report/template/{templateGGUID} (lectura a pesar de POST — renderiza, no muta)
readme (formulario de herramienta)documento de orientación estática local del servidor

Escritura (23 — ocultas en modo de solo lectura, junto con los flujos de escritura anteriores)

HerramientaEndpoint
create_data_objectPOST /v7.0/type/{dataObjectType}
update_data_objectPUT /v7.0/type/{dataObjectType}/{dataObjectGGUID}
delete_data_objectDELETE /v7.0/type/{dataObjectType}/{dataObjectGGUID}
restore_data_objectPOST /v7.0/type/{dataObjectType}/rbin/undelete
create_linkPOST /v7.0/type/{dataObjectType}/{dataObjectGGUID}/link
delete_linkDELETE /v7.0/type/{t}/{gguid}/link/{objecttype2}/{guid2}/{attribute}
set_object_tagsPOST /v7.0/type/{dataObjectType}/{dataObjectGGUID}/tags/user
append_notesPOST /v7.0/type/{t}/{gguid}/notes/{fieldName}
create_dossier_entryPOST /v7.0/type/{dataObjectType}/{dataObjectGGUID}/dossier
delete_dossier_entryDELETE /v7.0/type/{t}/{gguid}/dossier/{dossierEntryGGUID}
set_contact_persons_activePOST /v7.0/type/address/{gguid}/contactperson/activate|deactivate
add_appointment_participantPOST /v7.0/type/appointment/{gguid}/participant
remove_appointment_participantDELETE /v7.0/type/appointment/{gguid}/participant/{participantGGUID}
set_recurrencePOST /v7.0/type/{t}/recurrence / PUT …/recurrence/{periodGuid}
delete_recurrenceDELETE /v7.0/type/{t}/recurrence/{periodGuid}
set_alarmPUT /v7.0/type/{t}/{gguid}/alarm/self
delete_alarmDELETE /v7.0/type/{t}/{gguid}/alarm/self
set_object_permissionPOST /v7.0/type/{t}/{gguid}/permission
delete_object_permissionDELETE /v7.0/type/{t}/{gguid}/permission/{permissionGGUID}
add_distribution_addressesPOST /v7.0/type/gwdistribution/{distributionGuid}/address
remove_distribution_addressDELETE /v7.0/type/gwdistribution/{distributionGuid}/address/{addressGGUID}
convert_leadPOST /v7.0/type/gwsllead/{dataObjectGGUID}/convert
recalculate_opportunity_positionsPUT /v7.0/type/gwopportunitypos/recalculatevalues

La API ascendente completa sobre la que se basa esto está confirmada como swagger.json.

Recursos

Más allá de las herramientas, el servidor expone recursos MCP para datos que cambian con poca frecuencia, para que tu agente no gaste llamadas de herramientas redescubriéndolos en cada sesión:

  • genesisworld://readme — documento de orientación estático para el propio agente (modelo de dominio, patrones de navegación, reglas de eficiencia).
  • genesisworld://types — tipos de objetos de datos accesibles para el usuario, con permisos. Caché de 15 min.
  • genesisworld://metadata/{objectType} — esquema de campos/relaciones de un tipo, p. ej. genesisworld://metadata/ADDRESS. Caché de 15 min.
  • genesisworld://views/{objectType} — vistas guardadas de un tipo, p. ej. genesisworld://views/TASK. Caché de 15 min.

Autoalojamiento con Docker

Para un servidor persistente al que puedan apuntar varios clientes (en lugar de un proceso npx por cliente):

docker run -d --name cas-genesisworld-mcp -p 8084:3000 \
  -e GENESISWORLD_BASE_URL="http://your-genesisworld-server/genesisrest.svc" \
  -e GENESISWORLD_PRODUCT_KEY="your-product-key" \
  -e GENESISWORLD_USERNAME="your-username" \
  -e GENESISWORLD_PASSWORD="your-password" \
  vaatu/cas-genesis-world-mcp

# Read-only mode: append --read-only after the image name
docker run -d --name cas-genesisworld-mcp -p 8084:3000 \
  -e GENESISWORLD_BASE_URL="http://your-genesisworld-server/genesisrest.svc" \
  -e GENESISWORLD_PRODUCT_KEY="your-product-key" \
  -e GENESISWORLD_USERNAME="your-username" \
  -e GENESISWORLD_PASSWORD="your-password" \
  vaatu/cas-genesis-world-mcp --read-only

O con docker compose, usando docker-compose.yml (raíz del repositorio) y .env.example:

cp .env.example .env   # fill in your values — .env is gitignored
docker compose up -d

Para --read-only, descomenta la línea command: correspondiente en docker-compose.yml — las opciones de lanzamiento son solo banderas de CLI, nunca entradas de .env, por lo que la selección de modo permanece en el archivo de composición en lugar de .env. Para --client-credentials, usa docker-compose.client-credentials.yml en su lugar (consulta "Multiinquilino" más abajo) — tiene esa bandera activa por defecto, en lugar de hacer que la descomentes en el archivo principal.

Multiinquilino: un servidor, muchas identidades de genesisWorld

Por defecto, el contenedor tiene un usuario fijo de genesisWorld para cada cliente que se conecta. Con --client-credentials, no tiene ninguno — cada cliente se autentica como sí mismo, por lo que un servidor puede atender de forma segura a varias personas/equipos con diferentes inicios de sesión de genesisWorld. La clave de producto permanece en el lado del servidor en cualquier caso — identifica tu licencia de producto, no a un usuario, por lo que no es algo que un cliente deba proporcionar:

docker run -d --name cas-genesisworld-mcp -p 8084:3000 \
  -e GENESISWORLD_BASE_URL="http://your-genesisworld-server/genesisrest.svc" \
  -e GENESISWORLD_PRODUCT_KEY="your-product-key" \
  vaatu/cas-genesis-world-mcp --client-credentials

O con docker compose, usando docker-compose.client-credentials.yml (solo GENESISWORLD_BASE_URL/GENESISWORLD_PRODUCT_KEY necesitan valores en .env aquí — deja GENESISWORLD_USERNAME/PASSWORD sin establecer, cada cliente aporta los suyos):

cp .env.example .env   # fill in your values — .env is gitignored
docker compose -f docker-compose.client-credentials.yml up -d

Cada cliente envía entonces sus propias credenciales al conectarse — de dos formas, la que admita tu cliente MCP:

Cabecera Authorization: Basic estándar (preferida — funciona con el flujo integrado "Añadir conector personalizado" de Claude, que rechaza nombres de cabecera personalizados arbitrarios a menos que Anthropic los preapruebe):

{
  "mcpServers": {
    "cas-genesisworld": {
      "url": "http://localhost:8084/mcp",
      "headers": {
        "Authorization": "Basic base64(your-username:your-password)"
      }
    }
  }
}

O cabeceras personalizadas, para clientes que admiten cabeceras arbitrarias pero no tienen una opción de primera clase de "Autenticación básica" (si Authorization: Basic está presente, gana — estas solo se usan como respaldo):

{
  "mcpServers": {
    "cas-genesisworld": {
      "url": "http://localhost:8084/mcp",
      "headers": {
        "X-GenesisWorld-Username": "your-username",
        "X-GenesisWorld-Password": "your-password"
      }
    }
  }
}

No hay cabecera de clave de producto (ni espacio para clave de producto en el valor de Authorization tampoco) — GENESISWORLD_PRODUCT_KEY en el servidor se usa para cada cliente, siempre; los clientes no pueden establecerla ni anularla. Solo transporte HTTP (no hay canal de cabeceras por solicitud en stdio); una solicitud que carezca de credenciales válidas por cualquiera de las dos vías se rechaza directamente (HTTP 401), nunca recurre a una identidad compartida.

El endpoint MCP ahora está en http://localhost:8084/mcp. Apunta tu cliente hacia él:

{
  "mcpServers": {
    "cas-genesisworld": {
      "url": "http://localhost:8084/mcp"
    }
  }
}

Configuración

Dos tipos de ajustes, mantenidos estrictamente separados — ningún ajuste es ambos: Entornos configuran el despliegue (dónde vive la API, quién se conecta); opciones de lanzamiento alternan el comportamiento al inicio.

Entornos

VariableRequeridoPropósito
GENESISWORLD_BASE_URLsíURL base del servicio REST, p. ej. http://demo.cas.de/genesisrest.svc
GENESISWORLD_PRODUCT_KEYsíSe envía como X-CAS-PRODUCT-KEY en cada solicitud. Siempre requerido — incluso en modo --client-credentials, donde identifica tu licencia de producto y permanece en el lado del servidor, nunca suministrable por el cliente
GENESISWORLD_USERNAMEsí*Usuario de autenticación básica
GENESISWORLD_PASSWORDsí*Contraseña de autenticación básica
MCP_TRANSPORTnohttp (predeterminado en Docker) o stdio
MCP_HOST / MCP_PORTnoDirección de enlace para modo HTTP (predeterminado 0.0.0.0:3000)
GENESISWORLD_MAX_RESULT_CHARSnoTruncar respuestas sobredimensionadas (predeterminado 60000 caracteres; 0 desactiva)
GENESISWORLD_QUIETnotrue desactiva el registro de errores por solicitud en stderr

* Requerido en la práctica para que cualquier solicitud real tenga éxito — excepto en modo --client-credentials (ver más abajo), donde el servidor no tiene una identidad fija de usuario y estos dos no son requeridos (cada cliente trae la suya propia en su lugar).

Opciones de lanzamiento

FlagRequeridoPropósito
--read-onlynoRegistra solo herramientas de lectura para esa sesión — las herramientas de mutación no solo están bloqueadas, no existen
--client-credentialsnoEl servidor no mantiene una identidad fija de usuario de genesisWorld; cada cliente HTTP se autentica a sí mismo mediante encabezados de solicitud (ver "Multi-tenant" arriba). La clave de producto permanece en el lado del servidor. Solo transporte HTTP

Pasa las opciones de lanzamiento en la línea de comandos, o después del nombre de la imagen en docker run (como se muestra arriba). Ninguna de ellas tiene un equivalente de variable de entorno, por diseño.

Licencia

MIT


¿Quieres agregar una herramienta o entender cómo está construido? Consulta AGENTS.md para la arquitectura y documentación para contribuidores, y ROADMAP.md para el plan del proyecto.