Skip to main content
Glama
mcp-daktela
by hajekd

mcp-daktela

Read-only MCP server for the Daktela contact center REST API v6. Gives any MCP-compatible LLM client (Claude, Cursor, etc.) full read access to tickets, calls, emails, chats, contacts, CRM records, campaigns, and real-time agent status.

Why

A contact center generates thousands of interactions daily — calls, emails, chats across multiple channels. The raw data is all in Daktela, but extracting insight from it requires either manual review or custom reporting. This server bridges Daktela to an LLM, letting you run analysis that would be impractical to do by hand:

Email quality audit — "Analyze all emails from the last 72 hours. Flag any interactions with negative customer sentiment, lost deals where the customer chose a competitor, or unprofessional agent tone. For each flagged email, show metadata, a link to the ticket, and a description of the issue."

Call transcript analysis — "Review call transcripts from the last week. Identify calls where the customer escalated, the agent struggled with product knowledge, or a commitment was made but not followed up. Summarize each with the agent name, customer, and recommended action."

Sales pipeline review — "Look at all open sales tickets in S1-Discovery and S2-Qualification stages. For each lead, read the latest email thread and assess whether the deal is progressing, stalled, or at risk. Rank by MRR and recommend which ones need attention this week."

The LLM reads the actual conversation content — email bodies, chat messages, call transcripts — and applies judgment that no dashboard or filter can replicate.

Related MCP server: datagate-mcp

Tools

40 read-only tools organized by domain:

Category

Tools

Tickets

list_tickets, count_tickets, get_ticket, get_ticket_detail, list_account_tickets, list_ticket_categories

Activities

list_activities, get_activity

Calls

list_calls, get_call, get_call_transcript, list_call_transcripts

Emails

list_emails, get_email

Messaging

list_web_chats, get_web_chat, list_sms_chats, get_sms, list_messenger_chats, get_messenger_chat, list_instagram_chats, get_instagram_chat, list_whatsapp_chats, get_whatsapp_chat, list_viber_chats, get_viber_chat

Contacts & CRM

list_contacts, get_contact, list_accounts, get_account, list_crm_records

Campaigns

list_campaign_records, list_campaign_types

Reference data

list_queues, list_users, list_groups, list_pauses, list_statuses, list_templates

Real-time

list_realtime_sessions

All list tools support pagination (skip, take), sorting, and contextual filters (stage, priority, date range, user, queue, etc.). The server includes detailed instructions metadata that teaches the LLM how to use filters, resolve entity names, and navigate relationships between tickets, contacts, and accounts.

Getting started

Prerequisites

  • Python 3.12+

  • A Daktela instance with a user account that has API access

  • uv (recommended) or pip

Install

git clone https://github.com/hajekd/mcp-daktela.git
cd mcp-daktela
uv venv && uv pip install -e ".[dev]"

Run locally with Claude Desktop

Set your Daktela credentials and point Claude Desktop at the server:

{
  "mcpServers": {
    "daktela": {
      "command": "python",
      "args": ["-m", "mcp_daktela"],
      "env": {
        "DAKTELA_URL": "https://your-instance.daktela.com",
        "DAKTELA_USERNAME": "your-username",
        "DAKTELA_PASSWORD": "your-password"
      }
    }
  }
}

That's it. The server authenticates against your Daktela instance using the same credentials you use to log in. You can also use DAKTELA_ACCESS_TOKEN instead of username/password if you have a static API token.

Deploy as HTTP server

For shared or remote deployments (e.g., Cloud Run), the server runs in streamable-http mode where each client passes credentials via HTTP headers:

gcloud run deploy mcp-daktela \
  --source . \
  --region europe-west1 \
  --allow-unauthenticated \
  --memory 1Gi

The server also includes a built-in OAuth 2.0 provider for use as a remote MCP server on Claude.ai.

Architecture

src/mcp_daktela/
├── server.py              MCP tool definitions (40 tools)
├── formatting.py          Format API records into readable markdown
├── client.py              Async HTTP client for Daktela REST API
├── filters.py             Build query parameters (filter/sort/pagination)
├── oauth.py               OAuth 2.0 provider for Claude.ai remote MCP
├── auth.py                Per-request credential middleware
├── config.py              Credential resolution (ContextVar → env vars)
├── cache.py               In-process TTL cache for reference data
├── logging_middleware.py   Structured JSON logging for tool calls
└── __main__.py            Entry point

Configuration

Environment variable

Default

Description

DAKTELA_URL

—

Daktela instance URL

DAKTELA_USERNAME

—

Daktela username

DAKTELA_PASSWORD

—

Daktela password

DAKTELA_ACCESS_TOKEN

—

Static API token (alternative to username/password)

