npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@calltelemetry/cisco-ris-mcp

v1.4.0

Published

MCP server for Cisco CUCM RIS (Real-time Information Service) and PerfMon APIs

Downloads

1,049

Readme

@calltelemetry/cisco-ris-mcp

MCP server for Cisco CUCM Real-time Information Service (RIS) and PerfMon SOAP APIs.

npm CI

Built by Call Telemetry — realtime tools for Cisco Collaboration.

An MCP server that gives AI assistants direct access to Cisco CUCM device registration status, performance counters, and cluster health — via the RIS and PerfMon SOAP APIs.

You ask about your cluster in plain language. The LLM queries RIS and PerfMon for you.

Troubleshooting & Triage

  • "Are all phones registered? Which ones aren't?"
  • "Find all phones on subnet 10.1.5.x — are any unregistered?"
  • "Is SEP001122334455 registered? What node is it on? What's its IP?"
  • "Show me all rejected phones and their rejection reasons"
  • "Which CUCM node has the most unregistered devices?"

Capacity & Performance

  • "Show me call volume over the last 5 minutes"
  • "How many MTP and transcoder resources are available?"
  • "Are we running low on conference bridge resources?"
  • "What's the CPU utilization on the publisher?"
  • "Monitor SIP trunk call activity for the next 2 minutes"

Health & Situational Awareness

  • "Is the cluster healthy?"
  • "Give me a registration breakdown by protocol — how many SIP vs SCCP?"
  • "How many Jabber clients are connected via MRA?"
  • "Are any CTI applications connected? What's their status?"
  • "Compare registration counts to what CUCM thinks is registered via PerfMon"

Usage Collection & Trending

  • "Monitor call volume for the next 5 minutes and show me the trend"
  • "Track registration changes — are phones dropping off?"
  • "Collect CPU samples every 10 seconds and graph the usage"
  • "Start monitoring SIP trunk activity while I make test calls"
  • "How is MTP utilization trending during business hours?"

Results include Unicode sparklines for visual trending:

CallsActive      ▁▁▂▃▅▇█▇▅▃▂▁  min=0 max=47 avg=18.3
CallsCompleted   ▁▂▃▄▅▆▇█▇▇██  delta=234 rate=3.9/s
RegisteredPhones ████████████▇  min=847 max=850 avg=849

Inventory & Reporting

  • "How many phones are registered by model/firmware?"
  • "List all registered hardware phones and their IPs"
  • "What PerfMon counters are available on this cluster?"
  • "Show me all instances of Cisco SIP trunk counters"

Installation

No install required — npx downloads and runs automatically:

npx @calltelemetry/cisco-ris-mcp

What It Does

  • Device registration — Query real-time phone, gateway, and CTI device status with wildcard search, model/protocol filtering, and auto-pagination across cluster nodes
  • Performance counters — Snapshot or continuously monitor PerfMon counters (calls active, registration counts, SIP stats, CPU) with built-in presets for common scenarios
  • Cluster health — Single-call health check combining RIS device registration + PerfMon counters with configurable threshold alerts

Tools

| Tool | Description | |------|-------------| | device_status | Query real-time device registration with wildcard search and auto-pagination | | phone_summary | Dashboard-ready registration summary with aggregate counts by model, protocol, and node | | cti_status | Query CTI port, route point, and application connection status | | registration_health | Cluster-wide health check combining RIS + PerfMon with threshold alerts | | counter_snapshot | One-shot PerfMon counter read with preset support | | counter_list | Discover available PerfMon counter objects and their counters | | counter_instances | List instances of a multi-instance PerfMon object | | counter_monitor_start | Start background counter monitoring at a configurable interval | | counter_monitor_results | Read accumulated samples with min/max/avg/delta/rate statistics | | counter_monitor_stop | Stop a running monitor and return final statistics |

Configuration

Environment Variables

| Variable | Required | Default | Description | |----------|----------|---------|-------------| | CUCM_HOST | Yes | — | CUCM publisher hostname or IP | | CUCM_USERNAME | Yes | — | CUCM admin username | | CUCM_PASSWORD | Yes | — | CUCM admin password | | CUCM_PORT | No | 8443 | CUCM HTTPS port | | RIS_MCP_LOG_LEVEL | No | warn | Log level: debug, info, warn, error | | RIS_MCP_TLS_MODE | No | permissive | Set to strict to reject self-signed certs |

All credentials can also be passed per-tool-call via cucm_host, cucm_username, cucm_password, cucm_port parameters — useful for querying multiple clusters in a single session.

Counter Presets

Presets select a curated set of counters for common monitoring scenarios:

