cucm-emulator-mcp
Manage and simulate a Cisco CUCM telephony cluster through MCP tools.
Topology & Fixtures: Seed deterministic clusters (lab-small, standard-enterprise, custom), reset state (soft/hard), inspect full cluster state, and manage inventory (nodes, device pools, route partitions, CSS, route patterns, SIP trunks, phones, lines, users, ECC profiles, policies).
Node & Failover Simulation: List cluster nodes by role, set node status/RIS return codes (Online/Offline/NotFound/Timeout) for ADR 0120/0122 failover testing.
Phone Management: List and filter phones by model/status/node, update registration status (Registered/UnRegistered/Rejected/Unknown), and fetch phone web pages (XML/HTML/JSON).
Call Simulation: Simulate end-to-end calls with codec, duration, packet loss, and CSS; execute mid-call actions (answer/hold/resume/drop); list and filter active call sessions by state.
Policy Routing (CURRI/ECC): Evaluate external call control policies (permit/deny/redirect), retrieve CURRI history, and inspect canonical CURRI events.
CDR/CMR Records: Generate synthetic CDRs (normal, abandoned, curri-blocked, burst), retrieve CDR/CMR history in JSON or CSV, manage CDR/CMR publishers (SFTP/HTTP/local), and flush publishers.
Syslog Integration: List syslog events/sources, configure syslog publisher (UDP/TCP), and force immediate syslog delivery.
Scenarios & Operations: Apply predefined scenarios (node failover, phone churn, emergency dialing, PSTN egress, transfer/conference, etc.), run operations drills (publisher flush, phone crawl, RIS poll), and replay scenario runs.
Call Sessions & Evidence: Create/list/append events to canonical call sessions, terminate sessions, and build/fetch evidence bundles (CDR, CMR, CURRI, syslog) for analysis.
Snapshots: Export/import/load full emulator state snapshots, including all configuration and call history.
SOAP/OpenAPI Access: Use short aliases to call AXL, RIS, DIME, CDRonDemand, and PerfMon SOAP endpoints, plus fetch OpenAPI JSON/YAML and contract catalogs.
Miscellaneous: Query SQL (when SQLite storage enabled), get topology/summary/health, resolve phones by IP, and interact with scenario/operation run logs.
Provides tools for interacting with Cisco Unified Communications Manager (CUCM) Emulator, enabling simulation and management of cluster nodes, phone registration, call legs, CURRI/ECC policy routing, and CDR/CMR buffers.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@cucm-emulator-mcp Can you list the phones in the emulator and show their status?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@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:
Fixtures & Topology:
cucm_emulator_seed_fixtures,cucm_emulator_reset_store,cucm_emulator_inspect_fixturesNodes & Cluster Health:
cucm_emulator_list_nodes,cucm_emulator_simulate_node_failover(ADR 0120/0122 failover)Phones & Registration:
cucm_emulator_list_phones,cucm_emulator_set_phone_status,cucm_emulator_get_phone_webCall Simulation & Legs:
cucm_emulator_simulate_call,cucm_emulator_call_action,cucm_emulator_list_active_callsCURRI / ECC Policy Routing:
cucm_emulator_evaluate_curri,cucm_emulator_get_curri_historyCDR / CMR Buffers:
cucm_emulator_generate_cdrs,cucm_emulator_get_cdr_historyDynamic 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-mcpRun Stdio Server (for AI Agents / Claude Desktop)
cucm-emulator-mcp --transport stdioRun SSE Server
cucm-emulator-mcp --transport sse --port 3000 --host 127.0.0.1Configuration Options
Option | Flag | Environment Variable | Default | Description |
Transport |
|
|
| Transport type: |
Port |
|
|
| Port for SSE HTTP server |
Host |
|
|
| Bind host for SSE transport |
Target URL |
|
|
| Target live emulator URL |
Spec Path |
|
| Bundled | Path or URL to OpenAPI 3.1.0 spec |
Mock Mode |
|
|
| Force in-process in-memory mock store |
Seed Profile |
|
|
|
|
Auth Token |
|
|
| Bearer auth token for live emulator |
Redact Secrets |
|
|
| 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 inbody)cucm_emulator_ris:POST /realtimeservice2/services/RISService70cucm_emulator_dime:POST /logcollectionservice2/services/LogCollectionPortTypeServicecucm_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-runLicense
MIT © Call Telemetry
Available Tools
73 toolsemu_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
Scored across 73 tools
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.
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.
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.
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
Related MCP Connectors
AI-callable tools for API mocking, testing, monitoring, security, and automation.
Give any AI agent a phone: make and answer calls, get through phone menus, and send texts.
Manage CallKaro voice agents, phone numbers, call queues, and place single or batch AI calls.
Give your AI a real phone: place calls, send SMS, fetch recordings and transcripts. Local or hosted.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables 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
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to control Cisco Packet Tracer in real time, allowing natural language-driven creation and configuration of network topologies.6MIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server that enables AI assistants to manage Cisco Unified Communications Manager (CUCM) via AXL SOAP API, supporting provisioning, configuration, and database queries through natural language.318 npm7MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to interact with Cisco Modeling Labs (CML) using natural language, allowing creation, management, and automation of network labs.670 PyPI80BSD 2-Clause "Simplified"