MCP_TRANSPORT

stdio

Transport: stdio or streamable-http

PORT

8080

HTTP port (streamable-http mode)

CACHE_ENABLED

true

Enable reference data cache

CACHE_TTL_SECONDS

3600

Cache TTL in seconds

Development

# Unit tests (333 tests, ~1s)
.venv/bin/python -m pytest

# Lint
.venv/bin/python -m ruff check src/ tests/

Integration tests run every tool against a live Daktela instance via the deployed server:

.venv/bin/python scripts/integration_test.py \
  --url https://your-instance.daktela.com \
  --username your-user \
  --password your-password

License

MIT

Available Tools

45 tools
count_ticketsA

Count tickets matching filters. Use this instead of list_tickets when you only need a number.

Args: category: Filter by category internal name (use list_ticket_categories to find valid names). stage: Ticket lifecycle stage — exact values (case-sensitive): 'OPEN' = agent actively working, 'WAIT' = awaiting customer response, 'CLOSE' = resolved, 'ARCHIVE' = archived. When user says "open tickets", use stage='OPEN'. priority: Filter by priority: LOW, MEDIUM, HIGH. user: Agent name — pass either a display name (e.g. 'John Doe') or login name (e.g. 'john.doe'). Display names are resolved automatically. You do NOT need to call list_users first. contact: Filter by contact internal ID (e.g. 'contact_674eda46162a8403430453'). NOT a person's name — call list_contacts(search='...') first to find the ID. search: Full-text search across ticket title and description (partial match). status: Filter by workflow status name (e.g. 'S0-Qualify', 'S1-Discovery'). Use list_statuses to see available status names. date_from: Filter tickets created on or after this date (YYYY-MM-DD). date_to: Filter tickets created on or before this date (YYYY-MM-DD). include_merged: Include tickets that were merged into other tickets (default: false).

Inputs: user, stage, search, status, +6 more. Returns: Generic wrapper for non-object return types.

get_accountA

Get full details of a single account by its internal ID.

Args: name: The account internal ID (e.g. 'account_674eda46162a8403430453'). Use list_accounts(search='...') to find the ID from a company name.

Inputs: name (required). Returns: Generic wrapper for non-object return types.

get_activityA

Get full details of a single activity by its ID. Use this when you already know the activity ID. Returns the complete activity record including all channel-specific fields.

Args: name: The activity ID (e.g. ACT00123). Always starts with 'ACT' followed by digits.

Inputs: name (required). Returns: Generic wrapper for non-object return types.

get_articleA

Get full details of a single knowledge base article by its ID.

Returns the article with its HTML content converted to clean Markdown, including headers, links, lists, and code blocks. Use this to read the full content of an article found via list_articles.

Args: name: The article ID (the 'name' field from list_articles).

Inputs: name (required). Returns: Generic wrapper for non-object return types.

get_callA

Get full details of a single call by its call ID. Use this when you already know the call ID. Returns call-specific fields: CLID, duration, wait/ring/hold times, missed call status, disposition.

Args: name: The call ID (the 'id_call' field from list_calls).

Inputs: name (required). Returns: Generic wrapper for non-object return types.

get_call_transcriptA

Get the full speech-to-text transcript of a specific call.

Returns the spoken dialogue between customer and operator as a chronological transcript with timestamps. Not all calls have transcripts — missed calls, short calls, and calls on queues without speech-to-text will return "No transcript available".

How to get the activity name:

  • From list_calls: the 'Activity' field in each call record

  • From list_activities: the 'name' field of a CALL activity

  • From get_call: the 'Activity' field in the call record

Args: activity: The activity name/ID (e.g. 'activity_699351d84288a407003861'). This is the 'Activity' field shown in list_calls/get_call output, or the 'name' field from list_activities.

Inputs: activity (required). Returns: Generic wrapper for non-object return types.

get_contactA

Get full details of a single contact by its ID. Use this when you already know the contact ID.

Args: name: The contact ID (the 'name' field from list_contacts, e.g. CT00123).

Inputs: name (required). Returns: Generic wrapper for non-object return types.

get_emailA

Get full details of a single email activity by its ID. Returns email-specific fields including subject, address, body text, and timing.

Args: name: The email activity ID (e.g. 'ACT00123' or the 'name' field from list_emails).

Inputs: name (required). Returns: Generic wrapper for non-object return types.

get_instagram_chatA

Get full details of a single Instagram DM activity by its ID.

Args: name: The Instagram activity ID (e.g. 'ACT00123' or the 'name' field from list_instagram_chats).

Inputs: name (required). Returns: Generic wrapper for non-object return types.

get_messenger_chatA

Get full details of a single Facebook Messenger activity by its ID.

