{"_id":"@calltelemetry/cisco-phone-mcp","_rev":"2-adafebfe3a47729fad39ce9e3022db3a","name":"@calltelemetry/cisco-phone-mcp","dist-tags":{"latest":"0.3.0"},"versions":{"0.2.0":{"name":"@calltelemetry/cisco-phone-mcp","version":"0.2.0","keywords":["mcp","cisco","phone","voip","rtp","cucm","ip-phone","call-quality"],"author":{"name":"CallTelemetry"},"license":"MIT","_id":"@calltelemetry/cisco-phone-mcp@0.2.0","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"bin":{"cisco-phone-mcp":"dist/index.js"},"dist":{"shasum":"b0d1857a775314e07daaed773126db1242b2ab2f","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-phone-mcp/-/cisco-phone-mcp-0.2.0.tgz","fileCount":8,"integrity":"sha512-sCN44O0E8xyqX06llPLC/YE1nXZN8u4IipFKet1k4RQACqtLlfNLRGQNwpFNi3qg4HKpRHup2Vdhd9l5/0bZ1Q==","signatures":[{"sig":"MEUCIQDyLLdtpUuqUc+rfy+tRhyHitPErlShV2wUtKT+dN9wnAIgcpNiMQ/aIEtsOajavyHBmqvEmuSo4jVOBpNIGIy/+sU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36611},"main":"dist/index.js","type":"module","gitHead":"a950caefe156cec34fbd383b21e4a0cb812c51be","scripts":{"cli":"tsx src/cli.ts","test":"npm run build && node --test test/*.test.js","build":"tsc && chmod +x dist/index.js","start":"tsx src/index.ts","prepack":"npm run build && npm test","typecheck":"tsc --noEmit","test:coverage":"npm run build && c8 --reporter=lcov --reporter=text node --test test/*.test.js"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"_npmVersion":"10.9.4","description":"MCP server for direct Cisco IP phone control and monitoring via built-in HTTP endpoints","directories":{},"_nodeVersion":"22.22.0","dependencies":{"zod":"^3.24.2","fast-xml-parser":"^4.5.3","@modelcontextprotocol/sdk":"^1.12.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^10.1.3","tsx":"^4.19.4","typescript":"^5.7.3","@types/node":"^22.10.7"},"_npmOperationalInternal":{"tmp":"tmp/cisco-phone-mcp_0.2.0_1772337135974_0.9790240988363303","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@calltelemetry/cisco-phone-mcp","version":"0.3.0","description":"MCP server for direct Cisco IP phone control and monitoring via built-in HTTP endpoints","type":"module","main":"dist/index.js","bin":{"cisco-phone-mcp":"dist/index.js"},"publishConfig":{"access":"public"},"scripts":{"start":"tsx src/index.ts","build":"tsc && chmod +x dist/index.js","typecheck":"tsc --noEmit","cli":"tsx src/cli.ts","test":"tsx --test test/*.test.ts","test:coverage":"npx c8 --reporter=lcov --reporter=text tsx --test test/*.test.ts","prepack":"npm run build && npm test"},"keywords":["mcp","cisco","phone","voip","rtp","cucm","ip-phone","call-quality"],"author":{"name":"CallTelemetry"},"license":"MIT","dependencies":{"@modelcontextprotocol/sdk":"^1.27.1","fast-xml-parser":"^4.5.4","zod":"^4.3.6"},"devDependencies":{"@types/node":"^25.5.0","c8":"^11.0.0","tsx":"^4.21.0","typescript":"^5.9.3"},"packageManager":"yarn@4.12.0","_id":"@calltelemetry/cisco-phone-mcp@0.3.0","_nodeVersion":"24.12.0","_npmVersion":"11.7.0","dist":{"integrity":"sha512-USX+plXv0+Wc0qymX9OoTi3zQnWGgFmqBzvrsehwFd2Xh9Vf4P87oKMS1+dUwdHn1nDZTih/wvtdBUF02Cg8Dw==","shasum":"88f4342e3a8dea2fbd052acfc11a66686428a753","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-phone-mcp/-/cisco-phone-mcp-0.3.0.tgz","fileCount":12,"unpackedSize":70066,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGMDZc5Hs6R8Ws5Dc0iB8jGfYyrR1SayM5oYMvfVbiM3AiBiFN4axCjHZ3UYnB2PbS7KCSxxtDY0b+hXBmHWnW36QQ=="}]},"_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/cisco-phone-mcp_0.3.0_1773886408154_0.35495154302850174"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-01T03:52:15.905Z","modified":"2026-03-19T02:13:28.437Z","0.2.0":"2026-03-01T03:52:16.125Z","0.3.0":"2026-03-19T02:13:28.296Z"},"author":{"name":"CallTelemetry"},"license":"MIT","keywords":["mcp","cisco","phone","voip","rtp","cucm","ip-phone","call-quality"],"description":"MCP server for direct Cisco IP phone control and monitoring via built-in HTTP endpoints","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"readme":"# cisco-phone-mcp\n\n[![CI](https://github.com/calltelemetry/cisco-phone-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/calltelemetry/cisco-phone-mcp/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/calltelemetry/cisco-phone-mcp/graph/badge.svg?token=N79BWBMEGZ)](https://codecov.io/gh/calltelemetry/cisco-phone-mcp)\n[![npm](https://img.shields.io/npm/v/@calltelemetry/cisco-phone-mcp)](https://www.npmjs.com/package/@calltelemetry/cisco-phone-mcp)\n\nBuilt by [Call Telemetry](https://calltelemetry.com) — realtime tools for Cisco Collaboration.\n\nAn [MCP](https://modelcontextprotocol.io/) server that gives AI assistants direct control of Cisco IP phones via their built-in HTTP endpoints.\n\nDial numbers, capture screenshots, read real-time RTP call-quality stats, and query device/network information from any CUCM-managed Cisco IP phone — no JTAPI, no CUCM admin access, no middleware required. Just network access to the phone's IP.\n\n## What It Does\n\nExposes 14 tools for phone control, monitoring, and diagnostics:\n\n| Category | Tools | Description |\n|----------|-------|-------------|\n| **Device Info** | `health`, `get_device_information`, `get_network_configuration`, `get_port_information` | Model, serial, MAC, firmware, IP config, CDP/LLDP neighbors |\n| **RTP / Call Quality** | `get_streaming_statistics`, `get_streaming_statistics_stream`, `get_streaming_statistics_all_streams`, `get_rtp_stats` | Real-time RTP packet counts, jitter, codec, MOS scores |\n| **Call Control** | `dial`, `end_call`, `execute` | Dial digits, end calls, send arbitrary CiscoIPPhoneExecute commands |\n| **Screenshots** | `screenshot`, `screenshot_auto` | Capture phone display (auto-detects endpoint path per model) |\n| **Raw Access** | `raw_get` | GET any phone HTTP endpoint |\n\n## Installation\n\nNo install required — run directly with npx:\n\n```bash\nnpx @calltelemetry/cisco-phone-mcp\n```\n\nOr install globally:\n\n```bash\nnpm install -g @calltelemetry/cisco-phone-mcp\n```\n\n## Quick Start\n\n### Claude Code\n\n```bash\nclaude mcp add phone -e PHONE_USERNAME=admin -e PHONE_PASSWORD=cisco -- npx @calltelemetry/cisco-phone-mcp\n```\n\nOr add to `~/.claude.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"phone\": {\n      \"command\": \"npx\",\n      \"args\": [\"@calltelemetry/cisco-phone-mcp\"],\n      \"env\": {\n        \"PHONE_USERNAME\": \"admin\",\n        \"PHONE_PASSWORD\": \"cisco\"\n      },\n      \"type\": \"stdio\"\n    }\n  }\n}\n```\n\n### Other MCP Clients\n\nAny MCP-compatible client can launch the server via stdio:\n\n```bash\nPHONE_USERNAME=admin PHONE_PASSWORD=cisco npx @calltelemetry/cisco-phone-mcp\n```\n\n## Configuration\n\n| Environment Variable | Description |\n|---|---|\n| `PHONE_USERNAME` | Phone web UI username |\n| `PHONE_PASSWORD` | Phone web UI password |\n\nAliases `PHONE_USER` and `PHONE_PASS` are also accepted.\n\nAuthentication is optional — many phones allow unauthenticated access to info endpoints. Every tool accepts an optional `auth` parameter to override credentials per-call.\n\n## Tools\n\n### `health`\n\nCheck if a phone is reachable.\n\n```json\n{ \"host\": \"192.168.1.100\" }\n```\n\nReturns HTTP status code and content type.\n\n### `get_device_information`\n\nQuery `/DeviceInformationX` — model name, serial number, MAC address, firmware version, hardware revision.\n\n```json\n{ \"host\": \"192.168.1.100\" }\n```\n\n### `get_network_configuration`\n\nQuery `/NetworkConfigurationX` — IP address, subnet, default gateway, DNS servers, DHCP status, TFTP/CUCM server addresses.\n\n### `get_port_information`\n\nQuery `/PortInformationX` — CDP and LLDP neighbor information (switch name, port, VLAN).\n\n### `get_streaming_statistics` / `get_rtp_stats`\n\nQuery `/StreamingStatisticsX` for real-time RTP media statistics:\n\n- **Codec** — G.711, G.722, etc.\n- **Packet counts** — TX/RX packets and bytes\n- **Jitter** — Current jitter in milliseconds\n- **MOS** — Mean Opinion Score (call quality)\n- **Remote/Local addresses** — IP:port pairs for the active media stream\n\n`get_rtp_stats` returns a simplified summary; `get_streaming_statistics` returns the full XML response.\n\n### `get_streaming_statistics_stream`\n\nQuery a specific stream (0-4) via the Serviceability HTML endpoint:\n\n```json\n{ \"host\": \"192.168.1.100\", \"streamIndex\": 0 }\n```\n\n### `get_streaming_statistics_all_streams`\n\nReturns all 5 streams — useful for conference calls or shared lines.\n\n### `dial`\n\nInitiate a call from the phone:\n\n```json\n{ \"host\": \"192.168.1.100\", \"digits\": \"9005551234\" }\n```\n\nSends `Key:Speaker` (activates speakerphone) then `Dial:<digits>` via `/CGI/Execute`. Set `speaker: false` to skip the speaker activation.\n\n### `end_call`\n\nEnd the active call by sending `Key:EndCall` (default: 2 presses).\n\n### `execute`\n\nSend arbitrary `CiscoIPPhoneExecute` commands:\n\n```json\n{ \"host\": \"192.168.1.100\", \"urls\": [\"Key:Services\", \"Key:Soft1\"] }\n```\n\n### `screenshot` / `screenshot_auto`\n\nCapture the phone display as an image file. `screenshot_auto` tries multiple endpoint paths to handle model differences (79xx BMP, 88xx PNG, 98xx HTTPS).\n\n### `raw_get`\n\nFetch any phone HTTP endpoint:\n\n```json\n{ \"host\": \"192.168.1.100\", \"path\": \"/StreamingStatisticsX?2\" }\n```\n\n## Supported Phone Models\n\n| Series | Info Endpoints | Execute/Dial | Screenshots | Notes |\n|--------|:-:|:-:|:-:|-------|\n| **79xx** (7941, 7945, 7965, 7975) | Yes | Yes | Yes (BMP) | Most reliable |\n| **88xx** (8841, 8845, 8851, 8861) | Yes | Yes | Yes (PNG) | — |\n| **78xx** (7821, 7841, 7861) | Yes | Yes | Varies | — |\n| **39xx** (3905) | Limited | Yes | LCD only | Uses `/CGI/lcd.bmp` |\n| **69xx** (6901, 6921, 6941, 6961) | Limited | Yes | LCD only | Uses `/CGI/lcd.bmp` |\n| **98xx** (9841, 9851, 9861) | Yes | Yes | Yes | Requires HTTPS |\n\n## Examples\n\n### Verify a phone received audio (RTP packet delta)\n\n```\n# Before call\nstats_before = mcp__phone__get_rtp_stats({ host: \"192.168.1.100\" })\n\n# After audio injection\nstats_after = mcp__phone__get_rtp_stats({ host: \"192.168.1.100\" })\n\n# Compare rxPackets — if delta > 0, audio was received\n```\n\n### Remote dial and screenshot\n\n```\nmcp__phone__dial({ host: \"192.168.1.100\", digits: \"9005551234\" })\n# Wait for call to connect...\nmcp__phone__screenshot_auto({ host: \"192.168.1.100\" })\n```\n\n### Check call quality during a call\n\n```\nmcp__phone__get_rtp_stats({ host: \"192.168.1.100\" })\n# Returns: jitter, MOS score, packet loss, codec info\n```\n\n## Architecture\n\n```\nAI Agent  ──►  cisco-phone-mcp (stdio)  ──►  Phone HTTP Server\n               MCP SDK + Zod validation       /DeviceInformationX\n               fast-xml-parser                 /NetworkConfigurationX\n                                               /StreamingStatisticsX\n                                               /CGI/Execute\n                                               /CGI/Screenshot\n```\n\nThe server communicates directly with phones over HTTP (or HTTPS for 98xx). No CUCM, JTAPI, or middleware is needed — just network access to the phone's IP.\n\n## CLI Testing\n\nA built-in CLI is included for quick manual checks (from source checkout):\n\n```bash\nnpx tsx src/cli.ts device --host 192.168.1.100\nnpx tsx src/cli.ts network --host 192.168.1.100\nnpx tsx src/cli.ts port --host 192.168.1.100\nnpx tsx src/cli.ts rtp --host 192.168.1.100\n```\n\n## Development\n\n```bash\ngit clone https://github.com/calltelemetry/cisco-phone-mcp.git\ncd cisco-phone-mcp\nnpm install\nnpm run build\nnpm test\n```\n\n## Related Projects\n\n- **[cisco-axl-mcp](https://github.com/calltelemetry/cisco-axl-mcp)** — CUCM AXL admin operations via MCP (phones, users, route patterns)\n\n## License\n\nMIT — see [LICENSE](LICENSE) for details.\n","readmeFilename":"README.md"}