Skip to main content
Glama

@calltelemetry/cucm-emulator-mcp

OpenAPI-driven Model Context Protocol (MCP) server for Cisco Unified Communications Manager (CUCM) Emulator.

Overview

@calltelemetry/cucm-emulator-mcp is an OpenAPI-driven MCP server that connects AI coding assistants and automation agents directly to Cisco CUCM Emulator instances. It parses the emulator's OpenAPI 3.1.0 contract specification to dynamically generate strongly-typed discrete MCP tools across all 6 core telephony domains:

  1. Fixtures & Topology: cucm_emulator_seed_fixtures, cucm_emulator_reset_store, cucm_emulator_inspect_fixtures

  2. Nodes & Cluster Health: cucm_emulator_list_nodes, cucm_emulator_simulate_node_failover (ADR 0120/0122 failover)

  3. Phones & Registration: cucm_emulator_list_phones, cucm_emulator_set_phone_status, cucm_emulator_get_phone_web

  4. Call Simulation & Legs: cucm_emulator_simulate_call, cucm_emulator_call_action, cucm_emulator_list_active_calls

  5. CURRI / ECC Policy Routing: cucm_emulator_evaluate_curri, cucm_emulator_get_curri_history

  6. CDR / CMR Buffers: cucm_emulator_generate_cdrs, cucm_emulator_get_cdr_history

  7. Dynamic OpenAPI Operations: 46+ auto-compiled operations (cucm_emulator_get_summary, cucm_emulator_get_topology, cucm_emulator_query_sql, cucm_emulator_list_inventory, cucm_emulator_upsert_inventory, etc.)

Related MCP server: packet-tracer-mcp

Architecture

┌─────────────────────────────────────────────────────────────┐
│                    AI Agents / MCP Clients                  │
│                (Claude Code, Cursor, Windsurf)              │
└──────────────────────────────┬──────────────────────────────┘
                               │ JSON-RPC 2.0 (Stdio / SSE)
┌──────────────────────────────▼──────────────────────────────┐
│                  CucmEmulatorMcpServer                      │
│                                                             │
│  ┌───────────────────────┐      ┌────────────────────────┐  │
│  │     Tool Registry     │      │   OpenAPI Spec Parser  │  │
│  │ (15 Domain + Dynamic) │◄─────┤   (Dereferencer/Build) │  │
│  └───────────┬───────────┘      └────────────────────────┘  │
│              │                                              │
│  ┌───────────▼───────────────────────────────────────────┐  │
│  │             ICucmEmulatorClient Abstraction           │  │
│  └───────────┬───────────────────────────┬───────────────┘  │
└──────────────┼───────────────────────────┼──────────────────┘
               │                           │