Args: name: The Messenger activity ID (e.g. 'ACT00123' or the 'name' field from list_messenger_chats).

Inputs: name (required). Returns: Generic wrapper for non-object return types.

get_smsA

Get full details of a single SMS activity by its ID.

Args: name: The SMS activity ID (e.g. 'ACT00123' or the 'name' field from list_sms_chats).

Inputs: name (required). Returns: Generic wrapper for non-object return types.

get_ticketA

Get full details of a single ticket by its ID. Use this when you already know the ticket ID.

Args: name: The ticket ID (numeric, e.g. 787979). If passed with a prefix like TK00787979, the prefix is stripped automatically.

Inputs: name (required). Returns: Generic wrapper for non-object return types.

get_ticket_detailA

Get a ticket with all its activities and their content in one call.

This is the recommended tool for analyzing a specific ticket — it returns the ticket details plus all linked activities (calls, emails, chats, etc.) with their descriptions and metadata, avoiding multiple round-trips.

Args: name: The ticket ID (numeric, e.g. 787979). Prefix like TK00787979 is stripped automatically. take: Max number of activities to include (default: 50, max: 100).

Inputs: name (required), take. Returns: Generic wrapper for non-object return types.

get_viber_chatA

Get full details of a single Viber activity by its ID.

Args: name: The Viber activity ID (e.g. 'ACT00123' or the 'name' field from list_viber_chats).

Inputs: name (required). Returns: Generic wrapper for non-object return types.

get_web_chatA

Get full details of a single web chat activity by its ID.

Args: name: The web chat activity ID (e.g. 'ACT00123' or the 'name' field from list_web_chats).

Inputs: name (required). Returns: Generic wrapper for non-object return types.

get_whatsapp_chatA

Get full details of a single WhatsApp activity by its ID.

Args: name: The WhatsApp activity ID (e.g. 'ACT00123' or the 'name' field from list_whatsapp_chats).

Inputs: name (required). Returns: Generic wrapper for non-object return types.

list_accountsA

List accounts (companies/organizations). Contacts belong to accounts.

Args: user: Filter by account owner login name (e.g. 'john.doe'). Use list_users to find login names. search: Search by company name (partial match, e.g. 'Notino' or 'Siemens'). date_from: Filter accounts created on or after this date (YYYY-MM-DD). date_to: Filter accounts created on or before this date (YYYY-MM-DD). sort: Field to sort by (default: edited). sort_dir: Sort direction: asc or desc (default: desc). skip: Pagination offset (default: 0). take: Number of records to return (default: 50, max: 200).

Inputs: skip, sort, take, user, +4 more. Returns: Generic wrapper for non-object return types.

list_account_ticketsA

List tickets for a specific account (company/organization).

Accepts both a company name (e.g. 'Notino') or an internal account ID. The tool resolves the name automatically. You do NOT need to call list_accounts first.

Args: account: Company name (partial match, e.g. 'Notino', 'Siemens') or account ID. stage: Ticket stage filter (default: 'OPEN'). Values: 'OPEN' = agent actively working on it (default), 'WAIT' = reply sent, awaiting customer response, 'CLOSE' = resolved/solved, 'ARCHIVE' = resolved and archived, 'ALL' = return tickets in any stage (slower for large accounts). priority: Filter by priority: LOW, MEDIUM, HIGH. user: Agent name — pass either a display name (e.g. 'John Doe') or login name (e.g. 'john.doe'). Resolved automatically. category: Filter by category internal name (use list_ticket_categories to find valid names). date_from: Filter tickets created on or after this date (YYYY-MM-DD). date_to: Filter tickets created on or before this date (YYYY-MM-DD). include_merged: Include tickets that were merged into other tickets (default: false). sort: Field to sort by. Useful values: edited (default), created, sla_deadtime, sla_close_deadline, last_activity. sort_dir: Sort direction: asc or desc (default: desc). skip: Number of records to skip for pagination (default: 0). take: Number of records to return (default: 50, max: 200).

Inputs: account (required), skip, sort, take, +8 more. Returns: Generic wrapper for non-object return types.

list_activitiesA

List activities (calls, emails, chats, etc.) with optional filters. Always specify type and/or a date range to keep results focused.

