CAS Genesis World MCP
Um servidor MCP para o CAS genesisWorld REST Webservice v7.0.
Documentação
cas-genesisworld-mcp
Conecte o Claude, o Cursor ou qualquer agente de IA compatível com MCP ao seu CRM CAS genesisWorld. Pesquise contatos, gerencie tarefas e compromissos, e leia ou grave registros — por meio de linguagem natural, sem escrever uma única chamada de API.
- 69 ferramentas, incluindo 7 fluxos nativos que agrupam operações de CRM em várias etapas (como verificar conflitos de agenda antes de agendar uma reunião, ou verificar duplicatas antes de criar um contato) em uma única chamada.
- Acesso total de leitura/gravação a tarefas, contatos, compromissos, documentos, listas de distribuição e muito mais — além de acesso genérico a qualquer tipo de objeto personalizado que sua instalação definir.
- Modo somente leitura disponível para uso exploratório e seguro.
- Distribuído como uma imagem Docker pronta ou um pacote npm.
Início rápido
Adicione isto à configuração do seu cliente MCP (por exemplo, o
claude_desktop_config.json do 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"
}
}
}
}
Reinicie o cliente — as ferramentas aparecem automaticamente. Peça ao seu agente para encontrar um contato, listar suas tarefas abertas ou agendar uma reunião, e ele cuida do resto.
Prefere um servidor persistente e auto-hospedado em vez de um processo por cliente? Veja Auto-hospedagem com Docker abaixo.
O que você pode pedir
Depois de conectado, seu agente pode lidar com solicitações como:
- "Encontre as informações de contato da Jane Doe e mostre as tarefas abertas dela."
- "Crie uma tarefa de acompanhamento para este lead e vincule-a ao registro de contato dele."
- "Agende uma reunião com o time de vendas na próxima terça às 10h — verifique primeiro se há conflitos na agenda de todos."
- "Verifique possíveis duplicatas antes de criar um novo contato para a Acme Corp."
- "Gere um relatório para esta oportunidade."
Solicitações como essas são respondidas por fluxos — chamadas de ferramenta únicas que agrupam a sequência de várias etapas de solicitações de API que um humano teria que programar manualmente.
Ferramentas e fluxos
Fluxos — ações compostas, uma chamada cada
| Fluxo | Modo | O que faz |
|---|---|---|
my_open_tasks | leitura | Usuário atual + lista de tarefas dele (janela de vencimento, visão salva ou filtro de texto completo) em uma chamada |
task_overview | leitura | Registro de tarefa + links + tags, buscados em paralelo |
create_task | gravação | Criar uma tarefa e, opcionalmente, vinculá-la a outro objeto (ex.: um contato) |
find_contact | leitura | Pesquisa de contato por nome e/ou número de telefone, em paralelo |
contact_360 | leitura | Contato + dossiê da coleção + tags + links, buscados em paralelo |
create_address_safe | gravação | Verificação de duplicatas primeiro — cria somente quando nenhum candidato é encontrado |
create_appointment_safe | gravação | Verificação opcional de conflitos → criar → adicionar participantes, em uma chamada |
Referência completa de ferramentas (62 ferramentas atômicas)
Leitura (39)
| Ferramenta | 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 (leitura apesar 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 (leitura apesar de POST) |
format_phone_number | POST /v7.0/type/address/formatphonenumber (leitura apesar 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 bloqueia) |
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} (leitura apesar de POST — renderiza, não altera) |
readme (formulário de ferramenta) | documento de orientação estática local do servidor |
Gravação (23 — ocultas no modo somente leitura, junto com os fluxos de gravação acima)
| Ferramenta | 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 |
A API upstream completa na qual isso se baseia está registrada como
swagger.json.
Recursos
Além das ferramentas, o servidor expõe recursos MCP para dados que raramente mudam, para que seu agente não gaste chamadas de ferramenta redescobrindo-os a cada sessão:
genesisworld://readme— documento de orientação estática para o próprio agente (modelo de domínio, padrões de navegação, regras de eficiência).genesisworld://types— tipos de objetos de dados acessíveis ao usuário, com permissões. Cache de 15 min.genesisworld://metadata/{objectType}— esquema de campos/relacionamentos de um tipo, ex.:genesisworld://metadata/ADDRESS. Cache de 15 min.genesisworld://views/{objectType}— visões salvas de um tipo, ex.:genesisworld://views/TASK. Cache de 15 min.
Auto-hospedagem com Docker
Para um servidor persistente ao qual vários clientes possam apontar (em vez de um
processo 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
Ou com docker compose, usando docker-compose.yml
(raiz do repositório) e .env.example:
cp .env.example .env # fill in your values — .env is gitignored
docker compose up -d
Para --read-only, descomente a linha command: correspondente em
docker-compose.yml — as opções de inicialização são apenas flags de CLI, nunca
entradas .env, para que a seleção de modo permaneça no arquivo compose em vez de .env.
Para --client-credentials, use
docker-compose.client-credentials.yml
em vez disso (veja "Multi-inquilino" abaixo) — ele tem essa flag ativa por padrão,
em vez de fazer você descomentá-la no arquivo principal.
Multi-inquilino: um servidor, muitas identidades genesisWorld
Por padrão, o contêiner tem um usuário genesisWorld fixo para cada
cliente que se conecta. Com --client-credentials, ele não tem nenhum — cada
cliente se autentica como ele mesmo, então um servidor pode atender com segurança várias
pessoas/equipes com logins genesisWorld diferentes. A chave do produto permanece
no lado do servidor de qualquer forma — ela identifica sua licença de produto, não um usuário,
portanto não é algo que um cliente fornece:
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
Ou com docker compose, usando
docker-compose.client-credentials.yml
(somente GENESISWORLD_BASE_URL/GENESISWORLD_PRODUCT_KEY precisam de valores em
.env aqui — deixe GENESISWORLD_USERNAME/PASSWORD não definidos, cada cliente
traz os seus próprios):
cp .env.example .env # fill in your values — .env is gitignored
docker compose -f docker-compose.client-credentials.yml up -d
Cada cliente então envia suas próprias credenciais ao se conectar — de duas maneiras, dependendo do que seu cliente MCP suporta:
Cabeçalho Authorization: Basic padrão (preferido — funciona com
o fluxo "Adicionar conector personalizado" integrado do Claude, que rejeita
nomes de cabeçalho personalizados arbitrários, a menos que a Anthropic os aprove
previamente):
{
"mcpServers": {
"cas-genesisworld": {
"url": "http://localhost:8084/mcp",
"headers": {
"Authorization": "Basic base64(your-username:your-password)"
}
}
}
}
Ou cabeçalhos personalizados, para clientes que suportam cabeçalhos arbitrários, mas
não têm uma opção de primeira classe de "Autenticação Básica" (se Authorization: Basic estiver presente,
ele vence — estes são usados apenas como fallback):
{
"mcpServers": {
"cas-genesisworld": {
"url": "http://localhost:8084/mcp",
"headers": {
"X-GenesisWorld-Username": "your-username",
"X-GenesisWorld-Password": "your-password"
}
}
}
}
Não há cabeçalho de chave de produto (e nenhum campo de chave de produto no
valor Authorization também) — GENESISWORLD_PRODUCT_KEY no servidor
é usado para todos os clientes, sempre; os clientes não podem defini-lo ou substituí-lo. Transporte
HTTP apenas (não há canal de cabeçalho por solicitação no stdio); uma
solicitação sem credenciais válidas por qualquer um dos caminhos é rejeitada imediatamente
(HTTP 401), nunca cai em uma identidade compartilhada.
O endpoint MCP agora está em http://localhost:8084/mcp. Aponte seu cliente
para ele:
{
"mcpServers": {
"cas-genesisworld": {
"url": "http://localhost:8084/mcp"
}
}
}
Configuração
Dois tipos de configurações, mantidos estritamente separados — nenhuma configuração é ambos: Ambientes configuram a implantação (onde a API vive, quem se conecta); opções de inicialização alternam o comportamento na inicialização.
Ambientes
| Variável | Obrigatória | Finalidade |
|---|---|---|
GENESISWORLD_BASE_URL | sim | URL base do serviço REST, ex.: http://demo.cas.de/genesisrest.svc |
GENESISWORLD_PRODUCT_KEY | sim | Enviada como X-CAS-PRODUCT-KEY em toda requisição. Sempre obrigatória — inclusive no modo --client-credentials, onde identifica sua licença de produto e permanece no lado do servidor, nunca fornecida pelo cliente |
GENESISWORLD_USERNAME | sim* | Usuário de autenticação básica |
GENESISWORLD_PASSWORD | sim* | Senha de autenticação básica |
MCP_TRANSPORT | não | http (padrão no Docker) ou stdio |
MCP_HOST / MCP_PORT | não | Endereço de bind para o modo HTTP (padrão 0.0.0.0:3000) |
GENESISWORLD_MAX_RESULT_CHARS | não | Trunca respostas excessivamente grandes (padrão 60000 caracteres; 0 desativa) |
GENESISWORLD_QUIET | não | true desativa o registro de stderr por requisição |
* Obrigatória na prática para qualquer requisição real ter sucesso — exceto no
modo --client-credentials (veja abaixo), onde o servidor não possui uma identidade
fixa de usuário e essas duas não são obrigatórias (cada cliente traz a sua
própria).
Opções de inicialização
| Flag | Obrigatória | Finalidade |
|---|---|---|
--read-only | não | Registra apenas ferramentas de leitura para aquela sessão — ferramentas de mutação não são meramente bloqueadas, elas não existem |
--client-credentials | não | O servidor não mantém identidade fixa de usuário genesisWorld; cada cliente HTTP se autentica via cabeçalhos de requisição (veja "Multi-tenant" acima). A chave do produto permanece no lado do servidor. Somente transporte HTTP |
Passe as opções de inicialização na linha de comando, ou após o nome da imagem em
docker run (como mostrado acima). Nenhuma delas possui equivalente
em variável de ambiente, por design.
Licença
Quer adicionar uma ferramenta ou entender como isso é construído? Veja AGENTS.md para documentação de arquitetura e contribuidores, e ROADMAP.md para o plano do projeto.