dmcc: AVAYA DMCC API bindings and WebSockets server for AVAYA

[ bsd3, library, network, program ] [ Propose Tags ]

Partial implementation of CSTA Phase III XML Protocol (ECMA-323) with AVAYA (DMCC 6.3) extensions.

[Skip to Readme]
Change log
Dependencies aeson (<1.3), base (<4.12), binary (<0.9), bytestring (<0.11), case-insensitive (<1.3), classy-prelude (<1.5), configurator (<0.4), containers (<0.6), dmcc, HsOpenSSL (<0.12), http-client (<0.6), io-streams (<1.6), lens (<4.17), monad-control (<1.1), monad-logger (<0.4), network (<2.7), openssl-streams (<1.3), random (<1.2), safe-exceptions (<0.2), stm (<2.5), text (<1.3), time (<1.9), transformers-base (<0.5), unix (<2.8), unliftio (<0.3), websockets (<0.13), xml-conduit (<1.9), xml-hamlet (<0.6) [details]
License BSD-3-Clause
Author Max Taldykin, Timofey Cherganov, Dmitry Dzhus, Viacheslav Lotsmanov
Category Network
Home page
Bug tracker
Source repo head: git clone
Uploaded by DmitryDzhus at Thu May 10 16:15:52 UTC 2018
Distributions NixOS:
Executables dmcc-ws
Downloads 64 total (11 in the last 30 days)
Rating (no votes yet) [estimated by rule of succession]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2018-05-10 [all 1 reports]
Hackage Matrix CI




Maintainer's Corner

For package maintainers and hackage trustees

Readme for dmcc-

[back to package description]

dmcc: AVAYA library for Haskell

Travis CI build status Hackage Hackage deps

This package contains a Haskell library which may be used to implement computer telephony integration using AVAYA DMCC XML API. A simple server (dmcc-ws) built atop the library is also included. The server allows clients use JSON-over-WebSockets to control AVAYA agents, receive event notifications and agent state updates.

The package uses third-party call control functions of DMCC API. There's no first-party call control support and no access to media streams.

AVAYA DMCC XML API is largely based on ECMA-354 (CSTA Phase III) standard, so in theory the package can be used with other compliant telephony solutions.


  • First-party interface for most of call control functions (making and answering calls, hold, conference call, transfer, barge in, state control).

  • State change events (implemented in the library using polling to compensate for the lack of a native implementation in DMCC 6.x).

  • Webhook support (the library can send HTTP requests in response to agent state change events).

Site-specific notes

One basic TSAPI license is consumed for every agent controlled by the library.

DMCC 6.x is supported. Consult your Avaya AES administration page to check for software versions and available licenses.

dmcc-ws server

The server exposes portions of Haskell library interface via WebSockets using JSON messages for client-server exchange. Its purpose is to provide a clean agent-centric interface to DMCC API suitable for usage from client applications running in a browser.

The server is invoked as dmcc-ws dmcc-ws.cfg. See example configuration file at dmcc-ws/example.cfg.

With dmcc-ws running, you may start controlling an agent with extension XXX, connect to WebSocket URL http://host:port/XXX. The server accepts client commands in JSON:

{"action":"MakeCall", "number":"989150603267"}

Consult DMCC.Action documentation in Haddock docs for DMCC library for supported commands.

The server reports telephony events along with updated agent snapshot:

  "newSnapshot": {
    "state": ["Busy", ""],
    "calls": {
      "179": {
        "failed": false,
        "held": false,
        "ucid": "00001001791428242051",
        "interlocutors": [
        "start": "2015-04-05T13:52:52.803Z",
        "direction": {
          "contents": [],
          "dir": "Out"
        "answered": "2015-04-05T13:53:02.686Z"
  "dmccEvent": {
    "callId": "179",
    "event": "EstablishedEvent"
  "tag": "TelephonyEvent"

Client applications may use events to update their UI incrementally or re-process the whole state every time an event arrives.


On macOS with openssl installed via Homebrew, build with

stack build --extra-include-dirs=/usr/local/opt/openssl/include/ --extra-lib-dirs=/usr/local/opt/openssl/lib/