Args: type: Filter by activity channel type: CALL (phone), EMAIL, CHAT (web chat), SMS, FBM (Facebook Messenger), IGDM (Instagram DM), WAP (WhatsApp), VBR (Viber), CUSTOM. action: Filter by activity status/action: OPEN (in progress), WAIT (waiting), POSTPONE (postponed), CLOSE (closed). queue: Filter by queue internal name (e.g. '10333'). Use list_queues to find names. ticket: Filter by ticket ID (numeric, e.g. '787979'). user: Agent name — pass either a display name (e.g. 'John Doe') or login name (e.g. 'john.doe'). Resolved automatically. date_from: Filter by activity start time on or after this date (YYYY-MM-DD). date_to: Filter by activity start time on or before this date (YYYY-MM-DD). sort: Field to sort by. Useful values: time (activity start time), duration, time_close. WARNING: only fields that exist on the activities endpoint work — do NOT use 'created' or 'edited' (those are ticket fields, not activity fields). sort_dir: Sort direction: asc or desc (default: desc). skip: Pagination offset (default: 0). take: Number of records to return (default: 50, max: 200).

Inputs: skip, sort, take, type, +7 more. Returns: Generic wrapper for non-object return types.

list_article_foldersA

List all knowledge base article folders in a tree structure.

Returns a hierarchical view of folders with article counts. Use the folder 'name' field to filter articles by folder in list_articles.

Args: skip: Pagination offset (default: 0). take: Number of records to return (default: 200).

Inputs: skip, take. Returns: Generic wrapper for non-object return types.

list_articlesA

Search and list knowledge base articles.

Use this to find relevant KB articles by keyword, folder, or tag. The search parameter uses Daktela's global search (q=) which searches across title, description, content, and tags.

Args: search: Full-text search across article title, description, content, and tags. Uses Daktela's global search — the most effective way to find articles. folder: Filter by folder — pass a folder name (human-readable) or internal ID. Folder names are resolved automatically. tag: Filter by tag — pass a tag title (human-readable) or internal ID. Tag titles are resolved automatically. published: Filter by published status: 'true' or 'false'. skip: Pagination offset (default: 0). take: Number of articles to return (default: 10, max: 200). Default is smaller than other tools because article records are larger.

Inputs: tag, skip, take, folder, +2 more. Returns: Generic wrapper for non-object return types.

list_callsA

List phone calls with detailed call data (duration, CLID, missed calls, hold time). Use this instead of list_activities(type='CALL') when you need call-specific fields.

Args: queue: Filter by queue internal name (e.g. '10333'). Use list_queues to find names. user: Agent name — pass either a display name (e.g. 'John Doe') or login name (e.g. 'john.doe'). Resolved automatically. contact: Filter by contact internal ID (e.g. 'contact_674eda46162a8403430453'). NOT a person's name — call list_contacts(search='...') first to find the ID. direction: Filter by call direction: in (incoming), out (outgoing), internal. answered: Filter by whether the call was answered (true/false). date_from: Filter by call start time on or after this date (YYYY-MM-DD). date_to: Filter by call start time on or before this date (YYYY-MM-DD). sort: Field to sort by. Useful values: call_time, duration, waiting_time, ringing_time. WARNING: only call-specific fields work — do NOT use 'created' or 'edited'. sort_dir: Sort direction: asc or desc (default: desc). skip: Pagination offset (default: 0). take: Number of records to return (default: 50, max: 200).

Inputs: skip, sort, take, user, +7 more. Returns: Generic wrapper for non-object return types.

list_call_transcriptsA

List answered calls with their full speech-to-text transcripts inline.

This is the primary tool for analyzing call quality, identifying calls requiring management attention, detecting escalations, or reviewing agent performance. Each call is returned with its complete dialogue (customer + operator).

Fetches up to take answered calls and automatically retrieves their transcripts in parallel (server-side). Calls without transcripts are included but marked "No transcript available".

For comprehensive analysis of a date range, paginate using skip: first call with skip=0, then skip=50, skip=100, etc. until all calls are covered.

Args: date_from: Filter calls on or after this date (YYYY-MM-DD). Recommended: last 7 days. date_to: Filter calls on or before this date (YYYY-MM-DD). user: Agent name — pass either a display name (e.g. 'John Doe') or login name (e.g. 'john.doe'). Resolved automatically. queue: Filter by queue internal name (e.g. '10333'). Use list_queues to find names. skip: Number of calls to skip for pagination (default: 0). take: Number of calls to fetch per page (default: 20, max: 50). Each call includes its full transcript — transcripts are fetched in parallel server-side.

Inputs: skip, take, user, queue, +2 more. Returns: Generic wrapper for non-object return types.

list_campaign_recordsA

List campaign records (outbound campaign activity — calls made, results).

Args: user: Agent name — pass either a display name (e.g. 'John Doe') or login name (e.g. 'john.doe'). Resolved automatically. contact: Filter by contact internal ID (e.g. 'contact_674eda46162a8403430453'). NOT a person's name — call list_contacts(search='...') first to find the ID. date_from: Filter records created on or after this date (YYYY-MM-DD). date_to: Filter records created on or before this date (YYYY-MM-DD). sort: Field to sort by. Useful values: created, edited, nextcall. sort_dir: Sort direction: asc or desc (default: desc). skip: Pagination offset (default: 0). take: Number of records to return (default: 50, max: 200).