| Preset | PerfMon Object | Counters | |--------|----------------|----------| | registration | Cisco CallManager | RegisteredHardwarePhones, RegisteredOtherStationDevices, PartiallyRegisteredPhone | | call_processing | Cisco CallManager | CallsActive, CallsAttempted, CallsCompleted | | sip | Cisco SIP | All SIP stack counters (INVITE, BYE, REGISTER, etc.) | | media | Cisco CallManager | VideoCallsActive, VideoCallsCompleted | | system | Processor | All processor/CPU counters |

Tool Examples

All examples below are from a live CUCM 15.0 cluster.


phone_summary — Registration overview

Returns aggregate counts by model, protocol, and cluster node. Ideal for dashboards.

Input:

{ "summaryOnly": true }

Output:

{
  "totalDevices": 1,
  "registered": 1,
  "unregistered": 0,
  "registrationRate": 100,
  "byModel": {
    "SCCP75.9-4-2SR4-3S": { "registered": 1, "unregistered": 0 }
  },
  "byProtocol": {
    "SCCP": { "registered": 1, "unregistered": 0 }
  },
  "byNode": [
    { "name": "cucm15-pub", "registered": 1, "unregistered": 0, "total": 1 }
  ]
}

device_status — Search specific devices

Query device registration by name pattern with full per-device detail.

Input:

{ "query": "SEP*" }

Output (all fields from CUCM SOAP response, strongly typed):

{
  "totalDevicesFound": 1,
  "cmNodes": [
    {
      "name": "cucm15-pub",
      "returnCode": "Ok",
      "devices": [
        {
          "name": "SEP0022905C7710",
          "ipAddress": "10.0.0.178",
          "ipAddrType": "ipv4",
          "ipAttribute": "AdministrativeAndSignaling",
          "description": "Auto 1000 7975 Phone3",
          "dirNumber": "1000-Registered",
          "status": "Registered",
          "statusReason": 0,
          "protocol": "SCCP",
          "deviceClass": "Phone",
          "model": 437,
          "product": 336,
          "httpd": "Yes",
          "registrationAttempts": 1,
          "isCtiControllable": true,
          "loginUserId": "",
          "numOfLines": 1,
          "linesStatus": [
            { "directoryNumber": "1000", "status": "Registered" }
          ],
          "activeLoadId": "SCCP75.9-4-2SR4-3S",
          "inactiveLoadId": "",
          "downloadStatus": "Unknown",
          "downloadFailureReason": "",
          "downloadServer": "",
          "timeStamp": 1773835197
        }
      ]
    }
  ]
}

registration_health — Cluster health check

Single call combining RIS registration data + PerfMon counters with threshold-based alerts.

Input:

{}

Output:

{
  "overall": {
    "registrationRate": 100,
    "totalDevices": 1,
    "registered": 1,
    "unregistered": 0
  },
  "nodes": [
    { "name": "cucm15-pub", "registrationRate": 100, "registered": 1, "unregistered": 0 }
  ],
  "counters": {
    "CallsActive": 0,
    "RegisteredHardwarePhones": 1,
    "CallManagerHeartBeat": 4958,
    "InitializationState": 100
  },
  "alerts": []
}

An empty alerts array means the cluster is healthy. When thresholds are breached (e.g., registration rate drops below 90%), alerts describe the condition.


counter_snapshot — One-shot counter read

Read PerfMon counters using a preset or custom object/counter list.

Input (registration preset):

{ "preset": "registration" }

Output:

{
  "object": "Cisco CallManager",
  "host": "10.0.0.1",
  "counters": [
    { "name": "RegisteredHardwarePhones", "value": 1, "cStatus": 1 },
    { "name": "RegisteredOtherStationDevices", "value": 0, "cStatus": 1 },
    { "name": "PartiallyRegisteredPhone", "value": 0, "cStatus": 1 }
  ]
}

Input (call processing preset):

{ "preset": "call_processing" }

Output:

{
  "object": "Cisco CallManager",
  "host": "10.0.0.1",
  "counters": [
    { "name": "CallsActive", "value": 0, "cStatus": 1 },
    { "name": "CallsAttempted", "value": 0, "cStatus": 1 },
    { "name": "CallsCompleted", "value": 0, "cStatus": 1 }
  ]
}

counter_list — Discover available counters

List all PerfMon objects and their counters on the cluster.

Input:

{}

Output (truncated):

[
  {
    "objectName": "Cisco CAR DB",
    "multiInstance": true,
    "counters": ["CARDBSpaceUsed", "CARTempDBSpaceUsed", "FreeSharedMemory", "RootDBSpaceUsed", "UsedSharedMemory"]
  },
  {
    "objectName": "Cisco CallManager",
    "multiInstance": false,
    "counters": ["CallsActive", "CallsAttempted", "CallsCompleted", "RegisteredHardwarePhones", "...120 more"]
  },
  {
    "objectName": "Cisco SIP Stack",
    "multiInstance": false,
    "counters": ["InviteIns", "InviteOuts", "RegisterIns", "ByeIns", "...150 more"]
  }
]

