CAS Genesis World MCP

An MCP server for the CAS genesisWorld REST Webservice v7.0.

Documentation

CAS genesisWorld

cas-genesisworld-mcp

npm Docker CI License: MIT

Connect Claude, Cursor, or any MCP-compatible AI agent to your CAS genesisWorld CRM. Search contacts, manage tasks and appointments, and read or write records — through natural language, without writing a single API call.

  • 67 tools, including 7 native flows that bundle multi-step CRM operations (like checking for scheduling conflicts before booking a meeting, or checking for duplicates before creating a contact) into a single call.
  • Full read/write access to tasks, contacts, appointments, documents, distribution lists, and more — plus generic access to any custom object type your installation defines.
  • Read-only mode available for safe, exploratory use.
  • Ships as a ready-made Docker image or npm package.

Quick start

Add this to your MCP client's config (e.g. Claude Desktop's claude_desktop_config.json):

{
  "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"
      }
    }
  }
}

Restart your client — the tools show up automatically. Ask your agent to find a contact, list your open tasks, or book a meeting, and it takes it from there.

Prefer a persistent, self-hosted server instead of a per-client process? See Self-hosting with Docker below.

What you can ask it

Once connected, your agent can handle requests like:

  • "Find the contact info for Jane Doe and show me her open tasks."
  • "Create a follow-up task for this lead and link it to their contact record."
  • "Book a meeting with the sales team next Tuesday at 10am — check everyone's calendar for conflicts first."
  • "Check for possible duplicates before creating a new contact for Acme Corp."

Requests like these are answered by flows — single tool calls that bundle the multi-step sequence of API requests a human would otherwise have to script by hand.

Tools & flows

Flows — compound actions, one call each

FlowModeWhat it does
my_open_tasksreadCurrent user + their task list (due window, saved view, or full-text filter) in one call
task_overviewreadTask record + links + tags, fetched in parallel
create_taskwriteCreate a task and optionally link it to another object (e.g. a contact)
find_contactreadContact search by name and/or phone number, in parallel
contact_360readContact + collection dossier + tags + links, fetched in parallel
create_address_safewriteDuplicate check first — creates only when no candidates are found
create_appointment_safewriteOptional conflict check → create → add participants, in one call
Full tool reference (60 atomic tools)

Read (37)

ToolEndpoint
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 (read despite 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 (read despite POST)
format_phone_numberPOST /v7.0/type/address/formatphonenumber (read despite 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 (never locks)
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
readme (tool form)server-local static orientation document

Write (23 — hidden in read-only mode, along with the write flows above)

ToolEndpoint
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

The full upstream API this is built on is committed as swagger.json.

Resources

Beyond tools, the server exposes MCP resources for data that rarely changes, so your agent doesn't burn tool calls rediscovering it every session:

  • genesisworld://readme — static orientation document for the agent itself (domain model, navigation patterns, efficiency rules).
  • genesisworld://types — data-object types accessible to the user, with permissions. Cached 15 min.
  • genesisworld://metadata/{objectType} — field/relationship schema of one type, e.g. genesisworld://metadata/ADDRESS. Cached 15 min.
  • genesisworld://views/{objectType} — saved views of one type, e.g. genesisworld://views/TASK. Cached 15 min.

Self-hosting with Docker

For a persistent server multiple clients can point at (instead of one npx process per client):

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

The MCP endpoint is now at http://localhost:8084/mcp. Point your client at it:

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

Configuration

Two kinds of settings, kept strictly separate — no setting is both: Environments configure the deployment (where the API lives, who connects); launch options toggle behavior at startup.

Environments

VariableRequiredPurpose
GENESISWORLD_BASE_URLyesBase URL of the REST service, e.g. http://demo.cas.de/genesisrest.svc
GENESISWORLD_PRODUCT_KEYyesSent as X-CAS-PRODUCT-KEY on every request
GENESISWORLD_USERNAMEyes*Basic Auth user
GENESISWORLD_PASSWORDyes*Basic Auth password
MCP_TRANSPORTnohttp (default in Docker) or stdio
MCP_HOST / MCP_PORTnoBind address for HTTP mode (default 0.0.0.0:3000)
GENESISWORLD_MAX_RESULT_CHARSnoTruncate oversized responses (default 60000 chars; 0 disables)
GENESISWORLD_QUIETnotrue disables per-request stderr logging

* Required in practice for any real request to succeed.

Launch options

FlagRequiredPurpose
--read-onlynoRegisters only read tools for that session — mutating tools are not merely blocked, they don't exist

Pass launch options on the command line, or after the image name in docker run (as shown above). None of them have an environment-variable equivalent, by design.

License

MIT


Want to add a tool or understand how this is built? See AGENTS.md for architecture and contributor docs, and ROADMAP.md for the project plan.