CAS Genesis World MCP

Um servidor MCP para o CAS genesisWorld REST Webservice v7.0.

Documentação

CAS genesisWorld

cas-genesisworld-mcp

npm Docker CI License: MIT

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

FluxoModoO que faz
my_open_tasksleituraUsuário atual + lista de tarefas dele (janela de vencimento, visão salva ou filtro de texto completo) em uma chamada
task_overviewleituraRegistro de tarefa + links + tags, buscados em paralelo
create_taskgravaçãoCriar uma tarefa e, opcionalmente, vinculá-la a outro objeto (ex.: um contato)
find_contactleituraPesquisa de contato por nome e/ou número de telefone, em paralelo
contact_360leituraContato + dossiê da coleção + tags + links, buscados em paralelo
create_address_safegravaçãoVerificação de duplicatas primeiro — cria somente quando nenhum candidato é encontrado
create_appointment_safegravaçãoVerificação opcional de conflitos → criar → adicionar participantes, em uma chamada
Referência completa de ferramentas (62 ferramentas atômicas)

Leitura (39)

FerramentaEndpoint
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 (leitura apesar 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 (leitura apesar de POST)
format_phone_numberPOST /v7.0/type/address/formatphonenumber (leitura apesar 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 bloqueia)
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} (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)

FerramentaEndpoint
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

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ávelObrigatóriaFinalidade
GENESISWORLD_BASE_URLsimURL base do serviço REST, ex.: http://demo.cas.de/genesisrest.svc
GENESISWORLD_PRODUCT_KEYsimEnviada 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_USERNAMEsim*Usuário de autenticação básica
GENESISWORLD_PASSWORDsim*Senha de autenticação básica
MCP_TRANSPORTnãohttp (padrão no Docker) ou stdio
MCP_HOST / MCP_PORTnãoEndereço de bind para o modo HTTP (padrão 0.0.0.0:3000)
GENESISWORLD_MAX_RESULT_CHARSnãoTrunca respostas excessivamente grandes (padrão 60000 caracteres; 0 desativa)
GENESISWORLD_QUIETnãotrue 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

FlagObrigatóriaFinalidade
--read-onlynãoRegistra apenas ferramentas de leitura para aquela sessão — ferramentas de mutação não são meramente bloqueadas, elas não existem
--client-credentialsnãoO 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

MIT


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.