CAS Genesis World MCP
Un servidor MCP para el servicio web REST de CAS genesisWorld v7.0.
Documentación
cas-genesisworld-mcp
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
| Flujo | Modo | Qué hace |
|---|---|---|
my_open_tasks | lectura | Usuario actual + su lista de tareas (ventana de vencimiento, vista guardada o filtro de texto completo) en una llamada |
task_overview | lectura | Registro de tarea + enlaces + etiquetas, obtenidos en paralelo |
create_task | escritura | Crear una tarea y opcionalmente vincularla a otro objeto (p. ej., un contacto) |
find_contact | lectura | Búsqueda de contactos por nombre y/o número de teléfono, en paralelo |
contact_360 | lectura | Contacto + dossier de colección + etiquetas + enlaces, obtenidos en paralelo |
create_address_safe | escritura | Verificación de duplicados primero — crea solo cuando no se encuentran candidatos |
create_appointment_safe | escritura | Verificación opcional de conflictos → crear → añadir participantes, en una llamada |
Referencia completa de herramientas (62 herramientas atómicas)
Lectura (39)
| Herramienta | Endpoint |
|---|---|
smart_search | GET /v7.0/smartsearch |
get_data_object | GET /v7.0/type/{dataObjectType}/{dataObjectGGUID} |
get_dossier | GET /v7.0/type/{dataObjectType}/{dataObjectGGUID}/dossier/full |
list_data_objects | GET /v7.0/type/{dataObjectType}/list |
list_views | GET /v7.0/type/{dataObjectType}/view/list |
list_data_objects_by_view | GET /v7.0/type/{dataObjectType}/view/{viewID}/list |
list_available_data_object_types | GET /v7.0/user/self/dataobjecttypepermission/list |
get_data_object_types_metadata | GET /v7.0/metadata |
list_links | GET /v7.0/type/{dataObjectType}/{dataObjectGGUID}/link/list |
list_recent_data_objects | GET /v7.0/type/{dataObjectType}/recent/list |
get_available_products | GET /v7.0/type/gwopportunity/availableproducts |
get_data_object_count | GET /v7.0/type/{dataObjectType}/count |
get_primary_link_parents | GET /v7.0/type/{dataObjectType}/{dataObjectGGUID}/primarylinkparents |
list_users | GET /v7.0/user/list |
get_user_self | GET /v7.0/user/self |
get_view | GET /v7.0/type/{dataObjectType}/view/{viewID} |
list_tags | GET /v7.0/tags |
get_object_tags | GET /v7.0/type/{dataObjectType}/{dataObjectGGUID}/tags |
get_full_data_objects | GET /v7.0/type/{dataObjectType}/full |
list_data_objects_by_view_full | GET /v7.0/type/{dataObjectType}/view/{viewID}/full |
get_data_objects_bulk | POST /v7.0/type/{dataObjectType}/records (lectura a pesar de POST) |
get_ticket_service_agreements | GET /v7.0/type/task/ticket/serviceagreements |
get_vcard | GET /v7.0/type/address/{dataObjectGGUID}/vcard |
get_salutation | POST /v7.0/type/address/salutation (lectura a pesar de POST) |
format_phone_number | POST /v7.0/type/address/formatphonenumber (lectura a pesar de POST) |
check_appointment_conflicts | GET /v7.0/type/appointment/conflicts |
get_participant_summary | GET /v7.0/type/appointment/{gguid}/participant/summary |
list_appointment_participants | GET /v7.0/type/appointment/{gguid}/participant/full |
get_document_file | GET /v7.0/type/document/{gguid}/file (nunca bloquea) |
list_document_versions | GET /v7.0/type/document/{gguid}/file/version/list |
list_email_attachments | GET /v7.0/type/emailstore/{gguid}/attachment/list |
get_email_attachment | GET /v7.0/type/emailstore/{gguid}/attachment/{attachmentId} |
get_email_file | GET /v7.0/type/emailstore/{gguid}/file |
list_object_permissions | GET /v7.0/type/{t}/{gguid}/permission/full |
list_distributions | GET /v7.0/type/gwdistribution/list |
list_distribution_addresses | GET /v7.0/type/gwdistribution/{distributionGuid}/address/list |
list_report_templates | GET /v7.0/type/report/template/{templateType} |
generate_report | POST /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)
| Herramienta | Endpoint |
|---|---|
create_data_object | POST /v7.0/type/{dataObjectType} |
update_data_object | PUT /v7.0/type/{dataObjectType}/{dataObjectGGUID} |
delete_data_object | DELETE /v7.0/type/{dataObjectType}/{dataObjectGGUID} |
restore_data_object | POST /v7.0/type/{dataObjectType}/rbin/undelete |
create_link | POST /v7.0/type/{dataObjectType}/{dataObjectGGUID}/link |
delete_link | DELETE /v7.0/type/{t}/{gguid}/link/{objecttype2}/{guid2}/{attribute} |
set_object_tags | POST /v7.0/type/{dataObjectType}/{dataObjectGGUID}/tags/user |
append_notes | POST /v7.0/type/{t}/{gguid}/notes/{fieldName} |
create_dossier_entry | POST /v7.0/type/{dataObjectType}/{dataObjectGGUID}/dossier |
delete_dossier_entry | DELETE /v7.0/type/{t}/{gguid}/dossier/{dossierEntryGGUID} |
set_contact_persons_active | POST /v7.0/type/address/{gguid}/contactperson/activate|deactivate |
add_appointment_participant | POST /v7.0/type/appointment/{gguid}/participant |
remove_appointment_participant | DELETE /v7.0/type/appointment/{gguid}/participant/{participantGGUID} |
set_recurrence | POST /v7.0/type/{t}/recurrence / PUT …/recurrence/{periodGuid} |
delete_recurrence | DELETE /v7.0/type/{t}/recurrence/{periodGuid} |
set_alarm | PUT /v7.0/type/{t}/{gguid}/alarm/self |
delete_alarm | DELETE /v7.0/type/{t}/{gguid}/alarm/self |
set_object_permission | POST /v7.0/type/{t}/{gguid}/permission |
delete_object_permission | DELETE /v7.0/type/{t}/{gguid}/permission/{permissionGGUID} |
add_distribution_addresses | POST /v7.0/type/gwdistribution/{distributionGuid}/address |
remove_distribution_address | DELETE /v7.0/type/gwdistribution/{distributionGuid}/address/{addressGGUID} |
convert_lead | POST /v7.0/type/gwsllead/{dataObjectGGUID}/convert |
recalculate_opportunity_positions | PUT /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
| Variable | Requerido | Propósito |
|---|---|---|
GENESISWORLD_BASE_URL | sí | URL base del servicio REST, p. ej. http://demo.cas.de/genesisrest.svc |
GENESISWORLD_PRODUCT_KEY | sí | 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_USERNAME | sí* | Usuario de autenticación básica |
GENESISWORLD_PASSWORD | sí* | Contraseña de autenticación básica |
MCP_TRANSPORT | no | http (predeterminado en Docker) o stdio |
MCP_HOST / MCP_PORT | no | Dirección de enlace para modo HTTP (predeterminado 0.0.0.0:3000) |
GENESISWORLD_MAX_RESULT_CHARS | no | Truncar respuestas sobredimensionadas (predeterminado 60000 caracteres; 0 desactiva) |
GENESISWORLD_QUIET | no | true 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
| Flag | Requerido | Propósito |
|---|---|---|
--read-only | no | Registra solo herramientas de lectura para esa sesión — las herramientas de mutación no solo están bloqueadas, no existen |
--client-credentials | no | El 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
¿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.