Inputs: skip, sort, take, user, +4 more. Returns: Generic wrapper for non-object return types.

list_campaign_typesA

List all campaign types (reference data for outbound campaigns).

Args: skip: Pagination offset (default: 0). take: Number of records to return (default: 200).

Inputs: skip, take. Returns: Generic wrapper for non-object return types.

list_contactsA

Search and list contacts. Each contact has firstname, lastname, title (full name), email, phone number.

Args: search: Search by full name (partial match, e.g. 'John' or 'Smith'). Searches the 'title' field. account: Filter by account internal ID (e.g. 'account_674eda46162a8403430453'). NOT a company name — call list_accounts(search='...') first to find the ID. skip: Pagination offset (default: 0). take: Number of records to return (default: 50, max: 200).

Inputs: skip, take, search, account. Returns: Generic wrapper for non-object return types.

list_crm_recordsA

List CRM records (deals, opportunities, or other CRM entities).

Args: user: Filter by owner login name (e.g. 'john.doe'). Use list_users to find login names. contact: Filter by contact internal ID (e.g. 'contact_674eda46162a8403430453'). NOT a person's name — call list_contacts(search='...') first to find the ID. account: Filter by account internal ID (e.g. 'account_674eda46162a8403430453'). NOT a company name — call list_accounts(search='...') first to find the ID. stage: Filter by stage: OPEN or CLOSE. date_from: Filter records created on or after this date (YYYY-MM-DD). date_to: Filter records created on or before this date (YYYY-MM-DD). sort: Field to sort by (default: edited). sort_dir: Sort direction: asc or desc (default: desc). skip: Pagination offset (default: 0). take: Number of records to return (default: 50, max: 200).

Inputs: skip, sort, take, user, +6 more. Returns: Generic wrapper for non-object return types.

list_emailsA

List email activities with email-specific fields (subject, address, state). Use this instead of list_activities(type='EMAIL') when you need email details.

Args: queue: Filter by queue internal name (e.g. '10333'). Use list_queues to find names. user: Agent name — pass either a display name (e.g. 'John Doe') or login name (e.g. 'john.doe'). Resolved automatically. contact: Filter by contact internal ID (e.g. 'contact_674eda46162a8403430453'). NOT a person's name — call list_contacts(search='...') first to find the ID. direction: Filter by direction: in (incoming) or out (outgoing). date_from: Filter by email start time on or after this date (YYYY-MM-DD). date_to: Filter by email start time on or before this date (YYYY-MM-DD). sort: Field to sort by. Useful values: time (email time), duration, wait_time. WARNING: only email-specific fields work — do NOT use 'created' or 'edited'. sort_dir: Sort direction: asc or desc (default: desc). skip: Pagination offset (default: 0). take: Number of records to return (default: 50, max: 200).

Inputs: skip, sort, take, user, +6 more. Returns: Generic wrapper for non-object return types.

list_groupsA

List all groups (used to organize categories, queues, users, or profiles).

Args: skip: Pagination offset (default: 0). take: Number of records to return (default: 200).

Inputs: skip, take. Returns: Generic wrapper for non-object return types.

list_instagram_chatsA

List Instagram DM activities with channel-specific fields (type: DM/STORY_REPLY/STORY_MENTION).

Args: queue: Filter by queue internal name (e.g. '10333'). Use list_queues to find names. user: Agent name — pass either a display name (e.g. 'John Doe') or login name (e.g. 'john.doe'). Resolved automatically. contact: Filter by contact internal ID (e.g. 'contact_674eda46162a8403430453'). NOT a person's name — call list_contacts(search='...') first to find the ID. direction: Filter by direction: IN or OUT. date_from: Filter by activity start time on or after this date (YYYY-MM-DD). date_to: Filter by activity start time on or before this date (YYYY-MM-DD). sort: Field to sort by. Useful values: time, duration, wait_time. WARNING: only fields that exist on this endpoint work — do NOT use 'created' or 'edited'. sort_dir: Sort direction: asc or desc (default: desc). skip: Pagination offset (default: 0). take: Number of records to return (default: 50, max: 200).

Inputs: skip, sort, take, user, +6 more. Returns: Generic wrapper for non-object return types.

list_messenger_chatsA

List Facebook Messenger activities with channel-specific fields.

