{"_id":"@calltelemetry/cucm-emulator-mcp","_rev":"4-c40dbb292110071411133df9eab345c5","name":"@calltelemetry/cucm-emulator-mcp","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"@calltelemetry/cucm-emulator-mcp","version":"0.1.0","keywords":["mcp","model-context-protocol","cucm","cisco","emulator","telephony","openapi","axl","risport","curri","cdr"],"author":{"name":"Call Telemetry"},"license":"MIT","_id":"@calltelemetry/cucm-emulator-mcp@0.1.0","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"homepage":"https://github.com/calltelemetry/cucm-emulator-mcp#readme","bugs":{"url":"https://github.com/calltelemetry/cucm-emulator-mcp/issues"},"bin":{"cucm-emulator-mcp":"dist/bin/cucm-emulator-mcp.js"},"dist":{"shasum":"2f2556e405572348cd943f0a14bda72958872099","tarball":"https://registry.npmjs.org/@calltelemetry/cucm-emulator-mcp/-/cucm-emulator-mcp-0.1.0.tgz","fileCount":124,"integrity":"sha512-4nE0PCHBbGzy1UO003KG0RmeskE5irJL6P63VkOW8KORAZN0s5KD5jqFG1/kX93L6mw+73RMiViNr3bkwC5eBQ==","signatures":[{"sig":"MEYCIQDCZ4o3nPHP2ImdZs1R3cfJS52ahmJT3SFtQoj55HyMbAIhALc5e0WjtToVYl3XnShmPttrR5OmylZNNxJUbdg+iEnk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":608768},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"c8ce4bfdfb55c5f94048f1f1ff8f48942985835a","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json && chmod +x dist/bin/*.js 2>/dev/null || true","start":"node dist/bin/cucm-emulator-mcp.js","prepack":"npm run build","pretest":"npm run build","test:e2e":"vitest run test/e2e","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"repository":{"url":"git+https://github.com/calltelemetry/cucm-emulator-mcp.git","type":"git"},"_npmVersion":"10.9.8","description":"OpenAPI-driven Model Context Protocol (MCP) server for Cisco CUCM Emulator with dynamic tool generation and in-memory mock store.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.2","yaml":"^2.8.3","dotenv":"^16.4.7","undici":"^7.4.0","express":"^4.21.2","commander":"^13.1.0","@modelcontextprotocol/sdk":"^1.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","vitest":"^3.0.7","typescript":"^5.7.3","@types/node":"^22.13.5","@types/express":"^5.0.0","@vitest/coverage-v8":"^3.0.7"},"_npmOperationalInternal":{"tmp":"tmp/cucm-emulator-mcp_0.1.0_1787345279798_0.1392383019348491","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@calltelemetry/cucm-emulator-mcp","version":"0.1.1","keywords":["mcp","model-context-protocol","cucm","cisco","emulator","telephony","openapi","axl","risport","curri","cdr"],"author":{"name":"Call Telemetry"},"license":"MIT","_id":"@calltelemetry/cucm-emulator-mcp@0.1.1","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"homepage":"https://github.com/calltelemetry/cucm-emulator-mcp#readme","bugs":{"url":"https://github.com/calltelemetry/cucm-emulator-mcp/issues"},"bin":{"cucm-emulator-mcp":"dist/bin/cucm-emulator-mcp.js"},"dist":{"shasum":"793cb506f7a85169a04c57ef003447b8d9abec1a","tarball":"https://registry.npmjs.org/@calltelemetry/cucm-emulator-mcp/-/cucm-emulator-mcp-0.1.1.tgz","fileCount":124,"integrity":"sha512-x17tMXSLgyG2b5W91kpcW7LKiLgUodn+y1iqen4W/r39lVhuvUErDrW3GgzMlh1UhBoPF+zWfKfSjqVxAjwX+w==","signatures":[{"sig":"MEYCIQC0KRW+aVyIeapBqjnRdKMKdxwu6ybEKQjsnaCYvDnDDgIhAK8Z6ND/vn0lsV3+QJtefpBSFzXIN3t0jzZX3m47/aJp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@calltelemetry%2fcucm-emulator-mcp@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":608768},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"1c342aac984a91639bc82b06b6ef217638120dbd","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json && chmod +x dist/bin/*.js 2>/dev/null || true","start":"node dist/bin/cucm-emulator-mcp.js","prepack":"npm run build","pretest":"npm run build","test:e2e":"vitest run test/e2e","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"repository":{"url":"git+https://github.com/calltelemetry/cucm-emulator-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"OpenAPI-driven Model Context Protocol (MCP) server for Cisco CUCM Emulator with dynamic tool generation and in-memory mock store.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.24.2","yaml":"^2.8.3","dotenv":"^16.4.7","undici":"^7.4.0","express":"^4.21.2","commander":"^13.1.0","@modelcontextprotocol/sdk":"^1.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","vitest":"^3.0.7","typescript":"^5.7.3","@types/node":"^22.13.5","@types/express":"^5.0.0","@vitest/coverage-v8":"^3.0.7"},"_npmOperationalInternal":{"tmp":"tmp/cucm-emulator-mcp_0.1.1_1787345869504_0.7941285176856703","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@calltelemetry/cucm-emulator-mcp","version":"0.1.2","keywords":["mcp","model-context-protocol","cucm","cisco","emulator","telephony","openapi","axl","risport","curri","cdr"],"author":{"name":"Call Telemetry"},"license":"MIT","_id":"@calltelemetry/cucm-emulator-mcp@0.1.2","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"homepage":"https://github.com/calltelemetry/cucm-emulator-mcp#readme","bugs":{"url":"https://github.com/calltelemetry/cucm-emulator-mcp/issues"},"bin":{"cucm-emulator-mcp":"dist/bin/cucm-emulator-mcp.js"},"dist":{"shasum":"f18d2b6057548e85d1268b25339dba9af2989252","tarball":"https://registry.npmjs.org/@calltelemetry/cucm-emulator-mcp/-/cucm-emulator-mcp-0.1.2.tgz","fileCount":124,"integrity":"sha512-8SQs9dBV7hUSUzscdd52ZIlrCgqidfoSUYdK5uzwIeD7XRHDwUcLqvFfb5/zFcTq8W4GovWl4KJvoJ76LNS8Pw==","signatures":[{"sig":"MEYCIQDkJGig/C3fLtCr+niPc5XkASnhWjqJuWFx1HGt+zR6zAIhANNB3xO7tiSUeeXAvMkPtpSpXSBFUMTHOA59yF7ezXEJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@calltelemetry%2fcucm-emulator-mcp@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":615083},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"52d30f673865a979301a0aabfabdb22aa86cd644","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json && chmod +x dist/bin/*.js 2>/dev/null || true","start":"node dist/bin/cucm-emulator-mcp.js","prepack":"npm run build","pretest":"npm run build","test:e2e":"vitest run test/e2e","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"repository":{"url":"git+https://github.com/calltelemetry/cucm-emulator-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"OpenAPI-driven Model Context Protocol (MCP) server for Cisco CUCM Emulator with dynamic tool generation and in-memory mock store.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.24.2","yaml":"^2.8.3","dotenv":"^16.4.7","undici":"^7.4.0","express":"^4.21.2","commander":"^13.1.0","@modelcontextprotocol/sdk":"^1.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","vitest":"^3.0.7","typescript":"^5.7.3","@types/node":"^22.13.5","@types/express":"^5.0.0","@vitest/coverage-v8":"^3.0.7"},"_npmOperationalInternal":{"tmp":"tmp/cucm-emulator-mcp_0.1.2_1788284958453_0.747909205102506","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@calltelemetry/cucm-emulator-mcp","version":"0.1.3","description":"OpenAPI-driven Model Context Protocol (MCP) server for Cisco CUCM Emulator with dynamic tool generation and in-memory mock store.","type":"module","main":"./dist/src/index.js","types":"./dist/src/index.d.ts","bin":{"cucm-emulator-mcp":"dist/bin/cucm-emulator-mcp.js"},"scripts":{"build":"tsc -p tsconfig.build.json && chmod +x dist/bin/*.js 2>/dev/null || true","typecheck":"tsc --noEmit","pretest":"npm run build","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","test:e2e":"vitest run test/e2e","prepack":"npm run build","prepublishOnly":"npm run build && npm run test","start":"node dist/bin/cucm-emulator-mcp.js"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/calltelemetry/cucm-emulator-mcp.git"},"keywords":["mcp","model-context-protocol","cucm","cisco","emulator","telephony","openapi","axl","risport","curri","cdr"],"author":{"name":"Call Telemetry"},"license":"MIT","dependencies":{"@modelcontextprotocol/sdk":"^1.6.0","commander":"^13.1.0","dotenv":"^16.4.7","express":"^4.21.2","undici":"^7.4.0","yaml":"^2.8.3","zod":"^3.24.2"},"devDependencies":{"@types/express":"^5.0.0","@types/node":"^22.13.5","@vitest/coverage-v8":"^3.0.7","tsx":"^4.19.3","typescript":"^5.7.3","vitest":"^3.0.7"},"engines":{"node":">=20.0.0"},"_id":"@calltelemetry/cucm-emulator-mcp@0.1.3","gitHead":"b362f9eea65c46d7b9fae79ef5318b9fd0262edc","bugs":{"url":"https://github.com/calltelemetry/cucm-emulator-mcp/issues"},"homepage":"https://github.com/calltelemetry/cucm-emulator-mcp#readme","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-U4FQltZOLf7N/RXtsjIgVTxiGCYrh/SdGsQRwQ8RbKPN/pElr20WDbz+CSSHhIeiNplvY+iJ/HJbqccPnCQAQg==","shasum":"51223bcbf8d014c0169db2f2b51db84936d0fcf4","tarball":"https://registry.npmjs.org/@calltelemetry/cucm-emulator-mcp/-/cucm-emulator-mcp-0.1.3.tgz","fileCount":124,"unpackedSize":619199,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@calltelemetry%2fcucm-emulator-mcp@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAMSMVLB9/Ygj7WCAqcCnFpMPqXfoDfoWOskYUZAmaFCAiEAmldyFEIRcXQFzNxuEMvKFyHyUgszjEJVTF/qhPZjnjg="}]},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"directories":{},"maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cucm-emulator-mcp_0.1.3_1788310176235_0.16889434183755148"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-21T20:47:59.656Z","modified":"2026-09-02T00:49:36.891Z","0.1.0":"2026-08-21T20:47:59.948Z","0.1.1":"2026-08-21T20:57:49.893Z","0.1.2":"2026-09-01T17:49:18.596Z","0.1.3":"2026-09-02T00:49:36.389Z"},"bugs":{"url":"https://github.com/calltelemetry/cucm-emulator-mcp/issues"},"author":{"name":"Call Telemetry"},"license":"MIT","homepage":"https://github.com/calltelemetry/cucm-emulator-mcp#readme","keywords":["mcp","model-context-protocol","cucm","cisco","emulator","telephony","openapi","axl","risport","curri","cdr"],"repository":{"type":"git","url":"git+https://github.com/calltelemetry/cucm-emulator-mcp.git"},"description":"OpenAPI-driven Model Context Protocol (MCP) server for Cisco CUCM Emulator with dynamic tool generation and in-memory mock store.","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"readme":"# @calltelemetry/cucm-emulator-mcp\n\nOpenAPI-driven Model Context Protocol (MCP) server for Cisco Unified Communications Manager (CUCM) Emulator.\n\n## Overview\n\n`@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:\n\n1. **Fixtures & Topology**: `emu_seed_fixtures`, `emu_reset_store`, `emu_inspect_fixtures`\n2. **Nodes & Cluster Health**: `emu_list_nodes`, `emu_set_node_status` (ADR 0120/0122 failover)\n3. **Phones & Registration**: `emu_list_phones`, `emu_set_phone_status`, `emu_get_phone_web`\n4. **Call Simulation & Legs**: `emu_simulate_call`, `emu_call_action`, `emu_list_active_calls`\n5. **CURRI / ECC Policy Routing**: `emu_evaluate_curri`, `emu_get_curri_history`\n6. **CDR / CMR Buffers**: `emu_generate_cdrs`, `emu_get_cdr_history`\n7. **Dynamic OpenAPI Operations**: 46+ auto-compiled operations (`emu_get_summary`, `emu_get_topology`, `emu_query_sql`, `emu_list_inventory`, `emu_upsert_inventory`, etc.)\n\n## Architecture\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│                    AI Agents / MCP Clients                  │\n│                (Claude Code, Cursor, Windsurf)              │\n└──────────────────────────────┬──────────────────────────────┘\n                               │ JSON-RPC 2.0 (Stdio / SSE)\n┌──────────────────────────────▼──────────────────────────────┐\n│                  CucmEmulatorMcpServer                      │\n│                                                             │\n│  ┌───────────────────────┐      ┌────────────────────────┐  │\n│  │     Tool Registry     │      │   OpenAPI Spec Parser  │  │\n│  │ (15 Domain + Dynamic) │◄─────┤   (Dereferencer/Build) │  │\n│  └───────────┬───────────┘      └────────────────────────┘  │\n│              │                                              │\n│  ┌───────────▼───────────────────────────────────────────┐  │\n│  │             ICucmEmulatorClient Abstraction           │  │\n│  └───────────┬───────────────────────────┬───────────────┘  │\n└──────────────┼───────────────────────────┼──────────────────┘\n               │                           │\n┌──────────────▼────────────┐ ┌────────────▼──────────────────┐\n│      HttpCucmClient       │ │    DirectStoreCucmClient      │\n│  Live In-Guest / Container│ │  In-Memory Mock Store State   │\n│ (http://127.0.0.1:8443)   │ │  (100% Offline Zero-Config)   │\n└───────────────────────────┘ └───────────────────────────────┘\n```\n\n## Installation & Quick Start\n\n### Global CLI\n\n```bash\nnpm install -g @calltelemetry/cucm-emulator-mcp\n```\n\n### Run Stdio Server (for AI Agents / Claude Desktop)\n\n```bash\ncucm-emulator-mcp --transport stdio\n```\n\n### Run SSE Server\n\n```bash\ncucm-emulator-mcp --transport sse --port 3000 --host 127.0.0.1\n```\n\n### Configuration Options\n\n| Option | Flag | Environment Variable | Default | Description |\n|---|---|---|---|---|\n| Transport | `-t, --transport` | `MCP_TRANSPORT` | `stdio` | Transport type: `stdio` or `sse` |\n| Port | `-p, --port` | `PORT` / `MCP_PORT` | `3000` | Port for SSE HTTP server |\n| Host | `-h, --host` | `HOST` / `MCP_HOST` | `127.0.0.1` | Bind host for SSE transport |\n| Target URL | `-u, --target-url` | `CUCM_EMULATOR_URL` | `undefined` | Target live emulator URL |\n| Spec Path | `-s, --spec-path` | `CUCM_OPENAPI_SPEC` | Bundled | Path or URL to OpenAPI 3.1.0 spec |\n| Mock Mode | `-m, --mock` | `CUCM_MOCK` | `false` | Force in-process in-memory mock store |\n| Seed Profile | `--seed-profile` | `CUCM_SEED_PROFILE` | `lab-small` | `lab-small`, `standard-enterprise`, `empty` |\n| Auth Token | `--auth-token` | `CUCM_EMULATOR_AUTH_TOKEN` | `undefined` | Bearer auth token for live emulator |\n| Redact Secrets | `--redact-secrets`| `REDACT_SECRETS` | `false` | Redact sensitive strings in logs |\n\n## MCP Client Configuration\n\n### Claude Desktop (`claude_desktop_config.json`)\n\n```json\n{\n  \"mcpServers\": {\n    \"cucm-emulator\": {\n      \"command\": \"cucm-emulator-mcp\",\n      \"args\": [\"--transport\", \"stdio\", \"--mock\", \"--seed-profile\", \"lab-small\"]\n    }\n  }\n}\n```\n\n### SSE Integration\n\n```json\n{\n  \"mcpServers\": {\n    \"cucm-emulator-sse\": {\n      \"url\": \"http://127.0.0.1:3000/sse\"\n    }\n  }\n}\n```\n\n## Available Tool Reference\n\n### Fixtures & Topology\n- `emu_seed_fixtures`: Seeds deterministic cluster topology, nodes, phones, dial plan partitions, CSS, and CURRI policies.\n- `emu_reset_store`: Resets or wipes emulator state and re-seeds with a specified topology profile.\n- `emu_inspect_fixtures`: Inspects and returns a comprehensive summary of active CUCM cluster state.\n\n### Nodes & Failover\n- `emu_list_nodes`: Lists all CUCM cluster nodes (Publisher, Subscribers, TFTP) with roles and RIS return codes.\n- `emu_set_node_status`: Sets node status (`Online`, `Offline`, `NotFound`, `SearchLimitExceeded`) for ADR 0120/0122 failover testing.\n\n### Phones & Registration\n- `emu_list_phones`: Lists configured and registered Cisco IP phone endpoints with directory numbers and MACs.\n- `emu_set_phone_status`: Updates phone registration status (`Registered`, `UnRegistered`, `Rejected`, `Unknown`).\n- `emu_get_phone_web`: Fetches phone XML, HTML, or JSON serviceability / status web responses.\n\n### Call Simulation\n- `emu_simulate_call`: Simulates an end-to-end telephone call through CUCM dial plan routing with RTP media metrics.\n- `emu_call_action`: Executes mid-call actions (`answer`, `hold`, `resume`, `drop`).\n- `emu_list_active_calls`: Lists active in-progress call sessions in the emulator.\n\n### CURRI / ECC Policy Routing\n- `emu_evaluate_curri`: Evaluates external call routing policies via CURRI / ECC, returning permit, deny, or divert verdicts.\n- `emu_get_curri_history`: Retrieves the log of past CURRI routing evaluation decisions.\n\n### CDR / CMR Buffers\n- `emu_generate_cdrs`: Generates batches of synthetic CDR records (normal, abandoned, curri-blocked, burst).\n- `emu_get_cdr_history`: Retrieves recent CDR records in structured JSON or raw Cisco CSV export format.\n\n### SOAP AXL / RIS / DIME (short aliases)\nCursor 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):\n\n- `emu_axl`: `POST /axl/` (AXL envelope in `body`)\n- `emu_ris`: `POST /realtimeservice2/services/RISService70`\n- `emu_dime`: `POST /logcollectionservice2/services/LogCollectionPortTypeService`\n- `emu_dime_file`: `POST /logcollectionservice/services/DimeGetFileService`\n\nInventory, CGI, and screenshots stay on v2 HTTP / `emu_get_phone_*`.\n\n## Development & Verification\n\n```bash\n# Typecheck\nnpm run typecheck\n\n# Build TypeScript\nnpm run build\n\n# Run Full Test Suite (155 Tests)\nnpm test\n\n# Run with Coverage\nnpm run test:coverage\n\n# Verify Packaging\nnpm pack --dry-run\n```\n\n## License\n\nMIT © Call Telemetry\n","readmeFilename":"README.md"}