counter_instances — List multi-instance object entries

Discover which devices, lines, or resources exist as instances of a PerfMon object.

Input:

{ "object": "Cisco Phones" }

Output:

{
  "object": "Cisco Phones",
  "instances": ["SEP0022905C7710"]
}

counter_monitor_start — Background monitoring

Start continuous counter collection at a configurable interval. Returns a monitorId for retrieving results.

Input:

{
  "object": "Cisco CallManager",
  "counters": ["CallsActive", "CallsAttempted", "CallsCompleted"],
  "intervalMs": 10000,
  "maxSamples": 100
}

Output:

{
  "monitorId": "mon-1710756000-abc123",
  "status": "running",
  "object": "Cisco CallManager",
  "counters": ["CallsActive", "CallsAttempted", "CallsCompleted"],
  "intervalMs": 10000,
  "maxSamples": 100,
  "message": "Monitor started. Use counter_monitor_results to read samples, counter_monitor_stop to end."
}

counter_monitor_results — Read accumulated statistics

Retrieve samples from a running or completed monitor with computed statistics per counter.

Input:

{ "monitorId": "mon-1773846059140-5md4o5" }

Output (includes Unicode sparklines for visual trending):

{
  "monitorId": "mon-1773846059140-5md4o5",
  "status": "running",
  "samplesCollected": 10,
  "maxSamples": 100,
  "durationMs": 100000,
  "stats": [
    {
      "name": "CallsActive",
      "type": "gauge",
      "sparkline": "▁▂▃▅▇█▇▅▃▁",
      "min": 0, "max": 47, "avg": 18.3,
      "delta": 0, "rate": 0, "latest": 2
    },
    {
      "name": "CallsCompleted",
      "type": "counter",
      "sparkline": "▁▂▃▄▅▆▆▇▇█",
      "min": 1200, "max": 1438, "avg": 1319,
      "delta": 238, "rate": 2.38, "latest": 1438
    }
  ]
}

Statistics use actual timestamps (not assumed intervals) for rate calculation. Counters are classified as:

  • gauge (CallsActive, RegisteredHardwarePhones) — min/max/avg are meaningful
  • counter (CallsCompleted, CallsAttempted) — delta and rate (per second) are meaningful

Results remain available for 30 minutes after a monitor completes or is stopped.


counter_monitor_stop — Stop and finalize

Stops a running monitor, closes the PerfMon session on CUCM, and returns final statistics.

Input:

{ "monitorId": "mon-1773846059140-5md4o5" }

Output:

{
  "monitorId": "mon-1773846059140-5md4o5",
  "status": "completed",
  "samplesCollected": 10,
  "durationMs": 100000,
  "stats": [
    { "name": "CallsActive", "type": "gauge", "sparkline": "▁▂▃▅▇█▇▅▃▁", "min": 0, "max": 47, "avg": 18.3, "latest": 2 },
    { "name": "CallsCompleted", "type": "counter", "sparkline": "▁▂▃▄▅▆▆▇▇█", "delta": 238, "rate": 2.38, "latest": 1438 }
  ]
}

MCP Configuration

Claude Code (one-liner)

claude mcp add cucm_ris \
  -e CUCM_HOST=cucm-pub.example.com \
  -e CUCM_USERNAME=admin \
  -e CUCM_PASSWORD=secret \
  -- npx @calltelemetry/cisco-ris-mcp

mcp.json

{
  "mcpServers": {
    "cucm-ris": {
      "command": "npx",
      "args": ["@calltelemetry/cisco-ris-mcp"],
      "env": {
        "CUCM_HOST": "cucm-pub.example.com",
        "CUCM_USERNAME": "admin",
        "CUCM_PASSWORD": "secret"
      }
    }
  }
}

Architecture

  • SOAP client — Wraps the RIS selectCmDevice and PerfMon perfmonCollectCounterData / perfmonListCounter SOAP endpoints
  • Rate limiter — Prevents overloading CUCM with concurrent RIS/PerfMon requests
  • TTL cache — Caches counter metadata and device queries to reduce SOAP round-trips
  • Background monitoring — In-memory poll loop for counter_monitor_* tools with automatic sample collection
  • Structured errors — All failures return typed error objects with CUCM-specific context

Development

yarn install        # Install dependencies
yarn build          # Build with Vite
yarn dev            # Watch mode
yarn typecheck      # Type check
yarn lint           # Lint
yarn test           # Run tests
yarn validate       # typecheck + lint + test

Related

| Server | Description | |--------|-------------| | cisco-axl-mcp | CUCM provisioning and admin via AXL SOAP API | | cisco-cucm-mcp | CUCM operational debugging — logs, traces, packet capture, service control |

License

MIT