Args: queue: Filter by queue internal name (e.g. '10333'). Use list_queues to find names. user: Agent name — pass either a display name (e.g. 'John Doe') or login name (e.g. 'john.doe'). Resolved automatically. contact: Filter by contact internal ID (e.g. 'contact_674eda46162a8403430453'). NOT a person's name — call list_contacts(search='...') first to find the ID. direction: Filter by direction: IN or OUT. date_from: Filter by activity start time on or after this date (YYYY-MM-DD). date_to: Filter by activity start time on or before this date (YYYY-MM-DD). sort: Field to sort by. Useful values: time, duration, wait_time. WARNING: only fields that exist on this endpoint work — do NOT use 'created' or 'edited'. sort_dir: Sort direction: asc or desc (default: desc). skip: Pagination offset (default: 0). take: Number of records to return (default: 50, max: 200).

Inputs: skip, sort, take, user, +6 more. Returns: Generic wrapper for non-object return types.

list_pausesA

List all pause types available to agents (break reasons like wrap-up, DND, etc.).

Args: skip: Pagination offset (default: 0). take: Number of records to return (default: 200).

Inputs: skip, take. Returns: Generic wrapper for non-object return types.

list_queuesA

List all queues. The 'name' field of each queue is used as the 'queue' filter in list_activities. Queue types include: in (inbound calls), out (outbound calls), email, chat, sms, fbm, wap, vbr, etc.

Args: skip: Pagination offset (default: 0). take: Number of records to return (default: 1000).

Inputs: skip, take. Returns: Generic wrapper for non-object return types.

list_realtime_sessionsA

List currently active agent sessions (real-time snapshot). Shows which agents are online, their state (Idle/Paused/Session), extension, and pause reason.

Args: skip: Pagination offset (default: 0). take: Number of records to return (default: 200).

Inputs: skip, take. Returns: Generic wrapper for non-object return types.

list_sms_chatsA

List SMS activities with SMS-specific fields (sender phone, direction, state).

Args: queue: Filter by queue internal name (e.g. '10333'). Use list_queues to find names. user: Agent name — pass either a display name (e.g. 'John Doe') or login name (e.g. 'john.doe'). Resolved automatically. contact: Filter by contact internal ID (e.g. 'contact_674eda46162a8403430453'). NOT a person's name — call list_contacts(search='...') first to find the ID. direction: Filter by direction: IN or OUT. date_from: Filter by activity start time on or after this date (YYYY-MM-DD). date_to: Filter by activity start time on or before this date (YYYY-MM-DD). sort: Field to sort by. Useful values: time, duration, wait_time. WARNING: only fields that exist on this endpoint work — do NOT use 'created' or 'edited'. sort_dir: Sort direction: asc or desc (default: desc). skip: Pagination offset (default: 0). take: Number of records to return (default: 50, max: 200).

Inputs: skip, sort, take, user, +6 more. Returns: Generic wrapper for non-object return types.

list_statusesA

List all ticket/record statuses (reference data with name, title, color).

Args: skip: Pagination offset (default: 0). take: Number of records to return (default: 200).

Inputs: skip, take. Returns: Generic wrapper for non-object return types.

list_templatesA

List all message templates (for email, SMS, chat, WhatsApp, etc.).

Args: skip: Pagination offset (default: 0). take: Number of records to return (default: 200).

Inputs: skip, take. Returns: Generic wrapper for non-object return types.

list_ticket_categoriesA

List all ticket categories. Call this first to find valid category names for ticket filtering. The 'name' field of each category is what you pass as the 'category' parameter in list_tickets/count_tickets.

Args: skip: Pagination offset (default: 0). take: Number of records to return (default: 200).

Inputs: skip, take. Returns: Generic wrapper for non-object return types.

list_ticketsA

List tickets with optional filters. Returns one page of results.

Args: category: Filter by category internal name (use list_ticket_categories to find valid names). stage: Ticket lifecycle stage — exact values (case-sensitive): 'OPEN' = agent actively working on it, 'WAIT' = reply sent, awaiting customer response, 'CLOSE' = resolved/solved, 'ARCHIVE' = resolved and archived. When user says "open tickets", use stage='OPEN'. priority: Filter by priority: LOW, MEDIUM, HIGH. user: Agent name — pass either a display name (e.g. 'John Doe') or login name (e.g. 'john.doe'). Display names are resolved automatically. You do NOT need to call list_users first. contact: Filter by contact internal ID (e.g. 'contact_674eda46162a8403430453'). NOT a person's name — call list_contacts(search='...') first to find the ID. search: Full-text search across ticket title and description (partial match). status: Filter by workflow status name (e.g. 'S0-Qualify', 'S1-Discovery'). Use list_statuses to see available status names. This filters on the ticket's statuses MN relation — useful for sales pipeline stages, custom workflows, etc. date_from: Filter tickets created on or after this date (YYYY-MM-DD). date_to: Filter tickets created on or before this date (YYYY-MM-DD). include_merged: Include tickets that were merged into other tickets (default: false). sort: Field to sort by. Useful values: edited (default), created, sla_deadtime, sla_close_deadline, last_activity. sort_dir: Sort direction: asc or desc (default: desc). skip: Number of records to skip for pagination (default: 0). take: Number of records to return (default: 50, max: 200).