┌──────────────▼────────────┐ ┌────────────▼──────────────────┐
│      HttpCucmClient       │ │    DirectStoreCucmClient      │
│  Live In-Guest / Container│ │  In-Memory Mock Store State   │
│ (http://127.0.0.1:8443)   │ │  (100% Offline Zero-Config)   │
└───────────────────────────┘ └───────────────────────────────┘

Installation & Quick Start

Global CLI

npm install -g @calltelemetry/cucm-emulator-mcp

Run Stdio Server (for AI Agents / Claude Desktop)

cucm-emulator-mcp --transport stdio

Run SSE Server

cucm-emulator-mcp --transport sse --port 3000 --host 127.0.0.1

Configuration Options

Option

Flag

Environment Variable

Default

Description

Transport

-t, --transport

MCP_TRANSPORT

stdio

Transport type: stdio or sse

Port

-p, --port

PORT / MCP_PORT

3000

Port for SSE HTTP server

Host

-h, --host

HOST / MCP_HOST

127.0.0.1

Bind host for SSE transport

Target URL

-u, --target-url

CUCM_EMULATOR_URL

undefined

Target live emulator URL

Spec Path

-s, --spec-path

CUCM_OPENAPI_SPEC

Bundled

Path or URL to OpenAPI 3.1.0 spec

Mock Mode

-m, --mock

CUCM_MOCK

false

Force in-process in-memory mock store

Seed Profile

--seed-profile

CUCM_SEED_PROFILE

lab-small

lab-small, standard-enterprise, empty

Auth Token

--auth-token

CUCM_EMULATOR_AUTH_TOKEN

undefined

Bearer auth token for live emulator

Redact Secrets

--redact-secrets

REDACT_SECRETS

false

Redact sensitive strings in logs

MCP Client Configuration

Claude Desktop (claude_desktop_config.json)

{
  "mcpServers": {
    "cucm-emulator": {
      "command": "cucm-emulator-mcp",
      "args": ["--transport", "stdio", "--mock", "--seed-profile", "lab-small"]
    }
  }
}

SSE Integration

{
  "mcpServers": {
    "cucm-emulator-sse": {
      "url": "http://127.0.0.1:3000/sse"
    }
  }
}

Available Tool Reference

Fixtures & Topology

  • cucm_emulator_seed_fixtures: Seeds deterministic cluster topology, nodes, phones, dial plan partitions, CSS, and CURRI policies.

  • cucm_emulator_reset_store: Resets or wipes emulator state and re-seeds with a specified topology profile.

  • cucm_emulator_inspect_fixtures: Inspects and returns a comprehensive summary of active CUCM cluster state.

Nodes & Failover

  • cucm_emulator_list_nodes: Lists all CUCM cluster nodes (Publisher, Subscribers, TFTP) with roles and RIS return codes.

  • cucm_emulator_simulate_node_failover: Sets node status (Online, Offline, NotFound, SearchLimitExceeded) for ADR 0120/0122 failover testing.

Phones & Registration

  • cucm_emulator_list_phones: Lists configured and registered Cisco IP phone endpoints with directory numbers and MACs.

  • cucm_emulator_set_phone_status: Updates phone registration status (Registered, UnRegistered, Rejected, Unknown).

  • cucm_emulator_get_phone_web: Fetches phone XML, HTML, or JSON serviceability / status web responses.

Call Simulation

  • cucm_emulator_simulate_call: Simulates an end-to-end telephone call through CUCM dial plan routing with RTP media metrics.

  • cucm_emulator_call_action: Executes mid-call actions (answer, hold, resume, drop).

  • cucm_emulator_list_active_calls: Lists active in-progress call sessions in the emulator.

CURRI / ECC Policy Routing

  • cucm_emulator_evaluate_curri: Evaluates external call routing policies via CURRI / ECC, returning permit, deny, or divert verdicts.

  • cucm_emulator_get_curri_history: Retrieves the log of past CURRI routing evaluation decisions.

CDR / CMR Buffers

  • cucm_emulator_generate_cdrs: Generates batches of synthetic CDR records (normal, abandoned, curri-blocked, burst).

  • cucm_emulator_get_cdr_history: Retrieves recent CDR records in structured JSON or raw Cisco CSV export format.

SOAP AXL / RIS / DIME (short aliases)

Cursor rejects any MCP tools/list that contains a name longer than 64 characters. The DIME log-collection path otherwise compiles to a 72-character name, which dropped the whole SOAP surface in 0.1.2. These aliases post the same emulator SOAP endpoints (no second HTTP API):

  • cucm_emulator_axl: POST /axl/ (AXL envelope in body)

  • cucm_emulator_ris: POST /realtimeservice2/services/RISService70

  • cucm_emulator_dime: POST /logcollectionservice2/services/LogCollectionPortTypeService

  • cucm_emulator_dime_file: POST /logcollectionservice/services/DimeGetFileService

Inventory, CGI, and screenshots stay on v2 HTTP / cucm_emulator_get_phone_*.

Development & Verification

# Typecheck
npm run typecheck

# Build TypeScript
npm run build

# Run Full Test Suite (155 Tests)
npm test

# Run with Coverage
npm run test:coverage

# Verify Packaging
npm pack --dry-run

License

MIT © Call Telemetry

Available Tools

73 tools
emu_append_call_session_eventC

Append an event to a canonical v2 call session

Inputs: id (required), type (required), payload, timestamp.

emu_apply_scenarioC

Apply a v2 emulator scenario

Inputs: name (required), input, steps, phoneNames.

emu_bootstrap_labC

Bootstrap the emulator with a generated canonical lab fixture

Inputs: seed, locale, version, nodeCount, +9 more.

emu_call_actionB

Executes mid-call state transitions such as answering, holding, resuming, or disconnecting an active call session.

Inputs: action (required), sessionId (required), reason.

emu_create_call_sessionD

Create a canonical v2 call session

Inputs: calledNumber (required), sourceDeviceName (required), timestamp, callingNumber, +3 more.

emu_create_evidence_bundleC

Build an aggregate evidence bundle from session IDs or a scenario run

Inputs: id, sessionIds, scenarioRunId, requiredArtifactKinds.

emu_create_operation_runD

Execute a synchronous operations drill

Inputs: kind (required), id, limit, eventIds, +2 more.

emu_delete_inventory_itemC

Delete a v2 inventory object

Inputs: id (required), resource (required).

emu_evaluate_curriB

Evaluates external call routing policies via Cisco External Call Control (CURRI / ECC), returning permit, deny, or divert routing decisions.

Inputs: calledNumber (required), callingNumber (required), policyProfile, callingSearchSpaceName.

emu_export_cdr_csvC

Export canonical CDR projections as Cisco-style CSV

Inputs: limit, sessionId.

emu_export_snapshotC

Export the current emulator state as a persisted snapshot

Inputs: id, name, createdAt, includesEvidence, +1 more.

emu_generate_cdrsB

Generates realistic synthetic Cisco Call Detail Records (CDRs) for load testing, abandoned call analysis, or CURRI block reporting.

Inputs: count, pattern, durationMax, durationMin.

emu_get_call_sessionC

Get a canonical v2 call session

Inputs: id (required).

emu_get_cdr_historyB

Retrieves recent CDR records from the emulator buffer in structured JSON or raw Cisco CSV export format.

Inputs: limit, callId, format.

emu_get_cdr_publisherB

Get canonical CDR publisher configuration and pending state

Inputs: no named parameters.

emu_get_cmr_publisherA

Get canonical CMR publisher configuration and pending state

Inputs: no named parameters.

emu_get_contracts_axlC

Inspect AXL operation coverage for one CUCM version

Inputs: version.

emu_get_contracts_catalogB

Returns the v2 contract catalog with typed AXL operation metadata, coverage summaries, resources, capabilities, and state collections.

Inputs: no named parameters.

emu_get_contracts_openapi_jsonB

Fetch generated OpenAPI JSON

Inputs: no named parameters.

emu_get_contracts_openapi_yamlB

Fetch generated OpenAPI YAML

Inputs: no named parameters.

emu_get_contracts_versionsB

List supported contract versions

Inputs: no named parameters.

emu_get_curri_historyB

Retrieves the log of past CURRI / ECC routing evaluation decisions and rule matches.

Inputs: limit, callId.

emu_get_evidenceC

Fetch an evidence bundle for a canonical call session

Inputs: id (required).

emu_get_healthzC

Health check

Inputs: no named parameters.

emu_get_inventory_itemC

Get a v2 inventory object by id

Inputs: id (required), resource (required).

emu_get_operation_runC

Fetch one operation run

Inputs: id (required).

emu_get_phone_by_ipB

Resolve a phone fixture by IP address

Inputs: ipAddress (required).

emu_get_phone_webA

Retrieves serviceability, network configuration, or XML execute web responses from a simulated Cisco IP phone endpoint.

Inputs: phoneNameOrIp (required), path, format.

emu_get_scenario_runC

Get a v2 scenario run

Inputs: id (required).

emu_get_scenario_run_eventsC

Get the event log for a v2 scenario run

Inputs: id (required).

emu_get_summaryD

Get v2 summary counters

Inputs: no named parameters.

emu_get_syslog_publisherA

Get canonical syslog publisher configuration and delivery state

Inputs: no named parameters.

emu_get_topologyB

Get v2 switch topology and endpoint routing

Inputs: no named parameters.

emu_import_snapshotC

Persist a provided snapshot pack

Inputs: pack (required).

emu_inspect_fixturesB

Inspects and returns a comprehensive summary of active CUCM cluster nodes, phones, call sessions, policies, and buffers.

Inputs: no named parameters.

emu_list_active_callsA

Lists active or in-progress telephone call sessions and their current state (alerting, connected, policy-pending, held).

Inputs: limit, state.

emu_list_artifact_batchesA

List pending and delivered artifact batches across publishers

Inputs: no named parameters.

emu_list_call_sessionsC

List canonical v2 call sessions

Inputs: limit.

emu_list_cdr_recordsC

List canonical CDR projections

Inputs: limit, sessionId.

emu_list_cmr_recordsC

List canonical CMR projections

Inputs: limit, sessionId.

emu_list_curri_eventsC

List canonical CURRI projections

Inputs: limit, sessionId.

emu_list_inventoryC

List inventory objects from a v2 collection

Inputs: resource (required).

emu_list_nodesA

Lists all CUCM cluster nodes (Publisher, Subscribers, TFTP) with their IP addresses, active versions, and RISDB return codes.

Inputs: role, limit, offset.

emu_list_operation_runsC

List completed operation runs

Inputs: limit.

emu_list_phonesB

Lists configured and registered Cisco IP phone endpoints with their line numbers, MAC addresses, firmware, and registration status.

Inputs: limit, model, offset, status, +1 more.

emu_list_scenariosB

List supported v2 scenario definitions

Inputs: no named parameters.

emu_list_snapshotsA

List persisted emulator snapshots

Inputs: no named parameters.

emu_list_syslog_eventsC

List canonical syslog projections

Inputs: limit.

emu_list_syslog_sourcesB

List canonical syslog source inventory

Inputs: no named parameters.

emu_load_snapshotB

Load a persisted snapshot into the in-memory emulator

Inputs: id (required).

emu_patch_inventory_itemD

Patch a v2 inventory object

Inputs: id (required), body (required), resource (required).

emu_post_axl_B

Accepts AXL SOAP operations such as getPhone, getUser, listPhone, and executeSQLQuery.

Inputs: no named parameters.

emu_post_cdron_demand_service2_services_cdron_demand_serviceB

Accepts get_file_list requests for virtual CDR repository files.

Inputs: no named parameters.

emu_post_logcollectionservice2_services_log_collection_port_type_serviceB

Accepts CUCM serviceability log-collection operations such as listNodeServiceLogs and selectLogFiles.

Inputs: no named parameters.

emu_post_logcollectionservice_services_dime_get_file_serviceB

Returns CUCM serviceability files through multipart/related DIME responses.

Inputs: no named parameters.

emu_post_perfmonservice2_services_perfmon_serviceC

Accepts CUCM PerfMon operations including counter discovery, collection, and session workflows.

Inputs: no named parameters.

emu_post_realtimeservice2_services_risservice70C

Accepts RIS SOAP operations such as selectCmDevice and selectCmDeviceExt.

Inputs: no named parameters.

emu_preview_artifactsB

Preview session-derived artifacts without publishing them

Inputs: id (required).

emu_publish_cdrB

Flush the CDR publisher immediately

Inputs: no named parameters.

emu_publish_cmrC

Flush the CMR publisher immediately

Inputs: no named parameters.

emu_publish_syslogB

Flush the syslog publisher immediately

Inputs: no named parameters.

emu_query_sqlB

Available when CUCM_EMULATOR_STORAGE=sqlite. Supports SELECT, WITH, and PRAGMA statements only.

Inputs: sql (required), params.

emu_replay_scenario_runC

Replay a previous v2 scenario run

Inputs: id (required).

emu_reset_storeA

Resets or wipes the CUCM emulator in-memory state and re-seeds with a specified topology profile.

Inputs: mode, profile.

emu_seed_fixturesB

Seeds deterministic cluster topology, nodes, phones, dial plan partitions, CSS, and CURRI policies into the CUCM emulator store.

Inputs: seed, version, clusterIp, phoneCount, +1 more.

emu_set_node_statusA

Modifies the status and RIS return code of a cluster node to simulate failover, network isolation, or service degradation (ADR 0120/0122).

Inputs: nodeName (required), role, status, risReturnCode.

emu_set_phone_statusB

Updates the registration status of a specific Cisco IP phone (Registered, UnRegistered, Rejected) in the RISDB projection.

Inputs: status (required), phoneName (required).

emu_simulate_callA

Simulates an end-to-end telephone call through CUCM dial plan routing, calculating RTP media metrics and emitting synthetic CDR/CMR records.

Inputs: calledNumber (required), callingNumber (required), codec, duration, +2 more.

emu_terminate_call_sessionC

Terminate a canonical v2 call session

Inputs: id (required), reason, timestamp.

emu_update_cdr_publisherB

Update canonical CDR publisher configuration

Inputs: enabled, sftpHost, sftpPort, transport, +7 more.

emu_update_cmr_publisherD

Update canonical CMR publisher configuration

Inputs: enabled, sftpHost, sftpPort, transport, +7 more.

emu_update_syslog_publisherC

Update canonical syslog publisher configuration

Inputs: format, enabled, transport, intervalMs, +8 more.

emu_upsert_inventoryC

Create or upsert a v2 inventory object

Inputs: body (required), resource (required).

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    C2.3/5.0

    Scored across 73 tools

    Disambiguation2/5

    Many tools form parallel legacy and v2 surfaces for the same concepts (e.g., emu_list_active_calls vs emu_list_call_sessions, emu_get_cdr_history vs emu_list_cdr_records, emu_simulate_call vs emu_create_call_session), so an agent must infer which generation to use. The SOAP passthrough tools also overlap with higher-level tools for AXL, RIS, PerfMon, and CDR operations.

    Naming Consistency2/5

    The emu_ verb_noun convention is visible, but it is broken by unwieldy endpoint-derived names like emu_post_realtimeservice2_services_risservice70 and emu_post_logcollectionservice_services_dime_get_file_service, as well as by inconsistent verb choices (list/get/inspect/fetch/query, create/generate/upsert/seed/bootstrap). The legacy/v2 distinction is not encoded in names, making the pattern unpredictable.

    Tool Count1/5

    73 tools is far beyond the 50+ threshold and includes extensive meta surfaces (contracts, OpenAPI, scenarios, operation runs, snapshots, evidence) alongside parallel legacy SOAP passthrough endpoints. The core CUCM emulation could be exposed through a much smaller, purpose-built toolset.

    Completeness4/5

    The server covers cluster nodes, phones, call sessions, CDR/CMR, CURRI, syslog, publishers, snapshots, and AXL/RIS/serviceability operations, so most domain workflows have a path. Minor gaps remain: phone/node lifecycle is mostly limited to status changes and generic inventory upserts, and canonical v2 lacks some direct update/delete semantics that legacy tools patch over.

    Maintenance

    ActivityNo data
    ResponsivenessSyncing

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI agents to make real-world phone calls with AI voice technology and provides tools to track call status, transcripts, and summaries. It supports automated communication with both live numbers and simulated businesses for testing and demonstration purposes.
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables AI assistants to interact with Cisco Modeling Labs (CML) using natural language, allowing creation, management, and automation of network labs.
      670 PyPI
      80
      BSD 2-Clause "Simplified"