Skip to main content
Glama

ictcontact-mcp

A Model Context Protocol server for ICTContact and its hosted edition ICTDialer.com — the same contact-center engine from ICT Innovations.

It lets an AI assistant monitor outbound campaigns — list them, check status, read summaries and per-call results — and, only when you turn writes on, start and stop them.

Install

npx -y ictcontact-mcp      # no install
npm install -g ictcontact-mcp

Requires Node.js 18 or newer.

Related MCP server: ictbroadcast-mcp

Configure

Variable

Required

Default

ICTCONTACT_BASE_URL

yes

Server base URL, without the /rest suffix, e.g. https://your-ictcontact

ICTCONTACT_USERNAME

yes

API account username

ICTCONTACT_PASSWORD

yes

Password for that account

ICTCONTACT_MCP_ALLOW_WRITE

no

false

Unlock start/stop campaign (see Safety)

ICTCONTACT_TIMEOUT_MS

no

30000

Per-request timeout

ICTCONTACT_TLS_INSECURE

no

false

Skip TLS verification — self-signed test servers only

Claude Desktop example

{
  "mcpServers": {
    "ictcontact": {
      "command": "npx",
      "args": ["-y", "ictcontact-mcp"],
      "env": {
        "ICTCONTACT_BASE_URL": "https://your-ictcontact",
        "ICTCONTACT_USERNAME": "admin",
        "ICTCONTACT_PASSWORD": "your-password"
      }
    }
  }
}

Tools

Read tools are always available:

Tool

What it does

ictcontact_list_campaigns

List campaigns (id and name)

ictcontact_campaign_status

Live status of a campaign (running, stopped)

ictcontact_campaign_summary

Totals: answered, failed, human vs machine

ictcontact_campaign_result

Per-call results (contact, response, AMD, DNC)

Write tools appear only when ICTCONTACT_MCP_ALLOW_WRITE=true:

Tool

What it does

ictcontact_start_campaign

Launch a campaign — begins live outbound calling

ictcontact_stop_campaign

Stop a running campaign

Safety

The server is read-only by default. Starting a campaign begins live outbound calling and can cost real money, so ictcontact_start_campaign and ictcontact_stop_campaign are not registered at all unless you set ICTCONTACT_MCP_ALLOW_WRITE=true.

How it connects

ICTContact and ICTDialer expose a form-encoded RPC API at {base}/rest/<Method>. Each call carries the account username and password; the server sends those for you. There is no separate token to provision.

About

Built by Tahir Almas at ICT Innovations — the team behind ICTContact, ICTDialer, ICTBroadcast, ICTFax and ICTPBX. Learn more at ictcontact.com and ictdialer.com.

MIT licensed. Issues and PRs welcome at github.com/ictinnovations/ictcontact-mcp.

Available Tools

4 tools
ictcontact_campaign_resultCampaign call resultsA
Read-only

Per-call results for a campaign (contact, response, answering-machine detection, DNC), optionally filtered by call status.

NameRequiredDescriptionDefault
statusNoOptional call-status filter.
campaign_idYesThe campaign id.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful content about what each record contains, but for a per-call result set it omits volume/pagination expectations (a campaign can have thousands of rows) and whether results are capped or truncated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that front-loads the resource and uses a compact parenthetical to list returned data. No filler and nothing that could be cut without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly enumerates the return fields, which is the main gap it needed to fill. It is still incomplete for a potentially high-volume listing tool: no pagination, ordering, or empty-result behavior is mentioned.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented in the schema; the description only restates the optional status filter and adds no value about allowed status values (no enum present) or behavior when status is omitted. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (per-call results for a campaign) and enumerates the returned fields (contact, response, answering-machine detection, DNC), which is far more informative than the title. It does not explicitly distinguish itself from the campaign_status or campaign_summary siblings, leaving the agent to infer that this is the row-level vs. aggregate view.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Optionally filtered by call status" implies a usage context, but the description never says when to choose this over ictcontact_campaign_summary or ictcontact_campaign_status, nor any prerequisites (campaign must exist, must have run). Usage is inferable only from the resource name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ictcontact_campaign_statusCampaign statusA
Read-only

Live status of a campaign by id (for example running or stopped). Poll this while a campaign runs.

NameRequiredDescriptionDefault
campaign_idYesThe campaign id.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds that the value is 'live' and suitable for polling, which is genuine behavioral context, but says nothing about freshness, cost of repeated calls, or what happens with an invalid or finished campaign id.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the resource and scope, with the polling instruction second. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description partially compensates by naming example status values a caller might receive. It does not describe the shape of the response beyond that, but for a one-parameter read tool this is close to sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single campaign_id parameter is already documented in the schema. The description only echoes 'by id', adding no format or source-of-id guidance, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource and lookup key: live status of a campaign by id, with concrete example values (running/stopped). It is distinguishable from siblings like campaign_summary and campaign_result by the word 'status', though it never names them explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The sentence 'Poll this while a campaign runs' gives a clear usage context: call it repeatedly during an active campaign. It stops short of saying when NOT to use it or pointing to campaign_summary/campaign_result for other needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ictcontact_campaign_summaryCampaign summaryB
Read-only