Inputs: skip, sort, take, user, +10 more. Returns: Generic wrapper for non-object return types.

list_usersA

List or search agents/users. The 'name' field is the login name, 'title' is the display name.

NOTE: Most tools (list_tickets, count_tickets, list_activities, etc.) resolve agent names automatically — you do NOT need to call list_users first. Use this tool only when you need to browse the user directory or look up a specific agent's details.

Args: search: Search by agent display name (partial match, e.g. 'John Doe' or 'Hajek'). skip: Pagination offset (default: 0). take: Number of records to return (default: 200).

Inputs: skip, take, search. Returns: Generic wrapper for non-object return types.

list_viber_chatsA

List Viber activities with channel-specific fields.

Args: queue: Filter by queue internal name (e.g. '10333'). Use list_queues to find names. user: Agent name — pass either a display name (e.g. 'John Doe') or login name (e.g. 'john.doe'). Resolved automatically. contact: Filter by contact internal ID (e.g. 'contact_674eda46162a8403430453'). NOT a person's name — call list_contacts(search='...') first to find the ID. direction: Filter by direction: IN or OUT. date_from: Filter by activity start time on or after this date (YYYY-MM-DD). date_to: Filter by activity start time on or before this date (YYYY-MM-DD). sort: Field to sort by. Useful values: time, duration, wait_time. WARNING: only fields that exist on this endpoint work — do NOT use 'created' or 'edited'. sort_dir: Sort direction: asc or desc (default: desc). skip: Pagination offset (default: 0). take: Number of records to return (default: 50, max: 200).

Inputs: skip, sort, take, user, +6 more. Returns: Generic wrapper for non-object return types.

list_web_chatsA

List web chat activities with chat-specific fields (state, disconnection, missed).

Args: queue: Filter by queue internal name (e.g. '10333'). Use list_queues to find names. user: Agent name — pass either a display name (e.g. 'John Doe') or login name (e.g. 'john.doe'). Resolved automatically. contact: Filter by contact internal ID (e.g. 'contact_674eda46162a8403430453'). NOT a person's name — call list_contacts(search='...') first to find the ID. date_from: Filter by activity start time on or after this date (YYYY-MM-DD). date_to: Filter by activity start time on or before this date (YYYY-MM-DD). sort: Field to sort by. Useful values: time, duration, wait_time. WARNING: only fields that exist on this endpoint work — do NOT use 'created' or 'edited'. sort_dir: Sort direction: asc or desc (default: desc). skip: Pagination offset (default: 0). take: Number of records to return (default: 50, max: 200).

Inputs: skip, sort, take, user, +5 more. Returns: Generic wrapper for non-object return types.

list_whatsapp_chatsA

List WhatsApp activities with channel-specific fields.

Args: queue: Filter by queue internal name (e.g. '10333'). Use list_queues to find names. user: Agent name — pass either a display name (e.g. 'John Doe') or login name (e.g. 'john.doe'). Resolved automatically. contact: Filter by contact internal ID (e.g. 'contact_674eda46162a8403430453'). NOT a person's name — call list_contacts(search='...') first to find the ID. direction: Filter by direction: IN or OUT. date_from: Filter by activity start time on or after this date (YYYY-MM-DD). date_to: Filter by activity start time on or before this date (YYYY-MM-DD). sort: Field to sort by. Useful values: time, duration, wait_time. WARNING: only fields that exist on this endpoint work — do NOT use 'created' or 'edited'. sort_dir: Sort direction: asc or desc (default: desc). skip: Pagination offset (default: 0). take: Number of records to return (default: 50, max: 200).

Inputs: skip, sort, take, user, +6 more. Returns: Generic wrapper for non-object return types.

scan_callsA

AI-score answered calls in a date range. Returns one page of scored results.

IMPORTANT: Before calling this tool, briefly tell the user that this analysis takes some time because it processes each call with AI (e.g. "Let me analyze your calls — this involves AI-scoring each conversation, so it may take a moment.").

Fetches a page of calls (default 100), loads their transcripts, scores each with a fast AI model, and returns a compact ranked list with scores, flags, and summaries.

CRITICAL — you MUST scan ALL pages. The first 100 results are NOT representative of the full dataset. Important issues may appear in any page. If the response shows remaining records, you MUST call all remaining pages (in parallel) before presenting results. Never skip pages or stop early — partial analysis gives unreliable results.