Totals for a campaign: answered, failed, human vs machine and so on. Optionally scope to one agent/user id.

NameRequiredDescriptionDefault
usr_idNoOptional agent/user id to scope the summary.
campaign_idYesThe campaign id.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds that the output is aggregate counts across several dimensions, which is genuinely useful context beyond the annotations, but says nothing about date windows, freshness of the totals, or what happens for a campaign with no calls.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short clauses, front-loaded with what the tool returns, then the optional scoping. No wasted words, though 'and so on' is a vague filler that could have been replaced by naming the remaining metrics or omitted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read with full schema coverage and a safety-covering annotation set, the description is largely sufficient, but with three closely related sibling tools a single sentence about how the totals differ from per-call results would materially improve correct selection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% — both usr_id and campaign_id are documented in the schema, including that usr_id is optional. The description's restatement of the optional scoping adds no syntax or format detail, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (a campaign) and the kind of data returned (totals: answered, failed, human vs machine), which is more informative than the title 'Campaign summary'. It is distinguishable from siblings like campaign_status or campaign_result by framing itself as aggregate totals, though it never names those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only usage hint is the optional agent/user scoping clause; there is no statement of when to choose this over ictcontact_campaign_result or ictcontact_campaign_status, and no prerequisites or exclusions. The agent must infer the routing decision from the tool names alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ictcontact_list_campaignsList campaignsA
Read-only

List the outbound campaigns on the ICTContact / ICTDialer server (id and name of each). Start here to find a campaign id.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, and the description's 'List' wording is consistent. It adds useful context beyond the annotations by specifying the scope ('outbound campaigns') and the field content ('id and name'), though it does not describe ordering, pagination, or response envelope details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with the action and result front-loaded, and the instruction to 'Start here' earns its place as workflow guidance. There is no filler, repetition, or unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless list tool with readOnly/openWorld annotations, the description adequately covers purpose, scope, returned fields, and how it fits into the workflow. It does not document the exact output schema, but the named fields ('id and name') and the simple nature of the tool make this a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters and 100% schema description coverage, so there is nothing for the description to clarify. The description implies a parameterless call by saying 'List the outbound campaigns', and no ambiguity exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and identifies both the resource ('outbound campaigns on the ICTContact / ICTDialer server') and the returned fields ('id and name'). The phrase 'Start here to find a campaign id' clearly separates this from the sibling tools, which operate on individual campaigns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly frames this tool as the entry point for discovering campaign IDs, which implies it should be used before campaign_summary, campaign_status, or campaign_result. It does not explicitly name those alternatives or state when not to use it, but the 'Start here' guidance provides clear context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 3 tool updatesv0.1.1
    • Changedictcontact_campaign_result3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / campaign_id / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / campaign_id / minimum
        Added value: +-9007199254740991
    • Changedictcontact_campaign_status3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / campaign_id / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / campaign_id / minimum
        Added value: +-9007199254740991
    • Changedictcontact_campaign_summary5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / campaign_id / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / campaign_id / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / usr_id / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / usr_id / minimum
        Added value: +-9007199254740991
  2. 4 tool updatesv0.1.0
    • First observedictcontact_campaign_result
    • First observedictcontact_campaign_status
    • First observedictcontact_campaign_summary
    • First observedictcontact_list_campaigns

TDQS

B3.4/5.0

Scored across 4 tools

Disambiguation4/5

Each tool targets a distinct facet: list_campaigns (enumeration), campaign_status (live run state), campaign_summary (aggregate totals), campaign_result (per-call rows). campaign_summary and campaign_result overlap somewhat in reporting on outcomes, but the aggregate-vs-row distinction is clear enough from the descriptions.

Naming Consistency4/5

All tools share the ictcontact_ prefix and campaign-related names, with a predictable noun_component pattern for three of them. list_campaigns breaks the noun-first pattern by using a verb prefix, a minor deviation that remains readable.

Tool Count3/5

Four tools is on the thin side for a dialer/campaign integration; the surface covers only read/monitoring operations. It is not extreme, but the set feels like a narrow slice of the domain rather than a well-rounded toolkit.

Completeness2/5

The surface is entirely read-only: you can list, monitor status, and pull summaries/results, but there is no way to start, stop, create, or control a campaign — despite status tooling explicitly advising polling while a campaign runs. This dead end limits agents to observation only.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    This MCP server enables AI assistants to read PBX state—extensions, DID numbers, SIP trunk providers, tenants, and live statistics—from ICTPBX via the ICTCore REST API, without placing calls or changing configuration.
    5
    222 npm
    16
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI assistants to monitor ICTBroadcast outbound voice, SMS, and fax campaigns by listing campaigns, checking status, and reading summaries and per-call results, with optional start/stop control when write access is enabled.
    4
    234 npm
    16
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI assistants to read ICTCRM contact groups and, when write access is enabled, create or delete contacts and add contacts to campaigns.
    1
    226 npm
    1
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Enables AI assistants to monitor ICTDialer outbound campaigns by listing them, checking status, and reading summaries and per-call results, with optional start and stop capabilities when write access is enabled.
    4
    220 npm
    16
    MIT