Pagination: Each call returns up to take scored records and reports the total. If total > take, call ALL remaining pages IN PARALLEL:

  • First call: scan_calls(date_from='2026-02-20') → returns 100 scored + "350 total"

  • Then IN PARALLEL: scan_calls(..., skip=100), scan_calls(..., skip=200), scan_calls(..., skip=300)

After reviewing scored results, use get_call_transcript to read full dialogue of specific flagged calls.

Args: date_from: Start date (YYYY-MM-DD). Required. date_to: End date (YYYY-MM-DD). Defaults to same as date_from (single day). user: Agent name — display name or login name, resolved automatically. queue: Queue internal name (e.g. '10333'). question: What to analyze for. Be specific about what to flag. skip: Pagination offset (default: 0). Use to fetch subsequent pages. take: Number of calls to score in this page (default: 100, max: 200).

Inputs: date_from (required), skip, take, user, +3 more. Returns: Generic wrapper for non-object return types.

scan_emailsA

AI-score emails in a date range. Returns one page of scored results.

IMPORTANT: Before calling this tool, briefly tell the user that this analysis takes some time because it processes each email with AI (e.g. "Let me analyze your emails — this involves AI-scoring each one, so it may take a moment.").

Fetches a page of emails (default 100), scores each with a fast AI model using the email subject and body, and returns a compact ranked list with scores, flags, and summaries.

CRITICAL — you MUST scan ALL pages. The first 100 results are NOT representative of the full dataset. Important issues may appear in any page. If the response shows remaining records, you MUST call all remaining pages (in parallel) before presenting results. Never skip pages or stop early — partial analysis gives unreliable results.

Pagination: Each call returns up to take scored records and reports the total. If total > take, call ALL remaining pages IN PARALLEL:

  • First call: scan_emails(date_from='2026-02-20') → returns 100 scored + "500 total"

  • Then IN PARALLEL: scan_emails(..., skip=100), scan_emails(..., skip=200), etc.

After reviewing scored results, use get_email to read the full email content of specific flagged items.

Args: date_from: Start date (YYYY-MM-DD). Required. date_to: End date (YYYY-MM-DD). Defaults to same as date_from (single day). user: Agent name — display name or login name, resolved automatically. queue: Queue internal name (e.g. '10333'). direction: Filter by direction: 'in' (incoming) or 'out' (outgoing). question: What to analyze for. Be specific about what to flag. skip: Pagination offset (default: 0). Use to fetch subsequent pages. take: Number of emails to score in this page (default: 100, max: 200).

Inputs: date_from (required), skip, take, user, +4 more. Returns: Generic wrapper for non-object return types.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.8/5.0

    Scored across 45 tools

    Disambiguation3/5

    There is meaningful overlap between generic tools (list_activities, get_activity) and channel-specific lists/gets (list_calls, get_call, list_emails, get_email, etc.). The descriptions clarify that channel-specific tools return extra fields, but agents may still be uncertain which to use. scan_calls, list_call_transcripts, and get_call_transcript also overlap in purpose.

    Naming Consistency4/5

    The dominant pattern is verb_noun (list_*, get_*, count_*), which is consistent and predictable. A few names deviate stylistically (scan_calls, scan_emails, get_call_transcript, list_call_transcripts, get_ticket_detail), but these are minor and don't undermine the overall pattern.

    Tool Count2/5

    With 45 tools, the server is heavily weighted by nearly identical channel-specific list/get pairs for activities. This feels excessive for the underlying domain, even for a contact-center platform. The count would be more reasonable if generic activity tools were removed or channel-specific tools were consolidated.

    Completeness3/5

    The tool set covers read-only operations for tickets, activities, contacts, accounts, CRM records, campaigns, knowledge base, users, and reference data. However, many entities have list_* but no corresponding get_* (e.g., users, groups, pauses, statuses, templates), and there are no write/update/delete tools at all, which limits the usefulness for management workflows.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      C
      maintenance
      A read-only MCP server for AppDynamics that exposes 12 task-oriented tools to query applications, topology, metrics, snapshots, health rules, anomalies, events, alerting config, analytics events, and dependency maps via OAuth API-client credentials.
      12
      1
      MIT
    • A
      license
      B
      quality
      C
      maintenance
      MCP server for the DataGate billing platform API, providing read-only tools to manage customers, invoices, products, agreements, sites, and payments.
      13
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      A read-only MCP server providing 56 tools to query Qobrix real-estate CRM data, covering listings, leads, viewings, offers, contracts, analytics, and more, with RESO Data Dictionary alignment and caching support.
      64
      3
      Apache 2.0